diff --git a/package.json b/package.json index 31983ef..1b72a66 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "@primeng/themes": "^20.2.0", "@primeuix/themes": "^1.2.1", "@tailwindcss/postcss": "^4.1.11", + "@zoomit/dayjs-jalali-plugin": "^0.1.11", "chart.js": "4.4.2", "dayjs": "^1.11.19", "flatpickr": "^4.6.13", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0be707d..1db0c9f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: '@tailwindcss/postcss': specifier: ^4.1.11 version: 4.1.17 + '@zoomit/dayjs-jalali-plugin': + specifier: ^0.1.11 + version: 0.1.11 chart.js: specifier: 4.4.2 version: 4.4.2 @@ -347,7 +350,7 @@ packages: optional: true '@angular/cdk@20.2.14': - resolution: {integrity: sha512-7bZxc01URbiPiIBWThQ69XwOxVduqEKN4PhpbF2AAyfMc/W8Hcr4VoIJOwL0O1Nkq5beS8pCAqoOeIgFyXd/kg==, tarball: https://hub.megan.ir/repository/npm/@angular/cdk/-/cdk-20.2.14.tgz} + resolution: {integrity: sha512-7bZxc01URbiPiIBWThQ69XwOxVduqEKN4PhpbF2AAyfMc/W8Hcr4VoIJOwL0O1Nkq5beS8pCAqoOeIgFyXd/kg==} peerDependencies: '@angular/common': ^20.0.0 || ^21.0.0 '@angular/core': ^20.0.0 || ^21.0.0 @@ -481,11 +484,11 @@ packages: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 '@babel/helper-environment-visitor@7.24.7': - resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==, tarball: https://hub.megan.ir/repository/npm/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz} + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} '@babel/helper-function-name@7.24.7': - resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==, tarball: https://hub.megan.ir/repository/npm/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz} + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} '@babel/helper-globals@7.28.0': @@ -493,7 +496,7 @@ packages: engines: {node: '>=6.9.0'} '@babel/helper-hoist-variables@7.24.7': - resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==, tarball: https://hub.megan.ir/repository/npm/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz} + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} '@babel/helper-member-expression-to-functions@7.28.5': @@ -600,22 +603,22 @@ packages: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz} + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz} + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz} + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz} + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -633,65 +636,65 @@ packages: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz} + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz} + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz} + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz} + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz} + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz} + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz} + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz} + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz} + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz} + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz} + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==, tarball: https://hub.megan.ir/repository/npm/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz} + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1034,7 +1037,7 @@ packages: engines: {node: '>=6.9.0'} '@babel/traverse@7.23.2': - resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==, tarball: https://hub.megan.ir/repository/npm/@babel/traverse/-/traverse-7.23.2.tgz} + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} '@babel/traverse@7.28.5': @@ -1054,451 +1057,451 @@ packages: engines: {node: '>=14.17.0'} '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz} + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz} + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/aix-ppc64@0.27.1': - resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz} + resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz} + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz} + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm64@0.27.1': - resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz} + resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, tarball: https://hub.megan.ir/repository/npm/@esbuild/android-arm/-/android-arm-0.19.12.tgz} + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/android-arm/-/android-arm-0.25.9.tgz} + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-arm@0.27.1': - resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/android-arm/-/android-arm-0.27.1.tgz} + resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, tarball: https://hub.megan.ir/repository/npm/@esbuild/android-x64/-/android-x64-0.19.12.tgz} + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==, tarball: https://hub.megan.ir/repository/npm/@esbuild/android-x64/-/android-x64-0.25.9.tgz} + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/android-x64@0.27.1': - resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/android-x64/-/android-x64-0.27.1.tgz} + resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, tarball: https://hub.megan.ir/repository/npm/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz} + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz} + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-arm64@0.27.1': - resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz} + resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, tarball: https://hub.megan.ir/repository/npm/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz} + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz} + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/darwin-x64@0.27.1': - resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz} + resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz} + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==, tarball: https://hub.megan.ir/repository/npm/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz} + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-arm64@0.27.1': - resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz} + resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz} + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz} + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/freebsd-x64@0.27.1': - resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz} + resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz} + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz} + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm64@0.27.1': - resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz} + resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz} + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz} + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-arm@0.27.1': - resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz} + resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz} + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz} + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-ia32@0.27.1': - resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz} + resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz} + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz} + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-loong64@0.27.1': - resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz} + resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz} + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz} + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-mips64el@0.27.1': - resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz} + resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz} + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz} + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-ppc64@0.27.1': - resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz} + resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz} + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz} + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-riscv64@0.27.1': - resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz} + resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz} + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz} + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-s390x@0.27.1': - resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz} + resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz} + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz} + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/linux-x64@0.27.1': - resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz} + resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==, tarball: https://hub.megan.ir/repository/npm/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz} + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] '@esbuild/netbsd-arm64@0.27.1': - resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz} + resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz} + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==, tarball: https://hub.megan.ir/repository/npm/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz} + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/netbsd-x64@0.27.1': - resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz} + resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz} + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-arm64@0.27.1': - resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==, tarball: https://hub.megan.ir/repository/npm/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz} + resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, tarball: https://hub.megan.ir/repository/npm/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz} + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz} + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/openbsd-x64@0.27.1': - resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz} + resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz} + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] '@esbuild/openharmony-arm64@0.27.1': - resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz} + resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz} + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==, tarball: https://hub.megan.ir/repository/npm/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz} + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/sunos-x64@0.27.1': - resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz} + resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, tarball: https://hub.megan.ir/repository/npm/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz} + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz} + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-arm64@0.27.1': - resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==, tarball: https://hub.megan.ir/repository/npm/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz} + resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz} + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==, tarball: https://hub.megan.ir/repository/npm/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz} + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-ia32@0.27.1': - resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz} + resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, tarball: https://hub.megan.ir/repository/npm/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz} + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==, tarball: https://hub.megan.ir/repository/npm/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz} + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] '@esbuild/win32-x64@0.27.1': - resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==, tarball: https://hub.megan.ir/repository/npm/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz} + resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1717,7 +1720,7 @@ packages: engines: {node: '>=18.0.0'} '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, tarball: https://hub.megan.ir/repository/npm/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz} + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} '@istanbuljs/schema@0.1.3': @@ -1725,51 +1728,51 @@ packages: engines: {node: '>=8'} '@jest/console@29.7.0': - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==, tarball: https://hub.megan.ir/repository/npm/@jest/console/-/console-29.7.0.tgz} + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/diff-sequences@30.0.1': - resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==, tarball: https://hub.megan.ir/repository/npm/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz} + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/expect-utils@30.2.0': - resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==, tarball: https://hub.megan.ir/repository/npm/@jest/expect-utils/-/expect-utils-30.2.0.tgz} + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/get-type@30.1.0': - resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==, tarball: https://hub.megan.ir/repository/npm/@jest/get-type/-/get-type-30.1.0.tgz} + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/pattern@30.0.1': - resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==, tarball: https://hub.megan.ir/repository/npm/@jest/pattern/-/pattern-30.0.1.tgz} + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, tarball: https://hub.megan.ir/repository/npm/@jest/schemas/-/schemas-29.6.3.tgz} + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/schemas@30.0.5': - resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==, tarball: https://hub.megan.ir/repository/npm/@jest/schemas/-/schemas-30.0.5.tgz} + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/snapshot-utils@30.2.0': - resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==, tarball: https://hub.megan.ir/repository/npm/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz} + resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/test-result@29.7.0': - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==, tarball: https://hub.megan.ir/repository/npm/@jest/test-result/-/test-result-29.7.0.tgz} + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/transform@30.2.0': - resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==, tarball: https://hub.megan.ir/repository/npm/@jest/transform/-/transform-30.2.0.tgz} + resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, tarball: https://hub.megan.ir/repository/npm/@jest/types/-/types-29.6.3.tgz} + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/types@30.2.0': - resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==, tarball: https://hub.megan.ir/repository/npm/@jest/types/-/types-30.2.0.tgz} + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jridgewell/gen-mapping@0.3.13': @@ -1841,37 +1844,37 @@ packages: listr2: 9.0.1 '@lmdb/lmdb-darwin-arm64@3.4.2': - resolution: {integrity: sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==, tarball: https://hub.megan.ir/repository/npm/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.2.tgz} + resolution: {integrity: sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==} cpu: [arm64] os: [darwin] '@lmdb/lmdb-darwin-x64@3.4.2': - resolution: {integrity: sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==, tarball: https://hub.megan.ir/repository/npm/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.2.tgz} + resolution: {integrity: sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==} cpu: [x64] os: [darwin] '@lmdb/lmdb-linux-arm64@3.4.2': - resolution: {integrity: sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==, tarball: https://hub.megan.ir/repository/npm/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.2.tgz} + resolution: {integrity: sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==} cpu: [arm64] os: [linux] '@lmdb/lmdb-linux-arm@3.4.2': - resolution: {integrity: sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==, tarball: https://hub.megan.ir/repository/npm/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.2.tgz} + resolution: {integrity: sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==} cpu: [arm] os: [linux] '@lmdb/lmdb-linux-x64@3.4.2': - resolution: {integrity: sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==, tarball: https://hub.megan.ir/repository/npm/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.2.tgz} + resolution: {integrity: sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==} cpu: [x64] os: [linux] '@lmdb/lmdb-win32-arm64@3.4.2': - resolution: {integrity: sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==, tarball: https://hub.megan.ir/repository/npm/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.2.tgz} + resolution: {integrity: sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==} cpu: [arm64] os: [win32] '@lmdb/lmdb-win32-x64@3.4.2': - resolution: {integrity: sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==, tarball: https://hub.megan.ir/repository/npm/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.2.tgz} + resolution: {integrity: sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==} cpu: [x64] os: [win32] @@ -1886,146 +1889,146 @@ packages: optional: true '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==, tarball: https://hub.megan.ir/repository/npm/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz} + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} cpu: [arm64] os: [darwin] '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==, tarball: https://hub.megan.ir/repository/npm/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz} + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} cpu: [x64] os: [darwin] '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==, tarball: https://hub.megan.ir/repository/npm/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz} + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} cpu: [arm64] os: [linux] '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==, tarball: https://hub.megan.ir/repository/npm/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz} + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} cpu: [arm] os: [linux] '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==, tarball: https://hub.megan.ir/repository/npm/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz} + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} cpu: [x64] os: [linux] '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==, tarball: https://hub.megan.ir/repository/npm/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz} + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} cpu: [x64] os: [win32] '@napi-rs/nice-android-arm-eabi@1.1.1': - resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz} + resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} engines: {node: '>= 10'} cpu: [arm] os: [android] '@napi-rs/nice-android-arm64@1.1.1': - resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz} + resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==} engines: {node: '>= 10'} cpu: [arm64] os: [android] '@napi-rs/nice-darwin-arm64@1.1.1': - resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz} + resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] '@napi-rs/nice-darwin-x64@1.1.1': - resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz} + resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] '@napi-rs/nice-freebsd-x64@1.1.1': - resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz} + resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': - resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz} + resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] '@napi-rs/nice-linux-arm64-gnu@1.1.1': - resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz} + resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] '@napi-rs/nice-linux-arm64-musl@1.1.1': - resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz} + resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] '@napi-rs/nice-linux-ppc64-gnu@1.1.1': - resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz} + resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} engines: {node: '>= 10'} cpu: [ppc64] os: [linux] libc: [glibc] '@napi-rs/nice-linux-riscv64-gnu@1.1.1': - resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz} + resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] libc: [glibc] '@napi-rs/nice-linux-s390x-gnu@1.1.1': - resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz} + resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} engines: {node: '>= 10'} cpu: [s390x] os: [linux] libc: [glibc] '@napi-rs/nice-linux-x64-gnu@1.1.1': - resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz} + resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] '@napi-rs/nice-linux-x64-musl@1.1.1': - resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz} + resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] '@napi-rs/nice-openharmony-arm64@1.1.1': - resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz} + resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} engines: {node: '>= 10'} cpu: [arm64] os: [openharmony] '@napi-rs/nice-win32-arm64-msvc@1.1.1': - resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz} + resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] '@napi-rs/nice-win32-ia32-msvc@1.1.1': - resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz} + resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] '@napi-rs/nice-win32-x64-msvc@1.1.1': - resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz} + resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] '@napi-rs/nice@1.1.1': - resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==, tarball: https://hub.megan.ir/repository/npm/@napi-rs/nice/-/nice-1.1.1.tgz} + resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} '@ngtools/webpack@20.3.13': @@ -2086,95 +2089,95 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz} + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz} + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz} + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz} + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz} + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz} + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz} + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz} + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz} + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz} + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] libc: [musl] '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz} + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz} + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz} + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==, tarball: https://hub.megan.ir/repository/npm/@parcel/watcher/-/watcher-2.5.1.tgz} + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, tarball: https://hub.megan.ir/repository/npm/@pkgjs/parseargs/-/parseargs-0.11.0.tgz} + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} '@pkgr/core@0.2.9': @@ -2199,123 +2202,123 @@ packages: engines: {node: '>=12.11.0'} '@rollup/rollup-android-arm-eabi@4.52.3': - resolution: {integrity: sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz} + resolution: {integrity: sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==} cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.52.3': - resolution: {integrity: sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz} + resolution: {integrity: sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==} cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.52.3': - resolution: {integrity: sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz} + resolution: {integrity: sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==} cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.52.3': - resolution: {integrity: sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz} + resolution: {integrity: sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==} cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.52.3': - resolution: {integrity: sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz} + resolution: {integrity: sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==} cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.52.3': - resolution: {integrity: sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz} + resolution: {integrity: sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==} cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.52.3': - resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz} + resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==} cpu: [arm] os: [linux] libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.52.3': - resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz} + resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==} cpu: [arm] os: [linux] libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.52.3': - resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz} + resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==} cpu: [arm64] os: [linux] libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.52.3': - resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz} + resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==} cpu: [arm64] os: [linux] libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.52.3': - resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz} + resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==} cpu: [loong64] os: [linux] libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.52.3': - resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz} + resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==} cpu: [ppc64] os: [linux] libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.52.3': - resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz} + resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==} cpu: [riscv64] os: [linux] libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.52.3': - resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz} + resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==} cpu: [riscv64] os: [linux] libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.52.3': - resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz} + resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==} cpu: [s390x] os: [linux] libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.52.3': - resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz} + resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==} cpu: [x64] os: [linux] libc: [glibc] '@rollup/rollup-linux-x64-musl@4.52.3': - resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz} + resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==} cpu: [x64] os: [linux] libc: [musl] '@rollup/rollup-openharmony-arm64@4.52.3': - resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz} + resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==} cpu: [arm64] os: [openharmony] '@rollup/rollup-win32-arm64-msvc@4.52.3': - resolution: {integrity: sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz} + resolution: {integrity: sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==} cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.52.3': - resolution: {integrity: sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz} + resolution: {integrity: sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==} cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-gnu@4.52.3': - resolution: {integrity: sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz} + resolution: {integrity: sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==} cpu: [x64] os: [win32] '@rollup/rollup-win32-x64-msvc@4.52.3': - resolution: {integrity: sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==, tarball: https://hub.megan.ir/repository/npm/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz} + resolution: {integrity: sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==} cpu: [x64] os: [win32] @@ -2351,10 +2354,10 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, tarball: https://hub.megan.ir/repository/npm/@sinclair/typebox/-/typebox-0.27.8.tgz} + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} '@sinclair/typebox@0.34.41': - resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==, tarball: https://hub.megan.ir/repository/npm/@sinclair/typebox/-/typebox-0.34.41.tgz} + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} @@ -2363,65 +2366,65 @@ packages: resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==} '@tailwindcss/oxide-android-arm64@4.1.17': - resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz} + resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] '@tailwindcss/oxide-darwin-arm64@4.1.17': - resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz} + resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] '@tailwindcss/oxide-darwin-x64@4.1.17': - resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz} + resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] '@tailwindcss/oxide-freebsd-x64@4.1.17': - resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz} + resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': - resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz} + resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==} engines: {node: '>= 10'} cpu: [arm] os: [linux] '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': - resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz} + resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.17': - resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz} + resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.17': - resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz} + resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.17': - resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz} + resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.17': - resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz} + resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -2433,13 +2436,13 @@ packages: - tslib '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': - resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz} + resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] '@tailwindcss/oxide-win32-x64-msvc@4.1.17': - resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==, tarball: https://hub.megan.ir/repository/npm/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz} + resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2502,13 +2505,13 @@ packages: resolution: {integrity: sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw==} '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, tarball: https://hub.megan.ir/repository/npm/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz} + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, tarball: https://hub.megan.ir/repository/npm/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz} + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, tarball: https://hub.megan.ir/repository/npm/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz} + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} '@types/jasmine@5.1.13': resolution: {integrity: sha512-MYCcDkruFc92LeYZux5BC0dmqo2jk+M5UIZ4/oFnAPCXN9mCcQhLyj7F3/Za7rocVyt5YRr1MmqJqFlvQ9LVcg==} @@ -2559,7 +2562,7 @@ packages: resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, tarball: https://hub.megan.ir/repository/npm/@types/stack-utils/-/stack-utils-2.0.3.tgz} + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} @@ -2568,13 +2571,13 @@ packages: resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, tarball: https://hub.megan.ir/repository/npm/@types/yargs-parser/-/yargs-parser-21.0.3.tgz} + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} '@types/yargs@17.0.35': - resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==, tarball: https://hub.megan.ir/repository/npm/@types/yargs/-/yargs-17.0.35.tgz} + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, tarball: https://hub.megan.ir/repository/npm/@ungap/structured-clone/-/structured-clone-1.3.0.tgz} + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@vitejs/plugin-basic-ssl@2.1.0': resolution: {integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==} @@ -2636,6 +2639,9 @@ packages: '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + '@zoomit/dayjs-jalali-plugin@0.1.11': + resolution: {integrity: sha512-xqbrBPRoBhbaAWeLbqq9QERZwj+h2KuJMehpOQrlT4y980oA+rdiF/YzXlzVaIvc845UYDrsTp8IDwttWyV/xg==} + abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} @@ -2741,7 +2747,7 @@ packages: engines: {node: '>=8'} ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, tarball: https://hub.megan.ir/repository/npm/ansi-styles/-/ansi-styles-5.2.0.tgz} + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} ansi-styles@6.2.3: @@ -2753,7 +2759,7 @@ packages: engines: {node: '>= 8'} argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, tarball: https://hub.megan.ir/repository/npm/argparse/-/argparse-1.0.10.tgz} + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -2818,7 +2824,7 @@ packages: webpack: '>=5.61.0' babel-plugin-istanbul@7.0.1: - resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==, tarball: https://hub.megan.ir/repository/npm/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz} + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} engines: {node: '>=12'} babel-plugin-polyfill-corejs2@0.4.14: @@ -2837,7 +2843,7 @@ packages: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-preset-current-node-syntax@1.2.0: - resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==, tarball: https://hub.megan.ir/repository/npm/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz} + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 @@ -2902,7 +2908,7 @@ packages: hasBin: true bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, tarball: https://hub.megan.ir/repository/npm/bser/-/bser-2.1.1.tgz} + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -2939,7 +2945,7 @@ packages: engines: {node: '>=6'} camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, tarball: https://hub.megan.ir/repository/npm/camelcase/-/camelcase-5.3.1.tgz} + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} caniuse-lite@1.0.30001759: @@ -2981,11 +2987,11 @@ packages: engines: {node: '>=6.0'} ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, tarball: https://hub.megan.ir/repository/npm/ci-info/-/ci-info-3.9.0.tgz} + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} ci-info@4.3.1: - resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==, tarball: https://hub.megan.ir/repository/npm/ci-info/-/ci-info-4.3.1.tgz} + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} cli-cursor@3.1.0: @@ -3027,7 +3033,7 @@ packages: resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} collect-v8-coverage@1.0.3: - resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==, tarball: https://hub.megan.ir/repository/npm/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz} + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -3326,7 +3332,7 @@ packages: engines: {node: '>= 0.8'} encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, tarball: https://hub.megan.ir/repository/npm/encoding/-/encoding-0.1.13.tgz} + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} engine.io-parser@5.2.3: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} @@ -3364,7 +3370,7 @@ packages: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, tarball: https://hub.megan.ir/repository/npm/errno/-/errno-0.1.8.tgz} + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true error-ex@1.3.4: @@ -3429,7 +3435,7 @@ packages: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, tarball: https://hub.megan.ir/repository/npm/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz} + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} escape-string-regexp@4.0.0: @@ -3526,7 +3532,7 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, tarball: https://hub.megan.ir/repository/npm/esprima/-/esprima-4.0.1.tgz} + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true @@ -3577,7 +3583,7 @@ packages: engines: {node: '>=18.0.0'} expect@30.2.0: - resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==, tarball: https://hub.megan.ir/repository/npm/expect/-/expect-30.2.0.tgz} + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} exponential-backoff@3.1.3: @@ -3627,7 +3633,7 @@ packages: engines: {node: '>=0.8.0'} fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, tarball: https://hub.megan.ir/repository/npm/fb-watchman/-/fb-watchman-2.0.2.tgz} + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -3659,7 +3665,7 @@ packages: engines: {node: '>= 18.0.0'} find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, tarball: https://hub.megan.ir/repository/npm/find-up/-/find-up-4.1.0.tgz} + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} find-up@5.0.0: @@ -3745,7 +3751,7 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://hub.megan.ir/repository/npm/fsevents/-/fsevents-2.3.3.tgz} + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -3780,7 +3786,7 @@ packages: engines: {node: '>= 0.4'} get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, tarball: https://hub.megan.ir/repository/npm/get-package-type/-/get-package-type-0.1.0.tgz} + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} get-proto@1.0.1: @@ -3820,7 +3826,7 @@ packages: deprecated: Glob versions prior to v9 are no longer supported globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, tarball: https://hub.megan.ir/repository/npm/globals/-/globals-11.12.0.tgz} + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} globals@14.0.0: @@ -3968,7 +3974,7 @@ packages: engines: {node: '>= 4'} image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==, tarball: https://hub.megan.ir/repository/npm/image-size/-/image-size-0.5.5.tgz} + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} hasBin: true @@ -4252,46 +4258,46 @@ packages: resolution: {integrity: sha512-Q9dqmpUAfptwyueW3+HqBOkSuYd9I/clZSSfN97wXE/Nr2ROFNCwIBEC1F6kb3QXS9Fcz0LjFYSDQT+BiwjuhA==} jest-diff@30.2.0: - resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==, tarball: https://hub.megan.ir/repository/npm/jest-diff/-/jest-diff-30.2.0.tgz} + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-editor-support@32.0.0-beta.1: - resolution: {integrity: sha512-IimucoTLZXwR1+1YEeqc++XjYRxffCEfr+uRlfwuVC5LiyIYUmPqo5x+f6EMkohUMOyQMICB5tEohrDw9smL1A==, tarball: https://hub.megan.ir/repository/npm/jest-editor-support/-/jest-editor-support-32.0.0-beta.1.tgz} + resolution: {integrity: sha512-IimucoTLZXwR1+1YEeqc++XjYRxffCEfr+uRlfwuVC5LiyIYUmPqo5x+f6EMkohUMOyQMICB5tEohrDw9smL1A==} jest-haste-map@30.2.0: - resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==, tarball: https://hub.megan.ir/repository/npm/jest-haste-map/-/jest-haste-map-30.2.0.tgz} + resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-matcher-utils@30.2.0: - resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==, tarball: https://hub.megan.ir/repository/npm/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz} + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==, tarball: https://hub.megan.ir/repository/npm/jest-message-util/-/jest-message-util-29.7.0.tgz} + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-message-util@30.2.0: - resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==, tarball: https://hub.megan.ir/repository/npm/jest-message-util/-/jest-message-util-30.2.0.tgz} + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-mock@30.2.0: - resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==, tarball: https://hub.megan.ir/repository/npm/jest-mock/-/jest-mock-30.2.0.tgz} + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-regex-util@30.0.1: - resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==, tarball: https://hub.megan.ir/repository/npm/jest-regex-util/-/jest-regex-util-30.0.1.tgz} + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-snapshot@30.2.0: - resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==, tarball: https://hub.megan.ir/repository/npm/jest-snapshot/-/jest-snapshot-30.2.0.tgz} + resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, tarball: https://hub.megan.ir/repository/npm/jest-util/-/jest-util-29.7.0.tgz} + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-util@30.2.0: - resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==, tarball: https://hub.megan.ir/repository/npm/jest-util/-/jest-util-30.2.0.tgz} + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-worker@27.5.1: @@ -4299,7 +4305,7 @@ packages: engines: {node: '>= 10.13.0'} jest-worker@30.2.0: - resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==, tarball: https://hub.megan.ir/repository/npm/jest-worker/-/jest-worker-30.2.0.tgz} + resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jiti@1.21.7: @@ -4317,7 +4323,7 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==, tarball: https://hub.megan.ir/repository/npm/js-yaml/-/js-yaml-3.14.2.tgz} + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true js-yaml@4.1.1: @@ -4436,71 +4442,71 @@ packages: optional: true lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==, tarball: https://hub.megan.ir/repository/npm/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz} + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] lightningcss-darwin-arm64@1.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==, tarball: https://hub.megan.ir/repository/npm/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz} + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==, tarball: https://hub.megan.ir/repository/npm/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz} + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==, tarball: https://hub.megan.ir/repository/npm/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz} + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==, tarball: https://hub.megan.ir/repository/npm/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz} + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==, tarball: https://hub.megan.ir/repository/npm/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz} + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==, tarball: https://hub.megan.ir/repository/npm/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz} + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] lightningcss-linux-x64-gnu@1.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==, tarball: https://hub.megan.ir/repository/npm/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz} + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] lightningcss-linux-x64-musl@1.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==, tarball: https://hub.megan.ir/repository/npm/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz} + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==, tarball: https://hub.megan.ir/repository/npm/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz} + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==, tarball: https://hub.megan.ir/repository/npm/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz} + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] @@ -4517,7 +4523,7 @@ packages: engines: {node: '>=20.0.0'} lmdb@3.4.2: - resolution: {integrity: sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==, tarball: https://hub.megan.ir/repository/npm/lmdb/-/lmdb-3.4.2.tgz} + resolution: {integrity: sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==} hasBin: true loader-runner@4.3.1: @@ -4533,7 +4539,7 @@ packages: engines: {node: '>= 12.13.0'} locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, tarball: https://hub.megan.ir/repository/npm/locate-path/-/locate-path-5.0.0.tgz} + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} locate-path@6.0.0: @@ -4582,7 +4588,7 @@ packages: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, tarball: https://hub.megan.ir/repository/npm/make-dir/-/make-dir-2.1.0.tgz} + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} make-dir@4.0.0: @@ -4594,7 +4600,7 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, tarball: https://hub.megan.ir/repository/npm/makeerror/-/makeerror-1.0.12.tgz} + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} @@ -4755,7 +4761,7 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==, tarball: https://hub.megan.ir/repository/npm/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz} + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true msgpackr@1.11.5: @@ -4785,7 +4791,7 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==, tarball: https://hub.megan.ir/repository/npm/needle/-/needle-3.3.1.tgz} + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} engines: {node: '>= 4.4.x'} hasBin: true @@ -4844,7 +4850,7 @@ packages: hasBin: true node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, tarball: https://hub.megan.ir/repository/npm/node-int64/-/node-int64-0.4.0.tgz} + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -4987,7 +4993,7 @@ packages: engines: {node: '>= 0.4'} p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, tarball: https://hub.megan.ir/repository/npm/p-limit/-/p-limit-2.3.0.tgz} + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} p-limit@3.1.0: @@ -4995,7 +5001,7 @@ packages: engines: {node: '>=10'} p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, tarball: https://hub.megan.ir/repository/npm/p-locate/-/p-locate-4.1.0.tgz} + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} p-locate@5.0.0: @@ -5011,7 +5017,7 @@ packages: engines: {node: '>=16.17'} p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, tarball: https://hub.megan.ir/repository/npm/p-try/-/p-try-2.2.0.tgz} + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} package-json-from-dist@1.0.1: @@ -5091,7 +5097,7 @@ packages: engines: {node: '>=6'} pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==, tarball: https://hub.megan.ir/repository/npm/pirates/-/pirates-4.0.7.tgz} + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} piscina@5.1.3: @@ -5236,11 +5242,11 @@ packages: hasBin: true pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, tarball: https://hub.megan.ir/repository/npm/pretty-format/-/pretty-format-29.7.0.tgz} + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} pretty-format@30.2.0: - resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==, tarball: https://hub.megan.ir/repository/npm/pretty-format/-/pretty-format-30.2.0.tgz} + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} primeclt@0.1.5: @@ -5319,7 +5325,7 @@ packages: engines: {node: '>= 0.10'} react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, tarball: https://hub.megan.ir/repository/npm/react-is/-/react-is-18.3.1.tgz} + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -5384,7 +5390,7 @@ packages: engines: {node: '>=4'} resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, tarball: https://hub.megan.ir/repository/npm/resolve-from/-/resolve-from-5.0.0.tgz} + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} resolve-pkg-maps@1.0.0: @@ -5627,7 +5633,7 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, tarball: https://hub.megan.ir/repository/npm/slash/-/slash-3.0.0.tgz} + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} slice-ansi@5.0.0: @@ -5705,14 +5711,14 @@ packages: engines: {node: '>=6.0.0'} sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, tarball: https://hub.megan.ir/repository/npm/sprintf-js/-/sprintf-js-1.0.3.tgz} + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} ssri@12.0.0: resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} engines: {node: ^18.17.0 || >=20.5.0} stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, tarball: https://hub.megan.ir/repository/npm/stack-utils/-/stack-utils-2.0.6.tgz} + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} statuses@1.5.0: @@ -5843,7 +5849,7 @@ packages: hasBin: true test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, tarball: https://hub.megan.ir/repository/npm/test-exclude/-/test-exclude-6.0.0.tgz} + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} thingies@2.5.0: @@ -5868,7 +5874,7 @@ packages: engines: {node: '>=14.14'} tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, tarball: https://hub.megan.ir/repository/npm/tmpl/-/tmpl-1.0.5.tgz} + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -6071,7 +6077,7 @@ packages: engines: {node: '>=0.10.0'} walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, tarball: https://hub.megan.ir/repository/npm/walker/-/walker-1.0.8.tgz} + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} watchpack@2.4.4: resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} @@ -6211,7 +6217,7 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==, tarball: https://hub.megan.ir/repository/npm/write-file-atomic/-/write-file-atomic-5.0.1.tgz} + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} ws@8.17.1: @@ -8800,6 +8806,8 @@ snapshots: '@yarnpkg/lockfile@1.1.0': {} + '@zoomit/dayjs-jalali-plugin@0.1.11': {} + abbrev@3.0.1: {} abort-controller@3.0.0: diff --git a/src/app.routes.ts b/src/app.routes.ts index a6f3387..2aec508 100644 --- a/src/app.routes.ts +++ b/src/app.routes.ts @@ -19,13 +19,13 @@ export const appRoutes: Routes = [ CONSUMER_ROUTES, PROVIDER_ROUTES, PARTNER_ROUTES, - POS_ROUTES, { path: 'ng', component: Dashboard }, { path: 'uikit', loadChildren: () => import('./app/pages/uikit/uikit.routes') }, { path: 'documentation', component: Documentation }, { path: 'pages', loadChildren: () => import('./app/pages/pages.routes') }, ], }, + POS_ROUTES, // { // path: 'pos/:posId', // component: POSComponent, diff --git a/src/app/core/interceptors/api-base-url.interceptor.ts b/src/app/core/interceptors/api-base-url.interceptor.ts index 7304c98..5f0b385 100644 --- a/src/app/core/interceptors/api-base-url.interceptor.ts +++ b/src/app/core/interceptors/api-base-url.interceptor.ts @@ -7,8 +7,6 @@ import { environment } from 'src/environments/environment'; @Injectable() export class ApiBaseUrlInterceptor implements HttpInterceptor { intercept(req: HttpRequest, next: HttpHandler): Observable> { - console.log('first'); - const cookieService = inject(CookieService); // Prepare default headers but don't overwrite existing ones const defaultHeaders: Record = { @@ -33,12 +31,13 @@ export class ApiBaseUrlInterceptor implements HttpInterceptor { } }); - console.log('req.url'); - console.log(req.url); - // Only prepend base URL if the request URL is relative (does not start with http or https) if (!/^https?:\/\//i.test(req.url)) { - const apiReq = req.clone({ url: environment.apiBaseUrl + req.url, setHeaders: headersToSet }); + const apiReq = req.clone({ + url: environment.apiBaseUrl + req.url, + setHeaders: headersToSet, + credentials: 'include', + }); return next.handle(apiReq); } diff --git a/src/app/core/interceptors/auth.interceptor.ts b/src/app/core/interceptors/auth.interceptor.ts index d08258a..f8187c5 100644 --- a/src/app/core/interceptors/auth.interceptor.ts +++ b/src/app/core/interceptors/auth.interceptor.ts @@ -11,6 +11,8 @@ import { AuthService } from '../services/auth.service'; * - Prevents duplicate refresh token requests */ export const authInterceptor: HttpInterceptorFn = (req, next) => { + console.log('authInterceptor'); + const authService = inject(AuthService); // Skip auth for certain endpoints diff --git a/src/app/core/validators/national-id.validator.ts b/src/app/core/validators/national-id.validator.ts new file mode 100644 index 0000000..520a1dc --- /dev/null +++ b/src/app/core/validators/national-id.validator.ts @@ -0,0 +1,12 @@ +import { ValidatorFn } from '@angular/forms'; + +export function nationalIdValidator(): ValidatorFn { + return (control) => { + if (control.value === null || control.value === undefined || control.value === '') { + return null; + } + return control.value.length === 10 && /^[0-9]{10}$/.test(control.value) + ? null + : { nationalId: true }; + }; +} diff --git a/src/app/domains/pos/layouts/layout.component.html b/src/app/domains/pos/layouts/layout.component.html index 5416fe1..4be8121 100644 --- a/src/app/domains/pos/layouts/layout.component.html +++ b/src/app/domains/pos/layouts/layout.component.html @@ -1,5 +1,23 @@ @if (loading()) { } @else { - +
+
+
+
+ Logo +
+ {{ posInfo()?.name }} - فروشگاه {{ posInfo()?.complex?.name }} +
+
+
+ +
+
+ {{ userInfo()?.username }} +
+
+
+ +
} diff --git a/src/app/domains/pos/layouts/layout.component.ts b/src/app/domains/pos/layouts/layout.component.ts index bc842bd..536aacf 100644 --- a/src/app/domains/pos/layouts/layout.component.ts +++ b/src/app/domains/pos/layouts/layout.component.ts @@ -1,20 +1,29 @@ +import { AuthService } from '@/core'; import { PageLoadingComponent } from '@/shared/components/page-loading.component'; +import { JalaliDateDirective } from '@/shared/directives'; import { Component, computed, inject } from '@angular/core'; import { RouterOutlet } from '@angular/router'; +import images from 'src/assets/images'; import { PosStore } from '../pos.store'; @Component({ selector: 'pos-layout', templateUrl: './layout.component.html', - imports: [PageLoadingComponent, RouterOutlet], + imports: [PageLoadingComponent, RouterOutlet, JalaliDateDirective], }) export class PosLayoutComponent { constructor() {} private readonly store = inject(PosStore); + private readonly authService = inject(AuthService); readonly loading = computed(() => this.store.loading()); readonly posInfo = computed(() => this.store.entity()); + readonly userInfo = computed(() => this.authService.currentAccount()); + + placeholderLogo = images.placeholders.logo; + + now = new Date(); getData() { this.store.getData(); diff --git a/src/app/domains/pos/models/good.io.ts b/src/app/domains/pos/models/good.io.ts new file mode 100644 index 0000000..27b9b3a --- /dev/null +++ b/src/app/domains/pos/models/good.io.ts @@ -0,0 +1,22 @@ +import ISummary from '@/core/models/summary'; +import { UnitType } from '@/utils'; + +export interface IGoodRawResponse { + id: string; + name: string; + sku: string; + category: ISummary; + unit_type: UnitType; + pricing_model: string; + description?: string; + created_at: string; + updated_at: string; +} +export interface IGoodResponse extends IGoodRawResponse {} + +export interface IGoodCategoryRawResponse { + id: string; + name: string; + goods_count: number; +} +export interface IGoodCategoryResponse extends IGoodCategoryRawResponse {} diff --git a/src/app/domains/pos/modules/landing/components/categories.component.html b/src/app/domains/pos/modules/landing/components/categories.component.html new file mode 100644 index 0000000..7a51075 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/categories.component.html @@ -0,0 +1,29 @@ +
+ @if (loading()) { + @for (i of [1, 2, 3, 4, 5]; track i) { + + } + } @else { + @for (category of categories(); track category.id) { +
+ {{ category.name }} +
+ + {{ category.goods_count }} + +
+
+ } + } +
diff --git a/src/app/domains/pos/modules/landing/components/categories.component.ts b/src/app/domains/pos/modules/landing/components/categories.component.ts new file mode 100644 index 0000000..55798cd --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/categories.component.ts @@ -0,0 +1,23 @@ +import { Component, EventEmitter, inject, Output } from '@angular/core'; +import { Skeleton } from 'primeng/skeleton'; +import { PosLandingStore } from '../store/main.store'; + +@Component({ + selector: 'pos-good-categories', + templateUrl: './categories.component.html', + imports: [Skeleton], +}) +export class PosGoodCategoriesComponent { + @Output() categoryChange = new EventEmitter(); + + private readonly store = inject(PosLandingStore); + + categories = this.store.goodCategories; + loading = this.store.getGoodCategoriesLoading; + + selectedCategory = this.store.activeGoodCategory; + + changeSelectedCategory(category: { id: string; name: string }) { + this.store.changeActiveCategory(category.id); + } +} diff --git a/src/app/domains/pos/modules/landing/components/customers/customer-dialog.component.html b/src/app/domains/pos/modules/landing/components/customers/customer-dialog.component.html new file mode 100644 index 0000000..4515247 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/customers/customer-dialog.component.html @@ -0,0 +1,16 @@ + +
+ + + {{ item.label }} + + +
+ @if (selectedCustomerType() === "UNKNOWN") { + + } @else if (selectedCustomerType() === "INDIVIDUAL") { + + } @else if (selectedCustomerType() === "LEGAL") { + + } +
diff --git a/src/app/domains/pos/modules/landing/components/customers/customer-dialog.component.ts b/src/app/domains/pos/modules/landing/components/customers/customer-dialog.component.ts new file mode 100644 index 0000000..9c57a2a --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/customers/customer-dialog.component.ts @@ -0,0 +1,53 @@ +import { AbstractDialog } from '@/shared/abstractClasses/abstract-dialog'; +import { CustomerType } from '@/shared/localEnum/constants/customerTypes'; +import { Component, EventEmitter, inject, Output, signal } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Dialog } from 'primeng/dialog'; +import { SelectButton } from 'primeng/selectbutton'; +import { PosLandingStore } from '../../store/main.store'; +import { CustomerIndividualFormComponent } from './individual/form.component'; +import { CustomerLegalFormComponent } from './legal/form.component'; +import { CustomerUnknownFormComponent } from './unknown/form.component'; + +@Component({ + selector: 'pos-order-customer-dialog', + templateUrl: './customer-dialog.component.html', + imports: [ + Dialog, + CustomerIndividualFormComponent, + FormsModule, + CustomerLegalFormComponent, + SelectButton, + CustomerUnknownFormComponent, + ], +}) +export class PosOrderCustomerDialogComponent extends AbstractDialog { + @Output() onSubmit = new EventEmitter(); + + private readonly store = inject(PosLandingStore); + + customerTypes = [ + { + label: 'بدون اطلاعات خریدار (نوع دوم)', + value: 'UNKNOWN', + }, + { + label: 'خریدار حقیقی (نوع اول)', + value: 'INDIVIDUAL', + }, + { + label: 'خریدار حقوقی (نوع اول)', + value: 'LEGAL', + }, + ] as { + label: string; + value: CustomerType; + }[]; + + selectedCustomerType = signal(this.store.customer().type); + + onSubmitCustomer() { + this.close(); + this.onSubmit.emit(); + } +} diff --git a/src/app/domains/pos/modules/landing/components/customers/individual/form.component.html b/src/app/domains/pos/modules/landing/components/customers/individual/form.component.html new file mode 100644 index 0000000..88f057c --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/customers/individual/form.component.html @@ -0,0 +1,14 @@ +
+ + + + + + + diff --git a/src/app/domains/pos/modules/landing/components/customers/individual/form.component.ts b/src/app/domains/pos/modules/landing/components/customers/individual/form.component.ts new file mode 100644 index 0000000..96136c0 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/customers/individual/form.component.ts @@ -0,0 +1,61 @@ +import { postalCodeValidator } from '@/core/validators'; +import { nationalIdValidator } from '@/core/validators/national-id.validator'; +import { AbstractForm } from '@/shared/abstractClasses'; +import { InputComponent } from '@/shared/components'; +import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { CustomerType } from '@/shared/localEnum/constants/customerTypes'; +import { Component, inject } from '@angular/core'; +import { ReactiveFormsModule, Validators } from '@angular/forms'; +import { Observable } from 'rxjs'; +import { IIndividualCustomer } from '../../../models/customer'; +import { PosLandingStore } from '../../../store/main.store'; + +@Component({ + selector: 'pos-customer-individual-form', + templateUrl: './form.component.html', + imports: [ReactiveFormsModule, InputComponent, FormFooterActionsComponent], +}) +export class CustomerIndividualFormComponent extends AbstractForm< + IIndividualCustomer, + IIndividualCustomer +> { + private readonly store = inject(PosLandingStore); + + override showSuccessMessage = false; + form = this.fb.group({ + first_name: [ + this.store.customer().info?.customerIndividuals?.first_name || '', + [Validators.required], + ], + last_name: [ + this.store.customer().info?.customerIndividuals?.last_name || '', + [Validators.required], + ], + national_id: [ + this.store.customer().info?.customerIndividuals?.national_id || '', + [Validators.required, nationalIdValidator()], + ], + economic_code: [ + this.store.customer().info?.customerIndividuals?.economic_code || '', + [Validators.required], + ], + postal_code: [ + this.store.customer().info?.customerIndividuals?.postal_code || '', + [postalCodeValidator()], + ], + }); + + override submitForm() { + return new Observable((observer) => { + const info = this.form.value as IIndividualCustomer; + this.store.setCustomer({ + customer_id: '', + type: CustomerType.INDIVIDUAL, + info: { + customerIndividuals: info, + }, + }); + return observer.next(info); + }); + } +} diff --git a/src/app/domains/pos/modules/landing/components/customers/legal/form.component.html b/src/app/domains/pos/modules/landing/components/customers/legal/form.component.html new file mode 100644 index 0000000..94e9e47 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/customers/legal/form.component.html @@ -0,0 +1,14 @@ +
+ + + + + + + diff --git a/src/app/domains/pos/modules/landing/components/customers/legal/form.component.ts b/src/app/domains/pos/modules/landing/components/customers/legal/form.component.ts new file mode 100644 index 0000000..9ef8d3d --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/customers/legal/form.component.ts @@ -0,0 +1,54 @@ +import { postalCodeValidator } from '@/core/validators'; +import { AbstractForm } from '@/shared/abstractClasses'; +import { InputComponent } from '@/shared/components'; +import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { CustomerType } from '@/shared/localEnum/constants/customerTypes'; +import { Component, inject } from '@angular/core'; +import { ReactiveFormsModule, Validators } from '@angular/forms'; +import { Observable } from 'rxjs'; +import { ILegalCustomer } from '../../../models/customer'; +import { PosLandingStore } from '../../../store/main.store'; + +@Component({ + selector: 'pos-customer-legal-form', + templateUrl: './form.component.html', + imports: [ReactiveFormsModule, InputComponent, FormFooterActionsComponent], +}) +export class CustomerLegalFormComponent extends AbstractForm { + private readonly store = inject(PosLandingStore); + + override showSuccessMessage = false; + + form = this.fb.group({ + company_name: [ + this.store.customer().info?.customerLegals?.company_name || '', + [Validators.required], + ], + registration_number: [ + this.store.customer().info?.customerLegals?.registration_number || '', + [Validators.required], + ], + economic_code: [ + this.store.customer().info?.customerLegals?.economic_code || '', + [Validators.required], + ], + postal_code: [ + this.store.customer().info?.customerLegals?.postal_code || '', + [postalCodeValidator()], + ], + }); + + override submitForm() { + return new Observable((observer) => { + const info = this.form.value as ILegalCustomer; + this.store.setCustomer({ + customer_id: '', + type: CustomerType.LEGAL, + info: { + customerLegals: info, + }, + }); + return observer.next(info); + }); + } +} diff --git a/src/app/domains/pos/modules/landing/components/customers/unknown/form.component.html b/src/app/domains/pos/modules/landing/components/customers/unknown/form.component.html new file mode 100644 index 0000000..a781de5 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/customers/unknown/form.component.html @@ -0,0 +1,5 @@ +
+ + + + diff --git a/src/app/domains/pos/modules/landing/components/customers/unknown/form.component.ts b/src/app/domains/pos/modules/landing/components/customers/unknown/form.component.ts new file mode 100644 index 0000000..f24fab9 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/customers/unknown/form.component.ts @@ -0,0 +1,42 @@ +import { nationalIdValidator } from '@/core/validators/national-id.validator'; +import { AbstractForm } from '@/shared/abstractClasses'; +import { InputComponent } from '@/shared/components'; +import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { CustomerType } from '@/shared/localEnum/constants/customerTypes'; +import { Component, inject } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { Observable } from 'rxjs'; +import { IUnknownCustomer } from '../../../models/customer'; +import { PosLandingStore } from '../../../store/main.store'; + +@Component({ + selector: 'pos-customer-unknown-form', + templateUrl: './form.component.html', + imports: [ReactiveFormsModule, InputComponent, FormFooterActionsComponent], +}) +export class CustomerUnknownFormComponent extends AbstractForm { + private readonly store = inject(PosLandingStore); + + override showSuccessMessage = false; + form = this.fb.group({ + national_id: [ + this.store?.customer().info?.customerUnknown?.national_id || '', + [nationalIdValidator()], + ], + name: [this.store?.customer().info?.customerUnknown?.name || ''], + }); + + override submitForm() { + return new Observable((observer) => { + const info = this.form.value as IUnknownCustomer; + this.store.setCustomer({ + customer_id: '', + type: CustomerType.UNKNOWN, + info: { + customerUnknown: info, + }, + }); + return observer.next(info); + }); + } +} diff --git a/src/app/domains/pos/modules/landing/components/goods.component.html b/src/app/domains/pos/modules/landing/components/goods.component.html new file mode 100644 index 0000000..c7559a1 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/goods.component.html @@ -0,0 +1,35 @@ +
+
+
+
+ + لیست کالاها +
+
+ + +
+ + + + + +
+
+
+ +
+ @if (viewType === "grid") { + + } @else { + + } + + @if (selectedGoodToAdd()) { + + } +
diff --git a/src/app/domains/pos/modules/landing/components/goods.component.ts b/src/app/domains/pos/modules/landing/components/goods.component.ts new file mode 100644 index 0000000..26e67c1 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/goods.component.ts @@ -0,0 +1,71 @@ +import { Maybe } from '@/core'; +import { IGoodResponse } from '@/domains/pos/models/good.io'; +import { SearchInputComponent } from '@/shared/components/search/search-input.component'; +import { Component, computed, inject, Input, signal } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { SelectButton } from 'primeng/selectbutton'; +import { PosLandingStore, TViewType } from '../store/main.store'; +import { PosGoodCategoriesComponent } from './categories.component'; +import { PosGoodsGridViewComponent } from './grid-view.component'; +import { PosGoodsListViewComponent } from './list-view.component'; +import { PayloadFormDialogComponent } from './payloads'; + +@Component({ + selector: 'pos-goods', + templateUrl: './goods.component.html', + imports: [ + PosGoodCategoriesComponent, + PosGoodsListViewComponent, + SelectButton, + FormsModule, + PosGoodsGridViewComponent, + SearchInputComponent, + PayloadFormDialogComponent, + ], +}) +export class PosGoodsComponent { + @Input() activeCategory = signal>(null); + + private readonly store = inject(PosLandingStore); + + constructor() { + this.store.initial(); + } + + viewOptions = [ + { value: 'list', icon: 'pi pi-list' }, + { value: 'grid', icon: 'pi pi-th-large' }, + ]; + + showPayloadForm = signal(false); + selectedGoodToAdd = signal>(null); + + readonly activatedCategoryProducts = computed(() => this.store.activatedCategoryGoods()); + readonly stock = computed(() => this.store.goods()); + + get viewType() { + return this.store.viewType(); + } + set viewType(val: TViewType) { + this.store.updateViewType(val); + } + + onSearch(searchTerm: string) { + this.store.updateSearchQuery(searchTerm); + this.store.getGoods(); + } + + onCategoryChange(categoryId: string) { + this.store.changeActiveCategory(categoryId); + } + + addGood(good: IGoodResponse) { + this.showPayloadForm.set(true); + + this.selectedGoodToAdd.set(good); + } + + onClosePayloadForm() { + this.selectedGoodToAdd.set(null); + } +} diff --git a/src/app/domains/pos/modules/landing/components/grid-view.component.html b/src/app/domains/pos/modules/landing/components/grid-view.component.html new file mode 100644 index 0000000..d25c4cc --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/grid-view.component.html @@ -0,0 +1,25 @@ +
+ @if (loading()) { + @for (_ of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15]; track $index) { +
+ +
+ } + } @else { + @for (good of goods(); track good.id) { +
+ +
+ + {{ good.name }} + + +
+ + +
+
+
+ } + } +
diff --git a/src/app/domains/pos/modules/landing/components/grid-view.component.ts b/src/app/domains/pos/modules/landing/components/grid-view.component.ts new file mode 100644 index 0000000..e64b5e8 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/grid-view.component.ts @@ -0,0 +1,25 @@ +import { IGoodResponse } from '@/domains/pos/models/good.io'; +import { Component, computed, EventEmitter, inject, Output } from '@angular/core'; +import { ButtonDirective } from 'primeng/button'; +import { Skeleton } from 'primeng/skeleton'; +import images from 'src/assets/images'; +import { PosLandingStore } from '../store/main.store'; + +@Component({ + selector: 'pos-good-grid-view', + templateUrl: './grid-view.component.html', + imports: [ButtonDirective, Skeleton], +}) +export class PosGoodsGridViewComponent { + private readonly store = inject(PosLandingStore); + @Output() onAdd = new EventEmitter(); + + goods = computed(() => this.store.activatedCategoryGoods()); + loading = computed(() => this.store.getGoodsLoading()); + + goodPlaceholder = images.placeholders.default; + + addProduct(good: IGoodResponse) { + this.onAdd.emit(good); + } +} diff --git a/src/app/domains/pos/modules/landing/components/list-view.component.html b/src/app/domains/pos/modules/landing/components/list-view.component.html new file mode 100644 index 0000000..4f4588a --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/list-view.component.html @@ -0,0 +1,30 @@ +
+ @if (loading()) { + @for (_ of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15]; track $index) { +
+ +
+ } + } @else { + @for (good of goods(); track good.id) { +
+
+ +
+ + {{ good.name }} + + + + {{ good.sku }} + +
+
+
+ + +
+
+ } + } +
diff --git a/src/app/domains/pos/modules/landing/components/list-view.component.ts b/src/app/domains/pos/modules/landing/components/list-view.component.ts new file mode 100644 index 0000000..ae08665 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/list-view.component.ts @@ -0,0 +1,25 @@ +import { IGoodResponse } from '@/domains/pos/models/good.io'; +import { Component, computed, EventEmitter, inject, Output } from '@angular/core'; +import { ButtonDirective } from 'primeng/button'; +import { Skeleton } from 'primeng/skeleton'; +import images from 'src/assets/images'; +import { PosLandingStore } from '../store/main.store'; + +@Component({ + selector: 'pos-goods-list-view', + templateUrl: './list-view.component.html', + imports: [ButtonDirective, Skeleton], +}) +export class PosGoodsListViewComponent { + private readonly store = inject(PosLandingStore); + @Output() onAdd = new EventEmitter(); + + goods = computed(() => this.store.activatedCategoryGoods()); + loading = computed(() => this.store.getGoodsLoading()); + + goodPlaceholder = images.placeholders.default; + + addGood(good: IGoodResponse) { + this.onAdd.emit(good); + } +} diff --git a/src/app/domains/pos/modules/landing/components/order/held-order-item.component.html b/src/app/domains/pos/modules/landing/components/order/held-order-item.component.html new file mode 100644 index 0000000..d8ca28f --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/order/held-order-item.component.html @@ -0,0 +1,28 @@ +
+
+ سفارش #{{ heldOrder.orderNumber }} + + {{ heldOrder.orderItems.length }} کالا - + + +
+
+ + +
+
diff --git a/src/app/domains/pos/modules/landing/components/order/held-order-item.component.ts b/src/app/domains/pos/modules/landing/components/order/held-order-item.component.ts new file mode 100644 index 0000000..cbff732 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/order/held-order-item.component.ts @@ -0,0 +1,57 @@ +import { ToastService } from '@/core/services/toast.service'; +import { IPosHeldOrderResponse } from '@/modules/pos/models'; +import { ConfirmationDialogService } from '@/shared/components/confirmationDialog/confirmation-dialog.service'; +import { PriceMaskDirective } from '@/shared/directives'; +import { Component, EventEmitter, Input, Output, signal } from '@angular/core'; +import { ButtonDirective } from 'primeng/button'; +import { PosService } from '../../services/main.service'; + +@Component({ + selector: 'app-held-order-item', + templateUrl: './held-order-item.component.html', + imports: [PriceMaskDirective, ButtonDirective], +}) +export class HeldOrderItemComponent { + @Input() heldOrder!: IPosHeldOrderResponse; + @Input() posId!: number; + + @Output() onCancel = new EventEmitter(); + @Output() onLoad = new EventEmitter(); + + constructor( + private readonly posService: PosService, + private readonly confirmationService: ConfirmationDialogService, + private readonly toastService: ToastService, + ) {} + + actionLoading = signal(false); + + cancelHeldOrder(heldOrderId: number) { + this.confirmationService.confirm({ + message: `آیا از لغو سفارش شماره‌ی #${this.heldOrder.orderNumber} اطمینان دارید؟`, + header: 'لغو سفارش موقت', + acceptLabel: 'بله', + rejectLabel: 'خیر', + accept: () => { + this.actionLoading.set(true); + // this.posService.cancelOrder(this.posId, heldOrderId).subscribe({ + // next: () => { + // this.onCancel.emit(heldOrderId); + // this.actionLoading.set(false); + // this.toastService.success({ + // text: `سفارش شماره‌ی #${this.heldOrder.orderNumber} با موفقیت لغو شد.`, + // }); + // }, + // error: () => { + // this.actionLoading.set(false); + // }, + // }); + }, + reject: () => {}, + }); + } + + loadHeldOrder(heldOrderId: number) { + this.onLoad.emit(heldOrderId); + } +} diff --git a/src/app/domains/pos/modules/landing/components/order/held-orders.component.html b/src/app/domains/pos/modules/landing/components/order/held-orders.component.html new file mode 100644 index 0000000..22e5ca6 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/order/held-orders.component.html @@ -0,0 +1,19 @@ +
+
+
+ + سفارش‌های نگه‌داشته شده +
+
+ @if (!heldOrders()?.length) { +
+ هیچ سفارش نگه‌داشته شده‌ای وجود ندارد. +
+ } @else { +
+ @for (heldOrder of heldOrders(); track heldOrder.id) { + + } +
+ } +
diff --git a/src/app/domains/pos/modules/landing/components/order/held-orders.component.ts b/src/app/domains/pos/modules/landing/components/order/held-orders.component.ts new file mode 100644 index 0000000..c09246a --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/order/held-orders.component.ts @@ -0,0 +1,39 @@ +import { Maybe } from '@/core'; +import { IPosHeldOrderResponse } from '@/modules/pos/models'; +import { Component, inject, signal } from '@angular/core'; +import { PosService } from '../../services/main.service'; +import { HeldOrderItemComponent } from './held-order-item.component'; + +@Component({ + selector: 'app-held-orders', + templateUrl: './held-orders.component.html', + imports: [HeldOrderItemComponent], +}) +export class HeldOrdersComponent { + private readonly service = inject(PosService); + + heldOrders = signal>(null); + loading = signal(false); + + ngOnInit() { + this.getHeldOrders(); + } + + getHeldOrders() { + this.loading.set(true); + // this.service.getHeldOrders().subscribe({ + // next: (res) => { + // this.heldOrders.set(res.data); + // this.loading.set(false); + // }, + // error: () => { + // this.loading.set(false); + // }, + // }); + } + + removeHeldOrder(orderId: number) { + const currentOrders = this.heldOrders() || []; + this.heldOrders.set(currentOrders.filter((order) => order.id !== orderId)); + } +} diff --git a/src/app/domains/pos/modules/landing/components/order/order-card-template.component.html b/src/app/domains/pos/modules/landing/components/order/order-card-template.component.html new file mode 100644 index 0000000..14f4c55 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/order/order-card-template.component.html @@ -0,0 +1,50 @@ +
+
+ +
+
+
+ {{ inOrderGood.good.name }} + {{ inOrderGood.good.sku }} +
+
+ + +
+
+
+
+ +
+
+
+
+
+ + diff --git a/src/app/domains/pos/modules/landing/components/order/order-card-template.component.ts b/src/app/domains/pos/modules/landing/components/order/order-card-template.component.ts new file mode 100644 index 0000000..36a12d9 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/order/order-card-template.component.ts @@ -0,0 +1,29 @@ +import { Component, inject, Input, signal } from '@angular/core'; +import { ButtonDirective } from 'primeng/button'; +import images from 'src/assets/images'; +import { IPosInOrderGood } from '../../models'; +import { PosLandingStore } from '../../store/main.store'; +import { PayloadFormDialogComponent } from '../payload-form.component'; + +@Component({ + selector: 'pos-order-card-template', + templateUrl: './order-card-template.component.html', + imports: [ButtonDirective, PayloadFormDialogComponent], +}) +export class OrderCardTemplateComponent { + @Input({ required: true }) inOrderGood!: IPosInOrderGood; + + private readonly store = inject(PosLandingStore); + + visible = signal(false); + + placeholderImage = images.placeholders.default; + + removeGoodFromOrder() { + this.store.removeFromInOrderGoods(this.inOrderGood.id); + } + + editOrderItem() { + this.visible.set(true); + } +} diff --git a/src/app/domains/pos/modules/landing/components/order/order-section.component.html b/src/app/domains/pos/modules/landing/components/order/order-section.component.html new file mode 100644 index 0000000..9b113f5 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/order/order-section.component.html @@ -0,0 +1,53 @@ +
+
+
+ + +
+
+
+
+ + سفارش‌ها +
+ +
+ @if (!inOrderGoods().length) { +
+ + هیچ سفارشی ثبت نشده است. +
+ } @else { +
+ @for (inOrderGood of inOrderGoods(); track inOrderGood.id) { + @if (inOrderGood.good.pricing_model === "GOLD") { + + } @else { + + } + } +
+ } +
+
+ +
+ +
+
+
+ + + + diff --git a/src/app/domains/pos/modules/landing/components/order/order-section.component.ts b/src/app/domains/pos/modules/landing/components/order/order-section.component.ts new file mode 100644 index 0000000..c271765 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/order/order-section.component.ts @@ -0,0 +1,82 @@ +// import { CustomersSelectComponent } from '@/modules/customers/components/select/select.component'; +// import { ICustomerResponse } from '@/modules/customers/models'; +import { KeyValueComponent } from '@/shared/components'; +import { Component, computed, inject, signal } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { ButtonDirective } from 'primeng/button'; +import images from 'src/assets/images'; +import { PosLandingStore } from '../../store/main.store'; +import { PosOrderCustomerDialogComponent } from '../customers/customer-dialog.component'; +import { GoldPayloadOrderCardComponent } from '../payloads/gold/order-card.component'; +import { StandardPayloadOrderCardComponent } from '../payloads/standard/order-card.component'; +import { PosPaymentFormDialogComponent } from '../payment/form-dialog.component'; +import { POSOrderPriceInfoCardComponent } from './price-info-card.component'; + +@Component({ + selector: 'pos-order-section', + templateUrl: './order-section.component.html', + imports: [ + ButtonDirective, + POSOrderPriceInfoCardComponent, + FormsModule, + GoldPayloadOrderCardComponent, + StandardPayloadOrderCardComponent, + PosOrderCustomerDialogComponent, + KeyValueComponent, + PosPaymentFormDialogComponent, + ], +}) +export class PosOrderSectionComponent { + private readonly store = inject(PosLandingStore); + + placeholderImage = images.placeholders.default; + + isVisibleCustomerForm = signal(false); + isVisiblePaymentForm = signal(false); + isVisiblePreInvoiceForm = signal(false); + + inOrderGoods = computed(() => this.store.inOrderGoods()); + customer = computed(() => this.store.customer()); + customerNameToShow = computed(() => { + const type = this.store.customer().type; + const info = this.store.customer().info; + let customerNameToShow = 'نامشخص'; + + switch (type) { + case 'UNKNOWN': + customerNameToShow = `${info?.customerUnknown?.name || 'نامشخص'} (نوع دوم)`; + break; + case 'INDIVIDUAL': + customerNameToShow = `${info?.customerIndividuals ? info?.customerIndividuals.first_name + ' ' + info?.customerIndividuals.last_name : 'نامشخص'} (نوع اول)`; + break; + case 'LEGAL': + customerNameToShow = `${info?.customerLegals?.company_name || 'نامشخص'} (نوع اول)`; + break; + } + + return customerNameToShow; + }); + + clearOrderList() { + this.store.resetInOrderGoods(); + } + + submit() { + this.store.submitOrder(); + } + + openCustomerDialog() { + // this.this.store.submitOrder(); + this.isVisibleCustomerForm.set(true); + } + + submitAndPay() { + // this.this.store.submitOrder(); + this.isVisiblePaymentForm.set(true); + } + + submitCustomer() { + console.log('submitCustomer'); + } + submitPayment() {} +} diff --git a/src/app/domains/pos/modules/landing/components/order/price-info-card.component.html b/src/app/domains/pos/modules/landing/components/order/price-info-card.component.html new file mode 100644 index 0000000..0b0e0be --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/order/price-info-card.component.html @@ -0,0 +1,30 @@ + +
+
+ جمع قیمت +
+ + + +
+
+
+ تخفیف + +
+
+ مالیات + +
+
+
+ مجموع کل + +
+
+
diff --git a/src/app/domains/pos/modules/landing/components/order/price-info-card.component.ts b/src/app/domains/pos/modules/landing/components/order/price-info-card.component.ts new file mode 100644 index 0000000..817c831 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/order/price-info-card.component.ts @@ -0,0 +1,15 @@ +import { PriceMaskDirective } from '@/shared/directives'; +import { Component, computed, inject } from '@angular/core'; +import { Card } from 'primeng/card'; +import { PosLandingStore } from '../../store/main.store'; + +@Component({ + selector: 'pos-order-price-info-card', + templateUrl: './price-info-card.component.html', + imports: [Card, PriceMaskDirective], +}) +export class POSOrderPriceInfoCardComponent { + private readonly store = inject(PosLandingStore); + + priceInfo = computed(() => this.store.orderPricingInfo()); +} diff --git a/src/app/domains/pos/modules/landing/components/payload-form.component.html b/src/app/domains/pos/modules/landing/components/payload-form.component.html new file mode 100644 index 0000000..f6bebc9 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payload-form.component.html @@ -0,0 +1,20 @@ + + @if (good) { + @if (isGoldMode()) { + + } @else if (isStandardMode()) { + + } + } + diff --git a/src/app/domains/pos/modules/landing/components/payload-form.component.ts b/src/app/domains/pos/modules/landing/components/payload-form.component.ts new file mode 100644 index 0000000..e62c685 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payload-form.component.ts @@ -0,0 +1,53 @@ +import { IGoodResponse } from '@/domains/pos/models/good.io'; +import { AbstractDialog } from '@/shared/abstractClasses/abstract-dialog'; +import { Component, computed, EventEmitter, inject, Input, Output, signal } from '@angular/core'; +import { Dialog } from 'primeng/dialog'; +import { IGoldPayload, IPosOrderItem, IStandardPayload, TPosOrderGoodPayload } from '../models'; +import { PosLandingStore } from '../store/main.store'; +import { PosGoldPayloadFormComponent } from './payloads/gold/form.component'; +import { PosStandardPayloadFormComponent } from './payloads/standard/form.component'; + +@Component({ + selector: 'pos-payload-form-dialog', + templateUrl: './payload-form.component.html', + imports: [PosGoldPayloadFormComponent, Dialog, PosStandardPayloadFormComponent], +}) +export class PayloadFormDialogComponent extends AbstractDialog { + @Input({ required: true }) good!: IGoodResponse; + @Input() initialValues?: IPosOrderItem; + @Input() orderItemId?: string; + @Output() onSubmit = new EventEmitter(); + + private readonly store = inject(PosLandingStore); + + totalAmount = signal(0); + preparedTitle = computed(() => this.good?.name); + + editMode = computed(() => Boolean(this.initialValues) && Boolean(this.orderItemId)); + isGoldMode = computed(() => this.good.pricing_model === 'GOLD'); + isStandardMode = computed(() => this.good.pricing_model === 'STANDARD'); + + goldPayload = computed(() => + this.isGoldMode() && this.editMode() + ? (this.initialValues as IPosOrderItem) + : undefined, + ); + standardPayload = computed(() => + this.isStandardMode() && this.editMode() + ? (this.initialValues as IPosOrderItem) + : undefined, + ); + + onChangeTotalAmount = (totalAmount: number) => { + this.totalAmount.set(totalAmount); + }; + + submit(payload: IPosOrderItem) { + if (this.editMode()) { + this.store.editInOrderGoods({ id: this.orderItemId!, good: this.good, ...payload }); + } else { + this.store.addToInOrderGoods(this.good.id, payload); + } + this.close(); + } +} diff --git a/src/app/domains/pos/modules/landing/components/payloads/form-dialog-amount-card-template.component.html b/src/app/domains/pos/modules/landing/components/payloads/form-dialog-amount-card-template.component.html new file mode 100644 index 0000000..81428da --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payloads/form-dialog-amount-card-template.component.html @@ -0,0 +1,24 @@ + +
+
+ جمع قیمت + @if (!discountAmount) { + + } @else { +
+ + +
+ } +
+
+ مالیات (۱۰٪) + +
+
+
+ مجموع کل + +
+
+
diff --git a/src/app/domains/pos/modules/landing/components/payloads/form-dialog-amount-card-template.component.ts b/src/app/domains/pos/modules/landing/components/payloads/form-dialog-amount-card-template.component.ts new file mode 100644 index 0000000..142fc62 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payloads/form-dialog-amount-card-template.component.ts @@ -0,0 +1,15 @@ +import { PriceMaskDirective } from '@/shared/directives'; +import { Component, Input } from '@angular/core'; +import { Card } from 'primeng/card'; + +@Component({ + selector: 'pos-form-dialog-amount-card-template', + templateUrl: './form-dialog-amount-card-template.component.html', + imports: [Card, PriceMaskDirective], +}) +export class PosFormDialogAmountCardTemplateComponent { + @Input({ required: true }) baseTotalAmount!: number; + @Input({ required: true }) totalAmount!: number; + @Input({ required: true }) discountAmount!: number; + @Input({ required: true }) taxAmount!: number; +} diff --git a/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.html b/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.html new file mode 100644 index 0000000..db752fc --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.html @@ -0,0 +1,52 @@ +
+ + + + + + + + +
+
+ + افزودن به لیست خرید +
+ diff --git a/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.ts b/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.ts new file mode 100644 index 0000000..d7b7a4c --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payloads/gold/form.component.ts @@ -0,0 +1,108 @@ +import { AbstractForm } from '@/shared/abstractClasses'; +import { EnumSelectComponent } from '@/shared/apiEnum/select.component'; +import { InputComponent } from '@/shared/components'; +import { TGoldKarat } from '@/shared/localEnum/constants/goldKarat'; +import { formatWithCurrency } from '@/utils'; +import { Component, EventEmitter, Output, signal } from '@angular/core'; +import { ReactiveFormsModule, Validators } from '@angular/forms'; +import { Button } from 'primeng/button'; +import { IGoldPayload, IPosOrderItem } from '../../../models'; +import { PosFormDialogAmountCardTemplateComponent } from '../form-dialog-amount-card-template.component'; + +@Component({ + selector: 'pos-gold-payload-form', + templateUrl: './form.component.html', + imports: [ + ReactiveFormsModule, + InputComponent, + EnumSelectComponent, + Button, + PosFormDialogAmountCardTemplateComponent, + ], +}) +export class PosGoldPayloadFormComponent extends AbstractForm< + IPosOrderItem, + IPosOrderItem +> { + @Output() onSubmitForm = new EventEmitter(); + @Output() onChangeTotalAmount = new EventEmitter(); + + private readonly initialForm = () => { + const form = this.fb.group({ + unit_price: [this.initialValues?.unit_price || 200_000_000, [Validators.required]], + quantity: [this.initialValues?.quantity || 2, [Validators.required]], + discount: [this.initialValues?.discount || 0], + payload: this.fb.group({ + commission: [this.initialValues?.payload?.commission || 10, [Validators.required]], + karat: [this.initialValues?.payload?.karat || '', [Validators.required]], + wages: [this.initialValues?.payload?.wages || 10, [Validators.required]], + profit: [this.initialValues?.payload?.profit || 10, [Validators.required]], + }), + }); + + form.valueChanges.subscribe((value) => { + this.updateCalculateAmount(value as IPosOrderItem); + }); + + return form; + }; + + form = this.initialForm(); + override submitForm(payload: IPosOrderItem) { + this.onSubmit.emit({ + ...payload, + total_amount: this.totalAmount(), + base_total_amount: this.baseTotalAmount(), + discount_amount: this.discountAmount(), + tax_amount: this.taxAmount(), + payload: { + commission_amount: this.commissionPrice(), + profit_amount: this.profitPrice(), + wages_amount: this.wagePrice(), + commission: this.form.controls.payload.controls.commission.value || 0, + karat: this.form.controls.payload.controls.karat.value as TGoldKarat, + profit: this.form.controls.payload.controls.profit.value || 0, + wages: this.form.controls.payload.controls.wages.value || 0, + }, + }); + } + + wagePrice = signal(0); + karatPrice = signal(0); + commissionPrice = signal(0); + profitPrice = signal(0); + totalAmount = signal(0); + baseTotalAmount = signal(0); + discountAmount = signal(0); + taxAmount = signal(0); + + toPriceFormat(amount: number) { + if (!amount) { + return ''; + } + return `(${formatWithCurrency(amount)})`; + } + + updateCalculateAmount(value: Partial>) { + const unitWithQuantity = (value.unit_price ?? 0) * (value.quantity ?? 0); + const commissionPrice = (unitWithQuantity * Number(value.payload?.commission ?? '0')) / 100; + const wagePrice = (unitWithQuantity * Number(value.payload?.wages ?? '0')) / 100; + const totalPriceBeforeProfit = unitWithQuantity + wagePrice + commissionPrice; + + const profitPrice = (totalPriceBeforeProfit * Number(value.payload?.profit ?? '0')) / 100; + + const baseTotalAmount = unitWithQuantity + profitPrice + commissionPrice + wagePrice; + + const discountPrice = (baseTotalAmount * Number(value.discount || '0')) / 100; + const taxAmount = (profitPrice + commissionPrice + wagePrice - discountPrice) * 0.1; + + this.wagePrice.set(wagePrice); + this.commissionPrice.set(commissionPrice); + this.profitPrice.set(profitPrice); + this.discountAmount.set(discountPrice); + this.taxAmount.set(taxAmount); + this.baseTotalAmount.set(baseTotalAmount); + + this.totalAmount.set(baseTotalAmount - discountPrice + taxAmount); + } +} diff --git a/src/app/domains/pos/modules/landing/components/payloads/gold/order-card.component.html b/src/app/domains/pos/modules/landing/components/payloads/gold/order-card.component.html new file mode 100644 index 0000000..2570ee6 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payloads/gold/order-card.component.html @@ -0,0 +1 @@ + diff --git a/src/app/domains/pos/modules/landing/components/payloads/gold/order-card.component.ts b/src/app/domains/pos/modules/landing/components/payloads/gold/order-card.component.ts new file mode 100644 index 0000000..055489f --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payloads/gold/order-card.component.ts @@ -0,0 +1,13 @@ +import { Component, Input } from '@angular/core'; +import { IPosInOrderGood } from '../../../models'; +import { OrderCardTemplateComponent } from '../../order/order-card-template.component'; + +@Component({ + selector: 'gold-payload-order-card', + templateUrl: './order-card.component.html', + imports: [OrderCardTemplateComponent], +}) +export class GoldPayloadOrderCardComponent { + @Input({ required: true }) orderItem!: IPosInOrderGood; + constructor() {} +} diff --git a/src/app/domains/pos/modules/landing/components/payloads/index.ts b/src/app/domains/pos/modules/landing/components/payloads/index.ts new file mode 100644 index 0000000..00b894c --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payloads/index.ts @@ -0,0 +1 @@ +export * from '../payload-form.component'; diff --git a/src/app/domains/pos/modules/landing/components/payloads/standard/form.component.html b/src/app/domains/pos/modules/landing/components/payloads/standard/form.component.html new file mode 100644 index 0000000..cb1e84e --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payloads/standard/form.component.html @@ -0,0 +1,31 @@ +
+ + + + +
+
+ + افزودن به لیست خرید +
+ diff --git a/src/app/domains/pos/modules/landing/components/payloads/standard/form.component.ts b/src/app/domains/pos/modules/landing/components/payloads/standard/form.component.ts new file mode 100644 index 0000000..0979166 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payloads/standard/form.component.ts @@ -0,0 +1,72 @@ +import { AbstractForm } from '@/shared/abstractClasses'; +import { InputComponent } from '@/shared/components'; +import { formatWithCurrency, getGoodUnitTypeProperties, UnitType } from '@/utils'; +import { Component, computed, EventEmitter, Input, Output, signal } from '@angular/core'; +import { ReactiveFormsModule, Validators } from '@angular/forms'; +import { Button } from 'primeng/button'; +import { IPosOrderItem, IStandardPayload } from '../../../models'; +import { PosFormDialogAmountCardTemplateComponent } from '../form-dialog-amount-card-template.component'; + +@Component({ + selector: 'pos-standard-payload-form', + templateUrl: './form.component.html', + imports: [ReactiveFormsModule, InputComponent, Button, PosFormDialogAmountCardTemplateComponent], +}) +export class PosStandardPayloadFormComponent extends AbstractForm< + IPosOrderItem, + IPosOrderItem +> { + @Input({ required: true }) unitType!: UnitType; + @Output() onChangeTotalAmount = new EventEmitter(); + + private readonly initialForm = () => { + const form = this.fb.group({ + unit_price: [this.initialValues?.unit_price || 0, [Validators.required]], + quantity: [this.initialValues?.quantity || 0, [Validators.required]], + discount: [this.initialValues?.discount || ''], + }); + + form.valueChanges.subscribe((value) => { + this.updateCalculateAmount(value as Partial>); + }); + + return form; + }; + + form = this.initialForm(); + override submitForm(payload: IPosOrderItem) { + this.onSubmit.emit({ + ...payload, + total_amount: this.totalAmount(), + discount_amount: this.discountAmount(), + tax_amount: this.taxAmount(), + base_total_amount: this.baseTotalAmount(), + }); + } + + preparedFormVisuals = computed(() => getGoodUnitTypeProperties(this.unitType)); + + baseTotalAmount = signal(0); + totalAmount = signal(0); + discountAmount = signal(0); + taxAmount = signal(0); + + toPriceFormat(amount: number) { + if (!amount) { + return ''; + } + return `(${formatWithCurrency(amount)})`; + } + + updateCalculateAmount(value: Partial>) { + const baseTotalAmount = (value.unit_price ?? 0) * (value.quantity ?? 0); + const discountAmount = (baseTotalAmount * Number(value.discount || '0')) / 100; + const baseTotalAmountWithoutTax = baseTotalAmount - discountAmount; + const taxAmount = baseTotalAmountWithoutTax * 0.1; + + this.baseTotalAmount.set(baseTotalAmount); + this.discountAmount.set(discountAmount); + this.taxAmount.set(taxAmount); + this.totalAmount.set(baseTotalAmountWithoutTax + taxAmount); + } +} diff --git a/src/app/domains/pos/modules/landing/components/payloads/standard/order-card.component.html b/src/app/domains/pos/modules/landing/components/payloads/standard/order-card.component.html new file mode 100644 index 0000000..2570ee6 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payloads/standard/order-card.component.html @@ -0,0 +1 @@ + diff --git a/src/app/domains/pos/modules/landing/components/payloads/standard/order-card.component.ts b/src/app/domains/pos/modules/landing/components/payloads/standard/order-card.component.ts new file mode 100644 index 0000000..6cbd0d3 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payloads/standard/order-card.component.ts @@ -0,0 +1,13 @@ +import { Component, Input } from '@angular/core'; +import { IPosInOrderGood } from '../../../models'; +import { OrderCardTemplateComponent } from '../../order/order-card-template.component'; + +@Component({ + selector: 'standard-payload-order-card', + templateUrl: './order-card.component.html', + imports: [OrderCardTemplateComponent], +}) +export class StandardPayloadOrderCardComponent { + @Input({ required: true }) orderItem!: IPosInOrderGood; + constructor() {} +} diff --git a/src/app/domains/pos/modules/landing/components/payment/form-dialog.component.html b/src/app/domains/pos/modules/landing/components/payment/form-dialog.component.html new file mode 100644 index 0000000..3006830 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payment/form-dialog.component.html @@ -0,0 +1,49 @@ + +
+ + +
+ + + + + + + + + + + + + + + + + + + +
diff --git a/src/app/domains/pos/modules/landing/components/payment/form-dialog.component.ts b/src/app/domains/pos/modules/landing/components/payment/form-dialog.component.ts new file mode 100644 index 0000000..e6371b7 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/payment/form-dialog.component.ts @@ -0,0 +1,116 @@ +import { ToastService } from '@/core/services/toast.service'; +import { AbstractFormDialog } from '@/shared/abstractClasses'; +import { InputComponent, KeyValueComponent } from '@/shared/components'; +import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { Component, computed, inject, signal } from '@angular/core'; +import { ReactiveFormsModule, Validators } from '@angular/forms'; +import { ButtonDirective } from 'primeng/button'; +import { Dialog } from 'primeng/dialog'; +import { Observable } from 'rxjs'; +import { IPayment, TOrderPaymentTypes } from '../../models'; +import { PosLandingStore } from '../../store/main.store'; + +@Component({ + selector: 'pos-payment-form-dialog', + templateUrl: './form-dialog.component.html', + imports: [ + ReactiveFormsModule, + InputComponent, + FormFooterActionsComponent, + KeyValueComponent, + ButtonDirective, + Dialog, + ], +}) +export class PosPaymentFormDialogComponent extends AbstractFormDialog { + private readonly store = inject(PosLandingStore); + private readonly toastServices = inject(ToastService); + + readonly totalAmount = computed(() => this.store.orderPricingInfo().totalAmount); + + readonly remainedAmount = signal(this.totalAmount()); + setOffMax = signal(this.remainedAmount()); + cashMax = signal(this.remainedAmount()); + terminalMax = signal(this.remainedAmount()); + + submitOrderLoading = computed(() => this.store.submitOrderLoading()); + + private initForm = () => { + const form = this.fb.group({ + set_off: [this.initialValues?.set_off || 0], + cash: [this.initialValues?.cash || 0], + terminal: [this.initialValues?.terminal || 0], + }); + + form.valueChanges.subscribe((value) => { + const totalValue = (value.cash || 0) + (value.set_off || 0) + (value.terminal || 0); + const remainedAmount = this.totalAmount() - totalValue; + + const setOffMax = remainedAmount + (value.set_off || 0); + const cashMax = remainedAmount + (value.cash || 0); + const terminalMax = remainedAmount + (value.terminal || 0); + + form.controls.set_off.clearValidators(); + form.controls.set_off.addValidators([Validators.max(setOffMax)]); + form.controls.cash.clearValidators(); + form.controls.cash.addValidators([Validators.max(cashMax)]); + form.controls.terminal.clearValidators(); + form.controls.terminal.addValidators([Validators.max(terminalMax)]); + + this.remainedAmount.set(remainedAmount); + this.cashMax.set(cashMax); + this.terminalMax.set(terminalMax); + this.setOffMax.set(setOffMax); + }); + + return form; + }; + + form = this.initForm(); + + fillRemained(type: TOrderPaymentTypes) { + switch (type) { + case 'TERMINAL': + this.form.controls.terminal.setValue( + (this.form.controls.terminal.value || 0) + this.remainedAmount(), + ); + break; + + case 'CASH': + this.form.controls.cash.setValue( + (this.form.controls.cash.value || 0) + this.remainedAmount(), + ); + break; + + case 'SET_OFF': + this.form.controls.set_off.setValue( + (this.form.controls.set_off.value || 0) + this.remainedAmount(), + ); + break; + } + } + + override submitForm() { + if (this.remainedAmount() > 0) { + return this.toastServices.warn({ + text: 'فاکتور تسویه نشده است. لطفا مبلغ پرداخت را کامل کنید..', + }); + } + + const payment = this.form.value as IPayment; + this.store.setPayment(payment); + + this.store.submitOrder().then((res) => { + if (res) { + this.close(); + this.toastServices.success({ + text: 'فاکتور شما با موفقیت ایجاد شد', + }); + } + }); + + return new Observable((observer) => observer.next(payment)); + } + + override onSuccess(response: IPayment): void {} +} diff --git a/src/app/domains/pos/modules/landing/components/pre-invoice-dialog.component.html b/src/app/domains/pos/modules/landing/components/pre-invoice-dialog.component.html new file mode 100644 index 0000000..0486e44 --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/pre-invoice-dialog.component.html @@ -0,0 +1,11 @@ + +
+ +
diff --git a/src/app/domains/pos/modules/landing/components/pre-invoice-dialog.component.ts b/src/app/domains/pos/modules/landing/components/pre-invoice-dialog.component.ts new file mode 100644 index 0000000..fb47fbf --- /dev/null +++ b/src/app/domains/pos/modules/landing/components/pre-invoice-dialog.component.ts @@ -0,0 +1,25 @@ +import { AbstractDialog } from '@/shared/abstractClasses/abstract-dialog'; +import { UikitFlatpickrJalaliComponent } from '@/uikit'; +import { Component, inject } from '@angular/core'; +import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; +import { Dialog } from 'primeng/dialog'; +import { PosLandingStore } from '../store/main.store'; + +@Component({ + selector: 'pos-pre-invoice-dialog', + templateUrl: './pre-invoice-dialog.component.html', + imports: [Dialog, UikitFlatpickrJalaliComponent, ReactiveFormsModule], +}) +export class PosPreInvoiceDialogComponent extends AbstractDialog { + private readonly store = inject(PosLandingStore); + private readonly fb = inject(FormBuilder); + + private initForm() { + const form = this.fb.group({ + invoiceDate: [this.store.invoiceDate(), [Validators.required]], + }); + return form; + } + + form = this.initForm(); +} diff --git a/src/app/domains/pos/modules/landing/constants/apiRoutes/index.ts b/src/app/domains/pos/modules/landing/constants/apiRoutes/index.ts index 4d95d06..08706b6 100644 --- a/src/app/domains/pos/modules/landing/constants/apiRoutes/index.ts +++ b/src/app/domains/pos/modules/landing/constants/apiRoutes/index.ts @@ -3,4 +3,6 @@ const baseUrl = '/api/v1/pos'; export const POS_API_ROUTES = { info: () => `${baseUrl}`, goods: () => `${baseUrl}/goods`, + goodCategories: () => `${baseUrl}/good_categories`, + submitOrder: () => `${baseUrl}/sales_invoices`, }; diff --git a/src/app/domains/pos/modules/landing/models/accounts_io.d.ts b/src/app/domains/pos/modules/landing/models/accounts_io.d.ts deleted file mode 100644 index 54bdb83..0000000 --- a/src/app/domains/pos/modules/landing/models/accounts_io.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TAccountType } from '@/core/constants/accountTypes.const'; - -export interface IAccountRawResponse { - username: string; - id: string; -} -export interface IAccountResponse extends IAccountRawResponse {} - -export interface IAccountRequest { - username: string; - password?: string; - type: TAccountType; -} diff --git a/src/app/domains/pos/modules/landing/models/customer.ts b/src/app/domains/pos/modules/landing/models/customer.ts new file mode 100644 index 0000000..0df00e5 --- /dev/null +++ b/src/app/domains/pos/modules/landing/models/customer.ts @@ -0,0 +1,28 @@ +export interface IIndividualCustomer { + first_name: string; + last_name: string; + national_id: string; + postal_code: string; + economic_code: string; + is_favorite?: boolean; +} +export interface ILegalCustomer { + company_name: string; + economic_code: string; + registration_number: string; + postal_code: string; + is_favorite?: boolean; +} + +export interface IUnknownCustomer { + national_id: string; + name: string; +} + +export interface ICustomer { + customerIndividuals?: IIndividualCustomer; + customerLegals?: ILegalCustomer; + customerUnknown?: IUnknownCustomer; +} + +export type TCustomerInfo = IIndividualCustomer | ILegalCustomer | IUnknownCustomer; diff --git a/src/app/domains/pos/modules/landing/models/index.ts b/src/app/domains/pos/modules/landing/models/index.ts index 388437e..a0c0322 100644 --- a/src/app/domains/pos/modules/landing/models/index.ts +++ b/src/app/domains/pos/modules/landing/models/index.ts @@ -1,2 +1,5 @@ -export * from './accounts_io'; +export * from './customer'; export * from './io'; +export * from './payload'; +export * from './payment'; +export * from './types'; diff --git a/src/app/domains/pos/modules/landing/models/io.d.ts b/src/app/domains/pos/modules/landing/models/io.d.ts index 32d0943..8f0bfb1 100644 --- a/src/app/domains/pos/modules/landing/models/io.d.ts +++ b/src/app/domains/pos/modules/landing/models/io.d.ts @@ -1,18 +1,18 @@ -import { TRoles } from '@/core'; +import { CustomerType } from '@/shared/localEnum/constants/customerTypes'; +import { ICustomer } from './customer'; +import { IPayment } from './payment'; +import { IPosOrderItem } from './types'; -export interface IUserRawResponse { - mobile_number: string; - first_name: string; - last_name: string; - fullname: string; - id: string; - role: TRoles; +export interface IPosOrderRequest { + total_amount: number; + invoice_date: string; + payments: IPayment; + items: IPosOrderItem[]; + notes?: string; + customer_type?: CustomerType; + customerId?: string; + customer?: ICustomer; } -export interface IUserResponse extends IUserRawResponse {} -export interface IUserRequest { - first_name: string; - last_name: string; - mobile_number: string; - role: TRoles; -} +export interface IPosOrderRawResponse {} +export interface IPosOrderResponse extends IPosOrderRawResponse {} diff --git a/src/app/domains/pos/modules/landing/models/payload.ts b/src/app/domains/pos/modules/landing/models/payload.ts new file mode 100644 index 0000000..75c868f --- /dev/null +++ b/src/app/domains/pos/modules/landing/models/payload.ts @@ -0,0 +1,15 @@ +import { TGoldKarat } from '@/shared/localEnum/constants/goldKarat'; + +export interface IGoldPayload { + karat: TGoldKarat; + wages: number; + profit: number; + commission: number; + wages_amount: number; + profit_amount: number; + commission_amount: number; +} + +export interface IStandardPayload {} + +export type TPosOrderGoodPayload = IGoldPayload | IStandardPayload; diff --git a/src/app/domains/pos/modules/landing/models/payment.ts b/src/app/domains/pos/modules/landing/models/payment.ts new file mode 100644 index 0000000..95e3d4c --- /dev/null +++ b/src/app/domains/pos/modules/landing/models/payment.ts @@ -0,0 +1,7 @@ +export interface IPayment { + terminal: number; + cash: number; + set_off: number; +} + +export type TOrderPaymentTypes = 'TERMINAL' | 'CASH' | 'SET_OFF'; diff --git a/src/app/domains/pos/modules/landing/models/types.ts b/src/app/domains/pos/modules/landing/models/types.ts new file mode 100644 index 0000000..6bf2b50 --- /dev/null +++ b/src/app/domains/pos/modules/landing/models/types.ts @@ -0,0 +1,24 @@ +import { IGoodResponse } from '@/domains/pos/models/good.io'; +import { UnitType } from '@/utils'; +import { TPosOrderGoodPayload } from './payload'; + +export interface IPosOrderItem { + unit_price: number; + quantity: number; + total_amount: number; + discount_amount: number; + unit_type: UnitType; + good_id?: string; + service_id?: string; + notes?: string; + payload: T; + + base_total_amount: number; + discount: number; + tax_amount: number; +} + +export interface IPosInOrderGood extends Omit { + id: string; + good: IGoodResponse; +} diff --git a/src/app/domains/pos/modules/landing/services/main.service.ts b/src/app/domains/pos/modules/landing/services/main.service.ts index e067f17..512d51e 100644 --- a/src/app/domains/pos/modules/landing/services/main.service.ts +++ b/src/app/domains/pos/modules/landing/services/main.service.ts @@ -1,9 +1,16 @@ +import { IListingResponse } from '@/core/models/service.model'; +import { + IGoodCategoryRawResponse, + IGoodCategoryResponse, + IGoodRawResponse, + IGoodResponse, +} from '@/domains/pos/models/good.io'; import { IPosInfoRawResponse, IPosInfoResponse } from '@/domains/pos/models/pos.io'; import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { POS_API_ROUTES } from '../constants'; -import { IUserRawResponse, IUserResponse } from '../models'; +import { IPosOrderRawResponse, IPosOrderRequest, IPosOrderResponse } from '../models'; @Injectable({ providedIn: 'root' }) export class PosService { @@ -14,7 +21,17 @@ export class PosService { getInfo(): Observable { return this.http.get(this.apiRoutes.info()); } - getGoods(): Observable { - return this.http.get(this.apiRoutes.goods()); + getGoods(searchQuery: string): Observable> { + return this.http.get>(this.apiRoutes.goods()); + } + + getGoodCategories(): Observable> { + return this.http.get>( + this.apiRoutes.goodCategories(), + ); + } + + submitOrder(payload: IPosOrderRequest): Observable { + return this.http.post(this.apiRoutes.submitOrder(), payload); } } diff --git a/src/app/domains/pos/modules/landing/store/main.store.ts b/src/app/domains/pos/modules/landing/store/main.store.ts new file mode 100644 index 0000000..9c348f5 --- /dev/null +++ b/src/app/domains/pos/modules/landing/store/main.store.ts @@ -0,0 +1,249 @@ +import { Maybe } from '@/core'; +// import { ICustomerResponse } from '@/modules/customers/models'; +import { IGoodCategoryResponse, IGoodResponse } from '@/domains/pos/models/good.io'; +import { CustomerType } from '@/shared/localEnum/constants/customerTypes'; +import { createUUID, JALALI_DATE_FORMATS, nowJalali, parseJalali } from '@/utils'; +import { computed, inject, Injectable, signal } from '@angular/core'; +import { catchError, finalize, map, Observable, throwError } from 'rxjs'; +import { ICustomer, IPayment, IPosOrderRequest, IPosOrderResponse } from '../models'; +import { IPosInOrderGood, IPosOrderItem } from '../models/types'; +import { PosService } from '../services/main.service'; + +export type TViewType = 'list' | 'grid'; + +interface IPosLandingState { + getGoodsLoading: boolean; + goods: Maybe; + getGoodCategoriesLoading: boolean; + goodCategories: Maybe; + activeGoodCategory: Maybe; + inOrderGoods: IPosInOrderGood[]; + viewType: TViewType; + searchQuery: string; + customerDetails: { + customer_id?: string; + info?: ICustomer; + type: CustomerType; + }; + invoiceDate: string; + orderNote?: string; + payments: IPayment; + submitOrderLoading: boolean; +} + +export const INITIAL_POS_STATE: IPosLandingState = { + getGoodsLoading: true, + goods: null, + getGoodCategoriesLoading: true, + goodCategories: null, + activeGoodCategory: null, + inOrderGoods: [], + viewType: 'grid', + searchQuery: '', + customerDetails: { + type: CustomerType.UNKNOWN, + }, + invoiceDate: nowJalali(JALALI_DATE_FORMATS.NUMERIC), + payments: { + cash: 0, + set_off: 0, + terminal: 0, + }, + submitOrderLoading: false, +}; + +@Injectable({ providedIn: 'any' }) +export class PosLandingStore { + private readonly service = inject(PosService); + + private state$ = signal({ ...INITIAL_POS_STATE }); + + readonly goods = computed(() => this.state$().goods); + readonly getGoodsLoading = computed(() => this.state$().getGoodsLoading); + readonly inOrderGoods = computed(() => this.state$().inOrderGoods); + readonly goodCategories = computed(() => this.state$().goodCategories); + readonly getGoodCategoriesLoading = computed(() => this.state$().getGoodCategoriesLoading); + readonly activeGoodCategory = computed(() => this.state$().activeGoodCategory); + readonly viewType = computed(() => this.state$().viewType); + readonly searchQuery = computed(() => this.state$().searchQuery); + readonly submitOrderLoading = computed(() => this.state$().submitOrderLoading); + readonly activatedCategoryGoods = computed(() => { + if (!this.activeGoodCategory()) { + return this.state$().goods; + } + return this.state$().goods?.filter((s) => s.category.id === this.state$().activeGoodCategory); + }); + + readonly customer = computed(() => this.state$().customerDetails); + readonly invoiceDate = computed(() => this.state$().invoiceDate); + readonly payments = computed(() => this.state$().payments); + + readonly orderPricingInfo = computed(() => { + const totalAmount = 0; + const taxAmount = totalAmount * 0.1; + return { + totalItems: this.inOrderGoods().length, + totalBaseAmount: this.inOrderGoods().reduce((acc, curr) => acc + curr.base_total_amount, 0), + totalAmount: this.inOrderGoods().reduce((acc, curr) => acc + curr.total_amount, 0), + taxAmount: this.inOrderGoods().reduce((acc, curr) => acc + curr.tax_amount, 0), + discountAmount: this.inOrderGoods().reduce((acc, curr) => acc + curr.discount_amount, 0), + payableAmount: totalAmount + taxAmount, + }; + }); + + setState(partial: Partial) { + this.state$.set({ ...this.state$(), ...partial }); + } + + reset() { + this.state$.set({ ...INITIAL_POS_STATE }); + } + + initial() { + this.getGoods(); + this.getGoodCategories(); + } + + fillInitial(data: Partial) { + this.state$.set({ ...INITIAL_POS_STATE, ...data }); + } + + getGoods() { + this.setState({ getGoodsLoading: true }); + this.service.getGoods(this.state$().searchQuery).subscribe({ + next: (res) => { + this.setState({ goods: res.data, getGoodsLoading: false }); + }, + error: () => { + this.setState({ getGoodsLoading: false }); + }, + }); + } + + getGoodCategories() { + this.setState({ getGoodCategoriesLoading: true }); + this.service + .getGoodCategories() + .pipe( + map((res) => { + return [ + { + id: '', + name: 'همه', + goods_count: res.data.reduce((acc, curr) => acc + curr.goods_count, 0), + }, + ...res.data, + ]; + }), + ) + .subscribe({ + next: (res) => { + this.setState({ + goodCategories: res, + getGoodCategoriesLoading: false, + activeGoodCategory: res[0]?.id, + }); + }, + error: () => { + this.setState({ getGoodCategoriesLoading: false }); + }, + }); + } + + changeActiveCategory(categoryId: string) { + this.setState({ activeGoodCategory: categoryId }); + } + + editInOrderGoods(inOrderGood: IPosInOrderGood) { + this.setState({ + inOrderGoods: [...this.inOrderGoods()].map((orderItem) => { + if (inOrderGood.id === orderItem.id) { + return inOrderGood; + } + return orderItem; + }), + }); + } + addToInOrderGoods(goodId: string, payload: IPosOrderItem) { + const good = this.state$().goods?.find((s) => s.id === goodId); + + if (!good) return; + + this.setState({ + inOrderGoods: [ + ...this.inOrderGoods(), + { + id: createUUID(), + good, + ...payload, + }, + ], + }); + } + + removeFromInOrderGoods(orderItemId: string) { + this.setState({ + inOrderGoods: this.state$().inOrderGoods.filter((p) => p.id !== orderItemId), + }); + } + + updateViewType(viewType: TViewType) { + this.setState({ viewType }); + } + updateSearchQuery(searchQuery: string) { + this.setState({ searchQuery }); + } + + resetInOrderGoods() { + this.setState({ inOrderGoods: [] }); + } + + setCustomer(customer: { customer_id?: string; info?: ICustomer; type: CustomerType }) { + console.log(customer); + + this.setState({ customerDetails: customer }); + } + + setPayment(payments: IPayment) { + this.setState({ payments }); + } + + async submitOrder() { + this.setState({ submitOrderLoading: true }); + const orderPayload: IPosOrderRequest = { + customerId: this.customer().customer_id, + customer_type: this.customer().type, + customer: this.customer().info, + items: this.inOrderGoods().map(({ good, ...rest }) => ({ + ...rest, + good_id: good.id, + unit_type: good.unit_type, + })), + invoice_date: parseJalali(this.invoiceDate()).toISOString(), + payments: this.payments(), + total_amount: this.orderPricingInfo().totalAmount, + }; + + let res: Maybe = null; + + await this.service + .submitOrder(orderPayload) + .pipe( + finalize(() => { + this.setState({ submitOrderLoading: false }); + }), + catchError(() => { + return throwError(''); + }), + ) + .subscribe((_res) => { + this.reset(); + res = _res; + }); + + if (res) { + return new Observable((observer) => observer.next(res!)); + } + return new Observable((observer) => observer.error()); + } +} diff --git a/src/app/domains/pos/modules/landing/views/root.component.html b/src/app/domains/pos/modules/landing/views/root.component.html index 2225ce1..615529c 100644 --- a/src/app/domains/pos/modules/landing/views/root.component.html +++ b/src/app/domains/pos/modules/landing/views/root.component.html @@ -1 +1,8 @@ -صفحه‌ی pos +
+
+ +
+
+ +
+
diff --git a/src/app/domains/pos/modules/landing/views/root.component.ts b/src/app/domains/pos/modules/landing/views/root.component.ts index a331fb5..208eaef 100644 --- a/src/app/domains/pos/modules/landing/views/root.component.ts +++ b/src/app/domains/pos/modules/landing/views/root.component.ts @@ -1,21 +1,13 @@ // import { CatalogRoleTagComponent } from '@/shared/catalog/roles'; -import { PosStore } from '@/domains/pos/pos.store'; -import { LayoutService } from '@/layout/service/layout.service'; -import { Component, computed, inject } from '@angular/core'; +import { Component } from '@angular/core'; +import { PosGoodsComponent } from '../components/goods.component'; +import { PosOrderSectionComponent } from '../components/order/order-section.component'; @Component({ selector: 'pos-landing', templateUrl: './root.component.html', + host: { class: 'grow overflow-hidden' }, + + imports: [PosGoodsComponent, PosOrderSectionComponent], }) -export class PosLandingComponent { - private readonly store = inject(PosStore); - private readonly layoutService = inject(LayoutService); - - private readonly posInfo = computed(() => this.store.entity()); - - ngOnInit() { - this.layoutService.setPanelInfo({ - title: `فروشگاه ${this.posInfo()?.complex.name} - ${this.posInfo()?.name}`, - }); - } -} +export class PosLandingComponent {} diff --git a/src/app/shared/abstractClasses/abstract-dialog.ts b/src/app/shared/abstractClasses/abstract-dialog.ts index f31aaeb..fd83f5c 100644 --- a/src/app/shared/abstractClasses/abstract-dialog.ts +++ b/src/app/shared/abstractClasses/abstract-dialog.ts @@ -5,16 +5,21 @@ import { Component, EventEmitter, Input, Output, signal } from '@angular/core'; template: '', }) export abstract class AbstractDialog { - @Input() + @Input({ required: true }) set visible(v: boolean) { this.visibleSignal.set(!!v); this.visibleChange.emit(!!v); + if (!v) { + this.onClose.emit(); + } } get visible() { return this.visibleSignal(); } private visibleSignal = signal(false); + @Output() onClose = new EventEmitter(); + close() { this.visible = false; } diff --git a/src/app/shared/apiEnum/constants/apiEnumTranslates.ts b/src/app/shared/apiEnum/constants/apiEnumTranslates.ts index b41e6e9..ba80758 100644 --- a/src/app/shared/apiEnum/constants/apiEnumTranslates.ts +++ b/src/app/shared/apiEnum/constants/apiEnumTranslates.ts @@ -1,7 +1,7 @@ import { TEnumApi } from '../models'; export const apiEnumTranslates = { - goldKarat: '', + goldKarat: 'عیار', userStatus: 'وضعیت کاربر', accountRole: 'نقش', accountStatus: 'وضعیت', diff --git a/src/app/shared/components/input/input.component.html b/src/app/shared/components/input/input.component.html index c525cea..5e62b87 100644 --- a/src/app/shared/components/input/input.component.html +++ b/src/app/shared/components/input/input.component.html @@ -16,6 +16,7 @@ [class]="` w-full ${size === 'large' ? 'p-inputtext-lg' : size === 'small' ? 'p-inputtext-sm' : ''}`" [required]="isRequired" [invalid]="control.invalid && (control.touched || control.dirty)" + (onInput)="onPriceInput($event)" (onBlur)="blur.emit()" /> @@ -39,7 +40,9 @@ (input)="onInput($event)" /> } - @if (preparedSuffix()) { + @if (suffixTemp) { + + } @else if (preparedSuffix()) { {{ preparedSuffix() }} } diff --git a/src/app/shared/components/input/input.component.ts b/src/app/shared/components/input/input.component.ts index fca544d..360085f 100644 --- a/src/app/shared/components/input/input.component.ts +++ b/src/app/shared/components/input/input.component.ts @@ -2,12 +2,21 @@ import { Maybe } from '@/core'; import { ToastService } from '@/core/services/toast.service'; import { UikitFieldComponent } from '@/uikit/uikit-field.component'; import { CommonModule } from '@angular/common'; -import { Component, computed, EventEmitter, inject, Input, Output } from '@angular/core'; +import { + Component, + computed, + ContentChild, + EventEmitter, + inject, + Input, + Output, + TemplateRef, +} from '@angular/core'; import { FormControl, ReactiveFormsModule, Validators } from '@angular/forms'; import { InputGroupModule } from 'primeng/inputgroup'; import { InputGroupAddon } from 'primeng/inputgroupaddon'; import { InputMaskModule } from 'primeng/inputmask'; -import { InputNumberModule } from 'primeng/inputnumber'; +import { InputNumberInputEvent, InputNumberModule } from 'primeng/inputnumber'; import { InputTextModule } from 'primeng/inputtext'; import { KeyFilterModule } from 'primeng/keyfilter'; import { ToggleSwitch } from 'primeng/toggleswitch'; @@ -33,6 +42,7 @@ export class InputComponent { @Input() type: | 'simple' | 'postalCode' + | 'nationalId' | 'mobile' | 'phone' | 'email' @@ -58,6 +68,8 @@ export class InputComponent { @Output() valueChange = new EventEmitter(); @Output() blur = new EventEmitter(); + @ContentChild('suffixTemp', { static: true }) suffixTemp!: TemplateRef | null; + private readonly toastService = inject(ToastService); // onInput(ev: Event) { @@ -80,6 +92,8 @@ export class InputComponent { return '09xxxxxxxx'; case 'postalCode': return 'کد پستی (۱۰ رقم)'; + case 'nationalId': + return 'کد ملی (۱۰ رقم)'; case 'phone': return 'شماره تلفن'; case 'email': @@ -96,6 +110,7 @@ export class InputComponent { case 'mobile': case 'phone': case 'postalCode': + case 'nationalId': case 'price': case 'number': return 'numeric'; @@ -113,6 +128,7 @@ export class InputComponent { case 'mobile': return 11; case 'postalCode': + case 'nationalId': return 10; case 'phone': return 11; @@ -132,6 +148,7 @@ export class InputComponent { break; case 'email': case 'postalCode': + case 'nationalId': inputClass.push('ltrInput', 'rtlPlaceholder'); break; } @@ -150,6 +167,7 @@ export class InputComponent { case 'phone': case 'price': case 'postalCode': + case 'nationalId': case 'number': return 'number'; case 'checkbox': @@ -165,11 +183,22 @@ export class InputComponent { return this.required || this.control.hasValidator(Validators.required); } - onInput($event: Event) { + onPriceInput($event: InputNumberInputEvent) { + console.log($event); + + this.onInput($event.originalEvent, true); + } + onInput($event: Event, isPriceFormat?: boolean) { // @ts-ignore - const value = $event.target.value as string; - if (this.type === 'number') { + let value = $event.target.value as string; + + if (isPriceFormat) { + value = value.replace(/,/g, ''); + } + + if (this.inputMode === 'numeric') { let newValue = parseFloat(value); + // console.log(value, newValue); const minValidator = (this.min || this.min === 0) && parseFloat(value) < this.min!; const maxValidator = (this.max || this.max === 0) && parseFloat(value) > this.max; @@ -187,10 +216,20 @@ export class InputComponent { } newValue = parseFloat(value.slice(0, value.length - 1)); - // @ts-ignore - $event.target.value = newValue; + if (newValue < 0 || isNaN(newValue)) { + newValue = 0; + } + + if (isPriceFormat) { + // @ts-ignore + $event.target.value = newValue.toLocaleString('en-US'); + } else { + // @ts-ignore + $event.target.value = newValue; + } + + this.control.setValue(newValue); } - this.control.setValue(newValue); } if (this.preparedMaxLength && this.preparedMaxLength < value.length) { diff --git a/src/app/shared/components/key-value.component/key-value.component.html b/src/app/shared/components/key-value.component/key-value.component.html index 007675c..b48676e 100644 --- a/src/app/shared/components/key-value.component/key-value.component.html +++ b/src/app/shared/components/key-value.component/key-value.component.html @@ -1,6 +1,17 @@ -
- {{ label }}: - - {{ value || "-" }} - +
+
+ {{ label }}: +
+ + @if (valueType() === "badge") { + + } @else { + {{ valueToShow() }} + } + +
+
+ @if (hint) { + {{ hint }} + }
diff --git a/src/app/shared/components/key-value.component/key-value.component.ts b/src/app/shared/components/key-value.component/key-value.component.ts index fb550e1..50e7455 100644 --- a/src/app/shared/components/key-value.component/key-value.component.ts +++ b/src/app/shared/components/key-value.component/key-value.component.ts @@ -1,10 +1,13 @@ +import { formatDurationToText, formatJalali, JALALI_DATE_FORMATS } from '@/utils'; +import priceMaskUtils from '@/utils/price-mask.utils'; import { CommonModule } from '@angular/common'; -import { Component, Input } from '@angular/core'; +import { Component, computed, Input, signal } from '@angular/core'; +import { Badge } from 'primeng/badge'; @Component({ selector: 'app-key-value', standalone: true, - imports: [CommonModule], + imports: [CommonModule, Badge], templateUrl: './key-value.component.html', host: { class: 'w-full block', @@ -12,5 +15,86 @@ import { Component, Input } from '@angular/core'; }) export class KeyValueComponent { @Input() label!: string; - @Input() value?: string = '-'; + @Input() value?: string | boolean | number; + @Input() hint?: string; + @Input() type: + | 'price' + | 'active' + | 'boolean' + | 'has' + | 'date' + | 'dateTime' + | 'duration' + | 'simple' = 'simple'; + @Input() trueValueToShow?: string; + @Input() falseValueToShow?: string; + @Input() variant?: 'badge' | 'text'; + + valueToShow = signal(this.setValueToShow()); + + ngOnChanges() { + this.valueToShow.set(this.setValueToShow()); + } + + setValueToShow() { + let value = this.value; + if (this.type !== 'simple') { + if (this.value) { + if (this.trueValueToShow) { + value = this.trueValueToShow; + } else { + switch (this.type) { + case 'date': + if (typeof this.value === 'boolean') return '-'; + + // @ts-ignore + return formatJalali(this.value); + case 'dateTime': + if (typeof this.value === 'boolean') return '-'; + // @ts-ignore + + return formatJalali(this.value, JALALI_DATE_FORMATS.NUMERIC_WITH_TIME); + case 'duration': + return formatDurationToText(this.value as string); + case 'price': + return priceMaskUtils.formatWithCurrency(this.value as number); + case 'active': + value = 'فعال'; + break; + case 'boolean': + value = 'بله'; + break; + case 'has': + value = 'دارد'; + break; + } + } + } else { + if (this.falseValueToShow) { + value = this.falseValueToShow; + } else { + switch (this.type) { + case 'active': + value = 'غیر فعال'; + break; + case 'boolean': + value = 'خیر'; + break; + case 'has': + value = 'ندارد'; + break; + } + } + } + } + switch (this.type) { + case 'simple': + return this.value || ''; + } + return value; + } + + valueType = computed(() => + this.variant || ['boolean', 'has', 'active'].includes(this.type) ? 'badge' : 'text', + ); } diff --git a/src/app/shared/localEnum/constants/customerTypes.ts b/src/app/shared/localEnum/constants/customerTypes.ts new file mode 100644 index 0000000..9e837e7 --- /dev/null +++ b/src/app/shared/localEnum/constants/customerTypes.ts @@ -0,0 +1,7 @@ +export const CustomerType = { + INDIVIDUAL: 'INDIVIDUAL', + LEGAL: 'LEGAL', + UNKNOWN: 'UNKNOWN', +} as const; + +export type CustomerType = (typeof CustomerType)[keyof typeof CustomerType]; diff --git a/src/app/shared/localEnum/constants/goldKarat.ts b/src/app/shared/localEnum/constants/goldKarat.ts new file mode 100644 index 0000000..3da0544 --- /dev/null +++ b/src/app/shared/localEnum/constants/goldKarat.ts @@ -0,0 +1,21 @@ +import { ISelectItem } from '@/shared/abstractClasses'; + +export const goldKarat = { + KARAT_18: 'KARAT_18', + KARAT_21: 'KARAT_21', + KARAT_24: 'KARAT_24', +} as const; +export type TGoldKarat = (typeof goldKarat)[keyof typeof goldKarat]; + +const translates: Record = { + KARAT_18: '18', + KARAT_21: '21', + KARAT_24: '24', +}; + +export const goldKaratSelect: ISelectItem[] = Object.keys(goldKarat).map((key) => ({ + id: key, + name: translates[key], +})); + +export const goldKaratLabel = 'عیار'; diff --git a/src/app/shared/localEnum/constants/index.ts b/src/app/shared/localEnum/constants/index.ts new file mode 100644 index 0000000..136da46 --- /dev/null +++ b/src/app/shared/localEnum/constants/index.ts @@ -0,0 +1,8 @@ +import { goldKaratLabel, goldKaratSelect } from './goldKarat'; + +export const LOCAL_ENUMS = { + gold: { + label: goldKaratLabel, + items: goldKaratSelect, + }, +}; diff --git a/src/app/shared/localEnum/models/index.ts b/src/app/shared/localEnum/models/index.ts new file mode 100644 index 0000000..d390b4d --- /dev/null +++ b/src/app/shared/localEnum/models/index.ts @@ -0,0 +1,2 @@ +export * from './io'; +export * from './types'; diff --git a/src/app/shared/localEnum/models/io.d.ts b/src/app/shared/localEnum/models/io.d.ts new file mode 100644 index 0000000..6b11640 --- /dev/null +++ b/src/app/shared/localEnum/models/io.d.ts @@ -0,0 +1,4 @@ +export interface IEnumResponse { + name: string; + value: string; +} diff --git a/src/app/shared/localEnum/models/types.d.ts b/src/app/shared/localEnum/models/types.d.ts new file mode 100644 index 0000000..20f34c4 --- /dev/null +++ b/src/app/shared/localEnum/models/types.d.ts @@ -0,0 +1,3 @@ +import { LOCAL_ENUMS } from '../constants'; + +export type TLocalEnum = keyof typeof LOCAL_ENUMS; diff --git a/src/app/shared/localEnum/select.component.html b/src/app/shared/localEnum/select.component.html new file mode 100644 index 0000000..c2e543d --- /dev/null +++ b/src/app/shared/localEnum/select.component.html @@ -0,0 +1,12 @@ + + + diff --git a/src/app/shared/localEnum/select.component.ts b/src/app/shared/localEnum/select.component.ts new file mode 100644 index 0000000..827f1bd --- /dev/null +++ b/src/app/shared/localEnum/select.component.ts @@ -0,0 +1,30 @@ +import { UikitFieldComponent } from '@/uikit'; +import { Component, computed, Input } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { Select } from 'primeng/select'; +import { Observable } from 'rxjs'; +import { AbstractSelectComponent, ISelectItem } from '../abstractClasses'; +import { LOCAL_ENUMS } from './constants'; +import { TLocalEnum } from './models'; + +@Component({ + selector: 'app-enum-select', + templateUrl: './select.component.html', + imports: [UikitFieldComponent, Select, ReactiveFormsModule], +}) +export class EnumSelectComponent extends AbstractSelectComponent { + @Input() type!: TLocalEnum; + @Input() customLabel?: string; + + label = computed(() => this.customLabel ?? LOCAL_ENUMS[this.type].label); + + override getDataService() { + return new Observable((observer) => { + return observer.next(LOCAL_ENUMS[this.type].items); + }); + } + + ngOnInit() { + this.getData(); + } +} diff --git a/src/app/utils/date-formatter.utils.ts b/src/app/utils/date-formatter.utils.ts new file mode 100644 index 0000000..9173acf --- /dev/null +++ b/src/app/utils/date-formatter.utils.ts @@ -0,0 +1,342 @@ +import jalaliPlugin from '@zoomit/dayjs-jalali-plugin'; +import dayjs, { Dayjs } from 'dayjs'; +import 'dayjs/locale/fa'; +import relativeTime from 'dayjs/plugin/relativeTime'; + +// Extend dayjs with plugins +dayjs.extend(jalaliPlugin); +dayjs.extend(relativeTime); + +/** + * Common date format patterns for Jalali calendar + */ +export const JALALI_DATE_FORMATS = { + /** Full date with weekday: "پنج‌شنبه، ۱۳ شهریور ۱۳۹۷" */ + FULL_WITH_WEEKDAY: 'dddd، DD MMMM YYYY', + /** Full date: "۱۳ شهریور ۱۳۹۷" */ + FULL: 'DD MMMM YYYY', + /** Short date with month name: "۱۳ شهریور ۹۷" */ + SHORT: 'DD MMMM YY', + /** Numeric date: "۱۳۹۷/۰۶/۱۳" */ + NUMERIC: 'YYYY/MM/DD', + /** Numeric date with time: "۱۳۹۷/۰۶/۱۳ ۱۶:۳۰" */ + NUMERIC_WITH_TIME: 'YYYY/MM/DD HH:mm', + /** Numeric date with full time: "۱۳۹۷/۰۶/۱۳ ۱۶:۳۰:۱۵" */ + NUMERIC_WITH_FULL_TIME: 'YYYY/MM/DD HH:mm:ss', + /** Time only: "۱۶:۳۰" */ + TIME: 'HH:mm', + /** Time with seconds: "۱۶:۳۰:۱۵" */ + TIME_WITH_SECONDS: 'HH:mm:ss', + /** Month and year: "شهریور ۱۳۹۷" */ + MONTH_YEAR: 'MMMM YYYY', + /** Day and month: "۱۳ شهریور" */ + DAY_MONTH: 'DD MMMM', +} as const; + +/** + * Common date format patterns for Gregorian calendar + */ +export const GREGORIAN_DATE_FORMATS = { + /** Full date with weekday: "Thursday, September 04 2018" */ + FULL_WITH_WEEKDAY: 'dddd, MMMM DD YYYY', + /** Full date: "September 04 2018" */ + FULL: 'MMMM DD YYYY', + /** Short date: "Sep 04 18" */ + SHORT: 'MMM DD YY', + /** Numeric date: "2018-09-04" */ + NUMERIC: 'YYYY-MM-DD', + /** Numeric date with time: "2018-09-04 16:30" */ + NUMERIC_WITH_TIME: 'YYYY-MM-DD HH:mm', + /** Numeric date with full time: "2018-09-04 16:30:15" */ + NUMERIC_WITH_FULL_TIME: 'YYYY-MM-DD HH:mm:ss', + /** Time only: "16:30" */ + TIME: 'HH:mm', + /** Time with seconds: "16:30:15" */ + TIME_WITH_SECONDS: 'HH:mm:ss', + /** Month and year: "September 2018" */ + MONTH_YEAR: 'MMMM YYYY', + /** Day and month: "September 04" */ + DAY_MONTH: 'MMMM DD', +} as const; + +/** + * Format a date as Jalali (Persian) calendar in Farsi locale + * + * @param date - Date to format (string, Date, Dayjs, or timestamp) + * @param format - Format pattern (default: 'YYYY/MM/DD') + * @returns Formatted date string in Jalali calendar + * + * @example + * formatJalali('2018-09-04') // '1397/06/13' + * formatJalali('2018-09-04', JALALI_DATE_FORMATS.FULL) // '۱۳ شهریور ۱۳۹۷' + * formatJalali(new Date(), JALALI_DATE_FORMATS.FULL_WITH_WEEKDAY) // 'پنج‌شنبه، ۱۳ شهریور ۱۳۹۷' + */ +export function formatJalali( + date: string | Date | Dayjs | number, + format: string = JALALI_DATE_FORMATS.NUMERIC, +): string { + return dayjs(date).calendar('jalali').locale('fa').format(format); +} + +/** + * Format a date as Gregorian calendar in English locale + * + * @param date - Date to format (string, Date, Dayjs, or timestamp) + * @param format - Format pattern (default: 'YYYY-MM-DD') + * @returns Formatted date string in Gregorian calendar + * + * @example + * formatGregorian('1397/06/13', GREGORIAN_DATE_FORMATS.FULL) // 'September 04 2018' + * formatGregorian(new Date(), GREGORIAN_DATE_FORMATS.NUMERIC_WITH_TIME) // '2018-09-04 16:30' + */ +export function formatGregorian( + date: string | Date | Dayjs | number, + format: string = GREGORIAN_DATE_FORMATS.NUMERIC, +): string { + return dayjs(date).calendar('gregory').locale('en').format(format); +} + +/** + * Parse a Jalali date string and return a Dayjs instance + * + * @param jalaliDate - Jalali date string (e.g., '1398-10-17') + * @param format - Optional format pattern for parsing + * @returns Dayjs instance + * + * @example + * parseJalali('1398-10-17') // Dayjs instance + * parseJalali('1398/10/17') // Dayjs instance + */ +export function parseJalali(jalaliDate: string, format?: string): Dayjs { + return dayjs(jalaliDate, { jalali: true, ...(format && { format }) }); +} + +/** + * Convert a Gregorian date to Jalali format + * + * @param gregorianDate - Gregorian date string, Date object, or Dayjs instance + * @param format - Optional format pattern (default: 'YYYY/MM/DD') + * @returns Formatted Jalali date string + * + * @example + * gregorianToJalali('2018-09-04') // '1397/06/13' + * gregorianToJalali('2018-09-04', JALALI_DATE_FORMATS.FULL) // '۱۳ شهریور ۱۳۹۷' + */ +export function gregorianToJalali( + gregorianDate: string | Date | Dayjs, + format: string = JALALI_DATE_FORMATS.NUMERIC, +): string { + return dayjs(gregorianDate).calendar('jalali').locale('fa').format(format); +} + +/** + * Convert a Jalali date to Gregorian format + * + * @param jalaliDate - Jalali date string (e.g., '1398-10-17') + * @param format - Optional format pattern (default: 'YYYY-MM-DD') + * @returns Formatted Gregorian date string + * + * @example + * jalaliToGregorian('1398-10-17') // '2020-01-07' + * jalaliToGregorian('1397/06/13', GREGORIAN_DATE_FORMATS.FULL) // 'September 04 2018' + */ +export function jalaliToGregorian( + jalaliDate: string, + format: string = GREGORIAN_DATE_FORMATS.NUMERIC, +): string { + return parseJalali(jalaliDate).calendar('gregory').locale('en').format(format); +} + +/** + * Get current date and time in Jalali format + * + * @param format - Optional format pattern (default: 'YYYY/MM/DD HH:mm') + * @returns Current date and time in Jalali format + * + * @example + * nowJalali() // '1403/12/05 14:30' + * nowJalali(JALALI_DATE_FORMATS.FULL_WITH_WEEKDAY) // 'یکشنبه، ۵ اسفند ۱۴۰۳' + */ +export function nowJalali(format: string = JALALI_DATE_FORMATS.NUMERIC_WITH_TIME): string { + return dayjs().calendar('jalali').locale('fa').format(format); +} + +/** + * Get current date and time in Gregorian format + * + * @param format - Optional format pattern (default: 'YYYY-MM-DD HH:mm') + * @returns Current date and time in Gregorian format + * + * @example + * nowGregorian() // '2026-02-24 14:30' + * nowGregorian(GREGORIAN_DATE_FORMATS.FULL_WITH_WEEKDAY) // 'Sunday, February 24 2026' + */ +export function nowGregorian(format: string = GREGORIAN_DATE_FORMATS.NUMERIC_WITH_TIME): string { + return dayjs().calendar('gregory').locale('en').format(format); +} + +/** + * Format a time duration as a relative time string in Farsi + * + * @param date - Date to compare against current time + * @returns Relative time string in Farsi + * + * @example + * relativeTimeJalali(dayjs().subtract(2, 'day')) // '۲ روز پیش' + */ +export function relativeTimeJalali(date: string | Date | Dayjs | number): string { + return dayjs(date).locale('fa').fromNow(); +} + +/** + * Check if a date string is a valid Jalali date + * + * @param jalaliDate - Jalali date string + * @returns true if valid, false otherwise + * + * @example + * isValidJalaliDate('1398-10-17') // true + * isValidJalaliDate('1398-13-17') // false + */ +export function isValidJalaliDate(jalaliDate: string): boolean { + return parseJalali(jalaliDate).isValid(); +} + +/** + * Get the start of day for a date in Jalali calendar + * + * @param date - Date to get start of day for + * @returns Dayjs instance at start of day + * + * @example + * startOfDayJalali('1398-10-17') // Dayjs instance at 00:00:00 + */ +export function startOfDayJalali(date: string | Date | Dayjs | number): Dayjs { + return dayjs(date).calendar('jalali').startOf('day'); +} + +/** + * Get the end of day for a date in Jalali calendar + * + * @param date - Date to get end of day for + * @returns Dayjs instance at end of day + * + * @example + * endOfDayJalali('1398-10-17') // Dayjs instance at 23:59:59 + */ +export function endOfDayJalali(date: string | Date | Dayjs | number): Dayjs { + return dayjs(date).calendar('jalali').endOf('day'); +} + +/** + * Format a date with custom calendar and locale + * + * @param date - Date to format + * @param calendar - Calendar type ('jalali' | 'gregory') + * @param locale - Locale ('fa' | 'en') + * @param format - Format pattern + * @returns Formatted date string + * + * @example + * formatDate('2018-09-04', 'jalali', 'fa', 'DD MMMM YYYY') // '۱۳ شهریور ۱۳۹۷' + * formatDate('2018-09-04', 'gregory', 'en', 'MMMM DD YYYY') // 'September 04 2018' + */ +export function formatDate( + date: string | Date | Dayjs | number, + calendar: 'jalali' | 'gregory', + locale: 'fa' | 'en', + format: string, +): string { + return dayjs(date).calendar(calendar).locale(locale).format(format); +} + +/** + * Get Jalali month name in Farsi + * + * @param monthNumber - Month number (1-12) + * @returns Month name in Farsi + * + * @example + * getJalaliMonthName(1) // 'فروردین' + * getJalaliMonthName(6) // 'شهریور' + */ +export function getJalaliMonthName(monthNumber: number): string { + const monthNames = [ + 'فروردین', + 'اردیبهشت', + 'خرداد', + 'تیر', + 'مرداد', + 'شهریور', + 'مهر', + 'آبان', + 'آذر', + 'دی', + 'بهمن', + 'اسفند', + ]; + return monthNames[monthNumber - 1] || ''; +} + +/** + * Get Jalali weekday name in Farsi + * + * @param dayNumber - Day number (0-6, where 0 is Saturday) + * @returns Weekday name in Farsi + * + * @example + * getJalaliWeekdayName(0) // 'شنبه' + * getJalaliWeekdayName(4) // 'چهارشنبه' + */ +export function getJalaliWeekdayName(dayNumber: number): string { + const weekdayNames = ['شنبه', 'یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنج‌شنبه', 'جمعه']; + return weekdayNames[dayNumber] || ''; +} + +export function jalaliDiff( + date1: string | number | Date | Dayjs, + date2: string | number | Date | Dayjs, + unit: dayjs.OpUnitType = 'day', +): number { + return toJalali(date1).diff(toJalali(date2), unit); +} + +export function isJalaliBefore( + date1: string | number | Date | Dayjs, + date2: string | number | Date | Dayjs, +): boolean { + return toJalali(date1).isBefore(toJalali(date2)); +} + +export function isJalaliAfter( + date1: string | number | Date | Dayjs, + date2: string | number | Date | Dayjs, +): boolean { + return toJalali(date1).isAfter(toJalali(date2)); +} + +export function toJalali(date: string | number | Date | Dayjs, format = 'YYYY/MM/DD'): Dayjs { + return dayjs(date).calendar('jalali'); +} + +export default { + formatJalali, + formatGregorian, + parseJalali, + gregorianToJalali, + jalaliToGregorian, + nowJalali, + nowGregorian, + relativeTimeJalali, + isValidJalaliDate, + startOfDayJalali, + endOfDayJalali, + formatDate, + getJalaliMonthName, + getJalaliWeekdayName, + jalaliDiff, + isJalaliBefore, + isJalaliAfter, + JALALI_DATE_FORMATS, + GREGORIAN_DATE_FORMATS, +}; diff --git a/src/app/utils/good-unit-types.utils.ts b/src/app/utils/good-unit-types.utils.ts new file mode 100644 index 0000000..a5fb0f3 --- /dev/null +++ b/src/app/utils/good-unit-types.utils.ts @@ -0,0 +1,41 @@ +export const UnitType = { + COUNT: 'COUNT', + GRAM: 'GRAM', + KILOGRAM: 'KILOGRAM', + MILLILITER: 'MILLILITER', + LITER: 'LITER', + METER: 'METER', + HOUR: 'HOUR', +} as const; + +export type UnitType = (typeof UnitType)[keyof typeof UnitType]; + +export interface IUnitPreparedText { + quantitySymbolText: string; + quantityLabel: string; +} + +const translates: Record = { + COUNT: 'تعداد', + GRAM: 'گرم', + KILOGRAM: 'کیلوگرم', + METER: 'متر', + MILLILITER: 'میلی‌لیتر', + LITER: 'لیتر', + HOUR: 'ساعت', +}; + +export function getGoodUnitTypeProperties(unitType: UnitType): IUnitPreparedText { + const data = { + quantitySymbolText: translates[unitType], + quantityLabel: '', + }; + + if (['COUNT'].includes(unitType)) { + data.quantityLabel = 'تعداد'; + } else { + data.quantityLabel = 'مقدار'; + } + + return data; +} diff --git a/src/app/utils/index.ts b/src/app/utils/index.ts index 71ff882..f5abda6 100644 --- a/src/app/utils/index.ts +++ b/src/app/utils/index.ts @@ -1,6 +1,8 @@ export * from './currency'; -export * from './jalali-date.utils'; +export * from './date-formatter.utils'; +export * from './good-unit-types.utils'; export * from './name'; export * from './page-params.utils'; export * from './price-mask.utils'; export * from './time'; +export * from './uuid.utils'; diff --git a/src/app/utils/jalali-date.utils.ts b/src/app/utils/jalali-date.utils.ts deleted file mode 100644 index c961902..0000000 --- a/src/app/utils/jalali-date.utils.ts +++ /dev/null @@ -1,43 +0,0 @@ -import dayjs, { Dayjs } from 'dayjs'; -import jalaliday from 'jalaliday'; - -dayjs.extend(jalaliday); - -export function toJalali(date: string | number | Date | Dayjs, format = 'YYYY/MM/DD'): Dayjs { - return dayjs(date).calendar('jalali'); -} - -export function fromJalali(jalaliDate: string): Dayjs { - // Parse Jalali date string (e.g., '1404-09-21') - return dayjs(jalaliDate, { jalali: true }).calendar('gregory'); -} - -export function formatJalali(date: string | number | Date | Dayjs, format = 'YYYY/MM/DD'): string { - return toJalali(date).locale('fa').format(format); -} - -export function jalaliDiff( - date1: string | number | Date | Dayjs, - date2: string | number | Date | Dayjs, - unit: dayjs.OpUnitType = 'day', -): number { - return toJalali(date1).diff(toJalali(date2), unit); -} - -export function isJalaliBefore( - date1: string | number | Date | Dayjs, - date2: string | number | Date | Dayjs, -): boolean { - return toJalali(date1).isBefore(toJalali(date2)); -} - -export function isJalaliAfter( - date1: string | number | Date | Dayjs, - date2: string | number | Date | Dayjs, -): boolean { - return toJalali(date1).isAfter(toJalali(date2)); -} - -export function nowJalali(): Dayjs { - return dayjs().calendar('jalali'); -} diff --git a/src/app/utils/time.ts b/src/app/utils/time.ts index 5118aa5..421a4e2 100644 --- a/src/app/utils/time.ts +++ b/src/app/utils/time.ts @@ -10,4 +10,34 @@ export function timeToSeconds(time: string): number { return hours * 3600 + minutes * 60 + seconds; } -export default { timeToSeconds }; +/** + * Format duration string to Persian format + * Returns formatted string with hours, minutes, and/or seconds + * Excludes zero values from the output + * + * Examples: + * formatDurationToText("01:30:00") -> "1 ساعت و 30 دقیقه" + * formatDurationToText("00:30:00") -> "30 دقیقه" + * formatDurationToText("01:00:00") -> "1 ساعت" + * formatDurationToText("00:00:30") -> "30 ثانیه" + */ +export function formatDurationToText(time: string): string { + const [hours, minutes, seconds] = time.split(':').map(Number); + const parts: string[] = []; + + if (hours > 0) { + parts.push(`${hours} ساعت`); + } + + if (minutes > 0) { + parts.push(`${minutes} دقیقه`); + } + + if (seconds > 0) { + parts.push(`${seconds} ثانیه`); + } + + return parts.join(' و '); +} + +export default { timeToSeconds, formatDurationToText }; diff --git a/src/app/utils/uuid.utils.ts b/src/app/utils/uuid.utils.ts new file mode 100644 index 0000000..1efa588 --- /dev/null +++ b/src/app/utils/uuid.utils.ts @@ -0,0 +1 @@ +export const createUUID = () => Date.now().toString(36) + Math.random().toString(36).slice(2); diff --git a/src/assets/rtlSupport.scss b/src/assets/rtlSupport.scss index 6ed91de..3a236e5 100644 --- a/src/assets/rtlSupport.scss +++ b/src/assets/rtlSupport.scss @@ -47,3 +47,14 @@ input.p-inputtext { height: 1rem; margin-inline-end: 0.5rem; } + +.p-inputgroup > .p-component:first-child { + border-start-start-radius: 0 !important; + border-end-start-radius: 0 !important; + border-end-end-radius: var(--p-inputgroup-addon-border-radius); + border-start-end-radius: var(--p-inputgroup-addon-border-radius); +} + +.p-tablist { + margin: auto; +} diff --git a/src/assets/styles.scss b/src/assets/styles.scss index 1d52eb5..d674482 100644 --- a/src/assets/styles.scss +++ b/src/assets/styles.scss @@ -7,3 +7,9 @@ @use "primeicons/primeicons.css"; @use "./demo/demo.scss"; @use "./rtlSupport.scss"; + +form { + display: flex; + flex-direction: column; + gap: 1rem; +}