diff --git a/.eslintrc.json b/.eslintrc.json index 9b888978e..d8a9cb89a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -18,9 +18,13 @@ "rules": { "@typescript-eslint/no-empty-function": "off", "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-namespace": "off", "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-unused-vars": "warn", + "@typescript-eslint/no-unused-vars": [ + "warn", + { "varsIgnorePattern": "^_" } + ], "no-console": ["warn", { "allow": ["warn", "error"] }], "no-empty": "off", "no-inner-declarations": "off", diff --git a/package-lock.json b/package-lock.json index e54aefe41..c5cd9a6be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,10 +43,10 @@ "eslint-plugin-n": "^16.0.2", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-solid": "^0.13.0", - "laravel-vite-plugin": "^0.7.8", + "laravel-vite-plugin": "^0.8.1", "postcss": "^8.4.29", "prettier": "^3.0.3", - "sass": "^1.66.1", + "sass": "^1.69.0", "tailwindcss": "^3.3.3", "typescript": "^5.2.2", "vite": "^4.4.9", @@ -175,31 +175,31 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", + "@babel/generator": "^7.23.0", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", - "convert-source-map": "^1.7.0", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -235,12 +235,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -334,22 +334,22 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -368,12 +368,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -392,16 +392,16 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -432,13 +432,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -494,9 +494,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -512,26 +512,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -611,9 +611,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -653,12 +653,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", - "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -688,15 +688,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.15.tgz", - "integrity": "sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz", + "integrity": "sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", "@babel/plugin-transform-typescript": "^7.22.15" }, "engines": { @@ -707,9 +707,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -732,19 +732,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", + "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -762,13 +762,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1143,9 +1143,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", + "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1175,9 +1175,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1262,16 +1262,16 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", - "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, "node_modules/@formatjs/ecma402-abstract": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.1.tgz", - "integrity": "sha512-N2sjSUrmsEoynG8Q61pkrKlJ9PxcUGxJke1x3301aGyprGgl58wHWhgGUnzTfS4OHNNNQDxzjcXVp1t5fGW6yQ==", + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.2.tgz", + "integrity": "sha512-k2mTh0m+IV1HRdU0xXM617tSQTi53tVR2muvYOsBeYcUgEAyxV1FOC7Qj279th3fBVQ+Dj6muvNJZcHSPNdbKg==", "dependencies": { - "@formatjs/intl-localematcher": "0.4.1", + "@formatjs/intl-localematcher": "0.4.2", "tslib": "^2.4.0" } }, @@ -1284,28 +1284,28 @@ } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.1.tgz", - "integrity": "sha512-dTDNupwdovxT1xDXC96zzPUua/XrxTQTOulJZSvaJP0pt3rr/cGR/tq4d7BnxY9oqPZpc4fjWBmrRlhcUyBSiw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.2.tgz", + "integrity": "sha512-nF/Iww7sc5h+1MBCDRm68qpHTCG4xvGzYs/x9HFcDETSGScaJ1Fcadk5U/NXjXeCtzD+DhN4BAwKFVclHfKMdA==", "dependencies": { - "@formatjs/ecma402-abstract": "1.17.1", - "@formatjs/icu-skeleton-parser": "1.6.1", + "@formatjs/ecma402-abstract": "1.17.2", + "@formatjs/icu-skeleton-parser": "1.6.2", "tslib": "^2.4.0" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.1.tgz", - "integrity": "sha512-/LQ6ovxYd8FQjVLmbV+WmuFy86o+JTc0cIQuWixuLuUMfRRif8eUQw3vPK5hx7C/g1UVmKAaOcYRTEsvyEGz9g==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.2.tgz", + "integrity": "sha512-VtB9Slo4ZL6QgtDFJ8Injvscf0xiDd4bIV93SOJTBjUF4xe2nAWOoSjLEtqIG+hlIs1sNrVKAaFo3nuTI4r5ZA==", "dependencies": { - "@formatjs/ecma402-abstract": "1.17.1", + "@formatjs/ecma402-abstract": "1.17.2", "tslib": "^2.4.0" } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.1.tgz", - "integrity": "sha512-Fs4MhhHlLC0RrspX2u2KP7zlwL9eHrBZsOBxaPOeqrCZYLaOUK4cYXQ1ErpAB0HnGV/GUXNa5smzV/7jCuRzxg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.2.tgz", + "integrity": "sha512-BGdtJFmaNJy5An/Zan4OId/yR9Ih1OojFjcduX/xOvq798OgWSyDtd6Qd5jqJXwJs1ipe4Fxu9+cshic5Ox2tA==", "dependencies": { "tslib": "^2.4.0" } @@ -1361,9 +1361,9 @@ } }, "node_modules/@internationalized/number": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.2.1.tgz", - "integrity": "sha512-hK30sfBlmB1aIe3/OwAPg9Ey0DjjXvHEiGVhNaOiBJl31G0B6wMaX8BN3ibzdlpyRNE9p7X+3EBONmxtJO9Yfg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.3.0.tgz", + "integrity": "sha512-PuxgnKE5NJMOGKUcX1QROo8jq7sW7UWLrL5B6Rfe8BdWgU/be04cVvLyCeALD46vvbAv3d1mUvyHav/Q9a237g==", "dependencies": { "@swc/helpers": "^0.5.0" } @@ -1635,28 +1635,28 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", + "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@tanstack/query-core": { - "version": "5.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.0.0-beta.20.tgz", - "integrity": "sha512-KTI6b4DLXq39n/VNLvWqxM0K/bmCyL5SvOfPGZ1cZGOvVfZxpo/81ZF9cuRDyPjInmzz8d8jUZOHZVJDKSDcvQ==", + "version": "5.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.0.0-rc.5.tgz", + "integrity": "sha512-Rht0Krzo7iYXmYTaa4YTS0OAFY4ZGFhvQ4p1t5IobUkuP9zGsFBb8EUh55GKZeRNuHb9WvLQWXCVgfY40PQYjA==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/solid-query": { - "version": "5.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@tanstack/solid-query/-/solid-query-5.0.0-beta.21.tgz", - "integrity": "sha512-cffdWkOD/FJn6RZB2wRLRCagACCZoZxtLbfWZURBuODcFwe766LACfdTkSvYO10fR8p1k1kIqOi1DqcdzQXlfg==", + "version": "5.0.0-rc.5", + "resolved": "https://registry.npmjs.org/@tanstack/solid-query/-/solid-query-5.0.0-rc.5.tgz", + "integrity": "sha512-ItlM4hBTXCvU8I9ygctvtupDstw9iMz1cWQwrKQ9Acj+1CGSiYWAM9xICRdVHS/To+Ro1R0fCAmzdtsqTYOO5A==", "dependencies": { - "@tanstack/query-core": "5.0.0-beta.20", + "@tanstack/query-core": "5.0.0-rc.5", "solid-js": "^1.7.8" }, "funding": { @@ -1668,11 +1668,11 @@ } }, "node_modules/@tanstack/solid-table": { - "version": "8.9.7", - "resolved": "https://registry.npmjs.org/@tanstack/solid-table/-/solid-table-8.9.7.tgz", - "integrity": "sha512-ecCCmfQqdmCOt4hPEFrqnL37anLeCCuh0ma6SJ4PmWjyeO7aE4ZoG1Bc1/clSjJM3QzDcK7xgxAAA1iNgwWjWw==", + "version": "8.10.6", + "resolved": "https://registry.npmjs.org/@tanstack/solid-table/-/solid-table-8.10.6.tgz", + "integrity": "sha512-QxdNgZrbLutHIPKmx2CdGAJMnp5pegnYJ2rBrpiSP4lGbfro+Eu9zOfxUCbXzMiCBn6j8Vgs8RiHCHHwf7UJag==", "dependencies": { - "@tanstack/table-core": "8.9.7" + "@tanstack/table-core": "8.10.6" }, "engines": { "node": ">=12" @@ -1686,9 +1686,9 @@ } }, "node_modules/@tanstack/table-core": { - "version": "8.9.7", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.9.7.tgz", - "integrity": "sha512-lkhVcGDxa9GSoDFPkplPDvzsiUACPZrxT3U1edPs0DCMKFhBDgZ7d1DPd7cqHH0JoybfbQ/qiTQYOQBg8sinJg==", + "version": "8.10.6", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.10.6.tgz", + "integrity": "sha512-9t8brthhAmCBIjzk7fCDa/kPKoLQTtA31l9Ir76jYxciTlHU61r/6gYm69XF9cbg9n88gVL5y7rNpeJ2dc1AFA==", "engines": { "node": ">=12" }, @@ -1707,9 +1707,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", + "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -1720,18 +1720,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", + "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", + "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -1739,18 +1739,18 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", + "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/eslint": { - "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "version": "8.44.3", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.3.tgz", + "integrity": "sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==", "dev": true, "dependencies": { "@types/estree": "*", @@ -1758,15 +1758,15 @@ } }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", + "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "node_modules/@types/json5": { @@ -1782,15 +1782,15 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", + "version": "20.8.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.3.tgz", + "integrity": "sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==", "dev": true }, "node_modules/@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", "dev": true }, "node_modules/@types/svgo": { @@ -1803,16 +1803,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.6.0.tgz", - "integrity": "sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.4.tgz", + "integrity": "sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/type-utils": "6.6.0", - "@typescript-eslint/utils": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/type-utils": "6.7.4", + "@typescript-eslint/utils": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1838,15 +1838,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.6.0.tgz", - "integrity": "sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.4.tgz", + "integrity": "sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/typescript-estree": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4" }, "engines": { @@ -1866,13 +1866,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz", - "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", + "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0" + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1883,13 +1883,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.6.0.tgz", - "integrity": "sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.4.tgz", + "integrity": "sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.6.0", - "@typescript-eslint/utils": "6.6.0", + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/utils": "6.7.4", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1910,9 +1910,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", - "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", + "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1923,13 +1923,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz", - "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", + "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/visitor-keys": "6.6.0", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1950,17 +1950,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.6.0.tgz", - "integrity": "sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.4.tgz", + "integrity": "sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.6.0", - "@typescript-eslint/types": "6.6.0", - "@typescript-eslint/typescript-estree": "6.6.0", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", "semver": "^7.5.4" }, "engines": { @@ -1975,12 +1975,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", - "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", + "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/types": "6.7.4", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2385,9 +2385,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/autoprefixer": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", - "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "dev": true, "funding": [ { @@ -2405,8 +2405,8 @@ ], "dependencies": { "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001520", - "fraction.js": "^4.2.0", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -2434,9 +2434,9 @@ } }, "node_modules/axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -2444,9 +2444,9 @@ } }, "node_modules/babel-plugin-jsx-dom-expressions": { - "version": "0.36.10", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.36.10.tgz", - "integrity": "sha512-QA2k/14WGw+RgcGGnEuLWwnu4em6CGhjeXtjvgOYyFHYS2a+CzPeaVQHDOlfuiBcjq/3hWMspHMIMnPEOIzdBg==", + "version": "0.36.18", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.36.18.tgz", + "integrity": "sha512-8K0CHgzNMB0+1OC+GQf1O49Nc6DfHAoWDjY4YTW3W/3il5KrDKAj65723oPmya68kKKOkqDKuz+Zh1u7VFHthw==", "dev": true, "dependencies": { "@babel/helper-module-imports": "7.18.6", @@ -2472,12 +2472,12 @@ } }, "node_modules/babel-preset-solid": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.7.7.tgz", - "integrity": "sha512-tdxVzx3kgcIjNXAOmGRbzIhFBPeJjSakiN9yM+IYdL/+LtXNnbGqb0Va5tJb8Sjbk+QVEriovCyuzB5T7jeTvg==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.7.12.tgz", + "integrity": "sha512-vNZn34Dv6IsWK/F59HhZlN8gP0ihZfkhPp8Lx/nxlY+rKtSZEAmmYlXWtds6EDKSiXoj2TEHuCcuqp6cO7oLSg==", "dev": true, "dependencies": { - "babel-plugin-jsx-dom-expressions": "^0.36.10" + "babel-plugin-jsx-dom-expressions": "^0.36.18" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -2527,9 +2527,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -2546,10 +2546,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2599,9 +2599,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001546", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz", + "integrity": "sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==", "dev": true, "funding": [ { @@ -2723,9 +2723,9 @@ "dev": true }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/cross-fetch": { @@ -2843,12 +2843,27 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2959,9 +2974,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.544", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.544.tgz", + "integrity": "sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w==", "dev": true }, "node_modules/entities": { @@ -2974,18 +2989,18 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", + "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", @@ -3001,23 +3016,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -3125,16 +3140,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.51.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -3220,9 +3235,9 @@ } }, "node_modules/eslint-config-standard-with-typescript": { - "version": "39.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-39.0.0.tgz", - "integrity": "sha512-CiV2LS4NUeeRmDTDf1ocUMpMxitSyW0g+Y/N7ecElwGj188GahbcQgqfBNyVsIXQxHlZVBlOjkbg3oUI0R3KBg==", + "version": "39.1.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-39.1.1.tgz", + "integrity": "sha512-t6B5Ep8E4I18uuoYeYxINyqcXb2UbC0SOOTxRtBSt2JUs+EzeXbfe2oaiPs71AIdnoWhXDO2fYOHz8df3kV84A==", "dev": true, "dependencies": { "@typescript-eslint/parser": "^6.4.0", @@ -3364,14 +3379,15 @@ } }, "node_modules/eslint-plugin-n": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz", - "integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.1.0.tgz", + "integrity": "sha512-3wv/TooBst0N4ND+pnvffHuz9gNPmk/NkLwAxOt2JykTl/hcuECe6yhTtLJcZjIxtZwN+GX92ACp/QTLpHA3Hg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", "eslint-plugin-es-x": "^7.1.0", + "get-tsconfig": "^4.7.0", "ignore": "^5.2.4", "is-core-module": "^2.12.1", "minimatch": "^3.1.2", @@ -3609,12 +3625,12 @@ } }, "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { - "flatted": "^3.2.7", + "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, @@ -3623,9 +3639,9 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/focus-trap": { @@ -3637,9 +3653,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -3783,6 +3799,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3816,9 +3844,9 @@ } }, "node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3890,13 +3918,10 @@ "dev": true }, "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, "engines": { "node": ">= 0.4.0" } @@ -4105,13 +4130,13 @@ } }, "node_modules/intl-messageformat": { - "version": "10.5.1", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.1.tgz", - "integrity": "sha512-irEmjxHq0f1MHviQr3Q4ToF9EgYbnXDq2/R9MRTTveGKHgy6VZ29hQxswu4trqWaX7T6njKxSoKVG92OSz0U5Q==", + "version": "10.5.3", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.3.tgz", + "integrity": "sha512-TzKn1uhJBMyuKTO4zUX47SU+d66fu1W9tVzIiZrQ6hBqQQeYscBMIzKL/qEXnFbJrH9uU5VV3+T5fWib4SIcKA==", "dependencies": { - "@formatjs/ecma402-abstract": "1.17.1", + "@formatjs/ecma402-abstract": "1.17.2", "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.6.1", + "@formatjs/icu-messageformat-parser": "2.6.2", "tslib": "^2.4.0" } }, @@ -4486,9 +4511,9 @@ "dev": true }, "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -4509,9 +4534,9 @@ "dev": true }, "node_modules/laravel-vite-plugin": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.7.8.tgz", - "integrity": "sha512-HWYqpQYHR3kEQ1LsHX7gHJoNNf0bz5z5mDaHBLzS+PGLCTmYqlU5/SZyeEgObV7z7bC/cnStYcY9H1DI1D5Udg==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.8.1.tgz", + "integrity": "sha512-fxzUDjOA37kOsYq8dP+3oPIlw8/kJVXwu0hOXLun82R1LpV02shGeWGYKx2lbpKffL5I0sfPPjfqbYxuqBluAA==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -5019,9 +5044,9 @@ } }, "node_modules/postcss": { - "version": "8.4.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", - "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -5239,14 +5264,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -5256,9 +5281,9 @@ } }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -5281,6 +5306,15 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -5307,9 +5341,9 @@ } }, "node_modules/rollup": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.0.tgz", - "integrity": "sha512-nszM8DINnx1vSS+TpbWKMkxem0CDWk3cSit/WWCBVs9/JZ1I/XLwOsiUglYuYReaeWWSsW9kge5zE5NZtf/a4w==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5378,9 +5412,9 @@ } }, "node_modules/sass": { - "version": "1.66.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", - "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", + "version": "1.69.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.0.tgz", + "integrity": "sha512-l3bbFpfTOGgQZCLU/gvm1lbsQ5mC/WnLz3djL2v4WCJBDrWm58PO+jgngcGRNnKUh6wSsdm50YaovTqskZ0xDQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -5417,6 +5451,20 @@ "node": ">=10" } }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5462,9 +5510,9 @@ } }, "node_modules/solid-icons": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/solid-icons/-/solid-icons-1.0.11.tgz", - "integrity": "sha512-shEL5Otrl73LPZukpanJKi6ISnQhpIvhqqAb8haKyCGrixHOYC6yGfNkSE7jpkKSikZ0rGtSMRiFETRrec2Uzw==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/solid-icons/-/solid-icons-1.0.12.tgz", + "integrity": "sha512-HOIQ2nFGLEH9/QHnMiu6CZkEMrRlrEvxpX3V3XikvQQ/CQNhOKl2vLQALaJYgz3MvfPP5wkid+q79tTdIw5YGQ==", "engines": { "node": ">= 16" }, @@ -5473,9 +5521,9 @@ } }, "node_modules/solid-js": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.7.11.tgz", - "integrity": "sha512-JkuvsHt8jqy7USsy9xJtT18aF9r2pFO+GB8JQ2XGTvtF49rGTObB46iebD25sE3qVNvIbwglXOXdALnJq9IHtQ==", + "version": "1.7.12", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.7.12.tgz", + "integrity": "sha512-QoyoOUKu14iLoGxjxWFIU8+/1kLT4edQ7mZESFPonsEXZ//VJtPKD8Ud1aTKzotj+MNWmSs9YzK6TdY+fO9Eww==", "dependencies": { "csstype": "^3.1.0", "seroval": "^0.5.0" @@ -5979,9 +6027,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -6030,9 +6078,9 @@ "dev": true }, "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", + "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==", "dev": true, "dependencies": { "esbuild": "^0.18.10", @@ -6161,9 +6209,9 @@ } }, "node_modules/vite-tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.1.tgz", + "integrity": "sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -6291,9 +6339,9 @@ } }, "node_modules/zod": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.2.tgz", - "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==", + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 3f6557235..1b1c61b7b 100644 --- a/package.json +++ b/package.json @@ -21,10 +21,10 @@ "eslint-plugin-n": "^16.0.2", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-solid": "^0.13.0", - "laravel-vite-plugin": "^0.7.8", + "laravel-vite-plugin": "^0.8.1", "postcss": "^8.4.29", "prettier": "^3.0.3", - "sass": "^1.66.1", + "sass": "^1.69.0", "tailwindcss": "^3.3.3", "typescript": "^5.2.2", "vite": "^4.4.9", diff --git a/resources/js/App.tsx b/resources/js/App.tsx index c154a42a6..3e8626bcc 100644 --- a/resources/js/App.tsx +++ b/resources/js/App.tsx @@ -1,4 +1,4 @@ -import {Outlet, Route, Routes, useParams} from "@solidjs/router"; +import {Navigate, Outlet, Route, Routes, useParams} from "@solidjs/router"; import {createQuery} from "@tanstack/solid-query"; import {AccessBarrier} from "components/utils"; import {System} from "data-access/memo-api"; @@ -19,7 +19,7 @@ const App: VoidComponent = () => { - + @@ -31,6 +31,7 @@ const App: VoidComponent = () => { component={RootPageWithFacility} > + } /> @@ -54,7 +55,7 @@ export default App; const UnknownNotFound: VoidComponent = () => ; -const AdminPages: VoidComponent = () => ( +const GlobalAdminPages: VoidComponent = () => ( diff --git a/resources/js/components/ui/Table/TQueryTable.tsx b/resources/js/components/ui/Table/TQueryTable.tsx index 6b70ca6e6..48a890d28 100644 --- a/resources/js/components/ui/Table/TQueryTable.tsx +++ b/resources/js/components/ui/Table/TQueryTable.tsx @@ -80,11 +80,11 @@ export interface TQueryTableProps { * A list of columns that are always included in the request (and available on the row objects), * even if they are not visible. */ - intrinsicColumns?: string[]; + intrinsicColumns?: readonly string[]; /** Additional column names. Their options are taken from `columnOptions`. */ - additionalColumns?: string[]; + additionalColumns?: readonly string[]; /** Overrides for the definition of specific columns. */ - columnOptions?: Partial>; + columnOptions?: Readonly>>; /** * The ordering of the columns. All the columns present on the backend and not present * in this list are placed at the end. @@ -94,12 +94,12 @@ export interface TQueryTableProps { * * In the current implementation the order of columns cannot be changed. */ - initialColumnsOrder?: string[]; - initialVisibleColumns?: string[]; + initialColumnsOrder?: readonly string[]; + initialVisibleColumns?: readonly string[]; initialSort?: SortingState; initialPageSize?: number; /** These columns are ignored and never shown. */ - ignoreColumns?: string[]; + ignoreColumns?: readonly string[]; /** Element to put below table, after the summary. */ customSectionBelowTable?: JSX.Element; } diff --git a/resources/js/components/utils/AccessBarrier.tsx b/resources/js/components/utils/AccessBarrier.tsx index a6739a8e8..93bb3834b 100644 --- a/resources/js/components/utils/AccessBarrier.tsx +++ b/resources/js/components/utils/AccessBarrier.tsx @@ -27,6 +27,9 @@ export interface AccessBarrierProps extends Pick(["facilityMember", "facilityClient", "facilityStaff", "facilityAdmin"]); + /** * Utility component that checks authentication * state and user's permissions @@ -52,18 +55,44 @@ export const AccessBarrier: ParentComponent = (props) => { props, ); const [queryBarrierProps, localProps] = splitProps(merged, ["Error", "Pending"]); + const needFacilityPermissions = () => localProps.roles.some((role) => FACILITY_ROLES.has(role)); + // Create the query even if it's not needed, it is fetched on all pages anyway. const facilitiesQuery = createQuery(System.facilitiesQueryOptions); - const facilityId = () => facilitiesQuery.data?.find(({url}) => url === localProps.facilityUrl)?.id; - - const statusQuery = createQuery(() => User.statusQueryOptions(facilityId())); - const accessGranted = () => - statusQuery.isSuccess && localProps.roles?.every((role) => statusQuery.data?.permissions[role]); - + const statusQuery = createQuery(() => { + // Only load the facility permissions if they are actually checked. + if (!needFacilityPermissions()) { + return User.statusQueryOptions(); + } + if (!facilitiesQuery.isSuccess) { + // Return a pending query, waiting for the facilities to resolve or appear. + // If the status is error, the outer QueryBarrier will show the error. + return {enabled: false, queryKey: ["pending"]}; + } + const facilityId = facilitiesQuery.data?.find(({url}) => url === localProps.facilityUrl)?.id; + if (facilityId) { + return User.statusWithFacilityPermissionsQueryOptions(facilityId); + } + return { + queryKey: ["error"], + queryFn: () => { + throw new Error(`Facility with URL ${localProps.facilityUrl} not found`); + }, + }; + }); + const accessGranted = () => { + if (!statusQuery.isSuccess) { + return false; + } + const permissions = statusQuery.data!.permissions as Partial>; + return localProps.roles?.every((role) => permissions[role]); + }; return ( - - }> - {merged.children} - + + + }> + {merged.children} + + ); }; diff --git a/resources/js/components/utils/InitializeTanstackQuery.tsx b/resources/js/components/utils/InitializeTanstackQuery.tsx index fb80e05f3..9ceb67685 100644 --- a/resources/js/components/utils/InitializeTanstackQuery.tsx +++ b/resources/js/components/utils/InitializeTanstackQuery.tsx @@ -3,24 +3,29 @@ import { QueryCache, QueryClient, QueryClientProvider, - createQuery, + useQueryClient, type MutationMeta, type QueryMeta, } from "@tanstack/solid-query"; import {isAxiosError} from "axios"; import {System, User} from "data-access/memo-api"; +import {SolidQueryOpts} from "data-access/memo-api/query_utils"; import {Api} from "data-access/memo-api/types"; -import {For, ParentComponent, Show, VoidComponent, createMemo} from "solid-js"; +import {For, ParentComponent, Show, VoidComponent, createMemo, createSignal} from "solid-js"; import toast from "solid-toast"; import {cx, useLangFunc} from "."; +import {translationsLoaded, translationsLoadedPromise} from "../../i18n_loader"; import {MemoLoader} from "../ui"; +/** A list of HTTP response status codes for which a toast should not be displayed. */ +type QuietHTTPStatuses = number[]; + declare module "@tanstack/query-core" { interface QueryMeta { - quietError?: boolean; + quietHTTPStatuses?: QuietHTTPStatuses; } interface MutationMeta { - quietError?: boolean; + quietHTTPStatuses?: QuietHTTPStatuses; isFormSubmit?: boolean; } } @@ -34,27 +39,35 @@ export const InitializeTanstackQuery: ParentComponent = (props) => { const t = useLangFunc(); function toastErrors(error: Error, meta?: Partial) { if (!isAxiosError(error)) return; - if ((error?.status && error.status >= 500) || !meta?.quietError) { - let errors = error.response?.data.errors; - if (meta?.isFormSubmit) { - // Validation errors will be handled by the form. - errors = errors?.filter((e) => !Api.isValidationError(e)); - } + const status = error.response?.status; + if (!status || !meta?.quietHTTPStatuses?.includes(status)) { + const respErrors = error.response?.data.errors; + const errors = meta?.isFormSubmit + ? // Validation errors will be handled by the form. + respErrors?.filter((e) => !Api.isValidationError(e)) + : respErrors; if (errors?.length) { - const errorMessages = errors.map((e) => - t(e.code, { - ...(Api.isValidationError(e) ? {attribute: e.field} : undefined), - ...e.data, - }), - ); - for (const msg of errorMessages) { - console.warn(`Error toast shown: ${msg}`); + if (!translationsLoaded()) { + for (const e of errors) { + console.warn("Error toast shown (translations not ready):", e); + } } - toast.error(() => ( -
    1})} style={{"overflow-wrap": "anywhere"}}> - {(msg) =>
  • {msg}
  • }
    -
- )); + translationsLoadedPromise.then(() => { + const messages = errors.map((e) => { + return t(e.code, { + ...(Api.isValidationError(e) ? {attribute: e.field} : undefined), + ...e.data, + }); + }); + for (const msg of messages) { + console.warn(`Error toast shown: ${msg}`); + } + toast.error(() => ( +
    1})} style={{"overflow-wrap": "anywhere"}}> + {(msg) =>
  • {msg}
  • }
    +
+ )); + }); } } } @@ -64,10 +77,14 @@ export const InitializeTanstackQuery: ParentComponent = (props) => { defaultOptions: { queries: { refetchOnReconnect: true, - refetchOnMount: false, - refetchOnWindowFocus: false, + // When opening a page, reload data if it's older than a couple of seconds. + staleTime: 5 * 1000, retry: false, - retryOnMount: false, + // This is very important. The default reconcile algorithm somehow breaks the data and + // reactivity in complicated ways. This line is basically `broken: false`. + // See https://github.com/TanStack/query/pull/6125 + // About `reconcile`: https://github.com/TanStack/query/pull/5287 + reconcile: false, }, }, queryCache: new QueryCache({ @@ -90,11 +107,16 @@ export const InitializeTanstackQuery: ParentComponent = (props) => { ); }; -/** Initialize some of the required queries beforehand, but don't block on them. */ +/** Prefetch some of the required queries beforehand. */ const InitQueries: VoidComponent = () => { - const queries = [createQuery(System.facilitiesQueryOptions), createQuery(User.statusQueryOptions)]; + const queryClient = useQueryClient(); + const fetchPromises = [System.facilitiesQueryOptions(), User.statusQueryOptions()].map((opts) => + queryClient.fetchQuery(opts as SolidQueryOpts), + ); + const [isPrefetching, setIsPrefetching] = createSignal(true); + Promise.allSettled(fetchPromises).then(() => setIsPrefetching(false)); return ( - q.isLoading)}> + ); diff --git a/resources/js/components/utils/QueryBarrier.tsx b/resources/js/components/utils/QueryBarrier.tsx index 0cd0ba435..c46e75d61 100644 --- a/resources/js/components/utils/QueryBarrier.tsx +++ b/resources/js/components/utils/QueryBarrier.tsx @@ -1,20 +1,20 @@ import {CreateQueryResult} from "@tanstack/solid-query"; -import {Match, ParentProps, Switch, VoidComponent, mergeProps} from "solid-js"; +import {Match, ParentProps, Switch, VoidComponent, mergeProps, on} from "solid-js"; import {BigSpinner} from "../ui"; +import {createEffect} from "solid-js"; export interface QueryBarrierProps { + /** List of queries to handle. */ + queries: CreateQueryResult[]; /** - * Component to show, when query is in error state + * If set, the barrier waits until the first fetch is done, even if data was available in the cache. + * See `Query.isFetchedAfterMount`. */ + ignoreCachedData?: boolean; + /** Component to show when query is in error state. */ Error?: VoidComponent; - /** - * Component to show, when query is in pending state - */ + /** Component to show when query is in pending state. */ Pending?: VoidComponent; - /** - * List of queries to handle - */ - queries: CreateQueryResult[]; } /** @@ -31,9 +31,23 @@ export function QueryBarrier(props: ParentProps) { }, props, ); - + createEffect( + // Don't rerun when fields on queries change, just the top level props. + on([() => props.queries, () => props.ignoreCachedData], ([queries, ignoreCachedData]) => { + if (ignoreCachedData) { + // We expect all queries to have fresh (not cached) data, so force fetch on those queries + // that didn't start their first fetch yet. + for (const query of queries) { + if (!query.isFetchedAfterMount && !query.isFetching) { + query.refetch(); + } + } + } + }), + ); const isError = () => merged.queries.some(({isError}) => isError); - const isSuccess = () => merged.queries.every(({isSuccess}) => isSuccess); + const isSuccess = () => + merged.queries.every((query) => query.isSuccess && (!props.ignoreCachedData || query.isFetchedAfterMount)); const isPending = () => !isError() && !isSuccess(); return ( diff --git a/resources/js/data-access/memo-api/groups/Admin.ts b/resources/js/data-access/memo-api/groups/Admin.ts index 3360e36f4..fdcaab3ea 100644 --- a/resources/js/data-access/memo-api/groups/Admin.ts +++ b/resources/js/data-access/memo-api/groups/Admin.ts @@ -28,9 +28,9 @@ export namespace Admin { const getUsersListBase = (request?: Api.Request.GetListParams, config?: Api.Config) => V1.get>("/admin/user/list", {...config, params: request}); - export const getUsersList = (request?: Api.Request.GetListParams, config?: Api.Config) => + const getUsersList = (request?: Api.Request.GetListParams, config?: Api.Config) => getUsersListBase(request, config).then(parseGetListResponse); - export const getUser = createGetFromList(getUsersListBase); + const getUser = createGetFromList(getUsersListBase); export const createMember = (member: Api.Request.Create, config?: Api.Config) => V1.post("/admin/member", member, config); diff --git a/resources/js/data-access/memo-api/groups/System.ts b/resources/js/data-access/memo-api/groups/System.ts index 4e0d6fd75..c97d4b90a 100644 --- a/resources/js/data-access/memo-api/groups/System.ts +++ b/resources/js/data-access/memo-api/groups/System.ts @@ -9,7 +9,7 @@ import {parseGetListResponse} from "../utils"; * @see {@link http://localhost:9081/api/documentation#/System local docs} */ export namespace System { - export const getFacilitiesList = (config?: Api.Config) => + const getFacilitiesList = (config?: Api.Config) => V1.get>("/system/facility/list", config).then(parseGetListResponse); export const keys = { @@ -23,6 +23,8 @@ export namespace System { ({ queryFn: ({signal}) => getFacilitiesList({signal}), queryKey: keys.facilityList(), + // Prevent refetching on every page. + staleTime: 10 * 60 * 1000, }) satisfies SolidQueryOptions; export function useInvalidator() { diff --git a/resources/js/data-access/memo-api/groups/User.ts b/resources/js/data-access/memo-api/groups/User.ts index 1ade0bfa6..265a57ddd 100644 --- a/resources/js/data-access/memo-api/groups/User.ts +++ b/resources/js/data-access/memo-api/groups/User.ts @@ -10,7 +10,7 @@ import {parseGetResponse} from "../utils"; * @see {@link http://localhost:9081/api/documentation#/User local docs} */ export namespace User { - export const getStatus = (facilityId?: string, config?: Api.Config) => + const getStatus = (facilityId?: string, config?: Api.Config) => V1.get>(facilityId ? `/user/status/${facilityId}` : "/user/status", config).then( parseGetResponse, ); @@ -42,19 +42,49 @@ export namespace User { export const keys = { all: () => ["user"] as const, - status: (facilityId?: string) => [...keys.all(), "status", facilityId] as const, + statusAll: () => [...keys.all(), "status"] as const, + status: (facilityId?: string) => [...keys.statusAll(), facilityId] as const, }; - export const statusQueryOptions = (facilityId?: string) => + type PermissionsFacilityKeys = "facilityId" | "facilityMember" | "facilityClient" | "facilityStaff" | "facilityAdmin"; + // Ensure these are really keys. + type _FacilityPermissions = Pick; + + export type GetStatusWithoutFacilityData = { + user: UserResource; + permissions: Omit; + members: MemberResource[]; + }; + + const STATUS_QUERY_OPTIONS = { + // Prevent refetching on every page. + staleTime: 10 * 60 * 1000, + /** Prevent displaying toast when user is not logged in - the login page will be displayed. */ + meta: {quietHTTPStatuses: [401]}, + }; + + /** Query options for user status, without facility permissions. */ + export const statusQueryOptions = () => + ({ + // As a possible optimisation, this query could try to reuse any query with facility permissions, + // that happens to be active. + queryFn: ({signal}): Promise => getStatus(undefined, {signal}), + queryKey: keys.status(), + ...STATUS_QUERY_OPTIONS, + }) satisfies SolidQueryOptions; + + /** Query options for user status with facility permissions. */ + export const statusWithFacilityPermissionsQueryOptions = (facilityId: string) => ({ queryFn: ({signal}) => getStatus(facilityId, {signal}), queryKey: keys.status(facilityId), - }) satisfies SolidQueryOptions; + ...STATUS_QUERY_OPTIONS, + }) satisfies SolidQueryOptions; export function useInvalidator() { const queryClient = useQueryClient(); return { - status: () => queryClient.invalidateQueries({queryKey: keys.status()}), + statusAndFacilityPermissions: () => queryClient.invalidateQueries({queryKey: keys.statusAll()}), }; } } diff --git a/resources/js/data-access/memo-api/resources/adminUser.resource.ts b/resources/js/data-access/memo-api/resources/adminUser.resource.ts index d92ed29ff..975322b56 100644 --- a/resources/js/data-access/memo-api/resources/adminUser.resource.ts +++ b/resources/js/data-access/memo-api/resources/adminUser.resource.ts @@ -26,7 +26,7 @@ export type AdminUserResource = { * @type {string(uuid)} * @example '67da972b-34d7-4f89-b8ae-322d96b4954d' */ - lastLoginFacilityId: string; + lastLoginFacilityId: string | null; passwordExpireAt: string | null; hasPassword: boolean; createdAt: string; diff --git a/resources/js/data-access/memo-api/tquery/table.ts b/resources/js/data-access/memo-api/tquery/table.ts index 2ebed482b..6e7317731 100644 --- a/resources/js/data-access/memo-api/tquery/table.ts +++ b/resources/js/data-access/memo-api/tquery/table.ts @@ -21,7 +21,7 @@ const DEFAULT_PAGE_SIZE = 50; /** * Returns visibility state with visibility of all the columns set explicitly to the given value. */ -function allColumnsVisibility(schema: Schema, additionalColumns: string[], {visible = true} = {}) { +function allColumnsVisibility(schema: Schema, additionalColumns: readonly string[], {visible = true} = {}) { const visibility: VisibilityState = {}; for (const {name} of schema.columns) { visibility[name] = visible; @@ -47,9 +47,9 @@ export function createTableRequestCreator({ initialPageSize = DEFAULT_PAGE_SIZE, }: { intrinsicFilter?: Accessor; - intrinsicColumns?: Accessor; - additionalColumns?: string[]; - initialVisibleColumns?: string[]; + intrinsicColumns?: Accessor; + additionalColumns?: readonly string[]; + initialVisibleColumns?: readonly string[]; initialSort?: SortingState; initialPageSize?: number; }): RequestCreator { @@ -126,47 +126,42 @@ export function createTableRequestCreator({ setPagination((prev) => ({...prev, pageIndex: 0})); }), ); - const columns = createMemo( - on([schema, intrinsicColumns, columnVisibility], ([schema, intrinsicColumns, columnVisibility]) => { - if (!schema) { - return []; - } - return [ - ...new Set([ - ...schema.columns.map(({name}) => name).filter((name) => columnVisibility[name] !== false), - ...(intrinsicColumns || []), - ]), - ].map((column) => ({type: "column", column})); - }), - ); - const request = createMemo( - on( - [intrinsicFilter, schema, allInited, columns, debouncedGlobalFilter, columnFiltersJoined, sorting, pagination], - ([intrinsicFilter, schema, allInited, columns, globalFilter, columnFiltersJoined, sorting, pagination]) => { - if (!schema || !allInited) { - return undefined; - } - const request: DataRequest = { - columns, - filter: filterReductor()?.reduce({ - type: "op", - op: "&", - val: [intrinsicFilter, buildFuzzyGlobalFilter(globalFilter), columnFiltersJoined].filter(NON_NULLABLE), - }), - sort: sorting.map(({id, desc}) => ({ - type: "column", - column: id, - desc, - })), - paging: { - number: pagination.pageIndex + 1, - size: pagination.pageSize, - }, - }; - return request; + const columns = createMemo(() => { + const sch = schema(); + if (!sch) { + return []; + } + return [ + ...new Set([ + ...sch.columns.map(({name}) => name).filter((name) => columnVisibility()[name] !== false), + ...(intrinsicColumns() || []), + ]), + ].map((column) => ({type: "column", column})); + }); + const request = createMemo((): DataRequest | undefined => { + if (!schema() || !allInited()) { + return undefined; + } + return { + columns: columns(), + filter: filterReductor()?.reduce({ + type: "op", + op: "&", + val: [intrinsicFilter(), buildFuzzyGlobalFilter(debouncedGlobalFilter()), columnFiltersJoined()].filter( + NON_NULLABLE, + ), + }), + sort: sorting().map(({id, desc}) => ({ + type: "column", + column: id, + desc, + })), + paging: { + number: pagination().pageIndex + 1, + size: pagination().pageSize, }, - ), - ); + }; + }); return { request, requestController: { @@ -176,7 +171,7 @@ export function createTableRequestCreator({ columnFilter: (column) => columnFilters()[column]!, sorting: [sorting, setSorting], pagination: [pagination, setPagination], - } satisfies RequestController, + }, }; }; } diff --git a/resources/js/data-access/memo-api/tquery/tquery.ts b/resources/js/data-access/memo-api/tquery/tquery.ts index ea6e90d4e..40d63fad6 100644 --- a/resources/js/data-access/memo-api/tquery/tquery.ts +++ b/resources/js/data-access/memo-api/tquery/tquery.ts @@ -1,5 +1,5 @@ import {createQuery, keepPreviousData} from "@tanstack/solid-query"; -import {Accessor, createComputed, createMemo, createSignal, on} from "solid-js"; +import {Accessor, createComputed, createSignal} from "solid-js"; import {SetStoreFunction, createStore} from "solid-js/store"; import {DataItem, DataRequest, DataResponse, Schema} from "."; import {V1} from "../config"; @@ -80,16 +80,7 @@ export function createTQuery({ ...dataQueryOptions, }) satisfies SolidQueryOpts>, ); - // There seems to be a bug in TanStack Query v5 - the identity of data does not change - // when data is loaded from the cache. The code below fixes that. - const data = createMemo( - on( - () => dataQuery.dataUpdatedAt, - () => [...(dataQuery.data?.data || EMPTY_DATA)], - ), - ); - // This should work but doesn't: - // const data = () => dataQuery.data?.data || EMPTY_DATA; + const data = () => dataQuery.data?.data || EMPTY_DATA; return { schema, requestController, diff --git a/resources/js/features/authentication/forms/login/Login.form.tsx b/resources/js/features/authentication/forms/login/Login.form.tsx index f9888ebbf..1af1bfedd 100644 --- a/resources/js/features/authentication/forms/login/Login.form.tsx +++ b/resources/js/features/authentication/forms/login/Login.form.tsx @@ -30,7 +30,7 @@ export namespace LoginForm { const mutation = createMutation(() => ({ mutationFn: User.login, onSuccess() { - invalidateUser.status(); + invalidateUser.statusAndFacilityPermissions(); props.onSuccess?.(); }, meta: {isFormSubmit: true}, diff --git a/resources/js/features/authentication/pages/Login.page.tsx b/resources/js/features/authentication/pages/Login.page.tsx index f481fc94b..c8fcf248a 100644 --- a/resources/js/features/authentication/pages/Login.page.tsx +++ b/resources/js/features/authentication/pages/Login.page.tsx @@ -15,10 +15,7 @@ import {LoginForm} from "../forms/login"; * otherwise. */ const LoginPage: VoidComponent = () => { - const statusQuery = createQuery(() => ({ - ...User.statusQueryOptions(), - meta: {quietError: true}, - })); + const statusQuery = createQuery(User.statusQueryOptions); createEffect(() => { if (statusQuery.isSuccess) { diff --git a/resources/js/features/facility-edit/FacilityCreateForm.tsx b/resources/js/features/facility-edit/FacilityCreateForm.tsx index 4643d444a..ad0aaec9f 100644 --- a/resources/js/features/facility-edit/FacilityCreateForm.tsx +++ b/resources/js/features/facility-edit/FacilityCreateForm.tsx @@ -24,10 +24,13 @@ export const FacilityCreateForm: VoidComponent = (props) => { name: values.name, url: values.url, }); - adminInvalidator.facilities(); - systemInvalidator.facilities(); toast.success(t("forms.facility_create.success")); props.onSuccess?.(); + // Important: Invalidation should happen after calling onSuccess which typically closes the form. + // Otherwise the queries used by this form start fetching data immediately, which not only makes no sense, + // but also causes problems apparently. + adminInvalidator.facilities(); + systemInvalidator.facilities(); } return ; diff --git a/resources/js/features/root/components/header/FacilityControl.tsx b/resources/js/features/root/components/header/FacilityControl.tsx index dd34c6292..159c44491 100644 --- a/resources/js/features/root/components/header/FacilityControl.tsx +++ b/resources/js/features/root/components/header/FacilityControl.tsx @@ -9,7 +9,7 @@ export const FacilityControl: VoidComponent = () => { const params = useParams(); const facilitiesQuery = createQuery(System.facilitiesQueryOptions); - const statusQuery = createQuery(() => User.statusQueryOptions()); + const statusQuery = createQuery(User.statusQueryOptions); const facilities = createMemo( () => @@ -51,7 +51,7 @@ export const FacilityControl: VoidComponent = () => { const url = facilities().find((facility) => facility.id === e.target.value)?.url; setActiveFacilityId(e.target.value); - if (url) navigate(`/${url}/home`); + if (url) navigate(`/${url}`); }} > {(facility) => } diff --git a/resources/js/features/root/components/header/UserInfo.tsx b/resources/js/features/root/components/header/UserInfo.tsx index e909c159e..87b62b0b1 100644 --- a/resources/js/features/root/components/header/UserInfo.tsx +++ b/resources/js/features/root/components/header/UserInfo.tsx @@ -1,20 +1,23 @@ -import {createMutation, createQuery, useQueryClient} from "@tanstack/solid-query"; +import {createMutation, createQuery} from "@tanstack/solid-query"; import {DATE_TIME_WITH_WEEKDAY_FORMAT, currentTime, useLangFunc} from "components/utils"; import {User} from "data-access/memo-api"; import {PasswordChangeForm} from "features/user-panel"; import {HiOutlineCheckCircle, HiOutlinePower, HiOutlineXCircle} from "solid-icons/hi"; import {TbPassword} from "solid-icons/tb"; -import {Index, Match, Switch} from "solid-js"; +import {Index, Match, Switch, VoidComponent} from "solid-js"; +import {setActiveFacilityId} from "state/activeFacilityId.state"; -export const UserInfo = () => { +export const UserInfo: VoidComponent = () => { const t = useLangFunc(); - const statusQuery = createQuery(() => User.statusQueryOptions()); + const statusQuery = createQuery(User.statusQueryOptions); - const queryClient = useQueryClient(); + const invalidate = User.useInvalidator(); const logout = createMutation(() => ({ mutationFn: () => User.logout(), onSuccess() { - queryClient.invalidateQueries({queryKey: User.keys.status()}); + setActiveFacilityId(undefined); + // Invalidate as the last operation to avoid starting unnecessary queries that are later cancelled. + invalidate.statusAndFacilityPermissions(); }, })); @@ -27,7 +30,9 @@ export const UserInfo = () => { - +
+ +
diff --git a/resources/js/features/root/pages/AdminFacilitiesList.page.tsx b/resources/js/features/root/pages/AdminFacilitiesList.page.tsx index c53df622f..c8920d1a7 100644 --- a/resources/js/features/root/pages/AdminFacilitiesList.page.tsx +++ b/resources/js/features/root/pages/AdminFacilitiesList.page.tsx @@ -1,7 +1,7 @@ import {A} from "@solidjs/router"; import {Button, createTableTranslations} from "components/ui"; import {TQueryTable} from "components/ui/Table/TQueryTable"; -import {AccessBarrier, useLangFunc} from "components/utils"; +import {useLangFunc} from "components/utils"; import {Admin} from "data-access/memo-api/groups/Admin"; import {FacilityCreateModal, showFacilityCreateModal} from "features/facility-edit/FacilityCreateModal"; import {BsHouseAdd} from "solid-icons/bs"; @@ -10,7 +10,7 @@ import {Component} from "solid-js"; export default (() => { const t = useLangFunc(); return ( - + <> { columnDef: { cell: (c) => { const href = () => `/${c.getValue()}`; + // TODO: The link can be inaccessible for the current user, handle this better. return {href()}; }, }, @@ -62,6 +63,6 @@ export default (() => { } /> - + ); }) satisfies Component; diff --git a/resources/js/features/root/pages/AdminUsersList.page.tsx b/resources/js/features/root/pages/AdminUsersList.page.tsx index dd9b1ed17..a29f3d8b7 100644 --- a/resources/js/features/root/pages/AdminUsersList.page.tsx +++ b/resources/js/features/root/pages/AdminUsersList.page.tsx @@ -1,6 +1,6 @@ import {AUTO_SIZE_COLUMN_DEFS, Button, Email, cellFunc, createTableTranslations} from "components/ui"; import {TQueryTable} from "components/ui/Table/TQueryTable"; -import {AccessBarrier, useLangFunc} from "components/utils"; +import {useLangFunc} from "components/utils"; import {Admin} from "data-access/memo-api/groups"; import {UserCreateForm, UserEditForm} from "features/users-edit"; import {FiEdit2} from "solid-icons/fi"; @@ -10,7 +10,7 @@ import {VoidComponent} from "solid-js"; export default (() => { const t = useLangFunc(); return ( - + <> { /> - + ); }) satisfies VoidComponent; diff --git a/resources/js/features/user-panel/PasswordChange.form.tsx b/resources/js/features/user-panel/PasswordChange.form.tsx index 1373f8944..7881ffca1 100644 --- a/resources/js/features/user-panel/PasswordChange.form.tsx +++ b/resources/js/features/user-panel/PasswordChange.form.tsx @@ -37,7 +37,7 @@ export namespace PasswordChangeForm { const mutation = createMutation(() => ({ mutationFn: User.changePassword, onSuccess() { - invalidateUser.status(); + invalidateUser.statusAndFacilityPermissions(); // For better integration with password managers. // https://www.chromium.org/developers/design-documents/create-amazing-password-forms/ history.replaceState({passwordChanged: true}, ""); diff --git a/resources/js/features/users-edit/UserEdit.form.tsx b/resources/js/features/users-edit/UserEdit.form.tsx index a1aa224a4..31e3ac9b8 100644 --- a/resources/js/features/users-edit/UserEdit.form.tsx +++ b/resources/js/features/users-edit/UserEdit.form.tsx @@ -23,9 +23,11 @@ export namespace UserEditForm { export const Component: VoidComponent = (props) => { const t = useLangFunc(); const statusQuery = createQuery(User.statusQueryOptions); + // eslint-disable-next-line solid/reactivity const userQuery = createQuery(() => Admin.userQueryOptions(props.userId)); const user = () => userQuery.data; - const invalidate = Admin.useInvalidator(); + const adminInvalidate = Admin.useInvalidator(); + const userInvalidate = User.useInvalidator(); const userMutation = createMutation(() => ({ mutationFn: Admin.updateUser, meta: {isFormSubmit: true}, @@ -34,9 +36,19 @@ export namespace UserEditForm { async function updateUser(values: UserEdit.Output, ctx: SubmitContext) { const oldUser = user()!; - if (oldUser.id === statusQuery.data?.user.id && oldUser.hasGlobalAdmin && !values.hasGlobalAdmin) { - ctx.setErrors("hasGlobalAdmin", t("forms.user_edit.validation.cannot_remove_own_global_admin")); - return; + if (oldUser.id === statusQuery.data?.user.id) { + let err = false; + if (oldUser.hasGlobalAdmin && !values.hasGlobalAdmin) { + ctx.setErrors("hasGlobalAdmin", t("forms.user_edit.validation.cannot_remove_own_global_admin")); + err = true; + } + if (oldUser.hasEmailVerified && !values.hasEmailVerified) { + ctx.setErrors("hasEmailVerified", t("forms.user_edit.validation.cannot_remove_own_email_verified")); + err = true; + } + if (err) { + return; + } } // First mutate the user fields (without the members). await userMutation.mutateAsync({ @@ -68,17 +80,23 @@ export namespace UserEditForm { // them fails, otherwise invalidation might happen before the final changes. try { await Promise.allSettled(membersUpdater.getUpdatePromises(oldUser, values.members)); + toast.success(t("forms.user_edit.success")); + props.onSuccess?.(); } finally { // Invalidate the user even after partial success (e.g. only user edit succeeded), or when there were // no member mutations. - invalidate.users(); + // Important: Invalidation should happen after calling onSuccess which typically closes the form. + // Otherwise the queries used by this form start fetching data immediately, which not only makes no sense, + // but also causes problems apparently. + adminInvalidate.users(); + if (oldUser.id === statusQuery.data?.user.id) { + userInvalidate.statusAndFacilityPermissions(); + } } - toast.success(t("forms.user_edit.success")); - props.onSuccess?.(); } return ( - + + i18next.use(I18NextHttpBackend).on("loaded", resolve), +); + +const [getTranslationsLoaded, setTranslationsLoaded] = createSignal(false); +translationsLoadedPromise.then(() => setTranslationsLoaded(true)); + +export const translationsLoaded = getTranslationsLoaded; diff --git a/resources/js/index.tsx b/resources/js/index.tsx index 7f6c70602..4958a9992 100644 --- a/resources/js/index.tsx +++ b/resources/js/index.tsx @@ -3,14 +3,13 @@ import {TransProvider} from "@mbarzda/solid-i18next"; import {MetaProvider} from "@solidjs/meta"; import {Router} from "@solidjs/router"; import {InitializeTanstackQuery} from "components/utils"; -import i18next from "i18next"; -import I18NextHttpBackend from "i18next-http-backend"; import {Settings} from "luxon"; -import {Show, createSignal} from "solid-js"; +import {Show} from "solid-js"; import {render} from "solid-js/web"; import {Toaster} from "solid-toast"; import App from "./App"; import {LoaderInPortal, MemoLoader} from "./components/ui"; +import {translationsLoaded} from "./i18n_loader"; import "./index.scss"; const root = document.getElementById("root"); @@ -27,9 +26,6 @@ declare module "luxon" { } render(() => { - const [transLoaded, setTransLoaded] = createSignal(false); - i18next.use(I18NextHttpBackend).on("loaded", () => setTransLoaded(true)); - return ( { pluralSeparator: "__", }} > - + {/* Show the loader until the translations are loaded. The page is displayed underneath, and the strings will get updated reactively when the translations are ready. */} diff --git a/resources/js/state/activeFacilityId.state.ts b/resources/js/state/activeFacilityId.state.ts index fa53a41fa..d24a65d22 100644 --- a/resources/js/state/activeFacilityId.state.ts +++ b/resources/js/state/activeFacilityId.state.ts @@ -1,3 +1,4 @@ import {createSignal} from "solid-js"; +/** The facility selected in the page header, or undefined when not set. */ export const [activeFacilityId, setActiveFacilityId] = createSignal(); diff --git a/resources/lang/pl_PL/forms.yml b/resources/lang/pl_PL/forms.yml index 210037b96..3c42d6730 100644 --- a/resources/lang/pl_PL/forms.yml +++ b/resources/lang/pl_PL/forms.yml @@ -30,6 +30,7 @@ user_edit: has_password_requires_email: "Aby móc się logować do Memo, użytkownik musi mieć ustawiony adres e-mail" validation: cannot_remove_own_global_admin: "Użytkownik nie może odebrać sobie uprawnień globalnego administratora." + cannot_remove_own_email_verified: "Użytkownik nie może ustawić własnego adresu email jako niezweryfikowany." submit: "$t(actions.save)" success: "Pomyślnie zmieniono dane użytkownika" diff --git a/resources/lang/pl_PL/index.yml b/resources/lang/pl_PL/index.yml index bdf371578..66e61e29c 100644 --- a/resources/lang/pl_PL/index.yml +++ b/resources/lang/pl_PL/index.yml @@ -22,6 +22,8 @@ auth: password: "Hasło jest nieprawidłowe." throttle: "Za dużo nieudanych prób logowania. Proszę spróbować za {{seconds}} sekund." +unverified_user: "Użytkownik niezweryfikowany" + bool_values: yes: "Tak" no: "Nie" diff --git a/resources/lang/pl_PL/models.yml b/resources/lang/pl_PL/models.yml index 3e8d9e4dc..e77c841bc 100644 --- a/resources/lang/pl_PL/models.yml +++ b/resources/lang/pl_PL/models.yml @@ -23,7 +23,7 @@ facility: _name: "placówka" _name_plural: "placówki" name: "$t(models.generic.name)" - url: "Adres Memo" + url: "adres Memo" createdAt: "$t(models.generic.createdAt)" updatedAt: "$t(models.generic.updatedAt)" members: "osoby przypisane do placówki" @@ -58,4 +58,4 @@ user: password: "hasło" hasEmailVerified: "e-mail zweryfikowany" members: "placówki użytkownika" - facilityCount: "liczba placówek" \ No newline at end of file + facilityCount: "liczba placówek"