From 79ba35f27a507cdc1c677c64fa5a5aade4788a89 Mon Sep 17 00:00:00 2001 From: Sam <78538841+spwoodcock@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:59:39 +0000 Subject: [PATCH 01/20] build: upgrade react to latest v19 stable, mui icons for issue #2111 (#2127) --- src/frontend/package.json | 18 +- src/frontend/pnpm-lock.yaml | 1333 ++++++++++++++++++----------------- 2 files changed, 690 insertions(+), 661 deletions(-) diff --git a/src/frontend/package.json b/src/frontend/package.json index 64b36cee2..8075bea96 100755 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -25,8 +25,8 @@ "devDependencies": { "@playwright/test": "1.48.1", "@types/node": "^22.0.2", - "@types/react": "npm:types-react@rc", - "@types/react-dom": "npm:types-react-dom@rc", + "@types/react": "19.0.8", + "@types/react-dom": "19.0.3", "@typescript-eslint/eslint-plugin": "^7.11.0", "@typescript-eslint/parser": "^7.11.0", "@vitejs/plugin-react": "^4.3.0", @@ -45,17 +45,13 @@ "vitest": "^1.6.0", "workbox-window": "^7.1.0" }, - "overrides": { - "@types/react": "npm:types-react@rc", - "@types/react-dom": "npm:types-react-dom@rc" - }, "dependencies": { "@hotosm/ui": "0.2.0-b4", "@mui/base": "5.0.0-beta.55", - "@mui/icons-material": "^5.16.6", + "@mui/icons-material": "^5.16.14", "@mui/lab": "^5.0.0-alpha.173", - "@mui/material": "^5.16.6", - "@mui/system": "^5.16.6", + "@mui/material": "^5.16.14", + "@mui/system": "^5.16.14", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", @@ -93,9 +89,9 @@ "pako": "^2.1.0", "pmtiles": "^3.0.6", "qrcode-generator": "^1.4.4", - "react": "^19.0.0-rc-a7d1240c-20240731", + "react": "^19.0.0", "react-datepicker": "^6.9.0", - "react-dom": "^19.0.0-rc-a7d1240c-20240731", + "react-dom": "^19.0.0", "react-lazy-load-image-component": "^1.6.2", "react-loading-skeleton": "^3.4.0", "react-redux": "^9.1.2", diff --git a/src/frontend/pnpm-lock.yaml b/src/frontend/pnpm-lock.yaml index e9bbfcd03..4e1162a83 100644 --- a/src/frontend/pnpm-lock.yaml +++ b/src/frontend/pnpm-lock.yaml @@ -13,49 +13,49 @@ importers: version: 0.2.0-b4 '@mui/base': specifier: 5.0.0-beta.55 - version: 5.0.0-beta.55(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + version: 5.0.0-beta.55(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mui/icons-material': - specifier: ^5.16.6 - version: 5.16.6(@mui/material@5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + specifier: ^5.16.14 + version: 5.16.14(@mui/material@5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.8)(react@19.0.0) '@mui/lab': specifier: ^5.0.0-alpha.173 - version: 5.0.0-alpha.173(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@mui/material@5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + version: 5.0.0-alpha.173(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@mui/material@5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mui/material': - specifier: ^5.16.6 - version: 5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + specifier: ^5.16.14 + version: 5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mui/system': - specifier: ^5.16.6 - version: 5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + specifier: ^5.16.14 + version: 5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0) '@radix-ui/react-checkbox': specifier: ^1.1.1 - version: 1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + version: 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-dialog': specifier: ^1.1.1 - version: 1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + version: 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-dropdown-menu': specifier: ^2.1.1 - version: 2.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + version: 2.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-icons': specifier: ^1.3.0 - version: 1.3.0(react@19.0.0-rc-f994737d14-20240522) + version: 1.3.0(react@19.0.0) '@radix-ui/react-popover': specifier: ^1.1.5 - version: 1.1.5(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + version: 1.1.5(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-progress': specifier: ^1.1.0 - version: 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + version: 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-select': specifier: ^2.1.1 - version: 2.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + version: 2.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-switch': specifier: ^1.1.0 - version: 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + version: 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@reduxjs/toolkit': specifier: ^2.2.7 - version: 2.2.7(react-redux@9.1.2(react@19.0.0-rc-f994737d14-20240522)(redux@5.0.1)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522) + version: 2.2.7(react-redux@9.1.2(@types/react@19.0.8)(react@19.0.0)(redux@5.0.1))(react@19.0.0) '@sentry/react': specifier: ^8.21.0 - version: 8.21.0(react@19.0.0-rc-f994737d14-20240522) + version: 8.21.0(react@19.0.0) '@tiptap/extension-bullet-list': specifier: ^2.4.0 version: 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) @@ -88,7 +88,7 @@ importers: version: 2.4.0 '@tiptap/react': specifier: ^2.4.0 - version: 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + version: 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tiptap/starter-kit': specifier: ^2.4.0 version: 2.4.0(@tiptap/pm@2.4.0) @@ -100,7 +100,7 @@ importers: version: 2.1.1 cmdk: specifier: ^1.0.4 - version: 1.0.4(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + version: 1.0.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) date-fns: specifier: ^3.6.0 version: 3.6.0 @@ -115,7 +115,7 @@ importers: version: 1.4.1 lucide-react: specifier: ^0.418.0 - version: 0.418.0(react@19.0.0-rc-f994737d14-20240522) + version: 0.418.0(react@19.0.0) ol: specifier: ^8.0.0 version: 8.2.0 @@ -138,38 +138,38 @@ importers: specifier: ^1.4.4 version: 1.4.4 react: - specifier: ^19.0.0-rc-a7d1240c-20240731 - version: 19.0.0-rc-f994737d14-20240522 + specifier: ^19.0.0 + version: 19.0.0 react-datepicker: specifier: ^6.9.0 - version: 6.9.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + version: 6.9.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react-dom: - specifier: ^19.0.0-rc-a7d1240c-20240731 - version: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) react-lazy-load-image-component: specifier: ^1.6.2 - version: 1.6.2(react@19.0.0-rc-f994737d14-20240522) + version: 1.6.2(react@19.0.0) react-loading-skeleton: specifier: ^3.4.0 - version: 3.4.0(react@19.0.0-rc-f994737d14-20240522) + version: 3.4.0(react@19.0.0) react-redux: specifier: ^9.1.2 - version: 9.1.2(react@19.0.0-rc-f994737d14-20240522)(redux@5.0.1)(types-react@19.0.0-rc.0) + version: 9.1.2(@types/react@19.0.8)(react@19.0.0)(redux@5.0.1) react-router-dom: specifier: ^6.25.1 - version: 6.25.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + version: 6.25.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react-spinners: specifier: ^0.14.1 - version: 0.14.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + version: 0.14.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) recharts: specifier: ^2.13.0-alpha.4 - version: 2.13.0-alpha.4(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + version: 2.13.0-alpha.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) redux: specifier: ^5.0.1 version: 5.0.1 redux-persist: specifier: ^6.0.0 - version: 6.0.0(react@19.0.0-rc-f994737d14-20240522)(redux@5.0.1) + version: 6.0.0(react@19.0.0)(redux@5.0.1) tailwind-merge: specifier: 2.3.0 version: 2.3.0 @@ -184,11 +184,11 @@ importers: specifier: ^22.0.2 version: 22.0.2 '@types/react': - specifier: npm:types-react@rc - version: types-react@19.0.0-rc.0 + specifier: 19.0.8 + version: 19.0.8 '@types/react-dom': - specifier: npm:types-react-dom@rc - version: types-react-dom@19.0.0-rc.0 + specifier: 19.0.3 + version: 19.0.3(@types/react@19.0.8) '@typescript-eslint/eslint-plugin': specifier: ^7.11.0 version: 7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) @@ -873,8 +873,8 @@ packages: '@emotion/babel-plugin@11.11.0': resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} - '@emotion/cache@11.11.0': - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} '@emotion/hash@0.9.1': resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} @@ -885,6 +885,9 @@ packages: '@emotion/memoize@0.8.1': resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@emotion/react@11.11.1': resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} peerDependencies: @@ -897,8 +900,8 @@ packages: '@emotion/serialize@1.1.2': resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} - '@emotion/sheet@1.2.2': - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} '@emotion/styled@11.11.0': resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} @@ -918,12 +921,15 @@ packages: peerDependencies: react: '>=16.8.0' - '@emotion/utils@1.2.1': - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} '@emotion/weak-memoize@0.3.1': resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} @@ -1172,16 +1178,16 @@ packages: '@types/react': optional: true - '@mui/core-downloads-tracker@5.16.6': - resolution: {integrity: sha512-kytg6LheUG42V8H/o/Ptz3olSO5kUXW9zF0ox18VnblX6bO2yif1FPItgc3ey1t5ansb1+gbe7SatntqusQupg==} + '@mui/core-downloads-tracker@5.16.14': + resolution: {integrity: sha512-sbjXW+BBSvmzn61XyTMun899E7nGPTXwqD9drm1jBUAvWEhJpPFIRxwQQiATWZnd9rvdxtnhhdsDxEGWI0jxqA==} - '@mui/icons-material@5.16.6': - resolution: {integrity: sha512-ceNGjoXheH9wbIFa1JHmSc9QVjJUvh18KvHrR4/FkJCSi9HXJ+9ee1kUhCOEFfuxNF8UB6WWVrIUOUgRd70t0A==} + '@mui/icons-material@5.16.14': + resolution: {integrity: sha512-heL4S+EawrP61xMXBm59QH6HODsu0gxtZi5JtnXF2r+rghzyU/3Uftlt1ij8rmJh+cFdKTQug1L9KkZB5JgpMQ==} engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -1204,15 +1210,15 @@ packages: '@types/react': optional: true - '@mui/material@5.16.6': - resolution: {integrity: sha512-0LUIKBOIjiFfzzFNxXZBRAyr9UQfmTAFzbt6ziOU2FDXhorNN2o3N9/32mNJbCA8zJo2FqFU6d3dtoqUDyIEfA==} + '@mui/material@5.16.14': + resolution: {integrity: sha512-eSXQVCMKU2xc7EcTxe/X/rC9QsV2jUe8eLM3MUCPYbo6V52eCE436akRIvELq/AqZpxx2bwkq7HC0cRhLB+yaw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -1221,37 +1227,37 @@ packages: '@types/react': optional: true - '@mui/private-theming@5.16.6': - resolution: {integrity: sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==} + '@mui/private-theming@5.16.14': + resolution: {integrity: sha512-12t7NKzvYi819IO5IapW2BcR33wP/KAVrU8d7gLhGHoAmhDxyXlRoKiRij3TOD8+uzk0B6R9wHUNKi4baJcRNg==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/styled-engine@5.16.6': - resolution: {integrity: sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==} + '@mui/styled-engine@5.16.14': + resolution: {integrity: sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true '@emotion/styled': optional: true - '@mui/system@5.16.6': - resolution: {integrity: sha512-5xgyJjBIMPw8HIaZpfbGAaFYPwImQn7Nyh+wwKWhvkoIeDosQ1ZMVrbTclefi7G8hNmqhip04duYwYpbBFnBgw==} + '@mui/system@5.16.14': + resolution: {integrity: sha512-KBxMwCb8mSIABnKvoGbvM33XHyT+sN0BzEBG+rsSc0lLQGzs7127KWkCA6/H8h6LZ00XpBEME5MAj8mZLiQ1tw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -1276,6 +1282,16 @@ packages: '@types/react': optional: true + '@mui/utils@5.16.14': + resolution: {integrity: sha512-wn1QZkRzSmeXD1IguBVvJJHV3s6rxJrfb6YuC9Kk6Noh9f8Fb54nUs5JRkKm+BOerRhj5fLg05Dhx/H3Ofb8Mg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@mui/utils@5.16.6': resolution: {integrity: sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==} engines: {node: '>=12.0.0'} @@ -2247,11 +2263,16 @@ packages: '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/react-dom@19.0.3': + resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==} + peerDependencies: + '@types/react': ^19.0.0 + '@types/react-transition-group@4.4.10': resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} - '@types/react@18.3.3': - resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + '@types/react@19.0.8': + resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -4035,10 +4056,10 @@ packages: react: ^16.9.0 || ^17 || ^18 react-dom: ^16.9.0 || ^17 || ^18 - react-dom@19.0.0-rc-f994737d14-20240522: - resolution: {integrity: sha512-J4CsfTSptPKkhaPbaR6n/KohQiHZTrRZ8GL4H8rbAqN/Qpy69g2MIoLBr5/PUX21ye6JxC1ZRWJFna7Xdg1pdA==} + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} peerDependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: ^19.0.0 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -4049,6 +4070,9 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@19.0.0: + resolution: {integrity: sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==} + react-lazy-load-image-component@1.6.2: resolution: {integrity: sha512-dAdH5PsRgvDMlHC7QpZRA9oRzEZl1kPFwowmR9Mt0IUUhxk2wwq43PB6Ffwv84HFYuPmsxDUCka0E9KVXi8roQ==} peerDependencies: @@ -4172,8 +4196,8 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' - react@19.0.0-rc-f994737d14-20240522: - resolution: {integrity: sha512-SeU2v5Xy6FotVhKz0pMS2gvYP7HlkF0qgTskj3JzA1vlxcb3dQjxlm9t0ZlJqcgoyI3VFAw7bomuDMdgy1nBuw==} + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -4326,8 +4350,8 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.25.0-rc-f994737d14-20240522: - resolution: {integrity: sha512-qS+xGFF7AljP2APO2iJe8zESNsK20k25MACz+WGOXPybUsRdi1ssvaoF93im2nSX2q/XT3wKkjdz6RQfbmaxdw==} + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -4629,12 +4653,6 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} - types-react-dom@19.0.0-rc.0: - resolution: {integrity: sha512-wGlQSD6H6EeCxhH+dSip1cPcCU7nNTOwHEr29rjiNtGkUPlmEofOizoQaPMEqQH2V76ME3NLvBDLGajRu3xZOw==} - - types-react@19.0.0-rc.0: - resolution: {integrity: sha512-JFd3qtgXZ+EdHht8WXMPSF231brd6Bu4yLKqyo0JjpzhmjYxJptT6TBh/xFqOhx+ee2Nagj7Ttkh5F/jc49TVQ==} - typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} @@ -5749,12 +5767,12 @@ snapshots: stylis: 4.2.0 optional: true - '@emotion/cache@11.11.0': + '@emotion/cache@11.14.0': dependencies: - '@emotion/memoize': 0.8.1 - '@emotion/sheet': 1.2.2 - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 stylis: 4.2.0 '@emotion/hash@0.9.1': @@ -5765,21 +5783,24 @@ snapshots: '@emotion/memoize': 0.8.1 optional: true - '@emotion/memoize@0.8.1': {} + '@emotion/memoize@0.8.1': + optional: true + + '@emotion/memoize@0.9.0': {} - '@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0)': dependencies: '@babel/runtime': 7.25.0 '@emotion/babel-plugin': 11.11.0 - '@emotion/cache': 11.11.0 + '@emotion/cache': 11.14.0 '@emotion/serialize': 1.1.2 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@19.0.0-rc-f994737d14-20240522) - '@emotion/utils': 1.2.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@19.0.0) + '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.3.1 hoist-non-react-statics: 3.3.2 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 optional: true '@emotion/serialize@1.1.2': @@ -5787,37 +5808,40 @@ snapshots: '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/unitless': 0.8.1 - '@emotion/utils': 1.2.1 + '@emotion/utils': 1.4.2 csstype: 3.1.3 optional: true - '@emotion/sheet@1.2.2': {} + '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0)': dependencies: '@babel/runtime': 7.25.0 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.1 - '@emotion/react': 11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@emotion/react': 11.11.1(@types/react@19.0.8)(react@19.0.0) '@emotion/serialize': 1.1.2 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@19.0.0-rc-f994737d14-20240522) - '@emotion/utils': 1.2.1 - react: 19.0.0-rc-f994737d14-20240522 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@19.0.0) + '@emotion/utils': 1.4.2 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 optional: true '@emotion/unitless@0.8.1': optional: true - '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@19.0.0-rc-f994737d14-20240522)': + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optional: true - '@emotion/utils@1.2.1': {} + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.3.1': + optional: true - '@emotion/weak-memoize@0.3.1': {} + '@emotion/weak-memoize@0.4.0': {} '@esbuild/aix-ppc64@0.20.2': optional: true @@ -5920,24 +5944,24 @@ snapshots: '@floating-ui/core': 1.5.0 '@floating-ui/utils': 0.2.1 - '@floating-ui/react-dom@2.0.8(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)': + '@floating-ui/react-dom@2.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/dom': 1.6.2 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react-dom@2.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)': + '@floating-ui/react-dom@2.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/dom': 1.6.2 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react@0.26.9(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)': + '@floating-ui/react@0.26.9(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@floating-ui/react-dom': 2.0.8(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + '@floating-ui/react-dom': 2.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@floating-ui/utils': 0.2.1 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) tabbable: 6.2.0 '@floating-ui/utils@0.1.6': {} @@ -5984,149 +6008,161 @@ snapshots: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@mui/base@5.0.0-beta.40(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@mui/base@5.0.0-beta.40(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@babel/runtime': 7.24.6 - '@floating-ui/react-dom': 2.0.8(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) - '@mui/types': 7.2.15(types-react@19.0.0-rc.0) - '@mui/utils': 5.16.6(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@floating-ui/react-dom': 2.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mui/types': 7.2.15(@types/react@19.0.8) + '@mui/utils': 5.16.6(@types/react@19.0.8)(react@19.0.0) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@mui/base@5.0.0-beta.55(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@mui/base@5.0.0-beta.55(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@babel/runtime': 7.25.0 - '@floating-ui/react-dom': 2.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) - '@mui/types': 7.2.14(types-react@19.0.0-rc.0) - '@mui/utils': 6.0.0-beta.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@floating-ui/react-dom': 2.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mui/types': 7.2.14(@types/react@19.0.8) + '@mui/utils': 6.0.0-beta.3(@types/react@19.0.8)(react@19.0.0) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@mui/core-downloads-tracker@5.16.6': {} + '@mui/core-downloads-tracker@5.16.14': {} - '@mui/icons-material@5.16.6(@mui/material@5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@mui/icons-material@5.16.14(@mui/material@5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.8)(react@19.0.0)': dependencies: - '@babel/runtime': 7.24.6 - '@mui/material': 5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 + '@babel/runtime': 7.25.0 + '@mui/material': 5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@mui/lab@5.0.0-alpha.173(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@mui/material@5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@mui/lab@5.0.0-alpha.173(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@mui/material@5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@babel/runtime': 7.24.6 - '@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@mui/material': 5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@mui/system': 5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@mui/types': 7.2.15(types-react@19.0.0-rc.0) - '@mui/utils': 5.16.6(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@mui/base': 5.0.0-beta.40(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mui/material': 5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mui/system': 5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0) + '@mui/types': 7.2.15(@types/react@19.0.8) + '@mui/utils': 5.16.6(@types/react@19.0.8)(react@19.0.0) clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@emotion/react': 11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@types/react': types-react@19.0.0-rc.0 + '@emotion/react': 11.11.1(@types/react@19.0.8)(react@19.0.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0) + '@types/react': 19.0.8 - '@mui/material@5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@mui/material@5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@babel/runtime': 7.24.6 - '@mui/core-downloads-tracker': 5.16.6 - '@mui/system': 5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@mui/types': 7.2.15(types-react@19.0.0-rc.0) - '@mui/utils': 5.16.6(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@babel/runtime': 7.25.0 + '@mui/core-downloads-tracker': 5.16.14 + '@mui/system': 5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0) + '@mui/types': 7.2.15(@types/react@19.0.8) + '@mui/utils': 5.16.14(@types/react@19.0.8)(react@19.0.0) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.10 clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) - react-is: 18.3.1 - react-transition-group: 4.4.5(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-is: 19.0.0 + react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) optionalDependencies: - '@emotion/react': 11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@types/react': types-react@19.0.0-rc.0 + '@emotion/react': 11.11.1(@types/react@19.0.8)(react@19.0.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0) + '@types/react': 19.0.8 - '@mui/private-theming@5.16.6(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@mui/private-theming@5.16.14(@types/react@19.0.8)(react@19.0.0)': dependencies: - '@babel/runtime': 7.24.6 - '@mui/utils': 5.16.6(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@babel/runtime': 7.25.0 + '@mui/utils': 5.16.14(@types/react@19.0.8)(react@19.0.0) prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@mui/styled-engine@5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)': + '@mui/styled-engine@5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(react@19.0.0)': dependencies: - '@babel/runtime': 7.24.6 - '@emotion/cache': 11.11.0 + '@babel/runtime': 7.25.0 + '@emotion/cache': 11.14.0 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@emotion/react': 11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@emotion/react': 11.11.1(@types/react@19.0.8)(react@19.0.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0) - '@mui/system@5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@mui/system@5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0)': dependencies: - '@babel/runtime': 7.24.6 - '@mui/private-theming': 5.16.6(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@mui/styled-engine': 5.16.6(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522) - '@mui/types': 7.2.15(types-react@19.0.0-rc.0) - '@mui/utils': 5.16.6(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@babel/runtime': 7.25.0 + '@mui/private-theming': 5.16.14(@types/react@19.0.8)(react@19.0.0) + '@mui/styled-engine': 5.16.14(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0))(react@19.0.0) + '@mui/types': 7.2.15(@types/react@19.0.8) + '@mui/utils': 5.16.14(@types/react@19.0.8)(react@19.0.0) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@emotion/react': 11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@types/react': types-react@19.0.0-rc.0 + '@emotion/react': 11.11.1(@types/react@19.0.8)(react@19.0.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1(@types/react@19.0.8)(react@19.0.0))(@types/react@19.0.8)(react@19.0.0) + '@types/react': 19.0.8 - '@mui/types@7.2.14(types-react@19.0.0-rc.0)': + '@mui/types@7.2.14(@types/react@19.0.8)': optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@mui/types@7.2.15(types-react@19.0.0-rc.0)': + '@mui/types@7.2.15(@types/react@19.0.8)': optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@mui/utils@5.16.6(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@mui/utils@5.16.14(@types/react@19.0.8)(react@19.0.0)': + dependencies: + '@babel/runtime': 7.25.0 + '@mui/types': 7.2.15(@types/react@19.0.8) + '@types/prop-types': 15.7.12 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.0.0 + react-is: 19.0.0 + optionalDependencies: + '@types/react': 19.0.8 + + '@mui/utils@5.16.6(@types/react@19.0.8)(react@19.0.0)': dependencies: '@babel/runtime': 7.24.6 - '@mui/types': 7.2.15(types-react@19.0.0-rc.0) + '@mui/types': 7.2.15(@types/react@19.0.8) '@types/prop-types': 15.7.12 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 react-is: 18.3.1 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@mui/utils@6.0.0-beta.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@mui/utils@6.0.0-beta.3(@types/react@19.0.8)(react@19.0.0)': dependencies: '@babel/runtime': 7.25.0 - '@mui/types': 7.2.14(types-react@19.0.0-rc.0) + '@mui/types': 7.2.14(@types/react@19.0.8) '@types/prop-types': 15.7.12 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 react-is: 18.3.1 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -6156,506 +6192,506 @@ snapshots: '@radix-ui/primitive@1.1.1': {} - '@radix-ui/react-arrow@1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-arrow@1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-arrow@1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-arrow@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-checkbox@1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-checkbox@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-presence': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-controllable-state': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-previous': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-size': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-collection@1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-collection@1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-compose-refs@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-compose-refs@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-compose-refs@1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.8)(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-context@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-context@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-context@1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-context@1.1.1(@types/react@19.0.8)(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-dialog@1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-dialog@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-dismissable-layer': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-focus-guards': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-focus-scope': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-id': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-portal': 1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-presence': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-controllable-state': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.8)(react@19.0.0) aria-hidden: 1.2.3 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) - react-remove-scroll: 2.5.7(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.5.7(@types/react@19.0.8)(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-dialog@1.1.5(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-dialog@1.1.5(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-dismissable-layer': 1.1.4(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-focus-guards': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-focus-scope': 1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-id': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-portal': 1.1.3(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-presence': 1.1.2(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-slot': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-controllable-state': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.8)(react@19.0.0) aria-hidden: 1.2.4 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) - react-remove-scroll: 2.6.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.0.8)(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-direction@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-direction@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-dismissable-layer@1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-escape-keydown': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-dismissable-layer@1.1.4(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-dismissable-layer@1.1.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-escape-keydown': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-dropdown-menu@2.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-id': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-menu': 2.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-controllable-state': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-focus-guards@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-focus-guards@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-focus-guards@1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.8)(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-focus-scope@1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-focus-scope@1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-icons@1.3.0(react@19.0.0-rc-f994737d14-20240522)': + '@radix-ui/react-icons@1.3.0(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 - '@radix-ui/react-id@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-id@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-menu@2.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-menu@2.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-direction': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-dismissable-layer': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-focus-guards': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-focus-scope': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-id': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-popper': 1.2.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-portal': 1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-presence': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-roving-focus': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) aria-hidden: 1.2.3 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) - react-remove-scroll: 2.5.7(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.5.7(@types/react@19.0.8)(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-popover@1.1.5(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-popover@1.1.5(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-dismissable-layer': 1.1.4(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-focus-guards': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-focus-scope': 1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-id': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-popper': 1.2.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-portal': 1.1.3(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-presence': 1.1.2(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-slot': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-controllable-state': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.8)(react@19.0.0) aria-hidden: 1.2.4 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) - react-remove-scroll: 2.6.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.0.8)(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 - - '@radix-ui/react-popper@1.2.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': - dependencies: - '@floating-ui/react-dom': 2.0.8(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) - '@radix-ui/react-arrow': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-rect': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-size': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) + + '@radix-ui/react-popper@1.2.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.8)(react@19.0.0) '@radix-ui/rect': 1.1.0 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 - - '@radix-ui/react-popper@1.2.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': - dependencies: - '@floating-ui/react-dom': 2.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) - '@radix-ui/react-arrow': 1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-compose-refs': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-rect': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-size': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) + + '@radix-ui/react-popper@1.2.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.8)(react@19.0.0) '@radix-ui/rect': 1.1.0 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-portal@1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-portal@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-portal@1.1.3(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-portal@1.1.3(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-presence@1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-presence@1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-presence@1.1.2(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-primitive@2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-slot': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-primitive@2.0.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-slot': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-progress@1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-progress@1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-context': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-roving-focus@1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-direction': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-id': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-controllable-state': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-select@2.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-select@2.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-direction': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-dismissable-layer': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-focus-guards': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-focus-scope': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-id': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-popper': 1.2.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-portal': 1.1.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-controllable-state': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-previous': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-visually-hidden': 1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) aria-hidden: 1.2.3 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) - react-remove-scroll: 2.5.7(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.5.7(@types/react@19.0.8)(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-slot@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-slot@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-slot@1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-slot@1.1.1(@types/react@19.0.8)(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-switch@1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-switch@1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-controllable-state': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-previous': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-use-size': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-context': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) - '@radix-ui/react-use-callback-ref@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-use-controllable-state@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-use-escape-keydown@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-use-layout-effect@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-use-previous@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-use-rect@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: '@radix-ui/rect': 1.1.0 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-use-size@1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0)': + '@radix-ui/react-use-size@1.1.0(@types/react@19.0.8)(react@19.0.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.8)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - '@radix-ui/react-visually-hidden@1.1.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0)': + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 - '@types/react-dom': types-react-dom@19.0.0-rc.0 + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) '@radix-ui/rect@1.1.0': {} - '@reduxjs/toolkit@2.2.7(react-redux@9.1.2(react@19.0.0-rc-f994737d14-20240522)(redux@5.0.1)(types-react@19.0.0-rc.0))(react@19.0.0-rc-f994737d14-20240522)': + '@reduxjs/toolkit@2.2.7(react-redux@9.1.2(@types/react@19.0.8)(react@19.0.0)(redux@5.0.1))(react@19.0.0)': dependencies: immer: 10.1.1 redux: 5.0.1 redux-thunk: 3.1.0(redux@5.0.1) reselect: 5.1.0 optionalDependencies: - react: 19.0.0-rc-f994737d14-20240522 - react-redux: 9.1.2(react@19.0.0-rc-f994737d14-20240522)(redux@5.0.1)(types-react@19.0.0-rc.0) + react: 19.0.0 + react-redux: 9.1.2(@types/react@19.0.8)(react@19.0.0)(redux@5.0.1) '@remirror/core-constants@2.0.2': {} @@ -6821,14 +6857,14 @@ snapshots: '@sentry/types': 8.21.0 '@sentry/utils': 8.21.0 - '@sentry/react@8.21.0(react@19.0.0-rc-f994737d14-20240522)': + '@sentry/react@8.21.0(react@19.0.0)': dependencies: '@sentry/browser': 8.21.0 '@sentry/core': 8.21.0 '@sentry/types': 8.21.0 '@sentry/utils': 8.21.0 hoist-non-react-statics: 3.3.2 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 '@sentry/types@8.21.0': {} @@ -6969,14 +7005,14 @@ snapshots: prosemirror-transform: 1.8.0 prosemirror-view: 1.33.1 - '@tiptap/react@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)': + '@tiptap/react@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) '@tiptap/extension-bubble-menu': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) '@tiptap/extension-floating-menu': 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))(@tiptap/pm@2.4.0) '@tiptap/pm': 2.4.0 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) '@tiptap/starter-kit@2.4.0(@tiptap/pm@2.4.0)': dependencies: @@ -7084,13 +7120,16 @@ snapshots: '@types/prop-types@15.7.12': {} + '@types/react-dom@19.0.3(@types/react@19.0.8)': + dependencies: + '@types/react': 19.0.8 + '@types/react-transition-group@4.4.10': dependencies: - '@types/react': 18.3.3 + '@types/react': 19.0.8 - '@types/react@18.3.3': + '@types/react@19.0.8': dependencies: - '@types/prop-types': 15.7.12 csstype: 3.1.3 '@types/resolve@1.20.2': {} @@ -7524,14 +7563,14 @@ snapshots: clsx@2.1.1: {} - cmdk@1.0.4(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0): + cmdk@1.0.4(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@radix-ui/react-dialog': 1.1.5(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - '@radix-ui/react-id': 1.1.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - '@radix-ui/react-primitive': 2.0.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522)(types-react-dom@19.0.0-rc.0)(types-react@19.0.0-rc.0) - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) - use-sync-external-store: 1.4.0(react@19.0.0-rc-f994737d14-20240522) + '@radix-ui/react-dialog': 1.1.5(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.8)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + use-sync-external-store: 1.4.0(react@19.0.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -7740,7 +7779,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.24.6 + '@babel/runtime': 7.25.0 csstype: 3.1.3 domexception@4.0.0: @@ -8687,9 +8726,9 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@0.418.0(react@19.0.0-rc-f994737d14-20240522): + lucide-react@0.418.0(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 magic-string@0.25.9: dependencies: @@ -9153,20 +9192,20 @@ snapshots: dependencies: quickselect: 2.0.0 - react-datepicker@6.9.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522): + react-datepicker@6.9.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@floating-ui/react': 0.26.9(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + '@floating-ui/react': 0.26.9(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 date-fns: 3.6.0 prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) - react-onclickoutside: 6.13.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-onclickoutside: 6.13.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522): + react-dom@19.0.0(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 - scheduler: 0.25.0-rc-f994737d14-20240522 + react: 19.0.0 + scheduler: 0.25.0 react-is@16.13.1: {} @@ -9174,122 +9213,124 @@ snapshots: react-is@18.3.1: {} - react-lazy-load-image-component@1.6.2(react@19.0.0-rc-f994737d14-20240522): + react-is@19.0.0: {} + + react-lazy-load-image-component@1.6.2(react@19.0.0): dependencies: lodash.debounce: 4.0.8 lodash.throttle: 4.1.1 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 - react-loading-skeleton@3.4.0(react@19.0.0-rc-f994737d14-20240522): + react-loading-skeleton@3.4.0(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 - react-onclickoutside@6.13.0(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522): + react-onclickoutside@6.13.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - react-redux@9.1.2(react@19.0.0-rc-f994737d14-20240522)(redux@5.0.1)(types-react@19.0.0-rc.0): + react-redux@9.1.2(@types/react@19.0.8)(react@19.0.0)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.3 - react: 19.0.0-rc-f994737d14-20240522 - use-sync-external-store: 1.2.0(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + use-sync-external-store: 1.2.0(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 redux: 5.0.1 react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.4(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0): + react-remove-scroll-bar@2.3.4(@types/react@19.0.8)(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 - react-style-singleton: 2.2.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + react: 19.0.0 + react-style-singleton: 2.2.1(@types/react@19.0.8)(react@19.0.0) tslib: 2.6.2 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - react-remove-scroll-bar@2.3.8(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0): + react-remove-scroll-bar@2.3.8(@types/react@19.0.8)(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 - react-style-singleton: 2.2.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + react: 19.0.0 + react-style-singleton: 2.2.3(@types/react@19.0.8)(react@19.0.0) tslib: 2.6.2 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - react-remove-scroll@2.5.7(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0): + react-remove-scroll@2.5.7(@types/react@19.0.8)(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 - react-remove-scroll-bar: 2.3.4(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react-style-singleton: 2.2.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + react: 19.0.0 + react-remove-scroll-bar: 2.3.4(@types/react@19.0.8)(react@19.0.0) + react-style-singleton: 2.2.1(@types/react@19.0.8)(react@19.0.0) tslib: 2.6.2 - use-callback-ref: 1.3.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - use-sidecar: 1.1.2(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + use-callback-ref: 1.3.0(@types/react@19.0.8)(react@19.0.0) + use-sidecar: 1.1.2(@types/react@19.0.8)(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - react-remove-scroll@2.6.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0): + react-remove-scroll@2.6.3(@types/react@19.0.8)(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 - react-remove-scroll-bar: 2.3.8(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - react-style-singleton: 2.2.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + react: 19.0.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.0.8)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@19.0.8)(react@19.0.0) tslib: 2.6.2 - use-callback-ref: 1.3.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) - use-sidecar: 1.1.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0) + use-callback-ref: 1.3.3(@types/react@19.0.8)(react@19.0.0) + use-sidecar: 1.1.3(@types/react@19.0.8)(react@19.0.0) optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - react-router-dom@6.25.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522): + react-router-dom@6.25.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@remix-run/router': 1.18.0 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) - react-router: 6.25.1(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-router: 6.25.1(react@19.0.0) - react-router@6.25.1(react@19.0.0-rc-f994737d14-20240522): + react-router@6.25.1(react@19.0.0): dependencies: '@remix-run/router': 1.18.0 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 - react-smooth@4.0.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522): + react-smooth@4.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) - react-transition-group: 4.4.5(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react-spinners@0.14.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522): + react-spinners@0.14.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - react-style-singleton@2.2.1(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0): + react-style-singleton@2.2.1(@types/react@19.0.8)(react@19.0.0): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 tslib: 2.6.2 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - react-style-singleton@2.2.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0): + react-style-singleton@2.2.3(@types/react@19.0.8)(react@19.0.0): dependencies: get-nonce: 1.0.1 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 tslib: 2.6.2 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - react-transition-group@4.4.5(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522): + react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.24.6 + '@babel/runtime': 7.25.0 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - react@19.0.0-rc-f994737d14-20240522: {} + react@19.0.0: {} read-cache@1.0.0: dependencies: @@ -9303,24 +9344,24 @@ snapshots: dependencies: decimal.js-light: 2.5.1 - recharts@2.13.0-alpha.4(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522): + recharts@2.13.0-alpha.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 lodash: 4.17.21 - react: 19.0.0-rc-f994737d14-20240522 - react-dom: 19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) react-is: 18.3.1 - react-smooth: 4.0.1(react-dom@19.0.0-rc-f994737d14-20240522(react@19.0.0-rc-f994737d14-20240522))(react@19.0.0-rc-f994737d14-20240522) + react-smooth: 4.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) recharts-scale: 0.4.5 tiny-invariant: 1.3.1 victory-vendor: 36.7.0 - redux-persist@6.0.0(react@19.0.0-rc-f994737d14-20240522)(redux@5.0.1): + redux-persist@6.0.0(react@19.0.0)(redux@5.0.1): dependencies: redux: 5.0.1 optionalDependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 redux-thunk@3.1.0(redux@5.0.1): dependencies: @@ -9484,7 +9525,7 @@ snapshots: xmlchars: 2.2.0 optional: true - scheduler@0.25.0-rc-f994737d14-20240522: {} + scheduler@0.25.0: {} semver@6.3.1: {} @@ -9848,14 +9889,6 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - types-react-dom@19.0.0-rc.0: - dependencies: - '@types/react': 18.3.3 - - types-react@19.0.0-rc.0: - dependencies: - csstype: 3.1.3 - typescript@5.4.5: {} uc.micro@2.0.0: {} @@ -9909,43 +9942,43 @@ snapshots: requires-port: 1.0.0 optional: true - use-callback-ref@1.3.0(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0): + use-callback-ref@1.3.0(@types/react@19.0.8)(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 tslib: 2.6.2 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - use-callback-ref@1.3.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0): + use-callback-ref@1.3.3(@types/react@19.0.8)(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 tslib: 2.6.2 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - use-sidecar@1.1.2(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0): + use-sidecar@1.1.2(@types/react@19.0.8)(react@19.0.0): dependencies: detect-node-es: 1.1.0 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 tslib: 2.6.2 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - use-sidecar@1.1.3(react@19.0.0-rc-f994737d14-20240522)(types-react@19.0.0-rc.0): + use-sidecar@1.1.3(@types/react@19.0.8)(react@19.0.0): dependencies: detect-node-es: 1.1.0 - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 tslib: 2.6.2 optionalDependencies: - '@types/react': types-react@19.0.0-rc.0 + '@types/react': 19.0.8 - use-sync-external-store@1.2.0(react@19.0.0-rc-f994737d14-20240522): + use-sync-external-store@1.2.0(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 - use-sync-external-store@1.4.0(react@19.0.0-rc-f994737d14-20240522): + use-sync-external-store@1.4.0(react@19.0.0): dependencies: - react: 19.0.0-rc-f994737d14-20240522 + react: 19.0.0 util-deprecate@1.0.2: {} From 75415224c586d5967c339a8170e7448258906ede Mon Sep 17 00:00:00 2001 From: Sam <78538841+spwoodcock@users.noreply.github.com> Date: Wed, 29 Jan 2025 16:22:59 +0000 Subject: [PATCH 02/20] fix(frontend): logic allowing for custom odk server creds during proj create (#2129) --- .../createnewproject/ProjectDetailsForm.tsx | 113 ++++++++++-------- 1 file changed, 63 insertions(+), 50 deletions(-) diff --git a/src/frontend/src/components/createnewproject/ProjectDetailsForm.tsx b/src/frontend/src/components/createnewproject/ProjectDetailsForm.tsx index 4eb559291..6dfb04350 100644 --- a/src/frontend/src/components/createnewproject/ProjectDetailsForm.tsx +++ b/src/frontend/src/components/createnewproject/ProjectDetailsForm.tsx @@ -75,7 +75,11 @@ const ProjectDetailsForm = ({ flag }) => { dispatch(CreateProjectActions.SetIsUnsavedChanges(true)); }; - const setSelectedOrganisation = (orgId) => { + const getSelectedOrganization = () => { + return organisationList.find((org) => org.value === values.organisation_id); + }; + + const handleOrganizationChange = (orgId: number) => { // Ensure orgId is not null or undefined before integer convert const orgIdInt = orgId && +orgId; @@ -83,32 +87,25 @@ const ProjectDetailsForm = ({ flag }) => { return; } - handleCustomChange('organisation_id', orgIdInt); - const selectedOrg = organisationList.find((org) => org.value === orgIdInt); - - if (selectedOrg && selectedOrg.hasODKCredentials) { - handleCustomChange('defaultODKCredentials', selectedOrg.hasODKCredentials); - } else { - // Allow the user to choose default credentials for orgs without ODK credentials - handleCustomChange('defaultODKCredentials', false); - } + handleCustomChange('organisation_id', orgIdInt); + handleCustomChange('useDefaultODKCredentials', selectedOrg?.hasODKCredentials || false); }; useEffect(() => { if (!values.organisation_id) { - handleCustomChange('defaultODKCredentials', false); + handleCustomChange('useDefaultODKCredentials', false); } }, []); useEffect(() => { - if (values.defaultODKCredentials) { + if (values.useDefaultODKCredentials) { // Reset user provided credentials handleCustomChange('odk_central_url', ''); handleCustomChange('odk_central_user', ''); handleCustomChange('odk_central_password', ''); } - }, [values.defaultODKCredentials]); + }, [values.useDefaultODKCredentials]); useEffect(() => { organisationList?.map((organization) => { @@ -118,6 +115,11 @@ const ProjectDetailsForm = ({ flag }) => { }); }, [organisationList]); + const shouldShowCustomODKFields = () => { + const currentOrg = getSelectedOrganization(); + return !values.useDefaultODKCredentials || !currentOrg?.hasODKCredentials; + }; + return (
@@ -126,6 +128,7 @@ const ProjectDetailsForm = ({ flag }) => { onSubmit={handleSubmit} >
+ {/* Project name & descriptions */} { required errorMsg={errors.description} /> + {/* Select organisation */}

Organization Name * @@ -164,7 +168,7 @@ const ProjectDetailsForm = ({ flag }) => { options={organisationList || []} value={values.organisation_id} onChange={(value: any) => { - setSelectedOrganisation(value); + handleOrganizationChange(value); }} placeholder="Organization Name" className="naxatw-w-1/5 naxatw-min-w-[9rem]" @@ -174,6 +178,7 @@ const ProjectDetailsForm = ({ flag }) => {

{errors.organisation_id}

)}
+ {/* Select project admin */}

Assign Project Admin

{ isLoading={userListLoading} />
+ {/* Custom ODK creds toggle */}
{ @@ -198,51 +204,21 @@ const ProjectDetailsForm = ({ flag }) => { > { { - handleCustomChange('defaultODKCredentials', !values.defaultODKCredentials); + handleCustomChange('useDefaultODKCredentials', !values.useDefaultODKCredentials); }} className="fmtm-text-black" labelClickable={hasODKCredentials} // Dynamically set labelClickable based on hasODKCredentials /> } - {!values.defaultODKCredentials && !hasODKCredentials && ( - <> - - - - + {shouldShowCustomODKFields() && ( + )}
+ {/* Hashtags */}
{ analysis later, but should be human informative and not overused, #group #event

+ {/* Custom TMS */}
{ @@ -288,6 +265,7 @@ const ProjectDetailsForm = ({ flag }) => { /> )}
+ {/* Task instructions */}

Instructions

{ ); }; +const ODKCredentialsFields = ({ values, errors, handleChange }) => ( + <> + + + + +); + export default ProjectDetailsForm; From 33721a73a62cd0f104cd79657b0e67fecc88887c Mon Sep 17 00:00:00 2001 From: Anuj Gupta <84966248+Anuj-Gupta4@users.noreply.github.com> Date: Thu, 30 Jan 2025 17:19:21 +0545 Subject: [PATCH 03/20] feat(backend): migration to add dataset property to old projects (#2126) * feat(migration): add a file to add dataset property to projects * refactor(migration): add submission id property * fix: use correct pydantic model to decrypt environment variable in add submission id property --- .../migrations/add-submission-id-property.py | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/backend/migrations/add-submission-id-property.py diff --git a/src/backend/migrations/add-submission-id-property.py b/src/backend/migrations/add-submission-id-property.py new file mode 100644 index 000000000..d9a67dd91 --- /dev/null +++ b/src/backend/migrations/add-submission-id-property.py @@ -0,0 +1,78 @@ +"""Add dataset property submission ID for old projects.""" + +import asyncio + +from psycopg import AsyncConnection +from psycopg.rows import class_row + +from app.central import central_deps, central_schemas +from app.config import settings + + +def get_odk_creds(project: dict) -> central_schemas.ODKCentralDecrypted: + """Retrieve ODK credentials from project, organisation, or environment.""" + for key_prefix in ["", "org_"]: + odk_url = project.get(f"{key_prefix}odk_central_url") + odk_user = project.get(f"{key_prefix}odk_central_user") + odk_pass = project.get(f"{key_prefix}odk_central_password") + + if all([odk_url, odk_user, odk_pass]): + return central_schemas.ODKCentralDecrypted( + odk_central_url=odk_url, + odk_central_user=odk_user, + odk_central_password=odk_pass, + ) + + # Fallback to environment variables + return central_schemas.ODKCentral( + odk_central_url=settings.ODK_CENTRAL_URL, + odk_central_user=settings.ODK_CENTRAL_USER, + odk_central_password=settings.ODK_CENTRAL_PASSWD.get_secret_value(), + ) + + +async def fetch_projects(db: AsyncConnection) -> list[dict]: + """Fetch projects created after a certain date.""" + sql = """ + SELECT p.id, p.odkid, p.created_at, + p.odk_central_url, p.odk_central_user, p.odk_central_password, + p_org.odk_central_url as org_odk_central_url, + p_org.odk_central_user as org_odk_central_user, + p_org.odk_central_password as org_odk_central_password + FROM projects p + LEFT JOIN organisations p_org ON p.organisation_id = p_org.id + WHERE p.created_at < '2024-01-24 00:00:00.000 +0545'; + """ + async with db.cursor(row_factory=class_row(dict)) as cur: + await cur.execute(sql) + return await cur.fetchall() + + +async def add_submission_id(): + """Add dataset property for all projects.""" + async with await AsyncConnection.connect( + settings.FMTM_DB_URL.unicode_string() + ) as db: + projects = await fetch_projects(db) + + if not projects: + print("No projects found.") + return + + for project in projects: + project["odk_creds"] = get_odk_creds(project) + print(f"\n------- Project {project['id']} -------\n") + + async with central_deps.get_odk_dataset( + project["odk_creds"] + ) as odk_central: + await odk_central.createDatasetProperty( + project["odkid"], + "submission_ids", + ) + + print("✅ Submission ID property added successfully.") + + +if __name__ == "__main__": + asyncio.run(add_submission_id()) From 9ba4d8aa9a4a720d6d79f5fe68b95fd91f2745dc Mon Sep 17 00:00:00 2001 From: Sam <78538841+spwoodcock@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:14:10 +0000 Subject: [PATCH 04/20] feat(backend): add central-webhook service for triggering entity status updates in FMTM database (#2130) * refactor(backend): remove unused pagination directory * fix(backend): add exception handling for submission not found in odk * feat(backend): add an api_key for the svcfmtm user during DEBUG=True * fix(backend): more informative response when missing x-api-key header * build: add central-webhook service to docker compose local dev stack * feat: add webhook endpoint for receiving central-webhook payload on event --- docker-compose.yml | 16 +++ src/backend/app/central/central_schemas.py | 19 +++- src/backend/app/db/enums.py | 8 ++ src/backend/app/db/models.py | 32 +++++- .../app/integrations/integration_crud.py | 97 ++++++++++++++++++- .../app/integrations/integration_deps.py | 12 ++- .../app/integrations/integration_routes.py | 69 ++++++++----- .../app/organisations/organisation_crud.py | 2 + src/backend/app/pagination/__init__.py | 1 - src/backend/app/pagination/pagination.py | 28 ------ .../app/submissions/submission_routes.py | 6 ++ 11 files changed, 234 insertions(+), 56 deletions(-) delete mode 100644 src/backend/app/pagination/__init__.py delete mode 100644 src/backend/app/pagination/pagination.py diff --git a/docker-compose.yml b/docker-compose.yml index 96833520f..b165b11d0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -224,6 +224,22 @@ services: network_mode: none restart: "on-failure:2" + central-webhook: + profiles: ["", "central"] + image: "ghcr.io/hotosm/central-webhook:${ODK_WEBHOOK_VERSION:-0.1.0-rc}" + depends_on: + central-db: + condition: service_healthy + environment: + CENTRAL_WEBHOOK_DB_URI: postgresql://${CENTRAL_DB_USER:-odk}:${CENTRAL_DB_USER:-odk}@central-db:5432/${CENTRAL_DB_NAME:-odk}?sslmode=disable + CENTRAL_WEBHOOK_UPDATE_ENTITY_URL: http://api:8000/integrations/webhooks/entity-status + # CENTRAL_WEBHOOK_REVIEW_SUBMISSION_URL: https://your.domain.com/some/webhook + CENTRAL_WEBHOOK_API_KEY: qnyE7ev7OWsfMAaX2fm-PuWYnkAUJw2xlyp72FKCH3Q + # CENTRAL_WEBHOOK_LOG_LEVEL: DEBUG + networks: + - fmtm-net + restart: "unless-stopped" + s3: image: "docker.io/minio/minio:${MINIO_TAG:-RELEASE.2025-01-20T14-49-07Z}" environment: diff --git a/src/backend/app/central/central_schemas.py b/src/backend/app/central/central_schemas.py index 0338c161b..f55775d12 100644 --- a/src/backend/app/central/central_schemas.py +++ b/src/backend/app/central/central_schemas.py @@ -27,7 +27,7 @@ from pydantic.functional_validators import field_validator, model_validator from app.config import HttpUrlStr, decrypt_value, encrypt_value -from app.db.enums import EntityState +from app.db.enums import EntityState, OdkWebhookEvents class ODKCentral(BaseModel): @@ -299,3 +299,20 @@ def append_status_emoji(cls, value: str, info: ValidationInfo) -> str: def integer_status_to_string(cls, value: EntityState) -> str: """Convert integer status to string for ODK Entity data.""" return str(value.value) + + +class OdkCentralWebhookRequest(BaseModel): + """The POST data from the central webhook service.""" + + type: OdkWebhookEvents + # NOTE we cannot use UUID validation, as Central often passes uuid as 'uuid:xxx-xxx' + id: str + # NOTE do not use EntityPropertyDict or similar to allow more flexible parsing + # submission.create provides an XML string as the 'data' + data: dict + + +class OdkEntitiesUpdate(BaseModel): + """A small base model to update the OdkEntity status field only.""" + + status: str # this must be the str representation of the db enum diff --git a/src/backend/app/db/enums.py b/src/backend/app/db/enums.py index 17af9ba33..c6408f470 100644 --- a/src/backend/app/db/enums.py +++ b/src/backend/app/db/enums.py @@ -268,3 +268,11 @@ class GeomStatus(StrEnum, Enum): NEW = "NEW" BAD = "BAD" + + +class OdkWebhookEvents(StrEnum, Enum): + """Types of events received from ODK Central webhook.""" + + UPDATE_ENTITY = "entity.update.version" + NEW_SUBMISSION = "submission.create" + REVIEW_SUBMISSION = "submission.update" diff --git a/src/backend/app/db/models.py b/src/backend/app/db/models.py index 86b94b3ff..436afa1b3 100644 --- a/src/backend/app/db/models.py +++ b/src/backend/app/db/models.py @@ -64,6 +64,7 @@ # Avoid cyclical dependencies when only type checking if TYPE_CHECKING: + from app.central.central_schemas import OdkEntitiesUpdate from app.organisations.organisation_schemas import ( OrganisationIn, OrganisationUpdate, @@ -308,7 +309,8 @@ async def create( SET role = EXCLUDED.role, mapping_level = EXCLUDED.mapping_level, - name = EXCLUDED.name + name = EXCLUDED.name, + api_key = EXCLUDED.api_key """ sql = f""" @@ -1535,6 +1537,34 @@ async def upsert( return bool(result) + @classmethod + async def update( + cls, db: Connection, entity_uuid: str, entity_update: "OdkEntitiesUpdate" + ) -> bool: + """Update the entity value in the FMTM db.""" + model_dump = dump_and_check_model(entity_update) + placeholders = [f"{key} = %({key})s" for key in model_dump.keys()] + sql = f""" + UPDATE odk_entities + SET {", ".join(placeholders)} + WHERE entity_id = %(entity_uuid)s + RETURNING entity_id; + """ + + async with db.cursor() as cur: + await cur.execute( + sql, + {"entity_uuid": entity_uuid, **model_dump}, + ) + success = await cur.fetchone() + + if not success: + msg = f"Failed to update entity with UUID: {entity_uuid}" + log.error(msg) + return False + + return True + class DbBackgroundTask(BaseModel): """Table background_tasks. diff --git a/src/backend/app/integrations/integration_crud.py b/src/backend/app/integrations/integration_crud.py index c647a2fca..045d7fba4 100644 --- a/src/backend/app/integrations/integration_crud.py +++ b/src/backend/app/integrations/integration_crud.py @@ -19,11 +19,25 @@ from secrets import token_urlsafe +from fastapi.exceptions import HTTPException +from fastapi.responses import Response from loguru import logger as log from psycopg import Connection from psycopg.rows import class_row -from app.db.models import DbUser +# from app.central.central_crud import update_entity_mapping_status +from app.central.central_schemas import ( + OdkCentralWebhookRequest, + OdkEntitiesUpdate, + # EntityMappingStatusIn, +) +from app.db.enums import ( + EntityState, + HTTPStatus, + OdkWebhookEvents, + # ReviewStateEnum, +) +from app.db.models import DbOdkEntities, DbUser async def generate_api_token( @@ -48,3 +62,84 @@ async def generate_api_token( raise ValueError(msg) return db_user.api_key + + +async def update_entity_status_in_fmtm( + db: Connection, + odk_event: OdkCentralWebhookRequest, +): + """Update the status for an Entity in the FMTM db.""" + log.debug(f"Webhook called with event ({odk_event.type.value})") + + if odk_event.type == OdkWebhookEvents.UPDATE_ENTITY: + # insert state into db + new_state = odk_event.data.get("status") + + if new_state is None: + log.warning(f"Missing entity state in webhook event: {odk_event.data}") + return HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + content="Missing entity state property", + ) + + try: + new_state_int = int(new_state) + # the string name is inserted in the db + new_entity_state = EntityState(new_state_int).name + except (ValueError, TypeError): + log.warning( + f"Invalid entity state '{new_state}' in webhook event: {odk_event.data}" + ) + return HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + content="Invalid entity state", + ) + + log.debug( + f"Updating entity ({str(odk_event.id)}) status " + f"in FMTM db to ({new_entity_state})" + ) + update_success = await DbOdkEntities.update( + db, + str(odk_event.id), + OdkEntitiesUpdate(status=new_entity_state), + ) + if not update_success: + raise HTTPException( + status_code=HTTPStatus.INTERNAL_SERVER_ERROR, + detail=f"Error updating entity with UUID ({str(odk_event.id)})", + ) + return Response(status_code=HTTPStatus.OK) + + +# async def update_entity_status_in_odk( +# odk_event: OdkCentralWebhookRequest, +# ): +# # FIXME here we don't have the project id and odkid to submit the updates! +# # FIXME perhaps this needs an update to the webhook, to include the +# # related entity details, so we can extract the project id, and then +# # get the related ODK credentials? +# # Else we need another workaround + +# review_state = odk_event.data.get("reviewState") +# if review_state not in [ReviewStateEnum.HASISSUES, ReviewStateEnum.REJECTED]: +# log.debug(f"Submission ({odk_event.id}) reviewed and marked 'approved'") +# return Response(status_code=HTTPStatus.OK) + +# new_entity_label = f"Task {odk_event.data.get("task_id")} " +# new_entity_label += f"Feature {odk_event.data.get("osm_id")}" + +# # We parse as EntityMappingStatusIn to ensure the status +# # emoji is appended to the label +# entity_update = EntityMappingStatusIn( +# entity_id=str(odk_event.id), +# status=EntityState.MARKED_BAD, +# label=new_entity_label, +# ) +# return await update_entity_mapping_status( +# project.odk_credentials, +# project.odkid, +# entity_update.entity_id, +# entity_update.label, +# entity_update.status, +# ) diff --git a/src/backend/app/integrations/integration_deps.py b/src/backend/app/integrations/integration_deps.py index ccfd758bb..c781c587d 100644 --- a/src/backend/app/integrations/integration_deps.py +++ b/src/backend/app/integrations/integration_deps.py @@ -18,7 +18,7 @@ """Integration dependencies, for API token validation.""" -from typing import Annotated +from typing import Annotated, Optional from fastapi import ( Depends, @@ -35,7 +35,7 @@ async def valid_api_token( db: Annotated[Connection, Depends(db_conn)], - x_api_key: Annotated[str, Header()], + x_api_key: Annotated[Optional[str], Header()] = None, ) -> DbUser: """Check the API token is present for an active database user. @@ -45,6 +45,14 @@ async def valid_api_token( TODO include checking roles. TODO If roles other than 'mapper' are required, this should be integrated. """ + if not x_api_key: + raise HTTPException( + status_code=HTTPStatus.FORBIDDEN, + detail=( + "An API key must be provided in request headers as: X-API-KEY: xxx" + ), + ) + async with db.cursor(row_factory=class_row(DbUser)) as cur: await cur.execute( """ diff --git a/src/backend/app/integrations/integration_routes.py b/src/backend/app/integrations/integration_routes.py index 92a09222c..7e3eadfc0 100644 --- a/src/backend/app/integrations/integration_routes.py +++ b/src/backend/app/integrations/integration_routes.py @@ -31,19 +31,22 @@ ) from fastapi.exceptions import HTTPException from fastapi.responses import JSONResponse +from loguru import logger as log from psycopg import Connection from app.auth.roles import super_admin -from app.central.central_crud import update_entity_mapping_status -from app.central.central_schemas import EntityMappingStatus, EntityMappingStatusIn +from app.central.central_schemas import ( + OdkCentralWebhookRequest, +) from app.db.database import db_conn -from app.db.enums import HTTPStatus -from app.db.models import DbProject, DbUser +from app.db.enums import HTTPStatus, OdkWebhookEvents +from app.db.models import DbUser from app.integrations.integration_crud import ( generate_api_token, + update_entity_status_in_fmtm, + # update_entity_status_in_odk, ) from app.integrations.integration_deps import valid_api_token -from app.projects.project_deps import get_project router = APIRouter( prefix="/integrations", @@ -52,12 +55,12 @@ ) -@router.get("/api-token") -async def get_api_token( +@router.get("/api-key") +async def get_api_key( current_user: Annotated[DbUser, Depends(super_admin)], db: Annotated[Connection, Depends(db_conn)], ): - """Generate and return a new API token. + """Generate and return a new API key. This can only be accessed once, and is regenerated on each call to this endpoint. @@ -67,7 +70,7 @@ async def get_api_token( NOTE currently requires super admin permission. """ try: - api_key = await generate_api_token(db, current_user.id) + api_token = await generate_api_token(db, current_user.id) except ValueError as e: raise HTTPException( status_code=HTTPStatus.INTERNAL_SERVER_ERROR, @@ -75,24 +78,46 @@ async def get_api_token( ) from e return JSONResponse( status_code=HTTPStatus.OK, - content={"api_key": api_key}, + content={"api_token": api_token}, ) @router.post( "/webhooks/entity-status", - response_model=EntityMappingStatus, + # response_model=EntityMappingStatus, ) -async def update_entity_status( +async def update_entity_status_from_webhook( + db: Annotated[Connection, Depends(db_conn)], current_user: Annotated[DbUser, Depends(valid_api_token)], - project: Annotated[DbProject, Depends(get_project)], - entity_details: EntityMappingStatusIn, + odk_event: OdkCentralWebhookRequest, ): - """Update the status for an Entity.""" - return await update_entity_mapping_status( - project.odk_credentials, - project.odkid, - entity_details.entity_id, - entity_details.label, - entity_details.status, - ) + """ODK Central webhook triggers. + + These are required to trigger the replication to users via electric-sql. + + TODO perhaps these should be separated out, as the review action + does not require a db connection. + """ + log.debug(f"Webhook called with event ({odk_event.type.value})") + + if odk_event.type == OdkWebhookEvents.UPDATE_ENTITY: + # insert state into db + await update_entity_status_in_fmtm(db, odk_event) + + elif odk_event.type == OdkWebhookEvents.REVIEW_SUBMISSION: + # update entity status in odk + # await update_entity_status_in_odk(db, odk_event) + log.warning( + "The handling of submission reviews via webhook is not implemented yet." + ) + + elif odk_event.type == OdkWebhookEvents.NEW_SUBMISSION: + # unsupported for now + log.debug("The handling of new submissions via webhook is not implemented yet.") + + else: + msg = ( + f"Webhook was called for an unsupported event type ({odk_event.type.value})" + ) + log.warning(msg) + raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=msg) diff --git a/src/backend/app/organisations/organisation_crud.py b/src/backend/app/organisations/organisation_crud.py index 096095c8d..84ef02495 100644 --- a/src/backend/app/organisations/organisation_crud.py +++ b/src/backend/app/organisations/organisation_crud.py @@ -58,6 +58,8 @@ async def init_admin_org(db: Connection) -> None: name="FMTM Service Account", email_address=settings.ODK_CENTRAL_USER, is_email_verified=True, + # We set a dummy API key for svc user in development + api_key="qnyE7ev7OWsfMAaX2fm-PuWYnkAUJw2xlyp72FKCH3Q" if settings.DEBUG else "", ) await DbUser.create(db, svc_user, ignore_conflict=True) diff --git a/src/backend/app/pagination/__init__.py b/src/backend/app/pagination/__init__.py deleted file mode 100644 index d199eba54..000000000 --- a/src/backend/app/pagination/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Pagination helpers.""" diff --git a/src/backend/app/pagination/pagination.py b/src/backend/app/pagination/pagination.py deleted file mode 100644 index 3b5abc8c3..000000000 --- a/src/backend/app/pagination/pagination.py +++ /dev/null @@ -1,28 +0,0 @@ -"""Logic for API pagination.""" - -import math -from typing import List - - -def get_pages_nav(total_pages, current_page): - """Get page position (prev / next pages).""" - next_page = None - prev_page = None - if current_page + 1 <= total_pages: - next_page = current_page + 1 - if current_page - 1 >= 1: - prev_page = current_page - 1 - return next_page, prev_page - - -def paginate_data(data: List[dict], page_no: int, page_size: int, total_content: int): - """Generate pagination JSON.""" - total_pages = math.ceil(total_content / page_size) - next_page, prev_page = get_pages_nav(total_pages, page_no) - - return { - "count": total_content, - "next_page": next_page, - "prev_page": prev_page, - "results": data, - } diff --git a/src/backend/app/submissions/submission_routes.py b/src/backend/app/submissions/submission_routes.py index a297f560f..c74538940 100644 --- a/src/backend/app/submissions/submission_routes.py +++ b/src/backend/app/submissions/submission_routes.py @@ -385,6 +385,12 @@ async def update_review_state( post_data.instance_id, {"reviewState": post_data.review_state}, ) + # FIXME we have this due to bad exception handling code in osm-fieldwork + if response == {}: + raise Exception( + "ODK Central could not find or process the submission " + f"({post_data.instance_id})" + ) return response except Exception as e: raise HTTPException( From 236081debad9a1b327b7b3b3ccccd03564644042 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 16:14:40 +0000 Subject: [PATCH 05/20] build(backend): fix add entity property migration with exception handling --- .../migrations/add-submission-id-property.py | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/backend/migrations/add-submission-id-property.py b/src/backend/migrations/add-submission-id-property.py index d9a67dd91..a7083df50 100644 --- a/src/backend/migrations/add-submission-id-property.py +++ b/src/backend/migrations/add-submission-id-property.py @@ -1,6 +1,7 @@ """Add dataset property submission ID for old projects.""" import asyncio +from time import sleep from psycopg import AsyncConnection from psycopg.rows import class_row @@ -41,7 +42,7 @@ async def fetch_projects(db: AsyncConnection) -> list[dict]: p_org.odk_central_password as org_odk_central_password FROM projects p LEFT JOIN organisations p_org ON p.organisation_id = p_org.id - WHERE p.created_at < '2024-01-24 00:00:00.000 +0545'; + WHERE p.created_at < '2025-01-24 00:00:00.000+00:00'::timestamptz; """ async with db.cursor(row_factory=class_row(dict)) as cur: await cur.execute(sql) @@ -56,7 +57,7 @@ async def add_submission_id(): projects = await fetch_projects(db) if not projects: - print("No projects found.") + print(f"No projects found: {projects}") return for project in projects: @@ -66,12 +67,20 @@ async def add_submission_id(): async with central_deps.get_odk_dataset( project["odk_creds"] ) as odk_central: - await odk_central.createDatasetProperty( - project["odkid"], - "submission_ids", - ) - - print("✅ Submission ID property added successfully.") + try: + await odk_central.createDatasetProperty( + project["odkid"], + "submission_ids", + ) + except Exception as e: + print(f"Failed updating project ({project['id']}): {e}") + print("If 409 conflict, it's likely the property already exists") + continue + + # Sleep 0.5 second between + sleep(0.5) + + print("✅ Submission ID property added successfully.") if __name__ == "__main__": From 5dadf0ef03ee3e328492ed20f0859e39c17a6a01 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 16:22:32 +0000 Subject: [PATCH 06/20] refactor: move unused root level 'images' to prototyping docs section --- .../2022-10-10_fmtm_design_sketch.jpg | Bin {images => docs/prototyping}/dataflow.dia | Bin {images => docs/prototyping}/dataflow.png | Bin images/HOT_TM_task_selection_screenshot.jpg | Bin 104101 -> 0 bytes ...ODK_Select_one_from_file_map_screenshot.jpg | Bin 43152 -> 0 bytes ...e_for_auth_screenshot-2023-03-26-092756.png | Bin 21804 -> 0 bytes images/hot_logo.png | Bin 3789 -> 0 bytes 7 files changed, 0 insertions(+), 0 deletions(-) rename {images => docs/prototyping}/2022-10-10_fmtm_design_sketch.jpg (100%) rename {images => docs/prototyping}/dataflow.dia (100%) rename {images => docs/prototyping}/dataflow.png (100%) delete mode 100644 images/HOT_TM_task_selection_screenshot.jpg delete mode 100644 images/ODK_Select_one_from_file_map_screenshot.jpg delete mode 100644 images/endpoints_responsible_for_auth_screenshot-2023-03-26-092756.png delete mode 100644 images/hot_logo.png diff --git a/images/2022-10-10_fmtm_design_sketch.jpg b/docs/prototyping/2022-10-10_fmtm_design_sketch.jpg similarity index 100% rename from images/2022-10-10_fmtm_design_sketch.jpg rename to docs/prototyping/2022-10-10_fmtm_design_sketch.jpg diff --git a/images/dataflow.dia b/docs/prototyping/dataflow.dia similarity index 100% rename from images/dataflow.dia rename to docs/prototyping/dataflow.dia diff --git a/images/dataflow.png b/docs/prototyping/dataflow.png similarity index 100% rename from images/dataflow.png rename to docs/prototyping/dataflow.png diff --git a/images/HOT_TM_task_selection_screenshot.jpg b/images/HOT_TM_task_selection_screenshot.jpg deleted file mode 100644 index f7b8c867f199f7c553da7aaaec783859b848c78a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104101 zcmeFZcRbbKA2@!l9TG)R#?9X2URze#d!-23vd6V0x1=FiMG>+kt8AjQkXeZAN_Kc> zq{YyX8j-ps z2UiDNg0(_yamBGlY{M(CgaFnER~uYD;dbqyKtQq!rrT9(1i=;`5{OT*4ZASo7~rJf z{x)~(2*(#1q3t*LK?*8E5HKlNsPd!t){?t0zx8U5>m1~iQeoklb?k{$p`@&$s-~`CXmrx})M*n_8(TYjhjWfj7;hh6KmUNh(92<0u3ozy9((I{T>PE8 z35n?$nOWI64{{$Cmz0*3S5#J2zj*oTb$vtQo2HJ=uJ_$NAA0*feIEHTIyOErIrVLR zVR7mE^4}|~xOU;%xs$e9_D8#DV7my2hzN;DaqU77_~9B(LqvR3gk-;>KB<-G0anyS zGTP%YX^)@pVM81IMQ82xj{G3I=qHYExTfJ-_W!P7m;OJs>}SJ%wW|+M5+Y#d5z+v8 zuxt@Z5YGL8n>#%m{HKosK?DGcw53K~t&Dtk+*4;AX9dC!)`FDDRIK4;St&@v`s=DtjJ_&@{?;#gA zih6ajvSgf*@<$oFC%bZsC-0nVYa}YzSt(YjBA1R<-#|D$oE!Z6$GN&b?88Td0^OX0 ze;OYRfia6<;J(0DWsy@-91;iiWLh8b93kvn%=6M@FGd%81!CSBDc)}jx%IbdNP+hY z#s>>iUE_f+l82almzFZGXYP3yn6j~W8I8ER-q5Pwz|jB7VUFeVa$eaxnp=?%D)!h{ z-qabc+4H=><9W#?DoL?0ru0Fb$Bl&#z0~*4n0CkKIUeCnnsseh3DJ0wuAW?KJ9?z} zHLbqM5n@_>1^h>ul>6*jgP4Hwp8jg|53Z;z&A+3&TT+fDoOWOlGIh<$FaJ8G`Nm=I zTQ$<=#k#C(gd&ZkqYu1S#wsOPKa-8@;W_<1X*B4-gtO8Kj`VO|jh`Cd(frP{rOP3t zl$|&8fk6XvSk4vm&e1dOEyr1z=?KABvbb3ZJc=c~+oB6FT!nso+ zkV=q#BR=NI>}ySZ<>fC-6-KphyIXD_G#;pI6KUm+RZLDJ37Aw@Hh=Y-VeK^UxB>$g zVOK{FB7eYq&1ON-}+>xNrSil&!x?#CpKp=V3uYGck%jM?dVKHmi7nn7x%Por4j&{q*~ViutEYM#Z8m=g zT{Wn~7~W{gou2t3Rjb)tN4%QlPI)yZeJ+oMpQ>kYwqTZ^P=kHr?6%!2jME zgCZ-p6TWd*=L?N|=<->3#;hOHjE|aAjftP-k+WJ>4OBPx4gS>Smri$rExNUq+>w6kH|De}MD~Zzb`>N3!bE^HLacwu+ zuWkh9tS|Dh7{r*a@$mc4_Y6M?>XJG2*2tgLzVFa%WX7~XT66A`{Ol@=%bryOo1iwT zC}$H`6q#z$hwf!{;Hov$9#fYaKdbA+Hhg96zJIsR#M(LT3M<3BubF*a?*h_AD&`KP z%^7~EjBP_FeYBC+s6W0592j#33uHwWj&KHAZiH++Y@)YQ5o{Y*@?`EXF1yjCuT1h> znN|;h`{=iC;q??Rf^i%s3j2cKfAL;(ZN}b&j9ZId3GB-Q(UWLA>bgucpQaE~JVc)1uP1XG4{Vd5>)EDUzMjO`aoC7^| zjlFvEnr90dJIFR%&eUJ9X(KHVmo#i-nfSK2Nc;C^gCk#9{5OHL=Oy7Ba%o?>sy7~y z^fj65eZlX3uwFlUjcc`ZO8&BeD$xal^BJk>YHYpBr1}cgQS)ig!8k%&55N9dS4{lH z)zGeB-m{$Yv*eD~k9Do6o>=E5YWxv1zHgvm*)hdnrC{yuLSzWqxaPq^@};{+BU*Zu z*D@-)ZxA`Kiq8}Rb8 zQl>pg#=GYz;^J{d*)Uz@ywcL?2n_>hr1-Q>_v~9&U2%zRdM!xICO^Lme+pv zvpORkg-N%)Cu~gbOIHuP2^TwB{zcsTaF!wY$ql+r z%*9!n^cCkfYZz~LhF-<;J(sDZAFd@rhf1H)QalMwCD&xD5%Z86^T#eVz!^X^; z5rONxw+_Vhbk|`R25&qqbC6uVNzS}a*YLQ?6WS?cFRp8=iYjpWNqzCWALvYp+BY;GFy41lMK=Acm^|}XlC^&SlIZgTZ&<&YTw@qd zy!Z7M)%hy#U+bTWEN$e#}oeiGS<&fPs=J>5wrb^~pwB!)R@TP>UeMrv_ zN8U%}5znmjvKZB`d|V$H=%`U2tsqUCb^03JYw}7f;??+*q+2I1y9cKBD}TXWSPYd~ zwNL8_e|MOlf2iQH@$)X0>bq;NQZ8I7dVcst|FC<>l{1&;vur89Ephud%Ae4r>p~4u#}cU3(Qg8|E7_T6 zUyhlbH5jDTH$raDAc#HWnJJgjP>n5=&T-2*W}Fjm22_STWV*uD6?6@Fnfl9L^KoE! zrz8#>k0RtS#8iURNSS!F7>>9{PhVBj#EcI-0Xj{IJx?+ zDo;Pc_ifde{rwS9Nj4RK8)=D~mD^s>^JUKIi!liPIQL@w*wUm<-8ZA{*e;Trj%w#Il+C>VRfEpGqud`^sD>EoYv_CX#zi-Z^@#HbEO$Lq1M}GHoiD{D$qMUJTvx#_5d#8 z$Mz|f5+o5OeOXwN-2{j2YDeC!G*k*OoSkyLQt&U}rg88m2ab+s!Z zm05%c?rzw>xL}bU=9oac;usME=an$_0-^W|N;5xHfAFP`-!I{4$yqC-Ev}Y6*eBhE zZH}tEzuXHWESr@pN=;lLpXEOt45!`gCy z=VHUqCYUw=8<_LgmsP(72j|A5t{3|ZJc~n#2%d>s8@m0YNj}VTV|f#p-eb5mwqiIJ z60`{l6vC`HUp6f+W{0`oerzDV%&?gA_>SX>Va{^Y-v&H)EVm#%B9Htl2K2|zSoK#Q zi}?Pz{4)(jf)*K_xX_?>#<5MXlqc8ntl!W>PdM;!Pd=}#&R6+57{c1R!7s4$vF^PW zBP}|g8AE_NIQTc?m*Alw%87gdE^ zrFMLAx?S~bTV`MIzEN!v!fufjqrMYwO?ia`K1(U{-yd9DHOh-;Ab&ZTvsl@+NrtY_%&-;*J}AhLs`L{6m)h_>ve(t7Z{Ez#}CpahR_#8;e3LAKF-j zon(0W%@|i>?IySZ^{+!UJRsWbyKrFH;aT9@F_r}R%4f?xu#@gmreMzB*y_r){*8e9 zZRt{u{UQ~EOh=eng;}aqti^>`WwaPG(ws2BY zefQiX_k!kwVXa?+ZX>?-&MX!LHk9$ZjWm69Tly~c__Wc$qQ@qH5i?yv#P;xXG1A{Cv5Wp{7Z5@~< zQYo2K`kSj`PmIw;kB{0sZzywkm`;$>`sU4A>xNi|&JE5{t7vDEso}3ZN6eaxa{FF# z$;UbGIeQ|$OeUzYa7{an{?59|>`>gH?>-Uqu`>3j49Mgq{_ZL~_4Q_`;Q5jtq@9x{ zB4$%#wg*&^H#`RKuAQuvkji}DedSv;VRX^`WyiycV_Z$^o8U?khpsBLvweRXnx0%Z zaCIsK3*Cq);g9F*&|024UQ!&dXd3no*;kdbk~gslmT@aI%eeE)pEjm80b)t6t1jfO zeD!dgL9lU0pCembubBj!<6_=Zr&am&zd~MAC2O>ejp!w+rN%_ZgjV!rYiFe$a224* z?;E{naIAiEy;IxV_l*%DoA<_KK4JFI#apgiqXuUj58XK=qGIWD%2I-+j=7A=;Op@? z)f}FFM-D-oHG^@hPhKKRVmbQH$C0hem6IgIGHAyIcB zQo_`k)dQ=6MqDb@D48Rj&2D;Lo;|}ui9OXdh`W6WCCe(LEJ2+U8Q*fmvvOsmvvTf~ zRoYvSwd=YUu+|HPdS2Q)ZCmM8my`s+mrYR8Q=sD=pmFAwSH0TFI~@1Mh(aUAWgi6f zFKaqqOMB%O*%IcZ+VTW5oW?~b)HipTrmB=U`FkA0ifZl;^xvPc)Q$$hiQFl(#|qMd%`kXxa(q4J zq8`e3#Pj)&D#C@-Jy!2#E72D63S?9RpDwmx1}HrZ9pg{MSD?jOE-CZU9SPuyvgwGY zXkOubc?LmmNBl?;xzy0PYMcyC-I`0x4XOBQaPX_7+|{x(@HHb>@{Esx2Ltv;aYz>T zkK^}B&xpWT=G~d)XLTW0`|h*-xVoJ1C1hVMn}~S9^#ilaA~Q=lY7GvkqhCBopLJKa zOYs#e$9Q&a81=;XWc?;`A)U`-k&}d2@hyV zqwZVt7+d&O_6@D?Raa}u7p`L|z?c+7_Aeg{4?F!zyi!J0CHDjg11W1_-19sNW!lSO z3|s_v!_w0im^Q)tB9@_Zv!J^W~G%ojK1m;x#GI%*?cX z@{}H=8%^@OH@$Dr^>be7%|INbxj3DZ^&F$I@d(BmPOUU8^B+X<=VbKz6~>6@%O$aEH6`#F5lfzM=3^L z39XAM$#Pb$(oFVkqn}SRWiA{!ca)6qQUJSWNA^Z*$;dLr^Tz3!4Z``X$QRvQDrzS+ zf;-!3L2>YcQ5oG{=gNo~%aEL#&yq?H6%bSGdcN%#<#~&%w2*Nhp)Cd=+iWK(yA~<`8wbIhoH#_87lipn!hY_W*rLLBCCK z;?!jt%L|k8b1^2Xul9UVeoV`>j%B*(u=m}x(ccUw_H48YyDkjp44xfxqW{c2MV>1u z>!hr_aNmo2>^(YS3v0!ro&INEki?isQF%WYszuD#`Il;@p z$Cqf3)Am)@-3_U;ukFIO2Ge`&J}hwpbS;DJitKUG*wD8f9W?g~!1%P9b(cL|n^Bxx zdS?19_1Qh8%Ef0_rsU@m^$+UUx;8B4a%VMOZF!M6Q7HT(S=sOu&7P}Pds*~9q?ATU z(Nr{@{LA-?t$j8>XrIpwS zN>`#V88RfM%ONE+r+_3w{t*Z7$vF!J9i4AIMQ6<%qOx2sVo9^CC}wO3bc;WJx-u+q zja~S8J*KgJTun$Ut@MV+OUJf}50>#3WK$mK#*N#EXUeF9zL&(~jyD<|)PKw9#j}Xp zi9=ZEK6Naelv~N}x{aC3>Dyx_R;n~B#X&6cwLo8jqei1Hf;yD7$ov&?e@ejfDX08K zBGozO`>&jHosXp0zR!NgO-PUtr&nWjn>mo?tCJLp)>?{`?eD8a-8ZpsnDrZEHG^0J zt)I-Qe^JsopULtUjn-+_g?l1ggDfv(r_S;OZvwQ|>09k?`v#ddN>dUe_q>@;n|7v+ ze0=Q|zh`pB#i8;#@-&4yLU8g38Ldnc=^ESW`_&hjg>6$tD+kk*X^rjE)ZgCv(D4rL ze}_i$oWpPAXWzd&@@QIzohm!#!rZjhaXN-}4If%PkxxG=lfNZVb{SU;JKoN2t#Odb zjX9CQ=Y8z(l@^ndC;ie@hGma1;el7;{rC#2DBN3g#4jl_Mxv8a2IciNIjfwmnHa0Q z2)NrHQHa_%a;oMovv3;Ct!NSi@>$)yk5#xNPbw+b)`&-dRK6R}^d zVe&_{L5in_3aP#g$h6r0gAxE@un+_nI*OMprd{knY+OKpx zV&82~g+0y>`iErL`PIpf+&^Lbkls~b=DP4pM%xIcyzoT)NeJJY*zm&< zO2z82q=S-T$^2)Z$jf}6n=|d{o*z8U7I{{P)N{GPJ!UbN#B#cK{@^KojkJALu>54??b=BmHVGAV^VpS; znP=l#WaqylhB;KEmPJQZ8d~`d{2dZ@`f-_k)k5!e1!43+=Ph-!M18Ng7++%XPgXWD zk^5>-XIGP&vDB>^+F)X%mam4Gey&YUn4G;17nNzaqYJXY&^b-D3xEBXJO?tR8fZ)P z2#5&>Ry*Ept!g9^ka2Y1OL!2qRMI_CpI9iJn3<|-VwcTs>8rmt7WL*E4dcq;>RBwj z#JnV6%8@YdsLRXl?n{uiqM>?)(AQsTx?gfqU+xkM*Nh~`@i?Owo+))}tK9{(2;-N! z2ho~b_n!IJYkXYdx|MR_yBzl9`Vt*2LU2{0%Seyt$;7a}zQW#^4NR+q|I&jmYh(8e z^u@nT8!gdOe*bE1XQHs8Nwx2BZf@)*c<7{EnU`7|A2FUOy?BCkh=KGWC0qc6_bnL2 zf3vQ>+N6Ig`7*}**x9K&lj=gNB`5bh;k1$#sAX>we_PXmIXd4k^bs>-`aDj75Gzfd z=em&@>}2Y7>y}^=EnN(hspWBmNSxkVw2AkyE=K7qZ=0XXd56cOp$2ozWi9tB;rehv zVk3giS7<48;|bTiD92ldlA6GGHGy5Ch6D;9V=*&2L$Xf9Yw7V=&LP=z5I)RJ;5yQM zbEG>h9hc>J_@sWkC8>@RZ}Yc9Kd@t)AW(jN?>WNF-px<@EYEp+dq@ijxnTsYY~8Kx z1Z~`1h5W5NghT{|g}^a+e-A4gXFG4CwVi{bn=I?xlV_|*M_XCeQ)1e}+8!tD&N-?D zdf6EU>KNGsI@?IuvdYULkNHdcyL!0Vd0QdZKWhn2*7h8KFSWSG7?cn2XIsC-O zDa^sq)dP=>!`#8LwfTwT;p63kFSoT3vU9O>g~BnAqsUKOJ9tOqC-!gk$Cdmh9E$jN z%pJSJ$%o35R&uxT!AVkAl4ZqJP} zwz83uuojiDLy1c5@KJZecw4#I*x~p<&Vr7R2^uXTB83vO5|EIPln@X_iHiwH*@@Y~ zSG1k52+Cek+#a<T6iPzWPRv>WB`yK$fwG2tL}0a~#H~f_ zZS6&EZBXK@NSwZ<74_6*Sy6(*+pl^qR^ImRUaqpNT8?f${@b}mj;?lw-c~pjiHM7f ziHf4pQWC=Aq7ouIbjEgG7-+9JR`^>gtVmlMX%)!G3L223tCfSDkdud<11l1zcxgRH ze><1cN|3AD7L|wyj?=F)lig*)l3R_IKH+6&VIPG z&>KK+h4J=Yf~$bfwV#|8er5|SHlMm#%se&_69W%%HoC1GJ!e4pSP+*ZAD{s4}z zUroX}3u$$n?HKxac(^#)dHrf9p7vi6er0Z(%YP*LRgR}Q;qDOt$J9A*T|c*f7xfPe zJe`)K4K!o-f34iEGQ4r0#MpVAaCgP|kL_wHy6ix(&!Cf*c7c5ZJp$Cay_JuPH>;eX zjh7u1aL(QPm=I1|E{>2C4{gy3{R?M&@veDfhXPJcIPm9OCx`rB`kw~=r-A=z;C~wU zp9cP?f&c$$;MZ!|&J9L{esC?k`I+F6`iT=~^$c`X)U}l1-EnyDJJrR;6+_0+t#`pT=e%4Yjwr-ow{>-c{0UBP!L~T~JPvks@qu;2CtM3D?c7cp z!Y4cYFalMe4zz(DKmu#v0~~=1yz(yqpKdS*0}NpK@&7=77*DSUsjMNDBd~!KO28es z0xLW{!1V#df$5iSG4^N_J_|v4901~>&CLZ407!2EupYg+xt6xMxtzbO&kZ*;qK(Sy@<*a`H(Caq@`r9Ay<&6cLq@k&~0-5L8k> zaZF7@R!#>0TLW?m3aY(SjMUVOGTf}(GXK|U^9B5^0g*J3F(Cq8v)}ox!4YWq_)GaX zRcxj0JNfX!KEw89{hbo{#20RE-+8Adq=q@GPej|WyHI`u>AmZQQ|bUX7A0Yk@?)*+ zw?fCe{lZsSLRgo?SE45%K1EA z$awZ_xoGOHJUrMOSzr5z#PQwn%-H{47lhLMx7<7LClmhUKzP5k$6b|Ak0HAY5ENto zEZ+5w9PjoTW{6F{VbWvP@rM0XqDuI#QUJ#0mnN6Ifc-r^K;HCQ$?q>D#u)dwIVrx| zU2p4shou4HTFumy88rQ@`^{ zsQNav5ork({YX+>7NzxHI*f?xdXXH}k?Eqeb9AlA3aI4rM1XJ^%2oJPH2|6;yPbQG zkX>av|E&Q*2kza4zr&KtZHc3tnhy~SXB0%tqX`b~4Oo@7+l@nbuem3qv+3Obv85s< zR4LA(biG70ai!_zp5}UcxZy2@#c9TIwcSRF2?$(Vtpd;<6u^J6C}P8?940~V+EyA!zrt0Bo8op7eZZY^?&brX#hO>2B>@&yVZuuE zmZ)u7J(~T1wBN$-ZETLeQtP#w?oXJpN7DOKF;s@&q*-=0mcFnN(6(C)`22?F(5x?5 z`{=i&s`f|@WJ`9|B@8PmlmGqApwbiGrMvb64-Y~+y==qRWOd(m6WW;r{7I} z*_HDTu)fVL<$RA3VbZ4t`qq15J!e&oS-Sy=t5YK|_L&{;+D(9kEU>H>JZC(8tU{|y}uZu1};oqtRSKamh5;tm*d>k4T! zrvR6N2o*1Nk8NWjfcybv-^}R5Z#BWyt}t07#|-|A1>mn$oMU5=Y=6hwq0O6xZL_9&w3SDH(wdY{Ckg+Mioi0FI=4PUi3}{ zJ|^uoDCTG-#jY`sti$Q~P0xL0ce z)Oa7617IgHoRSJi1&eE}^iv9B5f;ILl8e-UurP@BH)?c!UenA(9YD~C{+5q>v9o77 z){XaUv`4)aK)!8HPCN8?lFN5{$k-$V%zFvtWLIlo96%-HF0b-?;~TEbROP^$W(&$) zNS1r5@F#Op!AHXY=UhMw`XxZx`AmAvApw=_m{^^XWshO>n}JkKZD6n&miBeSRrSf_>d)^#=a{qwPVGj)!3(Q@Jpq)7 z@1p^oX~A0rHM-*2{Q!Waa<#AijBIjtj^=5uP`&>E3#8W1OLML+r0!-wDsiVsH!nJr zMP4Iuc{~d-%AUx43A-Bu2K0&khrdxH`k$_oA=v3m3nQ>ct$Ez8a|1#NZA^#Sog+8P zUQs6YMnfN~@W#7cr{#BN4inFAGsS@^F1NVgaQbma~?OR{wmvo z0s=>#AHxEf)j;WJK&(*+$IYICLR)|cHAuA)tN;!^`Hc+b&L|>*&Z0Z%yLC(1dH?)~ z+1I<;u4rjBz$lUPxZ%+s+zH!zgi!uR`h|zHdhx^)dGY(xp zIgrY>3$DxsTtre^i8*B+M|!i7&ah6BQd>&X z-e@$m6QGzlg$2S+R^&~C33Ny8Zrny5i9-&pXKC%_MqAPl2%co6vdPGx zw!ZP$8RP-mvRYg?U4Yu*bGB+d^J1gvIvG&!H&ID_Ioo()pwI03MVN!6*>csPqIjH02+!x;qgu}2lTyC(n$2&gw1lT|Hw z3I`4m5mo^it;QaDldsU!nTGq;5uaEe_Dc#P&h}7gP_7VOt}$xfC#AQ)9R3do)Teh% z{pIdG;<(-+xc;&;_G7AjHIj~unlw}|lPB(euiU3Lw zTYjdF)>&zfqV07Tbv|KzPG7sHDhkA$+K%iW0HJuP?H<4&l-rCq+-nW3@3P^#3V?zH z>&jUvxBix;wq&#@04F6^y*d_vVnlZd@_|0dsWT{oi$~8@r@~=i6peSU#8wPbUtu(d z^R%HHy+j0xiA`n%2og;Mt|6^kIUAI*CLW3_E@ z@Sk85!@VTjV&z(*(OoFd75@ehmsXGA?Z>XcXQUwbd;ydPz)_L-W3`-Rig zI0to!bxUF|5!_URy+uITV+5s4#RB}CL>G}b1miti;7x4{Wm0w?P<#&O z$6)Y;NG$1pas={b_}tmtse4Lh7AFY)%mFp>uHn>NLbr3X&uGB

}b>%*VH<)Nh!= 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 diff --git a/images/ODK_Select_one_from_file_map_screenshot.jpg b/images/ODK_Select_one_from_file_map_screenshot.jpg deleted file mode 100644 index c552e201fb9f19877261c92acfcb224d9f54a1ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43152 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�yL34S>1jsv{V!87l zMyV=V;n54a4?frEsFO45Xq#VJg9q;s6h%^^%0J-16V8ncelSQjF2J9MVCsmY(aXJ) z8-u_+K}m~Ti!@>b5jc2bVo&~n_W5{y>|zm*h%Bm_pNea)J~JY;fGb0`d|G@odL00Z z0lz<&dXGv)gwW`|uih(gBK2xom<2(@0Qn}NRnnxGw1%dnjs0yy1%}WvhN@qwsIQ4s z2kS8?fJ>$xl%1$}h@d_N6H9aP?qhm=hDvJ9TrNvCc9Mz|g$70wh%gnIiDXs(#|f{V zQ~S=_q3?-bpO0yzSN*S#Dr0|pX;937=$HL}r?6*-$cZ9dJRHy}v zpTqH?wy4<)&~{&t*-@70tBAkxr}k2u2BVZRxyA1!o*{TRh^p=*e{0aHHH#<16CJ{s z3*`sL+OlKrxfZ|UL34~0AJ^vjZcDKCZr2w?U5rfg9b9J$=cJ;^MaGYrR_mzPk&@De z53J};7|~6E!s6BOFiTYECac8YX`sGLg7&XNOH+c7NEN04r_^5-fTM)Vuo(k>6uf%GNFR zKzORW5E%?*;Zb}qrV9#ov0xUzM9#W6$JB+*!4fE62SZziNhgG~sQOW-+OCDce4_}# z#6Zf`sjtH_>gb-^s3D8B%zGT%4l{Lu7ZGNxwk(i7JK3knHb(M^w)r65gZj%1o(E;x8R0_jqjV z=)Jb}#mNI+iaT|81tuowuua`MM{kMWRpuQ<9y56*!!oKE9Te3I#bWMFb5L@f(YnjA z=Ef57Zf=nS?}TpNTY7h8c~1EVoEIS6gVde4HzzO_4~`OUUs!iA!)h7lR11@Ow%RL2vlwO_>n{QrAqUZ!;U^1*w+X*Eah=txqf;7 k&zhRlok4e2=7nt6ik_-_YT8rpqNTJH&~&){bN>IE063P?F8}}l diff --git a/images/endpoints_responsible_for_auth_screenshot-2023-03-26-092756.png b/images/endpoints_responsible_for_auth_screenshot-2023-03-26-092756.png deleted file mode 100644 index c215ecc99ed27f87a5a5911413110e1a6a39cbf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21804 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

9zjhObg$+u=A5r@ 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

8)q&Mox4 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 Date: Thu, 19 Dec 2024 20:30:29 +0000 Subject: [PATCH 07/20] build: rename docker-compose.yml files --> compose.yml (#1998) * Rename docker-compose.yml files Signed-off-by: casdal <141283367+casdal@users.noreply.github.com> * Delete docker-compose.yml files Signed-off-by: casdal <141283367+casdal@users.noreply.github.com> * Rename docker files and references to them. Signed-off-by: casdal <141283367+casdal@users.noreply.github.com> * Rename references to compose.yaml on github workflows. Signed-off-by: casdal <141283367+casdal@users.noreply.github.com> --------- Signed-off-by: casdal <141283367+casdal@users.noreply.github.com> --- .github/workflows/build_and_deploy.yml | 2 +- .github/workflows/pr_test_frontend.yml | 2 +- INSTALL.md | 14 ++++++------ ...evelopment.yml => compose.development.yaml | 0 docker-compose.main.yml => compose.main.yaml | 0 ...ompose.staging.yml => compose.staging.yaml | 22 +++++++++---------- docker-compose.yml => compose.yaml | 0 .../josm/{docker-compose.yml => compose.yaml} | 0 contrib/just/start/Justfile | 16 +++++++------- contrib/just/stop/Justfile | 8 +++---- contrib/just/test/Justfile | 12 +++++----- .../{docker-compose.yml => compose.yaml} | 0 .../{docker-compose.yml => compose.yaml} | 0 .../{docker-compose.yml => compose.yaml} | 0 docs/dev/Backend.md | 6 ++--- docs/dev/Production.md | 6 ++--- scripts/misc/renew-certs-manual.sh | 2 +- 17 files changed, 45 insertions(+), 45 deletions(-) rename docker-compose.development.yml => compose.development.yaml (100%) rename docker-compose.main.yml => compose.main.yaml (100%) rename docker-compose.staging.yml => compose.staging.yaml (83%) rename docker-compose.yml => compose.yaml (100%) rename contrib/josm/{docker-compose.yml => compose.yaml} (100%) rename contrib/openobserve/{docker-compose.yml => compose.yaml} (100%) rename contrib/playwright/{docker-compose.yml => compose.yaml} (100%) rename contrib/tunnel/{docker-compose.yml => compose.yaml} (100%) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 568615fc6..798e410b8 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -157,5 +157,5 @@ jobs: uses: hotosm/gh-workflows/.github/workflows/remote_deploy_compose.yml@2.0.9 with: environment: ${{ github.ref_name }} - docker_compose_file: "docker-compose.${{ github.ref_name }}.yml" + docker_compose_file: "compose.${{ github.ref_name }}.yaml" secrets: inherit diff --git a/.github/workflows/pr_test_frontend.yml b/.github/workflows/pr_test_frontend.yml index 5ee70aeb0..ab6a2c21d 100644 --- a/.github/workflows/pr_test_frontend.yml +++ b/.github/workflows/pr_test_frontend.yml @@ -23,7 +23,7 @@ jobs: with: playwright: true cache_image: false - compose_file: docker-compose.yml -f contrib/playwright/docker-compose.yml + compose_file: compose.yaml -f contrib/playwright/compose.yaml compose_service: ui-test cache_extra_imgs: | "docker.io/postgis/postgis:${{ vars.POSTGIS_TAG }}" diff --git a/INSTALL.md b/INSTALL.md index 99fbe18a0..f51cde190 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -155,10 +155,10 @@ local test - used during development, or to start a test version The corresponding docker-compose files are: ```text -main - docker-compose.main.yml -staging - docker-compose.staging.yml -development - docker-compose.development.yml -local test - docker-compose.yml +main - compose.main.yaml +staging - compose.staging.yaml +development - compose.development.yaml +local test - compose.yaml ``` Set your selection to a terminal variable to make the next step easier: @@ -173,7 +173,7 @@ export GIT_BRANCH=development #### Pull the Images ```bash -docker compose -f "docker-compose.${GIT_BRANCH}.yml" pull +docker compose -f "compose.${GIT_BRANCH}.yaml" pull ``` > This will pull the latest containers for the branch you selected. @@ -185,13 +185,13 @@ Before we can run, you need to build your version of the frontend. This is because the frontend contains variable specific to your deployment. ```bash -docker compose -f "docker-compose.${GIT_BRANCH}.yml" build ui +docker compose -f "compose.${GIT_BRANCH}.yaml" build ui ``` #### Start the Containers ```bash -docker compose -f "docker-compose.${GIT_BRANCH}.yml" up -d +docker compose -f "compose.${GIT_BRANCH}.yaml" up -d ``` You should see the containers start up in order. diff --git a/docker-compose.development.yml b/compose.development.yaml similarity index 100% rename from docker-compose.development.yml rename to compose.development.yaml diff --git a/docker-compose.main.yml b/compose.main.yaml similarity index 100% rename from docker-compose.main.yml rename to compose.main.yaml diff --git a/docker-compose.staging.yml b/compose.staging.yaml similarity index 83% rename from docker-compose.staging.yml rename to compose.staging.yaml index d8159f200..dc78b5d5d 100644 --- a/docker-compose.staging.yml +++ b/compose.staging.yaml @@ -46,43 +46,43 @@ networks: services: proxy: extends: - file: docker-compose.development.yml + file: compose.development.yaml service: proxy api: extends: - file: docker-compose.development.yml + file: compose.development.yaml service: api ui: extends: - file: docker-compose.development.yml + file: compose.development.yaml service: ui central: extends: - file: docker-compose.development.yml + file: compose.development.yaml service: central central-ui: extends: - file: docker-compose.development.yml + file: compose.development.yaml service: central-ui s3: extends: - file: docker-compose.development.yml + file: compose.development.yaml service: s3 fmtm-db: extends: - file: docker-compose.development.yml + file: compose.development.yaml service: fmtm-db electric: extends: - file: docker-compose.development.yml + file: compose.development.yaml service: electric central-db: extends: - file: docker-compose.development.yml + file: compose.development.yaml service: central-db migrations: extends: - file: docker-compose.development.yml + file: compose.development.yaml service: migrations backups: image: "ghcr.io/hotosm/fmtm/backend:${GIT_BRANCH}" @@ -107,6 +107,6 @@ services: retries: 3 certbot: extends: - file: docker-compose.development.yml + file: compose.development.yaml service: certbot image: "ghcr.io/hotosm/fmtm/proxy:certs-init-staging" diff --git a/docker-compose.yml b/compose.yaml similarity index 100% rename from docker-compose.yml rename to compose.yaml diff --git a/contrib/josm/docker-compose.yml b/contrib/josm/compose.yaml similarity index 100% rename from contrib/josm/docker-compose.yml rename to contrib/josm/compose.yaml diff --git a/contrib/just/start/Justfile b/contrib/just/start/Justfile index d7b220446..2ef792504 100644 --- a/contrib/just/start/Justfile +++ b/contrib/just/start/Justfile @@ -80,8 +80,8 @@ without-central: [no-cd] josm: docker compose \ - -f docker-compose.yml \ - -f contrib/josm/docker-compose.yml \ + -f compose.yaml \ + -f contrib/josm/compose.yaml \ up -d @echo @@ -99,8 +99,8 @@ tunnel: #!/usr/bin/env sh docker compose \ - -f docker-compose.yml \ - -f contrib/tunnel/docker-compose.yml \ + -f compose.yaml \ + -f contrib/tunnel/compose.yaml \ up --wait # Workaround to until PR merged: @@ -115,8 +115,8 @@ tunnel: # Is is required to correctly download forms from Collect CENTRAL_DOMAIN_OVERRIDE="$(echo "${odk_url}" | sed 's|^https://||')" \ docker compose \ - -f docker-compose.yml \ - -f contrib/tunnel/docker-compose.yml \ + -f compose.yaml \ + -f contrib/tunnel/compose.yaml \ up -d central just --unstable start _print-tunnel-url "$odk_url" "$button_url" @@ -135,8 +135,8 @@ _get-tunnel-url service_name: #!/usr/bin/env sh service_url=$(docker compose \ - -f docker-compose.yml \ - -f contrib/tunnel/docker-compose.yml \ + -f compose.yaml \ + -f contrib/tunnel/compose.yaml \ logs {{service_name}}-tunnel | \ grep 'Your quick Tunnel' -A 1 | tail -n 1 | \ sed -n 's/.*| *\(https:\/\/[^ ]*\).*/\1/p') diff --git a/contrib/just/stop/Justfile b/contrib/just/stop/Justfile index 8237b78a8..596c93fdf 100644 --- a/contrib/just/stop/Justfile +++ b/contrib/just/stop/Justfile @@ -25,15 +25,15 @@ default: [no-cd] josm: docker compose \ - -f docker-compose.yml \ - -f contrib/josm/docker-compose.yml \ + -f compose.yaml \ + -f contrib/josm/compose.yaml \ down # Stop FMTM & tunnels [no-cd] tunnel: docker compose \ - -f docker-compose.yml \ - -f contrib/tunnel/docker-compose.yml \ + -f compose.yaml \ + -f contrib/tunnel/compose.yaml \ down diff --git a/contrib/just/test/Justfile b/contrib/just/test/Justfile index 6cdb0d2e2..a70d10da8 100644 --- a/contrib/just/test/Justfile +++ b/contrib/just/test/Justfile @@ -30,24 +30,24 @@ backend: [no-cd] frontend: docker compose \ - -f docker-compose.yml \ - -f contrib/playwright/docker-compose.yml \ + -f compose.yaml \ + -f contrib/playwright/compose.yaml \ run --rm --service-ports ui-test 'npm run test:e2e-report' # View Playwright tests as they happen in browser [no-cd] frontend-debug: docker compose \ - -f docker-compose.yml \ - -f contrib/playwright/docker-compose.yml \ + -f compose.yaml \ + -f contrib/playwright/compose.yaml \ run --rm ui-test 'npm run test:e2e-debug' # Create Playwright tests interactively [no-cd] frontend-interactive: docker compose \ - -f docker-compose.yml \ - -f contrib/playwright/docker-compose.yml \ + -f compose.yaml \ + -f contrib/playwright/compose.yaml \ run --rm ui-test 'npm run test:e2e-interactive' # Check coverage for backend tests diff --git a/contrib/openobserve/docker-compose.yml b/contrib/openobserve/compose.yaml similarity index 100% rename from contrib/openobserve/docker-compose.yml rename to contrib/openobserve/compose.yaml diff --git a/contrib/playwright/docker-compose.yml b/contrib/playwright/compose.yaml similarity index 100% rename from contrib/playwright/docker-compose.yml rename to contrib/playwright/compose.yaml diff --git a/contrib/tunnel/docker-compose.yml b/contrib/tunnel/compose.yaml similarity index 100% rename from contrib/tunnel/docker-compose.yml rename to contrib/tunnel/compose.yaml diff --git a/docs/dev/Backend.md b/docs/dev/Backend.md index 85ff78e1c..9be27baf0 100644 --- a/docs/dev/Backend.md +++ b/docs/dev/Backend.md @@ -116,13 +116,13 @@ just migrate ### Interactive Debugging -- The `docker-compose.yml` builds FMTM using the `debug` target in the Dockerfile. +- The `compose.yaml` builds FMTM using the `debug` target in the Dockerfile. - The debug image contains `debugpy` to assist debugging in the container. To use it: 1. Re-build the docker image `docker compose build api` -2. Uncomment the debug port in docker-compose.yml: +2. Uncomment the debug port in compose.yaml: ```yml services: @@ -201,7 +201,7 @@ Creating a new release during development may not always be feasible. - A development version of osm-fieldwork can be mounted into the FMTM container via bind mount. - Clone the osm-fieldwork repo to the same root directory as FMTM. -- Uncomment the line in docker-compose.yml +- Uncomment the line in compose.yaml ```yaml - ../osm-fieldwork/osm_fieldwork:/home/appuser/.local/lib/python3.12/site-packages/osm_fieldwork diff --git a/docs/dev/Production.md b/docs/dev/Production.md index 8891a8088..11c6d9bec 100644 --- a/docs/dev/Production.md +++ b/docs/dev/Production.md @@ -185,11 +185,11 @@ attaching to the FMTM containers: export GIT_BRANCH=development # Shut down the running database & delete the data -docker compose -f docker-compose.$GIT_BRANCH.yml down -v +docker compose -f compose.$GIT_BRANCH.yaml down -v # First, ensure you have a suitable .env with database vars # Start the databases only -docker compose -f docker-compose.$GIT_BRANCH.yml up -d fmtm-db central-db +docker compose -f compose.$GIT_BRANCH.yaml up -d fmtm-db central-db # (Optional) restore odk central from the backup backup_filename=fmtm-central-db-${GIT_BRANCH}-XXXX-XX-XX-sql.gz @@ -208,7 +208,7 @@ fmtm-${GIT_BRANCH}-fmtm-db-1 \ pg_restore --verbose -U fmtm -d fmtm # Run the entire docker compose stack -docker compose -f docker-compose.$GIT_BRANCH.yml up -d +docker compose -f compose.$GIT_BRANCH.yaml up -d ``` ## Help! FMTM Prod Is Broken 😨 diff --git a/scripts/misc/renew-certs-manual.sh b/scripts/misc/renew-certs-manual.sh index 6bf619537..971112211 100644 --- a/scripts/misc/renew-certs-manual.sh +++ b/scripts/misc/renew-certs-manual.sh @@ -35,7 +35,7 @@ if [[ -z $(docker ps -q -f "ancestor=ghcr.io/hotosm/fmtm/proxy:${BRANCH_NAME}") echo "No containers using the 'ghcr.io/hotosm/fmtm/proxy:${BRANCH_NAME}' image are running." echo "You must first start the containers using:" echo - echo "docker-compose -f docker-compose.${BRANCH_NAME}.yml up -d" + echo "docker-compose -f compose.${BRANCH_NAME}.yaml up -d" echo exit 1 fi From 0a5552a826bd471aac2e1037c120b72f5e742b6f Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 16:33:48 +0000 Subject: [PATCH 08/20] ci: re-enable image scanning on deploy, fix compose file ref --- .github/workflows/build_and_deploy.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 798e410b8..5a20fa6d0 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -39,8 +39,8 @@ jobs: with: context: src/backend build_target: prod - scan_image: False image_name: ghcr.io/${{ github.repository }}/backend + compose_file: "compose.yaml" frontend-build: uses: hotosm/gh-workflows/.github/workflows/image_build.yml@2.0.9 @@ -49,7 +49,6 @@ jobs: context: src dockerfile: Dockerfile.ui.prod build_target: prod - scan_image: False image_name: ghcr.io/${{ github.repository }}/frontend smoke-test-backend: From dc20d90b106383a7f718299eed26e6e241797880 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 16:38:38 +0000 Subject: [PATCH 09/20] build: fix entity property add migration, http 400 handling --- .../migrations/add-submission-id-property.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/backend/migrations/add-submission-id-property.py b/src/backend/migrations/add-submission-id-property.py index a7083df50..fe161f610 100644 --- a/src/backend/migrations/add-submission-id-property.py +++ b/src/backend/migrations/add-submission-id-property.py @@ -64,18 +64,19 @@ async def add_submission_id(): project["odk_creds"] = get_odk_creds(project) print(f"\n------- Project {project['id']} -------\n") - async with central_deps.get_odk_dataset( - project["odk_creds"] - ) as odk_central: - try: + try: + async with central_deps.get_odk_dataset( + project["odk_creds"] + ) as odk_central: await odk_central.createDatasetProperty( project["odkid"], "submission_ids", ) - except Exception as e: - print(f"Failed updating project ({project['id']}): {e}") - print("If 409 conflict, it's likely the property already exists") - continue + except Exception as e: + print(f"Failed updating project ({project['id']}): {e}") + print("If 409 conflict, it's likely the property already exists") + print("If 400 conflict, the project odk credentials may be incorrect") + continue # Sleep 0.5 second between sleep(0.5) From dcc56403cf3de3fadfd0a6a5a20f3e8bb26ecf36 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 16:55:38 +0000 Subject: [PATCH 10/20] ci: add compose_file to relevant compose_test workflows --- .github/workflows/build_and_deploy.yml | 2 +- .github/workflows/pr_test_backend.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 5a20fa6d0..2a68df6c4 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -22,6 +22,7 @@ jobs: image_name: ghcr.io/${{ github.repository }}/backend build_context: src/backend pre_command: docker compose up -d proxy && docker compose exec api /app-entrypoint.sh + compose_file: "compose.yaml" compose_service: api compose_command: pytest tag_override: ci-${{ github.ref_name }} @@ -40,7 +41,6 @@ jobs: context: src/backend build_target: prod image_name: ghcr.io/${{ github.repository }}/backend - compose_file: "compose.yaml" frontend-build: uses: hotosm/gh-workflows/.github/workflows/image_build.yml@2.0.9 diff --git a/.github/workflows/pr_test_backend.yml b/.github/workflows/pr_test_backend.yml index 7746bff6e..8dcc00935 100644 --- a/.github/workflows/pr_test_backend.yml +++ b/.github/workflows/pr_test_backend.yml @@ -19,6 +19,7 @@ jobs: image_name: ghcr.io/${{ github.repository }}/backend build_context: src/backend pre_command: docker compose up -d proxy && docker compose exec api /app-entrypoint.sh + compose_file: "compose.yaml" compose_service: api compose_command: pytest cache_extra_imgs: | From cc59556d1dce9a95a3c916c58c46614101d3dcf2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 16:59:00 +0000 Subject: [PATCH 11/20] docs: add casdal as a contributor for code (#2131) * docs: update README.md * docs: update .all-contributorsrc * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .all-contributorsrc | 7 +++++++ README.md | 1 + 2 files changed, 8 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a0000687c..9fc2477d0 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -267,6 +267,13 @@ "avatar_url": "https://avatars.githubusercontent.com/u/43112525?v=4", "profile": "https://github.com/Seckrel", "contributions": ["code"] + }, + { + "login": "casdal", + "name": "casdal", + "avatar_url": "https://avatars.githubusercontent.com/u/141283367?v=4", + "profile": "https://github.com/casdal", + "contributions": ["code"] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index b5f27c5f3..577853138 100644 --- a/README.md +++ b/README.md @@ -202,6 +202,7 @@ Thanks goes to these wonderful people: Sijan Dhungana
Sijan Dhungana

💻 Khushi Gautam
Khushi Gautam

📖 Aayam Ojha
Aayam Ojha

💻 + casdal
casdal

💻 From c83335cb8f3eabb1ffa152d8c710a258a2100092 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 16:59:47 +0000 Subject: [PATCH 12/20] docs: add DanielJDufour as a contributor for ideas, and code (#2132) * docs: update README.md * docs: update .all-contributorsrc --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 164 +++++++++++++++++++++++++++++++++++--------- README.md | 3 + 2 files changed, 134 insertions(+), 33 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9fc2477d0..92e941287 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -3,7 +3,9 @@ "projectOwner": "hotosm", "repoType": "github", "repoHost": "https://github.com", - "files": ["README.md"], + "files": [ + "README.md" + ], "imageSize": 100, "badgeTemplate": "[![All Contributors](https://img.shields.io/badge/HOTOSM-Thanks%20for%20contributing!-red/github/all-contributors/hotosm/FMTM?color=red&style=flat-square)](#contributors)", "commit": true, @@ -14,14 +16,25 @@ "name": "Ivan Gayton", "avatar_url": "https://avatars.githubusercontent.com/u/5991943?v=4", "profile": "http://ivangayton.net", - "contributions": ["projectManagement", "code", "review", "ideas"] + "contributions": [ + "projectManagement", + "code", + "review", + "ideas" + ] }, { "login": "robsavoye", "name": "Rob Savoye", "avatar_url": "https://avatars.githubusercontent.com/u/71342768?v=4", "profile": "https://github.com/robsavoye", - "contributions": ["maintenance", "mentoring", "code", "review", "ideas"] + "contributions": [ + "maintenance", + "mentoring", + "code", + "review", + "ideas" + ] }, { "login": "ramyaragupathy", @@ -56,7 +69,12 @@ "name": "Susmina_Manandhar", "avatar_url": "https://avatars.githubusercontent.com/u/108750444?v=4", "profile": "https://github.com/susmina94", - "contributions": ["doc", "ideas", "bug", "mentoring"] + "contributions": [ + "doc", + "ideas", + "bug", + "mentoring" + ] }, { "login": "manjitapandey", @@ -77,203 +95,283 @@ "name": "Sujan Adhikari", "avatar_url": "https://avatars.githubusercontent.com/u/109404840?v=4", "profile": "https://github.com/Sujanadh", - "contributions": ["code", "maintenance"] + "contributions": [ + "code", + "maintenance" + ] }, { "login": "NSUWAL123", "name": "Nishit Suwal", "avatar_url": "https://avatars.githubusercontent.com/u/81785002?v=4", "profile": "https://github.com/NSUWAL123", - "contributions": ["code", "maintenance"] + "contributions": [ + "code", + "maintenance" + ] }, { "login": "varun2948", "name": "Deepak Pradhan (Varun)", "avatar_url": "https://avatars.githubusercontent.com/u/37866666?v=4", "profile": "https://github.com/varun2948", - "contributions": ["code", "ideas", "maintenance"] + "contributions": [ + "code", + "ideas", + "maintenance" + ] }, { "login": "nrjadkry", "name": "Niraj Adhikari", "avatar_url": "https://avatars.githubusercontent.com/u/41701707?v=4", "profile": "https://github.com/nrjadkry", - "contributions": ["code", "ideas", "maintenance"] + "contributions": [ + "code", + "ideas", + "maintenance" + ] }, { "login": "krtonga", "name": "krtonga", "avatar_url": "https://avatars.githubusercontent.com/u/7307817?v=4", "profile": "https://github.com/krtonga", - "contributions": ["code", "doc", "tool", "ideas"] + "contributions": [ + "code", + "doc", + "tool", + "ideas" + ] }, { "login": "petya-kangalova", "name": "Petya ", "avatar_url": "https://avatars.githubusercontent.com/u/98902727?v=4", "profile": "https://www.hotosm.org/people/petya-kangalova/", - "contributions": ["doc", "eventOrganizing", "ideas"] + "contributions": [ + "doc", + "eventOrganizing", + "ideas" + ] }, { "login": "Mudi-business", "name": "Mohamed Bakari Mohamed", "avatar_url": "https://avatars.githubusercontent.com/u/52991565?v=4", "profile": "http://zanrevenue.org", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "biomassives", "name": "G. Willson", "avatar_url": "https://avatars.githubusercontent.com/u/4379874?v=4", "profile": "https://www.scdhub.org", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "JoltCode", "name": "JoltCode", "avatar_url": "https://avatars.githubusercontent.com/u/46378904?v=4", "profile": "https://github.com/JoltCode", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "neelimagoogly", "name": "Neelima Mohanty", "avatar_url": "https://avatars.githubusercontent.com/u/97789856?v=4", "profile": "https://github.com/neelimagoogly", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Ndacyayisenga-droid", "name": "Tayebwa Noah", "avatar_url": "https://avatars.githubusercontent.com/u/58124613?v=4", "profile": "https://github.com/Ndacyayisenga-droid", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "mohammadareeb95", "name": "Mohammad Areeb", "avatar_url": "https://avatars.githubusercontent.com/u/77102111?v=4", "profile": "https://github.com/mohammadareeb95", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "AugustHottie", "name": "AugustHottie", "avatar_url": "https://avatars.githubusercontent.com/u/96122635?v=4", "profile": "https://github.com/AugustHottie", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Balofire", "name": "Ahmeed Etti-Balogun", "avatar_url": "https://avatars.githubusercontent.com/u/102294666?v=4", "profile": "https://github.com/Balofire", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Roseford", "name": "Uju", "avatar_url": "https://avatars.githubusercontent.com/u/75838716?v=4", "profile": "https://github.com/Roseford", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "cordovez", "name": "JC CorMan", "avatar_url": "https://avatars.githubusercontent.com/u/75356640?v=4", "profile": "https://www.el-cordovez.com", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Prajwalism", "name": "Prajwal Khadgi", "avatar_url": "https://avatars.githubusercontent.com/u/123072058?v=4", "profile": "https://github.com/Prajwalism", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "shushila21", "name": "shushila21", "avatar_url": "https://avatars.githubusercontent.com/u/77854807?v=4", "profile": "https://github.com/shushila21", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "kshitijrajsharma", "name": "Kshitij Raj Sharma", "avatar_url": "https://avatars.githubusercontent.com/u/36752999?v=4", "profile": "https://github.com/kshitijrajsharma", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "mahesh-naxa", "name": "Mahesh-wor 'Invoron'", "avatar_url": "https://avatars.githubusercontent.com/u/72002075?v=4", "profile": "https://github.com/mahesh-naxa", - "contributions": ["infra"] + "contributions": [ + "infra" + ] }, { "login": "azharcodeit", "name": "Azhar Ismagulova", "avatar_url": "https://avatars.githubusercontent.com/u/31756707?v=4", "profile": "https://github.com/azharcodeit", - "contributions": ["code", "test"] + "contributions": [ + "code", + "test" + ] }, { "login": "synneolsen", "name": "synneolsen", "avatar_url": "https://avatars.githubusercontent.com/u/107098623?v=4", "profile": "https://github.com/synneolsen", - "contributions": ["ideas"] + "contributions": [ + "ideas" + ] }, { "login": "Freedisch", "name": "Freedisch", "avatar_url": "https://avatars.githubusercontent.com/u/82499435?v=4", "profile": "https://github.com/Freedisch", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "prasidha1", "name": "prasidha1", "avatar_url": "https://avatars.githubusercontent.com/u/32433336?v=4", "profile": "https://github.com/prasidha1", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "iamrajbhattarai", "name": "Raj Bhattarai", "avatar_url": "https://avatars.githubusercontent.com/u/75742784?v=4", "profile": "https://github.com/iamrajbhattarai", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "sijandh35", "name": "Sijan Dhungana", "avatar_url": "https://avatars.githubusercontent.com/u/29759582?v=4", "profile": "https://github.com/sijandh35", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "khushishikhu", "name": "Khushi Gautam", "avatar_url": "https://avatars.githubusercontent.com/u/65439761?v=4", "profile": "https://github.com/khushishikhu", - "contributions": ["doc"] + "contributions": [ + "doc" + ] }, { "login": "Seckrel", "name": "Aayam Ojha", "avatar_url": "https://avatars.githubusercontent.com/u/43112525?v=4", "profile": "https://github.com/Seckrel", - "contributions": ["code"] + "contributions": [ + "code" + ] }, { "login": "casdal", "name": "casdal", "avatar_url": "https://avatars.githubusercontent.com/u/141283367?v=4", "profile": "https://github.com/casdal", - "contributions": ["code"] + "contributions": [ + "code" + ] + }, + { + "login": "DanielJDufour", + "name": "Daniel J. Dufour", + "avatar_url": "https://avatars.githubusercontent.com/u/4313463?v=4", + "profile": "http://danieljdufour.com", + "contributions": [ + "ideas", + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 577853138..0c1666976 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,9 @@ Thanks goes to these wonderful people: Aayam Ojha
Aayam Ojha

💻 casdal
casdal

💻 + + Daniel J. Dufour
Daniel J. Dufour

🤔 💻 + From 58b384f37580de7500276d85f7a91c0a57499c66 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 17:27:23 +0000 Subject: [PATCH 13/20] docs: move all deployment compose files under /deploy/x for clarity --- .../compose.development.yaml | 0 compose.main.yaml => deploy/compose.main.yaml | 0 .../compose.staging.yaml | 22 +++++++++---------- 3 files changed, 11 insertions(+), 11 deletions(-) rename compose.development.yaml => deploy/compose.development.yaml (100%) rename compose.main.yaml => deploy/compose.main.yaml (100%) rename compose.staging.yaml => deploy/compose.staging.yaml (83%) diff --git a/compose.development.yaml b/deploy/compose.development.yaml similarity index 100% rename from compose.development.yaml rename to deploy/compose.development.yaml diff --git a/compose.main.yaml b/deploy/compose.main.yaml similarity index 100% rename from compose.main.yaml rename to deploy/compose.main.yaml diff --git a/compose.staging.yaml b/deploy/compose.staging.yaml similarity index 83% rename from compose.staging.yaml rename to deploy/compose.staging.yaml index dc78b5d5d..d2b7c6f61 100644 --- a/compose.staging.yaml +++ b/deploy/compose.staging.yaml @@ -46,43 +46,43 @@ networks: services: proxy: extends: - file: compose.development.yaml + file: deploy/compose.development.yaml service: proxy api: extends: - file: compose.development.yaml + file: deploy/compose.development.yaml service: api ui: extends: - file: compose.development.yaml + file: deploy/compose.development.yaml service: ui central: extends: - file: compose.development.yaml + file: deploy/compose.development.yaml service: central central-ui: extends: - file: compose.development.yaml + file: deploy/compose.development.yaml service: central-ui s3: extends: - file: compose.development.yaml + file: deploy/compose.development.yaml service: s3 fmtm-db: extends: - file: compose.development.yaml + file: deploy/compose.development.yaml service: fmtm-db electric: extends: - file: compose.development.yaml + file: deploy/compose.development.yaml service: electric central-db: extends: - file: compose.development.yaml + file: deploy/compose.development.yaml service: central-db migrations: extends: - file: compose.development.yaml + file: deploy/compose.development.yaml service: migrations backups: image: "ghcr.io/hotosm/fmtm/backend:${GIT_BRANCH}" @@ -107,6 +107,6 @@ services: retries: 3 certbot: extends: - file: compose.development.yaml + file: deploy/compose.development.yaml service: certbot image: "ghcr.io/hotosm/fmtm/proxy:certs-init-staging" From 484465f9a3196942ad1ba9c5cba174b89d9c4251 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 17:27:52 +0000 Subject: [PATCH 14/20] docs: update all refs to newly moved compose deploy files --- .github/workflows/build_and_deploy.yml | 2 +- INSTALL.md | 16 ++++++++-------- deploy/README.md | 8 ++++++++ docs/dev/Production.md | 6 +++--- scripts/misc/renew-certs-manual.sh | 2 +- 5 files changed, 21 insertions(+), 13 deletions(-) create mode 100644 deploy/README.md diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 2a68df6c4..fc0718971 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -156,5 +156,5 @@ jobs: uses: hotosm/gh-workflows/.github/workflows/remote_deploy_compose.yml@2.0.9 with: environment: ${{ github.ref_name }} - docker_compose_file: "compose.${{ github.ref_name }}.yaml" + docker_compose_file: "deploy/compose.${{ github.ref_name }}.yaml" secrets: inherit diff --git a/INSTALL.md b/INSTALL.md index f51cde190..0fe3deb74 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -155,25 +155,25 @@ local test - used during development, or to start a test version The corresponding docker-compose files are: ```text -main - compose.main.yaml -staging - compose.staging.yaml -development - compose.development.yaml +main - deploy/compose.main.yaml +staging - deploy/compose.staging.yaml +development - deploy/compose.development.yaml local test - compose.yaml ``` Set your selection to a terminal variable to make the next step easier: ```bash -export GIT_BRANCH={your_selection} +export COMPOSE_FILE={your_selection} # E.g. -export GIT_BRANCH=development +export COMPOSE_FILE=deploy/compose.development.yaml ``` #### Pull the Images ```bash -docker compose -f "compose.${GIT_BRANCH}.yaml" pull +docker compose -f "${COMPOSE_FILE}" pull ``` > This will pull the latest containers for the branch you selected. @@ -185,13 +185,13 @@ Before we can run, you need to build your version of the frontend. This is because the frontend contains variable specific to your deployment. ```bash -docker compose -f "compose.${GIT_BRANCH}.yaml" build ui +docker compose -f "${COMPOSE_FILE}" build ui ``` #### Start the Containers ```bash -docker compose -f "compose.${GIT_BRANCH}.yaml" up -d +docker compose -f "${COMPOSE_FILE}" up -d ``` You should see the containers start up in order. diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 000000000..5251f4471 --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,8 @@ +# Deployment Config + +These files are used for the continuous deployment at HOT, +onto servers: + +- **development** --> `compose.development.yaml` --> dev server. +- **staging** --> `compose.staging.yaml` --> stage server. +- **main** --> `compose.main.yaml` --> prod server. diff --git a/docs/dev/Production.md b/docs/dev/Production.md index 11c6d9bec..b565e1c2f 100644 --- a/docs/dev/Production.md +++ b/docs/dev/Production.md @@ -185,11 +185,11 @@ attaching to the FMTM containers: export GIT_BRANCH=development # Shut down the running database & delete the data -docker compose -f compose.$GIT_BRANCH.yaml down -v +docker compose -f deploy/compose.$GIT_BRANCH.yaml down -v # First, ensure you have a suitable .env with database vars # Start the databases only -docker compose -f compose.$GIT_BRANCH.yaml up -d fmtm-db central-db +docker compose -f deploy/compose.$GIT_BRANCH.yaml up -d fmtm-db central-db # (Optional) restore odk central from the backup backup_filename=fmtm-central-db-${GIT_BRANCH}-XXXX-XX-XX-sql.gz @@ -208,7 +208,7 @@ fmtm-${GIT_BRANCH}-fmtm-db-1 \ pg_restore --verbose -U fmtm -d fmtm # Run the entire docker compose stack -docker compose -f compose.$GIT_BRANCH.yaml up -d +docker compose -f deploy/compose.$GIT_BRANCH.yaml up -d ``` ## Help! FMTM Prod Is Broken 😨 diff --git a/scripts/misc/renew-certs-manual.sh b/scripts/misc/renew-certs-manual.sh index 971112211..32ff50c7a 100644 --- a/scripts/misc/renew-certs-manual.sh +++ b/scripts/misc/renew-certs-manual.sh @@ -35,7 +35,7 @@ if [[ -z $(docker ps -q -f "ancestor=ghcr.io/hotosm/fmtm/proxy:${BRANCH_NAME}") echo "No containers using the 'ghcr.io/hotosm/fmtm/proxy:${BRANCH_NAME}' image are running." echo "You must first start the containers using:" echo - echo "docker-compose -f compose.${BRANCH_NAME}.yaml up -d" + echo "docker-compose -f deploy/compose.${BRANCH_NAME}.yaml up -d" echo exit 1 fi From 1ee8e1c427949d637c6840c2e5f60419e2945786 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 17:35:51 +0000 Subject: [PATCH 15/20] build: upgrade pyxform-http version used on dev an stage deploy --- deploy/compose.development.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/compose.development.yaml b/deploy/compose.development.yaml index 46dd1274c..1f63a0240 100644 --- a/deploy/compose.development.yaml +++ b/deploy/compose.development.yaml @@ -160,7 +160,7 @@ services: restart: "unless-stopped" pyxform: - image: "ghcr.io/getodk/pyxform-http:v2.0.2" + image: "ghcr.io/getodk/pyxform-http:v3.0.0" depends_on: central-db: condition: service_healthy From 4ed1ceaa24c081cc9678b622af331cac63affeca Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 17:55:06 +0000 Subject: [PATCH 16/20] build: add central-webhook service to env vars and dev/stage deploy --- .env.example | 1 + compose.yaml | 2 +- deploy/compose.development.yaml | 15 +++++++++++++++ deploy/compose.staging.yaml | 4 ++++ scripts/1-environment/gen-env.sh | 4 ++++ src/backend/app/config.py | 1 + .../app/organisations/organisation_crud.py | 4 ++-- 7 files changed, 28 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index b1a81d575..86b412a19 100644 --- a/.env.example +++ b/.env.example @@ -2,6 +2,7 @@ ODK_CENTRAL_URL=${ODK_CENTRAL_URL:-"https://proxy"} ODK_CENTRAL_USER=${ODK_CENTRAL_USER:-"admin@hotosm.org"} ODK_CENTRAL_PASSWD=${ODK_CENTRAL_PASSWD:-"Password1234"} +CENTRAL_WEBHOOK_API_KEY=${CENTRAL_WEBHOOK_API_KEY} ### FMTM ### DEBUG=${DEBUG:-False} diff --git a/compose.yaml b/compose.yaml index b165b11d0..092d2e583 100644 --- a/compose.yaml +++ b/compose.yaml @@ -226,7 +226,7 @@ services: central-webhook: profiles: ["", "central"] - image: "ghcr.io/hotosm/central-webhook:${ODK_WEBHOOK_VERSION:-0.1.0-rc}" + image: "ghcr.io/hotosm/central-webhook:${ODK_WEBHOOK_TAG:-0.1.0-rc}" depends_on: central-db: condition: service_healthy diff --git a/deploy/compose.development.yaml b/deploy/compose.development.yaml index 1f63a0240..7e361c1c1 100644 --- a/deploy/compose.development.yaml +++ b/deploy/compose.development.yaml @@ -159,6 +159,21 @@ services: - fmtm-net restart: "unless-stopped" + central-webhook: + image: "ghcr.io/hotosm/central-webhook:${ODK_WEBHOOK_TAG:-0.1.0-rc}" + depends_on: + central-db: + condition: service_healthy + environment: + CENTRAL_WEBHOOK_DB_URI: postgresql://${CENTRAL_DB_USER}:${CENTRAL_DB_USER}@central-db:5432/${CENTRAL_DB_NAME}?sslmode=disable + CENTRAL_WEBHOOK_UPDATE_ENTITY_URL: http://api:8000/integrations/webhooks/entity-status + # CENTRAL_WEBHOOK_REVIEW_SUBMISSION_URL: http://api:8000/integrations/webhooks/entity-status + CENTRAL_WEBHOOK_API_KEY: ${CENTRAL_WEBHOOK_API_KEY} + CENTRAL_WEBHOOK_LOG_LEVEL: ${CENTRAL_WEBHOOK_LOG_LEVEL:-INFO} + networks: + - fmtm-net + restart: "unless-stopped" + pyxform: image: "ghcr.io/getodk/pyxform-http:v3.0.0" depends_on: diff --git a/deploy/compose.staging.yaml b/deploy/compose.staging.yaml index d2b7c6f61..0ab8223e6 100644 --- a/deploy/compose.staging.yaml +++ b/deploy/compose.staging.yaml @@ -60,6 +60,10 @@ services: extends: file: deploy/compose.development.yaml service: central + central-webhook: + extends: + file: deploy/compose.development.yaml + service: central-webhook central-ui: extends: file: deploy/compose.development.yaml diff --git a/scripts/1-environment/gen-env.sh b/scripts/1-environment/gen-env.sh index dbc3d09f8..2d58f73a6 100644 --- a/scripts/1-environment/gen-env.sh +++ b/scripts/1-environment/gen-env.sh @@ -172,6 +172,10 @@ set_odk_user_creds() { echo fi done + + # Set an API key for the webhook + api_key=$(head -c 32 /dev/urandom | base64 | tr -d '=+/') + export CENTRAL_WEBHOOK_API_KEY="${api_key}" } check_external_database() { diff --git a/src/backend/app/config.py b/src/backend/app/config.py index 5b2e6500b..f0364f168 100644 --- a/src/backend/app/config.py +++ b/src/backend/app/config.py @@ -232,6 +232,7 @@ def assemble_db_connection(cls, v: Optional[str], info: ValidationInfo) -> Any: ODK_CENTRAL_URL: Optional[HttpUrlStr] = "" ODK_CENTRAL_USER: Optional[str] = "" ODK_CENTRAL_PASSWD: Optional[SecretStr] = "" + CENTRAL_WEBHOOK_API_KEY: Optional[SecretStr] = "" OSM_CLIENT_ID: str OSM_CLIENT_SECRET: SecretStr diff --git a/src/backend/app/organisations/organisation_crud.py b/src/backend/app/organisations/organisation_crud.py index 84ef02495..992290d63 100644 --- a/src/backend/app/organisations/organisation_crud.py +++ b/src/backend/app/organisations/organisation_crud.py @@ -58,8 +58,8 @@ async def init_admin_org(db: Connection) -> None: name="FMTM Service Account", email_address=settings.ODK_CENTRAL_USER, is_email_verified=True, - # We set a dummy API key for svc user in development - api_key="qnyE7ev7OWsfMAaX2fm-PuWYnkAUJw2xlyp72FKCH3Q" if settings.DEBUG else "", + # This API key is used for the Central Webhook service + api_key=settings.CENTRAL_WEBHOOK_API_KEY, ) await DbUser.create(db, svc_user, ignore_conflict=True) From 75ca3db22f67133a0419aed5ca721e70d42af516 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 17:56:07 +0000 Subject: [PATCH 17/20] build: remove /deploy from staging compose, as it's relative --- deploy/compose.staging.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/deploy/compose.staging.yaml b/deploy/compose.staging.yaml index 0ab8223e6..125e9abcb 100644 --- a/deploy/compose.staging.yaml +++ b/deploy/compose.staging.yaml @@ -46,47 +46,47 @@ networks: services: proxy: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: proxy api: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: api ui: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: ui central: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: central central-webhook: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: central-webhook central-ui: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: central-ui s3: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: s3 fmtm-db: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: fmtm-db electric: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: electric central-db: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: central-db migrations: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: migrations backups: image: "ghcr.io/hotosm/fmtm/backend:${GIT_BRANCH}" @@ -111,6 +111,6 @@ services: retries: 3 certbot: extends: - file: deploy/compose.development.yaml + file: compose.development.yaml service: certbot image: "ghcr.io/hotosm/fmtm/proxy:certs-init-staging" From 025b6e7c0f42d33bf2fb8c154a187aa69a807afd Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 18:07:06 +0000 Subject: [PATCH 18/20] build: add symlink to repo root .env file from /deploy dir --- deploy/.env | 1 + 1 file changed, 1 insertion(+) create mode 120000 deploy/.env diff --git a/deploy/.env b/deploy/.env new file mode 120000 index 000000000..4a82335f5 --- /dev/null +++ b/deploy/.env @@ -0,0 +1 @@ +../.env \ No newline at end of file From fb591b583ce4159f121c8d8233392948ebf677f4 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 18:23:33 +0000 Subject: [PATCH 19/20] fix(backend): getting secret value from CENTRAL_WEBHOOK_API_KEY config var --- src/backend/app/organisations/organisation_crud.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/backend/app/organisations/organisation_crud.py b/src/backend/app/organisations/organisation_crud.py index 992290d63..a8f12da27 100644 --- a/src/backend/app/organisations/organisation_crud.py +++ b/src/backend/app/organisations/organisation_crud.py @@ -59,7 +59,9 @@ async def init_admin_org(db: Connection) -> None: email_address=settings.ODK_CENTRAL_USER, is_email_verified=True, # This API key is used for the Central Webhook service - api_key=settings.CENTRAL_WEBHOOK_API_KEY, + api_key=settings.CENTRAL_WEBHOOK_API_KEY.get_secret_value() + if settings.CENTRAL_WEBHOOK_API_KEY + else None, ) await DbUser.create(db, svc_user, ignore_conflict=True) From 77c59120fef80d8d854ab0982a403324611b2598 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 30 Jan 2025 18:43:20 +0000 Subject: [PATCH 20/20] build: fix central webhook deploy odk password on dev --- deploy/compose.development.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/compose.development.yaml b/deploy/compose.development.yaml index 7e361c1c1..cc041f47f 100644 --- a/deploy/compose.development.yaml +++ b/deploy/compose.development.yaml @@ -165,7 +165,7 @@ services: central-db: condition: service_healthy environment: - CENTRAL_WEBHOOK_DB_URI: postgresql://${CENTRAL_DB_USER}:${CENTRAL_DB_USER}@central-db:5432/${CENTRAL_DB_NAME}?sslmode=disable + CENTRAL_WEBHOOK_DB_URI: postgresql://${CENTRAL_DB_USER}:${CENTRAL_DB_PASSWORD}@central-db:5432/${CENTRAL_DB_NAME}?sslmode=disable CENTRAL_WEBHOOK_UPDATE_ENTITY_URL: http://api:8000/integrations/webhooks/entity-status # CENTRAL_WEBHOOK_REVIEW_SUBMISSION_URL: http://api:8000/integrations/webhooks/entity-status CENTRAL_WEBHOOK_API_KEY: ${CENTRAL_WEBHOOK_API_KEY}