diff --git a/package-lock.json b/package-lock.json index ecba75c..5682406 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "classnames": "^2.2.6", "copy-to-clipboard": "^3.3.1", "dayjs": "^1.9.4", + "debug": "^4.3.7", "filepond": "^4.18.0", "immer": "^9.0.1", "jwt-decode": "^2.2.0", @@ -54,6 +55,7 @@ "@tsconfig/strictest": "^2.0.3", "@types/blueimp-load-image": "^2.23.8", "@types/classnames": "^2.2.9", + "@types/debug": "^4.1.12", "@types/jest": "^29", "@types/js-yaml": "^4.0.9", "@types/jwt-decode": "^2.2.1", @@ -73,7 +75,6 @@ "@vitejs/plugin-react": "^4.2.1", "@welldone-software/why-did-you-render": "^4.0.3", "autoprefixer": "^10.4.17", - "esbuild-runner": "^2.2.2", "eslint": "^8.56.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", @@ -85,8 +86,9 @@ "prettier": "^3.2.5", "rollup-plugin-visualizer": "^5.12.0", "ts-jest": "^29", - "typescript": "^5.3", - "vite": "^5.1.3", + "tsx": "^4.19.2", + "typescript": "^5.6", + "vite": "5.4.6", "vite-plugin-imp": "^2.4.0" } }, @@ -768,9 +770,9 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -784,9 +786,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -800,9 +802,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -816,9 +818,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -832,9 +834,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -848,9 +850,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -864,9 +866,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -880,9 +882,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -896,9 +898,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -912,9 +914,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -928,9 +930,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -944,9 +946,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -960,9 +962,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -976,9 +978,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -992,9 +994,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -1008,9 +1010,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -1024,9 +1026,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -1040,9 +1042,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -1055,10 +1057,26 @@ "node": ">=12" } }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -1072,9 +1090,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -1088,9 +1106,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -1104,9 +1122,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -1120,9 +1138,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -1216,9 +1234,9 @@ } }, "node_modules/@formatjs/ecma402-abstract/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/@formatjs/fast-memoize": { "version": "1.2.1", @@ -1229,9 +1247,9 @@ } }, "node_modules/@formatjs/fast-memoize/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/@formatjs/icu-messageformat-parser": { "version": "2.1.0", @@ -1244,9 +1262,9 @@ } }, "node_modules/@formatjs/icu-messageformat-parser/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/@formatjs/icu-skeleton-parser": { "version": "1.3.6", @@ -1258,9 +1276,9 @@ } }, "node_modules/@formatjs/icu-skeleton-parser/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/@formatjs/intl": { "version": "2.2.1", @@ -1295,9 +1313,9 @@ } }, "node_modules/@formatjs/intl-displaynames/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/@formatjs/intl-listformat": { "version": "6.5.3", @@ -1310,9 +1328,9 @@ } }, "node_modules/@formatjs/intl-listformat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/@formatjs/intl-localematcher": { "version": "0.2.25", @@ -1323,14 +1341,14 @@ } }, "node_modules/@formatjs/intl-localematcher/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/@formatjs/intl/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/@fortawesome/fontawesome-common-types": { "version": "0.2.36", @@ -2203,9 +2221,9 @@ } }, "node_modules/@jokester/ts-commonutil/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", @@ -2303,9 +2321,9 @@ } }, "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2419,9 +2437,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", - "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.2.tgz", + "integrity": "sha512-ufoveNTKDg9t/b7nqI3lwbCG/9IJMhADBNjjz/Jn6LxIZxD7T5L8l2uO/wD99945F1Oo8FvgbbZJRguyk/BdzA==", "cpu": [ "arm" ], @@ -2432,9 +2450,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.2.tgz", + "integrity": "sha512-iZoYCiJz3Uek4NI0J06/ZxUgwAfNzqltK0MptPDO4OR0a88R4h0DSELMsflS6ibMCJ4PnLvq8f7O1d7WexUvIA==", "cpu": [ "arm64" ], @@ -2445,9 +2463,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", - "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.2.tgz", + "integrity": "sha512-/UhrIxobHYCBfhi5paTkUDQ0w+jckjRZDZ1kcBL132WeHZQ6+S5v9jQPVGLVrLbNUebdIRpIt00lQ+4Z7ys4Rg==", "cpu": [ "arm64" ], @@ -2458,9 +2476,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", - "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.2.tgz", + "integrity": "sha512-1F/jrfhxJtWILusgx63WeTvGTwE4vmsT9+e/z7cZLKU8sBMddwqw3UV5ERfOV+H1FuRK3YREZ46J4Gy0aP3qDA==", "cpu": [ "x64" ], @@ -2470,10 +2488,49 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.2.tgz", + "integrity": "sha512-1YWOpFcGuC6iGAS4EI+o3BV2/6S0H+m9kFOIlyFtp4xIX5rjSnL3AwbTBxROX0c8yWtiWM7ZI6mEPTI7VkSpZw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.2.tgz", + "integrity": "sha512-3qAqTewYrCdnOD9Gl9yvPoAoFAVmPJsBvleabvx4bnu1Kt6DrB2OALeRVag7BdWGWLhP1yooeMLEi6r2nYSOjg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", - "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.2.tgz", + "integrity": "sha512-ArdGtPHjLqWkqQuoVQ6a5UC5ebdX8INPuJuJNWRe0RGa/YNhVvxeWmCTFQ7LdmNCSUzVZzxAvUznKaYx645Rig==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.2.tgz", + "integrity": "sha512-B6UHHeNnnih8xH6wRKB0mOcJGvjZTww1FV59HqJoTJ5da9LCG6R4SEBt6uPqzlawv1LoEXSS0d4fBlHNWl6iYw==", "cpu": [ "arm" ], @@ -2484,9 +2541,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", - "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.2.tgz", + "integrity": "sha512-kr3gqzczJjSAncwOS6i7fpb4dlqcvLidqrX5hpGBIM1wtt0QEVtf4wFaAwVv8QygFU8iWUMYEoJZWuWxyua4GQ==", "cpu": [ "arm64" ], @@ -2497,9 +2554,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", - "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.2.tgz", + "integrity": "sha512-TDdHLKCWgPuq9vQcmyLrhg/bgbOvIQ8rtWQK7MRxJ9nvaxKx38NvY7/Lo6cYuEnNHqf6rMqnivOIPIQt6H2AoA==", "cpu": [ "arm64" ], @@ -2509,10 +2566,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.2.tgz", + "integrity": "sha512-xv9vS648T3X4AxFFZGWeB5Dou8ilsv4VVqJ0+loOIgDO20zIhYfDLkk5xoQiej2RiSQkld9ijF/fhLeonrz2mw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", - "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.2.tgz", + "integrity": "sha512-tbtXwnofRoTt223WUZYiUnbxhGAOVul/3StZ947U4A5NNjnQJV5irKMm76G0LGItWs6y+SCjUn/Q0WaMLkEskg==", "cpu": [ "riscv64" ], @@ -2522,10 +2592,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.2.tgz", + "integrity": "sha512-gc97UebApwdsSNT3q79glOSPdfwgwj5ELuiyuiMY3pEWMxeVqLGKfpDFoum4ujivzxn6veUPzkGuSYoh5deQ2Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", - "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.2.tgz", + "integrity": "sha512-jOG/0nXb3z+EM6SioY8RofqqmZ+9NKYvJ6QQaa9Mvd3RQxlH68/jcB/lpyVt4lCiqr04IyaC34NzhUqcXbB5FQ==", "cpu": [ "x64" ], @@ -2536,9 +2619,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", - "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.2.tgz", + "integrity": "sha512-XAo7cJec80NWx9LlZFEJQxqKOMz/lX3geWs2iNT5CHIERLFfd90f3RYLLjiCBm1IMaQ4VOX/lTC9lWfzzQm14Q==", "cpu": [ "x64" ], @@ -2549,9 +2632,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", - "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.2.tgz", + "integrity": "sha512-A+JAs4+EhsTjnPQvo9XY/DC0ztaws3vfqzrMNMKlwQXuniBKOIIvAAI8M0fBYiTCxQnElYu7mLk7JrhlQ+HeOw==", "cpu": [ "arm64" ], @@ -2562,9 +2645,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", - "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.2.tgz", + "integrity": "sha512-ZhcrakbqA1SCiJRMKSU64AZcYzlZ/9M5LaYil9QWxx9vLnkQ9Vnkve17Qn4SjlipqIIBFKjBES6Zxhnvh0EAEw==", "cpu": [ "ia32" ], @@ -2575,9 +2658,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", - "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.2.tgz", + "integrity": "sha512-2mLH46K1u3r6uwc95hU+OR9q/ggYMpnS7pSp83Ece1HUQgF9Nh/QwTK5rcgbFnV9j+08yBrU5sA/P0RK2MSBNA==", "cpu": [ "x64" ], @@ -2688,10 +2771,19 @@ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "node_modules/@types/graceful-fs": { @@ -2796,6 +2888,12 @@ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, "node_modules/@types/node": { "version": "20.11.20", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", @@ -2981,9 +3079,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3130,9 +3228,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3167,9 +3265,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4911,12 +5009,11 @@ "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -5094,9 +5191,9 @@ } }, "node_modules/dot-case/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, "node_modules/duplexer": { @@ -5354,9 +5451,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -5366,72 +5463,31 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/esbuild-runner": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/esbuild-runner/-/esbuild-runner-2.2.2.tgz", - "integrity": "sha512-fRFVXcmYVmSmtYm2mL8RlUASt2TDkGh3uRcvHFOKNr/T58VrfVeKD9uT9nlgxk96u0LS0ehS/GY7Da/bXWKkhw==", - "dev": true, - "dependencies": { - "source-map-support": "0.5.21", - "tslib": "2.4.0" - }, - "bin": { - "esr": "bin/esr.js" - }, - "peerDependencies": { - "esbuild": "*" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/esbuild-runner/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esbuild-runner/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/esbuild-runner/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -6063,19 +6119,6 @@ "node": ">=4.0" } }, - "node_modules/follow-redirects/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/follow-redirects/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/fonteditor-core": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fonteditor-core/-/fonteditor-core-2.3.2.tgz", @@ -6333,6 +6376,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "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", @@ -6822,9 +6877,9 @@ } }, "node_modules/intl-messageformat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/ip-address": { "version": "9.0.5", @@ -7382,9 +7437,9 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "dependencies": { "@babel/core": "^7.23.9", @@ -7398,9 +7453,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -7448,9 +7503,9 @@ } }, "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -8788,9 +8843,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -9387,9 +9442,9 @@ } }, "node_modules/lower-case/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, "node_modules/lru-cache": { @@ -9739,10 +9794,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nan": { "version": "2.18.0", @@ -9825,9 +9879,9 @@ } }, "node_modules/no-case/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, "node_modules/node-fetch": { @@ -9873,9 +9927,9 @@ } }, "node_modules/node-gyp/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -9927,9 +9981,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -10250,9 +10304,9 @@ } }, "node_modules/param-case/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, "node_modules/parent-module": { @@ -10294,9 +10348,9 @@ } }, "node_modules/pascal-case/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, "node_modules/path-dirname": { @@ -10364,9 +10418,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -10476,9 +10530,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -10496,8 +10550,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -11336,9 +11390,9 @@ } }, "node_modules/rc-util": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.41.0.tgz", - "integrity": "sha512-xtlCim9RpmVv0Ar2Nnc3WfJCxjQkTf3xHPWoFdjp1fSs2NirQwqiQrfqdU9HUe0kdfb168M/T8Dq0IaX50xeKg==", + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.43.0.tgz", + "integrity": "sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==", "dependencies": { "@babel/runtime": "^7.18.3", "react-is": "^18.2.0" @@ -11464,9 +11518,9 @@ } }, "node_modules/react-intl/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/react-is": { "version": "16.13.1", @@ -11631,9 +11685,9 @@ } }, "node_modules/react-use/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/read-pkg": { "version": "6.0.0", @@ -11941,6 +11995,15 @@ "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" }, + "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/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -12193,12 +12256,12 @@ } }, "node_modules/rollup": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", - "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.2.tgz", + "integrity": "sha512-do/DFGq5g6rdDhdpPq5qb2ecoczeK6y+2UAjdJ5trjQJj5f1AiVdLRWRc9A9/fFukfvJRgM0UXzxBIYMovm5ww==", "dev": true, "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -12208,19 +12271,24 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.12.0", - "@rollup/rollup-android-arm64": "4.12.0", - "@rollup/rollup-darwin-arm64": "4.12.0", - "@rollup/rollup-darwin-x64": "4.12.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", - "@rollup/rollup-linux-arm64-gnu": "4.12.0", - "@rollup/rollup-linux-arm64-musl": "4.12.0", - "@rollup/rollup-linux-riscv64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-musl": "4.12.0", - "@rollup/rollup-win32-arm64-msvc": "4.12.0", - "@rollup/rollup-win32-ia32-msvc": "4.12.0", - "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@rollup/rollup-android-arm-eabi": "4.24.2", + "@rollup/rollup-android-arm64": "4.24.2", + "@rollup/rollup-darwin-arm64": "4.24.2", + "@rollup/rollup-darwin-x64": "4.24.2", + "@rollup/rollup-freebsd-arm64": "4.24.2", + "@rollup/rollup-freebsd-x64": "4.24.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.2", + "@rollup/rollup-linux-arm-musleabihf": "4.24.2", + "@rollup/rollup-linux-arm64-gnu": "4.24.2", + "@rollup/rollup-linux-arm64-musl": "4.24.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.2", + "@rollup/rollup-linux-riscv64-gnu": "4.24.2", + "@rollup/rollup-linux-s390x-gnu": "4.24.2", + "@rollup/rollup-linux-x64-gnu": "4.24.2", + "@rollup/rollup-linux-x64-musl": "4.24.2", + "@rollup/rollup-win32-arm64-msvc": "4.24.2", + "@rollup/rollup-win32-ia32-msvc": "4.24.2", + "@rollup/rollup-win32-x64-msvc": "4.24.2", "fsevents": "~2.3.2" } }, @@ -12539,9 +12607,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -12950,9 +13018,9 @@ "dev": true }, "node_modules/throttle-debounce": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", - "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", "engines": { "node": ">=12.22" } @@ -13159,9 +13227,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -13184,6 +13252,432 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dev": true, + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, "node_modules/ttf2woff2": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/ttf2woff2/-/ttf2woff2-4.0.5.tgz", @@ -13313,9 +13807,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -13711,14 +14205,14 @@ } }, "node_modules/vite": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.3.tgz", - "integrity": "sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", + "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", "dev": true, "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -13737,6 +14231,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -13754,6 +14249,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, diff --git a/package.json b/package.json index 353fc95..8165905 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "classnames": "^2.2.6", "copy-to-clipboard": "^3.3.1", "dayjs": "^1.9.4", + "debug": "^4.3.7", "filepond": "^4.18.0", "immer": "^9.0.1", "jwt-decode": "^2.2.0", @@ -51,8 +52,7 @@ "lint:fix": "eslint --fix .", "format": "prettier --check src", "format:fix": "prettier --write src", - "ts-node": "node -r esbuild-runner/register", - "build:locale": "npm run ts-node scripts/generate-locale-json.ts", + "build:locale": "tsx scripts/generate-locale-json.ts", "test": "jest", "test:coverage": "jest --coverage", "typecheck": "tsc --noEmit", @@ -79,6 +79,7 @@ "@tsconfig/strictest": "^2.0.3", "@types/blueimp-load-image": "^2.23.8", "@types/classnames": "^2.2.9", + "@types/debug": "^4.1.12", "@types/jest": "^29", "@types/js-yaml": "^4.0.9", "@types/jwt-decode": "^2.2.1", @@ -98,7 +99,6 @@ "@vitejs/plugin-react": "^4.2.1", "@welldone-software/why-did-you-render": "^4.0.3", "autoprefixer": "^10.4.17", - "esbuild-runner": "^2.2.2", "eslint": "^8.56.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", @@ -110,13 +110,15 @@ "prettier": "^3.2.5", "rollup-plugin-visualizer": "^5.12.0", "ts-jest": "^29", - "typescript": "^5.3", - "vite": "^5.1.3", + "tsx": "^4.19.2", + "typescript": "^5.6", + "vite": "5.4.6", "vite-plugin-imp": "^2.4.0" }, "overrides": { - "typescript": "^5.3", + "typescript": "^5.6", "react": "^17", - "react-dom": "^17" + "react-dom": "^17", + "debug": "^4.3.7" } } diff --git a/src/apis/auth.ts b/src/apis/auth.ts index b231ea7..f6aa242 100644 --- a/src/apis/auth.ts +++ b/src/apis/auth.ts @@ -143,6 +143,16 @@ const login = ({ interface GetUserInfoData { token: string; } + +export interface GetUserInfoResponse { + id: string; + name: string; + signature?: string; + avatar?: string; + has_avatar: boolean; + // local + admin?: boolean; +} /** 获取用户信息 */ const getUserInfo = ({ data, @@ -150,8 +160,8 @@ const getUserInfo = ({ }: { data?: GetUserInfoData; configs?: AxiosRequestConfig; -} = {}) => { - return request({ +}) => { + return request({ method: 'GET', url: `/v1/user/info`, ...configs, diff --git a/src/apis/index.ts b/src/apis/index.ts index 6d9b233..1cc29f4 100644 --- a/src/apis/index.ts +++ b/src/apis/index.ts @@ -5,6 +5,7 @@ import qs from 'qs'; import { createElement } from 'react'; import { Icon } from '../components'; import { configs } from '../configs'; +import { createDebugLogger } from '../utils/debug-logger'; import { getIntl } from '../locales'; import store from '../store'; import { setUserToken } from '../store/user/slice'; @@ -29,7 +30,8 @@ import user from './user'; import group from './group'; import insight from './insight'; import siteSetting from './siteSetting'; -import { mitPreprocess } from './mit_preprocess'; + +const debugLogger = createDebugLogger('apis'); // TODO: move instance/request to a peer file, to prevent circular imports // TODO: can we hide this from API callsites? @@ -37,6 +39,30 @@ const instance = axios.create({ baseURL: `${configs.baseURL}`, }); +let languageInterceptor: number | null = null; + +/** + * @param l + * (as backend User.locale is not used , this solely determines backend locale) + */ +export function setRequestLanguage(l: string) { + // Remove existing interceptor if any + if (languageInterceptor !== null) { + instance.interceptors.request.eject(languageInterceptor); + } + // Add new interceptor and store its ID + languageInterceptor = instance.interceptors.request.use((req) => { + debugLogger('axios request interceptor: language', l, req); + return { + ...req, + headers: { + ...req.headers, + 'Accept-Language': l, + }, + }; + }); +} + /** 分页的请求参数 */ export interface PaginationParams { /** 页数 */ @@ -124,7 +150,7 @@ export type FailureResults = | CancelFailureResult | OtherFailureResult; -export const request = ( +export const request = ( axiosConfig: AxiosRequestConfig, ): Promise> => { return instance({ diff --git a/src/apis/me.ts b/src/apis/me.ts index f5b34c3..047414b 100644 --- a/src/apis/me.ts +++ b/src/apis/me.ts @@ -3,8 +3,8 @@ */ import { AxiosRequestConfig } from 'axios'; import { PaginationParams, request } from '.'; -import { ApplicationStatuses } from '../constants/application'; -import { InvitationStatuses } from '../constants/invitation'; +import { ApplicationStatuses } from '../constants'; +import { InvitationStatuses } from '../constants'; import { toUnderScoreCase } from '../utils'; import { APIApplication } from './application'; import { APIInvitation } from './invitation'; diff --git a/src/components/Header.tsx b/src/components/Header.tsx index e9dea78..b9e0c5b 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -14,7 +14,7 @@ import { clickEffect } from '../utils/style'; import classNames from 'classnames'; import { routes } from '../pages/routes'; import { configs } from '../configs'; -import { availableLocales, setLocale } from '../locales'; +import { LocalePicker } from './setting/LocalePicker'; /** 头部的属性接口 */ interface HeaderProps { @@ -87,6 +87,12 @@ export const Header: FC = ({ className }) => { ); + const githubLink = ( + + + + ); + return (
= ({ className }) => {
{currentUser.token ? (
- {mitLink} + {/*{mitLink}*/} = ({ className }) => {
) : (
- {mitLink} + {/*{mitLink}*/} {formatMessage({ id: 'auth.login' })} @@ -174,25 +180,9 @@ export const Header: FC = ({ className }) => { {formatMessage({ id: 'auth.register' })} + {githubLink}
)} ); }; - -const LocalePicker: FC = () => { - const menuProps: MenuProps = { - items: Object.entries(availableLocales).map(([locale, label]) => ({ - label:
{label}
, - key: `locale-${locale}`, - onClick: () => setLocale(locale), - })), - }; - return ( - -
- -
-
- ); -}; diff --git a/src/components/AdminImageSafeCheck.tsx b/src/components/admin/AdminImageSafeCheck.tsx similarity index 95% rename from src/components/AdminImageSafeCheck.tsx rename to src/components/admin/AdminImageSafeCheck.tsx index c208816..3cb3e13 100644 --- a/src/components/AdminImageSafeCheck.tsx +++ b/src/components/admin/AdminImageSafeCheck.tsx @@ -1,18 +1,18 @@ import { css } from '@emotion/core'; import React, { useEffect, useState } from 'react'; -import { useHistory } from 'react-router-dom'; -import { useTitle } from '../hooks'; -import { FC, File } from '../interfaces'; -import apis from '../apis'; +import { useTitle } from '@/hooks'; +import { FC, File } from '@/interfaces'; +import apis from '@/apis'; import { FileNotExistReasons, FileSafeStatuses, FILE_NOT_EXIST_REASON, FILE_SAFE_STATUS, -} from '../constants'; -import { toLowerCamelCase } from '../utils'; +} from '@/constants'; +import { toLowerCamelCase } from '@/utils'; import classNames from 'classnames'; import { Button, Pagination, Radio, Spin } from 'antd'; +import { useIntl } from 'react-intl'; /** 图片安全检查页面的属性接口 */ interface AdminImageSafeCheckProps { @@ -24,6 +24,7 @@ interface AdminImageSafeCheckProps { export const AdminImageSafeCheck: FC = ({ className, }) => { + const { formatMessage } = useIntl(); useTitle(); // 设置标题 const [files, setFiles] = useState(); const pageSize = 40; @@ -224,7 +225,7 @@ export const AdminImageSafeCheck: FC = ({ onClick={safeCheck} loading={submitting} > - 提交 + {formatMessage({ id: 'form.submit' })} )} diff --git a/src/components/AdminSiteSetting.tsx b/src/components/admin/AdminSiteSetting.tsx similarity index 93% rename from src/components/AdminSiteSetting.tsx rename to src/components/admin/AdminSiteSetting.tsx index 42d21ab..f9ecaff 100644 --- a/src/components/AdminSiteSetting.tsx +++ b/src/components/admin/AdminSiteSetting.tsx @@ -1,15 +1,15 @@ import { css } from '@emotion/core'; -import { Button, Form as AntdForm, Input, message, Spin, Switch } from 'antd'; +import { Button, Form as AntdForm, message, Spin, Switch } from 'antd'; import TextArea from 'antd/lib/input/TextArea'; import classNames from 'classnames'; import React, { useEffect, useState } from 'react'; import { useIntl } from 'react-intl'; -import apis from '../apis'; -import { APISiteSetting } from '../apis/siteSetting'; -import { FC } from '../interfaces'; -import { toLowerCamelCase } from '../utils'; -import { Form } from './Form'; -import { FormItem } from './FormItem'; +import apis from '@/apis'; +import { APISiteSetting } from '@/apis/siteSetting'; +import { FC } from '@/interfaces'; +import { toLowerCamelCase } from '@/utils'; +import { Form } from '@/components/Form'; +import { FormItem } from '@/components/FormItem'; function textareaToArray(textarea: string): string[] { return textarea.trim() === '' diff --git a/src/components/AdminUserList.tsx b/src/components/admin/AdminUserList.tsx similarity index 85% rename from src/components/AdminUserList.tsx rename to src/components/admin/AdminUserList.tsx index acbb9d2..81d437a 100644 --- a/src/components/AdminUserList.tsx +++ b/src/components/admin/AdminUserList.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/core'; import React, { useEffect, useState } from 'react'; import { useIntl } from 'react-intl'; -import { FC } from '../interfaces'; +import { FC } from '@/interfaces'; import classNames from 'classnames'; import { Button, @@ -14,13 +14,13 @@ import { Form as AntdForm, } from 'antd'; import type { FilterValue, SorterResult } from 'antd/es/table/interface'; -import apis from '../apis'; -import { toLowerCamelCase } from '../utils'; -import { APIUser } from '../apis/user'; -import { FormItem } from './FormItem'; -import { Form } from './Form'; -import { EmailInput } from './EmailInput'; -import { EMAIL_REGEX, USER_NAME_REGEX } from '../utils/regex'; +import { api } from '@/apis'; +import { toLowerCamelCase } from '@/utils'; +import { APIUser } from '@/apis/user'; +import { FormItem } from '@/components/FormItem'; +import { Form } from '@/components/Form'; +import { EmailInput } from '@/components/EmailInput'; +import { EMAIL_REGEX, USER_NAME_REGEX } from '@/utils/regex'; interface TableParams { pagination?: TablePaginationConfig; @@ -59,7 +59,7 @@ export const AdminUserList: FC = ({ className }) => { const fetchData = async () => { setLoading(true); try { - const result = await apis.adminGetUserList({ + const result = await api.user.adminGetUserList({ params: { page: pagination?.current, limit: pagination?.pageSize, @@ -90,7 +90,7 @@ export const AdminUserList: FC = ({ className }) => { const handelChangeAdminStatus = async (record: APIUser) => { setLoading(true); try { - await apis.adminChangeAdminStatus({ + await api.user.adminChangeAdminStatus({ data: { userId: record.id, status: !record.admin, @@ -117,7 +117,7 @@ export const AdminUserList: FC = ({ className }) => { }; const handleCreateUserFormFinish = (values: any) => { - apis + api.user .adminCreateUser({ data: values, }) @@ -138,7 +138,7 @@ export const AdminUserList: FC = ({ className }) => { const handelChangePassword = async (userID: string, password: string) => { setLoading(true); try { - await apis.adminEditUserPassword({ + await api.user.adminEditUserPassword({ userID: userID, data: { password }, }); @@ -152,17 +152,17 @@ export const AdminUserList: FC = ({ className }) => { const columns = [ { - title: '用户名', + title: formatMessage({ id: 'site.userName' }), dataIndex: 'name', key: 'name', }, { - title: '邮箱', + title: formatMessage({ id: 'site.email' }), dataIndex: 'email', key: 'email', }, { - title: '操作', + title: formatMessage({ id: 'admin.actions' }), key: 'action', render: (_: any, record: APIUser) => ( @@ -171,7 +171,9 @@ export const AdminUserList: FC = ({ className }) => { handelChangeAdminStatus(record); }} > - {record.admin ? '取消管理员' : '设置管理员'} + {record.admin + ? formatMessage({ id: 'admin.setAdmin' }) + : formatMessage({ id: 'admin.unsetAdmin' })} { @@ -179,7 +181,7 @@ export const AdminUserList: FC = ({ className }) => { setChangePasswordModalOpen(true); }} > - 修改密码 + {formatMessage({ id: 'admin.resetPassword' })} ), @@ -199,7 +201,7 @@ export const AdminUserList: FC = ({ className }) => { onChange={(e) => { setWord(e.target.value); }} - placeholder="搜索用户名" + placeholder={formatMessage({ id: 'admin.searchUser' })} css={css` margin-right: 8px; `} @@ -210,7 +212,7 @@ export const AdminUserList: FC = ({ className }) => { setCreateUserModalOpen(true); }} > - 创建用户 + {formatMessage({ id: 'admin.createUser' })} = ({ className }) => { onChange={handleTableChange} /> = ({ className }) => { /> { + const menuProps: MenuProps = { + items: Object.entries(availableLocales).map(([locale, label]) => ({ + label:
{label}
, + key: `locale-${locale}`, + onClick: () => setLocale(locale), + })), + }; + return ( + +
+ +
+
+ ); +}; diff --git a/src/components/UserSettingBase.tsx b/src/components/setting/UserBasicSettings.tsx similarity index 63% rename from src/components/UserSettingBase.tsx rename to src/components/setting/UserBasicSettings.tsx index 718fe43..2f66996 100644 --- a/src/components/UserSettingBase.tsx +++ b/src/components/setting/UserBasicSettings.tsx @@ -1,19 +1,23 @@ import { css } from '@emotion/core'; import React from 'react'; import { useIntl } from 'react-intl'; -import { Content, ContentItem, ContentTitle, UserEditForm } from '.'; -import { FC } from '../interfaces'; -import style from '../style'; -import { AvatarUpload } from './AvatarUpload'; +import { Content, ContentItem, ContentTitle } from '@/components'; +import { FC } from '@/interfaces'; +import style from '../../style'; +import { AvatarUpload } from '../AvatarUpload'; +import { UserEditForm } from './UserEditForm'; +import { LocalePicker } from './LocalePicker'; /** 用户基础设置的属性接口 */ -interface UserSettingBaseProps { +interface UserBasicSettingsProps { className?: string; } /** * 用户基础设置 */ -export const UserSettingBase: FC = ({ className }) => { +export const UserBasicSettings: FC = ({ + className, +}) => { const { formatMessage } = useIntl(); // i18n return ( @@ -26,6 +30,7 @@ export const UserSettingBase: FC = ({ className }) => { `} > + {formatMessage({ id: 'user.info' })}
diff --git a/src/components/UserEditForm.tsx b/src/components/setting/UserEditForm.tsx similarity index 87% rename from src/components/UserEditForm.tsx rename to src/components/setting/UserEditForm.tsx index f8cf319..fe39707 100644 --- a/src/components/UserEditForm.tsx +++ b/src/components/setting/UserEditForm.tsx @@ -3,13 +3,13 @@ import { Button, Form as AntdForm, Input, message } from 'antd'; import React, { useState } from 'react'; import { useIntl } from 'react-intl'; import { useDispatch, useSelector } from 'react-redux'; -import { Form, FormItem } from '.'; -import api from '../apis'; -import { FC } from '../interfaces'; -import { AppState } from '../store'; -import { setUserInfo } from '../store/user/slice'; -import { toLowerCamelCase } from '../utils'; -import { USER_NAME_REGEX } from '../utils/regex'; +import { Form, FormItem } from '..'; +import { api } from '../../apis'; +import { FC } from '../../interfaces'; +import { AppState } from '../../store'; +import { setUserInfo } from '../../store/user/slice'; +import { toLowerCamelCase } from '../../utils'; +import { USER_NAME_REGEX } from '../../utils/regex'; /** 修改项目表单的属性接口 */ interface UserEditFormProps { @@ -29,7 +29,7 @@ export const UserEditForm: FC = ({ className }) => { const handleFinish = (values: any) => { setSubmitting(true); - api + api.user .editUser({ data: values }) .then((result) => { const data = toLowerCamelCase(result.data); @@ -57,7 +57,7 @@ export const UserEditForm: FC = ({ className }) => {
= ({ className }) => { +export const UserSecuritySettings: FC = ({ + className, +}) => { const { formatMessage } = useIntl(); // i18n return ( diff --git a/src/fontAwesome.ts b/src/fontAwesome.ts index 2537939..4f8d6cf 100644 --- a/src/fontAwesome.ts +++ b/src/fontAwesome.ts @@ -58,6 +58,7 @@ import { faPaste, } from '@fortawesome/free-solid-svg-icons'; import { faKissWinkHeart as faKissWinkHeartRegular } from '@fortawesome/free-regular-svg-icons'; +import { faGithub } from '@fortawesome/free-brands-svg-icons'; library.add( ...[ faSyncAlt, @@ -115,4 +116,6 @@ library.add( ], // Regular icons ...[faKissWinkHeartRegular], + // Brand icons + ...[faGithub], ); diff --git a/src/locales/en.json b/src/locales/en.json index e3643bd..e16f6be 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -16,7 +16,7 @@ "site.slogan": "Accelerate Translation!", "form.required": "Required", "form.stringLen": "Length must be {len} characters", - "auth.getEmailVCode": "\"Get Email Verification Code\"", + "auth.getEmailVCode": "Get Email Verification Code", "auth.captchaTip": "Please enter the number on the left.", "form.ok": "Confirm", "form.cancel": "Cancel", @@ -27,10 +27,10 @@ "auth.sending": "Sending", "auth.captchaWrong": "Verification code error", "form.needWait": "Still cooling down, please try again later.", - "auth.getEmailVCodeWait": "\"Retry in {seconds} seconds\"", + "auth.getEmailVCodeWait": "Retry in {seconds} seconds", "auth.sendEmailSuccessTip": "Sent successfully. If not received, please also check your \"Spam\" folder.", "auth.resetPasswordSuccessTip": "Password reset successful, please log in now!", - "auth.userNameFormatTip": "\"Only Chinese/Japanese/Korean/English/numbers/_ are allowed\"", + "auth.userNameFormatTip": "Only Chinese/Japanese/Korean/English/numbers/_ are allowed", "site.email": "Email", "auth.newEmail": "New Email", "auth.oldEmail": "Original Email", @@ -39,17 +39,17 @@ "site.password": "Password", "auth.registerAndLogin": "Sign Up and Log In", "auth.registerSuccessTitle": "Registration Successful", - "auth.autoLoginTip": "\"Auto-logged in for you. Remember you on this browser? (Do not remember on public computers)\"", + "auth.autoLoginTip": "Logged in. Stay logged in on this browser? (Don't do this on public computers)\"", "auth.rememberMe": "Remember Me", "site.avatar": "Profile Picture", "auth.loginedTip": "Hello {userName}, you are logged in.", "auth.logout": "Log Out", "router.goDashboard": "Go to Dashboard", "site.dashboard": "Dashboard", - "auth.accountSetting": "Account Management", + "auth.accountSetting": "User settings", "auth.toResetPasswordTip": "Forgot password?", - "site.setting.autoJoinTeamIDs": "Automatically Joined Team ID", - "site.setting.autoJoinTeamIDsTip": "New users will automatically join these teams after registration/creation is complete. You can view the team IDs in the team settings interface (one ID per line).", + "site.setting.autoJoinTeamIDs": "Add new user to team id", + "site.setting.autoJoinTeamIDsTip": "New users will automatically join these teams upon sign up (one ID per line).\nTeam ID can be found in the team settings page\n", "site.setting.autoJoinTeamIDsError": "Team ID error/nonexistent in line {line}, please modify and try again.", "site.setting.homepageHtml": "Home HTML", "site.setting.homepageCss": "Home CSS", @@ -83,13 +83,13 @@ "site.searchToCreateTip": "Create a team now?", "site.join": "Join", "site.apply": "Apply", - "team.notAllowApplyTipTitle": "\"This team has closed applications to join\"", - "team.notAllowApplyTip": "Please contact the administrator of the team \"{team}\" to join this team by invitation.", + "team.notAllowApplyTipTitle": "This team has closed applications to join", + "team.notAllowApplyTip": "Please contact the administrator of the team \"{team}\" to invite you.", "project.notAllowApplyTipTitle": "This item is closed for joining.", - "project.notAllowApplyTip": "Please contact the administrator of the team or project \"{project}\" to join this project by invitation.", + "project.notAllowApplyTip": "Please contact the administrator of the team or project \"{project}\" to invite you.", "project.applyConfirm": "Are you sure you want to join the project \"{project}\"?", "application.reason": "Application message", - "application.reasonLabel": "Please provide a reason for joining \"{name}\":", + "application.reasonLabel": "Please provide an application message for \"{name}\":", "team.applyConfirm": "Are you sure you want to join the team \"{team}\"?", "team.apply": "Apply to join team", "team.join": "Join team", @@ -137,16 +137,16 @@ "application.emptyMessage": "No memo", "me.invitation.emptyTip": "No invitations received yet.", "me.invitation.new": "New Invitation", - "me.invitation.asRole": "\"Invite you as “{role}”\"", + "me.invitation.asRole": "Invite you as “{role}”", "me.application.new": "New Application", - "me.adminPage": "Site Management", + "me.adminPage": "Site Settings", "team.me": "I'm on the team", "site.myRoleIs": "Role: {role}", "invitation.needRole": "Please select a role to join", "site.userCount": "Number of Users", "site.aboutQuota": "Quota Related", "site.create": "Create", - "projectSet.emptySearchTip": "No Project Set contain \"{word}\". Please try a different search term.", + "projectSet.emptySearchTip": "No Project set contain \"{word}\". Please try a different search term.", "projectSet.default": "Ungrouped", "site.projectSet": "Project sets", "site.createProjectSet": "Create project set", @@ -199,7 +199,7 @@ "site.add": "Add", "file.uploadSuccess": "Upload Successful", "file.uploadFail": "\"{name} upload failed\"", - "file.uploadTip1": "Click the \"Upload\" button or drag and drop, paste files here to upload.", + "file.uploadTip1": "Click the \"Upload\" button or drag or paste files here to upload.", "file.uploadTip2": "Supports single or multi file uploads. Currently supports these file extensions: .jpg, .jpeg, .png, .bmp, .gif (case insensitive).", "file.emptyTip": "No files yet, upload one now!", "file.emptySearchTip": "No files contain \"{word}\". Please try a different search term.", @@ -211,18 +211,18 @@ "file.uploadOverwrite": "Overwrite", "project.selectTarget": "Please select the target language.", "project.changeTarget": "Switch Target Language", - "project.onlyOneTargetTip": "\"Only one target language\"", + "project.onlyOneTargetTip": "Only one target language", "imageTranslator.translationPlaceholder": "Please enter translation", "imageTranslator.proofreadPlaceholder": "Please enter proofreading", - "imageTranslator.deleteLabelTitle": "\"This label is already translated. Are you sure you want to delete it?\"", + "imageTranslator.deleteLabelTitle": "This label is already translated. Are you sure you want to delete it?", "imageTranslator.deleteLabelTip": "Note: This will also delete all translations and proofreadings under this label (including in other target languages)!", - "imageTranslator.someSaveFailed": "\"Some content failed to save\"", + "imageTranslator.someSaveFailed": "Failed to save some content", "imageTranslator.retry": "Click to Retry", - "imageTranslator.leaveTip": "\"Leaving now will lose these changes. Do you want to leave now?\"", - "imageTranslator.leaveWithSaving": "\"Content is still being saved!\"", + "imageTranslator.leaveTip": "Leaving now will lose these changes. Do you want to leave now?", + "imageTranslator.leaveWithSaving": "Content is still being saved!", "imageTranslator.leaveWithSaveFailed": "Failed to save some content!", - "imageTranslator.unloadWithSaving": "\"Content is still being saved. Leaving now will result in losing this content. Do you want to leave now?\"", - "imageTranslator.unloadWithSaveFailed": "\"Failed to save content. Leaving now will result in losing this content. Do you want to leave now?\"", + "imageTranslator.unloadWithSaving": "Saving in progress. Leaving now will result in losing this content. Do you want to leave now?", + "imageTranslator.unloadWithSaveFailed": "Failed to save content. Leaving now will result in losing this content. Do you want to leave now?", "imageTranslator.positionIn": "In Frame", "imageTranslator.positionOut": "Out of Frame", "site.noPermission": "No permission", @@ -246,7 +246,7 @@ "form.idTip": "The ID must be 24 characters long and contain only numbers and letters a-f/A-F.", "error.joinLink": "Invalid link added", "team.notExist": "Team does not exist", - "team.notAllowAllUserJoin": "\"This team is not open for applications\"", + "team.notAllowAllUserJoin": "This team is not open for applications", "project.notExist": "Project does not exist", "group.joined": "You have already joined {groupName}.", "project.notAllowAllUserJoin": "This project is not open for applications or only allows team members to apply.", @@ -294,7 +294,7 @@ "site.copy": "Copy", "translation.cover": "Overwrite", "site.cancel": "Cancel", - "translation.copyToProofreadNotEmptyTip": "\"Proofread existing content, are you sure you want to overwrite?\"", + "translation.copyToProofreadNotEmptyTip": "Other proofread text existed. Are you sure to overwrite?", "projectPreview.empty": "No files uploaded in the project yet.", "label.defaultContent": "No Translation", "label.emptyContent": "Empty Translation", @@ -314,8 +314,8 @@ "output.createOnlyTextButton": "Translate Data Only", "output.outputPartial": "Export {count} selected files", "output.outputPartialExclude": "Export all except the selected {count} files", - "output.invert": "\"Deselect\"", - "project.createViaLabelplus": "Created via \"translation_data.txt\":", + "output.invert": "Invert selection", + "project.createViaLabelplus": "Import from LabelPlus txt file:", "site.delete": "Delete", "project.createViaLabelplusNotSupport": "\"Not supported for multiple target languages\"", "file.needUploadTip": "Pending Upload", @@ -329,20 +329,20 @@ "debounceStatus.saving": "Saving...", "debounceStatus.saveFailed": "Save Failed", "debounceStatus.saveSuccessful": "Save Successful", - "translation.proofreadFirstTip": "\"Prioritize this proofread content\"", - "translation.hasOthersBestContentTip": "\"Someone else has translated this entry\"", + "translation.proofreadFirstTip": "Prioritize this proofread content", + "translation.hasOthersBestContentTip": "Translation(s) from other user exists", "imageTranslator.translationNoPremissionPlaceholder": "You do not have translation permissions.", - "projectImportFromLabelplusStatus.pending": "\"Importing text from Labelplus to queue\"", - "projectImportFromLabelplusStatus.running": "\"Importing from Labelplus text\"", + "projectImportFromLabelplusStatus.pending": "Waiting for import to start", + "projectImportFromLabelplusStatus.running": "Waiting for import to finish", "output.otherResource": "Other Resources", "output.at": "Export all files {outputType}", - "output.partAt": "Export Partial Files {outputType}", + "output.partAt": "Export partial files {outputType}", "output.onlyText": "Translate Data Only", "imageTranslator.sourceCreating": "Creating...", "imageTranslator.sourceDeleting": "Deleting...", "team.projectInsight": "Project Statistics", "site.refresh": "Refresh", - "insight.moreProject": "\"{count} more items\"", + "insight.moreProject": "{count} more items", "insight.noWorkingProjects": "No ongoing projects", "insight.noUserInProjects": "No members in the project", "site.projectName": "Project Name", @@ -351,7 +351,7 @@ "imageTranslator.proofreaderMode": "Proofreading Mode", "imageTranslator.copyTranslationContent": "Copy Translated Content", "imageTranslator.checkAllTranslation": "Confirm all of the above translations", - "imageTranslator.checkAllTranslationTip": "\"Multiple translations prioritize the first one\"", + "imageTranslator.checkAllTranslationTip": "Multiple translations prioritize the first one", "imageTranslator.noTranslationForProofread": "No translations available for proofreading.", "imageTranslator.checkUnfinished": "Review Incomplete", "imageTranslator.translateUnfinished": "Translation Incomplete", @@ -359,7 +359,7 @@ "invitation.teamUsers": "Team User", "invitation.inviteTipForTeam": "No team users available. Please enter a username to search for users outside the team.", "project.current": "Currently Open Project", - "translation.pendingProofread": "\"Pending Review\"", + "translation.pendingProofread": "Available for proofreading", "translation.copyToProofread": "Copy to Proofread", "translation.copyToMyTranslation": "Copy to My Translations", "translation.copyToMyTranslationNotEmptyTip": "Are you sure you want to overwrite your existing translation?", @@ -371,5 +371,16 @@ "mit.startPreprocess": "Start", "mit.preprocessStepLines": "Locating characters", "mit.preprocessStepOcr": "Recognizing text", - "mit.preprocessStepTranslate": "Translating" + "mit.preprocessStepTranslate": "Translating", + "admin.backToDashboard": "Back to dashboard", + "admin.siteSettings": "Site Settings", + "admin.users": "User Management", + "admin.searchUser": "Search User", + "admin.createUser": "Create User", + "admin.setAdmin": "Set as Admin", + "admin.unsetAdmin": "Unset as Admin", + "admin.actions": "Actions", + "admin.resetPassword": "Reset Password", + "admin.imageModeration": "Image Moderation", + "admin.captchas": "Captchas" } \ No newline at end of file diff --git a/src/locales/index.ts b/src/locales/index.ts index 37a623e..5d5e5eb 100644 --- a/src/locales/index.ts +++ b/src/locales/index.ts @@ -7,6 +7,7 @@ import dayjs from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime'; import utc from 'dayjs/plugin/utc'; import localizedFormat from 'dayjs/plugin/localizedFormat'; +import { setRequestLanguage } from '../apis'; dayjs.extend(localizedFormat); dayjs.extend(relativeTime); @@ -50,54 +51,54 @@ async function loadI18nLocale(locales: string[]): Promise { /** 获取 antd 所用的 Validate Messages */ const getAntdValidateMessages = (locale: string) => { - // const typeTemplate_enUS = 'Value is not a valid ${type}'; - // const enUS = { - // default: 'Validation error on field', - // required: 'Value is required', - // enum: 'Value must be one of [${enum}]', - // whitespace: 'Value cannot be empty', - // date: { - // format: 'Value is invalid for format date', - // parse: 'Value could not be parsed as date', - // invalid: 'Value is invalid date' - // }, - // types: { - // string: typeTemplate_enUS, - // method: typeTemplate_enUS, - // array: typeTemplate_enUS, - // object: typeTemplate_enUS, - // number: typeTemplate_enUS, - // date: typeTemplate_enUS, - // boolean: typeTemplate_enUS, - // integer: typeTemplate_enUS, - // float: typeTemplate_enUS, - // regexp: typeTemplate_enUS, - // email: typeTemplate_enUS, - // url: typeTemplate_enUS, - // hex: typeTemplate_enUS - // }, - // string: { - // len: 'Value must be exactly ${len} characters', - // min: 'Value must be at least ${min} characters', - // max: 'Value cannot be longer than ${max} characters', - // range: 'Value must be between ${min} and ${max} characters' - // }, - // number: { - // len: 'Value must equal ${len}', - // min: 'Value cannot be less than ${min}', - // max: 'Value cannot be greater than ${max}', - // range: 'Value must be between ${min} and ${max}' - // }, - // array: { - // len: 'Value must be exactly ${len} in length', - // min: 'Value cannot be less than ${min} in length', - // max: 'Value cannot be greater than ${max} in length', - // range: 'Value must be between ${min} and ${max} in length' - // }, - // pattern: { - // mismatch: 'Value does not match pattern ${pattern}' - // } - // }; + const typeTemplate_enUS = 'Value is not a valid ${type}'; + const enUS = { + default: 'Validation error on field', + required: 'Value is required', + enum: 'Value must be one of [${enum}]', + whitespace: 'Value cannot be empty', + date: { + format: 'Value is invalid for format date', + parse: 'Value could not be parsed as date', + invalid: 'Value is invalid date', + }, + types: { + string: typeTemplate_enUS, + method: typeTemplate_enUS, + array: typeTemplate_enUS, + object: typeTemplate_enUS, + number: typeTemplate_enUS, + date: typeTemplate_enUS, + boolean: typeTemplate_enUS, + integer: typeTemplate_enUS, + float: typeTemplate_enUS, + regexp: typeTemplate_enUS, + email: typeTemplate_enUS, + url: typeTemplate_enUS, + hex: typeTemplate_enUS, + }, + string: { + len: 'Value must be exactly ${len} characters', + min: 'Value must be at least ${min} characters', + max: 'Value cannot be longer than ${max} characters', + range: 'Value must be between ${min} and ${max} characters', + }, + number: { + len: 'Value must equal ${len}', + min: 'Value cannot be less than ${min}', + max: 'Value cannot be greater than ${max}', + range: 'Value must be between ${min} and ${max}', + }, + array: { + len: 'Value must be exactly ${len} in length', + min: 'Value cannot be less than ${min} in length', + max: 'Value cannot be greater than ${max} in length', + range: 'Value must be between ${min} and ${max} in length', + }, + pattern: { + mismatch: 'Value does not match pattern ${pattern}', + }, + }; const typeTemplate_zhCN = '类型不是合法的 ${type}'; const zhCN = { @@ -147,7 +148,13 @@ const getAntdValidateMessages = (locale: string) => { mismatch: '不匹配正则:${pattern}', }, }; - return zhCN; + + switch (matchLocale(locale)) { + case 'zh-CN': + return zhCN; + default: + return enUS; + } }; /** 用于在 React 组件外部使用 Intl */ @@ -168,7 +175,9 @@ export const availableLocales = { 'zh-CN': '简体中文', } as const; -function matchLocale(l: string): keyof typeof availableLocales { +export type SupportedLocale = keyof typeof availableLocales; + +function matchLocale(l: string): SupportedLocale { if (/^zh/i.test(l)) { return 'zh-CN'; } else if (/^en/i.test(l)) { @@ -216,6 +225,7 @@ export const initI18n = lazyThenable(() => { const savedPref = _savedPref && _savedPref in availableLocales ? _savedPref : null; const locale = savedPref || navigator.language; + setRequestLanguage(matchLocale(locale)); const locales = [savedPref, ...navigator.languages].filter( Boolean, ) as string[]; diff --git a/src/locales/messages.yaml b/src/locales/messages.yaml index 7b106c6..1e4bf48 100644 --- a/src/locales/messages.yaml +++ b/src/locales/messages.yaml @@ -53,7 +53,7 @@ form.stringLen: en: Length must be {len} characters auth.getEmailVCode: zhCn: 获取邮件验证码 - en: '"Get Email Verification Code"' + en: Get Email Verification Code auth.captchaTip: zhCn: 请输入左侧数字 en: Please enter the number on the left. @@ -86,7 +86,7 @@ form.needWait: en: Still cooling down, please try again later. auth.getEmailVCodeWait: zhCn: '{seconds} 秒后重新获取' - en: '"Retry in {seconds} seconds"' + en: "Retry in {seconds} seconds" auth.sendEmailSuccessTip: zhCn: 发送成功,未收到的话,请也检查一下“垃圾邮件”哦。 en: Sent successfully. If not received, please also check your "Spam" folder. @@ -95,7 +95,7 @@ auth.resetPasswordSuccessTip: en: Password reset successful, please log in now! auth.userNameFormatTip: zhCn: 仅可使用中文/日文/韩文/英文/数字/_ - en: '"Only Chinese/Japanese/Korean/English/numbers/_ are allowed"' + en: "Only Chinese/Japanese/Korean/English/numbers/_ are allowed" site.email: zhCn: 邮箱 en: Email @@ -115,17 +115,14 @@ site.password: zhCn: 密码 en: Password auth.registerAndLogin: - zhCn: 注册并登陆 + zhCn: 注册并登录 en: Sign Up and Log In auth.registerSuccessTitle: zhCn: 注册成功 en: Registration Successful auth.autoLoginTip: - zhCn: '已为您自动登录,需要在此浏览器上记住您吗? - - (公共计算机请勿记住)' - en: '"Auto-logged in for you. Remember you on this browser? (Do not remember on - public computers)"' + zhCn: 登录成功,是否在此浏览器上保持登录状态?(请勿在公共设备上选择) + en: Logged in. Stay logged in on this browser? (Don't do this on public computers)" auth.rememberMe: zhCn: 记住我 en: Remember Me @@ -133,7 +130,7 @@ site.avatar: zhCn: 头像 en: Profile Picture auth.loginedTip: - zhCn: 您好{userName},您已经登陆了。 + zhCn: 您好{userName},您已经登录了。 en: Hello {userName}, you are logged in. auth.logout: zhCn: 登出 @@ -145,19 +142,21 @@ site.dashboard: zhCn: 仪表盘 en: Dashboard auth.accountSetting: - zhCn: 账号管理 - en: Account Management + zhCn: 用户设置 + en: User settings auth.toResetPasswordTip: zhCn: 忘记密码? en: Forgot password? site.setting.autoJoinTeamIDs: zhCn: 自动加入的团队 ID - en: Automatically Joined Team ID + en: Add new user to team id site.setting.autoJoinTeamIDsTip: - zhCn: 新用户注册/创建完成后,会自动加入这些团队,可以在团队设置界面查看团队 ID(每个 ID 一行) - en: New users will automatically join these teams after registration/creation is - complete. You can view the team IDs in the team settings interface (one ID per - line). + zhCn: | + 新用户注册/创建完成后,会自动加入这些团队(每个 ID 一行) + 可以在团队设置界面查看团队 ID + en: | + New users will automatically join these teams upon sign up (one ID per line). + Team ID can be found in the team settings page site.setting.autoJoinTeamIDsError: zhCn: 第 {line} 行团队 ID 错误/不存在,请修改后重试 en: Team ID error/nonexistent in line {line}, please modify and try again. @@ -242,8 +241,7 @@ site.index: en: Home team.emptySearchTip: zhCn: 没有名称含有 “{word}” 的团队,请换个搜索词试试。 - en: No teams with names containing “{word}” found. Please try a different search - term. + en: No teams with names containing “{word}” found. Please try a different search term. site.searchTeam: zhCn: 寻找团队 en: Find Team @@ -261,17 +259,16 @@ site.apply: en: Apply team.notAllowApplyTipTitle: zhCn: 此团队关闭了申请加入 - en: '"This team has closed applications to join"' + en: "This team has closed applications to join" team.notAllowApplyTip: zhCn: 请联系团队 “{team}” 的管理员,通过邀请加入的方式加入此团队。 - en: Please contact the administrator of the team "{team}" to join this team by invitation. + en: Please contact the administrator of the team "{team}" to invite you. project.notAllowApplyTipTitle: zhCn: 此项目关闭了申请加入 en: This item is closed for joining. project.notAllowApplyTip: - zhCn: 请联系团队或项目 “{project}” 的管理员,通过邀请加入的方式加入此项目。 - en: Please contact the administrator of the team or project "{project}" to join - this project by invitation. + zhCn: 请联系项目 “{project}” 的管理员,通过邀请加入的方式加入此项目。 + en: Please contact the administrator of the team or project "{project}" to invite you. project.applyConfirm: zhCn: 您确定要加入项目 “{project}” 吗? en: Are you sure you want to join the project "{project}"? @@ -280,7 +277,7 @@ application.reason: en: Application message application.reasonLabel: zhCn: 申请需要管理员审核,请输入加入 “{name}” 的申请理由: - en: 'Please provide a reason for joining "{name}":' + en: 'Please provide an application message for "{name}":' team.applyConfirm: zhCn: 您确定要加入团队 “{team}” 吗? en: Are you sure you want to join the team "{team}"? @@ -346,8 +343,7 @@ team.deleteUserConfirm: en: Are you sure you want to remove "{user}" from the team? team.noMemberSearchTip: zhCn: 没有名称含有 “{word}” 的成员,请换个搜索词试试。 - en: No members with names containing “{word}” found. Please try a different search - term. + en: No members with names containing “{word}” found. Please try a different search term. site.memberName: zhCn: 成员名 en: Member Name @@ -425,13 +421,13 @@ me.invitation.new: en: New Invitation me.invitation.asRole: zhCn: 邀请您为 “{role}” - en: '"Invite you as “{role}”"' + en: "Invite you as “{role}”" me.application.new: zhCn: 新的申请 en: New Application me.adminPage: - zhCn: 站点管理 - en: Site Management + zhCn: 站点设置 + en: Site Settings team.me: zhCn: 我在团队 en: I'm on the team @@ -452,7 +448,7 @@ site.create: en: Create projectSet.emptySearchTip: zhCn: 没有名称含有 “{word}” 的项目集,请换个搜索词试试。 - en: No Project Set contain "{word}". Please try a different search term. + en: No Project set contain "{word}". Please try a different search term. projectSet.default: zhCn: 未分组 en: Ungrouped @@ -613,7 +609,7 @@ file.uploadFail: en: '"{name} upload failed"' file.uploadTip1: zhCn: 点击“上传”按钮 或 拖放、黏贴文件到这来上传吧 - en: Click the "Upload" button or drag and drop, paste files here to upload. + en: Click the "Upload" button or drag or paste files here to upload. file.uploadTip2: zhCn: 支持单个或批量文件上传,目前支持这些后缀的文件 .jpg, .jpeg, .png, .bmp, .gif(不区分大小写) en: 'Supports single or multi file uploads. Currently supports these file extensions: @@ -651,7 +647,7 @@ project.changeTarget: en: Switch Target Language project.onlyOneTargetTip: zhCn: 仅有一个目标语言 - en: '"Only one target language"' + en: "Only one target language" imageTranslator.translationPlaceholder: zhCn: 请输入翻译 en: Please enter translation @@ -660,34 +656,34 @@ imageTranslator.proofreadPlaceholder: en: Please enter proofreading imageTranslator.deleteLabelTitle: zhCn: 此标签已有翻译,您确认要删除吗? - en: '"This label is already translated. Are you sure you want to delete it?"' + en: "This label is already translated. Are you sure you want to delete it?" imageTranslator.deleteLabelTip: zhCn: 注意:将同时删除此标签下(包括其他目标语言中)的所有翻译和校对! en: 'Note: This will also delete all translations and proofreadings under this label (including in other target languages)!' imageTranslator.someSaveFailed: zhCn: 部分内容保存失败 - en: '"Some content failed to save"' + en: "Failed to save some content" imageTranslator.retry: zhCn: 点击重试 en: Click to Retry imageTranslator.leaveTip: zhCn: 现在离开将丢失这些内容,您要现在离开吗? - en: '"Leaving now will lose these changes. Do you want to leave now?"' + en: "Leaving now will lose these changes. Do you want to leave now?" imageTranslator.leaveWithSaving: zhCn: 仍有内容保存中! - en: '"Content is still being saved!"' + en: "Content is still being saved!" imageTranslator.leaveWithSaveFailed: zhCn: 部分内容保存失败! en: Failed to save some content! imageTranslator.unloadWithSaving: zhCn: 仍有内容保存中,现在离开将丢失这些内容,您要现在离开吗? - en: '"Content is still being saved. Leaving now will result in losing this content. - Do you want to leave now?"' + en: "Saving in progress. Leaving now will result in losing this content. + Do you want to leave now?" imageTranslator.unloadWithSaveFailed: zhCn: 有内容保存失败,现在离开将丢失这些内容,您要现在离开吗? - en: '"Failed to save content. Leaving now will result in losing this content. Do - you want to leave now?"' + en: "Failed to save content. Leaving now will result in losing this content. Do + you want to leave now?" imageTranslator.positionIn: zhCn: 框内 en: In Frame @@ -759,7 +755,7 @@ team.notExist: en: Team does not exist team.notAllowAllUserJoin: zhCn: 此团队未开放申请加入 - en: '"This team is not open for applications"' + en: This team is not open for applications project.notExist: zhCn: 项目不存在 en: Project does not exist @@ -905,7 +901,7 @@ site.cancel: en: Cancel translation.copyToProofreadNotEmptyTip: zhCn: 校对已有内容,您确定要覆盖吗? - en: '"Proofread existing content, are you sure you want to overwrite?"' + en: Other proofread text existed. Are you sure to overwrite? projectPreview.empty: zhCn: 项目内暂未上传文件 en: No files uploaded in the project yet. @@ -965,10 +961,10 @@ output.outputPartialExclude: en: Export all except the selected {count} files output.invert: zhCn: 反选 - en: '"Deselect"' + en: Invert selection project.createViaLabelplus: - zhCn: 通过“翻译数据.txt”创建: - en: 'Created via "translation_data.txt":' + zhCn: 通过 LabalPlus “翻译数据.txt”创建: + en: 'Import from LabelPlus txt file:' site.delete: zhCn: 删除 en: Delete @@ -1010,19 +1006,19 @@ debounceStatus.saveSuccessful: en: Save Successful translation.proofreadFirstTip: zhCn: 优先使用此校对内容 - en: '"Prioritize this proofread content"' + en: Prioritize this proofread content translation.hasOthersBestContentTip: zhCn: 他人已翻译此条目 - en: '"Someone else has translated this entry"' + en: Translation(s) from other user exists imageTranslator.translationNoPremissionPlaceholder: zhCn: 您暂无翻译权限 en: You do not have translation permissions. projectImportFromLabelplusStatus.pending: zhCn: 从 Labelplus 文本导入排队中 - en: '"Importing text from Labelplus to queue"' + en: Waiting for import to start projectImportFromLabelplusStatus.running: zhCn: 正在从 Labelplus 文本导入 - en: '"Importing from Labelplus text"' + en: Waiting for import to finish output.otherResource: zhCn: 其他资源 en: Other Resources @@ -1031,7 +1027,7 @@ output.at: en: Export all files {outputType} output.partAt: zhCn: 导出部分文件{outputType} - en: Export Partial Files {outputType} + en: Export partial files {outputType} output.onlyText: zhCn: 仅翻译数据 en: Translate Data Only @@ -1049,7 +1045,7 @@ site.refresh: en: Refresh insight.moreProject: zhCn: 等 {count} 个项目 - en: '"{count} more items"' + en: "{count} more items" insight.noWorkingProjects: zhCn: 暂无进行中的项目 en: No ongoing projects @@ -1076,7 +1072,7 @@ imageTranslator.checkAllTranslation: en: Confirm all of the above translations imageTranslator.checkAllTranslationTip: zhCn: 多个翻译则优先选取第一个 - en: '"Multiple translations prioritize the first one"' + en: Multiple translations prioritize the first one imageTranslator.noTranslationForProofread: zhCn: 暂无可校对翻译 en: No translations available for proofreading. @@ -1101,7 +1097,7 @@ project.current: en: Currently Open Project translation.pendingProofread: zhCn: 待校对 - en: '"Pending Review"' + en: Available for proofreading translation.copyToProofread: zhCn: 复制到校对 en: Copy to Proofread @@ -1139,3 +1135,38 @@ mit.preprocessStepOcr: mit.preprocessStepTranslate: zhCn: 机翻 en: Translating +admin.backToDashboard: + zhCn: 返回仪表盘 + en: Back to dashboard +admin.siteSettings: + zhCn: 站点设置 + en: Site Settings +admin.users: + zhCn: 用户管理 + en: User Management +admin.searchUser: + zhCn: 搜索用户 + en: Search User +admin.createUser: + zhCn: 创建用户 + en: Create User +admin.setAdmin: + zhCn: 设为管理员 + en: Set as Admin +admin.unsetAdmin: + zhCn: 取消管理员 + en: Unset as Admin +admin.actions: + zhCn: 操作 + en: Actions +admin.resetPassword: + zhCn: 重置密码 + en: Reset Password +admin.imageModeration: + zhCn: 图片审核 + en: Image Moderation +admin.captchas: + zhCn: 验证码 + en: Captchas + + diff --git a/src/locales/zh-cn.json b/src/locales/zh-cn.json index 36c81bf..ea30422 100644 --- a/src/locales/zh-cn.json +++ b/src/locales/zh-cn.json @@ -37,19 +37,19 @@ "site.vCode": "验证码", "site.userName": "用户名", "site.password": "密码", - "auth.registerAndLogin": "注册并登陆", + "auth.registerAndLogin": "注册并登录", "auth.registerSuccessTitle": "注册成功", - "auth.autoLoginTip": "已为您自动登录,需要在此浏览器上记住您吗?\n(公共计算机请勿记住)", + "auth.autoLoginTip": "登录成功,是否在此浏览器上保持登录状态?(请勿在公共设备上选择)", "auth.rememberMe": "记住我", "site.avatar": "头像", - "auth.loginedTip": "您好{userName},您已经登陆了。", + "auth.loginedTip": "您好{userName},您已经登录了。", "auth.logout": "登出", "router.goDashboard": "前往仪表盘", "site.dashboard": "仪表盘", - "auth.accountSetting": "账号管理", + "auth.accountSetting": "用户设置", "auth.toResetPasswordTip": "忘记密码?", "site.setting.autoJoinTeamIDs": "自动加入的团队 ID", - "site.setting.autoJoinTeamIDsTip": "新用户注册/创建完成后,会自动加入这些团队,可以在团队设置界面查看团队 ID(每个 ID 一行)", + "site.setting.autoJoinTeamIDsTip": "新用户注册/创建完成后,会自动加入这些团队(每个 ID 一行)\n可以在团队设置界面查看团队 ID\n", "site.setting.autoJoinTeamIDsError": "第 {line} 行团队 ID 错误/不存在,请修改后重试", "site.setting.homepageHtml": "主页 HTML", "site.setting.homepageCss": "主页 CSS", @@ -86,7 +86,7 @@ "team.notAllowApplyTipTitle": "此团队关闭了申请加入", "team.notAllowApplyTip": "请联系团队 “{team}” 的管理员,通过邀请加入的方式加入此团队。", "project.notAllowApplyTipTitle": "此项目关闭了申请加入", - "project.notAllowApplyTip": "请联系团队或项目 “{project}” 的管理员,通过邀请加入的方式加入此项目。", + "project.notAllowApplyTip": "请联系项目 “{project}” 的管理员,通过邀请加入的方式加入此项目。", "project.applyConfirm": "您确定要加入项目 “{project}” 吗?", "application.reason": "申请理由", "application.reasonLabel": "申请需要管理员审核,请输入加入 “{name}” 的申请理由:", @@ -139,7 +139,7 @@ "me.invitation.new": "新的邀请", "me.invitation.asRole": "邀请您为 “{role}”", "me.application.new": "新的申请", - "me.adminPage": "站点管理", + "me.adminPage": "站点设置", "team.me": "我在团队", "site.myRoleIs": "角色:{role}", "invitation.needRole": "请选择加入后角色", @@ -315,7 +315,7 @@ "output.outputPartial": "导出已选中的 {count} 个文件", "output.outputPartialExclude": "导出除了已选中的 {count} 个文件", "output.invert": "反选", - "project.createViaLabelplus": "通过“翻译数据.txt”创建:", + "project.createViaLabelplus": "通过 LabalPlus “翻译数据.txt”创建:", "site.delete": "删除", "project.createViaLabelplusNotSupport": "多个目标语言时不支持", "file.needUploadTip": "待上传", @@ -371,5 +371,16 @@ "mit.startPreprocess": "开始自动翻译", "mit.preprocessStepLines": "定位文字", "mit.preprocessStepOcr": "识别文字", - "mit.preprocessStepTranslate": "机翻" + "mit.preprocessStepTranslate": "机翻", + "admin.backToDashboard": "返回仪表盘", + "admin.siteSettings": "站点设置", + "admin.users": "用户管理", + "admin.searchUser": "搜索用户", + "admin.createUser": "创建用户", + "admin.setAdmin": "设为管理员", + "admin.unsetAdmin": "取消管理员", + "admin.actions": "操作", + "admin.resetPassword": "重置密码", + "admin.imageModeration": "图片审核", + "admin.captchas": "验证码" } \ No newline at end of file diff --git a/src/pages/Admin.tsx b/src/pages/Admin.tsx index b4fc70e..7d64551 100644 --- a/src/pages/Admin.tsx +++ b/src/pages/Admin.tsx @@ -8,16 +8,15 @@ import { useLocation, useRouteMatch, } from 'react-router-dom'; -import { - AdminImageSafeCheck, - AdminSiteSetting, - AdminUserList, - AdminVCodeList, -} from '../components'; -import { useTitle } from '../hooks'; -import { FC } from '../interfaces'; +import { useTitle } from '@/hooks'; +import { FC } from '@/interfaces'; import { Layout, Menu } from 'antd'; +import { useIntl } from 'react-intl'; +import { AdminUserList } from '@/components/admin/AdminUserList'; +import { AdminImageSafeCheck } from '@/components/admin/AdminImageSafeCheck'; +import { AdminSiteSetting } from '@/components/admin/AdminSiteSetting'; +import { AdminVCodeList } from '@/components/admin/AdminVCodeList'; const { Sider } = Layout; @@ -33,6 +32,7 @@ const Admin: FC = () => { const location = useLocation(); const defaultSelectedKey = location.pathname.split('/')[location.pathname.split('/').length - 1]; + const { formatMessage } = useIntl(); useTitle(); // 设置标题 @@ -56,7 +56,7 @@ const Admin: FC = () => { history.push(`/dashboard`); }} > - {'<'} 返回仪表盘 + {'<'} {formatMessage({ id: 'admin.backToDashboard' })} = () => { history.push(`${url}/site-setting`); }} > - 站点管理 + {formatMessage({ id: 'admin.siteSettings' })} = () => { history.push(`${url}/users`); }} > - 用户管理 + {formatMessage({ id: 'admin.users' })} { - history.push(`${url}/image-check`); + history.push(`${url}/image-moderation`); }} > - 图片检查 + {formatMessage({ id: 'admin.imageModeration' })} = () => { history.push(`${url}/site-v-code`); }} > - 验证码 + {formatMessage({ id: 'admin.captchas' })} @@ -100,7 +100,7 @@ const Admin: FC = () => { - + diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index aa2e416..49eaaca 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -1,10 +1,10 @@ import { css } from '@emotion/core'; -import { Button, Input, Switch, Form as AntdForm } from 'antd'; +import { Button, Input, Switch, Form as AntdForm, InputRef } from 'antd'; import React, { useRef } from 'react'; import { useIntl } from 'react-intl'; import { useDispatch } from 'react-redux'; import { useHistory } from 'react-router'; -import api, { FailureResults, resultTypes } from '../apis'; +import { FailureResults, resultTypes, api } from '../apis'; import { AuthFormWrapper, CAPTCHAInput, @@ -35,11 +35,11 @@ const Login: FC = ({ beforeRedirect = false } = {}) => { const captchaInputRef = useRef(null); // 用于密码错误,自动定位到密码输入框(因为密码错误刷新人机验证码,会错误 focus 到人机验证码输入框) - const passwordInputRef = useRef(null); + const passwordInputRef = useRef(null); /** 提交表单 */ const handleFinish = (values: any) => { - api + api.auth .login({ data: { email: values.email, @@ -184,7 +184,9 @@ const Login: FC = ({ beforeRedirect = false } = {}) => { } `} > -
记住我
+
+ {formatMessage({ id: 'auth.rememberMe' })} +
diff --git a/src/pages/Register.tsx b/src/pages/Register.tsx index 23f935b..bdd889b 100644 --- a/src/pages/Register.tsx +++ b/src/pages/Register.tsx @@ -1,9 +1,16 @@ import { css } from '@emotion/core'; -import { Button, Form as AntdForm, Input, message, Modal } from 'antd'; +import { + Button, + Form as AntdForm, + Input, + InputRef, + message, + Modal, +} from 'antd'; import React, { useRef } from 'react'; import { useIntl } from 'react-intl'; import { useDispatch } from 'react-redux'; -import api, { FailureResults, resultTypes } from '../apis'; +import { api, FailureResults, resultTypes } from '../apis'; import { AuthFormWrapper, EmailVCodeInputItem, @@ -31,11 +38,11 @@ const Register: FC = () => { const history = useHistory(); // 用于输入完人机验证码后自动定位到邮件验证码输入框 - const emailVCodeInputRef = useRef(null); + const emailVCodeInputRef = useRef(null); /** 提交表单 */ const handleFinish = (values: any) => { - api + api.auth .register({ data: values }) .then((result) => { // 重置表单 diff --git a/src/pages/UserSetting.tsx b/src/pages/UserSetting.tsx index ad95876..c80317a 100644 --- a/src/pages/UserSetting.tsx +++ b/src/pages/UserSetting.tsx @@ -3,17 +3,12 @@ import React from 'react'; import { useIntl } from 'react-intl'; import { useSelector } from 'react-redux'; import { Redirect, Route, Switch, useRouteMatch } from 'react-router-dom'; -import { - DashboardBox, - NavTab, - NavTabs, - Spin, - UserSettingBase, - UserSettingSafe, -} from '../components'; +import { DashboardBox, NavTab, NavTabs, Spin } from '../components'; import { FC } from '../interfaces'; import { AppState } from '../store'; import { useTitle } from '../hooks'; +import { UserBasicSettings } from '../components/setting/UserBasicSettings'; +import { UserSecuritySettings } from '../components/setting/UserSecuritySettings'; /** 团队设置页的属性接口 */ interface UserSettingProps {} @@ -56,10 +51,10 @@ const UserSetting: FC = () => { )} - + - + ) : ( diff --git a/src/store/site/slice.ts b/src/store/site/slice.ts index be09943..56bce4e 100644 --- a/src/store/site/slice.ts +++ b/src/store/site/slice.ts @@ -2,10 +2,10 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { OSName, Platform } from '../../interfaces'; export interface SiteState { - readonly osName: OSName; - readonly platform: Platform; - readonly newInvitationsCount: number; - readonly relatedApplicationsCount: number; + osName?: OSName; + platform?: Platform; + newInvitationsCount: number; + relatedApplicationsCount: number; } const initialState: SiteState = { diff --git a/src/store/user/sagas.ts b/src/store/user/sagas.ts index 76a168f..7a3275c 100644 --- a/src/store/user/sagas.ts +++ b/src/store/user/sagas.ts @@ -1,8 +1,9 @@ import { put, takeEvery } from 'redux-saga/effects'; import { initialState, setUserInfo, setUserToken } from './slice'; import { toLowerCamelCase } from '../../utils'; -import api from '../../apis'; +import { api, BasicSuccessResult } from '../../apis'; import { setToken, removeToken } from '../../utils/cookie'; +import { GetUserInfoResponse } from '../../apis/auth'; // worker Sage function* getUserInfoAsync(action: ReturnType) { @@ -23,9 +24,12 @@ function* getUserInfoAsync(action: ReturnType) { } // 获取并记录用户信息到 Store try { - const result = yield api.getUserInfo({ data: { token } }); + const result: BasicSuccessResult = + yield api.auth.getUserInfo({ + data: { token }, + }); yield put(setUserInfo(toLowerCamelCase(result.data))); - } catch (error) { + } catch (error: any) { error.default(); } } diff --git a/src/utils/debug-logger.ts b/src/utils/debug-logger.ts new file mode 100644 index 0000000..1936eec --- /dev/null +++ b/src/utils/debug-logger.ts @@ -0,0 +1,5 @@ +import debugModule from 'debug'; + +export function createDebugLogger(namespace: string) { + return debugModule(`moeflow:${namespace}`); +} diff --git a/tsconfig.json b/tsconfig.json index a25bd79..32fa0a1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,6 +14,9 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", + "paths": { + "@/*": ["./src/*"] + }, "typeRoots": ["node_modules/@types", "./typings"] }, "include": ["src"] diff --git a/vite.config.mts b/vite.config.mts index c8602d6..5f3dd05 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -65,7 +65,12 @@ export default defineConfig({ ), }, resolve: { - alias: {}, + alias: [ + { + find: /^@\//, + replacement: path.join(___dirname, 'src') + '/', + }, + ], }, plugins: [ vitePluginImp({