aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar André Oliveira <oliveira.andrerodrigues95@gmail.com>2023-08-31 18:37:46 +0100
committerLibravatar André Oliveira <oliveira.andrerodrigues95@gmail.com>2023-08-31 18:37:46 +0100
commitc8ae78efe531ace78149dd49b25c4cb02fa31b84 (patch)
treecec786a50f24df1e5e4be3fd8cb9b08700498b5b
parent6.5.0-nightly.4 [skip ci] (diff)
downloadferdium-app-download-feature.tar.gz
ferdium-app-download-feature.tar.zst
ferdium-app-download-feature.zip
feat: initial proof of concept download (breakthrough!)download-feature
-rw-r--r--package.json3
-rw-r--r--pnpm-lock.yaml103
-rw-r--r--src/components/layout/Sidebar.tsx83
-rw-r--r--src/index.ts21
-rw-r--r--src/models/Service.ts67
5 files changed, 257 insertions, 20 deletions
diff --git a/package.json b/package.json
index cedef9718..2e272506a 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,7 @@
14 "private": true, 14 "private": true,
15 "engines": { 15 "engines": {
16 "node": "18.15.0", 16 "node": "18.15.0",
17 "pnpm": "8.6.2" 17 "pnpm": "8.6.10"
18 }, 18 },
19 "engine-strict": true, 19 "engine-strict": true,
20 "volta": { 20 "volta": {
@@ -103,6 +103,7 @@
103 "os-name": "4.0.1", 103 "os-name": "4.0.1",
104 "pretty-bytes": "5.6.0", 104 "pretty-bytes": "5.6.0",
105 "prop-types": "15.8.1", 105 "prop-types": "15.8.1",
106 "rc-progress": "3.5.1",
106 "react": "18.2.0", 107 "react": "18.2.0",
107 "react-color": "2.19.3", 108 "react-color": "2.19.3",
108 "react-confetti": "6.1.0", 109 "react-confetti": "6.1.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9c002f192..855f0f6c9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -170,6 +170,9 @@ dependencies:
170 prop-types: 170 prop-types:
171 specifier: 15.8.1 171 specifier: 15.8.1
172 version: 15.8.1 172 version: 15.8.1
173 rc-progress:
174 specifier: 3.5.1
175 version: 3.5.1(react-dom@18.2.0)(react@18.2.0)
173 react: 176 react:
174 specifier: 18.2.0 177 specifier: 18.2.0
175 version: 18.2.0 178 version: 18.2.0
@@ -1746,6 +1749,7 @@ packages:
1746 1749
1747 /@gar/promisify@1.1.3: 1750 /@gar/promisify@1.1.3:
1748 resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} 1751 resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==}
1752 requiresBuild: true
1749 dev: false 1753 dev: false
1750 optional: true 1754 optional: true
1751 1755
@@ -1820,7 +1824,7 @@ packages:
1820 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1824 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
1821 dependencies: 1825 dependencies:
1822 '@jest/types': 29.6.1 1826 '@jest/types': 29.6.1
1823 '@types/node': 20.4.7 1827 '@types/node': 18.15.3
1824 chalk: 4.1.2 1828 chalk: 4.1.2
1825 jest-message-util: 29.6.2 1829 jest-message-util: 29.6.2
1826 jest-util: 29.6.2 1830 jest-util: 29.6.2
@@ -1876,7 +1880,7 @@ packages:
1876 dependencies: 1880 dependencies:
1877 '@jest/fake-timers': 29.6.2 1881 '@jest/fake-timers': 29.6.2
1878 '@jest/types': 29.6.1 1882 '@jest/types': 29.6.1
1879 '@types/node': 20.4.7 1883 '@types/node': 18.15.3
1880 jest-mock: 29.6.2 1884 jest-mock: 29.6.2
1881 dev: true 1885 dev: true
1882 1886
@@ -1910,7 +1914,7 @@ packages:
1910 dependencies: 1914 dependencies:
1911 '@jest/types': 29.6.1 1915 '@jest/types': 29.6.1
1912 '@sinonjs/fake-timers': 10.2.0 1916 '@sinonjs/fake-timers': 10.2.0
1913 '@types/node': 20.4.7 1917 '@types/node': 18.15.3
1914 jest-message-util: 29.6.2 1918 jest-message-util: 29.6.2
1915 jest-mock: 29.6.2 1919 jest-mock: 29.6.2
1916 jest-util: 29.6.2 1920 jest-util: 29.6.2
@@ -1943,7 +1947,7 @@ packages:
1943 '@jest/transform': 29.6.2 1947 '@jest/transform': 29.6.2
1944 '@jest/types': 29.6.1 1948 '@jest/types': 29.6.1
1945 '@jridgewell/trace-mapping': 0.3.19 1949 '@jridgewell/trace-mapping': 0.3.19
1946 '@types/node': 20.4.7 1950 '@types/node': 18.15.3
1947 chalk: 4.1.2 1951 chalk: 4.1.2
1948 collect-v8-coverage: 1.0.1 1952 collect-v8-coverage: 1.0.1
1949 exit: 0.1.2 1953 exit: 0.1.2
@@ -2204,6 +2208,7 @@ packages:
2204 2208
2205 /@npmcli/fs@1.1.1: 2209 /@npmcli/fs@1.1.1:
2206 resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} 2210 resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==}
2211 requiresBuild: true
2207 dependencies: 2212 dependencies:
2208 '@gar/promisify': 1.1.3 2213 '@gar/promisify': 1.1.3
2209 semver: 7.5.4 2214 semver: 7.5.4
@@ -2221,6 +2226,7 @@ packages:
2221 resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} 2226 resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==}
2222 engines: {node: '>=10'} 2227 engines: {node: '>=10'}
2223 deprecated: This functionality has been moved to @npmcli/fs 2228 deprecated: This functionality has been moved to @npmcli/fs
2229 requiresBuild: true
2224 dependencies: 2230 dependencies:
2225 mkdirp: 1.0.4 2231 mkdirp: 1.0.4
2226 rimraf: 3.0.2 2232 rimraf: 3.0.2
@@ -2447,6 +2453,7 @@ packages:
2447 /@tootallnate/once@1.1.2: 2453 /@tootallnate/once@1.1.2:
2448 resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} 2454 resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==}
2449 engines: {node: '>= 6'} 2455 engines: {node: '>= 6'}
2456 requiresBuild: true
2450 dev: false 2457 dev: false
2451 optional: true 2458 optional: true
2452 2459
@@ -2509,7 +2516,7 @@ packages:
2509 dependencies: 2516 dependencies:
2510 '@types/http-cache-semantics': 4.0.1 2517 '@types/http-cache-semantics': 4.0.1
2511 '@types/keyv': 3.1.4 2518 '@types/keyv': 3.1.4
2512 '@types/node': 20.4.7 2519 '@types/node': 18.15.3
2513 '@types/responselike': 1.0.0 2520 '@types/responselike': 1.0.0
2514 2521
2515 /@types/color-convert@2.0.0: 2522 /@types/color-convert@2.0.0:
@@ -2550,7 +2557,7 @@ packages:
2550 /@types/graceful-fs@4.1.5: 2557 /@types/graceful-fs@4.1.5:
2551 resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} 2558 resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==}
2552 dependencies: 2559 dependencies:
2553 '@types/node': 20.4.7 2560 '@types/node': 18.15.3
2554 dev: true 2561 dev: true
2555 2562
2556 /@types/hoist-non-react-statics@3.3.1: 2563 /@types/hoist-non-react-statics@3.3.1:
@@ -2603,7 +2610,7 @@ packages:
2603 /@types/keyv@3.1.4: 2610 /@types/keyv@3.1.4:
2604 resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} 2611 resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
2605 dependencies: 2612 dependencies:
2606 '@types/node': 20.4.7 2613 '@types/node': 18.15.3
2607 2614
2608 /@types/lodash@4.14.197: 2615 /@types/lodash@4.14.197:
2609 resolution: {integrity: sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==} 2616 resolution: {integrity: sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==}
@@ -2622,6 +2629,7 @@ packages:
2622 2629
2623 /@types/node@20.4.7: 2630 /@types/node@20.4.7:
2624 resolution: {integrity: sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==} 2631 resolution: {integrity: sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==}
2632 dev: true
2625 2633
2626 /@types/normalize-package-data@2.4.1: 2634 /@types/normalize-package-data@2.4.1:
2627 resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} 2635 resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
@@ -2631,7 +2639,7 @@ packages:
2631 resolution: {integrity: sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==} 2639 resolution: {integrity: sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==}
2632 requiresBuild: true 2640 requiresBuild: true
2633 dependencies: 2641 dependencies:
2634 '@types/node': 20.4.7 2642 '@types/node': 18.15.3
2635 xmlbuilder: 15.1.1 2643 xmlbuilder: 15.1.1
2636 dev: true 2644 dev: true
2637 optional: true 2645 optional: true
@@ -2680,7 +2688,7 @@ packages:
2680 /@types/responselike@1.0.0: 2688 /@types/responselike@1.0.0:
2681 resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} 2689 resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
2682 dependencies: 2690 dependencies:
2683 '@types/node': 20.4.7 2691 '@types/node': 18.15.3
2684 2692
2685 /@types/route-parser@0.1.4: 2693 /@types/route-parser@0.1.4:
2686 resolution: {integrity: sha512-lwH3SeyKwCAwP7oUoJNryPDdbW3Bx5lrB6mhV5iebqzOJHIut6wlaSxpQR4Lsk6j7wC08pGenr/xE8I/A4J3Fg==} 2694 resolution: {integrity: sha512-lwH3SeyKwCAwP7oUoJNryPDdbW3Bx5lrB6mhV5iebqzOJHIut6wlaSxpQR4Lsk6j7wC08pGenr/xE8I/A4J3Fg==}
@@ -3134,6 +3142,7 @@ packages:
3134 /aggregate-error@3.1.0: 3142 /aggregate-error@3.1.0:
3135 resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} 3143 resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
3136 engines: {node: '>=8'} 3144 engines: {node: '>=8'}
3145 requiresBuild: true
3137 dependencies: 3146 dependencies:
3138 clean-stack: 2.2.0 3147 clean-stack: 2.2.0
3139 indent-string: 4.0.0 3148 indent-string: 4.0.0
@@ -3530,6 +3539,7 @@ packages:
3530 /are-we-there-yet@3.0.1: 3539 /are-we-there-yet@3.0.1:
3531 resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} 3540 resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==}
3532 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 3541 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
3542 requiresBuild: true
3533 dependencies: 3543 dependencies:
3534 delegates: 1.0.0 3544 delegates: 1.0.0
3535 readable-stream: 3.6.2 3545 readable-stream: 3.6.2
@@ -3896,6 +3906,7 @@ packages:
3896 3906
3897 /bindings@1.5.0: 3907 /bindings@1.5.0:
3898 resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 3908 resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
3909 requiresBuild: true
3899 dependencies: 3910 dependencies:
3900 file-uri-to-path: 1.0.0 3911 file-uri-to-path: 1.0.0
3901 dev: false 3912 dev: false
@@ -3937,6 +3948,7 @@ packages:
3937 3948
3938 /boolean@3.2.0: 3949 /boolean@3.2.0:
3939 resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} 3950 resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==}
3951 requiresBuild: true
3940 optional: true 3952 optional: true
3941 3953
3942 /bplist-parser@0.2.0: 3954 /bplist-parser@0.2.0:
@@ -4109,6 +4121,7 @@ packages:
4109 /cacache@15.3.0: 4121 /cacache@15.3.0:
4110 resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} 4122 resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==}
4111 engines: {node: '>= 10'} 4123 engines: {node: '>= 10'}
4124 requiresBuild: true
4112 dependencies: 4125 dependencies:
4113 '@npmcli/fs': 1.1.1 4126 '@npmcli/fs': 1.1.1
4114 '@npmcli/move-file': 1.1.2 4127 '@npmcli/move-file': 1.1.2
@@ -4343,6 +4356,7 @@ packages:
4343 /clean-stack@2.2.0: 4356 /clean-stack@2.2.0:
4344 resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} 4357 resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
4345 engines: {node: '>=6'} 4358 engines: {node: '>=6'}
4359 requiresBuild: true
4346 4360
4347 /cli-cursor@3.1.0: 4361 /cli-cursor@3.1.0:
4348 resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} 4362 resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
@@ -5105,6 +5119,7 @@ packages:
5105 5119
5106 /detect-node@2.1.0: 5120 /detect-node@2.1.0:
5107 resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} 5121 resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
5122 requiresBuild: true
5108 optional: true 5123 optional: true
5109 5124
5110 /didyoumean@1.2.2: 5125 /didyoumean@1.2.2:
@@ -5415,6 +5430,7 @@ packages:
5415 5430
5416 /err-code@2.0.3: 5431 /err-code@2.0.3:
5417 resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} 5432 resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
5433 requiresBuild: true
5418 5434
5419 /error-ex@1.3.2: 5435 /error-ex@1.3.2:
5420 resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 5436 resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
@@ -5527,6 +5543,7 @@ packages:
5527 5543
5528 /es6-error@4.1.1: 5544 /es6-error@4.1.1:
5529 resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} 5545 resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
5546 requiresBuild: true
5530 optional: true 5547 optional: true
5531 5548
5532 /es6-iterator@2.0.3: 5549 /es6-iterator@2.0.3:
@@ -6183,7 +6200,7 @@ packages:
6183 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 6200 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6184 dependencies: 6201 dependencies:
6185 '@jest/expect-utils': 29.6.2 6202 '@jest/expect-utils': 29.6.2
6186 '@types/node': 20.4.7 6203 '@types/node': 18.15.3
6187 jest-get-type: 29.4.3 6204 jest-get-type: 29.4.3
6188 jest-matcher-utils: 29.6.2 6205 jest-matcher-utils: 29.6.2
6189 jest-message-util: 29.6.2 6206 jest-message-util: 29.6.2
@@ -6405,6 +6422,7 @@ packages:
6405 6422
6406 /file-uri-to-path@1.0.0: 6423 /file-uri-to-path@1.0.0:
6407 resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} 6424 resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
6425 requiresBuild: true
6408 dev: false 6426 dev: false
6409 optional: true 6427 optional: true
6410 6428
@@ -6637,6 +6655,7 @@ packages:
6637 6655
6638 /fs.realpath@1.0.0: 6656 /fs.realpath@1.0.0:
6639 resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 6657 resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
6658 requiresBuild: true
6640 6659
6641 /fsevents@2.3.3: 6660 /fsevents@2.3.3:
6642 resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 6661 resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
@@ -6685,6 +6704,7 @@ packages:
6685 /gauge@4.0.4: 6704 /gauge@4.0.4:
6686 resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} 6705 resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==}
6687 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 6706 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
6707 requiresBuild: true
6688 dependencies: 6708 dependencies:
6689 aproba: 2.0.0 6709 aproba: 2.0.0
6690 color-support: 1.1.3 6710 color-support: 1.1.3
@@ -7112,6 +7132,7 @@ packages:
7112 /http-proxy-agent@4.0.1: 7132 /http-proxy-agent@4.0.1:
7113 resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} 7133 resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==}
7114 engines: {node: '>= 6'} 7134 engines: {node: '>= 6'}
7135 requiresBuild: true
7115 dependencies: 7136 dependencies:
7116 '@tootallnate/once': 1.1.2 7137 '@tootallnate/once': 1.1.2
7117 agent-base: 6.0.2 7138 agent-base: 6.0.2
@@ -7184,6 +7205,7 @@ packages:
7184 7205
7185 /humanize-ms@1.2.1: 7206 /humanize-ms@1.2.1:
7186 resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} 7207 resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
7208 requiresBuild: true
7187 dependencies: 7209 dependencies:
7188 ms: 2.1.3 7210 ms: 2.1.3
7189 7211
@@ -7268,6 +7290,7 @@ packages:
7268 7290
7269 /infer-owner@1.0.4: 7291 /infer-owner@1.0.4:
7270 resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} 7292 resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==}
7293 requiresBuild: true
7271 dev: false 7294 dev: false
7272 optional: true 7295 optional: true
7273 7296
@@ -7278,6 +7301,7 @@ packages:
7278 7301
7279 /inflight@1.0.6: 7302 /inflight@1.0.6:
7280 resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 7303 resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
7304 requiresBuild: true
7281 dependencies: 7305 dependencies:
7282 once: 1.4.0 7306 once: 1.4.0
7283 wrappy: 1.0.2 7307 wrappy: 1.0.2
@@ -7347,6 +7371,7 @@ packages:
7347 7371
7348 /ip@2.0.0: 7372 /ip@2.0.0:
7349 resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} 7373 resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==}
7374 requiresBuild: true
7350 7375
7351 /ipaddr.js@1.9.1: 7376 /ipaddr.js@1.9.1:
7352 resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 7377 resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
@@ -7864,7 +7889,7 @@ packages:
7864 '@jest/expect': 29.6.2 7889 '@jest/expect': 29.6.2
7865 '@jest/test-result': 29.6.2 7890 '@jest/test-result': 29.6.2
7866 '@jest/types': 29.6.1 7891 '@jest/types': 29.6.1
7867 '@types/node': 20.4.7 7892 '@types/node': 18.15.3
7868 chalk: 4.1.2 7893 chalk: 4.1.2
7869 co: 4.6.0 7894 co: 4.6.0
7870 dedent: 1.5.1 7895 dedent: 1.5.1
@@ -8000,7 +8025,7 @@ packages:
8000 '@jest/environment': 29.6.2 8025 '@jest/environment': 29.6.2
8001 '@jest/fake-timers': 29.6.2 8026 '@jest/fake-timers': 29.6.2
8002 '@jest/types': 29.6.1 8027 '@jest/types': 29.6.1
8003 '@types/node': 20.4.7 8028 '@types/node': 18.15.3
8004 jest-mock: 29.6.2 8029 jest-mock: 29.6.2
8005 jest-util: 29.6.2 8030 jest-util: 29.6.2
8006 dev: true 8031 dev: true
@@ -8016,7 +8041,7 @@ packages:
8016 dependencies: 8041 dependencies:
8017 '@jest/types': 29.6.1 8042 '@jest/types': 29.6.1
8018 '@types/graceful-fs': 4.1.5 8043 '@types/graceful-fs': 4.1.5
8019 '@types/node': 20.4.7 8044 '@types/node': 18.15.3
8020 anymatch: 3.1.3 8045 anymatch: 3.1.3
8021 fb-watchman: 2.0.2 8046 fb-watchman: 2.0.2
8022 graceful-fs: 4.2.11 8047 graceful-fs: 4.2.11
@@ -8092,7 +8117,7 @@ packages:
8092 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 8117 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
8093 dependencies: 8118 dependencies:
8094 '@jest/types': 29.6.1 8119 '@jest/types': 29.6.1
8095 '@types/node': 20.4.7 8120 '@types/node': 18.15.3
8096 jest-util: 29.6.2 8121 jest-util: 29.6.2
8097 dev: true 8122 dev: true
8098 8123
@@ -8147,7 +8172,7 @@ packages:
8147 '@jest/test-result': 29.6.2 8172 '@jest/test-result': 29.6.2
8148 '@jest/transform': 29.6.2 8173 '@jest/transform': 29.6.2
8149 '@jest/types': 29.6.1 8174 '@jest/types': 29.6.1
8150 '@types/node': 20.4.7 8175 '@types/node': 18.15.3
8151 chalk: 4.1.2 8176 chalk: 4.1.2
8152 emittery: 0.13.1 8177 emittery: 0.13.1
8153 graceful-fs: 4.2.11 8178 graceful-fs: 4.2.11
@@ -8178,7 +8203,7 @@ packages:
8178 '@jest/test-result': 29.6.2 8203 '@jest/test-result': 29.6.2
8179 '@jest/transform': 29.6.2 8204 '@jest/transform': 29.6.2
8180 '@jest/types': 29.6.1 8205 '@jest/types': 29.6.1
8181 '@types/node': 20.4.7 8206 '@types/node': 18.15.3
8182 chalk: 4.1.2 8207 chalk: 4.1.2
8183 cjs-module-lexer: 1.2.2 8208 cjs-module-lexer: 1.2.2
8184 collect-v8-coverage: 1.0.1 8209 collect-v8-coverage: 1.0.1
@@ -8242,7 +8267,7 @@ packages:
8242 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 8267 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
8243 dependencies: 8268 dependencies:
8244 '@jest/types': 29.6.1 8269 '@jest/types': 29.6.1
8245 '@types/node': 20.4.7 8270 '@types/node': 18.15.3
8246 chalk: 4.1.2 8271 chalk: 4.1.2
8247 ci-info: 3.8.0 8272 ci-info: 3.8.0
8248 graceful-fs: 4.2.11 8273 graceful-fs: 4.2.11
@@ -8267,7 +8292,7 @@ packages:
8267 dependencies: 8292 dependencies:
8268 '@jest/test-result': 29.6.2 8293 '@jest/test-result': 29.6.2
8269 '@jest/types': 29.6.1 8294 '@jest/types': 29.6.1
8270 '@types/node': 20.4.7 8295 '@types/node': 18.15.3
8271 ansi-escapes: 4.3.2 8296 ansi-escapes: 4.3.2
8272 chalk: 4.1.2 8297 chalk: 4.1.2
8273 emittery: 0.13.1 8298 emittery: 0.13.1
@@ -8279,7 +8304,7 @@ packages:
8279 resolution: {integrity: sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==} 8304 resolution: {integrity: sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==}
8280 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 8305 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
8281 dependencies: 8306 dependencies:
8282 '@types/node': 20.4.7 8307 '@types/node': 18.15.3
8283 jest-util: 29.6.2 8308 jest-util: 29.6.2
8284 merge-stream: 2.0.0 8309 merge-stream: 2.0.0
8285 supports-color: 8.1.1 8310 supports-color: 8.1.1
@@ -9025,6 +9050,7 @@ packages:
9025 /make-fetch-happen@9.1.0: 9050 /make-fetch-happen@9.1.0:
9026 resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} 9051 resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==}
9027 engines: {node: '>= 10'} 9052 engines: {node: '>= 10'}
9053 requiresBuild: true
9028 dependencies: 9054 dependencies:
9029 agentkeepalive: 4.2.1 9055 agentkeepalive: 4.2.1
9030 cacache: 15.3.0 9056 cacache: 15.3.0
@@ -9099,6 +9125,7 @@ packages:
9099 /matcher@3.0.0: 9125 /matcher@3.0.0:
9100 resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} 9126 resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==}
9101 engines: {node: '>=10'} 9127 engines: {node: '>=10'}
9128 requiresBuild: true
9102 dependencies: 9129 dependencies:
9103 escape-string-regexp: 4.0.0 9130 escape-string-regexp: 4.0.0
9104 optional: true 9131 optional: true
@@ -9277,6 +9304,7 @@ packages:
9277 /minipass-fetch@1.4.1: 9304 /minipass-fetch@1.4.1:
9278 resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} 9305 resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==}
9279 engines: {node: '>=8'} 9306 engines: {node: '>=8'}
9307 requiresBuild: true
9280 dependencies: 9308 dependencies:
9281 minipass: 3.3.6 9309 minipass: 3.3.6
9282 minipass-sized: 1.0.3 9310 minipass-sized: 1.0.3
@@ -10287,6 +10315,7 @@ packages:
10287 10315
10288 /promise-inflight@1.0.1: 10316 /promise-inflight@1.0.1:
10289 resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} 10317 resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==}
10318 requiresBuild: true
10290 peerDependencies: 10319 peerDependencies:
10291 bluebird: '*' 10320 bluebird: '*'
10292 peerDependenciesMeta: 10321 peerDependenciesMeta:
@@ -10623,6 +10652,31 @@ packages:
10623 unpipe: 1.0.0 10652 unpipe: 1.0.0
10624 dev: false 10653 dev: false
10625 10654
10655 /rc-progress@3.5.1(react-dom@18.2.0)(react@18.2.0):
10656 resolution: {integrity: sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw==}
10657 peerDependencies:
10658 react: '>=16.9.0'
10659 react-dom: '>=16.9.0'
10660 dependencies:
10661 '@babel/runtime': 7.21.5
10662 classnames: 2.3.2
10663 rc-util: 5.37.0(react-dom@18.2.0)(react@18.2.0)
10664 react: 18.2.0
10665 react-dom: 18.2.0(react@18.2.0)
10666 dev: false
10667
10668 /rc-util@5.37.0(react-dom@18.2.0)(react@18.2.0):
10669 resolution: {integrity: sha512-cPMV8DzaHI1KDaS7XPRXAf4J7mtBqjvjikLpQieaeOO7+cEbqY2j7Kso/T0R0OiEZTNcLS/8Zl9YrlXiO9UbjQ==}
10670 peerDependencies:
10671 react: '>=16.9.0'
10672 react-dom: '>=16.9.0'
10673 dependencies:
10674 '@babel/runtime': 7.21.5
10675 react: 18.2.0
10676 react-dom: 18.2.0(react@18.2.0)
10677 react-is: 16.13.1
10678 dev: false
10679
10626 /react-color@2.19.3(react@18.2.0): 10680 /react-color@2.19.3(react@18.2.0):
10627 resolution: {integrity: sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==} 10681 resolution: {integrity: sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==}
10628 peerDependencies: 10682 peerDependencies:
@@ -11213,6 +11267,7 @@ packages:
11213 /retry@0.12.0: 11267 /retry@0.12.0:
11214 resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} 11268 resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
11215 engines: {node: '>= 4'} 11269 engines: {node: '>= 4'}
11270 requiresBuild: true
11216 11271
11217 /reusify@1.0.4: 11272 /reusify@1.0.4:
11218 resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 11273 resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
@@ -11240,6 +11295,7 @@ packages:
11240 /roarr@2.15.4: 11295 /roarr@2.15.4:
11241 resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} 11296 resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==}
11242 engines: {node: '>=8.0'} 11297 engines: {node: '>=8.0'}
11298 requiresBuild: true
11243 dependencies: 11299 dependencies:
11244 boolean: 3.2.0 11300 boolean: 3.2.0
11245 detect-node: 2.1.0 11301 detect-node: 2.1.0
@@ -11377,6 +11433,7 @@ packages:
11377 11433
11378 /semver-compare@1.0.0: 11434 /semver-compare@1.0.0:
11379 resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} 11435 resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
11436 requiresBuild: true
11380 optional: true 11437 optional: true
11381 11438
11382 /semver@5.5.1: 11439 /semver@5.5.1:
@@ -11459,6 +11516,7 @@ packages:
11459 /serialize-error@7.0.1: 11516 /serialize-error@7.0.1:
11460 resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} 11517 resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==}
11461 engines: {node: '>=10'} 11518 engines: {node: '>=10'}
11519 requiresBuild: true
11462 dependencies: 11520 dependencies:
11463 type-fest: 0.13.1 11521 type-fest: 0.13.1
11464 optional: true 11522 optional: true
@@ -11651,6 +11709,7 @@ packages:
11651 /smart-buffer@4.2.0: 11709 /smart-buffer@4.2.0:
11652 resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} 11710 resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
11653 engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} 11711 engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
11712 requiresBuild: true
11654 11713
11655 /snapdragon-node@2.1.1: 11714 /snapdragon-node@2.1.1:
11656 resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} 11715 resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
@@ -11687,6 +11746,7 @@ packages:
11687 /socks-proxy-agent@6.2.1: 11746 /socks-proxy-agent@6.2.1:
11688 resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} 11747 resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==}
11689 engines: {node: '>= 10'} 11748 engines: {node: '>= 10'}
11749 requiresBuild: true
11690 dependencies: 11750 dependencies:
11691 agent-base: 6.0.2 11751 agent-base: 6.0.2
11692 debug: 4.3.4 11752 debug: 4.3.4
@@ -11828,6 +11888,7 @@ packages:
11828 11888
11829 /sprintf-js@1.1.2: 11889 /sprintf-js@1.1.2:
11830 resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} 11890 resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==}
11891 requiresBuild: true
11831 optional: true 11892 optional: true
11832 11893
11833 /sqlite3@5.1.6: 11894 /sqlite3@5.1.6:
@@ -11874,6 +11935,7 @@ packages:
11874 /ssri@8.0.1: 11935 /ssri@8.0.1:
11875 resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} 11936 resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==}
11876 engines: {node: '>= 8'} 11937 engines: {node: '>= 8'}
11938 requiresBuild: true
11877 dependencies: 11939 dependencies:
11878 minipass: 3.3.6 11940 minipass: 3.3.6
11879 dev: false 11941 dev: false
@@ -12516,6 +12578,7 @@ packages:
12516 /type-fest@0.13.1: 12578 /type-fest@0.13.1:
12517 resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} 12579 resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
12518 engines: {node: '>=10'} 12580 engines: {node: '>=10'}
12581 requiresBuild: true
12519 optional: true 12582 optional: true
12520 12583
12521 /type-fest@0.18.1: 12584 /type-fest@0.18.1:
@@ -12659,6 +12722,7 @@ packages:
12659 12722
12660 /unique-filename@1.1.1: 12723 /unique-filename@1.1.1:
12661 resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} 12724 resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==}
12725 requiresBuild: true
12662 dependencies: 12726 dependencies:
12663 unique-slug: 2.0.2 12727 unique-slug: 2.0.2
12664 dev: false 12728 dev: false
@@ -12673,6 +12737,7 @@ packages:
12673 12737
12674 /unique-slug@2.0.2: 12738 /unique-slug@2.0.2:
12675 resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} 12739 resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==}
12740 requiresBuild: true
12676 dependencies: 12741 dependencies:
12677 imurmurhash: 0.1.4 12742 imurmurhash: 0.1.4
12678 dev: false 12743 dev: false
diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx
index 6fd911a24..498ae4696 100644
--- a/src/components/layout/Sidebar.tsx
+++ b/src/components/layout/Sidebar.tsx
@@ -1,3 +1,4 @@
1import { ipcRenderer } from 'electron';
1import { Component } from 'react'; 2import { Component } from 'react';
2import { Tooltip as ReactTooltip } from 'react-tooltip'; 3import { Tooltip as ReactTooltip } from 'react-tooltip';
3import { defineMessages, injectIntl, WrappedComponentProps } from 'react-intl'; 4import { defineMessages, injectIntl, WrappedComponentProps } from 'react-intl';
@@ -14,8 +15,10 @@ import {
14 mdiPlusBox, 15 mdiPlusBox,
15 mdiViewGrid, 16 mdiViewGrid,
16 mdiViewSplitVertical, 17 mdiViewSplitVertical,
18 mdiCancel,
17} from '@mdi/js'; 19} from '@mdi/js';
18 20
21import { Circle } from 'rc-progress';
19import Tabbar from '../services/tabs/Tabbar'; 22import Tabbar from '../services/tabs/Tabbar';
20import { 23import {
21 addNewServiceShortcutKey, 24 addNewServiceShortcutKey,
@@ -112,6 +115,10 @@ interface IProps extends WrappedComponentProps {
112 115
113interface IState { 116interface IState {
114 tooltipEnabled: boolean; 117 tooltipEnabled: boolean;
118 downloadProgress: {
119 progress: number;
120 total: number;
121 } | null;
115} 122}
116 123
117@inject('stores', 'actions') 124@inject('stores', 'actions')
@@ -122,7 +129,33 @@ class Sidebar extends Component<IProps, IState> {
122 129
123 this.state = { 130 this.state = {
124 tooltipEnabled: true, 131 tooltipEnabled: true,
132 downloadProgress: null,
125 }; 133 };
134
135 ipcRenderer.on('download-progress', this.handleDownloadProgress);
136 ipcRenderer.on('download-done', this.handleDownloadDone);
137 }
138
139 handleDownloadProgress = (_event, data) => {
140 this.setState({
141 downloadProgress: {
142 progress: data.item.receivedBytes,
143 total: data.item.totalBytes,
144 },
145 });
146 };
147
148 handleDownloadDone = (_event, _data) => {
149 this.setState({
150 downloadProgress: null,
151 });
152 };
153
154 componentWillUnmount() {
155 ipcRenderer.removeListener(
156 'download-progress',
157 this.handleDownloadProgress,
158 );
126 } 159 }
127 160
128 enableToolTip() { 161 enableToolTip() {
@@ -180,6 +213,13 @@ class Sidebar extends Component<IProps, IState> {
180 213
181 const { isMenuCollapsed } = stores!.settings.all.app; 214 const { isMenuCollapsed } = stores!.settings.all.app;
182 215
216 const { downloadProgress } = this.state;
217
218 const downloadPercentage =
219 downloadProgress === null
220 ? 0
221 : (downloadProgress.progress / downloadProgress.total) * 100;
222
183 return ( 223 return (
184 <div className="sidebar"> 224 <div className="sidebar">
185 <Tabbar 225 <Tabbar
@@ -361,6 +401,49 @@ class Sidebar extends Component<IProps, IState> {
361 )} 401 )}
362 </button> 402 </button>
363 ) : null} 403 ) : null}
404 {downloadProgress !== null && (
405 <div
406 className="download-progress"
407 style={{
408 width: '-webkit-fill-available',
409 height: 'fit-content',
410 display: 'flex',
411 justifyContent: 'center',
412 margin: 5,
413 }}
414 >
415 <Circle
416 percent={downloadPercentage}
417 strokeWidth={10}
418 strokeColor="#008000"
419 trailColor="grey"
420 />
421 </div>
422 )}
423 <button
424 type="button"
425 onClick={() => {
426 ipcRenderer.send('stop-download');
427 this.setState({
428 downloadProgress: null,
429 });
430 }}
431 className="sidebar__button sidebar__button--settings"
432 data-tooltip-id="tooltip-sidebar-button"
433 data-tooltip-content={`${intl.formatMessage(
434 globalMessages.settings,
435 )} (${settingsShortcutKey(false)})`}
436 >
437 <Icon icon={mdiCancel} size={1.5} />
438 {stores!.settings.app.automaticUpdates &&
439 (stores!.app.updateStatus ===
440 stores!.app.updateStatusTypes.AVAILABLE ||
441 stores!.app.updateStatus ===
442 stores!.app.updateStatusTypes.DOWNLOADED ||
443 this.props.showServicesUpdatedInfoBar) && (
444 <span className="update-available">•</span>
445 )}
446 </button>
364 </div> 447 </div>
365 ); 448 );
366 } 449 }
diff --git a/src/index.ts b/src/index.ts
index cbc10bdbe..d35462ad1 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -674,6 +674,27 @@ ipcMain.on('window.toolbar-double-clicked', () => {
674 } 674 }
675}); 675});
676 676
677ipcMain.on('download-started', (_e, data) => {
678 debug(`download-started from main process ${data.item.url}`);
679});
680
681ipcMain.on('download-progress', (_e, data) => {
682 mainWindow?.webContents.send('download-progress', data);
683 debug(
684 `Receiving bytes: (${data.item.receivedBytes}/${data.item.totalBytes})`,
685 );
686});
687
688ipcMain.on('download-done', (_e, data) => {
689 debug(`download-done from main process ${data}`);
690 mainWindow?.webContents.send('download-done', {});
691});
692
693ipcMain.on('stop-download', (_e, data) => {
694 debug(`stopping download from main process ${data}`);
695 mainWindow?.webContents.send('cancel-download', {});
696});
697
677// Quit when all windows are closed. 698// Quit when all windows are closed.
678app.on('window-all-closed', () => { 699app.on('window-all-closed', () => {
679 // On OS X it is common for applications and their menu bar 700 // On OS X it is common for applications and their menu bar
diff --git a/src/models/Service.ts b/src/models/Service.ts
index 265b3e13c..d48fc3cd6 100644
--- a/src/models/Service.ts
+++ b/src/models/Service.ts
@@ -4,6 +4,7 @@ import { ipcRenderer } from 'electron';
4import { webContents } from '@electron/remote'; 4import { webContents } from '@electron/remote';
5import ElectronWebView from 'react-electron-web-view'; 5import ElectronWebView from 'react-electron-web-view';
6 6
7import { uniqueId } from 'lodash';
7import { todosStore } from '../features/todos'; 8import { todosStore } from '../features/todos';
8import { isValidExternalURL, normalizedUrl } from '../helpers/url-helpers'; 9import { isValidExternalURL, normalizedUrl } from '../helpers/url-helpers';
9import UserAgent from './UserAgent'; 10import UserAgent from './UserAgent';
@@ -523,6 +524,72 @@ export default class Service {
523 }); 524 });
524 525
525 if (webviewWebContents) { 526 if (webviewWebContents) {
527 webviewWebContents.session.on('will-download', (event, item) => {
528 event.preventDefault();
529
530 debug('will-download', event, item, item.getFilename());
531 const downloadId = uniqueId(`${this.id}: `);
532
533 ipcRenderer.send('download-started', {
534 serviceId: this.id,
535 downloadId,
536 item: {
537 filename: item.getFilename(),
538 url: item.getURL(),
539 savePath: item.getSavePath(),
540 },
541 });
542
543 item.addListener('updated', (event, state) => {
544 debug('download updated', event, state);
545 if (state === 'interrupted') {
546 debug('Download is interrupted but can be resumed');
547 } else if (state === 'progressing') {
548 if (item.isPaused()) {
549 debug('Download is paused');
550 } else {
551 debug(`Received bytes: ${item.getReceivedBytes()}`);
552 ipcRenderer.send('download-progress', {
553 serviceId: this.id,
554 downloadId,
555 item: {
556 filename: item.getFilename(),
557 url: item.getURL(),
558 receivedBytes: item.getReceivedBytes(),
559 totalBytes: item.getTotalBytes(),
560 state,
561 },
562 });
563 }
564 }
565 });
566 item.addListener('done', (event, state) => {
567 debug('download done', event, state);
568 if (state === 'completed') {
569 debug('Download successfully');
570 } else {
571 debug(`Download failed: ${state}`);
572 }
573 ipcRenderer.send('download-done', {
574 serviceId: this.id,
575 downloadId,
576 item: {
577 filename: item.getFilename(),
578 url: item.getURL(),
579 state,
580 },
581 });
582 });
583
584 ipcRenderer.on('cancel-download', (event, { downloadId: id }) => {
585 // next line, testing
586 item.cancel();
587
588 if (downloadId === id) {
589 item.cancel();
590 }
591 });
592 });
526 webviewWebContents.on('login', (event, _, authInfo, callback) => { 593 webviewWebContents.on('login', (event, _, authInfo, callback) => {
527 // const authCallback = callback; 594 // const authCallback = callback;
528 debug('browser login event', authInfo); 595 debug('browser login event', authInfo);