From e29aab0b9d6e21f6ff3ce8ba7fc551f5f7827057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Sat, 20 Sep 2025 10:32:04 +0200 Subject: [PATCH 01/17] Add tags to model --- helpers/database.go | 2 ++ models/tags.go | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 models/tags.go diff --git a/helpers/database.go b/helpers/database.go index 00ed2f8..4da0fd6 100644 --- a/helpers/database.go +++ b/helpers/database.go @@ -56,6 +56,8 @@ func GetDatabase() (*gorm.DB, error) { &models.ListItem{}, &models.Field{}, &models.FieldValue{}, + &models.Tag{}, + &models.PersonTag{}, ) if err != nil { return database, err diff --git a/models/tags.go b/models/tags.go new file mode 100644 index 0000000..b40f592 --- /dev/null +++ b/models/tags.go @@ -0,0 +1,17 @@ +package models + +import "gorm.io/gorm" + +type Tag struct { + gorm.Model + Name string + Color string +} + +type PersonTag struct { + gorm.Model + PersonID uint + Person Person + TagID uint + Tag Tag +} From b619874a81abe7a8ae25920a5860e5017c919085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Fri, 6 Mar 2026 18:26:47 +0100 Subject: [PATCH 02/17] Docker compose: pin postgres version --- compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose.yml b/compose.yml index b1e57b0..134de7d 100644 --- a/compose.yml +++ b/compose.yml @@ -1,6 +1,6 @@ services: postgres: - image: postgres:latest + image: postgres:17 container_name: camarades-postgres ports: - "127.0.0.1:5432:5432" From 96783b491225ef2fbff538b171474301d488f881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Fri, 6 Mar 2026 20:15:25 +0100 Subject: [PATCH 03/17] Update PNPM libs --- package.json | 8 +- pnpm-lock.yaml | 1463 ++++++++++++++++++++++++------------------------ 2 files changed, 734 insertions(+), 737 deletions(-) diff --git a/package.json b/package.json index 6a737f0..0b8e667 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,9 @@ "url": "https://git.readonly.ch/bouzoure/pop-camarades" }, "devDependencies": { - "@parcel/transformer-sass": "2.15.4", - "parcel": "^2.15.4", - "prettier": "^3.6.2", + "@parcel/transformer-sass": "^2.16.4", + "parcel": "^2.16.4", + "prettier": "^3.8.1", "prettier-plugin-jinja-template": "^2.1.0" }, "source": "frontend/index.js", @@ -32,7 +32,7 @@ "build": "go build" }, "dependencies": { - "bootstrap": "^5.3.7", + "bootstrap": "^5.3.8", "bootstrap-icons": "^1.13.1", "jquery": "^3.7.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f72a68d..a1aff4c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: bootstrap: - specifier: ^5.3.7 - version: 5.3.7(@popperjs/core@2.11.8) + specifier: ^5.3.8 + version: 5.3.8(@popperjs/core@2.11.8) bootstrap-icons: specifier: ^1.13.1 version: 1.13.1 @@ -19,25 +19,25 @@ importers: version: 3.7.1 devDependencies: '@parcel/transformer-sass': - specifier: 2.15.4 - version: 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + specifier: ^2.16.4 + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) parcel: - specifier: ^2.15.4 - version: 2.15.4(@swc/helpers@0.5.17) + specifier: ^2.16.4 + version: 2.16.4(@swc/helpers@0.5.19) prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.8.1 + version: 3.8.1 prettier-plugin-jinja-template: specifier: ^2.1.0 - version: 2.1.0(prettier@3.6.2) + version: 2.1.0(prettier@3.8.1) packages: - '@lezer/common@1.2.3': - resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + '@lezer/common@1.5.1': + resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==} - '@lezer/lr@1.4.2': - resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + '@lezer/lr@1.4.8': + resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} '@lmdb/lmdb-darwin-arm64@2.8.5': resolution: {integrity: sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==} @@ -103,217 +103,221 @@ packages: cpu: [x64] os: [win32] - '@parcel/bundler-default@2.15.4': - resolution: {integrity: sha512-4vkaZuwGqL8L7NqEgjRznz9/QoeVKk0Z6z2nzfpdnSWA4xX3moUj+JeoqGUbyFGuPzfCma4SA4+txnQbKu0edQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/bundler-default@2.16.4': + resolution: {integrity: sha512-Nb8peNvhfm1+660CLwssWh4weY+Mv6vEGS6GPKqzJmTMw50udi0eS1YuWFzvmhSiu1KsYcUD37mqQ1LuIDtWoA==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/cache@2.15.4': - resolution: {integrity: sha512-x/QgMuVvXQV6uNhIF+6kz6SzhVVkwf6WPSVG/xQvGMEiBabForDVYIhIEuN3RzUXCU352CGM6d8TtLLg61W1fw==} + '@parcel/cache@2.16.4': + resolution: {integrity: sha512-+uCyeElSga2MBbmbXpIj/WVKH7TByCrKaxtHbelfKKIJpYMgEHVjO4cuc7GUfTrUAmRUS8ZGvnX7Etgq6/jQhw==} engines: {node: '>= 16.0.0'} peerDependencies: - '@parcel/core': ^2.15.4 + '@parcel/core': ^2.16.4 - '@parcel/codeframe@2.15.4': - resolution: {integrity: sha512-ErAPEQaJIpB+ocNZ3rl8AEK6piA7JBInwZLNU0eHMthm01Ssb10JkpAadyn1w9IVfCey+kqQcEeWv47Yh6mL1Q==} + '@parcel/codeframe@2.16.4': + resolution: {integrity: sha512-s64aMfOJoPrXhKH+Y98ahX0O8aXWvTR+uNlOaX4yFkpr4FFDnviLcGngDe/Yo4Qq2FJZ0P6dNswbJTUH9EGxkQ==} engines: {node: '>= 16.0.0'} - '@parcel/compressor-raw@2.15.4': - resolution: {integrity: sha512-gECePZxVXBwyo0DYbAq4V4SimVzHaJ3p8QOgFIfOqNmlEBbhLf3QSjArFPJNKiHZaJuclh4a+IShFBN+u6tXXw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/compressor-raw@2.16.4': + resolution: {integrity: sha512-IK8IpNhw61B2HKgA1JhGhO9y+ZJFRZNTEmvhN1NdLdPqvgEXm2EunT+m6D9z7xeoeT6XnUKqM0eRckEdD0OXbA==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/config-default@2.15.4': - resolution: {integrity: sha512-chUE4NpcSXpMfTcSmgl4Q78zH+ZFe0qdgZLBtF4EH2QQakW7wAXAYRxS2/P3xFkUj0/51sExhbCFWgulrlGDPw==} + '@parcel/config-default@2.16.4': + resolution: {integrity: sha512-kBxuTY/5trEVnvXk92l7LVkYjNuz3SaqWymFhPjEnc8GY4ZVdcWrWdXWTB9hUhpmRYJctFCyGvM0nN05JTiM2g==} peerDependencies: - '@parcel/core': ^2.15.4 + '@parcel/core': ^2.16.4 - '@parcel/core@2.15.4': - resolution: {integrity: sha512-+TXxTm58lFwXXObFAEclwKX1p1AdixcD+M7T4NeFIQzQ4F20Vr+6oybCSqW1exNA3uHqVDDFLx7TT78seVjvkg==} + '@parcel/core@2.16.4': + resolution: {integrity: sha512-a0CgrW5A5kwuSu5J1RFRoMQaMs9yagvfH2jJMYVw56+/7NRI4KOtu612SG9Y1ERWfY55ZwzyFxtLWvD6LO+Anw==} engines: {node: '>= 16.0.0'} - '@parcel/diagnostic@2.15.4': - resolution: {integrity: sha512-8MAqefwzBKceNN3364OLm+p4HRD7AfimfFW3MntLxPB6bnelc9UBg5c9zEm34zYEctbmky8gqYgAUSDjqYC5Hw==} + '@parcel/diagnostic@2.16.4': + resolution: {integrity: sha512-YN5CfX7lFd6yRLxyZT4Sj3sR6t7nnve4TdXSIqapXzQwL7Bw+sj79D95wTq2rCm3mzk5SofGxFAXul2/nG6gcQ==} engines: {node: '>= 16.0.0'} - '@parcel/error-overlay@2.15.4': - resolution: {integrity: sha512-xxeaWm8fV8Z4uGy/c09mOvmFSHBOgF1gCMQwLCwZvfMLqIWkdZaUQ2cRhWZIS6pOXaRVC7YpcXzk2DOiSUNSbQ==} + '@parcel/error-overlay@2.16.4': + resolution: {integrity: sha512-e8KYKnMsfmQnqIhsUWBUZAXlDK30wkxsAGle1tZ0gOdoplaIdVq/WjGPatHLf6igLM76c3tRn2vw8jZFput0jw==} engines: {node: '>= 16.0.0'} - '@parcel/events@2.15.4': - resolution: {integrity: sha512-SBq4zstaFr7XQaXNaQmUuVh1swCUHrhtPCOSofvkJoQGhjsuhQlh4t0NmUikyKNdj7C1j40xCS1kGHuUO29b0g==} + '@parcel/events@2.16.4': + resolution: {integrity: sha512-slWQkBRAA7o0cN0BLEd+yCckPmlVRVhBZn5Pn6ktm4EzEtrqoMzMeJOxxH8TXaRzrQDYnTcnYIHFgXWd4kkUfg==} engines: {node: '>= 16.0.0'} - '@parcel/feature-flags@2.15.4': - resolution: {integrity: sha512-DJqZVtbfjWJseM0gk7yyDkAuOhP7/FVwZ/YVqjozIqXBhmQm07xctiqNQyZX2vBbQsxmVbjpqyq+DOj45WPEzQ==} + '@parcel/feature-flags@2.16.4': + resolution: {integrity: sha512-nYdx53siKPLYikHHxfzgjzzgxdrjquK6DMnuSgOTyIdRG4VHdEN0+NqKijRLuVgiUFo/dtxc2h+amwqFENMw8w==} engines: {node: '>= 16.0.0'} - '@parcel/fs@2.15.4': - resolution: {integrity: sha512-5cahD2ByQaSi+YN0aDvrMWXZvs3mP7C5ey8zcDTDn7JxJa51sMqOQcdU3VUTzQFtAPeRM2KxUkxLhBBXgQqHZA==} + '@parcel/fs@2.16.4': + resolution: {integrity: sha512-maCMOiVn7oJYZlqlfxgLne8n6tSktIT1k0AeyBp4UGWCXyeJUJ+nL7QYShFpKNLtMLeF0cEtgwRAknWzbcDS1g==} engines: {node: '>= 16.0.0'} peerDependencies: - '@parcel/core': ^2.15.4 + '@parcel/core': ^2.16.4 - '@parcel/graph@3.5.4': - resolution: {integrity: sha512-uF7kyQXWK2fQZvG5eE0N3avYGLQE5Q0vyJsyypNcFW3kXNnrkZCUtbG7urmdae9mmZ2jXIVN4q4Bhd9pefGj9A==} + '@parcel/graph@3.6.4': + resolution: {integrity: sha512-Cj9yV+/k88kFhE+D+gz0YuNRpvNOCVDskO9pFqkcQhGbsGq6kg2XpZ9V7HlYraih31xf8Vb589bZOwjKIiHixQ==} engines: {node: '>= 16.0.0'} - '@parcel/logger@2.15.4': - resolution: {integrity: sha512-rQ7F5+FMQ7t+w5NGFRT8CWHhym0aunduufCjlafvRzUSKEN/5/nwTfCe9I5QsthGlXJWs+ZTy4zQ+wLtZQRBKQ==} + '@parcel/logger@2.16.4': + resolution: {integrity: sha512-QR8QLlKo7xAy9JBpPDAh0RvluaixqPCeyY7Fvo2K7hrU3r85vBNNi06pHiPbWoDmB4x1+QoFwMaGnJOHR+/fMA==} engines: {node: '>= 16.0.0'} - '@parcel/markdown-ansi@2.15.4': - resolution: {integrity: sha512-u5Lwcr4ZVBSLFbKYht+mJqJ3ZMXvJdmDMU5eDtrIEKPpu9LrIDdPpDEXBoyO6pDsoV/2AqyXUUMzBRyCatkkoQ==} + '@parcel/markdown-ansi@2.16.4': + resolution: {integrity: sha512-0+oQApAVF3wMcQ6d1ZfZ0JsRzaMUYj9e4U+naj6YEsFsFGOPp+pQYKXBf1bobQeeB7cPKPT3SUHxFqced722Hw==} engines: {node: '>= 16.0.0'} - '@parcel/namer-default@2.15.4': - resolution: {integrity: sha512-EXsoQ1S+5ZIfy8431E7F0vVS7bfH5JpZ+vFVcUpArJDkhmMG7T/eP6Kp9CXHLJmn7ki1x7iIVytrja0XXRQWBQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/namer-default@2.16.4': + resolution: {integrity: sha512-CE+0lFg881sJq575EXxj2lKUn81tsS5itpNUUErHxit195m3PExyAhoXM6ed/SXxwi+uv+T5FS/jjDLBNuUFDA==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/node-resolver-core@3.6.4': - resolution: {integrity: sha512-g3+usMnr7pfRqbMAksOpNA7GJk7HUNW1Wxx7Shhp4w0K9JUdVrd2LRKwZxbqL7H9NqWtVvUOT9cZbMlDR6bO1w==} + '@parcel/node-resolver-core@3.7.4': + resolution: {integrity: sha512-b3VDG+um6IWW5CTod6M9hQsTX5mdIelKmam7mzxzgqg4j5hnycgTWqPMc9UxhYoUY/Q/PHfWepccNcKtvP5JiA==} engines: {node: '>= 16.0.0'} - '@parcel/optimizer-css@2.15.4': - resolution: {integrity: sha512-KQLuqwcvVFTNFtM+bzfvQivwunmhVAngmR4NiI8zQaykidYH28V8YkVAQmpbLbgoGad/UgG7grb0UshvnrQHpw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/optimizer-css@2.16.4': + resolution: {integrity: sha512-aqdXCtmvpcXYgJFGk2DtXF34wuM2TD1fZorKMrJdKB9sSkWVRs1tq6RAXQrbi0ZPDH9wfE/9An3YdkTex7RHuQ==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/optimizer-html@2.15.4': - resolution: {integrity: sha512-gBvt6RdDVMyO1Flvdtc8DxpxLgIXhaKuVXEjHdAP7sEW0SMdSd6r/tl6Plmcszig7sDwhDf6IsQOIvbzGHYZZg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/optimizer-html@2.16.4': + resolution: {integrity: sha512-vg/R2uuSni+NYYUUV8m+5bz8p5zBv8wc/nNleoBnGuCDwn7uaUwTZ8Gt9CjZO8jjG0xCLILoc/TW+e2FF3pfgQ==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/optimizer-image@2.15.4': - resolution: {integrity: sha512-M8fo7eEL6JRcmLhSX9pUUGU4MPrPrE9cMNcwIt3DQLnSvQ+sshhUDa6t9hKWeHHhs16BHvxrvksN2TIbkgHODQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/optimizer-image@2.16.4': + resolution: {integrity: sha512-2RV54WnvMYr18lxSx7Zlx/DXpJwMzOiPxDnoFyvaUoYutvgHO6chtcgFgh1Bvw/PoI95vYzlTkZ8QfUOk5A0JA==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} peerDependencies: - '@parcel/core': ^2.15.4 + '@parcel/core': ^2.16.4 - '@parcel/optimizer-svg@2.15.4': - resolution: {integrity: sha512-pPdjRaLPqjAEROXIHLc6JWLLki56alhuUNbalhLqBCgktZrrq2dGCjBEVgxqRczc9D+ePCX/e/xci4tC0Tkcbg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/optimizer-svg@2.16.4': + resolution: {integrity: sha512-22+BqIffCrVErg8y2XwhasbTaFNn75OKXZ3KTDBIfOSAZKLUKs1iHfDXETzTRN7cVcS+Q36/6EHd7N/RA8i1fg==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/optimizer-swc@2.15.4': - resolution: {integrity: sha512-2m5cYESVCq6AGx252eSTArZ1Oc1Ve4GBGL7NhvgbNqOthyXlc2qAed6rCkARrBd8pfEl5+2XHeK1ijDAZdIZ/A==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/optimizer-swc@2.16.4': + resolution: {integrity: sha512-+URqwnB6u1gqaLbG1O1DDApH+UVj4WCbK9No1fdxLBxQ9a84jyli25o1kK1hYB9Nb/JMyYNnEBfvYUW6RphOxw==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/package-manager@2.15.4': - resolution: {integrity: sha512-KZONBcEJ24moQdrpU0zJh9CYk3KKbpB5RUM70utAORem1yQKms+0Y4YED3njq6nZzbgwUN/Csc+powUHLZStvg==} + '@parcel/package-manager@2.16.4': + resolution: {integrity: sha512-obWv9gZgdnkT3Kd+fBkKjhdNEY7zfOP5gVaox5i4nQstVCaVnDlMv5FwLEXwehL+WbwEcGyEGGxOHHkAFKk7Cg==} engines: {node: '>= 16.0.0'} peerDependencies: - '@parcel/core': ^2.15.4 + '@parcel/core': ^2.16.4 - '@parcel/packager-css@2.15.4': - resolution: {integrity: sha512-bzSaNf+I5lmJFu95wSG2k7pGwjCDesZsV6Y9sozIL2LoSxqvkGhm/ABXAa3Ed7dLe3tSAEBzJcyqShQgLzSzuw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/packager-css@2.16.4': + resolution: {integrity: sha512-rWRtfiX+VVIOZvq64jpeNUKkvWAbnokfHQsk/js1s5jD4ViNQgPcNLiRaiIANjymqL6+dQqWvGUSW2a5FAZYfg==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/packager-html@2.15.4': - resolution: {integrity: sha512-Uayux6A2Anm66Kmq22QhD0TuVp9LiRCMuPUzBd6n4ekNlG0Lzm6K3/okMkPG65nKbNjq5qcPscFWlDxggvjt2g==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/packager-html@2.16.4': + resolution: {integrity: sha512-AWo5f6SSqBsg2uWOsX0gPX8hCx2iE6GYLg2Z4/cDy2mPlwDICN8/bxItEztSZFmObi+ti26eetBKRDxAUivyIQ==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/packager-js@2.15.4': - resolution: {integrity: sha512-96bqhs1jyd28CfWQD+Yn8rSsd1ar7voHWyBtMLimsK+bDJIzL26Z7jWyRDwXRuLErYC01EoXRIRctxtmeRVJ2Q==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/packager-js@2.16.4': + resolution: {integrity: sha512-L2o39f/fhta+hxto7w8OTUKdstY+te5BmHZREckbQm0KTBg93BG7jB0bfoxLSZF0d8uuAYIVXjzeHNqha+du1g==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/packager-raw@2.15.4': - resolution: {integrity: sha512-CaSpDt5jjcO0SYCtsDhw6yfTDQuDFQ875H42W/ftvSQL7RfLRljPthnbdcy9chvKBbvRBQF+0z8Sxwehrd5hsA==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/packager-raw@2.16.4': + resolution: {integrity: sha512-A9j60G9OmbTkEeE4WRMXCiErEprHLs9NkUlC4HXCxmSrPMOVaMaMva2LdejE3A9kujZqYtYfuc8+a+jN+Nro4w==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/packager-svg@2.15.4': - resolution: {integrity: sha512-qHsyOgnzoA2XGMLIYUnX79XAaV327VTWQvIzju/OmOjcff4o3uiEcNL8w9k3p2w2oPXOLoQ0THMiivoUQSM8GQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/packager-svg@2.16.4': + resolution: {integrity: sha512-LT9l7eInFrAZJ6w3mYzAUgDq3SIzYbbQyW46Dz26M9lJQbf6uCaATUTac3BEHegW0ikDuw4OOGHK41BVqeeusg==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/packager-wasm@2.15.4': - resolution: {integrity: sha512-YPVij7zrBchtXr/y29P4uh3C/+19PMhhLibYF/8oMJKkFkeU3Uv00/XLm915vdBPrIPjgw0YuIfLzUKip1uGtg==} - engines: {node: '>=16.0.0', parcel: ^2.15.4} + '@parcel/packager-wasm@2.16.4': + resolution: {integrity: sha512-AY96Aqu/RpmaSZK2RGkIrZWjAperDw8DAlxLAiaP1D/RPVnikZtl5BmcUt/Wz3PrzG7/q9ZVqqKkWsLmhkjXZQ==} + engines: {node: '>=16.0.0', parcel: ^2.16.4} - '@parcel/plugin@2.15.4': - resolution: {integrity: sha512-XVehjmzk8ZDOFf/BXo26L76ZqCGNKIQcN2ngxAnq0KRY/WFanL8yLaL0qQq+c9whlu09hkGz1CuhFBLAIjJMYQ==} + '@parcel/plugin@2.16.4': + resolution: {integrity: sha512-aN2VQoRGC1eB41ZCDbPR/Sp0yKOxe31oemzPx1nJzOuebK2Q6FxSrJ9Bjj9j/YCaLzDtPwelsuLOazzVpXJ6qg==} engines: {node: '>= 16.0.0'} - '@parcel/profiler@2.15.4': - resolution: {integrity: sha512-ezVZlttUmQ1MQD5e8yVb07vSGYEFOB59Y/jaxL9mGSLZkVhMIIHe/7SuA+4qVAH8dlg6bslXRqlsunLMPEgPsg==} + '@parcel/profiler@2.16.4': + resolution: {integrity: sha512-R3JhfcnoReTv2sVFHPR2xKZvs3d3IRrBl9sWmAftbIJFwT4rU70/W7IdwfaJVkD/6PzHq9mcgOh1WKL4KAxPdA==} engines: {node: '>= 16.0.0'} - '@parcel/reporter-cli@2.15.4': - resolution: {integrity: sha512-us0HIwuJqpSguf+yi4n8foabVs26JGvRB/eSOf0KkRldxFciYLn4NJ8rt3Xm1zvxlDiSkD4v2n77u+ouIZ+AEQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/reporter-cli@2.16.4': + resolution: {integrity: sha512-DQx9TwcTZrDv828+tcwEi//xyW7OHTGzGX1+UEVxPp0mSzuOmDn0zfER8qNIqGr1i4D/FXhb5UJQDhGHV8mOpQ==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/reporter-dev-server@2.15.4': - resolution: {integrity: sha512-uCNeDyArNNXI9YThlxyTx7+5ZSxlewyUdyrLdDZCqvn8s1xNB9W8sUNVps7mJZQSc+2ZRk3wyDemURD67uJk/A==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/reporter-dev-server@2.16.4': + resolution: {integrity: sha512-YWvay25htQDifpDRJ0+yFh6xUxKnbfeJxYkPYyuXdxpEUhq4T0UWW0PbPCN/wFX7StgeUTXq5Poeo/+eys9m3w==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/reporter-tracer@2.15.4': - resolution: {integrity: sha512-9W1xsb/FtobCQ4z847nI6hFDaTZHLeThv/z05EF77R30RX2k+unG9ac5NQB1v4KLx09Bhfre32+sjYNReWxWlg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/reporter-tracer@2.16.4': + resolution: {integrity: sha512-JKnlXpPepak0/ZybmZn9JtyjJiDBWYrt7ZUlXQhQb0xzNcd/k+RqfwVkTKIwyFHsWtym0cwibkvsi2bWFzS7tw==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/resolver-default@2.15.4': - resolution: {integrity: sha512-4uKo3FFnubtIc4rM9jZiQQXpa1slawyRy5btJEfTFvbcnz0dm3WThLrsPDMfmPwNr9F/n5x8yzDLI6/fZ/elgA==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/resolver-default@2.16.4': + resolution: {integrity: sha512-wJe9XQS0hn/t32pntQpJbls3ZL8mGVVhK9L7s7BTmZT9ufnvP2nif1psJz/nbgnP9LF6mLSk43OdMJKpoStsjQ==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/runtime-browser-hmr@2.15.4': - resolution: {integrity: sha512-KRGzbxDUOQUkrJKxxY0WyU7oVaa9TvWTRlpuGJXzQJs/hw8vkAAoAm8+ptpypvBC8LnxFHzGbSyHPfL8C8MQOw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/runtime-browser-hmr@2.16.4': + resolution: {integrity: sha512-asx7p3NjUSfibI3bC7+8+jUIGHWVk2Zuq9SjJGCGDt+auT9A4uSGljnsk1BWWPqqZ0WILubq4czSAqm0+wt4cw==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/runtime-js@2.15.4': - resolution: {integrity: sha512-zNRK+693CMkYiA0ckjPOmz+JVHD9bVzp27itcMyuDH6l/Or8m09RgCC4DIdIxBqiplsDSe39DwEc5X7b0vvcjw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/runtime-js@2.16.4': + resolution: {integrity: sha512-gUKmsjg+PULQBu2QbX0QKll9tXSqHPO8NrfxHwWb2lz5xDKDos1oV0I7BoMWbHhUHkoToXZrm654oGViujtVUA==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/runtime-rsc@2.15.4': - resolution: {integrity: sha512-yHc4HEwzCQYLqa6Q1WtZ8xJeaDAk0p2i0b3ABq2I+izmRjer4jertlsEwh9mf9Z1eUGtJobdGYzl8Ai1VfhC3g==} - engines: {node: '>= 12.0.0', parcel: ^2.15.4} + '@parcel/runtime-rsc@2.16.4': + resolution: {integrity: sha512-CHkotYE/cNiUjJmrc5FD9YhlFp1UF5wMNNJmoWaL40eBzsqcaV0sSn5V3bNapwewn3wrMYgdPgvOTHfaZaG73A==} + engines: {node: '>= 12.0.0', parcel: ^2.16.4} - '@parcel/runtime-service-worker@2.15.4': - resolution: {integrity: sha512-NGq/wS34GIVzo2ZURBjCqgHV+PU7eTcngCzmmk/wrCEeWnr13ld+CAIxVZoqyNJwYsF6VQanrjSM2/LhCXEdyA==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/runtime-service-worker@2.16.4': + resolution: {integrity: sha512-FT0Q58bf5Re+dq5cL2XHbxqHHFZco6qtRijeVpT3TSPMRPlniMArypSytTeZzVNL7h/hxjWsNu7fRuC0yLB5hA==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/rust-darwin-arm64@2.15.4': - resolution: {integrity: sha512-cEpNDeEtvM5Nhj0QLN95QbcZ9yY6Z5W3+2OeHvnojEAP8Rp1XGzqVTTZdlyKyN1KTiyfzIOiQJCiEcr+kMc5Nw==} + '@parcel/rust-darwin-arm64@2.16.4': + resolution: {integrity: sha512-P3Se36H9EO1fOlwXqQNQ+RsVKTGn5ztRSUGbLcT8ba6oOMmU1w7J4R810GgsCbwCuF10TJNUMkuD3Q2Sz15Q3Q==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@parcel/rust-darwin-x64@2.15.4': - resolution: {integrity: sha512-jL9i13sXKeBXXz8Z3BNYoScPOi+ljBA0ubAE3PN5DCoAA6wS4/FsAiRSIUw+3uxqASBD7+JvaT5sDUga1Xft5g==} + '@parcel/rust-darwin-x64@2.16.4': + resolution: {integrity: sha512-8aNKNyPIx3EthYpmVJevIdHmFsOApXAEYGi3HU69jTxLgSIfyEHDdGE9lEsMvhSrd/SSo4/euAtiV+pqK04wnA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@parcel/rust-linux-arm-gnueabihf@2.15.4': - resolution: {integrity: sha512-c8HpVdDugCutlMILoOlkTioih9HGJpQrzS2G3cg/O1a5ZTacooGf3eGJGoh6dUBEv9WEaEb6zsTRwFv2BgtZcA==} + '@parcel/rust-linux-arm-gnueabihf@2.16.4': + resolution: {integrity: sha512-QrvqiSHaWRLc0JBHgUHVvDthfWSkA6AFN+ikV1UGENv4j2r/QgvuwJiG0VHrsL6pH5dRqj0vvngHzEgguke9DA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@parcel/rust-linux-arm64-gnu@2.15.4': - resolution: {integrity: sha512-Wcfs/JY4FnuLxQaU+VX2rI4j376Qo2LkZmq4zp9frnsajaAqmloVQfnbUkdnQPEL4I38eHXerzBX3LoXSxnZKA==} + '@parcel/rust-linux-arm64-gnu@2.16.4': + resolution: {integrity: sha512-f3gBWQHLHRUajNZi3SMmDQiEx54RoRbXtZYQNuBQy7+NolfFcgb1ik3QhkT7xovuTF/LBmaqP3UFy0PxvR/iwQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] - '@parcel/rust-linux-arm64-musl@2.15.4': - resolution: {integrity: sha512-xf9HxosEn3dU5M0zDSXqBaG8rEjLThRdTYqpkxHW/qQGzy0Se+/ntg8PeDHsSG5E9OK8xrcKH46Lhaw0QBF/Zw==} + '@parcel/rust-linux-arm64-musl@2.16.4': + resolution: {integrity: sha512-cwml18RNKsBwHyZnrZg4jpecXkWjaY/mCArocWUxkFXjjB97L56QWQM9W86f2/Y3HcFcnIGJwx1SDDKJrV6OIA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] - '@parcel/rust-linux-x64-gnu@2.15.4': - resolution: {integrity: sha512-RigXVCFj6h0AXmkuxU61rfgYuW+PXBR6qSkR2I20yKnAXoMfxLaZy9YJ3sAPMEjT9zXgzGAX+3syItMF+bRjaw==} + '@parcel/rust-linux-x64-gnu@2.16.4': + resolution: {integrity: sha512-0xIjQaN8hiG0F9R8coPYidHslDIrbfOS/qFy5GJNbGA3S49h61wZRBMQqa7JFW4+2T8R0J9j0SKHhLXpbLXrIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] - '@parcel/rust-linux-x64-musl@2.15.4': - resolution: {integrity: sha512-tHlRgonSr5ca8OvhbGzZUggCgCOirRz5dHhPSCm4ajMxeDMamwprq6lKy0sCNTXht4TXIEyugBcfEuRKEeVIBw==} + '@parcel/rust-linux-x64-musl@2.16.4': + resolution: {integrity: sha512-fYn21GIecHK9RoZPKwT9NOwxwl3Gy3RYPR6zvsUi0+hpFo19Ph9EzFXN3lT8Pi5KiwQMCU4rsLb5HoWOBM1FeA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] - '@parcel/rust-win32-x64-msvc@2.15.4': - resolution: {integrity: sha512-YsX6vMl/bfyxqZSN7yiaZQKLoJKELSZYcvg8gIv4CF1xkaTdmfr6gvq2iCyoV+bwrodNohN4Xfl8r7Wniu1/UA==} + '@parcel/rust-win32-x64-msvc@2.16.4': + resolution: {integrity: sha512-TcpWC3I1mJpfP2++018lgvM7UX0P8IrzNxceBTHUKEIDMwmAYrUKAQFiaU0j1Ldqk6yP8SPZD3cvphumsYpJOQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@parcel/rust@2.15.4': - resolution: {integrity: sha512-OxOux8z8YEYg23+15uMmYaloFp3x1RwcliBay6HqxUW7RTmtI1/z+xd8AtienCckACD60gvDGy04LjgbEGdJVg==} + '@parcel/rust@2.16.4': + resolution: {integrity: sha512-RBMKt9rCdv6jr4vXG6LmHtxzO5TuhQvXo1kSoSIF7fURRZ81D1jzBtLxwLmfxCPsofJNqWwdhy5vIvisX+TLlQ==} engines: {node: '>= 16.0.0'} peerDependencies: napi-wasm: ^1.1.2 @@ -325,225 +329,235 @@ packages: resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} engines: {node: ^12.18.3 || >=14} - '@parcel/transformer-babel@2.15.4': - resolution: {integrity: sha512-rb4nqZcTLkLD3nvuYJ9wwNb8x6cajBK2l6csdYMLEI4516SkIzkO/gs2cZ9M5q+CMhxAqpdEnrwektbOtQQasg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-babel@2.16.4': + resolution: {integrity: sha512-CMDUOQYX7+cmeyHxHSFnoPcwvXNL7rRFE+Q06uVFzsYYiVhbwGF/1J5Bx4cW3Froumqla4YTytTsEteJEybkdA==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/transformer-css@2.15.4': - resolution: {integrity: sha512-6tVwSJsOssXgcB5XMAQGsexAffoBEi8GVql3YQqzI1EwVYs9zr+B5mfbesb4aWcegR02w99NHJYFP9CrOr3SWw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-css@2.16.4': + resolution: {integrity: sha512-VG/+DbDci2HKe20GFRDs65ZQf5GUFfnmZAa1BhVl/MO+ijT3XC3eoVUy5cExRkq4VLcPY4ytL0g/1T2D6x7lBQ==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/transformer-html@2.15.4': - resolution: {integrity: sha512-gzYPbbyEuV8nzPojw86eD5Kf93AYUWcY8lu33gu0XHROJH7mq5MAwPwtb/U+EfpeCd0/oKbLzA2mkQksM1NncQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-html@2.16.4': + resolution: {integrity: sha512-w6JErYTeNS+KAzUAER18NHFIFFvxiLGd4Fht1UYcb/FDjJdLAMB/FljyEs0Rto/WAhZ2D0MuSL25HQh837R62g==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/transformer-image@2.15.4': - resolution: {integrity: sha512-KOVwj2gKjUybuzHwarC/YVqRf3r2BD4/2ysckozj6DIji/bq3fd2rE9yqxWXO+zt918PsOSTzMKwRnaseaXLKQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-image@2.16.4': + resolution: {integrity: sha512-ZzIn3KvvRqMfcect4Dy+57C9XoQXZhpVJKBdQWMp9wM1qJEgsVgGDcaSBYCs/UYSKMRMP6Wm20pKCt408RkQzg==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} peerDependencies: - '@parcel/core': ^2.15.4 + '@parcel/core': ^2.16.4 - '@parcel/transformer-js@2.15.4': - resolution: {integrity: sha512-HX76PalPjqCLmXJnuSeMr2km8WlnUsW8oaRZ6FuZtSo9QD8BqIcwKGxSbIy9JHkObBgmrMOVpGtYrJM4/BlYbg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-js@2.16.4': + resolution: {integrity: sha512-FD2fdO6URwAGBPidb3x1dDgLBt972mko0LelcSU05aC/pcKaV9mbCtINbPul1MlStzkxDelhuImcCYIyerheVQ==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} peerDependencies: - '@parcel/core': ^2.15.4 + '@parcel/core': ^2.16.4 - '@parcel/transformer-json@2.15.4': - resolution: {integrity: sha512-1ASeOSH3gPeaXyy/TZ7ce2TOfJ3ZeK5SBnDs+MM8LFcQsTwdRJKjX/4Qq9RgtMRryYAGHgMa09Gvp9FuFRyd+w==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-json@2.16.4': + resolution: {integrity: sha512-pB3ZNqgokdkBCJ+4G0BrPYcIkyM9K1HVk0GvjzcLEFDKsoAp8BGEM68FzagFM/nVq9anYTshIaoh349GK0M/bg==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/transformer-node@2.15.4': - resolution: {integrity: sha512-zV5jvZA971eQMcFtaWZkW1UfAH/G6XVM/87oJ2B4ip9o9aKUWIl296rrfg2xWxUQyPhy11B17CJ6b8NgieqqrQ==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-node@2.16.4': + resolution: {integrity: sha512-7t43CPGfMJk1LqFokwxHSsRi+kKC2QvDXaMtqiMShmk50LCwn81WgzuFvNhMwf6lSiBihWupGwF3Fqksg+aisg==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/transformer-postcss@2.15.4': - resolution: {integrity: sha512-cNueSpOj3ulmMX85xr9clh/t0+mzVE+Q3H7Cf/OammqUkG/xjmilq4q7ZTgQFyUtUdWpE9LWWHojbJuz6k2Ulw==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-postcss@2.16.4': + resolution: {integrity: sha512-jfmh9ho03H+qwz9S1b/a/oaOmgfMovtHKYDweIGMjKULKIee3AFRqo8RZIOuUMjDuqHWK8SqQmjery4syFV3Xw==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/transformer-posthtml@2.15.4': - resolution: {integrity: sha512-dETI+CeKMwu5Dpvu8BrQtex6nwzbNWKQkXseiM5x6+Wf3j9RD2NVpAMBRMjLkw1XlC9Whz1egxLSgKlMKbjg0w==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-posthtml@2.16.4': + resolution: {integrity: sha512-+GXsmGx1L25KQGQnwclgEuQe1t4QU+IoDkgN+Ikj+EnQCOWG4/ts2VpMBeqP5F18ZT4cCSRafj6317o/2lSGJg==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/transformer-raw@2.15.4': - resolution: {integrity: sha512-pY2j09UCW2v1fwQtVLlCztSdPOxhq0YcWmTHCk/mRp8zuUR+eyHgsz48FrUxRF7cr/EBjc0zlFcregRMRcaTMg==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-raw@2.16.4': + resolution: {integrity: sha512-7WDUPq+bW11G9jKxaQIVL+NPGolV99oq/GXhpjYip0SaGaLzRCW7gEk60cftuk0O7MsDaX5jcAJm3G/AX+LJKg==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/transformer-react-refresh-wrap@2.15.4': - resolution: {integrity: sha512-MgoQrV8+BVjrczAns5ZZbTERGB3/U4MaCBmbg3CuiTiIyS8IJQnGi+OhYRdKAB4NlsgpMZ5T2JrRbQUIm9MM8Q==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-react-refresh-wrap@2.16.4': + resolution: {integrity: sha512-MiLNZrsGQJTANKKa4lzZyUbGj/en0Hms474mMdQkCBFg6GmjfmXwaMMgtTfPA3ZwSp2+3LeObCyca/f9B2gBZQ==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/transformer-sass@2.15.4': - resolution: {integrity: sha512-o7rPDdId5tpx/riTzu0O3zpyt24ORrVdAxW6k2YN2xGrvStfnQHxKjrSiEFDUMMzuikcW7Ed+uqPk046DK3m8w==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-sass@2.16.4': + resolution: {integrity: sha512-TvYZf7dwgtIVHcxkmOlIz0e28Ec7T6z0Jhzu+WcnFSonnhyrvKuqAxy7QV5EGc6O4qvDWwAQV1lvaLU0te+mQQ==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/transformer-svg@2.15.4': - resolution: {integrity: sha512-Q22e0VRbx62VXFlvJWIlc8ihlLaPQgtnAZz5E1/+ojiNb+k0PmIRjNJclVWPF6IdCsLO5tnGfUOaXe2OnZz28Q==} - engines: {node: '>= 16.0.0', parcel: ^2.15.4} + '@parcel/transformer-svg@2.16.4': + resolution: {integrity: sha512-0dm4cQr/WpfQP6N0xjFtwdLTxcONDfoLgTOMk4eNUWydHipSgmLtvUk/nOc/FWkwztRScfAObtZXOiPOd3Oy9A==} + engines: {node: '>= 16.0.0', parcel: ^2.16.4} - '@parcel/types-internal@2.15.4': - resolution: {integrity: sha512-kl5QEZ8PTWRvMkwmk7IG3VpP/5/MSGwt9Nrj9ctXLdZkDdXZpK7IbXAthLQ4zrByMaqZULL2IyDuBqBgfuAqlQ==} + '@parcel/types-internal@2.16.4': + resolution: {integrity: sha512-PE6Qmt5cjzBxX+6MPLiF7r+twoC+V9Skt3zyuBQ+H1c0i9o07Bbz2NKX10nvlPukfmW6Fu/1RvTLkzBZR1bU6A==} - '@parcel/types@2.15.4': - resolution: {integrity: sha512-fS3UMMinLtzn/NTSx/qx38saBgRniylldh0XZEUcGeME4D2Llu/QlLv+YZ/LJqrFci3fPRM+YAn2K+JT/u+/0w==} + '@parcel/types@2.16.4': + resolution: {integrity: sha512-ctx4mBskZHXeDVHg4OjMwx18jfYH9BzI/7yqbDQVGvd5lyA+/oVVzYdpele2J2i2sSaJ87cA8nb57GDQ8kHAqA==} - '@parcel/utils@2.15.4': - resolution: {integrity: sha512-29m09sfPx0GHnmy1kkZ5XezprepdFGKKKUEJkyiYA4ERf55jjdnU2/GP4sWlZXxjh2Y+JFoCAFlCamEClq/8eA==} + '@parcel/utils@2.16.4': + resolution: {integrity: sha512-lkmxQHcHyOWZLbV8t+h2CGZIkPiBurLm/TS5wNT7+tq0qt9KbVwL7FP2K93TbXhLMGTmpI79Bf3qKniPM167Mw==} engines: {node: '>= 16.0.0'} - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} - '@parcel/workers@2.15.4': - resolution: {integrity: sha512-wZ/5/mfjs5aeqhXY0c6fwuaBFeNpOXoOq2CKPSMDXt+GX2u/9/1bpVxN9XeGTAJO+ZD++CLq0hyzTnIHy58nyw==} + '@parcel/workers@2.16.4': + resolution: {integrity: sha512-dkBEWqnHXDZnRbTZouNt4uEGIslJT+V0c8OH1MPOfjISp1ucD6/u9ET8k9d/PxS9h1hL53og0SpBuuSEPLDl6A==} engines: {node: '>= 16.0.0'} peerDependencies: - '@parcel/core': ^2.15.4 + '@parcel/core': ^2.16.4 '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@swc/core-darwin-arm64@1.12.11': - resolution: {integrity: sha512-J19Jj9Y5x/N0loExH7W0OI9OwwoVyxutDdkyq1o/kgXyBqmmzV7Y/Q9QekI2Fm/qc5mNeAdP7aj4boY4AY/JPw==} + '@swc/core-darwin-arm64@1.15.18': + resolution: {integrity: sha512-+mIv7uBuSaywN3C9LNuWaX1jJJ3SKfiJuE6Lr3bd+/1Iv8oMU7oLBjYMluX1UrEPzwN2qCdY6Io0yVicABoCwQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.12.11': - resolution: {integrity: sha512-PTuUQrfStQ6cjW+uprGO2lpQHy84/l0v+GqRqq8s/jdK55rFRjMfCeyf6FAR0l6saO5oNOQl+zWR1aNpj8pMQw==} + '@swc/core-darwin-x64@1.15.18': + resolution: {integrity: sha512-wZle0eaQhnzxWX5V/2kEOI6Z9vl/lTFEC6V4EWcn+5pDjhemCpQv9e/TDJ0GIoiClX8EDWRvuZwh+Z3dhL1NAg==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.12.11': - resolution: {integrity: sha512-poxBq152HsupOtnZilenvHmxZ9a8SRj4LtfxUnkMDNOGrZR9oxbQNwEzNKfi3RXEcXz+P8c0Rai1ubBazXv8oQ==} + '@swc/core-linux-arm-gnueabihf@1.15.18': + resolution: {integrity: sha512-ao61HGXVqrJFHAcPtF4/DegmwEkVCo4HApnotLU8ognfmU8x589z7+tcf3hU+qBiU1WOXV5fQX6W9Nzs6hjxDw==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.12.11': - resolution: {integrity: sha512-y1HNamR/D0Hc8xIE910ysyLe269UYiGaQPoLjQS0phzWFfWdMj9bHM++oydVXZ4RSWycO7KyJ3uvw4NilvyMKQ==} + '@swc/core-linux-arm64-gnu@1.15.18': + resolution: {integrity: sha512-3xnctOBLIq3kj8PxOCgPrGjBLP/kNOddr6f5gukYt/1IZxsITQaU9TDyjeX6jG+FiCIHjCuWuffsyQDL5Ew1bg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [glibc] - '@swc/core-linux-arm64-musl@1.12.11': - resolution: {integrity: sha512-LlBxPh/32pyQsu2emMEOFRm7poEFLsw12Y1mPY7FWZiZeptomKSOSHRzKDz9EolMiV4qhK1caP1lvW4vminYgQ==} + '@swc/core-linux-arm64-musl@1.15.18': + resolution: {integrity: sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [musl] - '@swc/core-linux-x64-gnu@1.12.11': - resolution: {integrity: sha512-bOjiZB8O/1AzHkzjge1jqX62HGRIpOHqFUrGPfAln/NC6NR+Z2A78u3ixV7k5KesWZFhCV0YVGJL+qToL27myA==} + '@swc/core-linux-x64-gnu@1.15.18': + resolution: {integrity: sha512-wG9J8vReUlpaHz4KOD/5UE1AUgirimU4UFT9oZmupUDEofxJKYb1mTA/DrMj0s78bkBiNI+7Fo2EgPuvOJfuAA==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [glibc] - '@swc/core-linux-x64-musl@1.12.11': - resolution: {integrity: sha512-4dzAtbT/m3/UjF045+33gLiHd8aSXJDoqof7gTtu4q0ZyAf7XJ3HHspz+/AvOJLVo4FHHdFcdXhmo/zi1nFn8A==} + '@swc/core-linux-x64-musl@1.15.18': + resolution: {integrity: sha512-4nwbVvCphKzicwNWRmvD5iBaZj8JYsRGa4xOxJmOyHlMDpsvvJ2OR2cODlvWyGFH6BYL1MfIAK3qph3hp0Az6g==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [musl] - '@swc/core-win32-arm64-msvc@1.12.11': - resolution: {integrity: sha512-h8HiwBZErKvCAmjW92JvQp0iOqm6bncU4ac5jxBGkRApabpUenNJcj3h2g5O6GL5K6T9/WhnXE5gyq/s1fhPQg==} + '@swc/core-win32-arm64-msvc@1.15.18': + resolution: {integrity: sha512-zk0RYO+LjiBCat2RTMHzAWaMky0cra9loH4oRrLKLLNuL+jarxKLFDA8xTZWEkCPLjUTwlRN7d28eDLLMgtUcQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.12.11': - resolution: {integrity: sha512-1pwr325mXRNUhxTtXmx1IokV5SiRL+6iDvnt3FRXj+X5UvXXKtg2zeyftk+03u8v8v8WUr5I32hIypVJPTNxNg==} + '@swc/core-win32-ia32-msvc@1.15.18': + resolution: {integrity: sha512-yVuTrZ0RccD5+PEkpcLOBAuPbYBXS6rslENvIXfvJGXSdX5QGi1ehC4BjAMl5FkKLiam4kJECUI0l7Hq7T1vwg==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.12.11': - resolution: {integrity: sha512-5gggWo690Gvs7XiPxAmb5tHwzB9RTVXUV7AWoGb6bmyUd1OXYaebQF0HAOtade5jIoNhfQMQJ7QReRgt/d2jAA==} + '@swc/core-win32-x64-msvc@1.15.18': + resolution: {integrity: sha512-7NRmE4hmUQNCbYU3Hn9Tz57mK9Qq4c97ZS+YlamlK6qG9Fb5g/BB3gPDe0iLlJkns/sYv2VWSkm8c3NmbEGjbg==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.12.11': - resolution: {integrity: sha512-P3GM+0lqjFctcp5HhR9mOcvLSX3SptI9L1aux0Fuvgt8oH4f92rCUrkodAa0U2ktmdjcyIiG37xg2mb/dSCYSA==} + '@swc/core@1.15.18': + resolution: {integrity: sha512-z87aF9GphWp//fnkRsqvtY+inMVPgYW3zSlXH1kJFvRT5H/wiAn+G32qW5l3oEk63KSF1x3Ov0BfHCObAmT8RA==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -554,11 +568,11 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@swc/helpers@0.5.19': + resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} - '@swc/types@0.1.23': - resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==} + '@swc/types@0.1.25': + resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -567,25 +581,26 @@ packages: base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + baseline-browser-mapping@2.10.0: + resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + engines: {node: '>=6.0.0'} + hasBin: true + bootstrap-icons@1.13.1: resolution: {integrity: sha512-ijombt4v6bv5CLeXvRWKy7CuM3TRTuPEuGaGKvTV5cz65rQSY8RQ2JcHt6b90cBBAC7s8fsf2EkQDldzCoXUjw==} - bootstrap@5.3.7: - resolution: {integrity: sha512-7KgiD8UHjfcPBHEpDNg+zGz8L3LqR3GVwqZiBRFX04a1BCArZOz1r2kjly2HQ0WokqTO0v1nF+QAt8dsW4lKlw==} + bootstrap@5.3.8: + resolution: {integrity: sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==} peerDependencies: '@popperjs/core': ^2.11.8 - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - caniuse-lite@1.0.30001727: - resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + caniuse-lite@1.0.30001777: + resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -619,8 +634,8 @@ packages: engines: {node: '>=0.10'} hasBin: true - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} dotenv-expand@11.0.7: @@ -631,17 +646,13 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - electron-to-chromium@1.5.182: - resolution: {integrity: sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==} + electron-to-chromium@1.5.307: + resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - get-port@4.2.0: resolution: {integrity: sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==} engines: {node: '>=6'} @@ -654,8 +665,8 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - immutable@5.1.3: - resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} + immutable@5.1.5: + resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -665,10 +676,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - jquery@3.7.1: resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} @@ -677,84 +684,90 @@ packages: engines: {node: '>=6'} hasBin: true - lightningcss-darwin-arm64@1.30.1: - resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + lightningcss-android-arm64@1.31.1: + resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.31.1: + resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.30.1: - resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + lightningcss-darwin-x64@1.31.1: + resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.30.1: - resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + lightningcss-freebsd-x64@1.31.1: + resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.30.1: - resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + lightningcss-linux-arm-gnueabihf@1.31.1: + resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.30.1: - resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + lightningcss-linux-arm64-gnu@1.31.1: + resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] - lightningcss-linux-arm64-musl@1.30.1: - resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + lightningcss-linux-arm64-musl@1.31.1: + resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] - lightningcss-linux-x64-gnu@1.30.1: - resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + lightningcss-linux-x64-gnu@1.31.1: + resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] - lightningcss-linux-x64-musl@1.30.1: - resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + lightningcss-linux-x64-musl@1.31.1: + resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] - lightningcss-win32-arm64-msvc@1.30.1: - resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + lightningcss-win32-arm64-msvc@1.31.1: + resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.30.1: - resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + lightningcss-win32-x64-msvc@1.31.1: + resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.30.1: - resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + lightningcss@1.31.1: + resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} lmdb@2.8.5: resolution: {integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==} hasBin: true - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - msgpackr-extract@3.0.3: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true - msgpackr@1.11.4: - resolution: {integrity: sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg==} + msgpackr@1.11.8: + resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} @@ -770,26 +783,26 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.36: + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - ordered-binary@1.6.0: - resolution: {integrity: sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==} + ordered-binary@1.6.1: + resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} - parcel@2.15.4: - resolution: {integrity: sha512-eZHQ/omuQ7yBYB9XezyzSqhc826oy/uhloCNiej1CTZ+twAqJVtp4MRvTGMcivKhE+WE8QkYD5XkJHLLQsJQcg==} + parcel@2.16.4: + resolution: {integrity: sha512-RQlrqs4ujYNJpTQi+dITqPKNhRWEqpjPd1YBcGp50Wy3FcJHpwu0/iRm7XWz2dKU/Bwp2qCcVYPIeEDYi2uOUw==} engines: {node: '>= 16.0.0'} hasBin: true picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -799,8 +812,8 @@ packages: peerDependencies: prettier: ^3.0.0 - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} engines: {node: '>=14'} hasBin: true @@ -818,13 +831,13 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - sass@1.89.2: - resolution: {integrity: sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==} + sass@1.97.3: + resolution: {integrity: sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==} engines: {node: '>=14.0.0'} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true @@ -840,10 +853,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -851,8 +860,8 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -866,11 +875,11 @@ packages: snapshots: - '@lezer/common@1.2.3': {} + '@lezer/common@1.5.1': {} - '@lezer/lr@1.4.2': + '@lezer/lr@1.4.8': dependencies: - '@lezer/common': 1.2.3 + '@lezer/common': 1.5.1 '@lmdb/lmdb-darwin-arm64@2.8.5': optional: true @@ -892,8 +901,8 @@ snapshots: '@mischnic/json-sourcemap@0.1.1': dependencies: - '@lezer/common': 1.2.3 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.5.1 + '@lezer/lr': 1.4.8 json5: 2.2.3 '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': @@ -914,719 +923,719 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@parcel/bundler-default@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/bundler-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/graph': 3.5.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 + '@parcel/diagnostic': 2.16.4 + '@parcel/graph': 3.6.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 + '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/cache@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/cache@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/core': 2.15.4(@swc/helpers@0.5.17) - '@parcel/fs': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/logger': 2.15.4 - '@parcel/utils': 2.15.4 + '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/logger': 2.16.4 + '@parcel/utils': 2.16.4 lmdb: 2.8.5 transitivePeerDependencies: - napi-wasm - '@parcel/codeframe@2.15.4': + '@parcel/codeframe@2.16.4': dependencies: chalk: 4.1.2 - '@parcel/compressor-raw@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/compressor-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/config-default@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)': + '@parcel/config-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19)': dependencies: - '@parcel/bundler-default': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/compressor-raw': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/core': 2.15.4(@swc/helpers@0.5.17) - '@parcel/namer-default': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/optimizer-css': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/optimizer-html': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/optimizer-image': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/optimizer-svg': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/optimizer-swc': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17) - '@parcel/packager-css': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/packager-html': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/packager-js': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/packager-raw': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/packager-svg': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/packager-wasm': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/reporter-dev-server': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/resolver-default': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/runtime-browser-hmr': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/runtime-js': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/runtime-rsc': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/runtime-service-worker': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-babel': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-css': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-html': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-image': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-js': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-json': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-node': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-postcss': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-posthtml': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-raw': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-react-refresh-wrap': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/transformer-svg': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/bundler-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/compressor-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/namer-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/optimizer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/optimizer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/optimizer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/optimizer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/optimizer-swc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) + '@parcel/packager-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/packager-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/packager-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/packager-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/packager-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/packager-wasm': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/resolver-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/runtime-browser-hmr': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/runtime-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/runtime-rsc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/runtime-service-worker': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-babel': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-json': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-node': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-postcss': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-posthtml': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-react-refresh-wrap': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/core@2.15.4(@swc/helpers@0.5.17)': + '@parcel/core@2.16.4(@swc/helpers@0.5.19)': dependencies: '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/diagnostic': 2.15.4 - '@parcel/events': 2.15.4 - '@parcel/feature-flags': 2.15.4 - '@parcel/fs': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/graph': 3.5.4 - '@parcel/logger': 2.15.4 - '@parcel/package-manager': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17) - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/profiler': 2.15.4 - '@parcel/rust': 2.15.4 + '@parcel/cache': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/diagnostic': 2.16.4 + '@parcel/events': 2.16.4 + '@parcel/feature-flags': 2.16.4 + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/graph': 3.6.4 + '@parcel/logger': 2.16.4 + '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/profiler': 2.16.4 + '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) base-x: 3.0.11 - browserslist: 4.25.1 + browserslist: 4.28.1 clone: 2.1.2 dotenv: 16.6.1 dotenv-expand: 11.0.7 json5: 2.2.3 - msgpackr: 1.11.4 + msgpackr: 1.11.8 nullthrows: 1.1.1 - semver: 7.7.2 + semver: 7.7.4 transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/diagnostic@2.15.4': + '@parcel/diagnostic@2.16.4': dependencies: '@mischnic/json-sourcemap': 0.1.1 nullthrows: 1.1.1 - '@parcel/error-overlay@2.15.4': {} + '@parcel/error-overlay@2.16.4': {} - '@parcel/events@2.15.4': {} + '@parcel/events@2.16.4': {} - '@parcel/feature-flags@2.15.4': {} + '@parcel/feature-flags@2.16.4': {} - '@parcel/fs@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/fs@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/core': 2.15.4(@swc/helpers@0.5.17) - '@parcel/feature-flags': 2.15.4 - '@parcel/rust': 2.15.4 - '@parcel/types-internal': 2.15.4 - '@parcel/utils': 2.15.4 - '@parcel/watcher': 2.5.1 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/feature-flags': 2.16.4 + '@parcel/rust': 2.16.4 + '@parcel/types-internal': 2.16.4 + '@parcel/utils': 2.16.4 + '@parcel/watcher': 2.5.6 + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) transitivePeerDependencies: - napi-wasm - '@parcel/graph@3.5.4': + '@parcel/graph@3.6.4': dependencies: - '@parcel/feature-flags': 2.15.4 + '@parcel/feature-flags': 2.16.4 nullthrows: 1.1.1 - '@parcel/logger@2.15.4': + '@parcel/logger@2.16.4': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/events': 2.15.4 + '@parcel/diagnostic': 2.16.4 + '@parcel/events': 2.16.4 - '@parcel/markdown-ansi@2.15.4': + '@parcel/markdown-ansi@2.16.4': dependencies: chalk: 4.1.2 - '@parcel/namer-default@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/namer-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/node-resolver-core@3.6.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/node-resolver-core@3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: '@mischnic/json-sourcemap': 0.1.1 - '@parcel/diagnostic': 2.15.4 - '@parcel/fs': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 + '@parcel/diagnostic': 2.16.4 + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 + '@parcel/utils': 2.16.4 nullthrows: 1.1.1 - semver: 7.7.2 + semver: 7.7.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-css@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/optimizer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - browserslist: 4.25.1 - lightningcss: 1.30.1 + '@parcel/utils': 2.16.4 + browserslist: 4.28.1 + lightningcss: 1.31.1 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-html@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/optimizer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 + '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-image@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/optimizer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/core': 2.15.4(@swc/helpers@0.5.17) - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 + '@parcel/utils': 2.16.4 + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) transitivePeerDependencies: - napi-wasm - '@parcel/optimizer-svg@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/optimizer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 + '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-swc@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)': + '@parcel/optimizer-swc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19)': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - '@swc/core': 1.12.11(@swc/helpers@0.5.17) + '@parcel/utils': 2.16.4 + '@swc/core': 1.15.18(@swc/helpers@0.5.19) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - '@swc/helpers' - napi-wasm - '@parcel/package-manager@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)': + '@parcel/package-manager@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19)': dependencies: - '@parcel/core': 2.15.4(@swc/helpers@0.5.17) - '@parcel/diagnostic': 2.15.4 - '@parcel/fs': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/logger': 2.15.4 - '@parcel/node-resolver-core': 3.6.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@swc/core': 1.12.11(@swc/helpers@0.5.17) - semver: 7.7.2 + '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/diagnostic': 2.16.4 + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/logger': 2.16.4 + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@swc/core': 1.15.18(@swc/helpers@0.5.19) + semver: 7.7.4 transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/packager-css@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/packager-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - lightningcss: 1.30.1 + '@parcel/utils': 2.16.4 + lightningcss: 1.31.1 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-html@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/packager-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 - '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-js@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/packager-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 globals: 13.24.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-raw@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/packager-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-svg@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/packager-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 - '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-wasm@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/packager-wasm@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/plugin@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/plugin@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/profiler@2.15.4': + '@parcel/profiler@2.16.4': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/events': 2.15.4 - '@parcel/types-internal': 2.15.4 + '@parcel/diagnostic': 2.16.4 + '@parcel/events': 2.16.4 + '@parcel/types-internal': 2.16.4 chrome-trace-event: 1.0.4 - '@parcel/reporter-cli@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/reporter-cli@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 chalk: 4.1.2 term-size: 2.2.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/reporter-dev-server@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/reporter-dev-server@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/codeframe': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/codeframe': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 + '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/reporter-tracer@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/reporter-tracer@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 chrome-trace-event: 1.0.4 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/resolver-default@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/resolver-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/node-resolver-core': 3.6.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-browser-hmr@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/runtime-browser-hmr@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-js@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/runtime-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-rsc@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/runtime-rsc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 + '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-service-worker@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/runtime-service-worker@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/rust-darwin-arm64@2.15.4': + '@parcel/rust-darwin-arm64@2.16.4': optional: true - '@parcel/rust-darwin-x64@2.15.4': + '@parcel/rust-darwin-x64@2.16.4': optional: true - '@parcel/rust-linux-arm-gnueabihf@2.15.4': + '@parcel/rust-linux-arm-gnueabihf@2.16.4': optional: true - '@parcel/rust-linux-arm64-gnu@2.15.4': + '@parcel/rust-linux-arm64-gnu@2.16.4': optional: true - '@parcel/rust-linux-arm64-musl@2.15.4': + '@parcel/rust-linux-arm64-musl@2.16.4': optional: true - '@parcel/rust-linux-x64-gnu@2.15.4': + '@parcel/rust-linux-x64-gnu@2.16.4': optional: true - '@parcel/rust-linux-x64-musl@2.15.4': + '@parcel/rust-linux-x64-musl@2.16.4': optional: true - '@parcel/rust-win32-x64-msvc@2.15.4': + '@parcel/rust-win32-x64-msvc@2.16.4': optional: true - '@parcel/rust@2.15.4': + '@parcel/rust@2.16.4': optionalDependencies: - '@parcel/rust-darwin-arm64': 2.15.4 - '@parcel/rust-darwin-x64': 2.15.4 - '@parcel/rust-linux-arm-gnueabihf': 2.15.4 - '@parcel/rust-linux-arm64-gnu': 2.15.4 - '@parcel/rust-linux-arm64-musl': 2.15.4 - '@parcel/rust-linux-x64-gnu': 2.15.4 - '@parcel/rust-linux-x64-musl': 2.15.4 - '@parcel/rust-win32-x64-msvc': 2.15.4 + '@parcel/rust-darwin-arm64': 2.16.4 + '@parcel/rust-darwin-x64': 2.16.4 + '@parcel/rust-linux-arm-gnueabihf': 2.16.4 + '@parcel/rust-linux-arm64-gnu': 2.16.4 + '@parcel/rust-linux-arm64-musl': 2.16.4 + '@parcel/rust-linux-x64-gnu': 2.16.4 + '@parcel/rust-linux-x64-musl': 2.16.4 + '@parcel/rust-win32-x64-msvc': 2.16.4 '@parcel/source-map@2.1.1': dependencies: detect-libc: 1.0.3 - '@parcel/transformer-babel@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-babel@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - browserslist: 4.25.1 + '@parcel/utils': 2.16.4 + browserslist: 4.28.1 json5: 2.2.3 nullthrows: 1.1.1 - semver: 7.7.2 + semver: 7.7.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-css@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - browserslist: 4.25.1 - lightningcss: 1.30.1 + '@parcel/utils': 2.16.4 + browserslist: 4.28.1 + lightningcss: 1.31.1 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-html@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-image@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/core': 2.15.4(@swc/helpers@0.5.17) - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) nullthrows: 1.1.1 transitivePeerDependencies: - napi-wasm - '@parcel/transformer-js@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/core': 2.15.4(@swc/helpers@0.5.17) - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 + '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 - '@parcel/utils': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@swc/helpers': 0.5.17 - browserslist: 4.25.1 + '@parcel/utils': 2.16.4 + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@swc/helpers': 0.5.19 + browserslist: 4.28.1 nullthrows: 1.1.1 regenerator-runtime: 0.14.1 - semver: 7.7.2 + semver: 7.7.4 transitivePeerDependencies: - napi-wasm - '@parcel/transformer-json@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-json@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) json5: 2.2.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-node@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-node@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-postcss@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-postcss@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 - '@parcel/utils': 2.15.4 + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 + '@parcel/utils': 2.16.4 clone: 2.1.2 nullthrows: 1.1.1 postcss-value-parser: 4.2.0 - semver: 7.7.2 + semver: 7.7.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-posthtml@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-posthtml@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-raw@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-react-refresh-wrap@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-react-refresh-wrap@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/error-overlay': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 + '@parcel/error-overlay': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 react-refresh: 0.16.0 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-sass@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-sass@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) '@parcel/source-map': 2.1.1 - sass: 1.89.2 + sass: 1.97.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-svg@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/transformer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/rust': 2.15.4 + '@parcel/diagnostic': 2.16.4 + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/rust': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/types-internal@2.15.4': + '@parcel/types-internal@2.16.4': dependencies: - '@parcel/diagnostic': 2.15.4 - '@parcel/feature-flags': 2.15.4 + '@parcel/diagnostic': 2.16.4 + '@parcel/feature-flags': 2.16.4 '@parcel/source-map': 2.1.1 utility-types: 3.11.0 - '@parcel/types@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/types@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/types-internal': 2.15.4 - '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/types-internal': 2.16.4 + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/utils@2.15.4': + '@parcel/utils@2.16.4': dependencies: - '@parcel/codeframe': 2.15.4 - '@parcel/diagnostic': 2.15.4 - '@parcel/logger': 2.15.4 - '@parcel/markdown-ansi': 2.15.4 - '@parcel/rust': 2.15.4 + '@parcel/codeframe': 2.16.4 + '@parcel/diagnostic': 2.16.4 + '@parcel/logger': 2.16.4 + '@parcel/markdown-ansi': 2.16.4 + '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 chalk: 4.1.2 nullthrows: 1.1.1 transitivePeerDependencies: - napi-wasm - '@parcel/watcher-android-arm64@2.5.1': + '@parcel/watcher-android-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-arm64@2.5.1': + '@parcel/watcher-darwin-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-x64@2.5.1': + '@parcel/watcher-darwin-x64@2.5.6': optional: true - '@parcel/watcher-freebsd-x64@2.5.1': + '@parcel/watcher-freebsd-x64@2.5.6': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.1': + '@parcel/watcher-linux-arm-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm-musl@2.5.1': + '@parcel/watcher-linux-arm-musl@2.5.6': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': + '@parcel/watcher-linux-arm64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.1': + '@parcel/watcher-linux-arm64-musl@2.5.6': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.1': + '@parcel/watcher-linux-x64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-x64-musl@2.5.1': + '@parcel/watcher-linux-x64-musl@2.5.6': optional: true - '@parcel/watcher-win32-arm64@2.5.1': + '@parcel/watcher-win32-arm64@2.5.6': optional: true - '@parcel/watcher-win32-ia32@2.5.1': + '@parcel/watcher-win32-ia32@2.5.6': optional: true - '@parcel/watcher-win32-x64@2.5.1': + '@parcel/watcher-win32-x64@2.5.6': optional: true - '@parcel/watcher@2.5.1': + '@parcel/watcher@2.5.6': dependencies: - detect-libc: 1.0.3 + detect-libc: 2.1.2 is-glob: 4.0.3 - micromatch: 4.0.8 node-addon-api: 7.1.1 + picomatch: 4.0.3 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 - '@parcel/workers@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + '@parcel/workers@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': dependencies: - '@parcel/core': 2.15.4(@swc/helpers@0.5.17) - '@parcel/diagnostic': 2.15.4 - '@parcel/logger': 2.15.4 - '@parcel/profiler': 2.15.4 - '@parcel/types-internal': 2.15.4 - '@parcel/utils': 2.15.4 + '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/diagnostic': 2.16.4 + '@parcel/logger': 2.16.4 + '@parcel/profiler': 2.16.4 + '@parcel/types-internal': 2.16.4 + '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: - napi-wasm '@popperjs/core@2.11.8': {} - '@swc/core-darwin-arm64@1.12.11': + '@swc/core-darwin-arm64@1.15.18': optional: true - '@swc/core-darwin-x64@1.12.11': + '@swc/core-darwin-x64@1.15.18': optional: true - '@swc/core-linux-arm-gnueabihf@1.12.11': + '@swc/core-linux-arm-gnueabihf@1.15.18': optional: true - '@swc/core-linux-arm64-gnu@1.12.11': + '@swc/core-linux-arm64-gnu@1.15.18': optional: true - '@swc/core-linux-arm64-musl@1.12.11': + '@swc/core-linux-arm64-musl@1.15.18': optional: true - '@swc/core-linux-x64-gnu@1.12.11': + '@swc/core-linux-x64-gnu@1.15.18': optional: true - '@swc/core-linux-x64-musl@1.12.11': + '@swc/core-linux-x64-musl@1.15.18': optional: true - '@swc/core-win32-arm64-msvc@1.12.11': + '@swc/core-win32-arm64-msvc@1.15.18': optional: true - '@swc/core-win32-ia32-msvc@1.12.11': + '@swc/core-win32-ia32-msvc@1.15.18': optional: true - '@swc/core-win32-x64-msvc@1.12.11': + '@swc/core-win32-x64-msvc@1.15.18': optional: true - '@swc/core@1.12.11(@swc/helpers@0.5.17)': + '@swc/core@1.15.18(@swc/helpers@0.5.19)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.23 + '@swc/types': 0.1.25 optionalDependencies: - '@swc/core-darwin-arm64': 1.12.11 - '@swc/core-darwin-x64': 1.12.11 - '@swc/core-linux-arm-gnueabihf': 1.12.11 - '@swc/core-linux-arm64-gnu': 1.12.11 - '@swc/core-linux-arm64-musl': 1.12.11 - '@swc/core-linux-x64-gnu': 1.12.11 - '@swc/core-linux-x64-musl': 1.12.11 - '@swc/core-win32-arm64-msvc': 1.12.11 - '@swc/core-win32-ia32-msvc': 1.12.11 - '@swc/core-win32-x64-msvc': 1.12.11 - '@swc/helpers': 0.5.17 + '@swc/core-darwin-arm64': 1.15.18 + '@swc/core-darwin-x64': 1.15.18 + '@swc/core-linux-arm-gnueabihf': 1.15.18 + '@swc/core-linux-arm64-gnu': 1.15.18 + '@swc/core-linux-arm64-musl': 1.15.18 + '@swc/core-linux-x64-gnu': 1.15.18 + '@swc/core-linux-x64-musl': 1.15.18 + '@swc/core-win32-arm64-msvc': 1.15.18 + '@swc/core-win32-ia32-msvc': 1.15.18 + '@swc/core-win32-x64-msvc': 1.15.18 + '@swc/helpers': 0.5.19 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.17': + '@swc/helpers@0.5.19': dependencies: tslib: 2.8.1 - '@swc/types@0.1.23': + '@swc/types@0.1.25': dependencies: '@swc/counter': 0.1.3 @@ -1638,24 +1647,23 @@ snapshots: dependencies: safe-buffer: 5.2.1 + baseline-browser-mapping@2.10.0: {} + bootstrap-icons@1.13.1: {} - bootstrap@5.3.7(@popperjs/core@2.11.8): + bootstrap@5.3.8(@popperjs/core@2.11.8): dependencies: '@popperjs/core': 2.11.8 - braces@3.0.3: + browserslist@4.28.1: dependencies: - fill-range: 7.1.1 + baseline-browser-mapping: 2.10.0 + caniuse-lite: 1.0.30001777 + electron-to-chromium: 1.5.307 + node-releases: 2.0.36 + update-browserslist-db: 1.2.3(browserslist@4.28.1) - browserslist@4.25.1: - dependencies: - caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.182 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) - - caniuse-lite@1.0.30001727: {} + caniuse-lite@1.0.30001777: {} chalk@4.1.2: dependencies: @@ -1680,7 +1688,7 @@ snapshots: detect-libc@1.0.3: {} - detect-libc@2.0.4: {} + detect-libc@2.1.2: {} dotenv-expand@11.0.7: dependencies: @@ -1688,14 +1696,10 @@ snapshots: dotenv@16.6.1: {} - electron-to-chromium@1.5.182: {} + electron-to-chromium@1.5.307: {} escalade@3.2.0: {} - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - get-port@4.2.0: {} globals@13.24.0: @@ -1704,7 +1708,7 @@ snapshots: has-flag@4.0.0: {} - immutable@5.1.3: {} + immutable@5.1.5: {} is-extglob@2.1.1: {} @@ -1712,63 +1716,65 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-number@7.0.0: {} - jquery@3.7.1: {} json5@2.2.3: {} - lightningcss-darwin-arm64@1.30.1: + lightningcss-android-arm64@1.31.1: optional: true - lightningcss-darwin-x64@1.30.1: + lightningcss-darwin-arm64@1.31.1: optional: true - lightningcss-freebsd-x64@1.30.1: + lightningcss-darwin-x64@1.31.1: optional: true - lightningcss-linux-arm-gnueabihf@1.30.1: + lightningcss-freebsd-x64@1.31.1: optional: true - lightningcss-linux-arm64-gnu@1.30.1: + lightningcss-linux-arm-gnueabihf@1.31.1: optional: true - lightningcss-linux-arm64-musl@1.30.1: + lightningcss-linux-arm64-gnu@1.31.1: optional: true - lightningcss-linux-x64-gnu@1.30.1: + lightningcss-linux-arm64-musl@1.31.1: optional: true - lightningcss-linux-x64-musl@1.30.1: + lightningcss-linux-x64-gnu@1.31.1: optional: true - lightningcss-win32-arm64-msvc@1.30.1: + lightningcss-linux-x64-musl@1.31.1: optional: true - lightningcss-win32-x64-msvc@1.30.1: + lightningcss-win32-arm64-msvc@1.31.1: optional: true - lightningcss@1.30.1: + lightningcss-win32-x64-msvc@1.31.1: + optional: true + + lightningcss@1.31.1: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.2 optionalDependencies: - lightningcss-darwin-arm64: 1.30.1 - lightningcss-darwin-x64: 1.30.1 - lightningcss-freebsd-x64: 1.30.1 - lightningcss-linux-arm-gnueabihf: 1.30.1 - lightningcss-linux-arm64-gnu: 1.30.1 - lightningcss-linux-arm64-musl: 1.30.1 - lightningcss-linux-x64-gnu: 1.30.1 - lightningcss-linux-x64-musl: 1.30.1 - lightningcss-win32-arm64-msvc: 1.30.1 - lightningcss-win32-x64-msvc: 1.30.1 + lightningcss-android-arm64: 1.31.1 + lightningcss-darwin-arm64: 1.31.1 + lightningcss-darwin-x64: 1.31.1 + lightningcss-freebsd-x64: 1.31.1 + lightningcss-linux-arm-gnueabihf: 1.31.1 + lightningcss-linux-arm64-gnu: 1.31.1 + lightningcss-linux-arm64-musl: 1.31.1 + lightningcss-linux-x64-gnu: 1.31.1 + lightningcss-linux-x64-musl: 1.31.1 + lightningcss-win32-arm64-msvc: 1.31.1 + lightningcss-win32-x64-msvc: 1.31.1 lmdb@2.8.5: dependencies: - msgpackr: 1.11.4 + msgpackr: 1.11.8 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.1.1 - ordered-binary: 1.6.0 + ordered-binary: 1.6.1 weak-lru-cache: 1.2.2 optionalDependencies: '@lmdb/lmdb-darwin-arm64': 2.8.5 @@ -1778,11 +1784,6 @@ snapshots: '@lmdb/lmdb-linux-x64': 2.8.5 '@lmdb/lmdb-win32-x64': 2.8.5 - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - msgpackr-extract@3.0.3: dependencies: node-gyp-build-optional-packages: 5.2.2 @@ -1795,7 +1796,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true - msgpackr@1.11.4: + msgpackr@1.11.8: optionalDependencies: msgpackr-extract: 3.0.3 @@ -1805,33 +1806,33 @@ snapshots: node-gyp-build-optional-packages@5.1.1: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.2 node-gyp-build-optional-packages@5.2.2: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.2 optional: true - node-releases@2.0.19: {} + node-releases@2.0.36: {} nullthrows@1.1.1: {} - ordered-binary@1.6.0: {} + ordered-binary@1.6.1: {} - parcel@2.15.4(@swc/helpers@0.5.17): + parcel@2.16.4(@swc/helpers@0.5.19): dependencies: - '@parcel/config-default': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17) - '@parcel/core': 2.15.4(@swc/helpers@0.5.17) - '@parcel/diagnostic': 2.15.4 - '@parcel/events': 2.15.4 - '@parcel/feature-flags': 2.15.4 - '@parcel/fs': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/logger': 2.15.4 - '@parcel/package-manager': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17) - '@parcel/reporter-cli': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/reporter-dev-server': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/reporter-tracer': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) - '@parcel/utils': 2.15.4 + '@parcel/config-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) + '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/diagnostic': 2.16.4 + '@parcel/events': 2.16.4 + '@parcel/feature-flags': 2.16.4 + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/logger': 2.16.4 + '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) + '@parcel/reporter-cli': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/reporter-tracer': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/utils': 2.16.4 chalk: 4.1.2 commander: 12.1.0 get-port: 4.2.0 @@ -1841,15 +1842,15 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@4.0.3: {} postcss-value-parser@4.2.0: {} - prettier-plugin-jinja-template@2.1.0(prettier@3.6.2): + prettier-plugin-jinja-template@2.1.0(prettier@3.8.1): dependencies: - prettier: 3.6.2 + prettier: 3.8.1 - prettier@3.6.2: {} + prettier@3.8.1: {} react-refresh@0.16.0: {} @@ -1859,15 +1860,15 @@ snapshots: safe-buffer@5.2.1: {} - sass@1.89.2: + sass@1.97.3: dependencies: chokidar: 4.0.3 - immutable: 5.1.3 + immutable: 5.1.5 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.1 + '@parcel/watcher': 2.5.6 - semver@7.7.2: {} + semver@7.7.4: {} source-map-js@1.2.1: {} @@ -1877,17 +1878,13 @@ snapshots: term-size@2.2.1: {} - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - tslib@2.8.1: {} type-fest@0.20.2: {} - update-browserslist-db@1.1.3(browserslist@4.25.1): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 From 1038deb2257ff369910ea877c7cb04079b02e07d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Fri, 13 Mar 2026 14:12:22 +0100 Subject: [PATCH 04/17] Fix page contacts page title --- controllers/contacts.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/contacts.go b/controllers/contacts.go index aa15e61..40fbfad 100644 --- a/controllers/contacts.go +++ b/controllers/contacts.go @@ -94,7 +94,7 @@ func Contacts(c *fiber.Ctx) error { db.Order("position asc").Find(&fields, "person_type = ?", "contact") return c.Render("people", fiber.Map{ - "PageTitle": "Contacts", + "PageTitle": "Sympathisants", "MembersPage": false, "People": results.Results, "Pagination": results.Pagination, From 76981f31c895288a28c4bbca4c4078e407770244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Fri, 13 Mar 2026 14:26:27 +0100 Subject: [PATCH 05/17] Fix flaw: was able to duplicate user emails because case sensitive check --- controllers/users.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/users.go b/controllers/users.go index 4c15889..8301fce 100644 --- a/controllers/users.go +++ b/controllers/users.go @@ -109,7 +109,7 @@ func UserAdd(c *fiber.Ctx) error { user.Email = data.Email var usersEmail []models.User - result := db.Find(&usersEmail, "email = ?", user.Email) + result := db.Find(&usersEmail, "LOWER(email) = LOWER(?)", user.Email) if result.Error != nil { return result.Error } From aeb43e4775857cd6637b390c86219a17ffa86916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Fri, 13 Mar 2026 14:42:40 +0100 Subject: [PATCH 06/17] Email is unique for people + start work on authelia integration --- .env.example | 1 + .gitignore | 1 + controllers/contacts.go | 24 ++++++++++++++++++++++++ controllers/members.go | 26 +++++++++++++++++++++++++- helpers/authelia/users.go | 1 + helpers/config.go | 3 +++ helpers/database.go | 1 + models/people.go | 27 +++++++++++++++++++++++++-- models/users.go | 2 +- 9 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 helpers/authelia/users.go diff --git a/.env.example b/.env.example index b8e1c1f..4c29ad7 100644 --- a/.env.example +++ b/.env.example @@ -5,3 +5,4 @@ APP_LISTEN_PORT=3000 APP_BEHIND_PROXY=false DATABASE_DSN="host=localhost user=camarades password=camarades dbname=camarades port=5432 sslmode=disable TimeZone=Europe/Zurich" SESSIONS_LOCATION=./sessions.db +AUTHELIA_USERS_LOCATION=./users.yml \ No newline at end of file diff --git a/.gitignore b/.gitignore index b6c620e..971cd36 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ static/assets pop-camarades *.db __debug_bin* +users.yml \ No newline at end of file diff --git a/controllers/contacts.go b/controllers/contacts.go index 40fbfad..d85afc6 100644 --- a/controllers/contacts.go +++ b/controllers/contacts.go @@ -495,6 +495,18 @@ func ContactAdd(c *fiber.Ctx) error { person.PostalCode = data.PostalCode person.City = data.City + if len(data.Email) > 0 { + var personEmail []models.Person + result := db.Find(&personEmail, "LOWER(email) = LOWER(?)", data.Email) + if result.Error != nil { + return result.Error + } + + if result.RowsAffected > 0 { + errors = append(errors, "L'adresse email est déjà utilisée par un membre ou un sympathisant") + } + } + sectionID, err := strconv.ParseUint(data.Section, 10, 0) if err == nil { for _, section := range sections { @@ -744,6 +756,18 @@ func ContactEdit(c *fiber.Ctx) error { person.PostalCode = data.PostalCode person.City = data.City + if len(data.Email) > 0 { + var personEmail []models.Person + result := db.Find(&personEmail, "LOWER(email) = LOWER(?)", data.Email) + if result.Error != nil { + return result.Error + } + + if result.RowsAffected > 0 { + errors = append(errors, "L'adresse email est déjà utilisée par un membre ou un sympathisant") + } + } + sectionID, err := strconv.ParseUint(data.Section, 10, 0) if err == nil { for _, section := range sections { diff --git a/controllers/members.go b/controllers/members.go index e1c0405..8e0f0c1 100644 --- a/controllers/members.go +++ b/controllers/members.go @@ -18,7 +18,7 @@ import ( type PersonValidation struct { LastName string `validate:"max=100"` FirstName string `validate:"required,min=1,max=100"` - Email string `validate:"max=100"` + Email string `validate:"max=100,email"` Phone string `validate:"max=100"` Mobile string `validate:"max=100"` Address1 string `validate:"max=100"` @@ -498,6 +498,18 @@ func MemberAdd(c *fiber.Ctx) error { } } + if len(data.Email) > 0 { + var personEmail []models.Person + result := db.Find(&personEmail, "LOWER(email) = LOWER(?)", data.Email) + if result.Error != nil { + return result.Error + } + + if result.RowsAffected > 0 { + errors = append(errors, "L'adresse email est déjà utilisée par un membre ou un sympathisant") + } + } + person.IsContact = false person.IsMember = true person.LastName = data.LastName @@ -747,6 +759,18 @@ func MemberEdit(c *fiber.Ctx) error { } } + if len(data.Email) > 0 { + var personEmail []models.Person + result := db.Find(&personEmail, "LOWER(email) = LOWER(?)", data.Email) + if result.Error != nil { + return result.Error + } + + if result.RowsAffected > 0 { + errors = append(errors, "L'adresse email est déjà utilisée par un membre ou un sympathisant") + } + } + person.IsContact = false person.IsMember = true person.LastName = data.LastName diff --git a/helpers/authelia/users.go b/helpers/authelia/users.go new file mode 100644 index 0000000..62bbf24 --- /dev/null +++ b/helpers/authelia/users.go @@ -0,0 +1 @@ +package authelia diff --git a/helpers/config.go b/helpers/config.go index e87443d..e6c0791 100644 --- a/helpers/config.go +++ b/helpers/config.go @@ -20,6 +20,9 @@ type Config struct { Sessions struct { Location string `env:"SESSIONS_LOCATION"` } + Authelia struct { + UsersLocation string `env:"AUTHELIA_USERS_LOCATION"` + } } var configParsed bool diff --git a/helpers/database.go b/helpers/database.go index 00ed2f8..73aacdf 100644 --- a/helpers/database.go +++ b/helpers/database.go @@ -52,6 +52,7 @@ func GetDatabase() (*gorm.DB, error) { &models.Role{}, &models.UserRole{}, &models.Person{}, + &models.PersonAccount{}, &models.List{}, &models.ListItem{}, &models.Field{}, diff --git a/models/people.go b/models/people.go index 8cab6a0..6086734 100644 --- a/models/people.go +++ b/models/people.go @@ -1,6 +1,11 @@ package models -import "gorm.io/gorm" +import ( + "time" + + "github.com/google/uuid" + "gorm.io/gorm" +) type Person struct { gorm.Model @@ -8,7 +13,7 @@ type Person struct { IsContact bool FirstName string LastName string - Email string + Email string `gorm:"unique"` Phone string Mobile string Address1 string @@ -18,3 +23,21 @@ type Person struct { SectionID uint Section Section } + +type PersonAccount struct { + gorm.Model + PersonID uint + Person Person + UUID uuid.UUID `gorm:"unique"` + Enabled bool + Email string `gorm:"unique"` + GivenName string + FamilyName string + DisplayName string + Groups string + InitialPassword string + InvitationSent time.Time + AccountReady bool + AccountCreated bool + UpdateNeeded bool +} diff --git a/models/users.go b/models/users.go index 367c020..8eb330d 100644 --- a/models/users.go +++ b/models/users.go @@ -10,7 +10,7 @@ import ( type User struct { gorm.Model Name string - Email string + Email string `gorm:"unique"` Password string TotpSecret sql.NullString IsAdmin bool From 07db65f63f9bb003b89a63cc7300d7a18e48e6b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Fri, 13 Mar 2026 14:50:38 +0100 Subject: [PATCH 07/17] Do not check email valid if email is empty --- controllers/contacts.go | 8 ++++++-- controllers/members.go | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/controllers/contacts.go b/controllers/contacts.go index d85afc6..7698f3c 100644 --- a/controllers/contacts.go +++ b/controllers/contacts.go @@ -462,7 +462,9 @@ func ContactAdd(c *fiber.Ctx) error { case "FirstName": errors = append(errors, "Le prénom est requis et ne peut pas contenir plus de 100 caractères") case "Email": - errors = append(errors, "L'adresse email doit être valide") + if len(data.Email) > 0 { + errors = append(errors, "L'adresse email doit être valide") + } case "Phone": errors = append(errors, "Le numéro de téléphone fixe est trop long") case "Mobile": @@ -723,7 +725,9 @@ func ContactEdit(c *fiber.Ctx) error { case "FirstName": errors = append(errors, "Le prénom est requis et ne peut pas contenir plus de 100 caractères") case "Email": - errors = append(errors, "L'adresse email doit être valide") + if len(data.Email) > 0 { + errors = append(errors, "L'adresse email doit être valide") + } case "Phone": errors = append(errors, "Le numéro de téléphone fixe est trop long") case "Mobile": diff --git a/controllers/members.go b/controllers/members.go index 8e0f0c1..f46b307 100644 --- a/controllers/members.go +++ b/controllers/members.go @@ -477,7 +477,9 @@ func MemberAdd(c *fiber.Ctx) error { case "FirstName": errors = append(errors, "Le prénom est requis et ne peut pas contenir plus de 100 caractères") case "Email": - errors = append(errors, "L'adresse email doit être valide") + if len(data.Email) > 0 { + errors = append(errors, "L'adresse email doit être valide") + } case "Phone": errors = append(errors, "Le numéro de téléphone fixe est trop long") case "Mobile": @@ -738,7 +740,9 @@ func MemberEdit(c *fiber.Ctx) error { case "FirstName": errors = append(errors, "Le prénom est requis et ne peut pas contenir plus de 100 caractères") case "Email": - errors = append(errors, "L'adresse email doit être valide") + if len(data.Email) > 0 { + errors = append(errors, "L'adresse email doit être valide") + } case "Phone": errors = append(errors, "Le numéro de téléphone fixe est trop long") case "Mobile": From 2e332b8f3eadd8e91547573c9308bd6c603e300e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Wed, 18 Mar 2026 19:17:25 +0100 Subject: [PATCH 08/17] Ability to create account for members --- controllers/contacts.go | 2 +- controllers/members.go | 57 +++++++++++++++++++++++++++++++++----- helpers/authelia/groups.go | 57 ++++++++++++++++++++++++++++++++++++++ models/people.go | 8 ++---- views/person_form.html | 30 ++++++++++++++++++-- 5 files changed, 138 insertions(+), 16 deletions(-) create mode 100644 helpers/authelia/groups.go diff --git a/controllers/contacts.go b/controllers/contacts.go index 7698f3c..1d1ed38 100644 --- a/controllers/contacts.go +++ b/controllers/contacts.go @@ -762,7 +762,7 @@ func ContactEdit(c *fiber.Ctx) error { if len(data.Email) > 0 { var personEmail []models.Person - result := db.Find(&personEmail, "LOWER(email) = LOWER(?)", data.Email) + result := db.Find(&personEmail, "LOWER(email) = LOWER(?) AND id <> ?", data.Email, person.ID) if result.Error != nil { return result.Error } diff --git a/controllers/members.go b/controllers/members.go index f46b307..569c3ad 100644 --- a/controllers/members.go +++ b/controllers/members.go @@ -8,11 +8,13 @@ import ( "time" "git.readonly.ch/bouzoure/pop-camarades/helpers" + "git.readonly.ch/bouzoure/pop-camarades/helpers/authelia" "git.readonly.ch/bouzoure/pop-camarades/helpers/database" "git.readonly.ch/bouzoure/pop-camarades/models" "github.com/charmbracelet/log" "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" + "github.com/google/uuid" ) type PersonValidation struct { @@ -636,6 +638,16 @@ func MemberAdd(c *fiber.Ctx) error { } } + if c.FormValue("account-enabled") == "on" { + personAccount := models.PersonAccount{ + PersonID: person.ID, + UUID: uuid.New(), + Enabled: true, + Groups: strings.Join(authelia.GetPersonGroups(person.ID), "|||"), + } + db.Create(&personAccount) + } + c.Redirect(fmt.Sprintf( "/members/%d", person.ID, @@ -714,6 +726,9 @@ func MemberEdit(c *fiber.Ctx) error { person.ID, ) + var personAccount models.PersonAccount + db.Find(&personAccount, "person_id = ?", person.ID) + var errors []string if c.Method() == "POST" { data := PersonValidation{ @@ -765,7 +780,7 @@ func MemberEdit(c *fiber.Ctx) error { if len(data.Email) > 0 { var personEmail []models.Person - result := db.Find(&personEmail, "LOWER(email) = LOWER(?)", data.Email) + result := db.Find(&personEmail, "LOWER(email) = LOWER(?) AND id <> ?", data.Email, person.ID) if result.Error != nil { return result.Error } @@ -906,6 +921,33 @@ func MemberEdit(c *fiber.Ctx) error { return result.Error } + if c.FormValue("account-enabled") == "on" && personAccount.ID <= 0 { + personAccount = models.PersonAccount{ + PersonID: person.ID, + UUID: uuid.New(), + Enabled: true, + Groups: strings.Join(authelia.GetPersonGroups(person.ID), "|||"), + } + db.Create(&personAccount) + } else if c.FormValue("account-enabled") == "on" && personAccount.ID > 0 { + personAccount.Enabled = true + personAccount.Groups = strings.Join(authelia.GetPersonGroups(person.ID), "|||") + + if personAccount.AccountCreated { + personAccount.UpdateNeeded = true + } + + db.Save(&personAccount) + } else if c.FormValue("account-enabled") != "on" && personAccount.ID > 0 { + personAccount.Enabled = false + + if personAccount.AccountCreated { + personAccount.UpdateNeeded = true + } + + db.Save(&personAccount) + } + c.Redirect(fmt.Sprintf( "/members/%d", person.ID, @@ -914,12 +956,13 @@ func MemberEdit(c *fiber.Ctx) error { } return c.Render("person_form", fiber.Map{ - "PageTitle": title, - "Person": person, - "Sections": sections, - "Fields": fields, - "FieldValues": fieldValues, - "Errors": errors, + "PageTitle": title, + "Person": person, + "Sections": sections, + "Fields": fields, + "FieldValues": fieldValues, + "PersonAccount": personAccount, + "Errors": errors, }) } diff --git a/helpers/authelia/groups.go b/helpers/authelia/groups.go new file mode 100644 index 0000000..4620b13 --- /dev/null +++ b/helpers/authelia/groups.go @@ -0,0 +1,57 @@ +package authelia + +import ( + "fmt" + "strings" + + "git.readonly.ch/bouzoure/pop-camarades/helpers" + "git.readonly.ch/bouzoure/pop-camarades/models" +) + +func GetPersonGroups(userid uint) []string { + var groups []string + + db, err := helpers.GetDatabase() + if err != nil { + return groups + } + + var person models.Person + db.Preload("Section").Find(&person, "id = ?", userid) + + if person.SectionID <= 0 { + return groups + } + + groups = append(groups, fmt.Sprintf( + "section_%s", + strings.ReplaceAll(person.Section.ShortName, " ", "_"), + )) + + if person.Section.ParentSectionID == nil { + return groups + } + + parentID := person.Section.ParentSectionID + for { + var section models.Section + db.Preload("parent_section").Find(§ion, "id = ?", parentID) + + if section.ID <= 0 { + return groups + } + + groups = append(groups, fmt.Sprintf( + "section_%s", + strings.ReplaceAll(section.ShortName, " ", "_"), + )) + + if section.ParentSectionID != nil { + parentID = person.Section.ParentSectionID + } else { + break + } + } + + return groups +} diff --git a/models/people.go b/models/people.go index 6086734..f711d97 100644 --- a/models/people.go +++ b/models/people.go @@ -1,7 +1,7 @@ package models import ( - "time" + "database/sql" "github.com/google/uuid" "gorm.io/gorm" @@ -30,13 +30,9 @@ type PersonAccount struct { Person Person UUID uuid.UUID `gorm:"unique"` Enabled bool - Email string `gorm:"unique"` - GivenName string - FamilyName string - DisplayName string Groups string InitialPassword string - InvitationSent time.Time + InvitationSent sql.NullTime AccountReady bool AccountCreated bool UpdateNeeded bool diff --git a/views/person_form.html b/views/person_form.html index b7c1081..eb81651 100644 --- a/views/person_form.html +++ b/views/person_form.html @@ -18,13 +18,13 @@ {% if Person.ID %} {% if Person.IsMember %} {% else %} @@ -345,6 +345,32 @@ {% endfor %} + + {% if Person.IsMember or MembersPage %} +
+ Compte POP Vaud +
+ +
+ + +
+ {% endif %} +
From 6654463aeea3c90932cb35db430ce1ddce027177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Thu, 30 Apr 2026 14:45:39 +0200 Subject: [PATCH 11/17] Authelia users sync --- go.mod | 15 +++-- go.sum | 45 ++++++++++++++ helpers/authelia/database.go | 74 +++++++++++++++++++++++ helpers/authelia/users.go | 111 +++++++++++++++++++++++++++++++++++ main.go | 13 ++++ 5 files changed, 252 insertions(+), 6 deletions(-) create mode 100644 helpers/authelia/database.go diff --git a/go.mod b/go.mod index 43925f7..10727bd 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module git.readonly.ch/bouzoure/pop-camarades -go 1.23.4 +go 1.25.0 require ( github.com/brianvoe/gofakeit/v7 v7.3.0 @@ -15,12 +15,13 @@ require ( github.com/google/uuid v1.6.0 github.com/pquerna/otp v1.5.0 github.com/yuin/goldmark v1.7.12 - golang.org/x/crypto v0.40.0 + golang.org/x/crypto v0.50.0 gorm.io/driver/postgres v1.6.0 gorm.io/gorm v1.30.0 ) require ( + github.com/alexedwards/argon2id v1.0.0 // indirect github.com/andybalholm/brotli v1.2.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/boombuler/barcode v1.0.2 // indirect @@ -64,14 +65,16 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/sethvargo/go-password v0.3.1 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.63.0 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.opencensus.io v0.24.0 // indirect + go.yaml.in/yaml/v4 v4.0.0-rc.4 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect - golang.org/x/net v0.42.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.34.0 // indirect - golang.org/x/text v0.27.0 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.43.0 // indirect + golang.org/x/text v0.36.0 // indirect google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/go.sum b/go.sum index 3f587d5..b18a195 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alexedwards/argon2id v1.0.0 h1:wJzDx66hqWX7siL/SRUmgz3F8YMrd/nfX/xHHcQQP0w= +github.com/alexedwards/argon2id v1.0.0/go.mod h1:tYKkqIjzXvZdzPvADMWOEZ+l6+BD6CtBXMj5fnJppiw= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -187,6 +189,8 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/sethvargo/go-password v0.3.1 h1:WqrLTjo7X6AcVYfC6R7GtSyuUQR9hGyAj/f1PYQZCJU= +github.com/sethvargo/go-password v0.3.1/go.mod h1:rXofC1zT54N7R8K/h1WDUdkf9BOx5OptoxrMBcrXzvs= github.com/shamaton/msgpack/v2 v2.2.3 h1:uDOHmxQySlvlUYfQwdjxyybAOzjlQsD1Vjy+4jmO9NM= github.com/shamaton/msgpack/v2 v2.2.3/go.mod h1:6khjYnkx73f7VQU7wjcFS9DFjs+59naVWJv1TB7qdOI= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -224,17 +228,24 @@ github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZ github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.7.12 h1:YwGP/rrea2/CnCtUHgjuolG/PnMxdQtPMO5PvaE2/nY= github.com/yuin/goldmark v1.7.12/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.yaml.in/yaml/v4 v4.0.0-rc.4 h1:UP4+v6fFrBIb1l934bDl//mmnoIZEDK0idg1+AIvX5U= +go.yaml.in/yaml/v4 v4.0.0-rc.4/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= @@ -243,6 +254,8 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -252,8 +265,14 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -261,22 +280,46 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -285,6 +328,8 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/helpers/authelia/database.go b/helpers/authelia/database.go new file mode 100644 index 0000000..47e0e62 --- /dev/null +++ b/helpers/authelia/database.go @@ -0,0 +1,74 @@ +package authelia + +import ( + "os" + + "git.readonly.ch/bouzoure/pop-camarades/helpers" + "go.yaml.in/yaml/v4" +) + +type AutheliaUser struct { + Password string `yaml:"password"` + DisplayName string `yaml:"displayname"` + Email string `yaml:"email"` + Groups []string `yaml:"groups"` + GivenName string `yaml:"given_name"` + MiddleName string `yaml:"middle_name"` + FamilyName string `yaml:"family_name"` + Nickname string `yaml:"nickname"` + Gender string `yaml:"gender"` + Birthdate string `yaml:"birthdate"` + Website string `yaml:"website"` + Profile string `yaml:"profile"` + Picture string `yaml:"picture"` + ZoneInfo string `yaml:"zoneinfo"` + Locale string `yaml:"locale"` + PhoneNumber string `yaml:"phone_number"` + PhoneExtension string `yaml:"phone_extension"` + Disabled bool `yaml:"disabled"` + Address any `yaml:"address"` + Extra map[string]any `yaml:"extra"` +} + +type AutheliaUsers struct { + Users map[string]AutheliaUser `yaml:"users"` +} + +func ReadDatabase() (AutheliaUsers, error) { + var users AutheliaUsers + + // Get config + config, err := helpers.GetConfig() + if err != nil { + return users, err + } + + // Read YAML file + filePath := config.Authelia.UsersLocation + fileContent, err := os.ReadFile(filePath) + if err != nil { + return users, err + } + + // Unmarshal YAML + err = yaml.Unmarshal(fileContent, &users) + + return users, err +} + +func WriteDatabase(users AutheliaUsers) error { + // Get config + config, err := helpers.GetConfig() + if err != nil { + return err + } + + // Marshal YAML + yamlData, err := yaml.Marshal(users) + if err != nil { + return err + } + + filePath := config.Authelia.UsersLocation + return os.WriteFile(filePath, yamlData, 0644) +} diff --git a/helpers/authelia/users.go b/helpers/authelia/users.go index 62bbf24..8c35b28 100644 --- a/helpers/authelia/users.go +++ b/helpers/authelia/users.go @@ -1 +1,112 @@ package authelia + +import ( + "fmt" + "strings" + "time" + + "git.readonly.ch/bouzoure/pop-camarades/helpers" + "git.readonly.ch/bouzoure/pop-camarades/models" + "github.com/alexedwards/argon2id" + "github.com/charmbracelet/log" + "github.com/sethvargo/go-password/password" +) + +func SyncUsers() error { + db, err := helpers.GetDatabase() + if err != nil { + return err + } + + var accounts []models.PersonAccount + result := db.Joins("Person").Find( + &accounts, "account_created IS NULL OR update_needed = ?", true, + ) + + if result.Error != nil { + return result.Error + } + + // If no accounts to create or update -> skip sync + if result.RowsAffected <= 0 { + return nil + } + + users, err := ReadDatabase() + if err != nil { + return err + } + + for _, account := range accounts { + accountExists := false + for uuid, user := range users.Users { + if uuid == account.UUID.String() { + accountExists = true + + // Update account + user.Disabled = !account.Enabled + user.Groups = strings.Split(account.Groups, "|||") + user.GivenName = account.Person.FirstName + user.FamilyName = account.Person.LastName + user.DisplayName = fmt.Sprintf("%s %s", + account.Person.FirstName, account.Person.LastName, + ) + user.Email = account.Person.Email + + // Overwrite old user struct + users.Users[uuid] = user + + // Exit loop early + break + } + } + + if !accountExists { + // Generate random password + randomPassword, err := password.Generate(64, 10, 10, false, false) + if err != nil { + log.Error(err) + continue + } + + argonParams := argon2id.Params{ + Iterations: 3, + Memory: 65536, + Parallelism: 4, + KeyLength: 32, + SaltLength: 16, + } + hashedPassword, err := argon2id.CreateHash(randomPassword, &argonParams) + if err != nil { + log.Error(err) + continue + } + + // Create account + user := AutheliaUser{ + Disabled: !account.Enabled, + Groups: strings.Split(account.Groups, "|||"), + GivenName: account.Person.FirstName, + FamilyName: account.Person.LastName, + DisplayName: fmt.Sprintf("%s %s", + account.Person.FirstName, account.Person.LastName, + ), + Email: account.Person.Email, + Password: hashedPassword, + } + + // Insert new user + users.Users[account.UUID.String()] = user + } + + account.UpdateNeeded = false + if !account.AccountCreated.Valid { + // TODO: send email + account.AccountCreated.Scan(time.Now()) + } + + db.Save(&account) + } + + return WriteDatabase(users) +} diff --git a/main.go b/main.go index 9c6bcdf..153f1d2 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "git.readonly.ch/bouzoure/pop-camarades/controllers" "git.readonly.ch/bouzoure/pop-camarades/helpers" + "git.readonly.ch/bouzoure/pop-camarades/helpers/authelia" "git.readonly.ch/bouzoure/pop-camarades/jobs" "git.readonly.ch/bouzoure/pop-camarades/middlewares" "github.com/flosch/pongo2/v6" @@ -57,6 +58,18 @@ func main() { // Note: jobs will be executed at launch and after every interval go helpers.RegisterJob(60*time.Minute, "clean saved sessions", jobs.CleanSavedSessions) + // Goroutine to update Authelia accounts in the background + go func() { + for { + err = authelia.SyncUsers() + if err != nil { + log.Error(err) + } + + time.Sleep(time.Minute) + } + }() + // Initialize the Pongo2 templating engine // If we are in dev mode, load templates from directory // Otherwise, use the templates embedded in the binary From 46c3a3015941549171648324d21df0acac3e8a68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Bouzour=C3=A8ne?= Date: Thu, 30 Apr 2026 14:48:34 +0200 Subject: [PATCH 12/17] Prettify templates --- views/person_form.html | 55 ++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/views/person_form.html b/views/person_form.html index 6df253a..9ecf3af 100644 --- a/views/person_form.html +++ b/views/person_form.html @@ -95,12 +95,12 @@ value="{{ Person.Email }}" autocomplete="off" /> - {% if PersonAccount.Enabled %} -
- Attention! Cette adresse email est liée à un compte SSO. - En cas de changement, la connexion devra se faire avec la nouvelle adresse. -
- {% endif %} + {% if PersonAccount.Enabled %} +
+ Attention! Cette adresse email est liée à un compte SSO. En cas de + changement, la connexion devra se faire avec la nouvelle adresse. +
+ {% endif %} @@ -351,31 +351,28 @@ {% endfor %} - - {% if Person.IsMember or MembersPage %} -
+ {% if Person.IsMember or MembersPage %} +
Compte POP Vaud
- -
- - -
- {% endif %} + +
+ + +
+ {% endif %}