[READ-ONLY] Mirror of https://github.com/probablykasper/ferrum. Music library app for Mac, Linux and Windows ferrum.kasper.space
electron linux macos music music-library music-player napi windows
0

Configure Feed

Select the types of activity you want to include in your feed.

TypeScript for Electron process

Kasper (Aug 31, 2022, 2:55 AM +0200) 7274733d eed1f0d8

+596 -346
+145 -45
Cargo.lock
··· 24 24 checksum = "77e9c9abb82613923ec78d7a461595d52491ba7240f3c64c0bbe0e6d98e0fce0" 25 25 26 26 [[package]] 27 + name = "android_system_properties" 28 + version = "0.1.5" 29 + source = "registry+https://github.com/rust-lang/crates.io-index" 30 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 31 + dependencies = [ 32 + "libc", 33 + ] 34 + 35 + [[package]] 27 36 name = "atomicwrites" 28 37 version = "0.3.1" 29 38 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 52 61 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 53 62 54 63 [[package]] 64 + name = "bumpalo" 65 + version = "3.11.0" 66 + source = "registry+https://github.com/rust-lang/crates.io-index" 67 + checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" 68 + 69 + [[package]] 55 70 name = "byteorder" 56 71 version = "1.4.3" 57 72 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 65 80 66 81 [[package]] 67 82 name = "chrono" 68 - version = "0.4.19" 83 + version = "0.4.22" 69 84 source = "registry+https://github.com/rust-lang/crates.io-index" 70 - checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" 85 + checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" 71 86 dependencies = [ 72 - "libc", 87 + "iana-time-zone", 88 + "js-sys", 73 89 "num-integer", 74 90 "num-traits", 75 91 "time", 92 + "wasm-bindgen", 76 93 "winapi", 77 94 ] 78 95 ··· 83 100 checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8" 84 101 85 102 [[package]] 103 + name = "core-foundation-sys" 104 + version = "0.8.3" 105 + source = "registry+https://github.com/rust-lang/crates.io-index" 106 + checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 107 + 108 + [[package]] 86 109 name = "crc32fast" 87 110 version = "1.3.2" 88 111 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 93 116 94 117 [[package]] 95 118 name = "ctor" 96 - version = "0.1.22" 119 + version = "0.1.23" 97 120 source = "registry+https://github.com/rust-lang/crates.io-index" 98 - checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" 121 + checksum = "cdffe87e1d521a10f9696f833fe502293ea446d7f256c06128293a4119bdf4cb" 99 122 dependencies = [ 100 123 "quote", 101 124 "syn", ··· 185 208 ] 186 209 187 210 [[package]] 211 + name = "iana-time-zone" 212 + version = "0.1.46" 213 + source = "registry+https://github.com/rust-lang/crates.io-index" 214 + checksum = "ad2bfd338099682614d3ee3fe0cd72e0b6a41ca6a87f6a74a3bd593c91650501" 215 + dependencies = [ 216 + "android_system_properties", 217 + "core-foundation-sys", 218 + "js-sys", 219 + "wasm-bindgen", 220 + "winapi", 221 + ] 222 + 223 + [[package]] 188 224 name = "id3" 189 - version = "1.2.0" 225 + version = "1.3.0" 190 226 source = "registry+https://github.com/rust-lang/crates.io-index" 191 - checksum = "58f8809c6e2845c0388438f2c6000ca41eaed5cae8f3183c5449594238cde52e" 227 + checksum = "c2cf589c9dddff0ea50b6361b8635720d721d4fbca02861f806add85afef74a0" 192 228 dependencies = [ 193 229 "bitflags", 194 230 "byteorder", ··· 217 253 218 254 [[package]] 219 255 name = "itoa" 220 - version = "1.0.2" 256 + version = "1.0.3" 221 257 source = "registry+https://github.com/rust-lang/crates.io-index" 222 - checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" 258 + checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" 259 + 260 + [[package]] 261 + name = "js-sys" 262 + version = "0.3.59" 263 + source = "registry+https://github.com/rust-lang/crates.io-index" 264 + checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" 265 + dependencies = [ 266 + "wasm-bindgen", 267 + ] 223 268 224 269 [[package]] 225 270 name = "lazy_static" ··· 229 274 230 275 [[package]] 231 276 name = "libc" 232 - version = "0.2.126" 277 + version = "0.2.132" 233 278 source = "registry+https://github.com/rust-lang/crates.io-index" 234 - checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" 279 + checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" 235 280 236 281 [[package]] 237 282 name = "libloading" ··· 308 353 309 354 [[package]] 310 355 name = "mp3-metadata" 311 - version = "0.3.3" 356 + version = "0.3.4" 312 357 source = "registry+https://github.com/rust-lang/crates.io-index" 313 - checksum = "eb969bc3573726b0bf60238d5d70f1aa6cc0f9e87f8db3e047b8309317319699" 358 + checksum = "e4eaa3a228dc218005d769b88ce3a0310f49152f2029125289e94c49474c9cc4" 314 359 315 360 [[package]] 316 361 name = "mp4ameta" ··· 339 384 340 385 [[package]] 341 386 name = "napi" 342 - version = "2.6.3" 387 + version = "2.9.0" 343 388 source = "registry+https://github.com/rust-lang/crates.io-index" 344 - checksum = "4ab98a3f0790b3488cfef37e356e54afa9251ab2555e4e270671775d419f3749" 389 + checksum = "0e2f9ad803cde148d81d0ca9e5fd4d80773d15e992d09e3a44f62f41b9af4558" 345 390 dependencies = [ 391 + "bitflags", 346 392 "ctor", 347 393 "napi-sys", 348 394 "once_cell", ··· 359 405 360 406 [[package]] 361 407 name = "napi-derive" 362 - version = "2.6.0" 408 + version = "2.9.0" 363 409 source = "registry+https://github.com/rust-lang/crates.io-index" 364 - checksum = "3aaa8a11b0ae982306d311627cafd997ef556abdf1d79a01e6e75bc1ac5cfced" 410 + checksum = "1be75210f300e9fbf386ccac1c8eaaed23410e2f7f7aa9295b78c436a172ef51" 365 411 dependencies = [ 366 412 "convert_case", 367 413 "napi-derive-backend", ··· 372 418 373 419 [[package]] 374 420 name = "napi-derive-backend" 375 - version = "1.0.34" 421 + version = "1.0.37" 376 422 source = "registry+https://github.com/rust-lang/crates.io-index" 377 - checksum = "0cdb9be87524eccc14f988825b26eaa3752e07a81cb04c34436057823d91e421" 423 + checksum = "92ba4800264fac8a7726b208d5dd4c6d637d1027d73b026061a69d3339a0a930" 378 424 dependencies = [ 379 425 "convert_case", 380 426 "once_cell", ··· 432 478 433 479 [[package]] 434 480 name = "once_cell" 435 - version = "1.13.0" 481 + version = "1.13.1" 436 482 source = "registry+https://github.com/rust-lang/crates.io-index" 437 - checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" 483 + checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" 438 484 439 485 [[package]] 440 486 name = "paste" 441 - version = "1.0.7" 487 + version = "1.0.8" 442 488 source = "registry+https://github.com/rust-lang/crates.io-index" 443 - checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" 489 + checksum = "9423e2b32f7a043629287a536f21951e8c6a82482d0acb1eeebfc90bc2225b22" 444 490 445 491 [[package]] 446 492 name = "percent-encoding" ··· 456 502 457 503 [[package]] 458 504 name = "proc-macro2" 459 - version = "1.0.42" 505 + version = "1.0.43" 460 506 source = "registry+https://github.com/rust-lang/crates.io-index" 461 - checksum = "c278e965f1d8cf32d6e0e96de3d3e79712178ae67986d9cf9151f51e95aac89b" 507 + checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" 462 508 dependencies = [ 463 509 "unicode-ident", 464 510 ] 465 511 466 512 [[package]] 467 513 name = "quote" 468 - version = "1.0.20" 514 + version = "1.0.21" 469 515 source = "registry+https://github.com/rust-lang/crates.io-index" 470 - checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" 516 + checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 471 517 dependencies = [ 472 518 "proc-macro2", 473 519 ] ··· 550 596 551 597 [[package]] 552 598 name = "ryu" 553 - version = "1.0.10" 599 + version = "1.0.11" 554 600 source = "registry+https://github.com/rust-lang/crates.io-index" 555 - checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" 601 + checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 556 602 557 603 [[package]] 558 604 name = "scopeguard" ··· 562 608 563 609 [[package]] 564 610 name = "serde" 565 - version = "1.0.140" 611 + version = "1.0.144" 566 612 source = "registry+https://github.com/rust-lang/crates.io-index" 567 - checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03" 613 + checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" 568 614 dependencies = [ 569 615 "serde_derive", 570 616 ] 571 617 572 618 [[package]] 573 619 name = "serde_derive" 574 - version = "1.0.140" 620 + version = "1.0.144" 575 621 source = "registry+https://github.com/rust-lang/crates.io-index" 576 - checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da" 622 + checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" 577 623 dependencies = [ 578 624 "proc-macro2", 579 625 "quote", ··· 582 628 583 629 [[package]] 584 630 name = "serde_json" 585 - version = "1.0.82" 631 + version = "1.0.85" 586 632 source = "registry+https://github.com/rust-lang/crates.io-index" 587 - checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" 633 + checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" 588 634 dependencies = [ 589 635 "itoa", 590 636 "ryu", ··· 593 639 594 640 [[package]] 595 641 name = "serde_repr" 596 - version = "0.1.8" 642 + version = "0.1.9" 597 643 source = "registry+https://github.com/rust-lang/crates.io-index" 598 - checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" 644 + checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca" 599 645 dependencies = [ 600 646 "proc-macro2", 601 647 "quote", ··· 604 650 605 651 [[package]] 606 652 name = "syn" 607 - version = "1.0.98" 653 + version = "1.0.99" 608 654 source = "registry+https://github.com/rust-lang/crates.io-index" 609 - checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" 655 + checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" 610 656 dependencies = [ 611 657 "proc-macro2", 612 658 "quote", ··· 629 675 630 676 [[package]] 631 677 name = "thiserror" 632 - version = "1.0.31" 678 + version = "1.0.32" 633 679 source = "registry+https://github.com/rust-lang/crates.io-index" 634 - checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" 680 + checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" 635 681 dependencies = [ 636 682 "thiserror-impl", 637 683 ] 638 684 639 685 [[package]] 640 686 name = "thiserror-impl" 641 - version = "1.0.31" 687 + version = "1.0.32" 642 688 source = "registry+https://github.com/rust-lang/crates.io-index" 643 - checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" 689 + checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" 644 690 dependencies = [ 645 691 "proc-macro2", 646 692 "quote", ··· 706 752 707 753 [[package]] 708 754 name = "unicode-ident" 709 - version = "1.0.2" 755 + version = "1.0.3" 710 756 source = "registry+https://github.com/rust-lang/crates.io-index" 711 - checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" 757 + checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" 712 758 713 759 [[package]] 714 760 name = "unicode-normalization" ··· 742 788 version = "0.11.0+wasi-snapshot-preview1" 743 789 source = "registry+https://github.com/rust-lang/crates.io-index" 744 790 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 791 + 792 + [[package]] 793 + name = "wasm-bindgen" 794 + version = "0.2.82" 795 + source = "registry+https://github.com/rust-lang/crates.io-index" 796 + checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" 797 + dependencies = [ 798 + "cfg-if", 799 + "wasm-bindgen-macro", 800 + ] 801 + 802 + [[package]] 803 + name = "wasm-bindgen-backend" 804 + version = "0.2.82" 805 + source = "registry+https://github.com/rust-lang/crates.io-index" 806 + checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" 807 + dependencies = [ 808 + "bumpalo", 809 + "log", 810 + "once_cell", 811 + "proc-macro2", 812 + "quote", 813 + "syn", 814 + "wasm-bindgen-shared", 815 + ] 816 + 817 + [[package]] 818 + name = "wasm-bindgen-macro" 819 + version = "0.2.82" 820 + source = "registry+https://github.com/rust-lang/crates.io-index" 821 + checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" 822 + dependencies = [ 823 + "quote", 824 + "wasm-bindgen-macro-support", 825 + ] 826 + 827 + [[package]] 828 + name = "wasm-bindgen-macro-support" 829 + version = "0.2.82" 830 + source = "registry+https://github.com/rust-lang/crates.io-index" 831 + checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" 832 + dependencies = [ 833 + "proc-macro2", 834 + "quote", 835 + "syn", 836 + "wasm-bindgen-backend", 837 + "wasm-bindgen-shared", 838 + ] 839 + 840 + [[package]] 841 + name = "wasm-bindgen-shared" 842 + version = "0.2.82" 843 + source = "registry+https://github.com/rust-lang/crates.io-index" 844 + checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" 745 845 746 846 [[package]] 747 847 name = "winapi"
+14
index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8" /> 5 + <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 + 7 + <link href="./src/assets/fonts.css" rel="stylesheet" /> 8 + 9 + <link rel="icon" type="image/png" href="/favicon.png" /> 10 + </head> 11 + <body> 12 + <script defer type="module" src="./src/main.ts"></script> 13 + </body> 14 + </html>
+194 -135
package-lock.json
··· 8 8 "name": "ferrum", 9 9 "version": "0.13.1", 10 10 "dependencies": { 11 - "music-metadata": "^7.12.5", 12 11 "simple-plist": "^1.3.1" 13 12 }, 14 13 "devDependencies": { 15 14 "@napi-rs/cli": "^2.11.4", 16 - "@sveltejs/vite-plugin-svelte": "^1.0.2", 15 + "@sveltejs/vite-plugin-svelte": "^1.0.3", 17 16 "@types/wicg-mediasession": "^1.1.3", 18 - "@typescript-eslint/eslint-plugin": "^5.35.1", 19 - "@typescript-eslint/parser": "^5.35.1", 17 + "@typescript-eslint/eslint-plugin": "^5.36.1", 18 + "@typescript-eslint/parser": "^5.36.1", 20 19 "concurrently": "^7.3.0", 21 20 "electron": "^14.2.9", 22 21 "electron-builder": "^23.3.3", 23 22 "eslint": "^8.23.0", 24 23 "eslint-config-prettier": "^8.5.0", 25 24 "eslint-plugin-svelte3": "^4.0.0", 25 + "music-metadata": "^7.12.5", 26 26 "prettier": "^2.7.1", 27 27 "prettier-plugin-svelte": "^2.7.0", 28 - "sass": "^1.54.5", 28 + "sass": "^1.54.6", 29 29 "svelte": "^3.49.0", 30 - "svelte-check": "^2.8.1", 30 + "svelte-check": "^2.9.0", 31 31 "svelte-preprocess": "^4.10.7", 32 32 "typescript": "^4.8.2", 33 - "vite": "^3.0.9" 33 + "vite": "^3.0.9", 34 + "vite-plugin-electron-x": "^1.1.0" 34 35 } 35 36 }, 36 37 "node_modules/@develar/schema-utils": { ··· 389 390 } 390 391 }, 391 392 "node_modules/@sveltejs/vite-plugin-svelte": { 392 - "version": "1.0.2", 393 - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.2.tgz", 394 - "integrity": "sha512-8tTVbNuraeDchBaArNbwaZLpO0feM7BRSdZU5yeM4Clasx2p1p1CYBoWh+VgxZlxiark49HXummkHqKztbl8lA==", 393 + "version": "1.0.3", 394 + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.3.tgz", 395 + "integrity": "sha512-0Qu51m2W9RBlxWPp8i31KJpnqmjWMOne8vAzgmOX6ZM9uX+/RAv6BNhEMcNoP5MsyLjyW1ZTCiJoaZZ5EeqpFg==", 395 396 "dev": true, 396 397 "dependencies": { 397 398 "@rollup/pluginutils": "^4.2.1", ··· 430 431 "node_modules/@tokenizer/token": { 431 432 "version": "0.3.0", 432 433 "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 433 - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" 434 + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", 435 + "dev": true 434 436 }, 435 437 "node_modules/@tootallnate/once": { 436 438 "version": "2.0.0", ··· 477 479 "dev": true 478 480 }, 479 481 "node_modules/@types/minimatch": { 480 - "version": "5.1.0", 481 - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.0.tgz", 482 - "integrity": "sha512-0RJHq5FqDWo17kdHe+SMDJLfxmLaqHbWnqZ6gNKzDvStUlrmx/eKIY17+ifLS1yybo7X86aUshQMlittDOVNnw==", 482 + "version": "5.1.1", 483 + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.1.tgz", 484 + "integrity": "sha512-v55NF6Dz0wrj14Rn8iEABTWrhYRmgkJYuokduunSiq++t3hZ9VZ6dvcDt+850Pm5sGJZk8RaHzkFCXPxVINZ+g==", 483 485 "dev": true, 484 486 "optional": true 485 487 }, ··· 535 537 "dev": true 536 538 }, 537 539 "node_modules/@types/yargs": { 538 - "version": "17.0.11", 539 - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", 540 - "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", 540 + "version": "17.0.12", 541 + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.12.tgz", 542 + "integrity": "sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==", 541 543 "dev": true, 542 544 "dependencies": { 543 545 "@types/yargs-parser": "*" ··· 550 552 "dev": true 551 553 }, 552 554 "node_modules/@typescript-eslint/eslint-plugin": { 553 - "version": "5.35.1", 554 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.35.1.tgz", 555 - "integrity": "sha512-RBZZXZlI4XCY4Wzgy64vB+0slT9+yAPQRjj/HSaRwUot33xbDjF1oN9BLwOLTewoOI0jothIltZRe9uJCHf8gg==", 555 + "version": "5.36.1", 556 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz", 557 + "integrity": "sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA==", 556 558 "dev": true, 557 559 "dependencies": { 558 - "@typescript-eslint/scope-manager": "5.35.1", 559 - "@typescript-eslint/type-utils": "5.35.1", 560 - "@typescript-eslint/utils": "5.35.1", 560 + "@typescript-eslint/scope-manager": "5.36.1", 561 + "@typescript-eslint/type-utils": "5.36.1", 562 + "@typescript-eslint/utils": "5.36.1", 561 563 "debug": "^4.3.4", 562 564 "functional-red-black-tree": "^1.0.1", 563 565 "ignore": "^5.2.0", ··· 583 585 } 584 586 }, 585 587 "node_modules/@typescript-eslint/parser": { 586 - "version": "5.35.1", 587 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.35.1.tgz", 588 - "integrity": "sha512-XL2TBTSrh3yWAsMYpKseBYTVpvudNf69rPOWXWVBI08My2JVT5jR66eTt4IgQFHA/giiKJW5dUD4x/ZviCKyGg==", 588 + "version": "5.36.1", 589 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", 590 + "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", 589 591 "dev": true, 590 592 "dependencies": { 591 - "@typescript-eslint/scope-manager": "5.35.1", 592 - "@typescript-eslint/types": "5.35.1", 593 - "@typescript-eslint/typescript-estree": "5.35.1", 593 + "@typescript-eslint/scope-manager": "5.36.1", 594 + "@typescript-eslint/types": "5.36.1", 595 + "@typescript-eslint/typescript-estree": "5.36.1", 594 596 "debug": "^4.3.4" 595 597 }, 596 598 "engines": { ··· 610 612 } 611 613 }, 612 614 "node_modules/@typescript-eslint/scope-manager": { 613 - "version": "5.35.1", 614 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.35.1.tgz", 615 - "integrity": "sha512-kCYRSAzIW9ByEIzmzGHE50NGAvAP3wFTaZevgWva7GpquDyFPFcmvVkFJGWJJktg/hLwmys/FZwqM9EKr2u24Q==", 615 + "version": "5.36.1", 616 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", 617 + "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", 616 618 "dev": true, 617 619 "dependencies": { 618 - "@typescript-eslint/types": "5.35.1", 619 - "@typescript-eslint/visitor-keys": "5.35.1" 620 + "@typescript-eslint/types": "5.36.1", 621 + "@typescript-eslint/visitor-keys": "5.36.1" 620 622 }, 621 623 "engines": { 622 624 "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ··· 627 629 } 628 630 }, 629 631 "node_modules/@typescript-eslint/type-utils": { 630 - "version": "5.35.1", 631 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.35.1.tgz", 632 - "integrity": "sha512-8xT8ljvo43Mp7BiTn1vxLXkjpw8wS4oAc00hMSB4L1/jIiYbjjnc3Qp2GAUOG/v8zsNCd1qwcqfCQ0BuishHkw==", 632 + "version": "5.36.1", 633 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz", 634 + "integrity": "sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q==", 633 635 "dev": true, 634 636 "dependencies": { 635 - "@typescript-eslint/utils": "5.35.1", 637 + "@typescript-eslint/typescript-estree": "5.36.1", 638 + "@typescript-eslint/utils": "5.36.1", 636 639 "debug": "^4.3.4", 637 640 "tsutils": "^3.21.0" 638 641 }, ··· 653 656 } 654 657 }, 655 658 "node_modules/@typescript-eslint/types": { 656 - "version": "5.35.1", 657 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.35.1.tgz", 658 - "integrity": "sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ==", 659 + "version": "5.36.1", 660 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", 661 + "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==", 659 662 "dev": true, 660 663 "engines": { 661 664 "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ··· 666 669 } 667 670 }, 668 671 "node_modules/@typescript-eslint/typescript-estree": { 669 - "version": "5.35.1", 670 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz", 671 - "integrity": "sha512-JUqE1+VRTGyoXlDWWjm6MdfpBYVq+hixytrv1oyjYIBEOZhBCwtpp5ZSvBt4wIA1MKWlnaC2UXl2XmYGC3BoQA==", 672 + "version": "5.36.1", 673 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", 674 + "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", 672 675 "dev": true, 673 676 "dependencies": { 674 - "@typescript-eslint/types": "5.35.1", 675 - "@typescript-eslint/visitor-keys": "5.35.1", 677 + "@typescript-eslint/types": "5.36.1", 678 + "@typescript-eslint/visitor-keys": "5.36.1", 676 679 "debug": "^4.3.4", 677 680 "globby": "^11.1.0", 678 681 "is-glob": "^4.0.3", ··· 693 696 } 694 697 }, 695 698 "node_modules/@typescript-eslint/utils": { 696 - "version": "5.35.1", 697 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.35.1.tgz", 698 - "integrity": "sha512-v6F8JNXgeBWI4pzZn36hT2HXXzoBBBJuOYvoQiaQaEEjdi5STzux3Yj8v7ODIpx36i/5s8TdzuQ54TPc5AITQQ==", 699 + "version": "5.36.1", 700 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.1.tgz", 701 + "integrity": "sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg==", 699 702 "dev": true, 700 703 "dependencies": { 701 704 "@types/json-schema": "^7.0.9", 702 - "@typescript-eslint/scope-manager": "5.35.1", 703 - "@typescript-eslint/types": "5.35.1", 704 - "@typescript-eslint/typescript-estree": "5.35.1", 705 + "@typescript-eslint/scope-manager": "5.36.1", 706 + "@typescript-eslint/types": "5.36.1", 707 + "@typescript-eslint/typescript-estree": "5.36.1", 705 708 "eslint-scope": "^5.1.1", 706 709 "eslint-utils": "^3.0.0" 707 710 }, ··· 717 720 } 718 721 }, 719 722 "node_modules/@typescript-eslint/visitor-keys": { 720 - "version": "5.35.1", 721 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.35.1.tgz", 722 - "integrity": "sha512-cEB1DvBVo1bxbW/S5axbGPE6b7FIMAbo3w+AGq6zNDA7+NYJOIkKj/sInfTv4edxd4PxJSgdN4t6/pbvgA+n5g==", 723 + "version": "5.36.1", 724 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", 725 + "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", 723 726 "dev": true, 724 727 "dependencies": { 725 - "@typescript-eslint/types": "5.35.1", 728 + "@typescript-eslint/types": "5.36.1", 726 729 "eslint-visitor-keys": "^3.3.0" 727 730 }, 728 731 "engines": { ··· 1614 1617 "version": "1.0.4", 1615 1618 "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 1616 1619 "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 1620 + "dev": true, 1617 1621 "engines": { 1618 1622 "node": ">= 0.6" 1619 1623 } ··· 1674 1678 "version": "4.3.4", 1675 1679 "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1676 1680 "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1681 + "dev": true, 1677 1682 "dependencies": { 1678 1683 "ms": "2.1.2" 1679 1684 }, ··· 2923 2928 "version": "16.5.4", 2924 2929 "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", 2925 2930 "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", 2931 + "dev": true, 2926 2932 "dependencies": { 2927 2933 "readable-web-to-node-stream": "^3.0.0", 2928 2934 "strtok3": "^6.2.4", ··· 3435 3441 "version": "1.2.1", 3436 3442 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 3437 3443 "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 3444 + "dev": true, 3438 3445 "funding": [ 3439 3446 { 3440 3447 "type": "github", ··· 3512 3519 "node_modules/inherits": { 3513 3520 "version": "2.0.4", 3514 3521 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 3515 - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 3522 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 3523 + "dev": true 3516 3524 }, 3517 3525 "node_modules/ini": { 3518 3526 "version": "1.3.8", ··· 3851 3859 } 3852 3860 }, 3853 3861 "node_modules/magic-string": { 3854 - "version": "0.26.2", 3855 - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", 3856 - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", 3862 + "version": "0.26.3", 3863 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.3.tgz", 3864 + "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==", 3857 3865 "dev": true, 3858 3866 "dependencies": { 3859 3867 "sourcemap-codec": "^1.4.8" ··· 3903 3911 "version": "1.1.0", 3904 3912 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 3905 3913 "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 3914 + "dev": true, 3906 3915 "engines": { 3907 3916 "node": ">= 0.8" 3908 3917 } ··· 4047 4056 "node_modules/ms": { 4048 4057 "version": "2.1.2", 4049 4058 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 4050 - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 4059 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 4060 + "dev": true 4051 4061 }, 4052 4062 "node_modules/music-metadata": { 4053 4063 "version": "7.12.6", 4054 4064 "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-7.12.6.tgz", 4055 4065 "integrity": "sha512-TSDdSZ1E96dCze6sRp9rnib4LFRf6Lon3qfFPZbUyn7BUz3/XyT/ciWfxFEZKEeexmAkIfhBAwH62gfO2QSdlA==", 4066 + "dev": true, 4056 4067 "dependencies": { 4057 4068 "@tokenizer/token": "^0.3.0", 4058 4069 "content-type": "^1.0.4", ··· 4284 4295 "version": "4.1.0", 4285 4296 "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", 4286 4297 "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", 4298 + "dev": true, 4287 4299 "engines": { 4288 4300 "node": ">=8" 4289 4301 }, ··· 4537 4549 "version": "3.0.2", 4538 4550 "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 4539 4551 "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 4552 + "dev": true, 4540 4553 "dependencies": { 4541 4554 "readable-stream": "^3.6.0" 4542 4555 }, ··· 4552 4565 "version": "3.6.0", 4553 4566 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 4554 4567 "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 4568 + "dev": true, 4555 4569 "dependencies": { 4556 4570 "inherits": "^2.0.3", 4557 4571 "string_decoder": "^1.1.1", ··· 4758 4772 "node_modules/safe-buffer": { 4759 4773 "version": "5.1.2", 4760 4774 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 4761 - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 4775 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 4776 + "dev": true 4762 4777 }, 4763 4778 "node_modules/safer-buffer": { 4764 4779 "version": "2.1.2", ··· 4800 4815 } 4801 4816 }, 4802 4817 "node_modules/sass": { 4803 - "version": "1.54.5", 4804 - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.5.tgz", 4805 - "integrity": "sha512-p7DTOzxkUPa/63FU0R3KApkRHwcVZYC0PLnLm5iyZACyp15qSi32x7zVUhRdABAATmkALqgGrjCJAcWvobmhHw==", 4818 + "version": "1.54.6", 4819 + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.6.tgz", 4820 + "integrity": "sha512-DUqJjR2WxXBcZjRSZX5gCVyU+9fuC2qDfFzoKX9rV4rCOcec5mPtEafTcfsyL3YJuLONjWylBne+uXVh5rrmFw==", 4806 4821 "dev": true, 4807 4822 "dependencies": { 4808 4823 "chokidar": ">=3.0.0 <4.0.0", ··· 5055 5070 "version": "1.1.1", 5056 5071 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 5057 5072 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 5073 + "dev": true, 5058 5074 "dependencies": { 5059 5075 "safe-buffer": "~5.1.0" 5060 5076 } ··· 5113 5129 "version": "6.3.0", 5114 5130 "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", 5115 5131 "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", 5132 + "dev": true, 5116 5133 "dependencies": { 5117 5134 "@tokenizer/token": "^0.3.0", 5118 5135 "peek-readable": "^4.1.0" ··· 5174 5191 } 5175 5192 }, 5176 5193 "node_modules/svelte-check": { 5177 - "version": "2.8.1", 5178 - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.8.1.tgz", 5179 - "integrity": "sha512-cibyY1sgt3ONIDnQbSgV2X9AJFhwEslRHNo95lijrYfPzVEvTvbmL2ohsUyqB5L7j1GhLXtQbjCJ4lZZ/fwbeQ==", 5194 + "version": "2.9.0", 5195 + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.9.0.tgz", 5196 + "integrity": "sha512-9AVrtP7WbfDgCdqTZNPdj5CCCy1OrYMxFVWAWzNw7fl93c9klFJFtqzVXa6fovfQ050CcpUyJE2dPFL9TFAREw==", 5180 5197 "dev": true, 5181 5198 "dependencies": { 5182 5199 "@jridgewell/trace-mapping": "^0.3.9", ··· 5408 5425 "version": "4.2.1", 5409 5426 "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", 5410 5427 "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", 5428 + "dev": true, 5411 5429 "dependencies": { 5412 5430 "@tokenizer/token": "^0.3.0", 5413 5431 "ieee754": "^1.2.1" ··· 5624 5642 "node_modules/util-deprecate": { 5625 5643 "version": "1.0.2", 5626 5644 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 5627 - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 5645 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 5646 + "dev": true 5628 5647 }, 5629 5648 "node_modules/verror": { 5630 5649 "version": "1.10.1", ··· 5689 5708 } 5690 5709 } 5691 5710 }, 5711 + "node_modules/vite-plugin-electron-x": { 5712 + "version": "1.1.0", 5713 + "resolved": "https://registry.npmjs.org/vite-plugin-electron-x/-/vite-plugin-electron-x-1.1.0.tgz", 5714 + "integrity": "sha512-nLvhclSk1y+S9HOEiNVHZAsSt5bhrccxVeZtkl7scpuzBdYw5XvLeey5Mi6paQT+LvVxIAMjVU2p1zL+idp7Sg==", 5715 + "dev": true, 5716 + "dependencies": { 5717 + "esbuild": "^0.14.47" 5718 + }, 5719 + "peerDependencies": { 5720 + "electron": "*", 5721 + "vite": "^3.0.0" 5722 + } 5723 + }, 5692 5724 "node_modules/which": { 5693 5725 "version": "2.0.2", 5694 5726 "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", ··· 6098 6130 "dev": true 6099 6131 }, 6100 6132 "@sveltejs/vite-plugin-svelte": { 6101 - "version": "1.0.2", 6102 - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.2.tgz", 6103 - "integrity": "sha512-8tTVbNuraeDchBaArNbwaZLpO0feM7BRSdZU5yeM4Clasx2p1p1CYBoWh+VgxZlxiark49HXummkHqKztbl8lA==", 6133 + "version": "1.0.3", 6134 + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.3.tgz", 6135 + "integrity": "sha512-0Qu51m2W9RBlxWPp8i31KJpnqmjWMOne8vAzgmOX6ZM9uX+/RAv6BNhEMcNoP5MsyLjyW1ZTCiJoaZZ5EeqpFg==", 6104 6136 "dev": true, 6105 6137 "requires": { 6106 6138 "@rollup/pluginutils": "^4.2.1", ··· 6123 6155 "@tokenizer/token": { 6124 6156 "version": "0.3.0", 6125 6157 "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 6126 - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" 6158 + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", 6159 + "dev": true 6127 6160 }, 6128 6161 "@tootallnate/once": { 6129 6162 "version": "2.0.0", ··· 6167 6200 "dev": true 6168 6201 }, 6169 6202 "@types/minimatch": { 6170 - "version": "5.1.0", 6171 - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.0.tgz", 6172 - "integrity": "sha512-0RJHq5FqDWo17kdHe+SMDJLfxmLaqHbWnqZ6gNKzDvStUlrmx/eKIY17+ifLS1yybo7X86aUshQMlittDOVNnw==", 6203 + "version": "5.1.1", 6204 + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.1.tgz", 6205 + "integrity": "sha512-v55NF6Dz0wrj14Rn8iEABTWrhYRmgkJYuokduunSiq++t3hZ9VZ6dvcDt+850Pm5sGJZk8RaHzkFCXPxVINZ+g==", 6173 6206 "dev": true, 6174 6207 "optional": true 6175 6208 }, ··· 6225 6258 "dev": true 6226 6259 }, 6227 6260 "@types/yargs": { 6228 - "version": "17.0.11", 6229 - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", 6230 - "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", 6261 + "version": "17.0.12", 6262 + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.12.tgz", 6263 + "integrity": "sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==", 6231 6264 "dev": true, 6232 6265 "requires": { 6233 6266 "@types/yargs-parser": "*" ··· 6240 6273 "dev": true 6241 6274 }, 6242 6275 "@typescript-eslint/eslint-plugin": { 6243 - "version": "5.35.1", 6244 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.35.1.tgz", 6245 - "integrity": "sha512-RBZZXZlI4XCY4Wzgy64vB+0slT9+yAPQRjj/HSaRwUot33xbDjF1oN9BLwOLTewoOI0jothIltZRe9uJCHf8gg==", 6276 + "version": "5.36.1", 6277 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz", 6278 + "integrity": "sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA==", 6246 6279 "dev": true, 6247 6280 "requires": { 6248 - "@typescript-eslint/scope-manager": "5.35.1", 6249 - "@typescript-eslint/type-utils": "5.35.1", 6250 - "@typescript-eslint/utils": "5.35.1", 6281 + "@typescript-eslint/scope-manager": "5.36.1", 6282 + "@typescript-eslint/type-utils": "5.36.1", 6283 + "@typescript-eslint/utils": "5.36.1", 6251 6284 "debug": "^4.3.4", 6252 6285 "functional-red-black-tree": "^1.0.1", 6253 6286 "ignore": "^5.2.0", ··· 6257 6290 } 6258 6291 }, 6259 6292 "@typescript-eslint/parser": { 6260 - "version": "5.35.1", 6261 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.35.1.tgz", 6262 - "integrity": "sha512-XL2TBTSrh3yWAsMYpKseBYTVpvudNf69rPOWXWVBI08My2JVT5jR66eTt4IgQFHA/giiKJW5dUD4x/ZviCKyGg==", 6293 + "version": "5.36.1", 6294 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", 6295 + "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", 6263 6296 "dev": true, 6264 6297 "requires": { 6265 - "@typescript-eslint/scope-manager": "5.35.1", 6266 - "@typescript-eslint/types": "5.35.1", 6267 - "@typescript-eslint/typescript-estree": "5.35.1", 6298 + "@typescript-eslint/scope-manager": "5.36.1", 6299 + "@typescript-eslint/types": "5.36.1", 6300 + "@typescript-eslint/typescript-estree": "5.36.1", 6268 6301 "debug": "^4.3.4" 6269 6302 } 6270 6303 }, 6271 6304 "@typescript-eslint/scope-manager": { 6272 - "version": "5.35.1", 6273 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.35.1.tgz", 6274 - "integrity": "sha512-kCYRSAzIW9ByEIzmzGHE50NGAvAP3wFTaZevgWva7GpquDyFPFcmvVkFJGWJJktg/hLwmys/FZwqM9EKr2u24Q==", 6305 + "version": "5.36.1", 6306 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", 6307 + "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", 6275 6308 "dev": true, 6276 6309 "requires": { 6277 - "@typescript-eslint/types": "5.35.1", 6278 - "@typescript-eslint/visitor-keys": "5.35.1" 6310 + "@typescript-eslint/types": "5.36.1", 6311 + "@typescript-eslint/visitor-keys": "5.36.1" 6279 6312 } 6280 6313 }, 6281 6314 "@typescript-eslint/type-utils": { 6282 - "version": "5.35.1", 6283 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.35.1.tgz", 6284 - "integrity": "sha512-8xT8ljvo43Mp7BiTn1vxLXkjpw8wS4oAc00hMSB4L1/jIiYbjjnc3Qp2GAUOG/v8zsNCd1qwcqfCQ0BuishHkw==", 6315 + "version": "5.36.1", 6316 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz", 6317 + "integrity": "sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q==", 6285 6318 "dev": true, 6286 6319 "requires": { 6287 - "@typescript-eslint/utils": "5.35.1", 6320 + "@typescript-eslint/typescript-estree": "5.36.1", 6321 + "@typescript-eslint/utils": "5.36.1", 6288 6322 "debug": "^4.3.4", 6289 6323 "tsutils": "^3.21.0" 6290 6324 } 6291 6325 }, 6292 6326 "@typescript-eslint/types": { 6293 - "version": "5.35.1", 6294 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.35.1.tgz", 6295 - "integrity": "sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ==", 6327 + "version": "5.36.1", 6328 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", 6329 + "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==", 6296 6330 "dev": true 6297 6331 }, 6298 6332 "@typescript-eslint/typescript-estree": { 6299 - "version": "5.35.1", 6300 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz", 6301 - "integrity": "sha512-JUqE1+VRTGyoXlDWWjm6MdfpBYVq+hixytrv1oyjYIBEOZhBCwtpp5ZSvBt4wIA1MKWlnaC2UXl2XmYGC3BoQA==", 6333 + "version": "5.36.1", 6334 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", 6335 + "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", 6302 6336 "dev": true, 6303 6337 "requires": { 6304 - "@typescript-eslint/types": "5.35.1", 6305 - "@typescript-eslint/visitor-keys": "5.35.1", 6338 + "@typescript-eslint/types": "5.36.1", 6339 + "@typescript-eslint/visitor-keys": "5.36.1", 6306 6340 "debug": "^4.3.4", 6307 6341 "globby": "^11.1.0", 6308 6342 "is-glob": "^4.0.3", ··· 6311 6345 } 6312 6346 }, 6313 6347 "@typescript-eslint/utils": { 6314 - "version": "5.35.1", 6315 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.35.1.tgz", 6316 - "integrity": "sha512-v6F8JNXgeBWI4pzZn36hT2HXXzoBBBJuOYvoQiaQaEEjdi5STzux3Yj8v7ODIpx36i/5s8TdzuQ54TPc5AITQQ==", 6348 + "version": "5.36.1", 6349 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.1.tgz", 6350 + "integrity": "sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg==", 6317 6351 "dev": true, 6318 6352 "requires": { 6319 6353 "@types/json-schema": "^7.0.9", 6320 - "@typescript-eslint/scope-manager": "5.35.1", 6321 - "@typescript-eslint/types": "5.35.1", 6322 - "@typescript-eslint/typescript-estree": "5.35.1", 6354 + "@typescript-eslint/scope-manager": "5.36.1", 6355 + "@typescript-eslint/types": "5.36.1", 6356 + "@typescript-eslint/typescript-estree": "5.36.1", 6323 6357 "eslint-scope": "^5.1.1", 6324 6358 "eslint-utils": "^3.0.0" 6325 6359 } 6326 6360 }, 6327 6361 "@typescript-eslint/visitor-keys": { 6328 - "version": "5.35.1", 6329 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.35.1.tgz", 6330 - "integrity": "sha512-cEB1DvBVo1bxbW/S5axbGPE6b7FIMAbo3w+AGq6zNDA7+NYJOIkKj/sInfTv4edxd4PxJSgdN4t6/pbvgA+n5g==", 6362 + "version": "5.36.1", 6363 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", 6364 + "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", 6331 6365 "dev": true, 6332 6366 "requires": { 6333 - "@typescript-eslint/types": "5.35.1", 6367 + "@typescript-eslint/types": "5.36.1", 6334 6368 "eslint-visitor-keys": "^3.3.0" 6335 6369 } 6336 6370 }, ··· 7009 7043 "content-type": { 7010 7044 "version": "1.0.4", 7011 7045 "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 7012 - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 7046 + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 7047 + "dev": true 7013 7048 }, 7014 7049 "core-util-is": { 7015 7050 "version": "1.0.3", ··· 7054 7089 "version": "4.3.4", 7055 7090 "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 7056 7091 "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 7092 + "dev": true, 7057 7093 "requires": { 7058 7094 "ms": "2.1.2" 7059 7095 } ··· 7924 7960 "version": "16.5.4", 7925 7961 "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", 7926 7962 "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", 7963 + "dev": true, 7927 7964 "requires": { 7928 7965 "readable-web-to-node-stream": "^3.0.0", 7929 7966 "strtok3": "^6.2.4", ··· 8312 8349 "ieee754": { 8313 8350 "version": "1.2.1", 8314 8351 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 8315 - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 8352 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 8353 + "dev": true 8316 8354 }, 8317 8355 "ignore": { 8318 8356 "version": "5.2.0", ··· 8361 8399 "inherits": { 8362 8400 "version": "2.0.4", 8363 8401 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 8364 - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 8402 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 8403 + "dev": true 8365 8404 }, 8366 8405 "ini": { 8367 8406 "version": "1.3.8", ··· 8619 8658 } 8620 8659 }, 8621 8660 "magic-string": { 8622 - "version": "0.26.2", 8623 - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", 8624 - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", 8661 + "version": "0.26.3", 8662 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.3.tgz", 8663 + "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==", 8625 8664 "dev": true, 8626 8665 "requires": { 8627 8666 "sourcemap-codec": "^1.4.8" ··· 8657 8696 "media-typer": { 8658 8697 "version": "1.1.0", 8659 8698 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 8660 - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==" 8699 + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 8700 + "dev": true 8661 8701 }, 8662 8702 "merge2": { 8663 8703 "version": "1.4.1", ··· 8760 8800 "ms": { 8761 8801 "version": "2.1.2", 8762 8802 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 8763 - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 8803 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 8804 + "dev": true 8764 8805 }, 8765 8806 "music-metadata": { 8766 8807 "version": "7.12.6", 8767 8808 "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-7.12.6.tgz", 8768 8809 "integrity": "sha512-TSDdSZ1E96dCze6sRp9rnib4LFRf6Lon3qfFPZbUyn7BUz3/XyT/ciWfxFEZKEeexmAkIfhBAwH62gfO2QSdlA==", 8810 + "dev": true, 8769 8811 "requires": { 8770 8812 "@tokenizer/token": "^0.3.0", 8771 8813 "content-type": "^1.0.4", ··· 8934 8976 "peek-readable": { 8935 8977 "version": "4.1.0", 8936 8978 "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", 8937 - "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" 8979 + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", 8980 + "dev": true 8938 8981 }, 8939 8982 "pend": { 8940 8983 "version": "1.2.0", ··· 9108 9151 "version": "3.0.2", 9109 9152 "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 9110 9153 "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 9154 + "dev": true, 9111 9155 "requires": { 9112 9156 "readable-stream": "^3.6.0" 9113 9157 }, ··· 9116 9160 "version": "3.6.0", 9117 9161 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 9118 9162 "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 9163 + "dev": true, 9119 9164 "requires": { 9120 9165 "inherits": "^2.0.3", 9121 9166 "string_decoder": "^1.1.1", ··· 9258 9303 "safe-buffer": { 9259 9304 "version": "5.1.2", 9260 9305 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 9261 - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 9306 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 9307 + "dev": true 9262 9308 }, 9263 9309 "safer-buffer": { 9264 9310 "version": "2.1.2", ··· 9299 9345 } 9300 9346 }, 9301 9347 "sass": { 9302 - "version": "1.54.5", 9303 - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.5.tgz", 9304 - "integrity": "sha512-p7DTOzxkUPa/63FU0R3KApkRHwcVZYC0PLnLm5iyZACyp15qSi32x7zVUhRdABAATmkALqgGrjCJAcWvobmhHw==", 9348 + "version": "1.54.6", 9349 + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.6.tgz", 9350 + "integrity": "sha512-DUqJjR2WxXBcZjRSZX5gCVyU+9fuC2qDfFzoKX9rV4rCOcec5mPtEafTcfsyL3YJuLONjWylBne+uXVh5rrmFw==", 9305 9351 "dev": true, 9306 9352 "requires": { 9307 9353 "chokidar": ">=3.0.0 <4.0.0", ··· 9497 9543 "version": "1.1.1", 9498 9544 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 9499 9545 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 9546 + "dev": true, 9500 9547 "requires": { 9501 9548 "safe-buffer": "~5.1.0" 9502 9549 } ··· 9540 9587 "version": "6.3.0", 9541 9588 "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", 9542 9589 "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", 9590 + "dev": true, 9543 9591 "requires": { 9544 9592 "@tokenizer/token": "^0.3.0", 9545 9593 "peek-readable": "^4.1.0" ··· 9576 9624 "dev": true 9577 9625 }, 9578 9626 "svelte-check": { 9579 - "version": "2.8.1", 9580 - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.8.1.tgz", 9581 - "integrity": "sha512-cibyY1sgt3ONIDnQbSgV2X9AJFhwEslRHNo95lijrYfPzVEvTvbmL2ohsUyqB5L7j1GhLXtQbjCJ4lZZ/fwbeQ==", 9627 + "version": "2.9.0", 9628 + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.9.0.tgz", 9629 + "integrity": "sha512-9AVrtP7WbfDgCdqTZNPdj5CCCy1OrYMxFVWAWzNw7fl93c9klFJFtqzVXa6fovfQ050CcpUyJE2dPFL9TFAREw==", 9582 9630 "dev": true, 9583 9631 "requires": { 9584 9632 "@jridgewell/trace-mapping": "^0.3.9", ··· 9727 9775 "version": "4.2.1", 9728 9776 "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", 9729 9777 "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", 9778 + "dev": true, 9730 9779 "requires": { 9731 9780 "@tokenizer/token": "^0.3.0", 9732 9781 "ieee754": "^1.2.1" ··· 9894 9943 "util-deprecate": { 9895 9944 "version": "1.0.2", 9896 9945 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 9897 - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 9946 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 9947 + "dev": true 9898 9948 }, 9899 9949 "verror": { 9900 9950 "version": "1.10.1", ··· 9928 9978 "postcss": "^8.4.16", 9929 9979 "resolve": "^1.22.1", 9930 9980 "rollup": ">=2.75.6 <2.77.0 || ~2.77.0" 9981 + } 9982 + }, 9983 + "vite-plugin-electron-x": { 9984 + "version": "1.1.0", 9985 + "resolved": "https://registry.npmjs.org/vite-plugin-electron-x/-/vite-plugin-electron-x-1.1.0.tgz", 9986 + "integrity": "sha512-nLvhclSk1y+S9HOEiNVHZAsSt5bhrccxVeZtkl7scpuzBdYw5XvLeey5Mi6paQT+LvVxIAMjVU2p1zL+idp7Sg==", 9987 + "dev": true, 9988 + "requires": { 9989 + "esbuild": "^0.14.47" 9931 9990 } 9932 9991 }, 9933 9992 "which": {
+15 -15
package.json
··· 13 13 "build": "npm run napi && npm run build:web && electron-builder", 14 14 "build:web": "vite build", 15 15 "electron-builder": "electron-builder", 16 - "lint": "prettier --check --plugin-search-dir=. src *.js && eslint src *.js && svelte-check", 17 - "format": "prettier --write --plugin-search-dir=. src *.js && eslint --fix src *.js", 16 + "lint": "prettier --check --plugin-search-dir=. src && eslint src && svelte-check", 17 + "format": "prettier --write --plugin-search-dir=. src && eslint --fix src", 18 18 "check": "npm run lint && cargo check" 19 19 }, 20 20 "build": { ··· 23 23 "artifactName": "${productName}-v${version}-${os}.${ext}", 24 24 "mac": { 25 25 "category": "public.app-category.music", 26 - "icon": "assets/icons/icon.icns", 26 + "icon": "assets/icon.icns", 27 27 "target": [ 28 28 "dmg" 29 29 ], ··· 33 33 }, 34 34 "linux": { 35 35 "category": "Audio", 36 - "icon": "assets/icons/icon.icns", 36 + "icon": "assets/icon.icns", 37 37 "maintainer": "kasper.space <example@example.com>", 38 38 "target": [ 39 39 "deb", ··· 41 41 ] 42 42 }, 43 43 "win": { 44 - "icon": "assets/icons/icon.ico", 44 + "icon": "assets/icon.ico", 45 45 "target": [ 46 46 "nsis" 47 47 ] 48 48 }, 49 49 "files": [ 50 50 "build/web", 51 - "src/electron.js", 52 - "src/electron/**/*.js", 51 + "build/electron", 53 52 "build/addon.node" 54 53 ], 55 54 "directories": { ··· 57 56 "output": "build/app" 58 57 } 59 58 }, 60 - "main": "./src/electron.js", 59 + "main": "build/electron/main.js", 61 60 "napi": { 62 61 "name": "addon" 63 62 }, 64 63 "devDependencies": { 65 64 "@napi-rs/cli": "^2.11.4", 66 - "@sveltejs/vite-plugin-svelte": "^1.0.2", 65 + "@sveltejs/vite-plugin-svelte": "^1.0.3", 67 66 "@types/wicg-mediasession": "^1.1.3", 68 - "@typescript-eslint/eslint-plugin": "^5.35.1", 69 - "@typescript-eslint/parser": "^5.35.1", 67 + "@typescript-eslint/eslint-plugin": "^5.36.1", 68 + "@typescript-eslint/parser": "^5.36.1", 70 69 "concurrently": "^7.3.0", 71 70 "electron": "^14.2.9", 72 71 "electron-builder": "^23.3.3", 73 72 "eslint": "^8.23.0", 74 73 "eslint-config-prettier": "^8.5.0", 75 74 "eslint-plugin-svelte3": "^4.0.0", 75 + "music-metadata": "^7.12.5", 76 76 "prettier": "^2.7.1", 77 77 "prettier-plugin-svelte": "^2.7.0", 78 - "sass": "^1.54.5", 78 + "sass": "^1.54.6", 79 79 "svelte": "^3.49.0", 80 - "svelte-check": "^2.8.1", 80 + "svelte-check": "^2.9.0", 81 81 "svelte-preprocess": "^4.10.7", 82 82 "typescript": "^4.8.2", 83 - "vite": "^3.0.9" 83 + "vite": "^3.0.9", 84 + "vite-plugin-electron-x": "^1.1.0" 84 85 }, 85 86 "dependencies": { 86 - "music-metadata": "^7.12.5", 87 87 "simple-plist": "^1.3.1" 88 88 }, 89 89 "prettier": {
-3
src/components/TrackList.svelte
··· 223 223 } 224 224 225 225 let dragLine: HTMLElement 226 - let dragging = false 227 226 let indexes: number[] = [] 228 227 function onDragStart(e: DragEvent) { 229 228 if (e.dataTransfer) { ··· 233 232 indexes.push(i) 234 233 } 235 234 } 236 - dragging = true 237 235 e.dataTransfer.effectAllowed = 'move' 238 236 if (indexes.length === 1) { 239 237 const track = page.getTrack(indexes[0]) ··· 279 277 } 280 278 } 281 279 function dragEndHandler() { 282 - dragging = false 283 280 if (dragToIndex !== null) { 284 281 const newSelection = page.moveTracks(indexes, dragToIndex) 285 282 for (let i = newSelection.from; i <= newSelection.to; i++) {
+22 -25
src/electron.js src/electron/main.ts
··· 1 - /* eslint-disable @typescript-eslint/no-var-requires */ 2 - const { app, ipcMain, session, BrowserWindow, dialog, protocol } = require('electron') 3 - const is = require('./electron/is.js') 1 + import { app, ipcMain, session, BrowserWindow, dialog, protocol } from 'electron' 2 + import is from './is' 3 + 4 4 if (is.dev) app.setName('Ferrum Dev') 5 5 6 - const menubar = require('./electron/menubar.js') 7 - const shortcuts = require('./electron/shortcuts.js') 8 - require('./electron/ipc.js') 9 - const path = require('path') 6 + import { initMenuBar } from './menubar' 7 + import { initMediaKeys } from './shortcuts' 8 + import('./ipc') 9 + import path from 'path' 10 10 11 - async function errHandler(msg, error) { 12 - if (app.isReady()) { 11 + async function errHandler(msg: string, error: Error) { 12 + app.whenReady().then(() => { 13 13 dialog.showMessageBoxSync({ 14 14 type: 'error', 15 15 message: msg, 16 16 detail: error.stack, 17 17 title: 'Error', 18 18 }) 19 - } else { 20 - app.on('msg, error', () => { 21 - errHandler(msg, error) 22 - }) 23 - } 19 + errHandler(msg, error) 20 + }) 24 21 } 25 22 process.on('uncaughtException', (error) => { 26 23 errHandler('Unhandled Error', error) 27 24 }) 28 - process.on('unhandledRejection', (error) => { 25 + process.on('unhandledRejection', (error: Error) => { 29 26 errHandler('Unhandled Promise Rejection', error) 30 27 }) 31 28 ··· 44 41 app.quit() 45 42 }) 46 43 47 - app.on('ready', async () => { 48 - let mainWindow = new BrowserWindow({ 44 + app.whenReady().then(async () => { 45 + let mainWindow: BrowserWindow | null = new BrowserWindow({ 49 46 width: 1300, 50 47 height: 1000, 51 48 minWidth: 850, ··· 55 52 nativeWindowOpen: true, 56 53 contextIsolation: false, 57 54 nodeIntegration: true, 58 - preload: path.resolve(__dirname, './electron/preload.js'), 55 + preload: path.resolve(__dirname, './preload.js'), 59 56 }, 60 57 backgroundColor: '#0D1115', 61 58 show: false, 62 59 }) 63 60 64 61 if (!is.dev) { 65 - await shortcuts.initMediaKeys(mainWindow) 62 + await initMediaKeys(mainWindow) 66 63 } 67 64 68 65 protocol.registerFileProtocol('track', (request, callback) => { ··· 80 77 }) 81 78 }) 82 79 83 - if (is.dev) mainWindow.loadURL('http://localhost:' + (process.env.PORT || 8089)) 80 + if (is.dev) mainWindow.loadURL(process.env.VITE_DEV_SERVER_URL || 'missing') 84 81 else mainWindow.loadFile(path.resolve(__dirname, '../build/web/index.html')) 85 82 86 83 if (is.dev) mainWindow.webContents.openDevTools() 87 84 88 85 mainWindow.once('ready-to-show', () => { 89 - mainWindow.show() 86 + mainWindow?.show() 90 87 }) 91 88 92 89 mainWindow.on('close', (e) => { 93 90 if (!quitting) { 94 91 e.preventDefault() 95 - mainWindow.hide() 92 + mainWindow?.hide() 96 93 } 97 94 }) 98 95 mainWindow.on('closed', () => { ··· 101 98 102 99 // doesn't fire on Windows :( 103 100 app.on('before-quit', () => { 104 - mainWindow.webContents.send('gonnaQuit') 101 + mainWindow?.webContents.send('gonnaQuit') 105 102 ipcMain.once('readyToQuit', () => { 106 103 quitting = true 107 - mainWindow.close() 104 + mainWindow?.close() 108 105 }) 109 106 }) 110 107 ··· 114 111 } 115 112 }) 116 113 117 - menubar.initMenuBar(app, mainWindow) 114 + initMenuBar(app, mainWindow) 118 115 })
+145 -53
src/electron/import_itunes.js src/electron/import_itunes.ts
··· 1 - /* eslint-disable @typescript-eslint/no-var-requires */ 2 - const { ipcRenderer } = require('electron') 3 - const simplePlist = require('simple-plist') 4 - const path = require('path') 5 - const url = require('url') 6 - const fs = require('fs') 7 - const mm = require('music-metadata') 8 - const addon = require('../../build/addon.node') 1 + import { ipcRenderer } from 'electron' 2 + import simplePlist from 'simple-plist' 3 + import path from 'path' 4 + import url from 'url' 5 + import fs from 'fs' 6 + import mm from 'music-metadata' 7 + import addon from '../../build/addon.node' 8 + import { 9 + Playlist as LibraryPlaylist, 10 + Folder as LibraryFolder, 11 + Track as LibraryTrack, 12 + TrackListsHashMap, 13 + SpecialTrackListName, 14 + } from '../lib/libraryTypes' 15 + 16 + type Track = LibraryTrack & { 17 + importedFrom: 'itunes' 18 + dateImported: number 19 + duration: number 20 + bitrate: number 21 + sampleRate: number 22 + name: string 23 + originalId: string 24 + } 25 + 26 + type XmlTrack = { 27 + 'Date Modified': Date 28 + 'Date Added': Date 29 + 'Play Date UTC': Date 30 + importedFrom: 'itunes' 31 + Artist?: string 32 + Name?: string 33 + 'Persistent ID'?: string 34 + Composer?: string 35 + 'Sort Name'?: string 36 + 'Sort Artist'?: string 37 + 'Sort Composer'?: string 38 + Genre?: string 39 + Rating?: unknown // TODO 40 + Year?: unknown // TODO 41 + BPM?: unknown // TODO 42 + Comments?: string 43 + Grouping?: string 44 + 'Play Count'?: unknown // TODO 45 + 'Volume Adjustment': number 46 + } 47 + 48 + type TrackList = Playlist | Folder 49 + 50 + type Playlist = LibraryPlaylist & { 51 + importedFrom: 'itunes' 52 + originalId: string 53 + dateImported: number 54 + } 55 + 56 + type Folder = LibraryFolder & { 57 + name: string 58 + description?: string 59 + liked?: string 60 + disliked?: string 61 + /** For example "itunes" */ 62 + importedFrom?: string 63 + /** For example iTunes Persistent ID */ 64 + originalId?: string 65 + dateImported?: number 66 + dateCreated?: number 67 + children: string[] 68 + } 69 + 70 + type Paths = { 71 + library_dir: string 72 + tracks_dir: string 73 + library_json: string 74 + } 9 75 10 - module.exports = iTunesImport 11 - async function iTunesImport(paths, status, warn) { 12 - const warnings = [] 76 + type Result = { cancelled: boolean; warnings: string[]; err?: Error } 77 + export async function iTunesImport( 78 + paths: Paths, 79 + status: (msg: string) => void, 80 + warn: (msg: string) => void 81 + ): Promise<Result> { 82 + const warnings: string[] = [] 13 83 try { 14 84 const result = await start(paths, status, (warning) => { 15 85 warnings.push(warning) 16 86 warn(warning) 17 87 }) 18 - result.warnings = warnings 19 - return result 88 + return { ...result, warnings } 20 89 } catch (err) { 21 - if (!err.message) err.message = err.code 22 90 console.error(err) 23 - return { err, warnings } 91 + return { err: new Error('Unknown'), warnings, cancelled: true } 24 92 } 25 93 } 26 94 27 - function sanitizeFilename(str) { 95 + function sanitizeFilename(str: string) { 28 96 str = str.replaceAll('/', '_') 29 97 str = str.replaceAll('?', '_') 30 98 str = str.replaceAll('<', '_') ··· 40 108 return str.substring(0, 230) 41 109 } 42 110 43 - function generateFilename(track, originalPath, tracksDir) { 111 + function generateFilename(track: Track, originalPath: string, tracksDir: string): string { 44 112 const name = track.name || '' 45 113 const artist = track.artist || '' 46 114 const beginning = sanitizeFilename(artist + ' - ' + name) ··· 61 129 let filename 62 130 for (let i = 0; i < 999; i++) { 63 131 if (i === 500) { 64 - throw new Error('Already got 500 tracks with that artist and title') 132 + break 65 133 } 66 134 filename = beginning + ending + ext 67 135 const filepath = path.join(tracksDir, filename) ··· 69 137 fileNum++ 70 138 ending = ' ' + fileNum 71 139 } else { 72 - break 140 + return filename 73 141 } 74 142 } 75 - return filename 143 + throw new Error('Already got 500 tracks with that artist and title') 76 144 } 77 145 78 - function readPlist(filePath) { 146 + function readPlist(filePath: string) { 79 147 return new Promise((resolve, reject) => { 80 148 simplePlist.readFile(filePath, (err, data) => { 81 149 if (err) reject(err) ··· 88 156 let result = '' 89 157 const characters = 'abcdefghijklmnopqrstuvwxyz234567' 90 158 const charactersLength = characters.length 91 - for (var i = 0; i < length; i++) { 159 + for (let i = 0; i < length; i++) { 92 160 result += characters.charAt(Math.floor(Math.random() * charactersLength)) 93 161 } 94 162 return result 95 163 } 96 164 97 - function buffersEqual(buf1, buf2) { 165 + function buffersEqual(buf1: Buffer, buf2: Buffer) { 98 166 return Buffer.compare(buf1, buf2) === 0 99 167 } 100 168 ··· 139 207 return {} 140 208 } 141 209 142 - async function parseTrack(xmlTrack, warn, startTime, dryRun, paths) { 143 - const track = {} 210 + enum Info { 211 + Required = 1, 212 + Recommended = 1, 213 + } 214 + 215 + async function parseTrack( 216 + xmlTrack: XmlTrack, 217 + warn: (msg: string) => void, 218 + startTime: number, 219 + dryRun: boolean, 220 + paths: Paths 221 + ) { 222 + const track: Track = { 223 + importedFrom: 'itunes', 224 + dateImported: startTime, 225 + } 144 226 const logPrefix = '[' + xmlTrack['Artist'] + ' - ' + xmlTrack['Name'] + ']' 145 - const REQUIRED = 1 146 - const RECOMMENDED = 2 147 - const addIfTruthy = function (prop, value, info) { 227 + function addIfTruthy(prop: string, value: string | Date | undefined, info?: Info) { 148 228 if (value instanceof Date) { 149 229 track[prop] = value.getTime() 150 230 } else if (value) { 151 231 track[prop] = value 152 - } else if (info === REQUIRED) { 232 + } else if (info === Info.Required) { 153 233 throw new Error(logPrefix + ` Track missing required field "${prop}"`) 154 - } else if (info === RECOMMENDED) { 234 + } else if (info === Info.Recommended) { 155 235 warn(logPrefix + ` Missing recommended field "${prop}"`) 156 236 } 157 237 } 158 - addIfTruthy('name', xmlTrack['Name'], RECOMMENDED) 238 + addIfTruthy('name', xmlTrack['Name'], Info.Recommended) 159 239 addIfTruthy('originalId', xmlTrack['Persistent ID']) 160 - track['importedFrom'] = 'itunes' 161 - addIfTruthy('artist', xmlTrack['Artist'], RECOMMENDED) 240 + addIfTruthy('artist', xmlTrack['Artist'], Info.Recommended) 162 241 addIfTruthy('composer', xmlTrack['Composer']) 163 242 addIfTruthy('sortName', xmlTrack['Sort Name']) 164 243 addIfTruthy('sortArtist', xmlTrack['Sort Artist']) ··· 167 246 addIfTruthy('rating', xmlTrack['Rating']) 168 247 addIfTruthy('year', xmlTrack['Year']) 169 248 addIfTruthy('bpm', xmlTrack['BPM']) 170 - addIfTruthy('dateModified', xmlTrack['Date Modified'], REQUIRED) 171 - addIfTruthy('dateAdded', xmlTrack['Date Added'], REQUIRED) 172 - track['dateImported'] = startTime 249 + addIfTruthy('dateModified', xmlTrack['Date Modified'], Info.Required) 250 + addIfTruthy('dateAdded', xmlTrack['Date Added'], Info.Required) 173 251 addIfTruthy('comments', xmlTrack['Comments']) 174 252 addIfTruthy('grouping', xmlTrack['Grouping']) 175 253 if (xmlTrack['Play Count'] && xmlTrack['Play Count'] >= 1) { 176 254 track['playCount'] = xmlTrack['Play Count'] 177 255 // Unlike "Skip Date" etc, "Play Date" is a non-UTC Mac HFS+ timestamp, but 178 256 // luckily "Play Date UTC" is a normal date. 179 - let playDate = xmlTrack['Play Date UTC'] 257 + const playDate = xmlTrack['Play Date UTC'] 180 258 let importedPlayCount = xmlTrack['Play Count'] 181 259 if (playDate !== undefined) { 182 260 // if we have a playDate, add a play for it ··· 195 273 } 196 274 if (xmlTrack['Skip Count'] && xmlTrack['Skip Count'] >= 1) { 197 275 track['skipCount'] = xmlTrack['Skip Count'] 198 - let skipDate = xmlTrack['Skip Date'] 276 + const skipDate = xmlTrack['Skip Date'] 199 277 let importedSkipCount = xmlTrack['Skip Count'] 200 278 if (skipDate !== undefined) { 201 279 // if we have a skipDate, add a skip for it ··· 334 412 return track 335 413 } 336 414 337 - function addCommonPlaylistFields(playlist, xmlPlaylist, startTime) { 338 - const addIfTruthy = function (prop, value) { 339 - if (value) playlist[prop] = value 340 - } 415 + type XmlPlaylist = { 416 + Name: string 417 + Description?: string 418 + Loved?: string 419 + Disliked?: string 420 + 'Playlist Persistent ID': string 421 + } 422 + 423 + function addCommonPlaylistFields(playlist: TrackList, xmlPlaylist: XmlPlaylist, startTime: number) { 341 424 if (!xmlPlaylist['Name']) { 342 - throw new Error('Playlist missing required field "Name":', xmlPlaylist) 425 + throw new Error('Playlist missing required field "Name": ' + String(xmlPlaylist)) 343 426 } 344 427 playlist.name = xmlPlaylist['Name'] 345 - addIfTruthy('description', xmlPlaylist['Description']) 346 - addIfTruthy('liked', xmlPlaylist['Loved']) 347 - addIfTruthy('disliked', xmlPlaylist['Disliked']) 428 + if (xmlPlaylist['Description']) playlist.description = xmlPlaylist['Description'] 429 + if (xmlPlaylist['Loved']) playlist.liked = xmlPlaylist['Loved'] 430 + if (xmlPlaylist['Disliked']) playlist.disliked = xmlPlaylist['Disliked'] 348 431 playlist.originalId = xmlPlaylist['Playlist Persistent ID'] 349 432 playlist.importedFrom = 'itunes' 350 433 playlist.dateImported = startTime 351 434 } 352 435 353 - async function start(paths, status, warn) { 436 + type StartResult = { 437 + err?: Error 438 + cancelled: boolean 439 + } 440 + async function start( 441 + paths: Paths, 442 + status: (msg: string) => void, 443 + warn: (msg: string) => void 444 + ): Promise<StartResult> { 354 445 // const filePath = '/Users/kasper/Downloads/Library.xml' 355 446 // const dryRun = false 356 447 const { filePath, dryRun } = await popup() ··· 393 484 // contains podcasts, etc. 394 485 const xmlMusicPlaylistItems = xmlMusicPlaylist['Playlist Items'] 395 486 const startTime = new Date().getTime() 396 - const parsedTracks = {} 397 - const trackIdMap = {} 487 + const parsedTracks: Record<string, Track> = {} 488 + /** iTunes ID -> Ferrum ID */ 489 + const trackIdMap: Record<string, string> = {} 398 490 for (let i = 0; i < xmlMusicPlaylistItems.length; i++) { 399 491 status(`Parsing tracks... (${i + 1}/${xmlMusicPlaylistItems.length})`) 400 492 const xmlPlaylistItem = xmlMusicPlaylistItems[i] ··· 412 504 } 413 505 414 506 status('Parsing folders...') 415 - const parsedPlaylists = { 507 + const parsedPlaylists: TrackListsHashMap = { 416 508 root: { 417 - name: 'Root', 509 + name: SpecialTrackListName.Root, 418 510 id: 'root', 419 511 type: 'special', 420 512 dateCreated: startTime, ··· 424 516 const folderIdMap = {} 425 517 for (const xmlPlaylist of xmlPlaylists) { 426 518 if (xmlPlaylist['Folder'] !== true) continue 427 - const playlist = { type: 'folder', children: [] } 519 + const playlist: Folder = { type: 'folder', children: [] } 428 520 addCommonPlaylistFields(playlist, xmlPlaylist, startTime) 429 521 let id 430 522 do { ··· 494 586 if (dryRun) return { cancelled: true } 495 587 496 588 status('Saving...') 497 - let newLibrary = { 589 + const newLibrary = { 498 590 version: 1, 499 591 tracks: parsedTracks, 500 592 trackLists: parsedPlaylists,
+14 -11
src/electron/ipc.js src/electron/ipc.ts
··· 1 - /* eslint-disable @typescript-eslint/no-var-requires */ 2 - const { ipcMain, dialog, Menu, shell } = require('electron') 3 - const path = require('path') 4 - const is = require('./is.js') 1 + import { ipcMain, dialog, Menu, shell, BrowserWindow } from 'electron' 2 + import path from 'path' 3 + import is from './is' 5 4 6 5 ipcMain.handle('showMessageBox', async (e, options) => { 7 6 return await dialog.showMessageBox(options) 8 7 }) 9 8 10 9 ipcMain.handle('showMessageBoxAttached', async (e, options) => { 11 - const window = e.sender.getOwnerBrowserWindow() 12 - return await dialog.showMessageBox(window, options) 10 + const window = BrowserWindow.fromWebContents(e.sender) 11 + if (window) { 12 + return await dialog.showMessageBox(window, options) 13 + } else { 14 + return await dialog.showMessageBox(options) 15 + } 13 16 }) 14 17 15 18 ipcMain.handle('showOpenDialog', async (e, attached, options) => { 16 - const window = e.sender.getOwnerBrowserWindow() 17 - if (attached === true) { 19 + const window = BrowserWindow.fromWebContents(e.sender) 20 + if (attached === true && window) { 18 21 return await dialog.showOpenDialog(window, options) 19 22 } else { 20 23 return await dialog.showOpenDialog(options) ··· 64 67 visible: playlist === true, 65 68 }, 66 69 ]) 67 - menu.once('will-close', () => resolve()) 70 + menu.once('menu-will-close', () => resolve(null)) 68 71 menu.popup() 69 72 }) 70 73 }) ··· 87 90 click: () => resolve('New Folder'), 88 91 }, 89 92 ] 90 - let menuItems = editMenu 93 + let menuItems: Electron.MenuItemConstructorOptions[] = editMenu 91 94 if (newOnly) { 92 95 menuItems = newMenu 93 96 } else if (isFolder) { ··· 95 98 } 96 99 97 100 const menu = Menu.buildFromTemplate(menuItems) 98 - menu.once('will-close', () => resolve()) 101 + menu.once('menu-will-close', () => resolve(null)) 99 102 menu.popup() 100 103 }) 101 104 })
+1 -1
src/electron/is.js src/electron/is.ts
··· 1 - module.exports = { 1 + export default { 2 2 dev: process.env.NODE_ENV === 'development', 3 3 mac: process.platform === 'darwin', 4 4 windows: process.platform === 'win32',
+3 -4
src/electron/menubar.js src/electron/menubar.ts
··· 1 - /* eslint-disable @typescript-eslint/no-var-requires */ 2 - const { Menu, shell } = require('electron') 3 - const is = require('./is.js') 1 + import { Menu, shell } from 'electron' 2 + import is from './is' 4 3 5 - module.exports.initMenuBar = (app, mainWindow) => { 4 + export function initMenuBar(app, mainWindow) { 6 5 const template = [ 7 6 ...(is.mac 8 7 ? [
-11
src/electron/preload.js
··· 1 - /* eslint-disable @typescript-eslint/no-var-requires */ 2 - const path = require('path') 3 - const iTunesImport = require('./import_itunes.js') 4 - window.addon = require('../../build/addon.node') 5 - 6 - window.joinPaths = (...args) => { 7 - const combinedPath = path.join(...args) 8 - return combinedPath 9 - } 10 - 11 - window.iTunesImport = iTunesImport
+14
src/electron/preload.ts
··· 1 + import path from 'path' 2 + import is from './is' 3 + import addon from '../../build/addon.node' 4 + import { iTunesImport } from './import_itunes' 5 + 6 + window.addon = addon 7 + window.isDev = is.dev 8 + window.isMac = is.mac 9 + window.iTunesImport = iTunesImport 10 + 11 + window.joinPaths = (...args) => { 12 + const combinedPath = path.join(...args) 13 + return combinedPath 14 + }
+5 -7
src/electron/shortcuts.js src/electron/shortcuts.ts
··· 1 - /* eslint-disable @typescript-eslint/no-var-requires */ 2 - const { globalShortcut, dialog, systemPreferences } = require('electron') 3 - const is = require('./is.js') 1 + import { globalShortcut, dialog, systemPreferences } from 'electron' 2 + import is from './is' 4 3 5 4 function tryRegistering(mainWindow) { 6 - let success1 = globalShortcut.register('MediaPlayPause', () => { 5 + const success1 = globalShortcut.register('MediaPlayPause', () => { 7 6 if (mainWindow !== null) mainWindow.webContents.send('playPause') 8 7 }) 9 8 if (!success1) return false ··· 56 55 } 57 56 } 58 57 59 - async function initMediaKeys(mainWindow) { 60 - let success = tryRegistering(mainWindow) 58 + export async function initMediaKeys(mainWindow) { 59 + const success = tryRegistering(mainWindow) 61 60 if (!success) { 62 61 if (is.mac) { 63 62 if (systemPreferences.isTrustedAccessibilityClient(false)) { ··· 76 75 } 77 76 } 78 77 } 79 - module.exports = { initMediaKeys }
-14
src/index.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="utf-8" /> 5 - <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 - 7 - <link href="./assets/fonts.css" rel="stylesheet" /> 8 - 9 - <link rel="icon" type="image/png" href="/favicon.png" /> 10 - </head> 11 - <body> 12 - <script defer type="module" src="./main.ts"></script> 13 - </body> 14 - </html>
+2 -2
src/lib/data.ts
··· 18 18 length: number 19 19 } 20 20 21 - export const isDev = process.env.NODE_ENV === 'development' 22 - export const isMac = process.platform === 'darwin' 21 + export const isDev = window.isDev 22 + export const isMac = window.isMac 23 23 export type Data = { 24 24 get_paths: () => { 25 25 library_dir: string
+1 -1
src/lib/libraryTypes.ts
··· 124 124 children: TrackListID[] 125 125 } 126 126 127 - enum SpecialTrackListName { 127 + export enum SpecialTrackListName { 128 128 Root, 129 129 }
+2
src/lib/window.ts
··· 15 15 declare global { 16 16 interface Window { 17 17 addon: addon 18 + isDev: boolean 19 + isMac: boolean 18 20 joinPaths: (...args: string[]) => string 19 21 iTunesImport: ( 20 22 paths: { library_dir: string; tracks_dir: string; library_json: string },
+2 -2
tsconfig.json
··· 1 1 { 2 2 "compilerOptions": { 3 3 "moduleResolution": "node", 4 - "target": "es2019", 4 + "target": "es2021", 5 5 "module": "es2020", 6 - "lib": ["es2020"], 6 + "lib": ["es2021"], 7 7 8 8 // svelte-preprocess can't tell if you're importing a value or 9 9 // type, so require 'import type' instead of 'import' for types
+17 -17
vite.config.ts
··· 1 1 import { resolve } from 'path' 2 - import { exec } from 'child_process' 3 2 import { defineConfig } from 'vite' 4 3 import { svelte } from '@sveltejs/vite-plugin-svelte' 5 4 import sveltePreprocess from 'svelte-preprocess' 5 + import { electronX } from 'vite-plugin-electron-x' 6 6 7 7 export default defineConfig({ 8 - root: './src', 9 8 base: './', // use relative paths 10 9 clearScreen: false, 11 10 resolve: { ··· 13 12 '@': resolve(__dirname, './src'), 14 13 }, 15 14 }, 16 - server: { 17 - port: Number(process.env.PORT) || 8089, 18 - strictPort: true, 19 - }, 20 15 build: { 21 - outDir: '../build/web', 16 + outDir: './build/web', 22 17 emptyOutDir: true, 23 18 minify: false, 24 19 sourcemap: true, ··· 28 23 svelte({ 29 24 preprocess: sveltePreprocess(), 30 25 }), 31 - { 32 - name: 'electron-start', 33 - configureServer(server) { 34 - server.httpServer?.once('listening', () => { 35 - console.log('\nStarting Electron...') 36 - const child = exec('NODE_ENV=development electron .') 37 - child.stdout?.pipe(process.stdout) 38 - child.stderr?.pipe(process.stderr) 39 - }) 26 + electronX({ 27 + dev: { 28 + env: { 29 + NODE_ENV: 'development', 30 + }, 31 + }, 32 + main: { 33 + entry: './src/electron/main.ts', 34 + outDir: './build/electron', 40 35 }, 41 - }, 36 + preload: { 37 + entry: './src/electron/preload.ts', 38 + external: [resolve('./build/addon.node'), 'simple-plist'], 39 + outDir: './build/electron', 40 + }, 41 + }), 42 42 ], 43 43 })