From 099c613ccc01e879bc64690ce3c4149824bd9e12 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 23 Dec 2024 12:23:53 +0100 Subject: [PATCH 01/55] feat: update_vitest_version to 2.0.0 --- package.json | 2 +- pnpm-lock.yaml | 668 ++++-------------- .../__tests__/pages/Claims/ClaimPhoto.spec.js | 6 +- .../__tests__/pages/Login/Login.spec.js | 3 +- test/vitest/helper.js | 33 +- test/vitest/setup-file.js | 26 + 6 files changed, 187 insertions(+), 551 deletions(-) diff --git a/package.json b/package.json index b5e62af11..d44f3d5b0 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "husky": "^8.0.0", "postcss": "^8.4.23", "prettier": "^2.8.8", - "vitest": "^0.31.1" + "vitest": "^2.0.0" }, "engines": { "node": "^20 || ^18 || ^16", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83dfa0469..53e2bfd71 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,7 +60,7 @@ devDependencies: version: 4.0.0-beta.15 '@quasar/quasar-app-extension-testing-unit-vitest': specifier: ^0.4.0 - version: 0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(typescript@5.5.4)(vite@5.1.4)(vitest@0.31.4)(vue@3.4.19) + version: 0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(typescript@5.5.4)(vite@5.1.4)(vitest@2.1.8)(vue@3.4.19) '@vue/test-utils': specifier: ^2.4.4 version: 2.4.4(vue@3.4.19) @@ -95,8 +95,8 @@ devDependencies: specifier: ^2.8.8 version: 2.8.8 vitest: - specifier: ^0.31.1 - version: 0.31.4 + specifier: ^2.0.0 + version: 2.1.8(@types/node@20.11.19) packages: @@ -367,15 +367,6 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.19.12: resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} @@ -385,15 +376,6 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.19.12: resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} @@ -403,15 +385,6 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.19.12: resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} @@ -421,15 +394,6 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.12: resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} @@ -439,15 +403,6 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.12: resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} @@ -457,15 +412,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.12: resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} @@ -475,15 +421,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.19.12: resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} @@ -493,15 +430,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.12: resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} @@ -511,15 +439,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.19.12: resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} @@ -529,15 +448,6 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.19.12: resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} @@ -547,15 +457,6 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.19.12: resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} @@ -565,15 +466,6 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.19.12: resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} @@ -583,15 +475,6 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.19.12: resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} @@ -601,15 +484,6 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.19.12: resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} @@ -619,15 +493,6 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.19.12: resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} @@ -637,15 +502,6 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.19.12: resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} @@ -655,15 +511,6 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.12: resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} @@ -673,15 +520,6 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.12: resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} @@ -691,15 +529,6 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.12: resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} @@ -709,15 +538,6 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.12: resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} @@ -727,15 +547,6 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.12: resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} @@ -745,15 +556,6 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.12: resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} @@ -832,8 +634,8 @@ packages: vue-i18n: optional: true dependencies: - '@intlify/message-compiler': 10.0.0 - '@intlify/shared': 10.0.0 + '@intlify/message-compiler': 11.0.0-rc.1 + '@intlify/shared': 11.0.0-rc.1 jsonc-eslint-parser: 1.4.1 source-map: 0.6.1 vue-i18n: 9.9.1(vue@3.4.19) @@ -847,11 +649,11 @@ packages: '@intlify/message-compiler': 9.9.1 '@intlify/shared': 9.9.1 - /@intlify/message-compiler@10.0.0: - resolution: {integrity: sha512-OcaWc63NC/9p1cMdgoNKBj4d61BH8sUW1Hfs6YijTd9656ZR4rNqXAlRnBrfS5ABq0vjQjpa8VnyvH9hK49yBw==} + /@intlify/message-compiler@11.0.0-rc.1: + resolution: {integrity: sha512-TGw2uBfuTFTegZf/BHtUQBEKxl7Q/dVGLoqRIdw8lFsp9g/53sYn5iD+0HxIzdYjbWL6BTJMXCPUHp9PxDTRPw==} engines: {node: '>= 16'} dependencies: - '@intlify/shared': 10.0.0 + '@intlify/shared': 11.0.0-rc.1 source-map-js: 1.0.2 dev: true @@ -862,8 +664,8 @@ packages: '@intlify/shared': 9.9.1 source-map-js: 1.0.2 - /@intlify/shared@10.0.0: - resolution: {integrity: sha512-6ngLfI7DOTew2dcF9WMJx+NnMWghMBhIiHbGg+wRvngpzD5KZJZiJVuzMsUQE1a5YebEmtpTEfUrDp/NqVGdiw==} + /@intlify/shared@11.0.0-rc.1: + resolution: {integrity: sha512-8tR1xe7ZEbkabTuE/tNhzpolygUn9OaYp9yuYAF4MgDNZg06C3Qny80bes2/e9/Wm3aVkPUlCw6WgU7mQd0yEg==} engines: {node: '>= 16'} dev: true @@ -887,7 +689,7 @@ packages: optional: true dependencies: '@intlify/bundle-utils': 4.0.0(vue-i18n@9.9.1) - '@intlify/shared': 10.0.0 + '@intlify/shared': 11.0.0-rc.1 '@rollup/pluginutils': 4.2.1 '@vue/compiler-sfc': 3.4.19 debug: 4.3.4(supports-color@8.1.1) @@ -937,6 +739,10 @@ packages: /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + dev: true + /@jridgewell/trace-mapping@0.3.22: resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} dependencies: @@ -1120,7 +926,7 @@ packages: '@quasar/quasar-ui-qcalendar': 4.0.0-beta.19 dev: true - /@quasar/quasar-app-extension-testing-unit-vitest@0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(typescript@5.5.4)(vite@5.1.4)(vitest@0.31.4)(vue@3.4.19): + /@quasar/quasar-app-extension-testing-unit-vitest@0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(typescript@5.5.4)(vite@5.1.4)(vitest@2.1.8)(vue@3.4.19): resolution: {integrity: sha512-eyzdUdmZiCueNS+5nedjMmzdbpCetSrtdGIwW6KplW1dTzRbLiNvYUjpBOxQGmJCgEhWy9zuswJ7MZ/bTql24Q==} engines: {node: '>= 12.22.1', npm: '>= 6.14.12', yarn: '>= 1.17.3'} peerDependencies: @@ -1139,7 +945,7 @@ packages: quasar: 2.14.5 vite-jsconfig-paths: 2.0.1(vite@5.1.4) vite-tsconfig-paths: 4.3.1(typescript@5.5.4)(vite@5.1.4) - vitest: 0.31.4 + vitest: 2.1.8(@types/node@20.11.19) vue: 3.4.19(typescript@5.5.4) transitivePeerDependencies: - supports-color @@ -1333,16 +1139,6 @@ packages: '@types/responselike': 1.0.3 dev: false - /@types/chai-subset@1.3.5: - resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} - dependencies: - '@types/chai': 4.3.12 - dev: true - - /@types/chai@4.3.12: - resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==} - dev: true - /@types/chrome@0.0.208: resolution: {integrity: sha512-VDU/JnXkF5qaI7WBz14Azpa2VseZTgML0ia/g/B1sr9OfdOnHiH/zZ7P7qCDqxSlkqJh76/bPc8jLFcx8rHJmw==} dependencies: @@ -1511,43 +1307,65 @@ packages: vue: 3.4.19(typescript@5.5.4) dev: true - /@vitest/expect@0.31.4: - resolution: {integrity: sha512-tibyx8o7GUyGHZGyPgzwiaPaLDQ9MMuCOrc03BYT0nryUuhLbL7NV2r/q98iv5STlwMgaKuFJkgBW/8iPKwlSg==} + /@vitest/expect@2.1.8: + resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} dependencies: - '@vitest/spy': 0.31.4 - '@vitest/utils': 0.31.4 - chai: 4.4.1 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + tinyrainbow: 1.2.0 dev: true - /@vitest/runner@0.31.4: - resolution: {integrity: sha512-Wgm6UER+gwq6zkyrm5/wbpXGF+g+UBB78asJlFkIOwyse0pz8lZoiC6SW5i4gPnls/zUcPLWS7Zog0LVepXnpg==} + /@vitest/mocker@2.1.8(vite@5.1.4): + resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true dependencies: - '@vitest/utils': 0.31.4 - concordance: 5.0.4 - p-limit: 4.0.0 + '@vitest/spy': 2.1.8 + estree-walker: 3.0.3 + magic-string: 0.30.17 + vite: 5.1.4(@types/node@20.11.19) + dev: true + + /@vitest/pretty-format@2.1.8: + resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} + dependencies: + tinyrainbow: 1.2.0 + dev: true + + /@vitest/runner@2.1.8: + resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + dependencies: + '@vitest/utils': 2.1.8 pathe: 1.1.2 dev: true - /@vitest/snapshot@0.31.4: - resolution: {integrity: sha512-LemvNumL3NdWSmfVAMpXILGyaXPkZbG5tyl6+RQSdcHnTj6hvA49UAI8jzez9oQyE/FWLKRSNqTGzsHuk89LRA==} + /@vitest/snapshot@2.1.8: + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} dependencies: - magic-string: 0.30.7 + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.17 pathe: 1.1.2 - pretty-format: 27.5.1 dev: true - /@vitest/spy@0.31.4: - resolution: {integrity: sha512-3ei5ZH1s3aqbEyftPAzSuunGICRuhE+IXOmpURFdkm5ybUADk+viyQfejNk6q8M5QGX8/EVKw+QWMEP3DTJDag==} + /@vitest/spy@2.1.8: + resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} dependencies: - tinyspy: 2.2.1 + tinyspy: 3.0.2 dev: true - /@vitest/utils@0.31.4: - resolution: {integrity: sha512-DobZbHacWznoGUfYU8XDPY78UubJxXfMNY1+SUdOp1NsI34eopSA6aZMeaGu10waSOeYwE8lxrd/pLfT0RMxjQ==} + /@vitest/utils@2.1.8: + resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} dependencies: - concordance: 5.0.4 - loupe: 2.3.7 - pretty-format: 27.5.1 + '@vitest/pretty-format': 2.1.8 + loupe: 3.1.2 + tinyrainbow: 1.2.0 dev: true /@vue/compiler-core@3.4.19: @@ -1667,11 +1485,6 @@ packages: acorn: 8.11.3 dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true - /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} @@ -1750,11 +1563,6 @@ packages: color-convert: 2.0.1 dev: true - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -1842,8 +1650,9 @@ packages: engines: {node: '>=0.8'} dev: true - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} dev: true /astral-regex@2.0.0: @@ -1936,10 +1745,6 @@ packages: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true - /blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - dev: true - /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -2136,17 +1941,15 @@ packages: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} dev: true - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + /chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 dev: true /chalk@2.4.2: @@ -2174,10 +1977,9 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} dev: true /check-more-types@2.24.0: @@ -2422,20 +2224,6 @@ packages: typedarray: 0.0.6 dev: false - /concordance@5.0.4: - resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} - engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} - dependencies: - date-time: 3.1.0 - esutils: 2.0.3 - fast-diff: 1.3.0 - js-string-escape: 1.0.1 - lodash: 4.17.21 - md5-hex: 3.0.1 - semver: 7.6.0 - well-known-symbols: 2.0.0 - dev: true - /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} dependencies: @@ -2670,13 +2458,6 @@ packages: assert-plus: 1.0.0 dev: true - /date-time@3.1.0: - resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} - engines: {node: '>=6'} - dependencies: - time-zone: 1.0.0 - dev: true - /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true @@ -2760,11 +2541,9 @@ packages: mimic-response: 3.1.0 dev: false - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 dev: true /deep-extend@0.6.0: @@ -2943,6 +2722,10 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + /es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + dev: true + /esbuild-android-64@0.14.51: resolution: {integrity: sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==} engines: {node: '>=12'} @@ -3151,36 +2934,6 @@ packages: esbuild-windows-arm64: 0.14.51 dev: true - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - dev: true - /esbuild@0.19.12: resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} @@ -3383,6 +3136,12 @@ packages: /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: true + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -3467,6 +3226,11 @@ packages: pify: 2.3.0 dev: true + /expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + dev: true + /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -3553,10 +3317,6 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true - /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -3795,10 +3555,6 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - /get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -4415,11 +4171,6 @@ packages: engines: {node: '>=14'} dev: true - /js-string-escape@1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} - dev: true - /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true @@ -4486,10 +4237,6 @@ packages: semver: 6.3.1 dev: true - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true - /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: @@ -4582,11 +4329,6 @@ packages: wrap-ansi: 7.0.0 dev: true - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true - /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -4717,10 +4459,8 @@ packages: js-tokens: 4.0.0 dev: true - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 + /loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} dev: true /lower-case@1.1.4: @@ -4755,19 +4495,18 @@ packages: dependencies: yallist: 4.0.0 + /magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + /magic-string@0.30.7: resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - /md5-hex@3.0.1: - resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} - engines: {node: '>=8'} - dependencies: - blueimp-md5: 2.19.0 - dev: true - /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -4878,15 +4617,6 @@ packages: minimist: 1.2.8 dev: false - /mlly@1.5.0: - resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.4.0 - dev: true - /mocha@10.7.3: resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} engines: {node: '>= 14.0.0'} @@ -5290,8 +5020,9 @@ packages: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} dev: true /pend@1.2.0: @@ -5335,14 +5066,6 @@ packages: engines: {node: '>= 6'} dev: true - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.1 - mlly: 1.5.0 - pathe: 1.1.2 - dev: true - /postcss-selector-parser@6.0.15: resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} engines: {node: '>=4'} @@ -5379,15 +5102,6 @@ packages: engines: {node: '>=6'} dev: true - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -5516,10 +5230,6 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: @@ -5700,14 +5410,6 @@ packages: fsevents: 2.3.3 dev: true - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.3 - dev: true - /rollup@4.12.0: resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -5978,8 +5680,8 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + /std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} dev: true /string-width@4.2.3: @@ -6044,12 +5746,6 @@ packages: engines: {node: '>=8'} dev: true - /strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} - dependencies: - acorn: 8.11.3 - dev: true - /sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -6151,22 +5847,26 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true - /time-zone@1.0.0: - resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} - engines: {node: '>=4'} + /tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} dev: true - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + /tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} dev: true - /tinypool@0.5.0: - resolution: {integrity: sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==} + /tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + dev: true + + /tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} dev: true - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + /tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} dev: true @@ -6268,11 +5968,6 @@ packages: prelude-ls: 1.2.1 dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -6315,10 +6010,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - /ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} - dev: true - /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} @@ -6462,17 +6153,16 @@ packages: - supports-color dev: true - /vite-node@0.31.4(@types/node@20.11.19): - resolution: {integrity: sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ==} - engines: {node: '>=v14.18.0'} + /vite-node@2.1.8(@types/node@20.11.19): + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@8.1.1) - mlly: 1.5.0 + debug: 4.3.7(supports-color@8.1.1) + es-module-lexer: 1.5.4 pathe: 1.1.2 - picocolors: 1.0.0 - vite: 4.5.2(@types/node@20.11.19) + vite: 5.1.4(@types/node@20.11.19) transitivePeerDependencies: - '@types/node' - less @@ -6526,42 +6216,6 @@ packages: fsevents: 2.3.3 dev: true - /vite@4.5.2(@types/node@20.11.19): - resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 20.11.19 - esbuild: 0.18.20 - postcss: 8.4.35 - rollup: 3.29.4 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vite@5.1.4(@types/node@20.11.19): resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -6598,22 +6252,22 @@ packages: fsevents: 2.3.3 dev: true - /vitest@0.31.4: - resolution: {integrity: sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ==} - engines: {node: '>=v14.18.0'} + /vitest@2.1.8(@types/node@20.11.19): + resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.8 + '@vitest/ui': 2.1.8 happy-dom: '*' jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/node': + optional: true '@vitest/browser': optional: true '@vitest/ui': @@ -6622,41 +6276,32 @@ packages: optional: true jsdom: optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true dependencies: - '@types/chai': 4.3.12 - '@types/chai-subset': 1.3.5 '@types/node': 20.11.19 - '@vitest/expect': 0.31.4 - '@vitest/runner': 0.31.4 - '@vitest/snapshot': 0.31.4 - '@vitest/spy': 0.31.4 - '@vitest/utils': 0.31.4 - acorn: 8.11.3 - acorn-walk: 8.3.2 - cac: 6.7.14 - chai: 4.4.1 - concordance: 5.0.4 - debug: 4.3.4(supports-color@8.1.1) - local-pkg: 0.4.3 - magic-string: 0.30.7 + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.1.4) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + debug: 4.3.7(supports-color@8.1.1) + expect-type: 1.1.0 + magic-string: 0.30.17 pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 1.3.0 - tinybench: 2.6.0 - tinypool: 0.5.0 - vite: 4.5.2(@types/node@20.11.19) - vite-node: 0.31.4(@types/node@20.11.19) - why-is-node-running: 2.2.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.1.4(@types/node@20.11.19) + vite-node: 2.1.8(@types/node@20.11.19) + why-is-node-running: 2.3.0 transitivePeerDependencies: - less - lightningcss + - msw - sass - stylus - sugarss @@ -6763,11 +6408,6 @@ packages: resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} dev: true - /well-known-symbols@2.0.0: - resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} - engines: {node: '>=6'} - dev: true - /whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} @@ -6791,8 +6431,8 @@ packages: dependencies: isexe: 2.0.0 - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true dependencies: diff --git a/test/vitest/__tests__/pages/Claims/ClaimPhoto.spec.js b/test/vitest/__tests__/pages/Claims/ClaimPhoto.spec.js index c38852af1..b14338b5c 100644 --- a/test/vitest/__tests__/pages/Claims/ClaimPhoto.spec.js +++ b/test/vitest/__tests__/pages/Claims/ClaimPhoto.spec.js @@ -1,7 +1,7 @@ import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import ClaimPhoto from 'pages/Claim/Card/ClaimPhoto.vue'; - describe('ClaimPhoto', () => { let vm; @@ -61,7 +61,7 @@ describe('ClaimPhoto', () => { title: 'This file will be deleted', icon: 'delete', data: { index: 1 }, - promise: vm.deleteDms + promise: vm.deleteDms, }, }) ); diff --git a/test/vitest/__tests__/pages/Login/Login.spec.js b/test/vitest/__tests__/pages/Login/Login.spec.js index e90a8ee53..b25246f52 100644 --- a/test/vitest/__tests__/pages/Login/Login.spec.js +++ b/test/vitest/__tests__/pages/Login/Login.spec.js @@ -1,6 +1,7 @@ import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import { createWrapper } from 'app/test/vitest/helper'; import Login from 'pages/Login/LoginMain.vue'; +import axios from 'axios'; describe('Login', () => { let vm; diff --git a/test/vitest/helper.js b/test/vitest/helper.js index ce057c7c3..4518ad067 100644 --- a/test/vitest/helper.js +++ b/test/vitest/helper.js @@ -4,7 +4,6 @@ import { createTestingPinia } from '@pinia/testing'; import { vi } from 'vitest'; import { i18n } from 'src/boot/i18n'; import { Notify, Dialog } from 'quasar'; -import axios from 'axios'; import * as useValidator from 'src/composables/useValidator'; installQuasarPlugin({ @@ -14,35 +13,6 @@ installQuasarPlugin({ }, }); const pinia = createTestingPinia({ createSpy: vi.fn, stubActions: false }); -const mockPush = vi.fn(); -const mockReplace = vi.fn(); - -vi.mock('vue-router', () => ({ - useRouter: () => ({ - push: mockPush, - replace: mockReplace, - currentRoute: { - value: { - params: { - id: 1, - }, - meta: { moduleName: 'mockName' }, - matched: [{ path: 'mockName/list' }], - }, - }, - }), - useRoute: () => ({ - matched: [], - query: {}, - params: {}, - meta: { moduleName: 'mockName' }, - path: 'mockSection/list', - }), - onBeforeRouteLeave: () => {}, -})); - -vi.mock('axios'); - vi.spyOn(useValidator, 'useValidator').mockImplementation(() => { return { validate: vi.fn(), @@ -112,5 +82,4 @@ export function createWrapper(component, options) { return { vm, wrapper }; } - -export { axios, flushPromises }; +export { flushPromises }; diff --git a/test/vitest/setup-file.js b/test/vitest/setup-file.js index 288f80beb..0ba9e53c2 100644 --- a/test/vitest/setup-file.js +++ b/test/vitest/setup-file.js @@ -1 +1,27 @@ // This file will be run before each test file, don't delete or vitest will not work. +import { vi } from 'vitest'; + +vi.mock('axios'); +vi.mock('vue-router', () => ({ + useRouter: () => ({ + push: vi.fn(), + replace: vi.fn(), + currentRoute: { + value: { + params: { + id: 1, + }, + meta: { moduleName: 'mockName' }, + matched: [{ path: 'mockName/list' }], + }, + }, + }), + useRoute: () => ({ + matched: [], + query: {}, + params: {}, + meta: { moduleName: 'mockName' }, + path: 'mockSection/list', + }), + onBeforeRouteLeave: () => {}, +})); From fcb2e3cc74c2477d99f1214421afef8764bf5622 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 23 Dec 2024 12:47:09 +0100 Subject: [PATCH 02/55] feat: organize imports --- src/components/__tests__/Leftmenu.spec.js | 3 ++- .../common/__tests__/VnChangePassword.spec.js | 3 ++- src/components/common/__tests__/VnLog.spec.js | 3 ++- src/components/ui/__tests__/Paginate.spec.js | 3 ++- src/components/ui/__tests__/VnLinkPhone.spec.js | 2 +- src/components/ui/__tests__/VnSms.spec.js | 3 ++- src/composables/__tests__/downloadFile.spec.js | 2 +- src/composables/__tests__/useAcl.spec.js | 4 +++- src/composables/__tests__/useArrayData.spec.js | 7 ++++--- src/composables/__tests__/useRole.spec.js | 8 ++++---- src/composables/__tests__/useSession.spec.js | 2 +- src/composables/__tests__/useTokenConfig.spec.js | 3 ++- .../Card/__tests__/ClaimDescriptorMenu.spec.js | 3 ++- src/pages/Claim/Card/__tests__/ClaimLines.spec.js | 3 ++- .../Claim/Card/__tests__/ClaimLinesImport.spec.js | 3 ++- .../Payments/__tests__/CustomerPayments.spec.js | 3 ++- .../Ticket/Card/__tests__/TicketBoxing.spec.js | 13 ++++++++++--- src/pages/Ticket/__tests__/TicketAdvance.spec.js | 3 ++- src/pages/Wagon/__tests__/WagonCreate.spec.js | 3 ++- 19 files changed, 48 insertions(+), 26 deletions(-) diff --git a/src/components/__tests__/Leftmenu.spec.js b/src/components/__tests__/Leftmenu.spec.js index 10d9d66fb..e7552383f 100644 --- a/src/components/__tests__/Leftmenu.spec.js +++ b/src/components/__tests__/Leftmenu.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it, beforeAll } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import Leftmenu from 'components/LeftMenu.vue'; import { useNavigationStore } from 'src/stores/useNavigationStore'; diff --git a/src/components/common/__tests__/VnChangePassword.spec.js b/src/components/common/__tests__/VnChangePassword.spec.js index f5a967bb5..b610ce44d 100644 --- a/src/components/common/__tests__/VnChangePassword.spec.js +++ b/src/components/common/__tests__/VnChangePassword.spec.js @@ -1,4 +1,5 @@ -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import VnChangePassword from 'src/components/common/VnChangePassword.vue'; import { vi, beforeEach, afterEach, beforeAll, describe, expect, it } from 'vitest'; import { Notify } from 'quasar'; diff --git a/src/components/common/__tests__/VnLog.spec.js b/src/components/common/__tests__/VnLog.spec.js index 53d2732a0..2eea42dae 100644 --- a/src/components/common/__tests__/VnLog.spec.js +++ b/src/components/common/__tests__/VnLog.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import VnLog from 'src/components/common/VnLog.vue'; describe('VnLog', () => { diff --git a/src/components/ui/__tests__/Paginate.spec.js b/src/components/ui/__tests__/Paginate.spec.js index a67dfcdc6..968643b67 100644 --- a/src/components/ui/__tests__/Paginate.spec.js +++ b/src/components/ui/__tests__/Paginate.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import VnPaginate from 'src/components/ui/VnPaginate.vue'; describe('VnPaginate', () => { diff --git a/src/components/ui/__tests__/VnLinkPhone.spec.js b/src/components/ui/__tests__/VnLinkPhone.spec.js index a34ef90a5..3c92adf95 100644 --- a/src/components/ui/__tests__/VnLinkPhone.spec.js +++ b/src/components/ui/__tests__/VnLinkPhone.spec.js @@ -1,5 +1,5 @@ import { describe, it, expect, beforeAll, vi } from 'vitest'; -import { axios } from 'app/test/vitest/helper'; +import axios from 'axios'; import parsePhone from 'src/filters/parsePhone'; describe('parsePhone filter', () => { diff --git a/src/components/ui/__tests__/VnSms.spec.js b/src/components/ui/__tests__/VnSms.spec.js index e0f8c1868..4f4fd7d49 100644 --- a/src/components/ui/__tests__/VnSms.spec.js +++ b/src/components/ui/__tests__/VnSms.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import VnSms from 'src/components/ui/VnSms.vue'; describe('VnSms', () => { diff --git a/src/composables/__tests__/downloadFile.spec.js b/src/composables/__tests__/downloadFile.spec.js index f53b56b3e..49d3d92e6 100644 --- a/src/composables/__tests__/downloadFile.spec.js +++ b/src/composables/__tests__/downloadFile.spec.js @@ -1,5 +1,5 @@ import { vi, describe, expect, it, beforeAll, afterAll } from 'vitest'; -import { axios } from 'app/test/vitest/helper'; +import axios from 'axios'; import { downloadFile } from 'src/composables/downloadFile'; import { useSession } from 'src/composables/useSession'; const session = useSession(); diff --git a/src/composables/__tests__/useAcl.spec.js b/src/composables/__tests__/useAcl.spec.js index 6cb29984c..86cd58fa0 100644 --- a/src/composables/__tests__/useAcl.spec.js +++ b/src/composables/__tests__/useAcl.spec.js @@ -1,5 +1,7 @@ import { vi, describe, expect, it, beforeAll, afterAll } from 'vitest'; -import { axios, flushPromises } from 'app/test/vitest/helper'; +import axios from 'axios'; + +import { flushPromises } from '@vue/test-utils'; import { useAcl } from 'src/composables/useAcl'; describe('useAcl', () => { diff --git a/src/composables/__tests__/useArrayData.spec.js b/src/composables/__tests__/useArrayData.spec.js index d4c5d0949..0eb2257ff 100644 --- a/src/composables/__tests__/useArrayData.spec.js +++ b/src/composables/__tests__/useArrayData.spec.js @@ -1,5 +1,6 @@ import { describe, expect, it, beforeEach, afterEach, vi } from 'vitest'; -import { axios, flushPromises } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { flushPromises } from 'app/test/vitest/helper'; import { useArrayData } from 'composables/useArrayData'; import { useRouter } from 'vue-router'; import * as vueRouter from 'vue-router'; @@ -25,8 +26,8 @@ describe('useArrayData', () => { arrayData.fetch({}); await flushPromises(); - const routerReplace = useRouter().replace.mock.calls[0][0]; - + let routerReplace = useRouter().replace; + routerReplace = routerReplace.mock.calls[0][0]; expect(axios.get.mock.calls[0][1].params).toEqual({ filter, supplierFk: 2, diff --git a/src/composables/__tests__/useRole.spec.js b/src/composables/__tests__/useRole.spec.js index d0bca5342..7a9b20c00 100644 --- a/src/composables/__tests__/useRole.spec.js +++ b/src/composables/__tests__/useRole.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it } from 'vitest'; -import { axios, flushPromises } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { flushPromises } from '@vue/test-utils'; import { useRole } from 'composables/useRole'; const role = useRole(); @@ -31,10 +32,9 @@ describe('useRole', () => { lang: 'en', }; const expectedRoles = ['salesPerson', 'admin']; - vi.spyOn(axios, 'get') - .mockResolvedValueOnce({ + vi.spyOn(axios, 'get').mockResolvedValueOnce({ data: { roles: rolesData, user: fetchedUser }, - }) + }); vi.spyOn(role.state, 'setUser'); vi.spyOn(role.state, 'setRoles'); diff --git a/src/composables/__tests__/useSession.spec.js b/src/composables/__tests__/useSession.spec.js index 789b149ec..9034ce1d9 100644 --- a/src/composables/__tests__/useSession.spec.js +++ b/src/composables/__tests__/useSession.spec.js @@ -1,5 +1,5 @@ import { vi, describe, expect, it, beforeAll, beforeEach } from 'vitest'; -import { axios } from 'app/test/vitest/helper'; +import axios from 'axios'; import { useSession } from 'composables/useSession'; import { useState } from 'composables/useState'; diff --git a/src/composables/__tests__/useTokenConfig.spec.js b/src/composables/__tests__/useTokenConfig.spec.js index a25a4abb1..92664e65a 100644 --- a/src/composables/__tests__/useTokenConfig.spec.js +++ b/src/composables/__tests__/useTokenConfig.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it } from 'vitest'; -import { axios, flushPromises } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { flushPromises } from '@vue/test-utils'; import { useTokenConfig } from 'composables/useTokenConfig'; const tokenConfig = useTokenConfig(); diff --git a/src/pages/Claim/Card/__tests__/ClaimDescriptorMenu.spec.js b/src/pages/Claim/Card/__tests__/ClaimDescriptorMenu.spec.js index b208f1704..2142f41f2 100644 --- a/src/pages/Claim/Card/__tests__/ClaimDescriptorMenu.spec.js +++ b/src/pages/Claim/Card/__tests__/ClaimDescriptorMenu.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import ClaimDescriptorMenu from 'pages/Claim/Card/ClaimDescriptorMenu.vue'; describe('ClaimDescriptorMenu', () => { diff --git a/src/pages/Claim/Card/__tests__/ClaimLines.spec.js b/src/pages/Claim/Card/__tests__/ClaimLines.spec.js index 2f2c0e298..d975fb514 100644 --- a/src/pages/Claim/Card/__tests__/ClaimLines.spec.js +++ b/src/pages/Claim/Card/__tests__/ClaimLines.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it, beforeAll, beforeEach, afterEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import ClaimLines from '/src/pages/Claim/Card/ClaimLines.vue'; describe('ClaimLines', () => { diff --git a/src/pages/Claim/Card/__tests__/ClaimLinesImport.spec.js b/src/pages/Claim/Card/__tests__/ClaimLinesImport.spec.js index d93c96132..2a5176d0a 100644 --- a/src/pages/Claim/Card/__tests__/ClaimLinesImport.spec.js +++ b/src/pages/Claim/Card/__tests__/ClaimLinesImport.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it, beforeAll, beforeEach, afterEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import ClaimLinesImport from 'pages/Claim/Card/ClaimLinesImport.vue'; describe('ClaimLinesImport', () => { diff --git a/src/pages/Customer/Payments/__tests__/CustomerPayments.spec.js b/src/pages/Customer/Payments/__tests__/CustomerPayments.spec.js index 466a544b4..a9c845cec 100644 --- a/src/pages/Customer/Payments/__tests__/CustomerPayments.spec.js +++ b/src/pages/Customer/Payments/__tests__/CustomerPayments.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import CustomerPayments from 'src/pages/Customer/Payments/CustomerPayments.vue'; describe('CustomerPayments', () => { diff --git a/src/pages/Ticket/Card/__tests__/TicketBoxing.spec.js b/src/pages/Ticket/Card/__tests__/TicketBoxing.spec.js index 8fd62d8c2..a1dd7775d 100644 --- a/src/pages/Ticket/Card/__tests__/TicketBoxing.spec.js +++ b/src/pages/Ticket/Card/__tests__/TicketBoxing.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import TicketBoxing from 'pages/Ticket/Card/TicketBoxing.vue'; // #4836 - Investigate how to test q-drawer outside @@ -21,7 +22,11 @@ describe('TicketBoxing', () => { min: 1, max: 2, }; - const videoList = ['2022-01-01T01-01-00.mp4', '2022-02-02T02-02-00.mp4', '2022-03-03T03-03-00.mp4']; + const videoList = [ + '2022-01-01T01-01-00.mp4', + '2022-02-02T02-02-00.mp4', + '2022-03-03T03-03-00.mp4', + ]; vi.spyOn(axios, 'get').mockResolvedValue({ data: videoList }); vi.spyOn(vm.quasar, 'notify'); @@ -44,7 +49,9 @@ describe('TicketBoxing', () => { await vm.getVideoList(expeditionId, timed); - expect(vm.quasar.notify).toHaveBeenCalledWith(expect.objectContaining({ type: 'negative' })); + expect(vm.quasar.notify).toHaveBeenCalledWith( + expect.objectContaining({ type: 'negative' }) + ); }); }); }); diff --git a/src/pages/Ticket/__tests__/TicketAdvance.spec.js b/src/pages/Ticket/__tests__/TicketAdvance.spec.js index ab1a47544..cfe5f86c5 100644 --- a/src/pages/Ticket/__tests__/TicketAdvance.spec.js +++ b/src/pages/Ticket/__tests__/TicketAdvance.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it, beforeAll, afterEach, beforeEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import TicketAdvance from 'pages/Ticket/TicketAdvance.vue'; import { Notify } from 'quasar'; import { nextTick } from 'vue'; diff --git a/src/pages/Wagon/__tests__/WagonCreate.spec.js b/src/pages/Wagon/__tests__/WagonCreate.spec.js index f195c183f..9be19e027 100644 --- a/src/pages/Wagon/__tests__/WagonCreate.spec.js +++ b/src/pages/Wagon/__tests__/WagonCreate.spec.js @@ -1,5 +1,6 @@ import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import axios from 'axios'; +import { createWrapper } from 'app/test/vitest/helper'; import WagonCreate from 'pages/Wagon/WagonCreate.vue'; describe('WagonCreate', () => { From 5f2b71dc709dd2673471960c1c99c29da63da03e Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Thu, 23 Jan 2025 11:33:19 +0100 Subject: [PATCH 03/55] feat: updates --- package.json | 7 +- pnpm-lock.yaml | 582 +++--------------- .../__tests__/VnVisibleColumns.spec.js | 3 +- src/components/__tests__/CrudModel.spec.js | 68 +- .../__tests__/EditTableCellValueForm.spec.js | 3 +- .../__tests__/FilterItemForm.spec.js | 10 +- src/components/__tests__/FormModel.spec.js | 4 +- .../common/__tests__/VnDmsList.spec.js | 47 +- .../common/__tests__/VnNotes.spec.js | 40 +- .../ui/__tests__/CardSummary.spec.js | 8 +- src/composables/useSession.js | 2 +- src/pages/Claim/Card/ClaimPhoto.vue | 2 +- test/vitest/helper.js | 2 - 13 files changed, 212 insertions(+), 566 deletions(-) diff --git a/package.json b/package.json index 2c7f464db..77f9e30ae 100644 --- a/package.json +++ b/package.json @@ -54,12 +54,17 @@ "postcss": "^8.4.23", "prettier": "^3.4.2", "sass": "^1.83.4", - "vitest": "^2.0.0" + "vitest": "^3.0.3" }, "engines": { "node": "^20 || ^18 || ^16", "npm": ">= 8.1.2", "yarn": ">= 1.21.1", "bun": ">= 1.0.25" + }, + "overrides": { + "@vitejs/plugin-vue": "^5.2.1", + "vite": "^6.0.11", + "vitest": "^0.31.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e8e1b39e0..39d16e320 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,7 +63,7 @@ devDependencies: version: 4.0.4 '@quasar/quasar-app-extension-testing-unit-vitest': specifier: ^0.4.0 - version: 0.4.0(@vue/test-utils@2.4.4)(quasar@2.17.7)(typescript@5.5.4)(vite@5.1.4)(vitest@2.1.8)(vue@3.5.13) + version: 0.4.0(@vue/test-utils@2.4.4)(quasar@2.17.7)(typescript@5.5.4)(vite@6.0.11)(vitest@3.0.3)(vue@3.5.13) '@vue/test-utils': specifier: ^2.4.4 version: 2.4.4(vue@3.5.13) @@ -101,8 +101,8 @@ devDependencies: specifier: ^1.83.4 version: 1.83.4 vitest: - specifier: ^2.0.0 - version: 2.1.8(@types/node@22.10.7)(sass@1.83.4) + specifier: ^3.0.3 + version: 3.0.3(@types/node@22.10.7)(sass@1.83.4) packages: @@ -367,15 +367,6 @@ packages: - supports-color dev: true - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/aix-ppc64@0.24.2: resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} @@ -385,15 +376,6 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.24.2: resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} @@ -403,15 +385,6 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.24.2: resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} @@ -421,15 +394,6 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.24.2: resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} @@ -439,15 +403,6 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.24.2: resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} @@ -457,15 +412,6 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.24.2: resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} @@ -475,15 +421,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.24.2: resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} @@ -493,15 +430,6 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.24.2: resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} @@ -511,15 +439,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.24.2: resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} @@ -529,15 +448,6 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.24.2: resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} @@ -547,15 +457,6 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.24.2: resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} @@ -565,15 +466,6 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.24.2: resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} @@ -583,15 +475,6 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.24.2: resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} @@ -601,15 +484,6 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.24.2: resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} @@ -619,15 +493,6 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.24.2: resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} @@ -637,15 +502,6 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.24.2: resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} @@ -655,15 +511,6 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.24.2: resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} @@ -682,15 +529,6 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.24.2: resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} @@ -709,15 +547,6 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.24.2: resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} @@ -727,15 +556,6 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.24.2: resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} @@ -745,15 +565,6 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.24.2: resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} @@ -763,15 +574,6 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.24.2: resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} @@ -781,15 +583,6 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.24.2: resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} @@ -819,7 +612,7 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: '@eslint/object-schema': 2.1.5 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -837,7 +630,7 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.1 @@ -970,7 +763,7 @@ packages: '@intlify/shared': 11.0.0-rc.1 '@rollup/pluginutils': 4.2.1 '@vue/compiler-sfc': 3.5.13 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 fast-glob: 3.3.2 js-yaml: 4.1.0 json5: 2.2.3 @@ -1299,7 +1092,7 @@ packages: '@types/compression': 1.7.5 '@types/cordova': 11.0.3 '@types/express': 4.17.21 - '@vitejs/plugin-vue': 5.2.1(vite@5.1.4)(vue@3.5.13) + '@vitejs/plugin-vue': 5.2.1(vite@6.0.11)(vue@3.5.13) archiver: 7.0.1 chokidar: 3.6.0 ci-info: 4.1.0 @@ -1386,7 +1179,7 @@ packages: '@quasar/quasar-ui-qcalendar': 4.0.4 dev: true - /@quasar/quasar-app-extension-testing-unit-vitest@0.4.0(@vue/test-utils@2.4.4)(quasar@2.17.7)(typescript@5.5.4)(vite@5.1.4)(vitest@2.1.8)(vue@3.5.13): + /@quasar/quasar-app-extension-testing-unit-vitest@0.4.0(@vue/test-utils@2.4.4)(quasar@2.17.7)(typescript@5.5.4)(vite@6.0.11)(vitest@3.0.3)(vue@3.5.13): resolution: {integrity: sha512-eyzdUdmZiCueNS+5nedjMmzdbpCetSrtdGIwW6KplW1dTzRbLiNvYUjpBOxQGmJCgEhWy9zuswJ7MZ/bTql24Q==} engines: {node: '>= 12.22.1', npm: '>= 6.14.12', yarn: '>= 1.17.3'} peerDependencies: @@ -1403,9 +1196,9 @@ packages: happy-dom: 11.2.0 lodash-es: 4.17.21 quasar: 2.17.7 - vite-jsconfig-paths: 2.0.1(vite@5.1.4) - vite-tsconfig-paths: 4.3.1(typescript@5.5.4)(vite@5.1.4) - vitest: 2.1.8(@types/node@22.10.7)(sass@1.83.4) + vite-jsconfig-paths: 2.0.1(vite@6.0.11) + vite-tsconfig-paths: 4.3.1(typescript@5.5.4)(vite@6.0.11) + vitest: 3.0.3(@types/node@22.10.7)(sass@1.83.4) vue: 3.5.13(typescript@5.5.4) transitivePeerDependencies: - supports-color @@ -1440,7 +1233,7 @@ packages: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 vue: ^3.0.0 dependencies: - '@vitejs/plugin-vue': 5.2.1(vite@5.1.4)(vue@3.5.13) + '@vitejs/plugin-vue': 5.2.1(vite@6.0.11)(vue@3.5.13) quasar: 2.17.7 vite: 6.0.11(@types/node@22.10.7)(sass-embedded@1.83.4)(sass@1.83.4) vue: 3.5.13(typescript@5.5.4) @@ -1454,14 +1247,6 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/rollup-android-arm-eabi@4.12.0: - resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm-eabi@4.31.0: resolution: {integrity: sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==} cpu: [arm] @@ -1470,14 +1255,6 @@ packages: dev: true optional: true - /@rollup/rollup-android-arm64@4.12.0: - resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.31.0: resolution: {integrity: sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==} cpu: [arm64] @@ -1486,14 +1263,6 @@ packages: dev: true optional: true - /@rollup/rollup-darwin-arm64@4.12.0: - resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.31.0: resolution: {integrity: sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==} cpu: [arm64] @@ -1502,14 +1271,6 @@ packages: dev: true optional: true - /@rollup/rollup-darwin-x64@4.12.0: - resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.31.0: resolution: {integrity: sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==} cpu: [x64] @@ -1534,14 +1295,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.12.0: - resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.31.0: resolution: {integrity: sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==} cpu: [arm] @@ -1558,14 +1311,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.12.0: - resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.31.0: resolution: {integrity: sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==} cpu: [arm64] @@ -1574,14 +1319,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.12.0: - resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.31.0: resolution: {integrity: sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==} cpu: [arm64] @@ -1606,14 +1343,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.12.0: - resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.31.0: resolution: {integrity: sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==} cpu: [riscv64] @@ -1630,14 +1359,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.12.0: - resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-gnu@4.31.0: resolution: {integrity: sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==} cpu: [x64] @@ -1646,14 +1367,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.12.0: - resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-musl@4.31.0: resolution: {integrity: sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==} cpu: [x64] @@ -1662,14 +1375,6 @@ packages: dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.12.0: - resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-arm64-msvc@4.31.0: resolution: {integrity: sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==} cpu: [arm64] @@ -1678,14 +1383,6 @@ packages: dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.12.0: - resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-ia32-msvc@4.31.0: resolution: {integrity: sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==} cpu: [ia32] @@ -1694,14 +1391,6 @@ packages: dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.12.0: - resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-x64-msvc@4.31.0: resolution: {integrity: sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==} cpu: [x64] @@ -1779,10 +1468,6 @@ packages: resolution: {integrity: sha512-kyuRQ40/NWQVhqGIHq78Ehu2Bf9Mlg0LhmSmis6ZFJK7z933FRfYi8tHe/k/0fB+PGfCf95rJC6TO7dopaFvAg==} dev: true - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - /@types/estree@1.0.6: resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} dev: true @@ -1910,76 +1595,76 @@ packages: dev: true optional: true - /@vitejs/plugin-vue@5.2.1(vite@5.1.4)(vue@3.5.13): + /@vitejs/plugin-vue@5.2.1(vite@6.0.11)(vue@3.5.13): resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 dependencies: - vite: 5.1.4(@types/node@22.10.7)(sass@1.83.4) + vite: 6.0.11(@types/node@22.10.7)(sass-embedded@1.83.4)(sass@1.83.4) vue: 3.5.13(typescript@5.5.4) dev: true - /@vitest/expect@2.1.8: - resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} + /@vitest/expect@3.0.3: + resolution: {integrity: sha512-SbRCHU4qr91xguu+dH3RUdI5dC86zm8aZWydbp961aIR7G8OYNN6ZiayFuf9WAngRbFOfdrLHCGgXTj3GtoMRQ==} dependencies: - '@vitest/spy': 2.1.8 - '@vitest/utils': 2.1.8 + '@vitest/spy': 3.0.3 + '@vitest/utils': 3.0.3 chai: 5.1.2 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 dev: true - /@vitest/mocker@2.1.8(vite@5.1.4): - resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} + /@vitest/mocker@3.0.3(vite@6.0.11): + resolution: {integrity: sha512-XT2XBc4AN9UdaxJAeIlcSZ0ILi/GzmG5G8XSly4gaiqIvPV3HMTSIDZWJVX6QRJ0PX1m+W8Cy0K9ByXNb/bPIA==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 + vite: ^5.0.0 || ^6.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true dependencies: - '@vitest/spy': 2.1.8 + '@vitest/spy': 3.0.3 estree-walker: 3.0.3 magic-string: 0.30.17 - vite: 5.1.4(@types/node@22.10.7)(sass@1.83.4) + vite: 6.0.11(@types/node@22.10.7)(sass-embedded@1.83.4)(sass@1.83.4) dev: true - /@vitest/pretty-format@2.1.8: - resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} + /@vitest/pretty-format@3.0.3: + resolution: {integrity: sha512-gCrM9F7STYdsDoNjGgYXKPq4SkSxwwIU5nkaQvdUxiQ0EcNlez+PdKOVIsUJvh9P9IeIFmjn4IIREWblOBpP2Q==} dependencies: - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 dev: true - /@vitest/runner@2.1.8: - resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + /@vitest/runner@3.0.3: + resolution: {integrity: sha512-Rgi2kOAk5ZxWZlwPguRJFOBmWs6uvvyAAR9k3MvjRvYrG7xYvKChZcmnnpJCS98311CBDMqsW9MzzRFsj2gX3g==} dependencies: - '@vitest/utils': 2.1.8 - pathe: 1.1.2 + '@vitest/utils': 3.0.3 + pathe: 2.0.2 dev: true - /@vitest/snapshot@2.1.8: - resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} + /@vitest/snapshot@3.0.3: + resolution: {integrity: sha512-kNRcHlI4txBGztuJfPEJ68VezlPAXLRT1u5UCx219TU3kOG2DplNxhWLwDf2h6emwmTPogzLnGVwP6epDaJN6Q==} dependencies: - '@vitest/pretty-format': 2.1.8 + '@vitest/pretty-format': 3.0.3 magic-string: 0.30.17 - pathe: 1.1.2 + pathe: 2.0.2 dev: true - /@vitest/spy@2.1.8: - resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} + /@vitest/spy@3.0.3: + resolution: {integrity: sha512-7/dgux8ZBbF7lEIKNnEqQlyRaER9nkAL9eTmdKJkDO3hS8p59ATGwKOCUDHcBLKr7h/oi/6hP+7djQk8049T2A==} dependencies: tinyspy: 3.0.2 dev: true - /@vitest/utils@2.1.8: - resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + /@vitest/utils@3.0.3: + resolution: {integrity: sha512-f+s8CvyzPtMFY1eZKkIHGhPsQgYo5qCm6O8KZoim9qm1/jT64qBgGpO5tHscNH6BzRHM+edLNOP+3vO8+8pE/A==} dependencies: - '@vitest/pretty-format': 2.1.8 + '@vitest/pretty-format': 3.0.3 loupe: 3.1.2 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 dev: true /@vue/compiler-core@3.5.13: @@ -3221,9 +2906,21 @@ packages: ms: 2.1.2 supports-color: 8.1.1 - /debug@4.3.7(supports-color@8.1.1): + /debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.4.0(supports-color@8.1.1): + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -3500,37 +3197,6 @@ packages: dependencies: es-errors: 1.3.0 - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - dev: true - /esbuild@0.24.2: resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} @@ -3687,7 +3353,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 eslint-visitor-keys: 4.2.0 @@ -3762,7 +3428,7 @@ packages: /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /esutils@2.0.3: @@ -5280,7 +4946,7 @@ packages: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -5716,6 +5382,10 @@ packages: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true + /pathe@2.0.2: + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + dev: true + /pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} @@ -6126,29 +5796,6 @@ packages: yargs: 17.7.2 dev: true - /rollup@4.12.0: - resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.0 - '@rollup/rollup-android-arm64': 4.12.0 - '@rollup/rollup-darwin-arm64': 4.12.0 - '@rollup/rollup-darwin-x64': 4.12.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 - '@rollup/rollup-linux-arm64-gnu': 4.12.0 - '@rollup/rollup-linux-arm64-musl': 4.12.0 - '@rollup/rollup-linux-riscv64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-musl': 4.12.0 - '@rollup/rollup-win32-arm64-msvc': 4.12.0 - '@rollup/rollup-win32-ia32-msvc': 4.12.0 - '@rollup/rollup-win32-x64-msvc': 4.12.0 - fsevents: 2.3.3 - dev: true - /rollup@4.31.0: resolution: {integrity: sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -6906,8 +6553,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} dev: true - /tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + /tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} dev: true @@ -7191,7 +6838,7 @@ packages: extsprintf: 1.3.0 dev: true - /vite-jsconfig-paths@2.0.1(vite@5.1.4): + /vite-jsconfig-paths@2.0.1(vite@6.0.11): resolution: {integrity: sha512-rabcTTfKs0MdAsQWcZjbIMo5fcp6jthZce7uFEPgVPgpSY+RNOwjzIJOPES6cB/GJZLSoLGfHM9kt5HNmJvp7A==} peerDependencies: vite: '>2.0.0-0' @@ -7200,33 +6847,37 @@ packages: globrex: 0.1.2 recrawl-sync: 2.2.3 tsconfig-paths: 3.15.0 - vite: 5.1.4(@types/node@22.10.7)(sass@1.83.4) + vite: 6.0.11(@types/node@22.10.7)(sass-embedded@1.83.4)(sass@1.83.4) transitivePeerDependencies: - supports-color dev: true - /vite-node@2.1.8(@types/node@22.10.7)(sass@1.83.4): - resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} - engines: {node: ^18.0.0 || >=20.0.0} + /vite-node@3.0.3(@types/node@22.10.7)(sass@1.83.4): + resolution: {integrity: sha512-0sQcwhwAEw/UJGojbhOrnq3HtiZ3tC7BzpAa0lx3QaTX0S3YX70iGcik25UBdB96pmdwjyY2uyKNYruxCDmiEg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) es-module-lexer: 1.6.0 - pathe: 1.1.2 - vite: 5.1.4(@types/node@22.10.7)(sass@1.83.4) + pathe: 2.0.2 + vite: 6.0.11(@types/node@22.10.7)(sass-embedded@1.83.4)(sass@1.83.4) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser + - tsx + - yaml dev: true - /vite-tsconfig-paths@4.3.1(typescript@5.5.4)(vite@5.1.4): + /vite-tsconfig-paths@4.3.1(typescript@5.5.4)(vite@6.0.11): resolution: {integrity: sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==} peerDependencies: vite: '*' @@ -7237,49 +6888,12 @@ packages: debug: 4.3.4(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.0.2(typescript@5.5.4) - vite: 5.1.4(@types/node@22.10.7)(sass@1.83.4) + vite: 6.0.11(@types/node@22.10.7)(sass-embedded@1.83.4)(sass@1.83.4) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@5.1.4(@types/node@22.10.7)(sass@1.83.4): - resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 22.10.7 - esbuild: 0.19.12 - postcss: 8.5.1 - rollup: 4.12.0 - sass: 1.83.4 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vite@6.0.11(@types/node@22.10.7)(sass-embedded@1.83.4)(sass@1.83.4): resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -7330,15 +6944,15 @@ packages: fsevents: 2.3.3 dev: true - /vitest@2.1.8(@types/node@22.10.7)(sass@1.83.4): - resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} - engines: {node: ^18.0.0 || >=20.0.0} + /vitest@3.0.3(@types/node@22.10.7)(sass@1.83.4): + resolution: {integrity: sha512-dWdwTFUW9rcnL0LyF2F+IfvNQWB0w9DERySCk8VMG75F8k25C7LsZoh6XfCjPvcR8Nb+Lqi9JKr6vnzH7HSrpQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.8 - '@vitest/ui': 2.1.8 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.0.3 + '@vitest/ui': 3.0.3 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -7356,35 +6970,39 @@ packages: optional: true dependencies: '@types/node': 22.10.7 - '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.1.4) - '@vitest/pretty-format': 2.1.8 - '@vitest/runner': 2.1.8 - '@vitest/snapshot': 2.1.8 - '@vitest/spy': 2.1.8 - '@vitest/utils': 2.1.8 + '@vitest/expect': 3.0.3 + '@vitest/mocker': 3.0.3(vite@6.0.11) + '@vitest/pretty-format': 3.0.3 + '@vitest/runner': 3.0.3 + '@vitest/snapshot': 3.0.3 + '@vitest/spy': 3.0.3 + '@vitest/utils': 3.0.3 chai: 5.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.4.0(supports-color@8.1.1) expect-type: 1.1.0 magic-string: 0.30.17 - pathe: 1.1.2 + pathe: 2.0.2 std-env: 3.8.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinypool: 1.0.2 - tinyrainbow: 1.2.0 - vite: 5.1.4(@types/node@22.10.7)(sass@1.83.4) - vite-node: 2.1.8(@types/node@22.10.7)(sass@1.83.4) + tinyrainbow: 2.0.0 + vite: 6.0.11(@types/node@22.10.7)(sass-embedded@1.83.4)(sass@1.83.4) + vite-node: 3.0.3(@types/node@22.10.7)(sass@1.83.4) why-is-node-running: 2.3.0 transitivePeerDependencies: + - jiti - less - lightningcss - msw - sass + - sass-embedded - stylus - sugarss - supports-color - terser + - tsx + - yaml dev: true /vue-component-type-helpers@1.8.27: @@ -7411,7 +7029,7 @@ packages: peerDependencies: eslint: '>=6.0.0' dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 eslint: 9.18.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 diff --git a/src/components/VnTable/__tests__/VnVisibleColumns.spec.js b/src/components/VnTable/__tests__/VnVisibleColumns.spec.js index bf767688b..3e4e9ecc8 100644 --- a/src/components/VnTable/__tests__/VnVisibleColumns.spec.js +++ b/src/components/VnTable/__tests__/VnVisibleColumns.spec.js @@ -1,8 +1,7 @@ import { describe, expect, it, beforeEach, afterEach, vi } from 'vitest'; import { createWrapper } from 'app/test/vitest/helper'; import VnVisibleColumn from '../VnVisibleColumn.vue'; -import { axios } from 'app/test/vitest/helper'; - +import { default as axios } from 'axios'; describe('VnVisibleColumns', () => { let wrapper; let vm; diff --git a/src/components/__tests__/CrudModel.spec.js b/src/components/__tests__/CrudModel.spec.js index e0afd30ad..c620d29ad 100644 --- a/src/components/__tests__/CrudModel.spec.js +++ b/src/components/__tests__/CrudModel.spec.js @@ -1,4 +1,6 @@ -import { createWrapper, axios } from 'app/test/vitest/helper'; +import { createWrapper } from 'app/test/vitest/helper'; +import { default as axios } from 'axios'; + import CrudModel from 'components/CrudModel.vue'; import { vi, afterEach, beforeEach, beforeAll, describe, expect, it } from 'vitest'; @@ -30,8 +32,8 @@ describe('CrudModel', () => { saveFn: '', }, }); - wrapper=wrapper.wrapper; - vm=wrapper.vm; + wrapper = wrapper.wrapper; + vm = wrapper.vm; }); beforeEach(() => { @@ -143,14 +145,14 @@ describe('CrudModel', () => { }); it('should return true if object is empty', async () => { - dummyObj ={}; - result = vm.isEmpty(dummyObj); + dummyObj = {}; + result = vm.isEmpty(dummyObj); expect(result).toBe(true); }); it('should return false if object is not empty', async () => { - dummyObj = {a:1, b:2, c:3}; + dummyObj = { a: 1, b: 2, c: 3 }; result = vm.isEmpty(dummyObj); expect(result).toBe(false); @@ -158,29 +160,31 @@ describe('CrudModel', () => { it('should return true if array is empty', async () => { dummyArray = []; - result = vm.isEmpty(dummyArray); + result = vm.isEmpty(dummyArray); expect(result).toBe(true); }); - + it('should return false if array is not empty', async () => { - dummyArray = [1,2,3]; + dummyArray = [1, 2, 3]; result = vm.isEmpty(dummyArray); expect(result).toBe(false); - }) + }); }); describe('resetData()', () => { it('should add $index to elements in data[] and sets originalData and formData with data', async () => { - data = [{ - name: 'Tony', - lastName: 'Stark', - age: 42, - }]; + data = [ + { + name: 'Tony', + lastName: 'Stark', + age: 42, + }, + ]; vm.resetData(data); - + expect(vm.originalData).toEqual(data); expect(vm.originalData[0].$index).toEqual(0); expect(vm.formData).toEqual(data); @@ -200,7 +204,7 @@ describe('CrudModel', () => { lastName: 'Stark', age: 42, }; - + vm.resetData(data); expect(vm.originalData).toEqual(data); @@ -210,17 +214,19 @@ describe('CrudModel', () => { }); describe('saveChanges()', () => { - data = [{ - name: 'Tony', - lastName: 'Stark', - age: 42, - }]; + data = [ + { + name: 'Tony', + lastName: 'Stark', + age: 42, + }, + ]; it('should call saveFn if exists', async () => { await wrapper.setProps({ saveFn: vi.fn() }); vm.saveChanges(data); - + expect(vm.saveFn).toHaveBeenCalledOnce(); expect(vm.isLoading).toBe(false); expect(vm.hasChanges).toBe(false); @@ -229,13 +235,15 @@ describe('CrudModel', () => { }); it("should use default url if there's not saveFn", async () => { - const postMock =vi.spyOn(axios, 'post'); - - vm.formData = [{ - name: 'Bruce', - lastName: 'Wayne', - age: 45, - }] + const postMock = vi.spyOn(axios, 'post'); + + vm.formData = [ + { + name: 'Bruce', + lastName: 'Wayne', + age: 45, + }, + ]; await vm.saveChanges(data); diff --git a/src/components/__tests__/EditTableCellValueForm.spec.js b/src/components/__tests__/EditTableCellValueForm.spec.js index fa47d8f73..acba27519 100644 --- a/src/components/__tests__/EditTableCellValueForm.spec.js +++ b/src/components/__tests__/EditTableCellValueForm.spec.js @@ -1,4 +1,5 @@ -import { createWrapper, axios } from 'app/test/vitest/helper'; +import { createWrapper } from 'app/test/vitest/helper'; +import { default as axios } from 'axios'; import EditForm from 'components/EditTableCellValueForm.vue'; import { vi, afterEach, beforeAll, describe, expect, it } from 'vitest'; diff --git a/src/components/__tests__/FilterItemForm.spec.js b/src/components/__tests__/FilterItemForm.spec.js index 210d6bf02..fb8332c31 100644 --- a/src/components/__tests__/FilterItemForm.spec.js +++ b/src/components/__tests__/FilterItemForm.spec.js @@ -1,4 +1,6 @@ -import { createWrapper, axios } from 'app/test/vitest/helper'; +import { createWrapper } from 'app/test/vitest/helper'; +import { default as axios } from 'axios'; + import FilterItemForm from 'src/components/FilterItemForm.vue'; import { vi, beforeAll, describe, expect, it } from 'vitest'; @@ -38,9 +40,9 @@ describe('FilterItemForm', () => { { relation: 'producer', scope: { fields: ['name'] } }, { relation: 'ink', scope: { fields: ['name'] } }, ], - where: {"name":{"like":"%bolas de madera%"}}, + where: { name: { like: '%bolas de madera%' } }, }; - + expect(axios.get).toHaveBeenCalledWith('Items/withName', { params: { filter: JSON.stringify(expectedFilter) }, }); @@ -79,4 +81,4 @@ describe('FilterItemForm', () => { vm.selectItem({ id: 12345 }); expect(wrapper.emitted('itemSelected')[0]).toEqual([12345]); }); -}); \ No newline at end of file +}); diff --git a/src/components/__tests__/FormModel.spec.js b/src/components/__tests__/FormModel.spec.js index e35684bc3..9acbdc826 100644 --- a/src/components/__tests__/FormModel.spec.js +++ b/src/components/__tests__/FormModel.spec.js @@ -1,5 +1,7 @@ import { describe, expect, it, beforeAll, vi, afterAll } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import { createWrapper } from 'app/test/vitest/helper'; +import { default as axios } from 'axios'; + import FormModel from 'src/components/FormModel.vue'; describe('FormModel', () => { diff --git a/src/components/common/__tests__/VnDmsList.spec.js b/src/components/common/__tests__/VnDmsList.spec.js index 9649943a2..bfa8040f5 100644 --- a/src/components/common/__tests__/VnDmsList.spec.js +++ b/src/components/common/__tests__/VnDmsList.spec.js @@ -1,14 +1,16 @@ -import { createWrapper, axios } from 'app/test/vitest/helper'; +import { createWrapper } from 'app/test/vitest/helper'; +import { default as axios } from 'axios'; + import VnDmsList from 'src/components/common/VnDmsList.vue'; import { vi, afterEach, beforeAll, describe, expect, it } from 'vitest'; describe('VnDmsList', () => { let vm; - const dms = { - userFk: 1, - name: 'DMS 1' + const dms = { + userFk: 1, + name: 'DMS 1', }; - + beforeAll(() => { vi.spyOn(axios, 'get').mockResolvedValue({ data: [] }); vm = createWrapper(VnDmsList, { @@ -18,8 +20,8 @@ describe('VnDmsList', () => { filter: 'wd.workerFk', updateModel: 'Workers', deleteModel: 'WorkerDms', - downloadModel: 'WorkerDms' - } + downloadModel: 'WorkerDms', + }, }).vm; }); @@ -29,46 +31,45 @@ describe('VnDmsList', () => { describe('setData()', () => { const data = [ - { - userFk: 1, + { + userFk: 1, name: 'Jessica', lastName: 'Jones', file: '4.jpg', - created: '2021-07-28 21:00:00' + created: '2021-07-28 21:00:00', }, - { - userFk: 2, + { + userFk: 2, name: 'Bruce', lastName: 'Banner', created: '2022-07-28 21:00:00', dms: { - userFk: 2, + userFk: 2, name: 'Bruce', lastName: 'BannerDMS', created: '2022-07-28 21:00:00', file: '4.jpg', - } + }, }, { userFk: 3, name: 'Natasha', lastName: 'Romanoff', file: '4.jpg', - created: '2021-10-28 21:00:00' - } - ] + created: '2021-10-28 21:00:00', + }, + ]; it('Should replace objects that contain the "dms" property with the value of the same and sort by creation date', () => { vm.setData(data); expect([vm.rows][0][0].lastName).toEqual('BannerDMS'); expect([vm.rows][0][1].lastName).toEqual('Romanoff'); - }); }); describe('parseDms()', () => { - const resultDms = { ...dms, userId:1}; - + const resultDms = { ...dms, userId: 1 }; + it('Should add properties that end with "Fk" by changing the suffix to "Id"', () => { const parsedDms = vm.parseDms(dms); expect(parsedDms).toEqual(resultDms); @@ -76,12 +77,12 @@ describe('VnDmsList', () => { }); describe('showFormDialog()', () => { - const resultDms = { ...dms, userId:1}; - + const resultDms = { ...dms, userId: 1 }; + it('should call fn parseDms() and set show true if dms is defined', () => { vm.showFormDialog(dms); expect(vm.formDialog.show).toEqual(true); expect(vm.formDialog.dms).toEqual(resultDms); }); }); -}); \ No newline at end of file +}); diff --git a/src/components/common/__tests__/VnNotes.spec.js b/src/components/common/__tests__/VnNotes.spec.js index 8f24a7f14..5ede8caab 100644 --- a/src/components/common/__tests__/VnNotes.spec.js +++ b/src/components/common/__tests__/VnNotes.spec.js @@ -1,5 +1,7 @@ import { describe, it, expect, vi, beforeAll, afterEach, beforeEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import { createWrapper } from 'app/test/vitest/helper'; +import { default as axios } from 'axios'; + import VnNotes from 'src/components/ui/VnNotes.vue'; describe('VnNotes', () => { @@ -8,26 +10,34 @@ describe('VnNotes', () => { let spyFetch; let postMock; let expectedBody; - const mockData= {name: 'Tony', lastName: 'Stark', text: 'Test Note', observationTypeFk: 1}; + const mockData = { + name: 'Tony', + lastName: 'Stark', + text: 'Test Note', + observationTypeFk: 1, + }; function generateExpectedBody() { - expectedBody = {...vm.$props.body, ...{ text: vm.newNote.text, observationTypeFk: vm.newNote.observationTypeFk }}; + expectedBody = { + ...vm.$props.body, + ...{ text: vm.newNote.text, observationTypeFk: vm.newNote.observationTypeFk }, + }; } - async function setTestParams(text, observationType, type){ + async function setTestParams(text, observationType, type) { vm.newNote.text = text; vm.newNote.observationTypeFk = observationType; wrapper.setProps({ selectType: type }); } - beforeAll(async () => { + beforeAll(async () => { vi.spyOn(axios, 'get').mockReturnValue({ data: [] }); wrapper = createWrapper(VnNotes, { propsData: { url: '/test', body: { name: 'Tony', lastName: 'Stark' }, - } + }, }); wrapper = wrapper.wrapper; vm = wrapper.vm; @@ -45,7 +55,7 @@ describe('VnNotes', () => { describe('insert', () => { it('should not call axios.post and vnPaginateRef.fetch if newNote.text is null', async () => { - await setTestParams( null, null, true ); + await setTestParams(null, null, true); await vm.insert(); @@ -54,7 +64,7 @@ describe('VnNotes', () => { }); it('should not call axios.post and vnPaginateRef.fetch if newNote.text is empty', async () => { - await setTestParams( "", null, false ); + await setTestParams('', null, false); await vm.insert(); @@ -63,7 +73,7 @@ describe('VnNotes', () => { }); it('should not call axios.post and vnPaginateRef.fetch if observationTypeFk is missing and selectType is true', async () => { - await setTestParams( "Test Note", null, true ); + await setTestParams('Test Note', null, true); await vm.insert(); @@ -72,7 +82,7 @@ describe('VnNotes', () => { }); it('should call axios.post and vnPaginateRef.fetch if observationTypeFk is missing and selectType is false', async () => { - await setTestParams( "Test Note", null, false ); + await setTestParams('Test Note', null, false); generateExpectedBody(); @@ -82,8 +92,8 @@ describe('VnNotes', () => { expect(spyFetch).toHaveBeenCalled(); }); - it('should call axios.post and vnPaginateRef.fetch if observationTypeFk is setted and selectType is false', async () => { - await setTestParams( "Test Note", 1, false ); + it('should call axios.post and vnPaginateRef.fetch if observationTypeFk is setted and selectType is false', async () => { + await setTestParams('Test Note', 1, false); generateExpectedBody(); @@ -94,14 +104,14 @@ describe('VnNotes', () => { }); it('should call axios.post and vnPaginateRef.fetch when newNote is valid', async () => { - await setTestParams( "Test Note", 1, true ); + await setTestParams('Test Note', 1, true); generateExpectedBody(); - + await vm.insert(); expect(postMock).toHaveBeenCalledWith(vm.$props.url, expectedBody); expect(spyFetch).toHaveBeenCalled(); }); }); -}); \ No newline at end of file +}); diff --git a/src/components/ui/__tests__/CardSummary.spec.js b/src/components/ui/__tests__/CardSummary.spec.js index 411ebf9bb..0c33e42c7 100644 --- a/src/components/ui/__tests__/CardSummary.spec.js +++ b/src/components/ui/__tests__/CardSummary.spec.js @@ -1,5 +1,7 @@ import { vi, describe, expect, it, beforeAll, afterEach, beforeEach } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import { createWrapper } from 'app/test/vitest/helper'; +import { default as axios } from 'axios'; + import CardSummary from 'src/components/ui/CardSummary.vue'; import * as vueRouter from 'vue-router'; @@ -72,7 +74,7 @@ describe('CardSummary', () => { expect(vm.store.filter).toEqual({ key: newKey }); }); - it('should return true if route path ends with /summary' , () => { + it('should return true if route path ends with /summary', () => { expect(vm.isSummary).toBe(true); }); -}); \ No newline at end of file +}); diff --git a/src/composables/useSession.js b/src/composables/useSession.js index e69819a68..36b31ab0a 100644 --- a/src/composables/useSession.js +++ b/src/composables/useSession.js @@ -60,7 +60,7 @@ export function useSession() { const { data: isValidToken } = await axios.get('VnUsers/validateToken'); if (isValidToken) destroyTokenPromises = Object.entries(tokens).map(([key, url]) => - destroyToken(url, storage, key) + destroyToken(url, storage, key), ); } } finally { diff --git a/src/pages/Claim/Card/ClaimPhoto.vue b/src/pages/Claim/Card/ClaimPhoto.vue index ec619cc7d..75f9af9fe 100644 --- a/src/pages/Claim/Card/ClaimPhoto.vue +++ b/src/pages/Claim/Card/ClaimPhoto.vue @@ -61,7 +61,7 @@ watch( () => { claimDmsFilter.value.where.id = router.currentRoute.value.params.id; claimDmsRef.value.fetch(); - } + }, ); function openDialog(dmsId) { diff --git a/test/vitest/helper.js b/test/vitest/helper.js index f65bb905c..be0029ee8 100644 --- a/test/vitest/helper.js +++ b/test/vitest/helper.js @@ -40,8 +40,6 @@ vi.mock('vue-router', () => ({ onBeforeRouteLeave: () => {}, })); -vi.mock('axios'); - vi.spyOn(useValidator, 'useValidator').mockImplementation(() => { return { validate: vi.fn(), From fa755bf60808c6df2220b580e531d333eba43d19 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 17 Feb 2025 18:50:41 +0100 Subject: [PATCH 04/55] feat: change columns order --- src/pages/InvoiceOut/InvoiceOutList.vue | 32 ++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/pages/InvoiceOut/InvoiceOutList.vue b/src/pages/InvoiceOut/InvoiceOutList.vue index c7d7ba9f4..e97090287 100644 --- a/src/pages/InvoiceOut/InvoiceOutList.vue +++ b/src/pages/InvoiceOut/InvoiceOutList.vue @@ -79,6 +79,22 @@ const columns = computed(() => [ format: (row) => toDate(row.issued), columnField: { component: null }, }, + { + align: 'left', + name: 'created', + label: t('globals.created'), + component: 'date', + columnField: { component: null }, + format: (row) => toDate(row.created), + }, + { + align: 'left', + name: 'dued', + label: t('invoiceOut.summary.expirationDate'), + component: 'date', + columnField: { component: null }, + format: (row) => toDate(row.dued), + }, { align: 'left', name: 'clientFk', @@ -118,22 +134,6 @@ const columns = computed(() => [ cardVisible: true, format: (row) => toCurrency(row.amount), }, - { - align: 'left', - name: 'created', - label: t('globals.created'), - component: 'date', - columnField: { component: null }, - format: (row) => toDate(row.created), - }, - { - align: 'left', - name: 'dued', - label: t('invoiceOut.summary.dued'), - component: 'date', - columnField: { component: null }, - format: (row) => toDate(row.dued), - }, { align: 'left', name: 'customsAgentFk', From af531958ca1ee8731d4ac9963882f5d77426c0d4 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 17 Feb 2025 19:18:25 +0100 Subject: [PATCH 05/55] feat: change customersumamry title --- src/pages/Customer/Card/CustomerSummary.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Customer/Card/CustomerSummary.vue b/src/pages/Customer/Card/CustomerSummary.vue index 324da0771..20f29efe0 100644 --- a/src/pages/Customer/Card/CustomerSummary.vue +++ b/src/pages/Customer/Card/CustomerSummary.vue @@ -182,7 +182,7 @@ const sumRisk = ({ clientRisks }) => { <QCard class="vn-one"> <VnTitle :url="`#/customer/${entityId}/billing-data`" - :text="t('customer.summary.billingData')" + :text="t('customer.summary.payMethodFk')" /> <VnLv :label="t('customer.summary.payMethod')" From 644339bd13418af71c96ff980dcf2149851b0f7b Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Sat, 1 Mar 2025 02:38:05 +0100 Subject: [PATCH 06/55] test: vnNotes restore --- .../common/__tests__/VnNotes.spec.js | 121 +++++++++++------- 1 file changed, 74 insertions(+), 47 deletions(-) diff --git a/src/components/common/__tests__/VnNotes.spec.js b/src/components/common/__tests__/VnNotes.spec.js index c6551554f..2603bf03c 100644 --- a/src/components/common/__tests__/VnNotes.spec.js +++ b/src/components/common/__tests__/VnNotes.spec.js @@ -1,7 +1,14 @@ -import { describe, it, expect, vi, beforeAll, afterEach, beforeEach } from 'vitest'; -import { createWrapper } from 'app/test/vitest/helper'; -import { default as axios } from 'axios'; - +import { + describe, + it, + expect, + vi, + beforeAll, + afterEach, + beforeEach, + afterAll, +} from 'vitest'; +import { createWrapper, axios } from 'app/test/vitest/helper'; import VnNotes from 'src/components/ui/VnNotes.vue'; import vnDate from 'src/boot/vnDate'; @@ -10,27 +17,24 @@ describe('VnNotes', () => { let wrapper; let spyFetch; let postMock; - let expectedBody; - const mockData= {name: 'Tony', lastName: 'Stark', text: 'Test Note', observationTypeFk: 1}; - - function generateExpectedBody() { - expectedBody = {...vm.$props.body, ...{ text: vm.newNote.text, observationTypeFk: vm.newNote.observationTypeFk }}; - } - - async function setTestParams(text, observationType, type){ - vm.newNote.text = text; - vm.newNote.observationTypeFk = observationType; - wrapper.setProps({ selectType: type }); - } - - beforeAll(async () => { - vi.spyOn(axios, 'get').mockReturnValue({ data: [] }); - + let patchMock; + let expectedInsertBody; + let expectedUpdateBody; + const defaultOptions = { + url: '/test', + body: { name: 'Tony', lastName: 'Stark' }, + selectType: false, + saveUrl: null, + justInput: false, + }; + function generateWrapper( + options = defaultOptions, + text = null, + observationType = null, + ) { + vi.spyOn(axios, 'get').mockResolvedValue({ data: [] }); wrapper = createWrapper(VnNotes, { - propsData: { - url: '/test', - body: { name: 'Tony', lastName: 'Stark' }, - } + propsData: options, }); wrapper = wrapper.wrapper; vm = wrapper.vm; @@ -66,8 +70,9 @@ describe('VnNotes', () => { }); describe('insert', () => { - it('should not call axios.post and vnPaginateRef.fetch if newNote.text is null', async () => { - await setTestParams( null, null, true ); + it('should not call axios.post and vnPaginateRef.fetch when newNote.text is null', async () => { + generateWrapper({ selectType: true }); + createSpyFetch(); await vm.insert(); @@ -75,8 +80,9 @@ describe('VnNotes', () => { expect(spyFetch).not.toHaveBeenCalled(); }); - it('should not call axios.post and vnPaginateRef.fetch if newNote.text is empty', async () => { - await setTestParams( "", null, false ); + it('should not call axios.post and vnPaginateRef.fetch when newNote.text is empty', async () => { + generateWrapper(null, ''); + createSpyFetch(); await vm.insert(); @@ -84,8 +90,9 @@ describe('VnNotes', () => { expect(spyFetch).not.toHaveBeenCalled(); }); - it('should not call axios.post and vnPaginateRef.fetch if observationTypeFk is missing and selectType is true', async () => { - await setTestParams( "Test Note", null, true ); + it('should not call axios.post and vnPaginateRef.fetch when observationTypeFk is null and selectType is true', async () => { + generateWrapper({ selectType: true }, 'Test Note'); + createSpyFetch(); await vm.insert(); @@ -93,31 +100,20 @@ describe('VnNotes', () => { expect(spyFetch).not.toHaveBeenCalled(); }); - it('should call axios.post and vnPaginateRef.fetch if observationTypeFk is missing and selectType is false', async () => { - await setTestParams( "Test Note", null, false ); - + it('should call axios.post and vnPaginateRef.fetch when observationTypeFk is missing and selectType is false', async () => { + generateWrapper(null, 'Test Note'); + createSpyFetch(); generateExpectedBody(); await vm.insert(); - expect(postMock).toHaveBeenCalledWith(vm.$props.url, expectedBody); - expect(spyFetch).toHaveBeenCalled(); - }); - - it('should call axios.post and vnPaginateRef.fetch if observationTypeFk is setted and selectType is false', async () => { - await setTestParams( "Test Note", 1, false ); - - generateExpectedBody(); - - await vm.insert(); - - expect(postMock).toHaveBeenCalledWith(vm.$props.url, expectedBody); + expect(postMock).toHaveBeenCalledWith(vm.$props.url, expectedInsertBody); expect(spyFetch).toHaveBeenCalled(); }); it('should call axios.post and vnPaginateRef.fetch when newNote is valid', async () => { - await setTestParams( "Test Note", 1, true ); - + generateWrapper({ selectType: true }, 'Test Note', 1); + createSpyFetch(); generateExpectedBody(); await vm.insert(); @@ -126,4 +122,35 @@ describe('VnNotes', () => { expect(spyFetch).toHaveBeenCalled(); }); }); + + describe('update', () => { + it('should call axios.patch with saveUrl when saveUrl is set and justInput is true', async () => { + generateWrapper({ + url: '/business', + justInput: true, + saveUrl: '/saveUrlTest', + }); + generateExpectedBody(); + + await vm.update(); + + expect(patchMock).toHaveBeenCalledWith(vm.$props.saveUrl, expectedUpdateBody); + }); + + it('should call axios.patch with url when saveUrl is not set and justInput is true', async () => { + generateWrapper({ + url: '/business', + body: { workerFk: 1110 }, + justInput: true, + }); + generateExpectedBody(); + + await vm.update(); + + expect(patchMock).toHaveBeenCalledWith( + `${vm.$props.url}/${vm.$props.body.workerFk}`, + expectedUpdateBody, + ); + }); + }); }); From 0263af793850a26c12aecaad5e66bc0656aeec0f Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Sun, 2 Mar 2025 23:58:36 +0100 Subject: [PATCH 07/55] test: refs #7356 init each missing e2e --- .../integration/ticket/ticketBasicData.spec.js | 12 ++++++++++++ .../integration/ticket/ticketComponents.spec.js | 11 +++++++++++ .../cypress/integration/ticket/ticketPackage.spec.js | 12 ++++++++++++ .../integration/ticket/ticketPictures.spec.js | 11 +++++++++++ .../integration/ticket/ticketSaleTracking.spec.js | 12 ++++++++++++ .../cypress/integration/ticket/ticketService.spec.js | 12 ++++++++++++ test/cypress/integration/ticket/ticketSms.spec.js | 12 ++++++++++++ .../integration/ticket/ticketTracking.spec.js | 12 ++++++++++++ test/cypress/integration/ticket/ticketVolume.spec.js | 12 ++++++++++++ 9 files changed, 106 insertions(+) create mode 100644 test/cypress/integration/ticket/ticketBasicData.spec.js create mode 100644 test/cypress/integration/ticket/ticketComponents.spec.js create mode 100644 test/cypress/integration/ticket/ticketPackage.spec.js create mode 100644 test/cypress/integration/ticket/ticketPictures.spec.js create mode 100644 test/cypress/integration/ticket/ticketSaleTracking.spec.js create mode 100644 test/cypress/integration/ticket/ticketService.spec.js create mode 100644 test/cypress/integration/ticket/ticketSms.spec.js create mode 100644 test/cypress/integration/ticket/ticketTracking.spec.js create mode 100644 test/cypress/integration/ticket/ticketVolume.spec.js diff --git a/test/cypress/integration/ticket/ticketBasicData.spec.js b/test/cypress/integration/ticket/ticketBasicData.spec.js new file mode 100644 index 000000000..ac57e47e6 --- /dev/null +++ b/test/cypress/integration/ticket/ticketBasicData.spec.js @@ -0,0 +1,12 @@ +/// <reference types="cypress" /> +describe('TicketRequest', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); + cy.visit('/#/ticket/31/basic-data'); + }); + + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/ticket/ticketComponents.spec.js b/test/cypress/integration/ticket/ticketComponents.spec.js new file mode 100644 index 000000000..f6107486c --- /dev/null +++ b/test/cypress/integration/ticket/ticketComponents.spec.js @@ -0,0 +1,11 @@ +/// <reference types="cypress" /> +describe('TicketRequest', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); + cy.visit('/#/ticket/31/request'); + }); + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/ticket/ticketPackage.spec.js b/test/cypress/integration/ticket/ticketPackage.spec.js new file mode 100644 index 000000000..1f54af5b1 --- /dev/null +++ b/test/cypress/integration/ticket/ticketPackage.spec.js @@ -0,0 +1,12 @@ +/// <reference types="cypress" /> +describe('TicketRequest', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); + cy.visit('/#/ticket/31/request'); + }); + + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/ticket/ticketPictures.spec.js b/test/cypress/integration/ticket/ticketPictures.spec.js new file mode 100644 index 000000000..a2f4ad506 --- /dev/null +++ b/test/cypress/integration/ticket/ticketPictures.spec.js @@ -0,0 +1,11 @@ +/// <reference types="cypress" /> +describe('TicketRequest', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); + cy.visit('/#/ticket/31/picture'); + }); + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/ticket/ticketSaleTracking.spec.js b/test/cypress/integration/ticket/ticketSaleTracking.spec.js new file mode 100644 index 000000000..30ac79e0f --- /dev/null +++ b/test/cypress/integration/ticket/ticketSaleTracking.spec.js @@ -0,0 +1,12 @@ +/// <reference types="cypress" /> +describe('TicketRequest', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); + cy.visit('/#/ticket/31/sale-tracking'); + }); + + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/ticket/ticketService.spec.js b/test/cypress/integration/ticket/ticketService.spec.js new file mode 100644 index 000000000..35a126fc8 --- /dev/null +++ b/test/cypress/integration/ticket/ticketService.spec.js @@ -0,0 +1,12 @@ +/// <reference types="cypress" /> +describe('TicketRequest', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); + cy.visit('/#/ticket/31/service'); + }); + + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/ticket/ticketSms.spec.js b/test/cypress/integration/ticket/ticketSms.spec.js new file mode 100644 index 000000000..69a48b341 --- /dev/null +++ b/test/cypress/integration/ticket/ticketSms.spec.js @@ -0,0 +1,12 @@ +/// <reference types="cypress" /> +describe('TicketRequest', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); + cy.visit('/#/ticket/31/sms'); + }); + + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/ticket/ticketTracking.spec.js b/test/cypress/integration/ticket/ticketTracking.spec.js new file mode 100644 index 000000000..1f54af5b1 --- /dev/null +++ b/test/cypress/integration/ticket/ticketTracking.spec.js @@ -0,0 +1,12 @@ +/// <reference types="cypress" /> +describe('TicketRequest', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); + cy.visit('/#/ticket/31/request'); + }); + + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/ticket/ticketVolume.spec.js b/test/cypress/integration/ticket/ticketVolume.spec.js new file mode 100644 index 000000000..7b3d890b8 --- /dev/null +++ b/test/cypress/integration/ticket/ticketVolume.spec.js @@ -0,0 +1,12 @@ +/// <reference types="cypress" /> +describe('TicketRequest', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); + cy.visit('/#/ticket/31/volume'); + }); + + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); From 4641adbae3c4b8604006e18a8c268f8ad70cc61f Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 5 Mar 2025 23:20:23 +0100 Subject: [PATCH 08/55] feat: refs #8725 init --- src/components/FormModel.vue | 15 +++++++++++++-- src/components/FormModelPopup.vue | 5 +++-- src/pages/Customer/Card/CustomerFiscalData.vue | 2 ++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index c4d9a4149..b36f0998e 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -119,7 +119,9 @@ const defaultButtons = computed(() => ({ color: 'primary', icon: 'save', label: 'globals.save', - click: async () => await save(), + click: async () => { + submitForm(); + }, type: 'submit', }, reset: { @@ -132,6 +134,14 @@ const defaultButtons = computed(() => ({ ...$props.defaultButtons, })); +const submitForm = () => { + myForm.value.validate().then((success) => { + if (success) { + save(); + } + }); +}; + onMounted(async () => { nextTick(() => (componentIsRendered.value = true)); @@ -312,6 +322,7 @@ async function onKeyup(evt) { } defineExpose({ + myForm, save, isLoading, hasChanges, @@ -325,7 +336,7 @@ defineExpose({ <QForm ref="myForm" v-if="formData" - @submit.prevent + @submit.prevent="save" @keyup.prevent="onKeyup" @reset="reset" class="q-pa-md" diff --git a/src/components/FormModelPopup.vue b/src/components/FormModelPopup.vue index 85943e91e..c6d901b23 100644 --- a/src/components/FormModelPopup.vue +++ b/src/components/FormModelPopup.vue @@ -43,7 +43,7 @@ const onDataSaved = async (formData, requestResponse) => { const onClick = async (saveAndContinue) => { isSaveAndContinue.value = saveAndContinue; - await formModelRef.value.save(); + formModelRef.value.myForm.submit(); }; defineExpose({ @@ -61,6 +61,7 @@ defineExpose({ :default-actions="false" v-bind="$attrs" @on-data-saved="onDataSaved" + @submit.prevent > <template #form="{ data, validate }"> <span ref="closeButton" class="close-icon" v-close-popup> @@ -87,7 +88,7 @@ defineExpose({ :flat="showSaveAndContinueBtn" :label="t('globals.save')" :title="t('globals.save')" - @click="onClick(false)" + type="submit" color="primary" class="q-ml-sm" :disabled="isLoading" diff --git a/src/pages/Customer/Card/CustomerFiscalData.vue b/src/pages/Customer/Card/CustomerFiscalData.vue index 93909eb9c..d3f1f937a 100644 --- a/src/pages/Customer/Card/CustomerFiscalData.vue +++ b/src/pages/Customer/Card/CustomerFiscalData.vue @@ -112,6 +112,7 @@ async function acceptPropagate({ isEqualizated }) { v-model="data.sageTaxTypeFk" data-cy="sageTaxTypeFk" :required="data.isTaxDataChecked" + :rules="[(val) => val !== null || 'Please type your age']" /> <VnSelect :label="t('Sage transaction type')" @@ -122,6 +123,7 @@ async function acceptPropagate({ isEqualizated }) { data-cy="sageTransactionTypeFk" v-model="data.sageTransactionTypeFk" :required="data.isTaxDataChecked" + :rules="[(val) => val !== null || 'Please type your age']" > <template #option="scope"> <QItem v-bind="scope.itemProps"> From a01f02e31b137cb88a372cbbf4df975ff982e067 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 5 Mar 2025 23:24:11 +0100 Subject: [PATCH 09/55] fix: refs #8725 customerFiscalData --- src/components/FormModel.vue | 3 ++- src/pages/Customer/Card/CustomerFiscalData.vue | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index b36f0998e..02afae2c6 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -19,7 +19,7 @@ const quasar = useQuasar(); const state = useState(); const stateStore = useStateStore(); const { t } = useI18n(); -const { validate } = useValidator(); +const { validate, validations } = useValidator(); const { notify } = useNotify(); const route = useRoute(); const myForm = ref(null); @@ -350,6 +350,7 @@ defineExpose({ name="form" :data="formData" :validate="validate" + :validations="validations()" :filter="filter" /> <SkeletonForm v-else /> diff --git a/src/pages/Customer/Card/CustomerFiscalData.vue b/src/pages/Customer/Card/CustomerFiscalData.vue index d3f1f937a..baa728868 100644 --- a/src/pages/Customer/Card/CustomerFiscalData.vue +++ b/src/pages/Customer/Card/CustomerFiscalData.vue @@ -79,7 +79,7 @@ async function acceptPropagate({ isEqualizated }) { observe-form-changes @on-data-saved="checkEtChanges" > - <template #form="{ data, validate }"> + <template #form="{ data, validate, validations }"> <VnRow> <VnInput :label="t('Social name')" @@ -112,7 +112,7 @@ async function acceptPropagate({ isEqualizated }) { v-model="data.sageTaxTypeFk" data-cy="sageTaxTypeFk" :required="data.isTaxDataChecked" - :rules="[(val) => val !== null || 'Please type your age']" + :rules="[(val) => validations.required(data.isTaxDataChecked, val)]" /> <VnSelect :label="t('Sage transaction type')" @@ -123,7 +123,9 @@ async function acceptPropagate({ isEqualizated }) { data-cy="sageTransactionTypeFk" v-model="data.sageTransactionTypeFk" :required="data.isTaxDataChecked" - :rules="[(val) => val !== null || 'Please type your age']" + :rules="[ + (val) => validations.required(data.sageTransactionTypeFk, val), + ]" > <template #option="scope"> <QItem v-bind="scope.itemProps"> From 095f01717d6054972617f5821ea84a1d0515935b Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Thu, 6 Mar 2025 10:01:35 +0100 Subject: [PATCH 10/55] perf: refs #8725 handle axios.error --- src/components/FormModel.vue | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 02afae2c6..184913c49 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -1,6 +1,15 @@ <script setup> import axios from 'axios'; -import { onMounted, onUnmounted, computed, ref, watch, nextTick, useAttrs } from 'vue'; +import { + onMounted, + onUnmounted, + computed, + ref, + watch, + nextTick, + useAttrs, + inject, +} from 'vue'; import { onBeforeRouteLeave, useRouter, useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { useQuasar } from 'quasar'; @@ -13,7 +22,7 @@ import VnConfirm from './ui/VnConfirm.vue'; import { tMobile } from 'src/composables/tMobile'; import { useArrayData } from 'src/composables/useArrayData'; import { getDifferences, getUpdatedValues } from 'src/filters'; - +const app = inject('app'); const { push } = useRouter(); const quasar = useQuasar(); const state = useState(); @@ -134,12 +143,15 @@ const defaultButtons = computed(() => ({ ...$props.defaultButtons, })); -const submitForm = () => { - myForm.value.validate().then((success) => { - if (success) { - save(); +const submitForm = async () => { + const valid = await myForm.value.validate(); + if (valid) { + try { + await save(); + } catch (error) { + app.config.errorHandler(error); } - }); + } }; onMounted(async () => { @@ -237,10 +249,9 @@ async function save() { const method = $props.urlCreate ? 'post' : 'patch'; const url = $props.urlCreate || $props.urlUpdate || $props.url || arrayData.store.url; - let response; - - if ($props.saveFn) response = await $props.saveFn(body); - else response = await axios[method](url, body); + const response = await Promise.resolve( + $props.saveFn ? $props.saveFn(body) : axios[method](url, body), + ); if ($props.urlCreate) notify('globals.dataCreated', 'positive'); From 32dac089f866793cea3c3948b582ca6301619400 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Thu, 6 Mar 2025 10:11:56 +0100 Subject: [PATCH 11/55] feat: refs #8725 saveAndContinue --- src/components/FormModel.vue | 7 +++---- src/components/FormModelPopup.vue | 3 ++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 184913c49..57456ba3d 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -144,8 +144,8 @@ const defaultButtons = computed(() => ({ })); const submitForm = async () => { - const valid = await myForm.value.validate(); - if (valid) { + const isFormValid = await myForm.value.validate(); + if (isFormValid) { try { await save(); } catch (error) { @@ -333,7 +333,6 @@ async function onKeyup(evt) { } defineExpose({ - myForm, save, isLoading, hasChanges, @@ -347,7 +346,7 @@ defineExpose({ <QForm ref="myForm" v-if="formData" - @submit.prevent="save" + @submit.prevent @keyup.prevent="onKeyup" @reset="reset" class="q-pa-md" diff --git a/src/components/FormModelPopup.vue b/src/components/FormModelPopup.vue index c6d901b23..b3370e2d1 100644 --- a/src/components/FormModelPopup.vue +++ b/src/components/FormModelPopup.vue @@ -43,7 +43,6 @@ const onDataSaved = async (formData, requestResponse) => { const onClick = async (saveAndContinue) => { isSaveAndContinue.value = saveAndContinue; - formModelRef.value.myForm.submit(); }; defineExpose({ @@ -88,6 +87,7 @@ defineExpose({ :flat="showSaveAndContinueBtn" :label="t('globals.save')" :title="t('globals.save')" + @click="onClick(false)" type="submit" color="primary" class="q-ml-sm" @@ -101,6 +101,7 @@ defineExpose({ :label="t('globals.isSaveAndContinue')" :title="t('globals.isSaveAndContinue')" color="primary" + type="submit" class="q-ml-sm" :disabled="isLoading" :loading="isLoading" From 255df3acd647bf56b33946b54ec8e13980f6228b Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Fri, 7 Mar 2025 13:33:53 +0100 Subject: [PATCH 12/55] fix: refs #8725 streamline form submission logic in FormModel.vue --- src/components/FormModel.vue | 18 +++++++----------- src/components/FormModelPopup.vue | 5 ++++- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 57456ba3d..f8e16be53 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -128,9 +128,7 @@ const defaultButtons = computed(() => ({ color: 'primary', icon: 'save', label: 'globals.save', - click: async () => { - submitForm(); - }, + click: async (evt) => submitForm(evt), type: 'submit', }, reset: { @@ -143,14 +141,10 @@ const defaultButtons = computed(() => ({ ...$props.defaultButtons, })); -const submitForm = async () => { +const submitForm = async (evt) => { const isFormValid = await myForm.value.validate(); if (isFormValid) { - try { - await save(); - } catch (error) { - app.config.errorHandler(error); - } + await save(evt); } }; @@ -328,11 +322,13 @@ async function onKeyup(evt) { selectionStart = selectionEnd = selectionStart + 1; return; } - await save(); + await submitForm(); } } defineExpose({ + submitForm, + myForm, save, isLoading, hasChanges, @@ -347,7 +343,7 @@ defineExpose({ ref="myForm" v-if="formData" @submit.prevent - @keyup.prevent="onKeyup" + @keyup="onKeyup" @reset="reset" class="q-pa-md" :style="maxWidth ? 'max-width: ' + maxWidth : ''" diff --git a/src/components/FormModelPopup.vue b/src/components/FormModelPopup.vue index b3370e2d1..48a3e77b6 100644 --- a/src/components/FormModelPopup.vue +++ b/src/components/FormModelPopup.vue @@ -43,6 +43,9 @@ const onDataSaved = async (formData, requestResponse) => { const onClick = async (saveAndContinue) => { isSaveAndContinue.value = saveAndContinue; + if (formModelRef.value) { + await formModelRef.value.submitForm(); + } }; defineExpose({ @@ -58,6 +61,7 @@ defineExpose({ ref="formModelRef" :observe-form-changes="false" :default-actions="false" + @submit="onClick" v-bind="$attrs" @on-data-saved="onDataSaved" @submit.prevent @@ -87,7 +91,6 @@ defineExpose({ :flat="showSaveAndContinueBtn" :label="t('globals.save')" :title="t('globals.save')" - @click="onClick(false)" type="submit" color="primary" class="q-ml-sm" From 215e3a6da466145a3b7e94cd27c8ece3e7065053 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Fri, 7 Mar 2025 14:00:50 +0100 Subject: [PATCH 13/55] feat: refs #8725 ok --- src/components/FormModel.vue | 4 ++-- src/components/FormModelPopup.vue | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index f8e16be53..6293d92dc 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -322,7 +322,7 @@ async function onKeyup(evt) { selectionStart = selectionEnd = selectionStart + 1; return; } - await submitForm(); + await myForm.value.submit(evt); } } @@ -342,7 +342,7 @@ defineExpose({ <QForm ref="myForm" v-if="formData" - @submit.prevent + @submit.prevent="save" @keyup="onKeyup" @reset="reset" class="q-pa-md" diff --git a/src/components/FormModelPopup.vue b/src/components/FormModelPopup.vue index 48a3e77b6..f1a59263b 100644 --- a/src/components/FormModelPopup.vue +++ b/src/components/FormModelPopup.vue @@ -41,7 +41,7 @@ const onDataSaved = async (formData, requestResponse) => { emit('onDataSaved', formData, requestResponse); }; -const onClick = async (saveAndContinue) => { +const onClick = async (saveAndContinue = showSaveAndContinueBtn) => { isSaveAndContinue.value = saveAndContinue; if (formModelRef.value) { await formModelRef.value.submitForm(); @@ -64,7 +64,7 @@ defineExpose({ @submit="onClick" v-bind="$attrs" @on-data-saved="onDataSaved" - @submit.prevent + :prevent-submit="false" > <template #form="{ data, validate }"> <span ref="closeButton" class="close-icon" v-close-popup> @@ -110,7 +110,6 @@ defineExpose({ :loading="isLoading" data-cy="FormModelPopup_isSaveAndContinue" z-max - @click="onClick(true)" /> </div> </template> From 4f17691d860432184fb4fefc5d8ece11e1d8c4fe Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 10 Mar 2025 12:07:47 +0100 Subject: [PATCH 14/55] feat: refs #8725 remove inject dependency --- src/components/FormModel.vue | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 6293d92dc..1fec1e6c9 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -1,15 +1,6 @@ <script setup> import axios from 'axios'; -import { - onMounted, - onUnmounted, - computed, - ref, - watch, - nextTick, - useAttrs, - inject, -} from 'vue'; +import { onMounted, onUnmounted, computed, ref, watch, nextTick, useAttrs } from 'vue'; import { onBeforeRouteLeave, useRouter, useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { useQuasar } from 'quasar'; @@ -22,7 +13,6 @@ import VnConfirm from './ui/VnConfirm.vue'; import { tMobile } from 'src/composables/tMobile'; import { useArrayData } from 'src/composables/useArrayData'; import { getDifferences, getUpdatedValues } from 'src/filters'; -const app = inject('app'); const { push } = useRouter(); const quasar = useQuasar(); const state = useState(); @@ -343,7 +333,7 @@ defineExpose({ ref="myForm" v-if="formData" @submit.prevent="save" - @keyup="onKeyup" + @keyup.prevent="onKeyup" @reset="reset" class="q-pa-md" :style="maxWidth ? 'max-width: ' + maxWidth : ''" From 50e3385be4187f6a76f3fd62df2a829867be3933 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 12 Mar 2025 11:34:18 +0100 Subject: [PATCH 15/55] feat: refs #8725 enable validations in formPopup --- src/components/FormModelPopup.vue | 10 ++++++++-- src/components/VnTable/VnTable.vue | 3 ++- src/pages/Entry/Card/EntryBuys.vue | 5 +++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/components/FormModelPopup.vue b/src/components/FormModelPopup.vue index f1a59263b..4e5ceb9e7 100644 --- a/src/components/FormModelPopup.vue +++ b/src/components/FormModelPopup.vue @@ -42,6 +42,7 @@ const onDataSaved = async (formData, requestResponse) => { }; const onClick = async (saveAndContinue = showSaveAndContinueBtn) => { + await formModelRef.value.myForm.validate(true); isSaveAndContinue.value = saveAndContinue; if (formModelRef.value) { await formModelRef.value.submitForm(); @@ -66,13 +67,18 @@ defineExpose({ @on-data-saved="onDataSaved" :prevent-submit="false" > - <template #form="{ data, validate }"> + <template #form="{ data, validate, validations }"> <span ref="closeButton" class="close-icon" v-close-popup> <QIcon name="close" size="sm" /> </span> <h1 class="title">{{ title }}</h1> <p>{{ subtitle }}</p> - <slot name="form-inputs" :data="data" :validate="validate" /> + <slot + name="form-inputs" + :data="data" + :validate="validate" + :validations="validations" + /> <div class="q-mt-lg row justify-end"> <QBtn :label="t('globals.cancel')" diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index c60d072fe..acd738b68 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -1027,7 +1027,7 @@ const rowCtrlClickFunction = computed(() => { :model="$attrs['data-key'] + 'Create'" @on-data-saved="(_, res) => createForm.onDataSaved(res)" > - <template #form-inputs="{ data }"> + <template #form-inputs="{ data, validations }"> <div :style="createComplement?.containerStyle"> <div :style="createComplement?.previousStyle" @@ -1041,6 +1041,7 @@ const rowCtrlClickFunction = computed(() => { :key="column.name" :name="`column-create-${column.name}`" :data="data" + :validations="validations" :column-name="column.name" :label="column.label" > diff --git a/src/pages/Entry/Card/EntryBuys.vue b/src/pages/Entry/Card/EntryBuys.vue index 684ed5f59..f87abb751 100644 --- a/src/pages/Entry/Card/EntryBuys.vue +++ b/src/pages/Entry/Card/EntryBuys.vue @@ -708,7 +708,7 @@ onMounted(() => { {{ footer?.amount }} </span> </template> - <template #column-create-itemFk="{ data }"> + <template #column-create-itemFk="{ data, validations }"> <VnSelect url="Items/search" v-model="data.itemFk" @@ -722,7 +722,8 @@ onMounted(() => { await setBuyUltimate(value, data); } " - :required="true" + required + :rules="[(val) => validations.required(true, val)]" data-cy="itemFk-create-popup" sort-by="nickname DESC" > From 9b3a98e26f95bb66fdaa351390a9ecc2be96ef4a Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 12 Mar 2025 11:34:37 +0100 Subject: [PATCH 16/55] fix: refs #8725 submit or button --- src/components/FormModelPopup.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/FormModelPopup.vue b/src/components/FormModelPopup.vue index 4e5ceb9e7..34aec96d8 100644 --- a/src/components/FormModelPopup.vue +++ b/src/components/FormModelPopup.vue @@ -97,12 +97,13 @@ defineExpose({ :flat="showSaveAndContinueBtn" :label="t('globals.save')" :title="t('globals.save')" - type="submit" + :type="!showSaveAndContinueBtn ? 'submit' : 'button'" color="primary" class="q-ml-sm" :disabled="isLoading" :loading="isLoading" data-cy="FormModelPopup_save" + @click="showSaveAndContinueBtn ? onClick(false) : null" z-max /> <QBtn @@ -110,11 +111,12 @@ defineExpose({ :label="t('globals.isSaveAndContinue')" :title="t('globals.isSaveAndContinue')" color="primary" - type="submit" + :type="showSaveAndContinueBtn ? 'submit' : 'button'" class="q-ml-sm" :disabled="isLoading" :loading="isLoading" data-cy="FormModelPopup_isSaveAndContinue" + @click="showSaveAndContinueBtn ? onClick(true) : null" z-max /> </div> From aebd9ea83cdf21b310977906a0aaa585817e034e Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 24 Mar 2025 03:24:10 +0100 Subject: [PATCH 17/55] fix: refs #7356 update validation logic and enhance Cypress tests for ticket components --- src/composables/useValidator.js | 3 +- src/pages/Item/Card/ItemDescriptorProxy.vue | 2 +- src/pages/Ticket/Card/TicketVolume.vue | 2 +- src/pages/Zone/Card/ZoneDescriptorProxy.vue | 2 +- .../ticket/ticketComponents.spec.js | 60 ++++++++++++++++++- .../integration/ticket/ticketPackage.spec.js | 14 ++++- .../integration/ticket/ticketPictures.spec.js | 13 +++- .../ticket/ticketSaleTracking.spec.js | 37 +++++++++++- .../integration/ticket/ticketService.spec.js | 18 +++++- .../integration/ticket/ticketVolume.spec.js | 19 +++++- 10 files changed, 153 insertions(+), 17 deletions(-) diff --git a/src/composables/useValidator.js b/src/composables/useValidator.js index 7a7032608..ae6c47d91 100644 --- a/src/composables/useValidator.js +++ b/src/composables/useValidator.js @@ -78,7 +78,8 @@ export function useValidator() { if (min >= 0) if (Math.floor(value) < min) return t('inputMin', { value: min }); }, - custom: (value) => validation.bindedFunction(value) || 'Invalid value', + custom: (value) => + eval(`(${validation.bindedFunction})`)(value) || 'Invalid value', }; }; diff --git a/src/pages/Item/Card/ItemDescriptorProxy.vue b/src/pages/Item/Card/ItemDescriptorProxy.vue index f686e8221..6e1f6d71f 100644 --- a/src/pages/Item/Card/ItemDescriptorProxy.vue +++ b/src/pages/Item/Card/ItemDescriptorProxy.vue @@ -22,7 +22,7 @@ const $props = defineProps({ }); </script> <template> - <QPopupProxy style="max-width: 10px"> + <QPopupProxy style="max-width: 10px" data-cy="ItemDescriptor"> <ItemDescriptor v-if="$props.id" :id="$props.id" diff --git a/src/pages/Ticket/Card/TicketVolume.vue b/src/pages/Ticket/Card/TicketVolume.vue index db78094cf..690ae9063 100644 --- a/src/pages/Ticket/Card/TicketVolume.vue +++ b/src/pages/Ticket/Card/TicketVolume.vue @@ -134,7 +134,7 @@ onMounted(() => (stateStore.rightDrawer = true)); auto-load > <template #column-itemFk="{ row }"> - <span class="link"> + <span class="link" @click.stop> {{ row.itemFk }} <ItemDescriptorProxy :id="row.itemFk" /> </span> diff --git a/src/pages/Zone/Card/ZoneDescriptorProxy.vue b/src/pages/Zone/Card/ZoneDescriptorProxy.vue index 27102ac07..a16d231e6 100644 --- a/src/pages/Zone/Card/ZoneDescriptorProxy.vue +++ b/src/pages/Zone/Card/ZoneDescriptorProxy.vue @@ -11,7 +11,7 @@ const $props = defineProps({ </script> <template> - <QPopupProxy> + <QPopupProxy data-cy="ZoneDescriptor"> <ZoneDescriptor v-if="$props.id" :id="$props.id" :summary="ZoneSummary" /> </QPopupProxy> </template> diff --git a/test/cypress/integration/ticket/ticketComponents.spec.js b/test/cypress/integration/ticket/ticketComponents.spec.js index f6107486c..f5bfd144d 100644 --- a/test/cypress/integration/ticket/ticketComponents.spec.js +++ b/test/cypress/integration/ticket/ticketComponents.spec.js @@ -1,11 +1,67 @@ /// <reference types="cypress" /> -describe('TicketRequest', () => { +describe('TicketComponents', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); - cy.visit('/#/ticket/31/request'); + cy.visit('/#/ticket/1/components'); }); it('Should load layout', () => { cy.get('.q-page').should('be.visible'); + /* ==== Generated with Cypress Studio ==== */ + cy.get('.q-scrollarea__content > :nth-child(2) > :nth-child(2)').should( + 'have.text', + 'Base to commission: €799.20', + ); + cy.get('.q-scrollarea__content > :nth-child(2) > :nth-child(3)').should( + 'have.text', + 'Total without VAT: €807.20', + ); + cy.get('.q-scrollarea__content > :nth-child(3) > :nth-child(2)').should( + 'have.text', + 'valor de compra: €425.000', + ); + cy.get('.q-scrollarea__content > :nth-child(3) > :nth-child(4)').should( + 'have.text', + 'maná auto: €7.998', + ); + cy.get('.q-scrollarea__content > :nth-child(4) > :nth-child(2)').should( + 'have.text', + 'Price: €5.00', + ); + cy.get('.q-scrollarea__content > :nth-child(4) > :nth-child(3)').should( + 'have.text', + 'Bonus: €1.00', + ); + cy.get('.q-scrollarea__content > :nth-child(4) > :nth-child(5)').should( + 'have.text', + 'Packages: 6', + ); + cy.get('.q-scrollarea__content > :nth-child(4) > :nth-child(4)').should( + 'have.text', + 'Zone: Zone pickup A ', + ); + cy.get('.q-scrollarea__content > :nth-child(5) > :nth-child(2)').should( + 'have.text', + 'Total price: €16.00', + ); + cy.get(':nth-child(4) > .link').click(); + + cy.dataCy('ZoneDescriptor').should('exist'); + cy.get(':nth-child(1) > [data-col-field="total"]').should( + 'have.text', + '€250.000€247.000€4.970', + ); + cy.get(':nth-child(1) > [data-col-field="import"]').should( + 'have.text', + '€50.000€49.400€0.994', + ); + cy.get(':nth-child(1) > [data-col-field="components"]').should( + 'have.text', + 'valor de compramargenmaná auto', + ); + cy.get(':nth-child(1) > [data-col-field="serie"]').should( + 'have.text', + 'costeempresacartera_comercial', + ); }); }); diff --git a/test/cypress/integration/ticket/ticketPackage.spec.js b/test/cypress/integration/ticket/ticketPackage.spec.js index 1f54af5b1..e7980a413 100644 --- a/test/cypress/integration/ticket/ticketPackage.spec.js +++ b/test/cypress/integration/ticket/ticketPackage.spec.js @@ -1,12 +1,22 @@ /// <reference types="cypress" /> -describe('TicketRequest', () => { +describe('TicketPackages', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); - cy.visit('/#/ticket/31/request'); + cy.visit('/#/ticket/31/package'); }); it('Should load layout', () => { cy.get('.q-page').should('be.visible'); + cy.get('.vn-row > .q-btn > .q-btn__content > .q-icon').click(); + cy.get('[data-cy="Package_select"]').click(); + cy.get('.q-menu :nth-child(1) >.q-item__section').click(); + cy.get('[data-cy="Quantity_input"]').clear(); + cy.get('[data-cy="Quantity_input"]').type('5'); + cy.get('[data-cy="crudModelDefaultSaveBtn"] > .q-btn__content').click(); + cy.checkNotification('Data saved'); + cy.get('.q-mb-md > .text-primary').click(); + cy.get('[data-cy="VnConfirm_confirm"] > .q-btn__content > .block').click(); + cy.checkNotification('Data saved'); }); }); diff --git a/test/cypress/integration/ticket/ticketPictures.spec.js b/test/cypress/integration/ticket/ticketPictures.spec.js index a2f4ad506..28ccd14d4 100644 --- a/test/cypress/integration/ticket/ticketPictures.spec.js +++ b/test/cypress/integration/ticket/ticketPictures.spec.js @@ -1,11 +1,18 @@ /// <reference types="cypress" /> describe('TicketRequest', () => { beforeEach(() => { - cy.login('developer'); - cy.viewport(1920, 1080); cy.visit('/#/ticket/31/picture'); }); it('Should load layout', () => { - cy.get('.q-page').should('be.visible'); + cy.get( + ':nth-child(1) > .q-card > .img-wrapper > .q-img > .q-img__container > .q-img__image', + ).should('be.visible'); + cy.get(':nth-child(1) > .q-card > .content').should('be.visible'); + cy.get('.content > .link').should('be.visible').click(); + cy.dataCy('ItemDescriptor').should('exist'); + cy.get('[data-cy="vnLvColor:"]').should('be.visible'); + cy.get('[data-cy="vnLvColor:"]').should('be.visible'); + cy.get('[data-cy="vnLvTallos:"]').should('be.visible'); + cy.get('.q-mt-md').should('be.visible'); }); }); diff --git a/test/cypress/integration/ticket/ticketSaleTracking.spec.js b/test/cypress/integration/ticket/ticketSaleTracking.spec.js index 30ac79e0f..5ffcf9975 100644 --- a/test/cypress/integration/ticket/ticketSaleTracking.spec.js +++ b/test/cypress/integration/ticket/ticketSaleTracking.spec.js @@ -1,12 +1,47 @@ /// <reference types="cypress" /> +function uncheckedSVG(className, state) { + cy.get(`${className} .q-checkbox__svg`).should( + state === 'checked' ? 'not.have.attr' : 'have.attr', + 'fill', + 'none', + ); +} +function checkedSVG(className, state) { + cy.get(`${className} .q-checkbox__svg> .q-checkbox__truthy`).should( + state === 'checked' ? 'not.have.attr' : 'have.attr', + 'fill', + 'none', + ); +} describe('TicketRequest', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); - cy.visit('/#/ticket/31/sale-tracking'); + cy.visit('/#/ticket/1/sale-tracking'); }); it('Should load layout', () => { cy.get('.q-page').should('be.visible'); + // Check checkbox states + uncheckedSVG('.pink', 'checked'); + uncheckedSVG('.cyan', 'checked'); + uncheckedSVG('.warning', 'checked'); + uncheckedSVG('.info', 'checked'); + checkedSVG('.yellow', 'unchecked'); + + cy.get('.q-page').click(); + cy.get( + ':nth-child(1) > :nth-child(6) > :nth-child(2) > .q-btn__content > .q-icon', + ).click(); + cy.get('.q-dialog__backdrop').click(); + cy.get( + ':nth-child(1) > :nth-child(6) > :nth-child(1) > .q-btn__content > .q-icon', + ).click(); + cy.get('.q-dialog__backdrop').click(); + cy.get( + ':nth-child(1) > :nth-child(2) > div > .link > .q-btn > .q-btn__content', + ).click(); + + cy.dataCy('ItemDescriptor').should('exist'); }); }); diff --git a/test/cypress/integration/ticket/ticketService.spec.js b/test/cypress/integration/ticket/ticketService.spec.js index 35a126fc8..bb5257272 100644 --- a/test/cypress/integration/ticket/ticketService.spec.js +++ b/test/cypress/integration/ticket/ticketService.spec.js @@ -1,12 +1,24 @@ /// <reference types="cypress" /> describe('TicketRequest', () => { beforeEach(() => { - cy.login('developer'); - cy.viewport(1920, 1080); cy.visit('/#/ticket/31/service'); }); - it('Should load layout', () => { + it('Add and remove service', () => { cy.get('.q-page').should('be.visible'); + cy.get('.q-page-sticky > div > .q-btn > .q-btn__content > .q-icon').click(); + cy.get('[data-cy="Description_icon"]').click(); + cy.get('[data-cy="Description_input"]').clear(); + cy.get('[data-cy="Description_input"]').type('test'); + cy.get('[data-cy="FormModelPopup_save"] > .q-btn__content > .block').click(); + cy.selectOption('[data-cy="Description_select"]', 'test'); + + cy.get('[data-cy="Quantity_input"]').clear('1'); + cy.get('[data-cy="Quantity_input"]').type('1'); + cy.get('[data-cy="Price_input"]').clear('2'); + cy.get('[data-cy="Price_input"]').type('2'); + cy.get('[data-cy="crudModelDefaultSaveBtn"] > .q-btn__content > .block').click(); + cy.checkNotification('Data saved'); + cy.get(':nth-child(5) > .q-icon').click(); }); }); diff --git a/test/cypress/integration/ticket/ticketVolume.spec.js b/test/cypress/integration/ticket/ticketVolume.spec.js index 7b3d890b8..2a1b254ce 100644 --- a/test/cypress/integration/ticket/ticketVolume.spec.js +++ b/test/cypress/integration/ticket/ticketVolume.spec.js @@ -1,12 +1,27 @@ /// <reference types="cypress" /> +function checkRightLabel(index, value, tag = 'Volume: ') { + cy.get(`.q-scrollarea__content > :nth-child(${index}) > :nth-child(2) > span`) + .should('be.visible') + .should('have.text', `${tag}${value}`); +} describe('TicketRequest', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); - cy.visit('/#/ticket/31/volume'); + cy.visit('/#/ticket/1/volume'); }); - it('Should load layout', () => { + it('Check right panel info', () => { cy.get('.q-page').should('be.visible'); + checkRightLabel(2, '0.028'); + checkRightLabel(3, '0.014'); + checkRightLabel(4, '1.526'); + }); + it('Descriptors', () => { + cy.get(':nth-child(1) > [data-col-field="itemFk"]') + .find('span') + .should('have.class', 'link') + .click(); + cy.dataCy('ItemDescriptor').should('exist'); }); }); From 73740822a35c72d579eb62f9170211500a483290 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 24 Mar 2025 13:18:41 +0100 Subject: [PATCH 18/55] test: refs #7356 update ticket tracking components and remove unused TicketCreateTracking.vue --- src/pages/Claim/Card/ClaimSummaryAction.vue | 4 +- .../Ticket/Card/TicketCreateTracking.vue | 59 -------- src/pages/Ticket/Card/TicketTracking.vue | 135 +++++++++--------- .../Worker/Card/WorkerDescriptorProxy.vue | 2 +- .../integration/ticket/ticketTracking.spec.js | 19 ++- .../vnComponent/vnSelect.commands.js | 3 + .../vnComponent/vnTable.commands.js | 3 + test/cypress/support/commands.js | 5 + 8 files changed, 96 insertions(+), 134 deletions(-) delete mode 100644 src/pages/Ticket/Card/TicketCreateTracking.vue create mode 100644 test/cypress/integration/vnComponent/vnSelect.commands.js create mode 100644 test/cypress/integration/vnComponent/vnTable.commands.js diff --git a/src/pages/Claim/Card/ClaimSummaryAction.vue b/src/pages/Claim/Card/ClaimSummaryAction.vue index 577ac2a65..be3b9e896 100644 --- a/src/pages/Claim/Card/ClaimSummaryAction.vue +++ b/src/pages/Claim/Card/ClaimSummaryAction.vue @@ -88,13 +88,13 @@ const columns = [ auto-load > <template #column-itemFk="{ row }"> - <span class="link"> + <span class="link" @click.stop> {{ row.itemFk }} <ItemDescriptorProxy :id="row.itemFk" /> </span> </template> <template #column-ticketFk="{ row }"> - <span class="link"> + <span class="link" @click.stop> {{ row.ticketFk }} <TicketDescriptorProxy :id="row.ticketFk" /> </span> diff --git a/src/pages/Ticket/Card/TicketCreateTracking.vue b/src/pages/Ticket/Card/TicketCreateTracking.vue deleted file mode 100644 index 5c1e916f2..000000000 --- a/src/pages/Ticket/Card/TicketCreateTracking.vue +++ /dev/null @@ -1,59 +0,0 @@ -<script setup> -import { ref } from 'vue'; -import { useRoute } from 'vue-router'; -import { useI18n } from 'vue-i18n'; - -import FormModelPopup from 'components/FormModelPopup.vue'; -import VnRow from 'components/ui/VnRow.vue'; -import VnSelect from 'src/components/common/VnSelect.vue'; -import FetchData from 'components/FetchData.vue'; - -import { useState } from 'src/composables/useState'; -import VnSelectWorker from 'src/components/common/VnSelectWorker.vue'; - -const emit = defineEmits(['onRequestCreated']); - -const route = useRoute(); -const { t } = useI18n(); -const state = useState(); -const user = state.getUser(); -const stateFetchDataRef = ref(null); -const statesOptions = ref([]); - -const onStateFkChange = (formData) => (formData.userFk = user.value.id); -</script> -<template> - <FetchData - ref="stateFetchDataRef" - url="States" - auto-load - @on-fetch="(data) => (statesOptions = data)" - /> - <FormModelPopup - :title="t('Create tracking')" - url-create="Tickets/state" - model="CreateTicketTracking" - :form-initial-data="{ ticketFk: route.params.id }" - @on-data-saved="() => emit('onRequestCreated')" - > - <template #form-inputs="{ data }"> - <VnRow> - <VnSelect - v-model="data.stateFk" - :label="t('ticketList.state')" - :options="statesOptions" - @update:model-value="onStateFkChange(data)" - hide-selected - option-label="name" - option-value="id" - /> - <VnSelectWorker v-model="data.userFk" :fields="['id', 'name']" /> - </VnRow> - </template> - </FormModelPopup> -</template> - -<i18n> - es: - Create tracking: Crear estado -</i18n> diff --git a/src/pages/Ticket/Card/TicketTracking.vue b/src/pages/Ticket/Card/TicketTracking.vue index 00610de44..4cfc49290 100644 --- a/src/pages/Ticket/Card/TicketTracking.vue +++ b/src/pages/Ticket/Card/TicketTracking.vue @@ -1,27 +1,31 @@ <script setup> -import { ref, computed, watch, reactive } from 'vue'; +import { ref, reactive } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRoute } from 'vue-router'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; -import TicketCreateTracking from './TicketCreateTracking.vue'; -import VnPaginate from 'components/ui/VnPaginate.vue'; +import VnSelect from 'src/components/common/VnSelect.vue'; +import VnSelectWorker from 'src/components/common/VnSelectWorker.vue'; +import { useState } from 'src/composables/useState'; import { toDateTimeFormat } from 'src/filters/date.js'; +import VnTable from 'src/components/VnTable/VnTable.vue'; +const state = useState(); + +const user = state.getUser(); const route = useRoute(); const { t } = useI18n(); -const createTrackingDialogRef = ref(null); -const paginateRef = ref(null); - -watch( - () => route.params.id, - async (val) => { - paginateFilter.where.ticketFk = val; - paginateRef.value.fetch(); - }, -); +const tableRef = ref(null); +// watch( +// () => route.params.id, +// async (val) => { +// paginateFilter.where.ticketFk = val; +// paginateRef.value.fetch(); +// }, +// ); +const onStateFkChange = (formData) => (formData.userFk = user.value.id); const paginateFilter = reactive({ include: [ { @@ -50,81 +54,74 @@ const paginateFilter = reactive({ }, }); -const columns = computed(() => [ +const columns = [ { label: t('ticketList.state'), name: 'state', field: 'state', align: 'left', - format: (val) => val.name, + format: (row) => row.state?.name, }, { label: t('expedition.worker'), name: 'worker', align: 'left', + field: 'user', }, { label: t('expedition.created'), name: 'created', field: 'created', align: 'left', - format: (val) => toDateTimeFormat(val), + format: (row) => toDateTimeFormat(row.created), }, -]); - -const openCreateModal = () => createTrackingDialogRef.value.show(); +]; </script> <template> - <QPage class="column items-center q-pa-md"> - <VnPaginate - ref="paginateRef" - data-key="TicketTracking" - :user-filter="paginateFilter" - search-url="table" - url="TicketTrackings" - auto-load - order="created DESC" - :limit="0" - > - <template #body="{ rows }"> - <QTable - :rows="rows" - :columns="columns" - row-key="id" - :pagination="{ rowsPerPage: 0 }" - class="full-width q-mt-md" - :no-data-label="t('globals.noResults')" - > - <template #body-cell-worker="{ row }"> - <QTd> - <QBtn flat class="link" @click.stop> - {{ row.user?.name }} - <WorkerDescriptorProxy :id="row.user?.worker?.id" /> - </QBtn> - </QTd> - </template> - </QTable> - </template> - </VnPaginate> - <QDialog - ref="createTrackingDialogRef" - transition-show="scale" - transition-hide="scale" - > - <TicketCreateTracking @on-request-created="paginateRef.fetch()" /> - </QDialog> - <QPageSticky :offset="[20, 20]"> - <QBtn - @click="openCreateModal()" - color="primary" - fab - icon="add" - v-shortcut="'+'" + <VnTable + ref="tableRef" + :right-search="false" + :column-search="false" + :disable-option="{ card: true, table: true }" + :search-url="false" + :columns="columns" + data-key="TicketTracking" + :user-filter="paginateFilter" + url="TicketTrackings" + auto-load + order="created DESC" + :limit="0" + :without-header="true" + :create="{ + urlCreate: 'Tickets/state', + title: t('Create tracking'), + onDataSaved: () => tableRef.reload(), + formInitialData: { + ticketFk: route.params.id, + }, + }" + > + <template #more-create-dialog="{ data }"> + <VnSelect + url="States" + v-model="data.stateFk" + :label="t('ticketList.state')" + auto-load + @update:model-value="onStateFkChange(data)" + hide-selected /> - <QTooltip class="text-no-wrap"> - {{ t('tracking.addState') }} - </QTooltip> - </QPageSticky> - </QPage> + <VnSelectWorker v-model="data.userFk" :fields="['id', 'name']" /> + </template> + <template #column-worker="{ row }"> + <span class="link" @click.stop> + {{ row.user.name }} + <WorkerDescriptorProxy :id="row.user?.worker?.id" /> + </span> + </template> + </VnTable> </template> +<i18n> + es: + Create tracking: Crear estado +</i18n> diff --git a/src/pages/Worker/Card/WorkerDescriptorProxy.vue b/src/pages/Worker/Card/WorkerDescriptorProxy.vue index 5f71abbea..baa9aa571 100644 --- a/src/pages/Worker/Card/WorkerDescriptorProxy.vue +++ b/src/pages/Worker/Card/WorkerDescriptorProxy.vue @@ -11,7 +11,7 @@ const $props = defineProps({ </script> <template> - <QPopupProxy> + <QPopupProxy data-cy="WorkerDescriptor"> <WorkerDescriptor v-if="$props.id" :id="$props.id" diff --git a/test/cypress/integration/ticket/ticketTracking.spec.js b/test/cypress/integration/ticket/ticketTracking.spec.js index 1f54af5b1..53bf6704e 100644 --- a/test/cypress/integration/ticket/ticketTracking.spec.js +++ b/test/cypress/integration/ticket/ticketTracking.spec.js @@ -1,12 +1,25 @@ /// <reference types="cypress" /> -describe('TicketRequest', () => { +describe('Ticket tracking', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); - cy.visit('/#/ticket/31/request'); + cy.visit('/#/ticket/31/tracking'); }); - it('Should load layout', () => { + it('Add new tracking', () => { cy.get('.q-page').should('be.visible'); + + cy.firstRow('worker').find('span').should('have.class', 'link').click(); + cy.dataCy('WorkerDescriptor').should('exist'); + cy.get('[data-cy="vnTableCreateBtn"] > .q-btn__content > .q-icon').click(); + cy.selectOption('.q-field--float [data-cy="State_select"]', 'OK').click(); + cy.get('[data-cy="FormModelPopup_save"] > .q-btn__content > .block').click(); + cy.get( + ':last-child > [data-col-field="state"] > [data-cy="vnTableCell_state"]', + ).should('have.text', 'OK'); + cy.get(':last-child > [data-col-field="worker"]').should( + 'have.text', + 'developer ', + ); }); }); diff --git a/test/cypress/integration/vnComponent/vnSelect.commands.js b/test/cypress/integration/vnComponent/vnSelect.commands.js new file mode 100644 index 000000000..017b6e7ea --- /dev/null +++ b/test/cypress/integration/vnComponent/vnSelect.commands.js @@ -0,0 +1,3 @@ +Cypress.Commands.add('clickOption', (index = 1) => + cy.get(`.q-menu :nth-child(${index}) >.q-item__section`).click(), +); diff --git a/test/cypress/integration/vnComponent/vnTable.commands.js b/test/cypress/integration/vnComponent/vnTable.commands.js new file mode 100644 index 000000000..15cbf6f9a --- /dev/null +++ b/test/cypress/integration/vnComponent/vnTable.commands.js @@ -0,0 +1,3 @@ +Cypress.Commands.add('firstRow', (field, index = 1) => + cy.get(`:nth-child(${index}) > [data-col-field="${field}"]`), +); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index 7f5203547..7ed6ef238 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -29,7 +29,12 @@ // import { registerCommands } from '@quasar/quasar-app-extension-testing-e2e-cypress'; import moment from 'moment'; import waitUntil from './waitUntil'; +// Importar dinámicamente todos los archivos con el sufijo .commands.js dentro de la carpeta src/test/cypress/integration +const requireCommands = require.context('../integration', true, /\.commands\.js$/); +// Iterar sobre cada archivo y requerirlo +requireCommands.keys().forEach(requireCommands); +// Common comma Cypress.Commands.add('waitUntil', { prevSubject: 'optional' }, waitUntil); Cypress.Commands.add('resetDB', () => { From 2190a0c17dc7d5b6ba65deaf3b20cb548e8d9ef1 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 24 Mar 2025 14:41:44 +0100 Subject: [PATCH 19/55] test: refs #7356 removing unused mapper functions and updating default mapper logic --- src/components/FormModel.vue | 20 ++++----- src/pages/Customer/Card/CustomerBasicData.vue | 7 +--- .../Customer/Card/CustomerFiscalData.vue | 7 ---- .../components/CustomerNewPayment.vue | 12 ------ .../Ticket/Card/BasicData/TicketBasicData.vue | 10 ++--- .../Card/BasicData/TicketBasicDataView.vue | 8 ++-- .../ticket/ticketBasicData.spec.js | 42 ++++++++++++++++++- .../integration/ticket/ticketSms.spec.js | 12 +++++- 8 files changed, 72 insertions(+), 46 deletions(-) diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index c4d9a4149..663764ee6 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -69,7 +69,12 @@ const $props = defineProps({ }, mapper: { type: Function, - default: null, + default: (formData, originalData) => { + return getUpdatedValues( + Object.keys(getDifferences(formData, originalData)), + formData, + ); + }, }, clearStoreOnUnmount: { type: Boolean, @@ -221,9 +226,7 @@ async function save() { isLoading.value = true; try { formData.value = trimData(formData.value); - const body = $props.mapper - ? $props.mapper(formData.value, originalData.value) - : formData.value; + const body = $props.mapper(formData.value, originalData.value); const method = $props.urlCreate ? 'post' : 'patch'; const url = $props.urlCreate || $props.urlUpdate || $props.url || arrayData.store.url; @@ -289,12 +292,7 @@ function trimData(data) { } return data; } -function onBeforeSave(formData, originalData) { - return getUpdatedValues( - Object.keys(getDifferences(formData, originalData)), - formData, - ); -} + async function onKeyup(evt) { if (evt.key === 'Enter' && !('prevent-submit' in attrs)) { const input = evt.target; @@ -331,7 +329,7 @@ defineExpose({ class="q-pa-md" :style="maxWidth ? 'max-width: ' + maxWidth : ''" id="formModel" - :mapper="onBeforeSave" + :mapper="mapper" > <QCard> <slot diff --git a/src/pages/Customer/Card/CustomerBasicData.vue b/src/pages/Customer/Card/CustomerBasicData.vue index 9c9d1b50b..6d9110ed4 100644 --- a/src/pages/Customer/Card/CustomerBasicData.vue +++ b/src/pages/Customer/Card/CustomerBasicData.vue @@ -52,12 +52,7 @@ function onBeforeSave(formData, originalData) { @on-fetch="(data) => (businessTypes = data)" auto-load /> - <FormModel - :url-update="`Clients/${route.params.id}`" - auto-load - :mapper="onBeforeSave" - model="Customer" - > + <FormModel :url-update="`Clients/${route.params.id}`" auto-load model="Customer"> <template #form="{ data, validate }"> <VnRow> <VnInput diff --git a/src/pages/Customer/Card/CustomerFiscalData.vue b/src/pages/Customer/Card/CustomerFiscalData.vue index 93909eb9c..518bf1242 100644 --- a/src/pages/Customer/Card/CustomerFiscalData.vue +++ b/src/pages/Customer/Card/CustomerFiscalData.vue @@ -31,12 +31,6 @@ function handleLocation(data, location) { data.provinceFk = provinceFk; data.countryFk = countryFk; } -function onBeforeSave(formData, originalData) { - return getUpdatedValues( - Object.keys(getDifferences(formData, originalData)), - formData, - ); -} async function checkEtChanges(data, _, originalData) { const equalizatedHasChanged = originalData.isEqualizated != data.isEqualizated; @@ -75,7 +69,6 @@ async function acceptPropagate({ isEqualizated }) { :url-update="`Clients/${route.params.id}/updateFiscalData`" auto-load model="Customer" - :mapper="onBeforeSave" observe-form-changes @on-data-saved="checkEtChanges" > diff --git a/src/pages/Customer/components/CustomerNewPayment.vue b/src/pages/Customer/components/CustomerNewPayment.vue index ac80fdaa4..5b351d598 100644 --- a/src/pages/Customer/components/CustomerNewPayment.vue +++ b/src/pages/Customer/components/CustomerNewPayment.vue @@ -103,17 +103,6 @@ const calculateFromDeliveredAmount = (event) => { initialData.amountToReturn = parseFloat(event) - initialData.amountPaid; }; -function onBeforeSave(data) { - const exceededAmount = data.amountPaid > maxAmount.value; - if (isCash.value && exceededAmount) - return notify(t('Amount exceeded', { maxAmount: maxAmount.value }), 'negative'); - - if (isCash.value && shouldSendEmail.value && !data.email) - return notify(t('There is no assigned email for this client'), 'negative'); - - return data; -} - async function onDataSaved(formData, { id }) { try { if (shouldSendEmail.value && isCash.value) @@ -182,7 +171,6 @@ async function getAmountPaid() { ref="formModelRef" :form-initial-data="initialData" :url-create="urlCreate" - :mapper="onBeforeSave" @on-data-saved="onDataSaved" :prevent-submit="true" > diff --git a/src/pages/Ticket/Card/BasicData/TicketBasicData.vue b/src/pages/Ticket/Card/BasicData/TicketBasicData.vue index 055c9a0ff..83c621b20 100644 --- a/src/pages/Ticket/Card/BasicData/TicketBasicData.vue +++ b/src/pages/Ticket/Card/BasicData/TicketBasicData.vue @@ -91,7 +91,7 @@ const totalPrice = computed(() => { const totalNewPrice = computed(() => { return rows.value.reduce( (acc, item) => acc + item.component.newPrice * item.quantity, - 0 + 0, ); }); @@ -210,18 +210,18 @@ onMounted(async () => { flat > <template #body-cell-item="{ row }"> - <QTd @click.stop class="link"> - <QBtn flat> + <QTd align="center"> + <span @click.stop class="link"> {{ row.itemFk }} <ItemDescriptorProxy :id="row.itemFk" /> - </QBtn> + </span> </QTd> </template> <template #body-cell-description="{ row }"> <QTd style="min-width: 120px; max-width: 120px"> <div class="column q-pb-xs" style="min-width: 120px"> <span>{{ row.item.name }}</span> - <FetchedTags :item="row.item" class="full-width" /> + <FetchedTags :item="row.item" class="full-width" :columns="6" /> </div> </QTd> </template> diff --git a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue index 3c2fe95e5..23c73a0cf 100644 --- a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue +++ b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue @@ -1,7 +1,7 @@ <script setup> import { ref, computed } from 'vue'; import { useI18n } from 'vue-i18n'; -import { useRouter } from 'vue-router'; +import { useRouter, useRoute } from 'vue-router'; import TicketBasicData from './TicketBasicData.vue'; import TicketBasicDataForm from './TicketBasicDataForm.vue'; @@ -13,6 +13,7 @@ import { useArrayData } from 'src/composables/useArrayData'; const { notify } = useNotify(); const router = useRouter(); +const route = useRoute(); const { t } = useI18n(); const stepperRef = ref(null); const { openConfirmationModal } = useVnConfirm(); @@ -21,6 +22,7 @@ const step = ref(1); const haveNegatives = ref(true); const ticket = computed(() => useArrayData('Ticket').store?.data); +const entityId = computed(() => +route?.params?.id); const isFormInvalid = () => { return ( @@ -44,7 +46,7 @@ const getPriceDifference = async () => { shipped: ticket.value.shipped, }; const { data } = await axios.post( - `tickets/${formData.value.id}/priceDifference`, + `tickets/${entityId.value}/priceDifference`, params, ); ticket.value.sale = data; @@ -71,7 +73,7 @@ const submit = async () => { }; const { data } = await axios.post( - `tickets/${formData.value.id}/componentUpdate`, + `tickets/${entityId.value}/componentUpdate`, params, ); diff --git a/test/cypress/integration/ticket/ticketBasicData.spec.js b/test/cypress/integration/ticket/ticketBasicData.spec.js index ac57e47e6..c5a8b0464 100644 --- a/test/cypress/integration/ticket/ticketBasicData.spec.js +++ b/test/cypress/integration/ticket/ticketBasicData.spec.js @@ -6,7 +6,47 @@ describe('TicketRequest', () => { cy.visit('/#/ticket/31/basic-data'); }); - it('Should load layout', () => { + it('Should redirect to customer basic data', () => { cy.get('.q-page').should('be.visible'); + cy.get(':nth-child(2) > div > .text-primary').click(); + cy.get('[data-cy="Address_select"]').click(); + cy.get('.q-btn-group > [data-v-d4506789=""] > .q-btn__content > .q-icon').click(); + cy.get( + '[data-cy="CustomerBasicData-menu-item"] > .q-item__section--main', + ).click(); + cy.url().should('include', '/customer/1104/basic-data'); + }); + it.only('stepper', () => { + cy.get('.q-stepper__tab--active').should('have.class', 'q-stepper__tab--active'); + + cy.get('.q-stepper__nav > .q-btn--standard').click(); + cy.get('.q-stepper__tab--done').should('have.class', 'q-stepper__tab--done'); + cy.get('.q-stepper__tab--active').should('have.class', 'q-stepper__tab--active'); + cy.get('tr:nth-child(1)>:nth-child(1)>span').should('have.class', 'link').click(); + cy.dataCy('ItemDescriptor').should('exist'); + cy.get('.q-drawer__content > :nth-child(1) > :nth-child(2) > span').should( + 'have.text', + 'Price: €34.40', + ); + cy.get('.q-drawer__content > :nth-child(1) > :nth-child(3) > span').should( + 'have.text', + 'New price: €34.20', + ); + cy.get('.q-drawer__content > :nth-child(1) > :nth-child(4) > span').should( + 'have.text', + 'Difference: €0.20', + ); + cy.get( + ':nth-child(3) > .q-radio > .q-radio__inner > .q-radio__bg > .q-radio__check', + ).should('have.class', 'q-radio__check'); + cy.get( + '.q-stepper__step-inner > .q-drawer-container > .q-drawer > .q-drawer__content', + ).click(); + cy.get(':nth-child(2) > :nth-child(1) > .text-weight-bold').click(); + cy.get(':nth-child(3) > .q-radio > .q-radio__inner').should( + 'have.class', + 'q-radio__inner--truthy', + ); + cy.get('.q-drawer__content > :nth-child(2)').click(); }); }); diff --git a/test/cypress/integration/ticket/ticketSms.spec.js b/test/cypress/integration/ticket/ticketSms.spec.js index 69a48b341..0978898d9 100644 --- a/test/cypress/integration/ticket/ticketSms.spec.js +++ b/test/cypress/integration/ticket/ticketSms.spec.js @@ -3,10 +3,20 @@ describe('TicketRequest', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); - cy.visit('/#/ticket/31/sms'); + cy.visit('/#/ticket/32/sms'); }); it('Should load layout', () => { cy.get('.q-page').should('be.visible'); + cy.get('.q-infinite-scroll > :nth-child(1)').should( + 'have.text', + '0004 444444444Lorem ipsum dolor sit amet, consectetur adipiscing elit.2001-01-01 00:00:00OK', + ); + cy.get( + ':nth-child(1) > .q-item > .q-item__section--top > .column > .q-avatar > .q-avatar__content > .q-img > .q-img__container > .q-img__image', + ).should('have.class', 'q-img__image--loaded'); + cy.get( + ':nth-child(1) > .q-item > .q-item__section--side.justify-center > .center > .q-chip > .q-chip__content', + ).should('have.class', 'q-chip__content'); }); }); From 1be8e65fa11615db95aa9915574c2e84cf55f005 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 24 Mar 2025 15:02:18 +0100 Subject: [PATCH 20/55] revert: refs #7356 update default mapper logic to handle null values and refactor onBeforeSave function --- src/components/FormModel.vue | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 663764ee6..c4d9a4149 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -69,12 +69,7 @@ const $props = defineProps({ }, mapper: { type: Function, - default: (formData, originalData) => { - return getUpdatedValues( - Object.keys(getDifferences(formData, originalData)), - formData, - ); - }, + default: null, }, clearStoreOnUnmount: { type: Boolean, @@ -226,7 +221,9 @@ async function save() { isLoading.value = true; try { formData.value = trimData(formData.value); - const body = $props.mapper(formData.value, originalData.value); + const body = $props.mapper + ? $props.mapper(formData.value, originalData.value) + : formData.value; const method = $props.urlCreate ? 'post' : 'patch'; const url = $props.urlCreate || $props.urlUpdate || $props.url || arrayData.store.url; @@ -292,7 +289,12 @@ function trimData(data) { } return data; } - +function onBeforeSave(formData, originalData) { + return getUpdatedValues( + Object.keys(getDifferences(formData, originalData)), + formData, + ); +} async function onKeyup(evt) { if (evt.key === 'Enter' && !('prevent-submit' in attrs)) { const input = evt.target; @@ -329,7 +331,7 @@ defineExpose({ class="q-pa-md" :style="maxWidth ? 'max-width: ' + maxWidth : ''" id="formModel" - :mapper="mapper" + :mapper="onBeforeSave" > <QCard> <slot From fbe3eae670d2692e9c3c1de28b18de4a62ecb848 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 25 Mar 2025 09:39:30 +0100 Subject: [PATCH 21/55] test: refs #7356 fix ticket*.spec.js --- .../cypress/integration/ticket/ticketBasicData.spec.js | 2 +- test/cypress/integration/ticket/ticketPictures.spec.js | 10 ++++++---- .../integration/ticket/ticketSaleTracking.spec.js | 2 +- test/cypress/integration/ticket/ticketService.spec.js | 6 ++++-- test/cypress/integration/ticket/ticketSms.spec.js | 4 ++-- test/cypress/integration/ticket/ticketVolume.spec.js | 2 +- 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/test/cypress/integration/ticket/ticketBasicData.spec.js b/test/cypress/integration/ticket/ticketBasicData.spec.js index c5a8b0464..b029e0229 100644 --- a/test/cypress/integration/ticket/ticketBasicData.spec.js +++ b/test/cypress/integration/ticket/ticketBasicData.spec.js @@ -1,5 +1,5 @@ /// <reference types="cypress" /> -describe('TicketRequest', () => { +describe('TicketBasicData', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); diff --git a/test/cypress/integration/ticket/ticketPictures.spec.js b/test/cypress/integration/ticket/ticketPictures.spec.js index 28ccd14d4..26edbc3ac 100644 --- a/test/cypress/integration/ticket/ticketPictures.spec.js +++ b/test/cypress/integration/ticket/ticketPictures.spec.js @@ -1,12 +1,11 @@ /// <reference types="cypress" /> -describe('TicketRequest', () => { +describe('TicketPictures', () => { beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); cy.visit('/#/ticket/31/picture'); }); it('Should load layout', () => { - cy.get( - ':nth-child(1) > .q-card > .img-wrapper > .q-img > .q-img__container > .q-img__image', - ).should('be.visible'); cy.get(':nth-child(1) > .q-card > .content').should('be.visible'); cy.get('.content > .link').should('be.visible').click(); cy.dataCy('ItemDescriptor').should('exist'); @@ -14,5 +13,8 @@ describe('TicketRequest', () => { cy.get('[data-cy="vnLvColor:"]').should('be.visible'); cy.get('[data-cy="vnLvTallos:"]').should('be.visible'); cy.get('.q-mt-md').should('be.visible'); + cy.get( + ':nth-child(1) > .q-card > .img-wrapper > .q-img > .q-img__container > .q-img__image', + ).should('be.visible'); }); }); diff --git a/test/cypress/integration/ticket/ticketSaleTracking.spec.js b/test/cypress/integration/ticket/ticketSaleTracking.spec.js index 5ffcf9975..78f17f771 100644 --- a/test/cypress/integration/ticket/ticketSaleTracking.spec.js +++ b/test/cypress/integration/ticket/ticketSaleTracking.spec.js @@ -13,7 +13,7 @@ function checkedSVG(className, state) { 'none', ); } -describe('TicketRequest', () => { +describe('TicketSaleTracking', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); diff --git a/test/cypress/integration/ticket/ticketService.spec.js b/test/cypress/integration/ticket/ticketService.spec.js index bb5257272..4ffc7f731 100644 --- a/test/cypress/integration/ticket/ticketService.spec.js +++ b/test/cypress/integration/ticket/ticketService.spec.js @@ -1,12 +1,14 @@ /// <reference types="cypress" /> -describe('TicketRequest', () => { +describe('TicketService', () => { beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); cy.visit('/#/ticket/31/service'); }); it('Add and remove service', () => { cy.get('.q-page').should('be.visible'); - cy.get('.q-page-sticky > div > .q-btn > .q-btn__content > .q-icon').click(); + cy.addBtnClick(); cy.get('[data-cy="Description_icon"]').click(); cy.get('[data-cy="Description_input"]').clear(); cy.get('[data-cy="Description_input"]').type('test'); diff --git a/test/cypress/integration/ticket/ticketSms.spec.js b/test/cypress/integration/ticket/ticketSms.spec.js index 0978898d9..75b30858b 100644 --- a/test/cypress/integration/ticket/ticketSms.spec.js +++ b/test/cypress/integration/ticket/ticketSms.spec.js @@ -1,5 +1,5 @@ /// <reference types="cypress" /> -describe('TicketRequest', () => { +describe('TicketSms', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); @@ -9,7 +9,7 @@ describe('TicketRequest', () => { it('Should load layout', () => { cy.get('.q-page').should('be.visible'); cy.get('.q-infinite-scroll > :nth-child(1)').should( - 'have.text', + 'contain.text', '0004 444444444Lorem ipsum dolor sit amet, consectetur adipiscing elit.2001-01-01 00:00:00OK', ); cy.get( diff --git a/test/cypress/integration/ticket/ticketVolume.spec.js b/test/cypress/integration/ticket/ticketVolume.spec.js index 2a1b254ce..59ff6dcb2 100644 --- a/test/cypress/integration/ticket/ticketVolume.spec.js +++ b/test/cypress/integration/ticket/ticketVolume.spec.js @@ -4,7 +4,7 @@ function checkRightLabel(index, value, tag = 'Volume: ') { .should('be.visible') .should('have.text', `${tag}${value}`); } -describe('TicketRequest', () => { +describe('TicketVolume', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); From 5a642f4c3a0c62a3f94e56c260a74d1debc261f9 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 25 Mar 2025 19:46:56 +0100 Subject: [PATCH 22/55] fix: refs #7356 update reference value in routeAutonomous test --- test/cypress/integration/route/routeAutonomous.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/integration/route/routeAutonomous.spec.js b/test/cypress/integration/route/routeAutonomous.spec.js index acf82bd95..a070a04d3 100644 --- a/test/cypress/integration/route/routeAutonomous.spec.js +++ b/test/cypress/integration/route/routeAutonomous.spec.js @@ -22,7 +22,7 @@ describe('RouteAutonomous', () => { }; const data = { - reference: 'Test invoice', + reference: '1234', total: '€206.40', supplier: 'PLANTS SL', route: 'first route', From e7a501f5289e9b1d429e0501a677cc2c8b1ac70d Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 25 Mar 2025 22:27:45 +0100 Subject: [PATCH 23/55] test: refs #7356 remove child class --- test/cypress/integration/ticket/ticketPictures.spec.js | 4 +--- test/cypress/integration/ticket/ticketSms.spec.js | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/test/cypress/integration/ticket/ticketPictures.spec.js b/test/cypress/integration/ticket/ticketPictures.spec.js index 26edbc3ac..d8f48df32 100644 --- a/test/cypress/integration/ticket/ticketPictures.spec.js +++ b/test/cypress/integration/ticket/ticketPictures.spec.js @@ -13,8 +13,6 @@ describe('TicketPictures', () => { cy.get('[data-cy="vnLvColor:"]').should('be.visible'); cy.get('[data-cy="vnLvTallos:"]').should('be.visible'); cy.get('.q-mt-md').should('be.visible'); - cy.get( - ':nth-child(1) > .q-card > .img-wrapper > .q-img > .q-img__container > .q-img__image', - ).should('be.visible'); + cy.get(':nth-child(1) > .q-card > .img-wrapper').should('be.visible'); }); }); diff --git a/test/cypress/integration/ticket/ticketSms.spec.js b/test/cypress/integration/ticket/ticketSms.spec.js index 75b30858b..feafb2157 100644 --- a/test/cypress/integration/ticket/ticketSms.spec.js +++ b/test/cypress/integration/ticket/ticketSms.spec.js @@ -13,8 +13,8 @@ describe('TicketSms', () => { '0004 444444444Lorem ipsum dolor sit amet, consectetur adipiscing elit.2001-01-01 00:00:00OK', ); cy.get( - ':nth-child(1) > .q-item > .q-item__section--top > .column > .q-avatar > .q-avatar__content > .q-img > .q-img__container > .q-img__image', - ).should('have.class', 'q-img__image--loaded'); + ':nth-child(1) > .q-item > .q-item__section--top > .column > .q-avatar', + ).should('be.visible'); cy.get( ':nth-child(1) > .q-item > .q-item__section--side.justify-center > .center > .q-chip > .q-chip__content', ).should('have.class', 'q-chip__content'); From 59c08be80420e2c1cf849752a40f6b80e385d27e Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 26 Mar 2025 21:27:48 +0100 Subject: [PATCH 24/55] test: refs #7356 add waitRequest --- test/cypress/integration/ticket/ticketList.spec.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/cypress/integration/ticket/ticketList.spec.js b/test/cypress/integration/ticket/ticketList.spec.js index 5613a5854..44e5fe5a1 100644 --- a/test/cypress/integration/ticket/ticketList.spec.js +++ b/test/cypress/integration/ticket/ticketList.spec.js @@ -43,8 +43,9 @@ describe('TicketList', () => { cy.dataCy('Customer ID_input').clear('1'); cy.dataCy('Customer ID_input').type('1101{enter}'); + cy.intercept('GET', /\/api\/Clients\?filter/).as('clientFilter'); cy.get('[data-cy="vnTableCreateBtn"] > .q-btn__content > .q-icon').click(); - cy.waitSpinner(); + cy.wait('@clientFilter'); cy.dataCy('Customer_select').should('have.value', 'Bruce Wayne'); cy.dataCy('Address_select').click(); From 9492c71128b8ef27e43d55955ee48ef1679cd2d2 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Thu, 27 Mar 2025 23:29:11 +0100 Subject: [PATCH 25/55] fix: refs #7356 remove bad code --- src/pages/Customer/Card/CustomerBasicData.vue | 7 ++++++- src/pages/Customer/Card/CustomerFiscalData.vue | 7 +++++++ .../Customer/components/CustomerNewPayment.vue | 12 ++++++++++++ .../Card/BasicData/TicketBasicDataView.vue | 4 +--- src/pages/Ticket/Card/TicketTracking.vue | 16 ++++------------ src/pages/Zone/ZoneList.vue | 1 - .../integration/route/routeAutonomous.spec.js | 2 +- 7 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/pages/Customer/Card/CustomerBasicData.vue b/src/pages/Customer/Card/CustomerBasicData.vue index 6d9110ed4..9c9d1b50b 100644 --- a/src/pages/Customer/Card/CustomerBasicData.vue +++ b/src/pages/Customer/Card/CustomerBasicData.vue @@ -52,7 +52,12 @@ function onBeforeSave(formData, originalData) { @on-fetch="(data) => (businessTypes = data)" auto-load /> - <FormModel :url-update="`Clients/${route.params.id}`" auto-load model="Customer"> + <FormModel + :url-update="`Clients/${route.params.id}`" + auto-load + :mapper="onBeforeSave" + model="Customer" + > <template #form="{ data, validate }"> <VnRow> <VnInput diff --git a/src/pages/Customer/Card/CustomerFiscalData.vue b/src/pages/Customer/Card/CustomerFiscalData.vue index 518bf1242..93909eb9c 100644 --- a/src/pages/Customer/Card/CustomerFiscalData.vue +++ b/src/pages/Customer/Card/CustomerFiscalData.vue @@ -31,6 +31,12 @@ function handleLocation(data, location) { data.provinceFk = provinceFk; data.countryFk = countryFk; } +function onBeforeSave(formData, originalData) { + return getUpdatedValues( + Object.keys(getDifferences(formData, originalData)), + formData, + ); +} async function checkEtChanges(data, _, originalData) { const equalizatedHasChanged = originalData.isEqualizated != data.isEqualizated; @@ -69,6 +75,7 @@ async function acceptPropagate({ isEqualizated }) { :url-update="`Clients/${route.params.id}/updateFiscalData`" auto-load model="Customer" + :mapper="onBeforeSave" observe-form-changes @on-data-saved="checkEtChanges" > diff --git a/src/pages/Customer/components/CustomerNewPayment.vue b/src/pages/Customer/components/CustomerNewPayment.vue index 5b351d598..ac80fdaa4 100644 --- a/src/pages/Customer/components/CustomerNewPayment.vue +++ b/src/pages/Customer/components/CustomerNewPayment.vue @@ -103,6 +103,17 @@ const calculateFromDeliveredAmount = (event) => { initialData.amountToReturn = parseFloat(event) - initialData.amountPaid; }; +function onBeforeSave(data) { + const exceededAmount = data.amountPaid > maxAmount.value; + if (isCash.value && exceededAmount) + return notify(t('Amount exceeded', { maxAmount: maxAmount.value }), 'negative'); + + if (isCash.value && shouldSendEmail.value && !data.email) + return notify(t('There is no assigned email for this client'), 'negative'); + + return data; +} + async function onDataSaved(formData, { id }) { try { if (shouldSendEmail.value && isCash.value) @@ -171,6 +182,7 @@ async function getAmountPaid() { ref="formModelRef" :form-initial-data="initialData" :url-create="urlCreate" + :mapper="onBeforeSave" @on-data-saved="onDataSaved" :prevent-submit="true" > diff --git a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue index 286ce7dad..76191b099 100644 --- a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue +++ b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue @@ -1,7 +1,7 @@ <script setup> import { ref, computed } from 'vue'; import { useI18n } from 'vue-i18n'; -import { useRouter, useRoute } from 'vue-router'; +import { useRouter } from 'vue-router'; import TicketBasicData from './TicketBasicData.vue'; import TicketBasicDataForm from './TicketBasicDataForm.vue'; @@ -13,7 +13,6 @@ import { useArrayData } from 'src/composables/useArrayData'; const { notify } = useNotify(); const router = useRouter(); -const route = useRoute(); const { t } = useI18n(); const stepperRef = ref(null); const { openConfirmationModal } = useVnConfirm(); @@ -22,7 +21,6 @@ const step = ref(1); const haveNegatives = ref(true); const ticket = computed(() => useArrayData('Ticket').store?.data); -const entityId = computed(() => +route?.params?.id); const isFormInvalid = () => { return ( diff --git a/src/pages/Ticket/Card/TicketTracking.vue b/src/pages/Ticket/Card/TicketTracking.vue index 4cfc49290..06171366d 100644 --- a/src/pages/Ticket/Card/TicketTracking.vue +++ b/src/pages/Ticket/Card/TicketTracking.vue @@ -1,5 +1,5 @@ <script setup> -import { ref, reactive } from 'vue'; +import { ref, reactive, computed } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRoute } from 'vue-router'; @@ -17,14 +17,6 @@ const user = state.getUser(); const route = useRoute(); const { t } = useI18n(); const tableRef = ref(null); - -// watch( -// () => route.params.id, -// async (val) => { -// paginateFilter.where.ticketFk = val; -// paginateRef.value.fetch(); -// }, -// ); const onStateFkChange = (formData) => (formData.userFk = user.value.id); const paginateFilter = reactive({ include: [ @@ -54,7 +46,7 @@ const paginateFilter = reactive({ }, }); -const columns = [ +const columns = computed(() => [ { label: t('ticketList.state'), name: 'state', @@ -73,9 +65,9 @@ const columns = [ name: 'created', field: 'created', align: 'left', - format: (row) => toDateTimeFormat(row.created), + format: ({ created }) => toDateTimeFormat(created), }, -]; +]); </script> <template> diff --git a/src/pages/Zone/ZoneList.vue b/src/pages/Zone/ZoneList.vue index 8d7c4a165..d86530fb3 100644 --- a/src/pages/Zone/ZoneList.vue +++ b/src/pages/Zone/ZoneList.vue @@ -260,7 +260,6 @@ const closeEventForm = () => { onDataSaved: ({ id }) => tableRef.redirect(`${id}/location`), formInitialData: {}, }" - table-height="85vh" v-model:selected="selectedRows" :table="{ 'row-key': 'id', diff --git a/test/cypress/integration/route/routeAutonomous.spec.js b/test/cypress/integration/route/routeAutonomous.spec.js index 3c5c2cede..08fd7d7ea 100644 --- a/test/cypress/integration/route/routeAutonomous.spec.js +++ b/test/cypress/integration/route/routeAutonomous.spec.js @@ -22,7 +22,7 @@ describe.skip('RouteAutonomous', () => { }; const data = { - reference: '1234', + reference: 'Test invoice', total: '€206.40', supplier: 'PLANTS SL', route: 'first route', From bdfc1fa3091ef695bd108e41cea4356f720d60b9 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Fri, 28 Mar 2025 00:25:27 +0100 Subject: [PATCH 26/55] test: refs #7356 clean commands --- .../ticket/ticketBasicData.spec.js | 14 ++-- .../ticket/ticketComponents.spec.js | 69 +++++-------------- .../integration/ticket/ticketList.spec.js | 13 ++-- .../integration/ticket/ticketNotes.spec.js | 2 +- .../integration/ticket/ticketPackage.spec.js | 9 ++- .../integration/ticket/ticketPictures.spec.js | 6 +- .../integration/ticket/ticketRequest.spec.js | 3 +- .../integration/ticket/ticketSale.spec.js | 24 ++++--- .../integration/ticket/ticketService.spec.js | 15 ++-- .../integration/ticket/ticketTracking.spec.js | 6 +- .../vnComponent/crudModel.commands.js | 3 + .../vnComponent/formModel.commands.js | 3 + .../vnComponent/vnConfirm.commands.js | 3 + .../vnComponent/vnTable.commands.js | 17 ++++- test/cypress/support/commands.js | 29 ++++++-- 15 files changed, 107 insertions(+), 109 deletions(-) create mode 100644 test/cypress/integration/vnComponent/crudModel.commands.js create mode 100644 test/cypress/integration/vnComponent/formModel.commands.js create mode 100644 test/cypress/integration/vnComponent/vnConfirm.commands.js diff --git a/test/cypress/integration/ticket/ticketBasicData.spec.js b/test/cypress/integration/ticket/ticketBasicData.spec.js index b029e0229..4a0ddce7d 100644 --- a/test/cypress/integration/ticket/ticketBasicData.spec.js +++ b/test/cypress/integration/ticket/ticketBasicData.spec.js @@ -9,7 +9,7 @@ describe('TicketBasicData', () => { it('Should redirect to customer basic data', () => { cy.get('.q-page').should('be.visible'); cy.get(':nth-child(2) > div > .text-primary').click(); - cy.get('[data-cy="Address_select"]').click(); + cy.dataCy('Address_select').click(); cy.get('.q-btn-group > [data-v-d4506789=""] > .q-btn__content > .q-icon').click(); cy.get( '[data-cy="CustomerBasicData-menu-item"] > .q-item__section--main', @@ -25,16 +25,16 @@ describe('TicketBasicData', () => { cy.get('tr:nth-child(1)>:nth-child(1)>span').should('have.class', 'link').click(); cy.dataCy('ItemDescriptor').should('exist'); cy.get('.q-drawer__content > :nth-child(1) > :nth-child(2) > span').should( - 'have.text', - 'Price: €34.40', + 'contain.text', + 'Price: €', ); cy.get('.q-drawer__content > :nth-child(1) > :nth-child(3) > span').should( - 'have.text', - 'New price: €34.20', + 'contain.text', + 'New price: €', ); cy.get('.q-drawer__content > :nth-child(1) > :nth-child(4) > span').should( - 'have.text', - 'Difference: €0.20', + 'contain.text', + 'Difference: €', ); cy.get( ':nth-child(3) > .q-radio > .q-radio__inner > .q-radio__bg > .q-radio__check', diff --git a/test/cypress/integration/ticket/ticketComponents.spec.js b/test/cypress/integration/ticket/ticketComponents.spec.js index f5bfd144d..23dbf8bcd 100644 --- a/test/cypress/integration/ticket/ticketComponents.spec.js +++ b/test/cypress/integration/ticket/ticketComponents.spec.js @@ -1,4 +1,5 @@ /// <reference types="cypress" /> + describe('TicketComponents', () => { beforeEach(() => { cy.login('developer'); @@ -7,61 +8,23 @@ describe('TicketComponents', () => { }); it('Should load layout', () => { cy.get('.q-page').should('be.visible'); - /* ==== Generated with Cypress Studio ==== */ - cy.get('.q-scrollarea__content > :nth-child(2) > :nth-child(2)').should( - 'have.text', - 'Base to commission: €799.20', - ); - cy.get('.q-scrollarea__content > :nth-child(2) > :nth-child(3)').should( - 'have.text', - 'Total without VAT: €807.20', - ); - cy.get('.q-scrollarea__content > :nth-child(3) > :nth-child(2)').should( - 'have.text', - 'valor de compra: €425.000', - ); - cy.get('.q-scrollarea__content > :nth-child(3) > :nth-child(4)').should( - 'have.text', - 'maná auto: €7.998', - ); - cy.get('.q-scrollarea__content > :nth-child(4) > :nth-child(2)').should( - 'have.text', - 'Price: €5.00', - ); - cy.get('.q-scrollarea__content > :nth-child(4) > :nth-child(3)').should( - 'have.text', - 'Bonus: €1.00', - ); - cy.get('.q-scrollarea__content > :nth-child(4) > :nth-child(5)').should( - 'have.text', - 'Packages: 6', - ); - cy.get('.q-scrollarea__content > :nth-child(4) > :nth-child(4)').should( - 'have.text', - 'Zone: Zone pickup A ', - ); - cy.get('.q-scrollarea__content > :nth-child(5) > :nth-child(2)').should( - 'have.text', - 'Total price: €16.00', - ); + cy.validateScrollContent([ + { row: 2, col: 2, text: 'Base to commission: €799.20' }, + { row: 2, col: 3, text: 'Total without VAT: €807.20' }, + { row: 3, col: 2, text: 'valor de compra: €425.000' }, + { row: 3, col: 4, text: 'maná auto: €7.998' }, + { row: 4, col: 2, text: 'Price: €5.00' }, + { row: 4, col: 3, text: 'Bonus: €1.00' }, + { row: 4, col: 5, text: 'Packages: 6' }, + { row: 4, col: 4, text: 'Zone: Zone pickup A ' }, + { row: 5, col: 2, text: 'Total price: €16.00' }, + ]); cy.get(':nth-child(4) > .link').click(); cy.dataCy('ZoneDescriptor').should('exist'); - cy.get(':nth-child(1) > [data-col-field="total"]').should( - 'have.text', - '€250.000€247.000€4.970', - ); - cy.get(':nth-child(1) > [data-col-field="import"]').should( - 'have.text', - '€50.000€49.400€0.994', - ); - cy.get(':nth-child(1) > [data-col-field="components"]').should( - 'have.text', - 'valor de compramargenmaná auto', - ); - cy.get(':nth-child(1) > [data-col-field="serie"]').should( - 'have.text', - 'costeempresacartera_comercial', - ); + cy.getRowCol('total').should('have.text', '€250.000€247.000€4.970'); + cy.getRowCol('import').should('have.text', '€50.000€49.400€0.994'); + cy.getRowCol('components').should('have.text', 'valor de compramargenmaná auto'); + cy.getRowCol('serie').should('have.text', 'costeempresacartera_comercial'); }); }); diff --git a/test/cypress/integration/ticket/ticketList.spec.js b/test/cypress/integration/ticket/ticketList.spec.js index 44e5fe5a1..e18025319 100644 --- a/test/cypress/integration/ticket/ticketList.spec.js +++ b/test/cypress/integration/ticket/ticketList.spec.js @@ -1,7 +1,5 @@ /// <reference types="cypress" /> describe('TicketList', () => { - const firstRow = 'tbody.q-virtual-scroll__content tr:nth-child(1)'; - beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); @@ -11,7 +9,7 @@ describe('TicketList', () => { const searchResults = (search) => { if (search) cy.typeSearchbar().type(search); cy.dataCy('vn-searchbar').find('input').type('{enter}'); - cy.get(firstRow).should('exist'); + cy.getRow().should('exist'); }; it('should search results', () => { @@ -24,13 +22,13 @@ describe('TicketList', () => { cy.window().then((win) => { cy.stub(win, 'open').as('windowOpen'); }); - cy.get(firstRow).should('be.visible').find('.q-btn:first').click(); + cy.getRow().should('be.visible').find('.q-btn:first').click(); cy.get('@windowOpen').should('be.calledWithMatch', /\/ticket\/\d+\/sale/); }); it('should open ticket summary', () => { searchResults(); - cy.get(firstRow).find('.q-btn:last').click(); + cy.getRow().find('.q-btn:last').click(); cy.get('.summaryHeader').should('exist'); cy.get('.summaryBody').should('exist'); }); @@ -44,7 +42,7 @@ describe('TicketList', () => { cy.dataCy('Customer ID_input').type('1101{enter}'); cy.intercept('GET', /\/api\/Clients\?filter/).as('clientFilter'); - cy.get('[data-cy="vnTableCreateBtn"] > .q-btn__content > .q-icon').click(); + cy.vnTableCreateBtn(); cy.wait('@clientFilter'); cy.dataCy('Customer_select').should('have.value', 'Bruce Wayne'); cy.dataCy('Address_select').click(); @@ -53,8 +51,7 @@ describe('TicketList', () => { cy.dataCy('Address_select').should('have.value', 'Bruce Wayne'); }); it('Client list create new ticket', () => { - cy.dataCy('vnTableCreateBtn').should('exist'); - cy.dataCy('vnTableCreateBtn').click(); + cy.vnTableCreateBtn(); const data = { Customer: { val: 1, type: 'select' }, Warehouse: { val: 'Warehouse One', type: 'select' }, diff --git a/test/cypress/integration/ticket/ticketNotes.spec.js b/test/cypress/integration/ticket/ticketNotes.spec.js index 5b44f9e1f..df1ff9137 100644 --- a/test/cypress/integration/ticket/ticketNotes.spec.js +++ b/test/cypress/integration/ticket/ticketNotes.spec.js @@ -19,7 +19,7 @@ describe('TicketNotes', () => { cy.checkNotification('Data saved'); cy.dataCy('ticketNotesRemoveNoteBtn').should('exist'); cy.dataCy('ticketNotesRemoveNoteBtn').click(); - cy.dataCy('VnConfirm_confirm').click(); + cy.confirmVnConfirm(); cy.checkNotification('Data saved'); }); }); diff --git a/test/cypress/integration/ticket/ticketPackage.spec.js b/test/cypress/integration/ticket/ticketPackage.spec.js index e7980a413..992efd53b 100644 --- a/test/cypress/integration/ticket/ticketPackage.spec.js +++ b/test/cypress/integration/ticket/ticketPackage.spec.js @@ -9,14 +9,13 @@ describe('TicketPackages', () => { it('Should load layout', () => { cy.get('.q-page').should('be.visible'); cy.get('.vn-row > .q-btn > .q-btn__content > .q-icon').click(); - cy.get('[data-cy="Package_select"]').click(); + cy.dataCy('Package_select').click(); cy.get('.q-menu :nth-child(1) >.q-item__section').click(); - cy.get('[data-cy="Quantity_input"]').clear(); - cy.get('[data-cy="Quantity_input"]').type('5'); - cy.get('[data-cy="crudModelDefaultSaveBtn"] > .q-btn__content').click(); + cy.dataCy('Quantity_input').clear().type('5'); + cy.saveCrudModel(); cy.checkNotification('Data saved'); cy.get('.q-mb-md > .text-primary').click(); - cy.get('[data-cy="VnConfirm_confirm"] > .q-btn__content > .block').click(); + cy.confirmVnConfirm(); cy.checkNotification('Data saved'); }); }); diff --git a/test/cypress/integration/ticket/ticketPictures.spec.js b/test/cypress/integration/ticket/ticketPictures.spec.js index d8f48df32..1165b54bf 100644 --- a/test/cypress/integration/ticket/ticketPictures.spec.js +++ b/test/cypress/integration/ticket/ticketPictures.spec.js @@ -9,9 +9,9 @@ describe('TicketPictures', () => { cy.get(':nth-child(1) > .q-card > .content').should('be.visible'); cy.get('.content > .link').should('be.visible').click(); cy.dataCy('ItemDescriptor').should('exist'); - cy.get('[data-cy="vnLvColor:"]').should('be.visible'); - cy.get('[data-cy="vnLvColor:"]').should('be.visible'); - cy.get('[data-cy="vnLvTallos:"]').should('be.visible'); + cy.dataCy('vnLvColor:'); + cy.dataCy('vnLvColor:'); + cy.dataCy('vnLvTallos:'); cy.get('.q-mt-md').should('be.visible'); cy.get(':nth-child(1) > .q-card > .img-wrapper').should('be.visible'); }); diff --git a/test/cypress/integration/ticket/ticketRequest.spec.js b/test/cypress/integration/ticket/ticketRequest.spec.js index b9dc509ef..3b237826e 100644 --- a/test/cypress/integration/ticket/ticketRequest.spec.js +++ b/test/cypress/integration/ticket/ticketRequest.spec.js @@ -7,8 +7,7 @@ describe('TicketRequest', () => { }); it('Creates a new request', () => { - cy.dataCy('vnTableCreateBtn').should('exist'); - cy.dataCy('vnTableCreateBtn').click(); + cy.vnTableCreateBtn(); const data = { Description: { val: 'Purchase description' }, Atender: { val: 'buyerNick', type: 'select' }, diff --git a/test/cypress/integration/ticket/ticketSale.spec.js b/test/cypress/integration/ticket/ticketSale.spec.js index 6d84f214c..97a5aeaf7 100644 --- a/test/cypress/integration/ticket/ticketSale.spec.js +++ b/test/cypress/integration/ticket/ticketSale.spec.js @@ -16,9 +16,11 @@ describe('TicketSale', () => { cy.waitForElement('[data-cy="ticketEditManaProxy"]'); cy.dataCy('ticketEditManaProxy').should('exist'); cy.waitForElement('[data-cy="Price_input"]'); - cy.dataCy('Price_input').clear(); - cy.dataCy('Price_input').type(price); + cy.dataCy('Price_input').clear().type(price); + cy.intercept('POST', '**/api').as('saveMana'); + cy.dataCy('saveManaBtn').click(); + cy.wait('@saveMana').its('response.statusCode').should('eq', 200); handleVnConfirm(); cy.get('[data-col-field="price"]') @@ -34,7 +36,10 @@ describe('TicketSale', () => { cy.waitForElement('[data-cy="Disc_input"]'); cy.dataCy('Disc_input').clear(); cy.dataCy('Disc_input').type(discount); + cy.intercept('POST', '**/api').as('saveMana'); + cy.dataCy('saveManaBtn').click(); + cy.wait('@saveMana').its('response.statusCode').should('eq', 200); handleVnConfirm(); cy.get('[data-col-field="discount"]') @@ -82,12 +87,12 @@ describe('TicketSale', () => { selectFirstRow(); cy.dataCy('ticketSaleMoreActionsDropdown').click(); cy.dataCy('createClaimItem').click(); - cy.dataCy('VnConfirm_confirm').click(); + cy.confirmVnConfirm(); cy.url().should('contain', 'claim/'); // Delete created claim to avoid cluttering the database cy.dataCy('descriptor-more-opts').click(); cy.dataCy('deleteClaim').click(); - cy.dataCy('VnConfirm_confirm').click(); + cy.confirmVnConfirm(); }); }); describe('Free ticket #31', () => { @@ -138,8 +143,10 @@ describe('TicketSale', () => { cy.waitForElement('[data-cy="ticketSaleDiscountInput"]'); cy.dataCy('ticketSaleDiscountInput').find('input').focus(); cy.dataCy('ticketSaleDiscountInput').find('input').type('10'); + cy.intercept('POST', '**/api').as('saveMana'); + cy.dataCy('saveManaBtn').click(); - cy.waitForElement('.q-notification__message'); + cy.wait('@saveMana').its('response.statusCode').should('eq', 200); cy.checkNotification('Data saved'); cy.dataCy('ticketSaleMoreActionsDropdown').should('be.disabled'); }); @@ -148,7 +155,7 @@ describe('TicketSale', () => { selectFirstRow(); cy.dataCy('ticketSaleMoreActionsDropdown').click(); cy.dataCy('createClaimItem').click(); - cy.dataCy('VnConfirm_confirm').click(); + cy.confirmVnConfirm(); cy.checkNotification('Future ticket date not allowed'); }); @@ -194,9 +201,6 @@ function selectFirstRow() { cy.get(firstRow).find('.q-checkbox__inner').click(); } function handleVnConfirm() { - cy.get('[data-cy="VnConfirm_confirm"]').click(); - cy.waitForElement('.q-notification__message'); - - cy.get('.q-notification__message').should('be.visible'); + cy.confirmVnConfirm(); cy.checkNotification('Data saved'); } diff --git a/test/cypress/integration/ticket/ticketService.spec.js b/test/cypress/integration/ticket/ticketService.spec.js index 4ffc7f731..5bf8e2aab 100644 --- a/test/cypress/integration/ticket/ticketService.spec.js +++ b/test/cypress/integration/ticket/ticketService.spec.js @@ -9,17 +9,14 @@ describe('TicketService', () => { it('Add and remove service', () => { cy.get('.q-page').should('be.visible'); cy.addBtnClick(); - cy.get('[data-cy="Description_icon"]').click(); - cy.get('[data-cy="Description_input"]').clear(); - cy.get('[data-cy="Description_input"]').type('test'); - cy.get('[data-cy="FormModelPopup_save"] > .q-btn__content > .block').click(); + cy.dataCy('Description_icon').click(); + cy.dataCy('Description_input').clear().type('test'); + cy.saveFormModel(); cy.selectOption('[data-cy="Description_select"]', 'test'); - cy.get('[data-cy="Quantity_input"]').clear('1'); - cy.get('[data-cy="Quantity_input"]').type('1'); - cy.get('[data-cy="Price_input"]').clear('2'); - cy.get('[data-cy="Price_input"]').type('2'); - cy.get('[data-cy="crudModelDefaultSaveBtn"] > .q-btn__content > .block').click(); + cy.dataCy('Quantity_input').clear().type('1'); + cy.dataCy('Price_input').clear().type('2'); + cy.saveCrudModel(); cy.checkNotification('Data saved'); cy.get(':nth-child(5) > .q-icon').click(); }); diff --git a/test/cypress/integration/ticket/ticketTracking.spec.js b/test/cypress/integration/ticket/ticketTracking.spec.js index 53bf6704e..f351ee0a1 100644 --- a/test/cypress/integration/ticket/ticketTracking.spec.js +++ b/test/cypress/integration/ticket/ticketTracking.spec.js @@ -9,11 +9,11 @@ describe('Ticket tracking', () => { it('Add new tracking', () => { cy.get('.q-page').should('be.visible'); - cy.firstRow('worker').find('span').should('have.class', 'link').click(); + cy.getRowCol('worker').find('span').should('have.class', 'link').click(); cy.dataCy('WorkerDescriptor').should('exist'); - cy.get('[data-cy="vnTableCreateBtn"] > .q-btn__content > .q-icon').click(); + cy.vnTableCreateBtn(); cy.selectOption('.q-field--float [data-cy="State_select"]', 'OK').click(); - cy.get('[data-cy="FormModelPopup_save"] > .q-btn__content > .block').click(); + cy.saveFormModel(); cy.get( ':last-child > [data-col-field="state"] > [data-cy="vnTableCell_state"]', ).should('have.text', 'OK'); diff --git a/test/cypress/integration/vnComponent/crudModel.commands.js b/test/cypress/integration/vnComponent/crudModel.commands.js new file mode 100644 index 000000000..9d08f064a --- /dev/null +++ b/test/cypress/integration/vnComponent/crudModel.commands.js @@ -0,0 +1,3 @@ +Cypress.Commands.add('saveCrudModel', () => + cy.dataCy('crudModelDefaultSaveBtn').should('exist').click(), +); diff --git a/test/cypress/integration/vnComponent/formModel.commands.js b/test/cypress/integration/vnComponent/formModel.commands.js new file mode 100644 index 000000000..2814b0091 --- /dev/null +++ b/test/cypress/integration/vnComponent/formModel.commands.js @@ -0,0 +1,3 @@ +Cypress.Commands.add('saveFormModel', () => + cy.dataCy('FormModelPopup_save').should('exist').click(), +); diff --git a/test/cypress/integration/vnComponent/vnConfirm.commands.js b/test/cypress/integration/vnComponent/vnConfirm.commands.js new file mode 100644 index 000000000..9f93967d6 --- /dev/null +++ b/test/cypress/integration/vnComponent/vnConfirm.commands.js @@ -0,0 +1,3 @@ +Cypress.Commands.add('confirmVnConfirm', () => + cy.dataCy('VnConfirm_confirm').should('exist').click(), +); diff --git a/test/cypress/integration/vnComponent/vnTable.commands.js b/test/cypress/integration/vnComponent/vnTable.commands.js index 15cbf6f9a..6c7e71e13 100644 --- a/test/cypress/integration/vnComponent/vnTable.commands.js +++ b/test/cypress/integration/vnComponent/vnTable.commands.js @@ -1,3 +1,16 @@ -Cypress.Commands.add('firstRow', (field, index = 1) => - cy.get(`:nth-child(${index}) > [data-col-field="${field}"]`), +Cypress.Commands.add('getRow', (index = 1) => + cy.get(`.vnTable .q-virtual-scroll__content tr:nth-child(${index})`), +); +Cypress.Commands.add('getRowCol', (field, index = 1) => + cy.get( + `.vnTable .q-virtual-scroll__content > :nth-child(${index}) > [data-col-field="${field}"]`, + ), +); + +Cypress.Commands.add('vnTableCreateBtn', () => + cy.dataCy('vnTableCreateBtn').should('exist').click(), +); + +Cypress.Commands.add('waitTableScrollLoad', () => + cy.waitForElement('[data-q-vs-anchor]'), ); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index 7ed6ef238..fe0469f9e 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -429,8 +429,29 @@ Cypress.Commands.add('searchByLabel', (label, value) => { cy.get(`[label="${label}"] > .q-field > .q-field__inner`).type(`${value}{enter}`); }); -Cypress.Commands.add('dataCy', (tag, attr = 'data-cy') => { - return cy.get(`[${attr}="${tag}"]`); +Cypress.Commands.add('dataCy', (tag, attr = 'data-cy', options = {}) => { + let chain = cy.get(`[${attr}="${tag}"]`).should('be.visible'); + + // Procesar cada opción y encadenar los comandos correspondientes + Object.entries(options).forEach(([key, value]) => { + switch (key) { + case 'click': + if (value) chain = chain.click(); + break; + case 'type': + chain = chain.type(value); + break; + case 'clear': + if (value) chain = chain.clear(); + break; + case 'should': + chain = chain.should(value); + break; + // Puedes añadir más casos según necesites + } + }); + + return chain; }); Cypress.Commands.add('addBtnClick', () => { @@ -610,7 +631,3 @@ Cypress.Commands.add('checkQueryParams', (expectedParams = {}) => { } }); }); - -Cypress.Commands.add('waitTableScrollLoad', () => - cy.waitForElement('[data-q-vs-anchor]'), -); From 4ae9b69e113bbdfb74c4ac2a11acbb73f6460abe Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Fri, 28 Mar 2025 00:38:47 +0100 Subject: [PATCH 27/55] test: refs #7356 clean commands --- src/pages/Zone/ZoneList.vue | 1 + test/cypress/integration/ticket/ticketSale.spec.js | 10 +++++----- test/cypress/support/commands.js | 9 +++++++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/pages/Zone/ZoneList.vue b/src/pages/Zone/ZoneList.vue index d86530fb3..8d7c4a165 100644 --- a/src/pages/Zone/ZoneList.vue +++ b/src/pages/Zone/ZoneList.vue @@ -260,6 +260,7 @@ const closeEventForm = () => { onDataSaved: ({ id }) => tableRef.redirect(`${id}/location`), formInitialData: {}, }" + table-height="85vh" v-model:selected="selectedRows" :table="{ 'row-key': 'id', diff --git a/test/cypress/integration/ticket/ticketSale.spec.js b/test/cypress/integration/ticket/ticketSale.spec.js index 97a5aeaf7..f475728c5 100644 --- a/test/cypress/integration/ticket/ticketSale.spec.js +++ b/test/cypress/integration/ticket/ticketSale.spec.js @@ -2,9 +2,9 @@ const firstRow = 'tbody > :nth-child(1)'; describe('TicketSale', () => { - describe('Ticket #23', () => { + describe('#23', () => { beforeEach(() => { - cy.login('developer'); + cy.login('salesPerson'); cy.viewport(1920, 1080); cy.visit('/#/ticket/23/sale'); }); @@ -76,7 +76,7 @@ describe('TicketSale', () => { .should('have.value', `${quantity}`); }); }); - describe('Ticket to add claim #24', () => { + describe('#24 add claim', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); @@ -95,7 +95,7 @@ describe('TicketSale', () => { cy.confirmVnConfirm(); }); }); - describe('Free ticket #31', () => { + describe('#31 free ticket', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); @@ -180,7 +180,7 @@ describe('TicketSale', () => { cy.url().should('match', /\/ticket\/31\/log/); }); }); - describe('Ticket to transfer #32', () => { + describe('#32 transfer', () => { beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index fe0469f9e..1504283da 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -631,3 +631,12 @@ Cypress.Commands.add('checkQueryParams', (expectedParams = {}) => { } }); }); + +Cypress.Commands.add('validateScrollContent', (validations) => { + validations.forEach(({ row, col, text }) => { + cy.get(`.q-scrollarea__content > :nth-child(${row}) > :nth-child(${col})`).should( + 'have.text', + text, + ); + }); +}); From 96bcc04d787a71654231b03316ccc125a293e7a2 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 31 Mar 2025 11:59:08 +0200 Subject: [PATCH 28/55] style: fix vnselect style with full-width --- src/css/app.scss | 3 +++ src/pages/Item/ItemListFilter.vue | 45 ++++++++++++++----------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/css/app.scss b/src/css/app.scss index b299973d1..dd5dbe247 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -340,3 +340,6 @@ input::-webkit-inner-spin-button { .containerShrinked { width: 70%; } +.q-item__section--main ~ .q-item__section--side { + padding-inline: 0; +} diff --git a/src/pages/Item/ItemListFilter.vue b/src/pages/Item/ItemListFilter.vue index f4500d5fa..0b40d38e1 100644 --- a/src/pages/Item/ItemListFilter.vue +++ b/src/pages/Item/ItemListFilter.vue @@ -7,7 +7,7 @@ import FetchData from 'components/FetchData.vue'; import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import VnInput from 'src/components/common/VnInput.vue'; -import { QCheckbox } from 'quasar'; +import VnCheckbox from 'src/components/common/VnCheckbox.vue'; import { useArrayData } from 'composables/useArrayData'; import { useValidator } from 'src/composables/useValidator'; @@ -250,10 +250,9 @@ onMounted(async () => { </QItemSection> </QItem> <!-- Tags filter --> - <QItem class="row items-center"> - <QItemLabel> - {{ t('params.tags') }} - </QItemLabel> + <QItemLabel header> + {{ t('params.tags') }} + <QIcon name="add_circle" class="fill-icon-on-hover q-ml-md" @@ -261,7 +260,7 @@ onMounted(async () => { color="primary" @click="tagValues.push({})" /> - </QItem> + </QItemLabel> <QItem v-for="(tag, index) in tagValues" :key="index" @@ -269,6 +268,7 @@ onMounted(async () => { > <QItemSection class="col"> <VnSelect + class="full-width" :label="t('params.tag')" v-model="tag.selectedTag" :options="tagOptions" @@ -316,25 +316,19 @@ onMounted(async () => { /> </QItem> <!-- Filter fields --> - <QItem class="row items-center"> - <QItemLabel> - {{ t('More fields') }} - </QItemLabel> + <QItemLabel header + >{{ t('More fields') }} <QIcon name="add_circle" class="fill-icon-on-hover q-ml-md" size="sm" color="primary" @click="fieldFiltersValues.push({})" - /> - </QItem> - <QItem - v-for="(fieldFilter, index) in fieldFiltersValues" - :key="index" - class="row items-center" - > + /></QItemLabel> + <QItem v-for="(fieldFilter, index) in fieldFiltersValues" :key="index"> <QItemSection class="col"> <VnSelect + :style="{ 'max-width': '100%' }" :label="t('params.tag')" :model-value="fieldFilter.selectedField" :options="moreFields" @@ -355,7 +349,7 @@ onMounted(async () => { /> </QItemSection> <QItemSection class="col"> - <QCheckbox + <VnCheckbox v-if="fieldFilter.selectedField?.type === 'boolean'" v-model="fieldFilter.value" :label="t('params.value')" @@ -370,13 +364,14 @@ onMounted(async () => { @keydown.enter="applyFieldFilters(params, searchFn)" /> </QItemSection> - <QIcon - name="delete" - class="fill-icon-on-hover q-ml-xs" - size="sm" - color="primary" - @click="removeFieldFilter(index, params, searchFn)" - /> + <QItemSection side + ><QIcon + name="delete" + class="fill-icon-on-hover q-ml-xs" + size="sm" + color="primary" + @click="removeFieldFilter(index, params, searchFn)" + /></QItemSection> </QItem> <QItem> <QItemSection> From 8c9a863d71d04d03130d2987dc11fcb2a6ab7e8c Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 31 Mar 2025 12:23:45 +0200 Subject: [PATCH 29/55] style: handle height based on number of toolbars --- src/components/VnTable/VnTable.vue | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index e214770d2..93aff289a 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -117,7 +117,15 @@ const $props = defineProps({ }, tableHeight: { type: String, - default: '90vh', + default: () => { + let height = 100; + Array.from(document.querySelectorAll('[role="toolbar"]')) + .filter((element) => window.getComputedStyle(element).display !== 'none') + .forEach(() => { + height -= 10; + }); + return height + 'vh'; + }, }, footer: { type: Boolean, @@ -627,6 +635,7 @@ const rowCtrlClickFunction = computed(() => { }); </script> <template> + {{ $props.tableHeight }} <RightMenu v-if="$props.rightSearch" :overlay="overlay"> <template #right-panel> <VnTableFilter From 04dcd1136ab4a5897c943a22fb9c7f1e6d787a11 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 31 Mar 2025 12:35:47 +0200 Subject: [PATCH 30/55] fix: remove prop printing --- src/components/VnTable/VnTable.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 93aff289a..e3aa14255 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -635,7 +635,6 @@ const rowCtrlClickFunction = computed(() => { }); </script> <template> - {{ $props.tableHeight }} <RightMenu v-if="$props.rightSearch" :overlay="overlay"> <template #right-panel> <VnTableFilter From 426438051cd496fc185f67f99e950d749f1e0386 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 31 Mar 2025 13:20:41 +0200 Subject: [PATCH 31/55] test: refs #7356 update command --- .../ticket/ticketBasicData.spec.js | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/test/cypress/integration/ticket/ticketBasicData.spec.js b/test/cypress/integration/ticket/ticketBasicData.spec.js index 4a0ddce7d..443e9569b 100644 --- a/test/cypress/integration/ticket/ticketBasicData.spec.js +++ b/test/cypress/integration/ticket/ticketBasicData.spec.js @@ -10,7 +10,7 @@ describe('TicketBasicData', () => { cy.get('.q-page').should('be.visible'); cy.get(':nth-child(2) > div > .text-primary').click(); cy.dataCy('Address_select').click(); - cy.get('.q-btn-group > [data-v-d4506789=""] > .q-btn__content > .q-icon').click(); + cy.get('.q-btn-group ').find('.q-btn__content > .q-icon').click(); cy.get( '[data-cy="CustomerBasicData-menu-item"] > .q-item__section--main', ).click(); @@ -24,18 +24,12 @@ describe('TicketBasicData', () => { cy.get('.q-stepper__tab--active').should('have.class', 'q-stepper__tab--active'); cy.get('tr:nth-child(1)>:nth-child(1)>span').should('have.class', 'link').click(); cy.dataCy('ItemDescriptor').should('exist'); - cy.get('.q-drawer__content > :nth-child(1) > :nth-child(2) > span').should( - 'contain.text', - 'Price: €', - ); - cy.get('.q-drawer__content > :nth-child(1) > :nth-child(3) > span').should( - 'contain.text', - 'New price: €', - ); - cy.get('.q-drawer__content > :nth-child(1) > :nth-child(4) > span').should( - 'contain.text', - 'Difference: €', - ); + + cy.get('.q-drawer__content > :nth-child(1)').each(() => { + cy.get('span').should('contain.text', 'Price: €'); + cy.get('span').should('contain.text', 'New price: €'); + cy.get('span').should('contain.text', 'Difference: €'); + }); cy.get( ':nth-child(3) > .q-radio > .q-radio__inner > .q-radio__bg > .q-radio__check', ).should('have.class', 'q-radio__check'); From c099b41e745d7d65c6f7e6283afd40b54391f8ba Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 2 Apr 2025 10:13:12 +0200 Subject: [PATCH 32/55] perf: move calc heightTable to filter --- src/components/VnTable/VnTable.vue | 11 ++--------- src/components/VnTable/filters/heightTable.js | 10 ++++++++++ 2 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 src/components/VnTable/filters/heightTable.js diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index e3aa14255..c93367268 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -32,6 +32,7 @@ import VnTableOrder from 'src/components/VnTable/VnOrder.vue'; import VnTableFilter from './VnTableFilter.vue'; import { getColAlign } from 'src/composables/getColAlign'; import RightMenu from '../common/RightMenu.vue'; +import heightTable from './filters/heightTable'; const arrayData = useArrayData(useAttrs()['data-key']); const $props = defineProps({ @@ -117,15 +118,7 @@ const $props = defineProps({ }, tableHeight: { type: String, - default: () => { - let height = 100; - Array.from(document.querySelectorAll('[role="toolbar"]')) - .filter((element) => window.getComputedStyle(element).display !== 'none') - .forEach(() => { - height -= 10; - }); - return height + 'vh'; - }, + default: heightTable, }, footer: { type: Boolean, diff --git a/src/components/VnTable/filters/heightTable.js b/src/components/VnTable/filters/heightTable.js new file mode 100644 index 000000000..d3bfc9f1c --- /dev/null +++ b/src/components/VnTable/filters/heightTable.js @@ -0,0 +1,10 @@ +export default function () { + let height = 100; + Array.from(document.querySelectorAll('[role="toolbar"]')) + .filter((element) => window.getComputedStyle(element).display !== 'none') + .forEach(() => { + height -= 10; + }); + console.error(height); + return height + 'vh'; +} From f13b168364715c54662df3bf01f9c103d6a33842 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 2 Apr 2025 10:13:24 +0200 Subject: [PATCH 33/55] style: reduce height row --- src/pages/Ticket/Card/TicketSale.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/Ticket/Card/TicketSale.vue b/src/pages/Ticket/Card/TicketSale.vue index 2fb305cc3..7efb9f62d 100644 --- a/src/pages/Ticket/Card/TicketSale.vue +++ b/src/pages/Ticket/Card/TicketSale.vue @@ -99,6 +99,7 @@ const columns = computed(() => [ align: 'left', label: t('globals.quantity'), name: 'quantity', + class: 'shrink', format: (row) => toCurrency(row.quantity), }, { @@ -767,7 +768,7 @@ watch( {{ row?.item?.subName.toUpperCase() }} </div> </div> - <FetchedTags v-if="row.item" :item="row.item" :max-length="6" /> + <FetchedTags v-if="row.item" :item="row.item" :columns="6" :max-length="6" /> <QPopupProxy v-if="row.id && isTicketEditable"> <VnInput v-model="row.concept" From 6bf6ae028875700bc106888cac1d49fc45176eb9 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 2 Apr 2025 10:15:02 +0200 Subject: [PATCH 34/55] perf: rename filter --- src/components/VnTable/VnTable.vue | 4 ++-- .../filters/{heightTable.js => calculateTableHeight.js} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename src/components/VnTable/filters/{heightTable.js => calculateTableHeight.js} (100%) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index c93367268..7f505558a 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -32,7 +32,7 @@ import VnTableOrder from 'src/components/VnTable/VnOrder.vue'; import VnTableFilter from './VnTableFilter.vue'; import { getColAlign } from 'src/composables/getColAlign'; import RightMenu from '../common/RightMenu.vue'; -import heightTable from './filters/heightTable'; +import calcTableHeight from './filters/calculateTableHeight'; const arrayData = useArrayData(useAttrs()['data-key']); const $props = defineProps({ @@ -118,7 +118,7 @@ const $props = defineProps({ }, tableHeight: { type: String, - default: heightTable, + default: calcTableHeight, }, footer: { type: Boolean, diff --git a/src/components/VnTable/filters/heightTable.js b/src/components/VnTable/filters/calculateTableHeight.js similarity index 100% rename from src/components/VnTable/filters/heightTable.js rename to src/components/VnTable/filters/calculateTableHeight.js From 4caf496bd6754fc57475bf17e13cb47e2252b580 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 2 Apr 2025 10:28:30 +0200 Subject: [PATCH 35/55] perf: use composable --- src/components/VnTable/VnTable.vue | 6 ++++-- .../VnTable/filters/useTableHeight.js | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/components/VnTable/filters/useTableHeight.js diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 7f505558a..d8318e989 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -19,6 +19,7 @@ import { useQuasar, date } from 'quasar'; import { useStateStore } from 'stores/useStateStore'; import { useFilterParams } from 'src/composables/useFilterParams'; import { dashIfEmpty, toDate } from 'src/filters'; +import { useTableHeight } from './filters/useTableHeight'; import CrudModel from 'src/components/CrudModel.vue'; import FormModelPopup from 'components/FormModelPopup.vue'; @@ -118,7 +119,7 @@ const $props = defineProps({ }, tableHeight: { type: String, - default: calcTableHeight, + default: undefined, }, footer: { type: Boolean, @@ -167,6 +168,7 @@ const tableRef = ref(); const params = ref(useFilterParams($attrs['data-key']).params); const orders = ref(useFilterParams($attrs['data-key']).orders); const app = inject('app'); +const tableHeight = useTableHeight(); const editingRow = ref(null); const editingField = ref(null); @@ -679,7 +681,7 @@ const rowCtrlClickFunction = computed(() => { table-header-class="bg-header" card-container-class="grid-three" flat - :style="isTableMode && `max-height: ${tableHeight}`" + :style="isTableMode && `max-height: ${$props.tableHeight || tableHeight}`" :virtual-scroll="isTableMode" @virtual-scroll="handleScroll" @row-click="(event, row) => handleRowClick(event, row)" diff --git a/src/components/VnTable/filters/useTableHeight.js b/src/components/VnTable/filters/useTableHeight.js new file mode 100644 index 000000000..6a857e078 --- /dev/null +++ b/src/components/VnTable/filters/useTableHeight.js @@ -0,0 +1,18 @@ +import { onMounted, nextTick, ref } from 'vue'; + +export function useTableHeight() { + const tableHeight = ref('100vh'); + + onMounted(async () => { + await nextTick(); + let height = 100; + Array.from(document.querySelectorAll('[role="toolbar"]')) + .filter((element) => window.getComputedStyle(element).display !== 'none') + .forEach(() => { + height -= 10; + }); + tableHeight.value = `${height}vh`; + }); + + return tableHeight; +} From a1490a798b4154c60cde6ef3f171b9933d2891d1 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 2 Apr 2025 10:32:42 +0200 Subject: [PATCH 36/55] fix: remove calculateTableHeight --- src/components/VnTable/VnTable.vue | 1 - src/components/VnTable/filters/calculateTableHeight.js | 10 ---------- 2 files changed, 11 deletions(-) delete mode 100644 src/components/VnTable/filters/calculateTableHeight.js diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index d8318e989..b21a622ca 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -33,7 +33,6 @@ import VnTableOrder from 'src/components/VnTable/VnOrder.vue'; import VnTableFilter from './VnTableFilter.vue'; import { getColAlign } from 'src/composables/getColAlign'; import RightMenu from '../common/RightMenu.vue'; -import calcTableHeight from './filters/calculateTableHeight'; const arrayData = useArrayData(useAttrs()['data-key']); const $props = defineProps({ diff --git a/src/components/VnTable/filters/calculateTableHeight.js b/src/components/VnTable/filters/calculateTableHeight.js deleted file mode 100644 index d3bfc9f1c..000000000 --- a/src/components/VnTable/filters/calculateTableHeight.js +++ /dev/null @@ -1,10 +0,0 @@ -export default function () { - let height = 100; - Array.from(document.querySelectorAll('[role="toolbar"]')) - .filter((element) => window.getComputedStyle(element).display !== 'none') - .forEach(() => { - height -= 10; - }); - console.error(height); - return height + 'vh'; -} From e435674eda4a82f1d5c7bbb151edd1e1da7bf012 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 2 Apr 2025 11:34:19 +0200 Subject: [PATCH 37/55] style: minor changes --- src/components/VnTable/filters/useTableHeight.js | 2 +- src/pages/Item/ItemListFilter.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/VnTable/filters/useTableHeight.js b/src/components/VnTable/filters/useTableHeight.js index 6a857e078..2397ce16f 100644 --- a/src/components/VnTable/filters/useTableHeight.js +++ b/src/components/VnTable/filters/useTableHeight.js @@ -1,7 +1,7 @@ import { onMounted, nextTick, ref } from 'vue'; export function useTableHeight() { - const tableHeight = ref('100vh'); + const tableHeight = ref('90vh'); onMounted(async () => { await nextTick(); diff --git a/src/pages/Item/ItemListFilter.vue b/src/pages/Item/ItemListFilter.vue index 0b40d38e1..ab9b91d06 100644 --- a/src/pages/Item/ItemListFilter.vue +++ b/src/pages/Item/ItemListFilter.vue @@ -328,7 +328,7 @@ onMounted(async () => { <QItem v-for="(fieldFilter, index) in fieldFiltersValues" :key="index"> <QItemSection class="col"> <VnSelect - :style="{ 'max-width': '100%' }" + class="full-width" :label="t('params.tag')" :model-value="fieldFilter.selectedField" :options="moreFields" From 20f3525e502464076a62b751a79504d0916f5db7 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 2 Apr 2025 13:23:00 +0200 Subject: [PATCH 38/55] revert: refs #7356 command dataCy proposal --- test/cypress/support/commands.js | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index 1504283da..41f91e855 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -429,29 +429,8 @@ Cypress.Commands.add('searchByLabel', (label, value) => { cy.get(`[label="${label}"] > .q-field > .q-field__inner`).type(`${value}{enter}`); }); -Cypress.Commands.add('dataCy', (tag, attr = 'data-cy', options = {}) => { - let chain = cy.get(`[${attr}="${tag}"]`).should('be.visible'); - - // Procesar cada opción y encadenar los comandos correspondientes - Object.entries(options).forEach(([key, value]) => { - switch (key) { - case 'click': - if (value) chain = chain.click(); - break; - case 'type': - chain = chain.type(value); - break; - case 'clear': - if (value) chain = chain.clear(); - break; - case 'should': - chain = chain.should(value); - break; - // Puedes añadir más casos según necesites - } - }); - - return chain; +Cypress.Commands.add('dataCy', (tag, attr = 'data-cy') => { + return cy.get(`[${attr}="${tag}"]`); }); Cypress.Commands.add('addBtnClick', () => { From 21c9abf2735a1ba7ae60dfb83a3bf7958f322d2d Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 2 Apr 2025 13:30:50 +0200 Subject: [PATCH 39/55] test: refs #7356 fix test ticketSale --- .../integration/ticket/ticketSale.spec.js | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/test/cypress/integration/ticket/ticketSale.spec.js b/test/cypress/integration/ticket/ticketSale.spec.js index f475728c5..f433f0d11 100644 --- a/test/cypress/integration/ticket/ticketSale.spec.js +++ b/test/cypress/integration/ticket/ticketSale.spec.js @@ -4,7 +4,7 @@ const firstRow = 'tbody > :nth-child(1)'; describe('TicketSale', () => { describe('#23', () => { beforeEach(() => { - cy.login('salesPerson'); + cy.login('salesBoss'); cy.viewport(1920, 1080); cy.visit('/#/ticket/23/sale'); }); @@ -17,11 +17,11 @@ describe('TicketSale', () => { cy.dataCy('ticketEditManaProxy').should('exist'); cy.waitForElement('[data-cy="Price_input"]'); cy.dataCy('Price_input').clear().type(price); - cy.intercept('POST', '**/api').as('saveMana'); + cy.intercept('POST', /\/api\/Sales\/\d+\/updatePrice/).as('updatePrice'); cy.dataCy('saveManaBtn').click(); - cy.wait('@saveMana').its('response.statusCode').should('eq', 200); handleVnConfirm(); + cy.wait('@updatePrice').its('response.statusCode').should('eq', 200); cy.get('[data-col-field="price"]') .find('.q-btn > .q-btn__content') @@ -34,13 +34,14 @@ describe('TicketSale', () => { cy.waitForElement('[data-cy="ticketEditManaProxy"]'); cy.dataCy('ticketEditManaProxy').should('exist'); cy.waitForElement('[data-cy="Disc_input"]'); - cy.dataCy('Disc_input').clear(); - cy.dataCy('Disc_input').type(discount); - cy.intercept('POST', '**/api').as('saveMana'); + cy.dataCy('Disc_input').clear().type(discount); + cy.intercept('POST', /\/api\/Tickets\/\d+\/updateDiscount/).as( + 'updateDiscount', + ); cy.dataCy('saveManaBtn').click(); - cy.wait('@saveMana').its('response.statusCode').should('eq', 200); handleVnConfirm(); + cy.wait('@updateDiscount').its('response.statusCode').should('eq', 204); cy.get('[data-col-field="discount"]') .find('.q-btn > .q-btn__content') @@ -51,6 +52,8 @@ describe('TicketSale', () => { const concept = Math.floor(Math.random() * 100) + 1; cy.waitForElement(firstRow); cy.get('[data-col-field="item"]').click(); + cy.intercept('POST', '**/api').as('postRequest'); + cy.get('.q-menu') .find('[data-cy="undefined_input"]') .type(concept) @@ -63,6 +66,8 @@ describe('TicketSale', () => { const quantity = Math.floor(Math.random() * 100) + 1; cy.waitForElement(firstRow); cy.dataCy('ticketSaleQuantityInput').find('input').clear(); + cy.intercept('POST', '**/api').as('postRequest'); + cy.dataCy('ticketSaleQuantityInput') .find('input') .type(quantity) @@ -134,7 +139,9 @@ describe('TicketSale', () => { cy.dataCy('ticketSaleMoreActionsDropdown').should('be.disabled'); }); - it('should update discount when "Update discount" is clicked', () => { + it.only('should update discount when "Update discount" is clicked', () => { + const discount = Number((Math.random() * 99 + 1).toFixed(2)); + selectFirstRow(); cy.dataCy('ticketSaleMoreActionsDropdown').click(); cy.waitForElement('[data-cy="updateDiscountItem"]'); @@ -142,11 +149,13 @@ describe('TicketSale', () => { cy.dataCy('updateDiscountItem').click(); cy.waitForElement('[data-cy="ticketSaleDiscountInput"]'); cy.dataCy('ticketSaleDiscountInput').find('input').focus(); - cy.dataCy('ticketSaleDiscountInput').find('input').type('10'); - cy.intercept('POST', '**/api').as('saveMana'); + cy.intercept('POST', /\/api\/Tickets\/\d+\/updateDiscount/).as( + 'updateDiscount', + ); + cy.dataCy('ticketSaleDiscountInput').find('input').type(discount); cy.dataCy('saveManaBtn').click(); - cy.wait('@saveMana').its('response.statusCode').should('eq', 200); + cy.wait('@updateDiscount').its('response.statusCode').should('eq', 204); cy.checkNotification('Data saved'); cy.dataCy('ticketSaleMoreActionsDropdown').should('be.disabled'); }); @@ -202,5 +211,6 @@ function selectFirstRow() { } function handleVnConfirm() { cy.confirmVnConfirm(); + cy.checkNotification('Data saved'); } From 6df58d021a8094e280d3687052ffed9254b395c2 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 2 Apr 2025 15:25:27 +0200 Subject: [PATCH 40/55] test: refs #7356 ticketSaleTracking --- .../integration/ticket/ticketSaleTracking.spec.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/test/cypress/integration/ticket/ticketSaleTracking.spec.js b/test/cypress/integration/ticket/ticketSaleTracking.spec.js index 78f17f771..9ee9f8824 100644 --- a/test/cypress/integration/ticket/ticketSaleTracking.spec.js +++ b/test/cypress/integration/ticket/ticketSaleTracking.spec.js @@ -13,6 +13,13 @@ function checkedSVG(className, state) { 'none', ); } + +function clickIconAndCloseDialog(n) { + cy.get( + `:nth-child(1) > :nth-child(6) > :nth-child(${n}) > .q-btn__content > .q-icon`, + ).click(); +} + describe('TicketSaleTracking', () => { beforeEach(() => { cy.login('developer'); @@ -33,15 +40,14 @@ describe('TicketSaleTracking', () => { cy.get( ':nth-child(1) > :nth-child(6) > :nth-child(2) > .q-btn__content > .q-icon', ).click(); - cy.get('.q-dialog__backdrop').click(); + cy.get('body').type('{esc}'); cy.get( ':nth-child(1) > :nth-child(6) > :nth-child(1) > .q-btn__content > .q-icon', ).click(); - cy.get('.q-dialog__backdrop').click(); cy.get( - ':nth-child(1) > :nth-child(2) > div > .link > .q-btn > .q-btn__content', + '.q-dialog__inner > .q-table__container :nth-child(1) > :nth-child(2) .link.q-btn', ).click(); - cy.dataCy('ItemDescriptor').should('exist'); + cy.dataCy('WorkerDescriptor').should('exist'); }); }); From fd036138e4a69699000bd2b0a4c2fe4bbc8e270f Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Thu, 3 Apr 2025 00:40:52 +0200 Subject: [PATCH 41/55] chore: update dependencies and configuration for vue-i18n and eslint --- package.json | 8 +- pnpm-lock.yaml | 1124 ++++++++++++++++++++++++++++++++++++++++------ vitest.config.js | 13 +- 3 files changed, 1005 insertions(+), 140 deletions(-) diff --git a/package.json b/package.json index dd6a5a86b..c24a13ea9 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,10 @@ "quasar": "^2.17.7", "validator": "^13.9.0", "vue": "^3.5.13", - "vue-i18n": "^9.3.0", + "vue-i18n": "^9.4.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "^9.20.0", + "@intlify/unplugin-vue-i18n": "^4.0.0", "vue-router": "^4.2.5" }, "devDependencies": { @@ -51,10 +54,13 @@ "autoprefixer": "^10.4.14", "cypress": "^14.1.0", "cypress-mochawesome-reporter": "^3.8.2", + "eslint-plugin-import": "^2.31.0", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", + "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-cypress": "^4.1.0", "eslint-plugin-vue": "^9.32.0", + "globals": "^16.0.0", "husky": "^8.0.0", "junit-merge": "^2.0.0", "mocha": "^11.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 353a8e1a3..b9155b310 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,15 @@ settings: excludeLinksFromLockfile: false dependencies: + '@eslint/eslintrc': + specifier: ^3.2.0 + version: 3.2.0 + '@eslint/js': + specifier: ^9.20.0 + version: 9.20.0 + '@intlify/unplugin-vue-i18n': + specifier: ^4.0.0 + version: 4.0.0(vue-i18n@9.14.2) '@quasar/cli': specifier: ^2.4.1 version: 2.4.1 @@ -36,7 +45,7 @@ dependencies: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.3) vue-i18n: - specifier: ^9.3.0 + specifier: ^9.4.0 version: 9.14.2(vue@3.5.13) vue-router: specifier: ^4.2.5 @@ -49,9 +58,6 @@ devDependencies: '@commitlint/config-conventional': specifier: ^19.1.0 version: 19.7.1 - '@intlify/unplugin-vue-i18n': - specifier: ^0.8.2 - version: 0.8.2(vue-i18n@9.14.2) '@pinia/testing': specifier: ^0.1.2 version: 0.1.7(pinia@2.3.1)(vue@3.5.13) @@ -82,12 +88,21 @@ devDependencies: eslint-config-prettier: specifier: ^10.0.1 version: 10.0.1(eslint@9.20.1) + eslint-import-resolver-alias: + specifier: ^1.1.2 + version: 1.1.2(eslint-plugin-import@2.31.0) eslint-plugin-cypress: specifier: ^4.1.0 version: 4.1.0(eslint@9.20.1) + eslint-plugin-import: + specifier: ^2.31.0 + version: 2.31.0(eslint@9.20.1) eslint-plugin-vue: specifier: ^9.32.0 version: 9.32.0(eslint@9.20.1) + globals: + specifier: ^16.0.0 + version: 16.0.0 husky: specifier: ^8.0.0 version: 8.0.3 @@ -929,12 +944,10 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true /@eslint/js@9.20.0: resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true /@eslint/object-schema@2.1.6: resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} @@ -982,9 +995,9 @@ packages: engines: {node: '>=18'} dev: true - /@intlify/bundle-utils@4.0.0(vue-i18n@9.14.2): - resolution: {integrity: sha512-klXrYT9VXyKEXsD6UY3pShg0O5MPC07n0TZ5RrSs5ry6T1eZVolIFGJi9c3qcDrh1qjJxgikRnPBmD7qGDqbjw==} - engines: {node: '>= 12'} + /@intlify/bundle-utils@8.0.0(vue-i18n@9.14.2): + resolution: {integrity: sha512-1B++zykRnMwQ+20SpsZI1JCnV/YJt9Oq7AGlEurzkWJOFtFAVqaGc/oV36PBRYeiKnTbY9VYfjBimr2Vt42wLQ==} + engines: {node: '>= 14.16'} peerDependencies: petite-vue-i18n: '*' vue-i18n: '*' @@ -994,13 +1007,17 @@ packages: vue-i18n: optional: true dependencies: - '@intlify/message-compiler': 12.0.0-alpha.2 - '@intlify/shared': 12.0.0-alpha.2 - jsonc-eslint-parser: 1.4.1 - source-map: 0.6.1 + '@intlify/message-compiler': 9.14.2 + '@intlify/shared': 9.14.2 + acorn: 8.14.0 + escodegen: 2.1.0 + estree-walker: 2.0.2 + jsonc-eslint-parser: 2.4.0 + mlly: 1.7.4 + source-map-js: 1.2.1 vue-i18n: 9.14.2(vue@3.5.13) - yaml-eslint-parser: 0.3.2 - dev: true + yaml-eslint-parser: 1.3.0 + dev: false /@intlify/core-base@9.14.2: resolution: {integrity: sha512-DZyQ4Hk22sC81MP4qiCDuU+LdaYW91A6lCjq8AWPvY3+mGMzhGDfOCzvyR6YBQxtlPjFqMoFk9ylnNYRAQwXtQ==} @@ -1008,14 +1025,7 @@ packages: dependencies: '@intlify/message-compiler': 9.14.2 '@intlify/shared': 9.14.2 - - /@intlify/message-compiler@12.0.0-alpha.2: - resolution: {integrity: sha512-PD9C+oQbb7BF52hec0+vLnScaFkvnfX+R7zSbODYuRo/E2niAtGmHd0wPvEMsDhf9Z9b8f/qyDsVeZnD/ya9Ug==} - engines: {node: '>= 16'} - dependencies: - '@intlify/shared': 12.0.0-alpha.2 - source-map-js: 1.2.1 - dev: true + dev: false /@intlify/message-compiler@9.14.2: resolution: {integrity: sha512-YsKKuV4Qv4wrLNsvgWbTf0E40uRv+Qiw1BeLQ0LAxifQuhiMe+hfTIzOMdWj/ZpnTDj4RSZtkXjJM7JDiiB5LQ==} @@ -1023,18 +1033,15 @@ packages: dependencies: '@intlify/shared': 9.14.2 source-map-js: 1.2.1 - - /@intlify/shared@12.0.0-alpha.2: - resolution: {integrity: sha512-P2DULVX9nz3y8zKNqLw9Es1aAgQ1JGC+kgpx5q7yLmrnAKkPR5MybQWoEhxanefNJgUY5ehsgo+GKif59SrncA==} - engines: {node: '>= 16'} - dev: true + dev: false /@intlify/shared@9.14.2: resolution: {integrity: sha512-uRAHAxYPeF+G5DBIboKpPgC/Waecd4Jz8ihtkpJQD5ycb5PwXp0k/+hBGl5dAjwF7w+l74kz/PKA8r8OK//RUw==} engines: {node: '>= 16'} + dev: false - /@intlify/unplugin-vue-i18n@0.8.2(vue-i18n@9.14.2): - resolution: {integrity: sha512-cRnzPqSEZQOmTD+p4pwc3RTS9HxreLqfID0keoqZDZweCy/CGRMLLTNd15S4TUf1vSBhPF03DItEFDr1F+8MDA==} + /@intlify/unplugin-vue-i18n@4.0.0(vue-i18n@9.14.2): + resolution: {integrity: sha512-q2Mhqa/mLi0tulfLFO4fMXXvEbkSZpI5yGhNNsLTNJJ41icEGUuyDe+j5zRZIKSkOJRgX6YbCyibTDJdRsukmw==} engines: {node: '>= 14.16'} peerDependencies: petite-vue-i18n: '*' @@ -1048,9 +1055,9 @@ packages: vue-i18n-bridge: optional: true dependencies: - '@intlify/bundle-utils': 4.0.0(vue-i18n@9.14.2) - '@intlify/shared': 12.0.0-alpha.2 - '@rollup/pluginutils': 4.2.1 + '@intlify/bundle-utils': 8.0.0(vue-i18n@9.14.2) + '@intlify/shared': 9.14.2 + '@rollup/pluginutils': 5.1.4 '@vue/compiler-sfc': 3.5.13 debug: 4.4.0(supports-color@8.1.1) fast-glob: 3.3.3 @@ -1058,12 +1065,13 @@ packages: json5: 2.2.3 pathe: 1.1.2 picocolors: 1.1.1 - source-map: 0.6.1 + source-map-js: 1.2.1 unplugin: 1.16.1 vue-i18n: 9.14.2(vue@3.5.13) transitivePeerDependencies: + - rollup - supports-color - dev: true + dev: false /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -1139,12 +1147,12 @@ packages: dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true + dev: false /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true + dev: false /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} @@ -1152,7 +1160,7 @@ packages: dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.0 - dev: true + dev: false /@one-ini/wasm@0.1.1: resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} @@ -1523,13 +1531,19 @@ packages: vue: 3.5.13(typescript@5.7.3) dev: true - /@rollup/pluginutils@4.2.1: - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} + /@rollup/pluginutils@5.1.4: + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true dependencies: + '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 2.3.1 - dev: true + picomatch: 4.0.2 + dev: false /@rollup/rollup-android-arm-eabi@4.34.8: resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} @@ -1683,6 +1697,10 @@ packages: dev: true optional: true + /@rtsao/scc@1.1.0: + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + dev: true + /@sindresorhus/is@4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -1764,7 +1782,6 @@ packages: /@types/estree@1.0.6: resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - dev: true /@types/express-serve-static-core@4.19.6: resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} @@ -2112,33 +2129,17 @@ packages: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-jsx@5.3.2(acorn@7.4.1): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 7.4.1 - dev: true - /acorn-jsx@5.3.2(acorn@8.14.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.14.0 - dev: true - - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true /acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -2155,7 +2156,6 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true /ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -2247,6 +2247,13 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 dev: true /array-flatten@1.1.1: @@ -2256,6 +2263,64 @@ packages: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + dev: true + + /array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + dev: true + + /arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + dev: true + /asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: @@ -2277,6 +2342,11 @@ packages: engines: {node: '>=8'} dev: true + /async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + dev: true + /async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} dev: true @@ -2305,6 +2375,13 @@ packages: postcss-value-parser: 4.2.0 dev: true + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.1.0 + dev: true + /aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} dev: true @@ -2553,6 +2630,16 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + dev: true + /call-bound@1.0.3: resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} @@ -2560,10 +2647,17 @@ packages: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.2.7 + /call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + dev: true + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - dev: true /camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} @@ -2882,7 +2976,6 @@ packages: /confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - dev: true /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -3132,6 +3225,33 @@ packages: assert-plus: 1.0.0 dev: true + /data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true @@ -3274,6 +3394,15 @@ packages: engines: {node: '>=10'} dev: false + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -3283,6 +3412,15 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -3313,6 +3451,13 @@ packages: engines: {node: '>=0.3.1'} dev: true + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: @@ -3462,6 +3607,63 @@ packages: is-arrayish: 0.2.1 dev: true + /es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + dev: true + /es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -3489,6 +3691,22 @@ packages: has-tostringtag: 1.0.2 hasown: 2.0.2 + /es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + dev: true + /esbuild@0.24.2: resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} @@ -3578,6 +3796,18 @@ packages: engines: {node: '>=10'} dev: true + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + /eslint-config-prettier@10.0.1(eslint@9.20.1): resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} hasBin: true @@ -3587,6 +3817,53 @@ packages: eslint: 9.20.1 dev: true + /eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0): + resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} + engines: {node: '>= 4'} + peerDependencies: + eslint-plugin-import: '>=1.4.0' + dependencies: + eslint-plugin-import: 2.31.0(eslint@9.20.1) + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7(supports-color@8.1.1) + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.20.1): + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + debug: 3.2.7(supports-color@8.1.1) + eslint: 9.20.1 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + /eslint-plugin-cypress@4.1.0(eslint@9.20.1): resolution: {integrity: sha512-JhqkMY02mw74USwK9OFhectx3YSj6Co1NgWBxlGdKvlqiAp9vdEuQqt33DKGQFvvGS/NWtduuhWXWNnU29xDSg==} peerDependencies: @@ -3596,6 +3873,42 @@ packages: globals: 15.15.0 dev: true + /eslint-plugin-import@2.31.0(eslint@9.20.1): + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7(supports-color@8.1.1) + doctrine: 2.1.0 + eslint: 9.20.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.20.1) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-plugin-vue@9.32.0(eslint@9.20.1): resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==} engines: {node: ^14.17.0 || >=16.0.0} @@ -3631,27 +3944,13 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - dev: true - - /eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - dev: true - /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true /eslint-visitor-keys@4.2.0: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true /eslint@9.20.1: resolution: {integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==} @@ -3708,16 +4007,6 @@ packages: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 - dev: true - - /espree@6.2.1: - resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} - engines: {node: '>=6.0.0'} - dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - eslint-visitor-keys: 1.3.0 - dev: true /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} @@ -3726,7 +4015,12 @@ packages: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 - dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false /esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -3745,7 +4039,6 @@ packages: /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - dev: true /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -3759,7 +4052,6 @@ packages: /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - dev: true /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} @@ -3924,7 +4216,6 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} @@ -3939,11 +4230,10 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 - dev: true + dev: false /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -3957,7 +4247,7 @@ packages: resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} dependencies: reusify: 1.0.4 - dev: true + dev: false /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -4061,6 +4351,13 @@ packages: optional: true dev: false + /for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: true + /foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -4157,6 +4454,22 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + /function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -4177,6 +4490,22 @@ packages: hasown: 2.0.2 math-intrinsics: 1.1.0 + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + dev: true + /get-port@7.1.0: resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} engines: {node: '>=16'} @@ -4200,6 +4529,15 @@ packages: engines: {node: '>=10'} dev: false + /get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + dev: true + /getos@3.2.1: resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} dependencies: @@ -4227,7 +4565,6 @@ packages: engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - dev: true /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} @@ -4286,13 +4623,25 @@ packages: /globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - dev: true /globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} dev: true + /globals@16.0.0: + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + engines: {node: '>=18'} + dev: true + + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + dev: true + /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true @@ -4366,10 +4715,28 @@ packages: whatwg-mimetype: 3.0.0 dev: true + /has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + dev: true + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.1 + dev: true + + /has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + dev: true + /has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -4519,7 +4886,6 @@ packages: /ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - dev: true /immutable@5.0.3: resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} @@ -4531,7 +4897,6 @@ packages: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true /import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} @@ -4591,6 +4956,15 @@ packages: yoctocolors-cjs: 2.1.2 dev: true + /internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + dev: true + /ip@1.1.9: resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} dev: true @@ -4599,10 +4973,37 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + /is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + dev: true + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true + /is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + dependencies: + has-bigints: 1.1.0 + dev: true + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -4610,6 +5011,19 @@ packages: binary-extensions: 2.3.0 dev: true + /is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + /is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true @@ -4617,6 +5031,30 @@ packages: ci-info: 3.9.0 dev: false + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -4631,10 +5069,27 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + /is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -4660,11 +5115,24 @@ packages: engines: {node: '>=8'} dev: true + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true + /is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false + /is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -4694,6 +5162,28 @@ packages: isobject: 3.0.1 dev: true + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true + + /is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -4703,6 +5193,23 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false + /is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + dev: true + /is-text-path@2.0.0: resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} engines: {node: '>=8'} @@ -4710,6 +5217,13 @@ packages: text-extensions: 2.4.0 dev: true + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.19 + dev: true + /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -4718,6 +5232,26 @@ packages: engines: {node: '>=10'} dev: true + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true + + /is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + + /is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + dev: true + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -4739,6 +5273,10 @@ packages: /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + /isbinaryfile@5.0.4: resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==} engines: {node: '>= 18.0.0'} @@ -4795,7 +5333,6 @@ packages: hasBin: true dependencies: argparse: 2.0.1 - dev: true /jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} @@ -4810,7 +5347,6 @@ packages: /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -4839,18 +5375,17 @@ packages: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - dev: true + dev: false - /jsonc-eslint-parser@1.4.1: - resolution: {integrity: sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==} - engines: {node: '>=8.10.0'} + /jsonc-eslint-parser@2.4.0: + resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 7.4.1 - eslint-utils: 2.1.0 - eslint-visitor-keys: 1.3.0 - espree: 6.2.1 - semver: 6.3.1 - dev: true + acorn: 8.14.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + semver: 7.7.1 + dev: false /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -5128,7 +5663,7 @@ packages: /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - dev: true + dev: false /merge@2.1.1: resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} @@ -5228,6 +5763,15 @@ packages: dependencies: minimist: 1.2.8 + /mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + dependencies: + acorn: 8.14.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 + dev: false + /mocha@11.1.0: resolution: {integrity: sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5421,6 +5965,52 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + dev: true + + /object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -5518,6 +6108,15 @@ packages: resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} dev: true + /own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + dev: true + /p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -5608,7 +6207,6 @@ packages: engines: {node: '>=6'} dependencies: callsites: 3.1.0 - dev: true /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -5654,6 +6252,10 @@ packages: engines: {node: '>=12'} dev: false + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + /path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -5667,11 +6269,10 @@ packages: /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true + dev: false /pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - dev: true /pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} @@ -5695,7 +6296,6 @@ packages: /picomatch@4.0.2: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - dev: true /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} @@ -5723,6 +6323,19 @@ packages: engines: {node: '>= 6'} dev: true + /pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + dev: false + + /possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + dev: true + /postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} @@ -5811,7 +6424,6 @@ packages: /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - dev: true /pupa@3.1.0: resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} @@ -5839,7 +6451,7 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + dev: false /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} @@ -5952,10 +6564,36 @@ packages: tslib: 1.14.1 dev: true + /reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + dev: true + /regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} dev: true + /regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + dev: true + /registry-auth-token@5.1.0: resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} engines: {node: '>=14'} @@ -6006,13 +6644,22 @@ packages: /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - dev: true /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true + /resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} dependencies: @@ -6037,7 +6684,7 @@ packages: /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + dev: false /rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} @@ -6129,7 +6776,7 @@ packages: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - dev: true + dev: false /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} @@ -6137,12 +6784,40 @@ packages: tslib: 2.8.1 dev: true + /safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + dev: true + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + /safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + dev: true + + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: true + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -6451,6 +7126,37 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + dev: true + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -6594,7 +7300,6 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: true /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} @@ -6664,6 +7369,38 @@ packages: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + /string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + dev: true + + /string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -6709,7 +7446,6 @@ packages: /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - dev: true /style-mod@4.1.2: resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} @@ -6742,6 +7478,11 @@ packages: dependencies: has-flag: 4.0.0 + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + /sync-child-process@1.0.2: resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==} engines: {node: '>=16.0.0'} @@ -6994,6 +7735,51 @@ packages: media-typer: 0.3.0 mime-types: 2.1.35 + /typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + dev: true + + /typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + dev: true + /typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: @@ -7009,6 +7795,10 @@ packages: engines: {node: '>=14.17'} hasBin: true + /ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + dev: false + /uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -7017,6 +7807,16 @@ packages: dev: true optional: true + /unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + dev: true + /undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} @@ -7051,7 +7851,7 @@ packages: dependencies: acorn: 8.14.0 webpack-virtual-modules: 0.6.2 - dev: true + dev: false /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} @@ -7092,7 +7892,6 @@ packages: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 - dev: true /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -7392,6 +8191,7 @@ packages: '@intlify/shared': 9.14.2 '@vue/devtools-api': 6.6.4 vue: 3.5.13(typescript@5.7.3) + dev: false /vue-router@4.5.0(vue@3.5.13): resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} @@ -7442,7 +8242,7 @@ packages: /webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - dev: true + dev: false /whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} @@ -7456,10 +8256,63 @@ packages: engines: {node: '>=12'} dev: true + /which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + dev: true + + /which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + dev: true + /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} dev: true + /which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: true + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -7629,18 +8482,19 @@ packages: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: false - /yaml-eslint-parser@0.3.2: - resolution: {integrity: sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==} + /yaml-eslint-parser@1.3.0: + resolution: {integrity: sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==} + engines: {node: ^14.17.0 || >=16.0.0} dependencies: - eslint-visitor-keys: 1.3.0 - lodash: 4.17.21 - yaml: 1.10.2 - dev: true + eslint-visitor-keys: 3.4.3 + yaml: 2.7.1 + dev: false - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true + /yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + dev: false /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} diff --git a/vitest.config.js b/vitest.config.js index f856a1dc9..331d21ef9 100644 --- a/vitest.config.js +++ b/vitest.config.js @@ -5,12 +5,11 @@ import jsconfigPaths from 'vite-jsconfig-paths'; import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'; import path from 'path'; -let reporters, - outputFile; +let reporters, outputFile; if (process.env.CI) { reporters = ['junit', 'default']; - outputFile = {junit: './junit/vitest.xml'}; + outputFile = { junit: './junit/vitest.xml' }; } else { reporters = 'default'; } @@ -28,6 +27,9 @@ export default defineConfig({ 'src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}', ], }, + server: { + hmr: { overlay: false }, + }, plugins: [ vue({ template: { @@ -39,8 +41,11 @@ export default defineConfig({ sassVariables: 'src/quasar-variables.scss', }), VueI18nPlugin({ + strictMessage: false, + + runtimeOnly: false, include: [ - path.resolve(__dirname, 'src/i18n/**'), + path.resolve(__dirname, 'src/i18n/locale/**'), path.resolve(__dirname, 'src/pages/**/locale/**'), ], }), From d406715a70cb6713a426a450cfcc7e926cfc10d0 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Thu, 3 Apr 2025 00:56:54 +0200 Subject: [PATCH 42/55] test: improve test --- src/components/__tests__/Leftmenu.spec.js | 12 +++++----- src/components/common/__tests__/VnDms.spec.js | 24 ++++++++++++------- .../common/__tests__/VnNotes.spec.js | 3 ++- .../__tests__/useNavigationStore.spec.js | 16 +++++++------ 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/components/__tests__/Leftmenu.spec.js b/src/components/__tests__/Leftmenu.spec.js index d53bb8860..22b2b5fb7 100644 --- a/src/components/__tests__/Leftmenu.spec.js +++ b/src/components/__tests__/Leftmenu.spec.js @@ -1,7 +1,7 @@ -import { vi, describe, expect, it, beforeAll } from 'vitest'; -import axios from 'axios'; +import { vi, describe, expect, it, beforeAll, afterEach, beforeEach } from 'vitest'; +import { default as axios } from 'axios'; import { createWrapper } from 'app/test/vitest/helper'; -import Leftmenu from 'components/LeftMenu.vue'; +import LeftMenu from 'components/LeftMenu.vue'; import * as vueRouter from 'vue-router'; import { useNavigationStore } from 'src/stores/useNavigationStore'; @@ -102,7 +102,7 @@ function mount(source = 'main') { vi.spyOn(axios, 'get').mockResolvedValue({ data: [], }); - const wrapper = createWrapper(Leftmenu, { + const wrapper = createWrapper(LeftMenu, { propsData: { source, }, @@ -165,7 +165,7 @@ describe('getRoutes', () => { }); }); -describe('Leftmenu as card', () => { +describe('LeftMenu as card', () => { beforeAll(() => { vm = mount('card').vm; }); @@ -174,7 +174,7 @@ describe('Leftmenu as card', () => { vm.getRoutes(); }); }); -describe('Leftmenu as main', () => { +describe('LeftMenu as main', () => { beforeEach(() => { vm = mount().vm; }); diff --git a/src/components/common/__tests__/VnDms.spec.js b/src/components/common/__tests__/VnDms.spec.js index 03028aee7..66d946db3 100644 --- a/src/components/common/__tests__/VnDms.spec.js +++ b/src/components/common/__tests__/VnDms.spec.js @@ -1,4 +1,5 @@ -import { createWrapper, axios } from 'app/test/vitest/helper'; +import { createWrapper } from 'app/test/vitest/helper'; +import { default as axios } from 'axios'; import { vi, afterEach, beforeEach, beforeAll, describe, expect, it } from 'vitest'; import VnDms from 'src/components/common/VnDms.vue'; @@ -40,7 +41,10 @@ describe('VnDms', () => { companyFk: 2, dmsTypeFk: 3, description: 'This is a test description', - files: { name: 'example.txt', content: new Blob(['file content'], { type: 'text/plain' })}, + files: { + name: 'example.txt', + content: new Blob(['file content'], { type: 'text/plain' }), + }, }; const expectedBody = { @@ -59,7 +63,7 @@ describe('VnDms', () => { url: '/test', formInitialData: { id: 1, reference: 'test' }, model: 'Worker', - } + }, }); wrapper = wrapper.wrapper; vm = wrapper.vm; @@ -98,7 +102,7 @@ describe('VnDms', () => { expect(vm.getUrl()).toBe('/test'); }); - it('should returns url dms/"props.formInitialData.id"/updateFile when prop url is null', async () => { + it('should returns url dms/"props.formInitialData.id"/updateFile when prop url is null', async () => { await wrapper.setProps({ url: null }); expect(vm.getUrl()).toBe('dms/1/updateFile'); }); @@ -113,7 +117,9 @@ describe('VnDms', () => { describe('save', () => { it('should save data correctly', async () => { await vm.save(); - expect(postMock).toHaveBeenCalledWith(vm.getUrl(), expect.any(FormData), { params: expectedBody }); + expect(postMock).toHaveBeenCalledWith(vm.getUrl(), expect.any(FormData), { + params: expectedBody, + }); expect(wrapper.emitted('onDataSaved')).toBeTruthy(); }); }); @@ -127,8 +133,8 @@ describe('VnDms', () => { warehouseFk: 2, companyFk: 3, dmsTypeFk: 2, - description: 'This is a test description' - } + description: 'This is a test description', + }; await wrapper.setProps({ formInitialData: testData }); vm.defaultData(); @@ -137,10 +143,10 @@ describe('VnDms', () => { it('should add reference with "route.params.id" to dms if formInitialData is null', async () => { await wrapper.setProps({ formInitialData: null }); - vm.route.params.id= '111'; + vm.route.params.id = '111'; vm.defaultData(); expect(vm.dms.reference).toBe('111'); }); }); -}); \ No newline at end of file +}); diff --git a/src/components/common/__tests__/VnNotes.spec.js b/src/components/common/__tests__/VnNotes.spec.js index ea595060a..e0514cc7b 100644 --- a/src/components/common/__tests__/VnNotes.spec.js +++ b/src/components/common/__tests__/VnNotes.spec.js @@ -1,5 +1,6 @@ import { describe, it, expect, vi, afterEach, beforeEach, afterAll } from 'vitest'; -import { createWrapper, axios } from 'app/test/vitest/helper'; +import { createWrapper } from 'app/test/vitest/helper'; +import { default as axios } from 'axios'; import VnNotes from 'src/components/ui/VnNotes.vue'; describe('VnNotes', () => { diff --git a/src/stores/__tests__/useNavigationStore.spec.js b/src/stores/__tests__/useNavigationStore.spec.js index c5df6157e..120fa64cb 100644 --- a/src/stores/__tests__/useNavigationStore.spec.js +++ b/src/stores/__tests__/useNavigationStore.spec.js @@ -1,15 +1,17 @@ import { setActivePinia, createPinia } from 'pinia'; -import { describe, beforeEach, afterEach, it, expect, vi, beforeAll } from 'vitest'; +import { describe, beforeEach, afterEach, it, expect, vi } from 'vitest'; import { useNavigationStore } from '../useNavigationStore'; -import axios from 'axios'; +import { default as axios } from 'axios'; let store; -vi.mock('src/router/modules', () => [ - { name: 'Item', meta: {} }, - { name: 'Shelving', meta: {} }, - { name: 'Order', meta: {} }, -]); +vi.mock('src/router/modules', () => ({ + default: [ + { name: 'Item', meta: {} }, + { name: 'Shelving', meta: {} }, + { name: 'Order', meta: {} }, + ], +})); vi.mock('src/filters', () => ({ toLowerCamel: vi.fn((name) => name.toLowerCase()), From d78460a438c99e878523ec26b444ab950d5c25eb Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Thu, 3 Apr 2025 01:24:00 +0200 Subject: [PATCH 43/55] test: add unit tests for useArrayDataStore and mock axios in axios.spec.js --- src/boot/__tests__/axios.spec.js | 26 ++++- .../__tests__/useArrayDataStore.spec.js | 95 +++++++++++++++++++ 2 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 src/stores/__tests__/useArrayDataStore.spec.js diff --git a/src/boot/__tests__/axios.spec.js b/src/boot/__tests__/axios.spec.js index 7dffaefc1..85d578517 100644 --- a/src/boot/__tests__/axios.spec.js +++ b/src/boot/__tests__/axios.spec.js @@ -9,6 +9,30 @@ vi.mock('src/composables/useSession', () => ({ }), })); +// Mock axios +vi.mock('axios', () => ({ + default: { + create: vi.fn(() => ({ + interceptors: { + request: { use: vi.fn() }, + response: { use: vi.fn() }, + }, + })), + interceptors: { + request: { use: vi.fn() }, + response: { use: vi.fn() }, + }, + defaults: { + baseURL: '', + }, + }, +})); + +vi.mock('src/router', () => ({ + Router: { + push: vi.fn(), + }, +})); vi.mock('src/stores/useStateQueryStore', () => ({ useStateQueryStore: () => ({ add: () => vi.fn(), @@ -29,7 +53,7 @@ describe('Axios boot', () => { 'Accept-Language': 'en-US', Authorization: 'DEFAULT_TOKEN', }, - }) + }), ); }); }); diff --git a/src/stores/__tests__/useArrayDataStore.spec.js b/src/stores/__tests__/useArrayDataStore.spec.js new file mode 100644 index 000000000..79f17cf69 --- /dev/null +++ b/src/stores/__tests__/useArrayDataStore.spec.js @@ -0,0 +1,95 @@ +import { describe, expect, it, beforeEach } from 'vitest'; +import { setActivePinia, createPinia } from 'pinia'; +import { useArrayDataStore } from '../useArrayDataStore'; + +describe('useArrayDataStore', () => { + beforeEach(() => { + setActivePinia(createPinia()); + }); + + it('should get undefined for non-existent key', () => { + const store = useArrayDataStore(); + expect(store.get('nonExistent')).toBeUndefined(); + }); + + it('should set default state for new key', () => { + const store = useArrayDataStore(); + store.set('test'); + const state = store.get('test'); + + expect(state).toMatchObject({ + filter: {}, + userFilter: {}, + userParams: {}, + url: '', + limit: 20, + skip: 0, + order: '', + isLoading: false, + userParamsChanged: false, + exprBuilder: null, + searchUrl: 'params', + navigate: null, + page: 1, + mapKey: 'id', + oneRecord: false, + }); + }); + + it('should clear state for specific key', () => { + const store = useArrayDataStore(); + store.set('test'); + store.clear('test'); + expect(store.get('test')).toBeUndefined(); + }); + + it('should reset all properties when no options provided', () => { + const store = useArrayDataStore(); + store.set('test'); + const state = store.get('test'); + state.limit = 50; + state.page = 3; + + store.reset('test'); + expect(store.get('test').limit).toBe(20); + expect(store.get('test').page).toBe(1); + }); + + it('should reset only specified properties', () => { + const store = useArrayDataStore(); + store.set('test'); + const state = store.get('test'); + state.limit = 50; + state.page = 3; + state.url = 'test-url'; + + store.reset('test', ['limit', 'page']); + expect(state.limit).toBe(20); + expect(state.page).toBe(1); + expect(state.url).toBe('test-url'); + }); + + it('should reset nested properties', () => { + const store = useArrayDataStore(); + store.set('test'); + const state = store.get('test'); + state.filter.skip = 10; + + store.reset('test', ['filter.skip']); + expect(state.filter.skip).toBe(0); + }); + + it('should reset pagination properties', () => { + const store = useArrayDataStore(); + store.set('test'); + const state = store.get('test'); + state.skip = 20; + state.filter.skip = 20; + state.page = 3; + + store.resetPagination('test'); + expect(state.skip).toBe(0); + expect(state.filter.skip).toBe(0); + expect(state.page).toBe(1); + }); +}); From c08b3648f248b304216f3299a26b5ebaf3e2e656 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Thu, 3 Apr 2025 01:36:30 +0200 Subject: [PATCH 44/55] test: arrayData --- .../__tests__/useArrayData.spec.js | 141 ++++++++---------- src/composables/useArrayData.js | 3 +- 2 files changed, 66 insertions(+), 78 deletions(-) diff --git a/src/composables/__tests__/useArrayData.spec.js b/src/composables/__tests__/useArrayData.spec.js index fb5b99ff6..a3fbbdd5d 100644 --- a/src/composables/__tests__/useArrayData.spec.js +++ b/src/composables/__tests__/useArrayData.spec.js @@ -1,16 +1,39 @@ import { describe, expect, it, beforeEach, afterEach, vi } from 'vitest'; -import axios from 'axios'; -import { flushPromises } from 'app/test/vitest/helper'; +import { default as axios } from 'axios'; import { useArrayData } from 'composables/useArrayData'; import { useRouter } from 'vue-router'; import * as vueRouter from 'vue-router'; +import { setActivePinia, createPinia } from 'pinia'; describe('useArrayData', () => { const filter = '{"limit":20,"skip":0}'; const params = { supplierFk: 2 }; + beforeEach(() => { - vi.spyOn(useRouter(), 'replace'); - vi.spyOn(useRouter(), 'push'); + setActivePinia(createPinia()); + + // Mock route + vi.spyOn(vueRouter, 'useRoute').mockReturnValue({ + path: 'mockSection/list', + matched: [], + query: {}, + params: {}, + meta: { moduleName: 'mockName' }, + }); + + // Mock router + vi.spyOn(vueRouter, 'useRouter').mockReturnValue({ + push: vi.fn(), + replace: vi.fn(), + currentRoute: { + value: { + path: 'mockSection/list', + params: { id: 1 }, + meta: { moduleName: 'mockName' }, + matched: [{ path: 'mockName/:id' }], + }, + }, + }); }); afterEach(() => { @@ -18,103 +41,69 @@ describe('useArrayData', () => { }); it('should fetch and replace url with new params', async () => { - vi.spyOn(axios, 'get').mockReturnValueOnce({ data: [] }); + vi.spyOn(axios, 'get').mockResolvedValueOnce({ data: [] }); - const arrayData = useArrayData('ArrayData', { url: 'mockUrl' }); + const arrayData = useArrayData('ArrayData', { + url: 'mockUrl', + searchUrl: 'params', + }); arrayData.store.userParams = params; - arrayData.fetch({}); + await arrayData.fetch({}); - await flushPromises(); - let routerReplace = useRouter().replace; - routerReplace = routerReplace.mock.calls[0][0]; - expect(axios.get.mock.calls[0][1].params).toEqual({ - filter, - supplierFk: 2, + const routerReplace = useRouter().replace.mock.calls[0][0]; + + expect(axios.get).toHaveBeenCalledWith('mockUrl', { + signal: expect.any(Object), + params: { + filter, + supplierFk: 2, + }, }); - expect(routerReplace.path).toEqual('mockSection/list'); + + expect(routerReplace.path).toBe('mockSection/list'); expect(JSON.parse(routerReplace.query.params)).toEqual( expect.objectContaining(params), ); }); - it('should get data and send new URL without keeping parameters, if there is only one record', async () => { - vi.spyOn(axios, 'get').mockReturnValueOnce({ data: [{ id: 1 }] }); + it('should redirect to detail when single record is returned with navigation', async () => { + vi.spyOn(axios, 'get').mockResolvedValueOnce({ + data: [{ id: 1 }], + }); - const arrayData = useArrayData('ArrayData', { url: 'mockUrl', navigate: {} }); + const arrayData = useArrayData('ArrayData', { + url: 'mockUrl', + navigate: {}, + }); arrayData.store.userParams = params; - arrayData.fetch({}); + await arrayData.fetch({}); - await flushPromises(); const routerPush = useRouter().push.mock.calls[0][0]; - expect(axios.get.mock.calls[0][1].params).toEqual({ - filter, - supplierFk: 2, - }); - expect(routerPush.path).toEqual('mockName/1'); + expect(routerPush.path).toBe('mockName/1'); expect(routerPush.query).toBeUndefined(); }); - it('should get data and send new URL keeping parameters, if you have more than one record', async () => { - vi.spyOn(axios, 'get').mockReturnValueOnce({ data: [{ id: 1 }, { id: 2 }] }); - - vi.spyOn(vueRouter, 'useRoute').mockReturnValue({ - matched: [], - query: {}, - params: {}, - meta: { moduleName: 'mockName' }, - path: 'mockName/1', - }); - vi.spyOn(vueRouter, 'useRouter').mockReturnValue({ - push: vi.fn(), - replace: vi.fn(), - currentRoute: { - value: { - params: { - id: 1, - }, - meta: { moduleName: 'mockName' }, - matched: [{ path: 'mockName/:id' }], - }, - }, - }); - - const arrayData = useArrayData('ArrayData', { url: 'mockUrl', navigate: {} }); - - arrayData.store.userParams = params; - arrayData.fetch({}); - - await flushPromises(); - const routerPush = useRouter().push.mock.calls[0][0]; - - expect(axios.get.mock.calls[0][1].params).toEqual({ - filter, - supplierFk: 2, - }); - expect(routerPush.path).toEqual('mockName/'); - expect(routerPush.query.params).toBeDefined(); - }); - - it('should return one record', async () => { - vi.spyOn(axios, 'get').mockReturnValueOnce({ + it('should return one record when oneRecord is true', async () => { + vi.spyOn(axios, 'get').mockResolvedValueOnce({ data: [ { id: 1, name: 'Entity 1' }, { id: 2, name: 'Entity 2' }, ], }); - const arrayData = useArrayData('ArrayData', { url: 'mockUrl', oneRecord: true }); + + const arrayData = useArrayData('ArrayData', { + url: 'mockUrl', + oneRecord: true, + }); + await arrayData.fetch({}); - expect(arrayData.store.data).toEqual({ id: 1, name: 'Entity 1' }); - }); - - it('should handle empty data gracefully if has to return one record', async () => { - vi.spyOn(axios, 'get').mockReturnValueOnce({ data: [] }); - const arrayData = useArrayData('ArrayData', { url: 'mockUrl', oneRecord: true }); - await arrayData.fetch({}); - - expect(arrayData.store.data).toBeUndefined(); + expect(arrayData.store.data).toEqual({ + id: 1, + name: 'Entity 1', + }); }); }); diff --git a/src/composables/useArrayData.js b/src/composables/useArrayData.js index a17730754..2e880a16d 100644 --- a/src/composables/useArrayData.js +++ b/src/composables/useArrayData.js @@ -5,12 +5,11 @@ import { useArrayDataStore } from 'stores/useArrayDataStore'; import { buildFilter } from 'filters/filterPanel'; import { isDialogOpened } from 'src/filters'; -const arrayDataStore = useArrayDataStore(); - export function useArrayData(key, userOptions) { key ??= useRoute().meta.moduleName; if (!key) throw new Error('ArrayData: A key is required to use this composable'); + const arrayDataStore = useArrayDataStore(); // Move inside function if (!arrayDataStore.get(key)) arrayDataStore.set(key); From 103835d08b30f61104be451445acbd39546cf445 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 4 Apr 2025 08:53:05 +0200 Subject: [PATCH 45/55] fix: update date formatting in VnJsonValue component to include hours, minutes, and seconds --- src/components/common/VnJsonValue.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/common/VnJsonValue.vue b/src/components/common/VnJsonValue.vue index a2e858d0d..5fa34f560 100644 --- a/src/components/common/VnJsonValue.vue +++ b/src/components/common/VnJsonValue.vue @@ -1,6 +1,6 @@ <script setup> import { watch } from 'vue'; -import { toDateString } from 'src/filters'; +import { toDateHourMinSec } from 'src/filters'; const props = defineProps({ value: { type: [String, Number, Boolean, Object], default: undefined }, @@ -40,7 +40,9 @@ const updateValue = () => { break; case 'object': if (props.value instanceof Date) { - t = toDateString(props.value); + console.log('props.value: ', props.value); + t = toDateHourMinSec(props.value); + console.log('t: ', t); } else { t = props.value.toString(); } From a84743d890af78da5a07a149d853b8a0b84c6a8e Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 4 Apr 2025 08:53:40 +0200 Subject: [PATCH 46/55] fix: remove debug logging from updateValue function in VnJsonValue component --- src/components/common/VnJsonValue.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/common/VnJsonValue.vue b/src/components/common/VnJsonValue.vue index 5fa34f560..ba37ab1d6 100644 --- a/src/components/common/VnJsonValue.vue +++ b/src/components/common/VnJsonValue.vue @@ -40,9 +40,7 @@ const updateValue = () => { break; case 'object': if (props.value instanceof Date) { - console.log('props.value: ', props.value); t = toDateHourMinSec(props.value); - console.log('t: ', t); } else { t = props.value.toString(); } From 3349aebddeaa6027eb0b883ef6f999a115642517 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 4 Apr 2025 11:22:54 +0200 Subject: [PATCH 47/55] fix: update date display format in VnJsonValue tests to include time --- src/components/common/__tests__/VnJsonValue.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/common/__tests__/VnJsonValue.spec.js b/src/components/common/__tests__/VnJsonValue.spec.js index 393b39f3a..c3aa1a769 100644 --- a/src/components/common/__tests__/VnJsonValue.spec.js +++ b/src/components/common/__tests__/VnJsonValue.spec.js @@ -65,7 +65,7 @@ describe('VnJsonValue', () => { const date = new Date('2023-01-01'); const wrapper = buildComponent({ value: date }); const span = wrapper.find('span'); - expect(span.text()).toBe('2023-01-01'); + expect(span.text()).toBe('01/01/2023, 01:00:00'); expect(span.classes()).toContain('json-object'); }); From 5edf3f7efe0e3705dab2fb9c0432b786d4a4e909 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Mon, 7 Apr 2025 12:34:48 +0200 Subject: [PATCH 48/55] fix: skip invoice transfer test in InvoiceOut summary --- test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js b/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js index 63e828f55..58307be05 100644 --- a/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js +++ b/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js @@ -37,7 +37,7 @@ describe('InvoiceOut summary', () => { }); }); - it('should transfer the invoice ', () => { + it.skip('should transfer the invoice ', () => { cy.typeSearchbar('T1111111{enter}'); cy.dataCy('descriptor-more-opts').click(); cy.get(selectMenuOption(1)).click(); From 2cb151e1816b8ca315fc5e6e88055fd4e604a563 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 7 Apr 2025 17:43:06 +0200 Subject: [PATCH 49/55] fix: update pnpm-lock.yaml --- pnpm-lock.yaml | 61 +++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1db1586f..35b1a9ea8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,9 +11,6 @@ dependencies: '@eslint/js': specifier: ^9.20.0 version: 9.24.0 - '@intlify/unplugin-vue-i18n': - specifier: ^4.0.0 - version: 4.0.0(vue-i18n@9.14.4) '@quasar/cli': specifier: ^2.4.1 version: 2.5.0 @@ -64,6 +61,9 @@ devDependencies: '@commitlint/config-conventional': specifier: ^19.1.0 version: 19.8.0 + '@intlify/unplugin-vue-i18n': + specifier: ^4.0.0 + version: 4.0.0(vue-i18n@9.14.4) '@pinia/testing': specifier: ^0.1.2 version: 0.1.7(pinia@2.3.1)(vue@3.5.13) @@ -813,7 +813,7 @@ packages: source-map-js: 1.2.1 vue-i18n: 9.14.4(vue@3.5.13) yaml-eslint-parser: 1.3.0 - dev: false + dev: true /@intlify/core-base@9.14.4: resolution: {integrity: sha512-vtZCt7NqWhKEtHa3SD/322DlgP5uR9MqWxnE0y8Q0tjDs9H5Lxhss+b5wv8rmuXRoHKLESNgw9d+EN9ybBbj9g==} @@ -821,7 +821,6 @@ packages: dependencies: '@intlify/message-compiler': 9.14.4 '@intlify/shared': 9.14.4 - dev: false /@intlify/message-compiler@9.14.4: resolution: {integrity: sha512-vcyCLiVRN628U38c3PbahrhbbXrckrM9zpy0KZVlDk2Z0OnGwv8uQNNXP3twwGtfLsCf4gu3ci6FMIZnPaqZsw==} @@ -829,12 +828,10 @@ packages: dependencies: '@intlify/shared': 9.14.4 source-map-js: 1.2.1 - dev: false /@intlify/shared@9.14.4: resolution: {integrity: sha512-P9zv6i1WvMc9qDBWvIgKkymjY2ptIiQ065PjDv7z7fDqH3J/HBRBN5IoiR46r/ujRcU7hCuSIZWvCAFCyuOYZA==} engines: {node: '>= 16'} - dev: false /@intlify/unplugin-vue-i18n@4.0.0(vue-i18n@9.14.4): resolution: {integrity: sha512-q2Mhqa/mLi0tulfLFO4fMXXvEbkSZpI5yGhNNsLTNJJ41icEGUuyDe+j5zRZIKSkOJRgX6YbCyibTDJdRsukmw==} @@ -867,7 +864,7 @@ packages: transitivePeerDependencies: - rollup - supports-color - dev: false + dev: true /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -943,12 +940,10 @@ packages: dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: false /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: false /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} @@ -956,7 +951,6 @@ packages: dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - dev: false /@one-ini/wasm@0.1.1: resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} @@ -1340,7 +1334,7 @@ packages: '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 - dev: false + dev: true /@rollup/rollup-android-arm-eabi@4.39.0: resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} @@ -1587,6 +1581,7 @@ packages: /@types/estree@1.0.7: resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + dev: true /@types/express-serve-static-core@4.19.6: resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} @@ -2767,6 +2762,7 @@ packages: /confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + dev: true /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -3563,7 +3559,7 @@ packages: esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 - dev: false + dev: true /eslint-config-prettier@10.1.1(eslint@9.24.0): resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} @@ -3704,6 +3700,7 @@ packages: /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true /eslint-visitor-keys@4.2.0: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} @@ -3773,12 +3770,13 @@ packages: acorn: 8.14.1 acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 3.4.3 + dev: true /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - dev: false + dev: true /esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -3797,6 +3795,7 @@ packages: /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + dev: true /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -3810,6 +3809,7 @@ packages: /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + dev: true /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} @@ -3988,7 +3988,6 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 - dev: false /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -4005,7 +4004,6 @@ packages: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} dependencies: reusify: 1.1.0 - dev: false /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -5117,7 +5115,7 @@ packages: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - dev: false + dev: true /jsonc-eslint-parser@2.4.0: resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} @@ -5127,7 +5125,7 @@ packages: eslint-visitor-keys: 3.4.3 espree: 9.6.1 semver: 7.7.1 - dev: false + dev: true /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -5405,7 +5403,6 @@ packages: /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - dev: false /merge@2.1.1: resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} @@ -5511,7 +5508,8 @@ packages: acorn: 8.14.1 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.5.4 + ufo: 1.6.0 + dev: true /mocha@11.1.0: resolution: {integrity: sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==} @@ -6010,10 +6008,11 @@ packages: /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: false + dev: true /pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + dev: true /pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} @@ -6037,6 +6036,7 @@ packages: /picomatch@4.0.2: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + dev: true /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} @@ -6070,6 +6070,7 @@ packages: confbox: 0.1.8 mlly: 1.7.4 pathe: 2.0.3 + dev: true /possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} @@ -6191,7 +6192,6 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: false /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} @@ -6424,7 +6424,6 @@ packages: /reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: false /rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} @@ -6517,7 +6516,6 @@ packages: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - dev: false /rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -7041,6 +7039,7 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + dev: true /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} @@ -7536,8 +7535,9 @@ packages: engines: {node: '>=14.17'} hasBin: true - /ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + /ufo@1.6.0: + resolution: {integrity: sha512-AkgU2cV/+Xb4Uz6cic0kMZbtM42nbltnGvTVOt/8gMCbO2/z64nE47TOygh7HjgFPkUkVRBEyNFqpqi3zo+BJA==} + dev: true /uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} @@ -7591,7 +7591,7 @@ packages: dependencies: acorn: 8.14.1 webpack-virtual-modules: 0.6.2 - dev: false + dev: true /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} @@ -7882,7 +7882,6 @@ packages: '@intlify/shared': 9.14.4 '@vue/devtools-api': 6.6.4 vue: 3.5.13(typescript@5.8.3) - dev: false /vue-router@4.5.0(vue@3.5.13): resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} @@ -7933,7 +7932,7 @@ packages: /webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - dev: false + dev: true /whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} @@ -8179,13 +8178,13 @@ packages: dependencies: eslint-visitor-keys: 3.4.3 yaml: 2.7.1 - dev: false + dev: true /yaml@2.7.1: resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} engines: {node: '>= 14'} hasBin: true - dev: false + dev: true /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} From 15cbbab043541505ddb6dc168b0c9cb5725d43a4 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Tue, 8 Apr 2025 08:35:27 +0200 Subject: [PATCH 50/55] fix(WorkerPDA): fix translations --- src/pages/Worker/Card/WorkerPda.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue index e7478de1e..590cbc2b2 100644 --- a/src/pages/Worker/Card/WorkerPda.vue +++ b/src/pages/Worker/Card/WorkerPda.vue @@ -234,7 +234,7 @@ function isSigned(row) { data-cy="workerPda-download" > <QTooltip> - {{ t('worker.pda.download') }} + {{ t('globals.downloadPdf') }} </QTooltip> </QBtn> </template> @@ -307,4 +307,5 @@ es: This PDA is already assigned to another user: Este PDA ya está asignado a otro usuario Are you sure you want to send it?: ¿Seguro que quieres enviarlo? Sign PDA: Firmar PDA + PDF sended to signed: PDF enviado para firmar </i18n> From af0c30f798aa36940d596a691371996cd8146e19 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 8 Apr 2025 11:57:21 +0200 Subject: [PATCH 51/55] test: refs #8725 add save action to form model popup --- test/cypress/integration/item/itemSummary.spec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/cypress/integration/item/itemSummary.spec.js b/test/cypress/integration/item/itemSummary.spec.js index ad8267ecf..8d67c8e3c 100644 --- a/test/cypress/integration/item/itemSummary.spec.js +++ b/test/cypress/integration/item/itemSummary.spec.js @@ -19,6 +19,7 @@ describe('Item summary', () => { cy.get('.q-menu > .q-list > :nth-child(1) > .q-item__section').click(); cy.dataCy('regularizeStockInput').type('10'); cy.dataCy('Warehouse_select').type('Warehouse One{enter}'); + cy.dataCy('FormModelPopup_save').click(); cy.checkNotification('Data created'); }); }); From 1b695be63f1bb6bd596a2bb1a94a9e48099c3608 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 8 Apr 2025 13:30:22 +0200 Subject: [PATCH 52/55] feat: add vitest ui devDependency --- package.json | 7 ++++-- pnpm-lock.yaml | 57 +++++++++++++++++++++++++++++++++++++++++++----- vitest.config.js | 1 + 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index ccff022cf..19b4c7a6f 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,8 @@ "test:e2e:summary": "bash ./test/cypress/summary.sh", "test": "echo \"See package.json => scripts for available tests.\" && exit 0", "test:front": "vitest", + "test:ui": "vitest --ui", + "test:coverage": "vitest run --coverage", "test:front:ci": "vitest run", "commitlint": "commitlint --edit", "prepare": "npx husky install", @@ -27,6 +29,8 @@ "docs:preview": "vitepress preview docs" }, "dependencies": { + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "^9.20.0", "@quasar/cli": "^2.4.1", "@quasar/extras": "^1.16.16", "axios": "^1.4.0", @@ -40,8 +44,6 @@ "validator": "^13.9.0", "vue": "^3.5.13", "vue-i18n": "^9.4.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "^9.20.0", "vue-router": "^4.2.5" }, "devDependencies": { @@ -54,6 +56,7 @@ "@quasar/app-vite": "^2.0.8", "@quasar/quasar-app-extension-qcalendar": "^4.0.2", "@quasar/quasar-app-extension-testing-unit-vitest": "^0.4.0", + "@vitest/ui": "3.1.1", "@vue/compiler-sfc": "^3.5.13", "@vue/test-utils": "^2.4.4", "autoprefixer": "^10.4.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 35b1a9ea8..02d82f325 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,7 +75,10 @@ devDependencies: version: 4.1.2 '@quasar/quasar-app-extension-testing-unit-vitest': specifier: ^0.4.0 - version: 0.4.0(@vue/test-utils@2.4.6)(quasar@2.18.1)(typescript@5.8.3)(vite@6.2.5)(vitest@3.1.1)(vue@3.5.13) + version: 0.4.0(@vitest/ui@3.1.1)(@vue/test-utils@2.4.6)(quasar@2.18.1)(typescript@5.8.3)(vite@6.2.5)(vitest@3.1.1)(vue@3.5.13) + '@vitest/ui': + specifier: 3.1.1 + version: 3.1.1(vitest@3.1.1) '@vue/compiler-sfc': specifier: ^3.5.13 version: 3.5.13 @@ -132,7 +135,7 @@ devDependencies: version: 1.86.3 vitest: specifier: ^3.0.3 - version: 3.1.1(@types/node@22.14.0)(sass@1.86.3) + version: 3.1.1(@types/node@22.14.0)(@vitest/ui@3.1.1)(sass@1.86.3) xunit-viewer: specifier: ^10.6.1 version: 10.6.1(@babel/runtime@7.27.0)(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.0)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.10)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.36.5)(codemirror@6.0.1)(react-dom@19.1.0)(react@19.1.0) @@ -1139,6 +1142,10 @@ packages: config-chain: 1.1.13 dev: false + /@polka/url@1.0.0-next.28: + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + dev: true + /@quasar/app-vite@2.2.0(@types/node@22.14.0)(eslint@9.24.0)(pinia@2.3.1)(quasar@2.18.1)(sass@1.86.3)(typescript@5.8.3)(vue-router@4.5.0)(vue@3.5.13): resolution: {integrity: sha512-MvCfJrCbxUYvoGaK5jPq0h0hjO8mbxYOWngf+dIKrxhwb+1h5ERh6aVYEUuCtMIwTMEVfPkCez4DIfZIoReuDw==} engines: {node: ^30 || ^28 || ^26 || ^24 || ^22 || ^20 || ^18, npm: '>= 6.14.12', yarn: '>= 1.17.3'} @@ -1262,7 +1269,7 @@ packages: '@quasar/quasar-ui-qcalendar': 4.1.2 dev: true - /@quasar/quasar-app-extension-testing-unit-vitest@0.4.0(@vue/test-utils@2.4.6)(quasar@2.18.1)(typescript@5.8.3)(vite@6.2.5)(vitest@3.1.1)(vue@3.5.13): + /@quasar/quasar-app-extension-testing-unit-vitest@0.4.0(@vitest/ui@3.1.1)(@vue/test-utils@2.4.6)(quasar@2.18.1)(typescript@5.8.3)(vite@6.2.5)(vitest@3.1.1)(vue@3.5.13): resolution: {integrity: sha512-eyzdUdmZiCueNS+5nedjMmzdbpCetSrtdGIwW6KplW1dTzRbLiNvYUjpBOxQGmJCgEhWy9zuswJ7MZ/bTql24Q==} engines: {node: '>= 12.22.1', npm: '>= 6.14.12', yarn: '>= 1.17.3'} peerDependencies: @@ -1275,13 +1282,14 @@ packages: '@vitest/ui': optional: true dependencies: + '@vitest/ui': 3.1.1(vitest@3.1.1) '@vue/test-utils': 2.4.6 happy-dom: 11.2.0 lodash-es: 4.17.21 quasar: 2.18.1 vite-jsconfig-paths: 2.0.1(vite@6.2.5) vite-tsconfig-paths: 4.3.2(typescript@5.8.3)(vite@6.2.5) - vitest: 3.1.1(@types/node@22.14.0)(sass@1.86.3) + vitest: 3.1.1(@types/node@22.14.0)(@vitest/ui@3.1.1)(sass@1.86.3) vue: 3.5.13(typescript@5.8.3) transitivePeerDependencies: - supports-color @@ -1813,6 +1821,21 @@ packages: tinyspy: 3.0.2 dev: true + /@vitest/ui@3.1.1(vitest@3.1.1): + resolution: {integrity: sha512-2HpiRIYg3dlvAJBV9RtsVswFgUSJK4Sv7QhpxoP0eBGkYwzGIKP34PjaV00AULQi9Ovl6LGyZfsetxDWY5BQdQ==} + peerDependencies: + vitest: 3.1.1 + dependencies: + '@vitest/utils': 3.1.1 + fflate: 0.8.2 + flatted: 3.3.3 + pathe: 2.0.3 + sirv: 3.0.1 + tinyglobby: 0.2.12 + tinyrainbow: 2.0.0 + vitest: 3.1.1(@types/node@22.14.0)(@vitest/ui@3.1.1)(sass@1.86.3) + dev: true + /@vitest/utils@3.1.1: resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} dependencies: @@ -4021,6 +4044,10 @@ packages: picomatch: 4.0.2 dev: true + /fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + dev: true + /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -5588,6 +5615,11 @@ packages: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} dev: false + /mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + dev: true + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -6964,6 +6996,15 @@ packages: engines: {node: '>=14'} dev: true + /sirv@3.0.1: + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + engines: {node: '>=18'} + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.1 + totalist: 3.0.1 + dev: true + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -7364,6 +7405,11 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + /totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + dev: true + /tough-cookie@5.1.2: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} @@ -7772,7 +7818,7 @@ packages: fsevents: 2.3.3 dev: true - /vitest@3.1.1(@types/node@22.14.0)(sass@1.86.3): + /vitest@3.1.1(@types/node@22.14.0)(@vitest/ui@3.1.1)(sass@1.86.3): resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -7807,6 +7853,7 @@ packages: '@vitest/runner': 3.1.1 '@vitest/snapshot': 3.1.1 '@vitest/spy': 3.1.1 + '@vitest/ui': 3.1.1(vitest@3.1.1) '@vitest/utils': 3.1.1 chai: 5.2.0 debug: 4.4.0(supports-color@8.1.1) diff --git a/vitest.config.js b/vitest.config.js index 331d21ef9..c2c3661a9 100644 --- a/vitest.config.js +++ b/vitest.config.js @@ -17,6 +17,7 @@ if (process.env.CI) { // https://vitejs.dev/config/ export default defineConfig({ test: { + globals: true, reporters, outputFile, environment: 'happy-dom', From 123ec41f32819ba5320c540a981818c3de9e75cf Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Tue, 8 Apr 2025 13:32:31 +0200 Subject: [PATCH 53/55] fix(WorkerCalendarFilter): fix style year and contract filter --- .../Worker/Card/WorkerCalendarFilter.vue | 82 +++++++++---------- 1 file changed, 38 insertions(+), 44 deletions(-) diff --git a/src/pages/Worker/Card/WorkerCalendarFilter.vue b/src/pages/Worker/Card/WorkerCalendarFilter.vue index f0e2d758a..32edaa6e9 100644 --- a/src/pages/Worker/Card/WorkerCalendarFilter.vue +++ b/src/pages/Worker/Card/WorkerCalendarFilter.vue @@ -166,50 +166,44 @@ const yearList = ref(generateYears()); }} </QCardSection> </div> - <QList dense class="list q-gutter-y-sm q-my-lg"> - <QItem> - <QItemSection> - <VnSelect - :label="t('Year')" - v-model="selectedYear" - :options="yearList" - dense - filled - use-input - :is-clearable="false" - /> - </QItemSection> - <QItemSection> - <VnSelect - :label="t('Contract')" - v-model="selectedBusinessFk" - :options="contractList" - option-value="businessFk" - option-label="businessFk" - dense - filled - use-input - :is-clearable="false" - > - <template #option="scope"> - <QItem v-bind="scope.itemProps"> - <QItemSection> - <QItemLabel># {{ scope.opt?.businessFk }}</QItemLabel> - <QItemLabel caption> - {{ toDateFormat(scope.opt?.started) }} - - {{ - scope.opt?.ended - ? toDateFormat(scope.opt?.ended) - : 'Indef.' - }} - </QItemLabel> - </QItemSection> - </QItem> - </template> - </VnSelect> - </QItemSection> - </QItem> - </QList> + <div dense class="column q-gutter-y-sm q-px-md"> + <VnSelect + :label="t('Year')" + v-model="selectedYear" + :options="yearList" + dense + filled + use-input + :is-clearable="false" + /> + <VnSelect + :label="t('Contract')" + v-model="selectedBusinessFk" + :options="contractList" + option-value="businessFk" + option-label="businessFk" + dense + filled + use-input + :is-clearable="false" + > + <template #option="scope"> + <QItem v-bind="scope.itemProps"> + <QItemSection> + <QItemLabel># {{ scope.opt?.businessFk }}</QItemLabel> + <QItemLabel caption> + {{ toDateFormat(scope.opt?.started) }} - + {{ + scope.opt?.ended + ? toDateFormat(scope.opt?.ended) + : 'Indef.' + }} + </QItemLabel> + </QItemSection> + </QItem> + </template> + </VnSelect> + </div> <QList dense class="list q-gutter-y-xs q-my-md"> <QItem v-for="type in absenceTypeList" :key="type.id"> <WorkerEventLabel From a2f8a61c2098f27e84ab50db1c5c302ccd49e0d6 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Tue, 8 Apr 2025 14:11:43 +0200 Subject: [PATCH 54/55] fix(WorkerPDA): fetching available PDA data when add and remove pda --- src/pages/Worker/Card/WorkerPda.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue index 590cbc2b2..408260256 100644 --- a/src/pages/Worker/Card/WorkerPda.vue +++ b/src/pages/Worker/Card/WorkerPda.vue @@ -20,6 +20,7 @@ const { notify } = useNotify(); const loadingDocuware = ref(true); const tableRef = ref(); const dialog = ref(); +const getAvailablePdaRef = ref(); const route = useRoute(); const { openConfirmationModal } = useVnConfirm(); const routeId = computed(() => route.params.id); @@ -84,6 +85,7 @@ function reloadData() { initialData.value.deviceProductionFk = null; initialData.value.simFk = null; tableRef.value.reload(); + getAvailablePdaRef.value.fetch(); } async function fetchDocuware() { @@ -135,6 +137,7 @@ async function deallocatePDA(deviceProductionFk) { ); delete tableRef.value.CrudModelRef.formData[index]; notify(t('PDA deallocated'), 'positive'); + await getAvailablePdaRef.value.fetch(); } function isSigned(row) { @@ -144,6 +147,7 @@ function isSigned(row) { <template> <FetchData + ref="getAvailablePdaRef" url="workers/getAvailablePda" @on-fetch="(data) => (deviceProductions = data)" auto-load From eab1994fb8739807c48995733fa77ce31ffdd527 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Wed, 9 Apr 2025 11:21:00 +0200 Subject: [PATCH 55/55] fix(find-imports): remove the specific one if the module is there --- test/cypress/docker/find/find-imports.js | 2 +- test/cypress/docker/find/find.js | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/test/cypress/docker/find/find-imports.js b/test/cypress/docker/find/find-imports.js index 39c3ac3eb..622049c9f 100644 --- a/test/cypress/docker/find/find-imports.js +++ b/test/cypress/docker/find/find-imports.js @@ -44,7 +44,7 @@ export async function findImports(targetFile, visited = new Set(), identation = ]; } - return getUniques(fullTree); // Remove duplicates + return getUniques([...fullTree, targetFile]); // Remove duplicates } function getUniques(array) { diff --git a/test/cypress/docker/find/find.js b/test/cypress/docker/find/find.js index b89aab230..4f8063c86 100644 --- a/test/cypress/docker/find/find.js +++ b/test/cypress/docker/find/find.js @@ -25,7 +25,7 @@ async function getChangedModules() { if (change.startsWith(E2E_PATH)) changedArray.push(change); changedModules = new Set(changedArray); } - return [...changedModules].join('\n'); + return cleanSpecs(changedModules).join('\n'); } getChangedModules() @@ -34,3 +34,20 @@ getChangedModules() console.error(e); process.exit(1); }); + +function cleanSpecs(changedModules) { + let specifics = []; + const modules = []; + for (const changed of changedModules) { + if (changed.endsWith('*.spec.js')) { + modules.push(changed); + continue; + } + specifics.push(changed); + } + specifics = specifics.filter( + (spec) => !modules.some((module) => spec.startsWith(module.split('**')[0])), + ); + + return [...modules, ...specifics]; +}