A music player that connects to your cloud/distributed storage.
5
fork

Configure Feed

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

Closes #329

+545 -441
+2
CHANGELOG.md
··· 4 4 5 5 - **Removes usage of the Web Audio API, just uses `<audio>` elements now so that Diffuse can be played in the background on iOS.** _Sadly this also means the equalizer has been removed, but a better volume control has been added instead, one that doesn't move away from the tracks view._ 6 6 - **Adds a command palette.** 7 + - **Adds app version info and an update button to the settings page.** 7 8 - Correctly scrobbles repeated tracks with Last.fm 8 9 - Disables single-audio-node mode on Safari & iOS (ie. preloading now works) 9 10 - Fixes Fission integration 11 + - Fixes issue with search where you couldn't have the `:` character in your search term 10 12 - Improves detection of new versions and upgrading in the background (ie. service worker) 11 13 - Improves launcher design (called Alfred internally) 12 14 - Improves key bindings
+14 -6
Justfile
··· 88 88 mv {{BUILD_DIR}}/ui.elm.tmp.js {{BUILD_DIR}}/ui.elm.js 89 89 90 90 91 - @js: vendor-js 91 + js: vendor-js 92 + #!/usr/bin/env bash 93 + build_timestamp="`date '+%s'`" 92 94 echo "> Compiling Javascript code" 93 95 94 96 # Main builds 95 97 {{ESBUILD}} ./src/Javascript/index.js \ 96 - --outfile={{BUILD_DIR}}/ui.js 98 + --outfile={{BUILD_DIR}}/ui.js \ 99 + --define:BUILD_TIMESTAMP=$build_timestamp 97 100 98 101 {{ESBUILD}} ./src/Javascript/Brain/index.js \ 99 102 --inject:./system/Js/node-shims.js \ ··· 104 107 --outfile={{BUILD_DIR}}/search.js 105 108 106 109 {{ESBUILD}} ./src/Javascript/Workers/service.js \ 107 - --outfile={{BUILD_DIR}}/service-worker.js 110 + --outfile={{BUILD_DIR}}/service-worker.js \ 111 + --define:BUILD_TIMESTAMP=$build_timestamp 108 112 109 113 110 - @js-prod: vendor-js 114 + js-prod: vendor-js 115 + #!/usr/bin/env bash 116 + build_timestamp="`date '+%s'`" 111 117 echo "> Compiling Javascript code (optimised)" 112 118 113 119 # Main builds 114 120 {{ESBUILD}} ./src/Javascript/index.js \ 115 121 --minify \ 116 - --outfile={{BUILD_DIR}}/ui.js 122 + --outfile={{BUILD_DIR}}/ui.js \ 123 + --define:BUILD_TIMESTAMP=$build_timestamp 117 124 118 125 {{ESBUILD}} ./src/Javascript/Brain/index.js \ 119 126 --minify \ ··· 127 134 128 135 {{ESBUILD}} ./src/Javascript/Workers/service.js \ 129 136 --minify \ 130 - --outfile={{BUILD_DIR}}/service-worker.js 137 + --outfile={{BUILD_DIR}}/service-worker.js \ 138 + --define:BUILD_TIMESTAMP=$build_timestamp 131 139 132 140 133 141 @license:
+9 -9
package.json
··· 8 8 "license": "SEE LICENSE IN LICENSE", 9 9 "devDependencies": { 10 10 "assert": "^2.0.0", 11 - "autoprefixer": "^10.4.2", 11 + "autoprefixer": "^10.4.7", 12 12 "buffer": "^6.0.3", 13 - "elm-review": "^2.7.0", 14 - "esbuild": "^0.14.23", 15 - "eslint": "^8.9.0", 13 + "elm-review": "^2.7.2", 14 + "esbuild": "^0.14.42", 15 + "eslint": "^8.17.0", 16 16 "events": "^3.3.0", 17 - "postcss": "^8.4.6", 18 - "postcss-custom-properties": "^12.1.4", 19 - "postcss-import": "^14.0.2", 20 - "tailwindcss": "^3.0.23", 17 + "postcss": "^8.4.14", 18 + "postcss-custom-properties": "^12.1.7", 19 + "postcss-import": "^14.1.0", 20 + "tailwindcss": "^3.0.24", 21 21 "tailwindcss-animations": "^2.0.0", 22 22 "tailwindcss-interaction-variants": "^5.0.0" 23 23 }, ··· 29 29 "jszip": "^3.7.1", 30 30 "load-script2": "^2.0.5", 31 31 "lunr": "^2.3.8", 32 - "music-metadata-browser": "^2.5.4", 32 + "music-metadata-browser": "^2.5.6", 33 33 "p-retry": "^4.6.1", 34 34 "remotestoragejs": "^1.2.3", 35 35 "subworkers": "^1.0.1",
+231 -392
pnpm-lock.yaml
··· 1 - lockfileVersion: 5.3 1 + lockfileVersion: 5.4 2 2 3 3 specifiers: 4 4 '@tokenizer/http': ^0.6.0 5 5 assert: ^2.0.0 6 - autoprefixer: ^10.4.2 6 + autoprefixer: ^10.4.7 7 7 buffer: ^6.0.3 8 8 delay: ^5.0.0 9 - elm-review: ^2.7.0 10 - esbuild: ^0.14.23 11 - eslint: ^8.9.0 9 + elm-review: ^2.7.2 10 + esbuild: ^0.14.42 11 + eslint: ^8.17.0 12 12 events: ^3.3.0 13 13 fast-text-encoding: ^1.0.3 14 14 file-saver: ^2.0.2 15 15 jszip: ^3.7.1 16 16 load-script2: ^2.0.5 17 17 lunr: ^2.3.8 18 - music-metadata-browser: ^2.5.4 18 + music-metadata-browser: ^2.5.6 19 19 p-retry: ^4.6.1 20 - postcss: ^8.4.6 21 - postcss-custom-properties: ^12.1.4 22 - postcss-import: ^14.0.2 20 + postcss: ^8.4.14 21 + postcss-custom-properties: ^12.1.7 22 + postcss-import: ^14.1.0 23 23 remotestoragejs: ^1.2.3 24 24 subworkers: ^1.0.1 25 - tailwindcss: ^3.0.23 25 + tailwindcss: ^3.0.24 26 26 tailwindcss-animations: ^2.0.0 27 27 tailwindcss-interaction-variants: ^5.0.0 28 28 timer.js: ^1.0.4 ··· 38 38 jszip: 3.7.1 39 39 load-script2: 2.0.6 40 40 lunr: 2.3.9 41 - music-metadata-browser: 2.5.4 41 + music-metadata-browser: 2.5.6 42 42 p-retry: 4.6.1 43 43 remotestoragejs: 1.2.3 44 44 subworkers: 1.0.1 ··· 49 49 50 50 devDependencies: 51 51 assert: 2.0.0 52 - autoprefixer: 10.4.2_postcss@8.4.6 52 + autoprefixer: 10.4.7_postcss@8.4.14 53 53 buffer: 6.0.3 54 - elm-review: 2.7.0 55 - esbuild: 0.14.23 56 - eslint: 8.9.0 54 + elm-review: 2.7.2 55 + esbuild: 0.14.42 56 + eslint: 8.17.0 57 57 events: 3.3.0 58 - postcss: 8.4.6 59 - postcss-custom-properties: 12.1.4_postcss@8.4.6 60 - postcss-import: 14.0.2_postcss@8.4.6 61 - tailwindcss: 3.0.23_autoprefixer@10.4.2 58 + postcss: 8.4.14 59 + postcss-custom-properties: 12.1.7_postcss@8.4.14 60 + postcss-import: 14.1.0_postcss@8.4.14 61 + tailwindcss: 3.0.24 62 62 tailwindcss-animations: 2.0.0 63 63 tailwindcss-interaction-variants: 5.0.0 64 64 65 65 packages: 66 66 67 - /@babel/code-frame/7.12.11: 68 - resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} 69 - dependencies: 70 - '@babel/highlight': 7.14.5 71 - dev: true 72 - 73 - /@babel/helper-validator-identifier/7.14.8: 74 - resolution: {integrity: sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==} 75 - engines: {node: '>=6.9.0'} 76 - dev: true 77 - 78 - /@babel/highlight/7.14.5: 79 - resolution: {integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==} 80 - engines: {node: '>=6.9.0'} 81 - dependencies: 82 - '@babel/helper-validator-identifier': 7.14.8 83 - chalk: 2.4.2 84 - js-tokens: 4.0.0 85 - dev: true 86 - 87 - /@eslint/eslintrc/1.1.0: 88 - resolution: {integrity: sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==} 67 + /@eslint/eslintrc/1.3.0: 68 + resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} 89 69 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 90 70 dependencies: 91 71 ajv: 6.12.6 92 - debug: 4.3.3 93 - espree: 9.3.1 94 - globals: 13.10.0 95 - ignore: 4.0.6 72 + debug: 4.3.4 73 + espree: 9.3.2 74 + globals: 13.15.0 75 + ignore: 5.2.0 96 76 import-fresh: 3.3.0 97 77 js-yaml: 4.1.0 98 - minimatch: 3.0.4 78 + minimatch: 3.1.2 99 79 strip-json-comments: 3.1.1 100 80 transitivePeerDependencies: 101 81 - supports-color ··· 106 86 engines: {node: '>=10.10.0'} 107 87 dependencies: 108 88 '@humanwhocodes/object-schema': 1.2.1 109 - debug: 4.3.3 110 - minimatch: 3.0.4 89 + debug: 4.3.4 90 + minimatch: 3.1.2 111 91 transitivePeerDependencies: 112 92 - supports-color 113 93 dev: true ··· 223 203 /@tokenizer/range/0.3.3: 224 204 resolution: {integrity: sha512-kEIGyLK31/woTYkdJLAVXTcZ6d55J/Ir2y/2S9PnA4MjJPRqlZBssDwKSkEwnuLEZEhQPscKkIC1husW1UC08A==} 225 205 dependencies: 226 - debug: 4.3.3 206 + debug: 4.3.4 227 207 strtok3: 6.0.4 228 208 transitivePeerDependencies: 229 209 - supports-color ··· 267 247 /@types/node/16.4.1: 268 248 resolution: {integrity: sha512-UW7cbLqf/Wu5XH2RKKY1cHwUNLicIDRLMraYKz+HHAerJ0ZffUEk+fMnd8qU2JaS6cAy0r8tsaf7yqHASf/Y0Q==} 269 249 270 - /@types/parse-json/4.0.0: 271 - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} 272 - dev: true 273 - 274 250 /@types/responselike/1.0.0: 275 251 resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} 276 252 dependencies: ··· 287 263 dev: false 288 264 optional: true 289 265 290 - /acorn-jsx/5.3.2_acorn@8.7.0: 266 + /acorn-jsx/5.3.2_acorn@8.7.1: 291 267 resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 292 268 peerDependencies: 293 269 acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 294 270 dependencies: 295 - acorn: 8.7.0 271 + acorn: 8.7.1 296 272 dev: true 297 273 298 274 /acorn-node/1.8.2: ··· 314 290 hasBin: true 315 291 dev: true 316 292 317 - /acorn/8.7.0: 318 - resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} 293 + /acorn/8.7.1: 294 + resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} 319 295 engines: {node: '>=0.4.0'} 320 296 hasBin: true 321 297 dev: true ··· 339 315 /ansi-regex/5.0.1: 340 316 resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 341 317 engines: {node: '>=8'} 342 - dev: true 343 - 344 - /ansi-styles/3.2.1: 345 - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 346 - engines: {node: '>=4'} 347 - dependencies: 348 - color-convert: 1.9.3 349 318 dev: true 350 319 351 320 /ansi-styles/4.3.0: ··· 385 354 engines: {node: '>= 4.0.0'} 386 355 dev: true 387 356 388 - /autoprefixer/10.4.2_postcss@8.4.6: 389 - resolution: {integrity: sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==} 357 + /autoprefixer/10.4.7_postcss@8.4.14: 358 + resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} 390 359 engines: {node: ^10 || ^12 || >=14} 391 360 hasBin: true 392 361 peerDependencies: 393 362 postcss: ^8.1.0 394 363 dependencies: 395 - browserslist: 4.19.1 396 - caniuse-lite: 1.0.30001311 397 - fraction.js: 4.1.3 364 + browserslist: 4.20.3 365 + caniuse-lite: 1.0.30001346 366 + fraction.js: 4.2.0 398 367 normalize-range: 0.1.2 399 368 picocolors: 1.0.0 400 - postcss: 8.4.6 369 + postcss: 8.4.14 401 370 postcss-value-parser: 4.2.0 402 371 dev: true 403 372 ··· 447 416 resolution: {integrity: sha512-lv4M2Z6RKJpyJijJzBQL5MNssS7i8yedl+QkhnLCyPtgNGNSXv1KthzUnye9NlRAtBAI80X6S9i+vK09Rzjcvg==} 448 417 dev: false 449 418 450 - /browserslist/4.19.1: 451 - resolution: {integrity: sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==} 419 + /browserslist/4.20.3: 420 + resolution: {integrity: sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==} 452 421 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 453 422 hasBin: true 454 423 dependencies: 455 - caniuse-lite: 1.0.30001311 456 - electron-to-chromium: 1.4.68 424 + caniuse-lite: 1.0.30001346 425 + electron-to-chromium: 1.4.146 457 426 escalade: 3.1.1 458 - node-releases: 2.0.2 427 + node-releases: 2.0.5 459 428 picocolors: 1.0.0 460 429 dev: true 461 430 ··· 509 478 engines: {node: '>= 6'} 510 479 dev: true 511 480 512 - /caniuse-lite/1.0.30001311: 513 - resolution: {integrity: sha512-mleTFtFKfykEeW34EyfhGIFjGCqzhh38Y0LhdQ9aWF+HorZTtdgKV/1hEE0NlFkG2ubvisPV6l400tlbPys98A==} 481 + /caniuse-lite/1.0.30001346: 482 + resolution: {integrity: sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==} 514 483 dev: true 515 484 516 485 /cborg/1.6.1: ··· 518 487 hasBin: true 519 488 dev: false 520 489 521 - /chalk/2.4.2: 522 - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 523 - engines: {node: '>=4'} 524 - dependencies: 525 - ansi-styles: 3.2.1 526 - escape-string-regexp: 1.0.5 527 - supports-color: 5.5.0 528 - dev: true 529 - 530 - /chalk/4.1.1: 531 - resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} 532 - engines: {node: '>=10'} 533 - dependencies: 534 - ansi-styles: 4.3.0 535 - supports-color: 7.2.0 536 - dev: true 537 - 538 490 /chalk/4.1.2: 539 491 resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 540 492 engines: {node: '>=10'} 541 493 dependencies: 542 494 ansi-styles: 4.3.0 543 495 supports-color: 7.2.0 544 - dev: true 545 - 546 - /chokidar/3.5.2: 547 - resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} 548 - engines: {node: '>= 8.10.0'} 549 - dependencies: 550 - anymatch: 3.1.2 551 - braces: 3.0.2 552 - glob-parent: 5.1.2 553 - is-binary-path: 2.1.0 554 - is-glob: 4.0.3 555 - normalize-path: 3.0.0 556 - readdirp: 3.6.0 557 - optionalDependencies: 558 - fsevents: 2.3.2 559 496 dev: true 560 497 561 498 /chokidar/3.5.3: ··· 597 534 dev: true 598 535 599 536 /clone-response/1.0.2: 600 - resolution: {integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=} 537 + resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} 601 538 dependencies: 602 539 mimic-response: 1.0.1 603 540 dev: true 604 541 605 542 /clone/1.0.4: 606 - resolution: {integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4=} 543 + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} 607 544 engines: {node: '>=0.8'} 608 545 dev: true 609 546 610 - /color-convert/1.9.3: 611 - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 612 - dependencies: 613 - color-name: 1.1.3 614 - dev: true 615 - 616 547 /color-convert/2.0.1: 617 548 resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 618 549 engines: {node: '>=7.0.0'} ··· 620 551 color-name: 1.1.4 621 552 dev: true 622 553 623 - /color-name/1.1.3: 624 - resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 625 - dev: true 626 - 627 554 /color-name/1.1.4: 628 555 resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 629 556 dev: true ··· 641 568 resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} 642 569 dev: false 643 570 644 - /cosmiconfig/7.0.1: 645 - resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} 646 - engines: {node: '>=10'} 647 - dependencies: 648 - '@types/parse-json': 4.0.0 649 - import-fresh: 3.3.0 650 - parse-json: 5.1.0 651 - path-type: 4.0.0 652 - yaml: 1.10.2 653 - dev: true 654 - 655 571 /cross-spawn/7.0.3: 656 572 resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 657 573 engines: {node: '>= 8'} ··· 683 599 ms: 2.1.2 684 600 dev: false 685 601 686 - /debug/4.3.3: 687 - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} 602 + /debug/4.3.4: 603 + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 688 604 engines: {node: '>=6.0'} 689 605 peerDependencies: 690 606 supports-color: '*' ··· 702 618 dev: true 703 619 704 620 /deep-is/0.1.3: 705 - resolution: {integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=} 621 + resolution: {integrity: sha512-GtxAN4HvBachZzm4OnWqc45ESpUCMwkYcsjnsPs23FwJbsO+k4t0k9bQCgOmzIlpHO28+WPK/KRbRk0DDHuuDw==} 706 622 dev: true 707 623 708 624 /defaults/1.0.3: 709 - resolution: {integrity: sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=} 625 + resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} 710 626 dependencies: 711 627 clone: 1.0.4 712 628 dev: true ··· 723 639 object-keys: 1.1.1 724 640 725 641 /defined/1.0.0: 726 - resolution: {integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=} 642 + resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==} 727 643 dev: true 728 644 729 645 /delay/5.0.0: ··· 752 668 /dns-over-http-resolver/1.2.3: 753 669 resolution: {integrity: sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==} 754 670 dependencies: 755 - debug: 4.3.3 671 + debug: 4.3.4 756 672 native-fetch: 3.0.0 757 673 receptacle: 1.3.2 758 674 transitivePeerDependencies: ··· 768 684 dev: true 769 685 770 686 /duplexer3/0.1.4: 771 - resolution: {integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=} 687 + resolution: {integrity: sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==} 772 688 dev: true 773 689 774 - /electron-to-chromium/1.4.68: 775 - resolution: {integrity: sha512-cId+QwWrV8R1UawO6b9BR1hnkJ4EJPCPAr4h315vliHUtVUJDk39Sg1PMNnaWKfj5x+93ssjeJ9LKL6r8LaMiA==} 690 + /electron-to-chromium/1.4.146: 691 + resolution: {integrity: sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg==} 776 692 dev: true 777 693 778 - /elm-review/2.7.0: 779 - resolution: {integrity: sha512-PvZj6M6rHYpyAGp2MKF/TzeDawioQacBTkVxzlBBGuMoO4LXw2PMIm/NmhkxcD38l5SvDIwpWmyDKvEsMaWNhQ==} 694 + /elm-review/2.7.2: 695 + resolution: {integrity: sha512-llkRvxgR2GOmtc7wi2vAM+u9j61Pf1fmPsAbpsE4X0ZfusJv0Dddor3lHNNZ0MmpYzNxpm7npxNqYRXs5JIz9A==} 780 696 engines: {node: '>=10.0.0'} 781 697 hasBin: true 782 698 dependencies: 783 - chalk: 4.1.1 784 - chokidar: 3.5.2 699 + chalk: 4.1.2 700 + chokidar: 3.5.3 785 701 cross-spawn: 7.0.3 786 702 elm-tooling: 1.7.0 787 703 fast-levenshtein: 3.0.0 ··· 826 742 resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} 827 743 dev: false 828 744 829 - /error-ex/1.3.2: 830 - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 831 - dependencies: 832 - is-arrayish: 0.2.1 833 - dev: true 834 - 835 745 /es-abstract/1.18.3: 836 746 resolution: {integrity: sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==} 837 747 engines: {node: '>= 0.4'} ··· 865 775 resolution: {integrity: sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=} 866 776 dev: true 867 777 868 - /esbuild-android-arm64/0.14.23: 869 - resolution: {integrity: sha512-k9sXem++mINrZty1v4FVt6nC5BQCFG4K2geCIUUqHNlTdFnuvcqsY7prcKZLFhqVC1rbcJAr9VSUGFL/vD4vsw==} 778 + /esbuild-android-64/0.14.42: 779 + resolution: {integrity: sha512-P4Y36VUtRhK/zivqGVMqhptSrFILAGlYp0Z8r9UQqHJ3iWztRCNWnlBzD9HRx0DbueXikzOiwyOri+ojAFfW6A==} 780 + engines: {node: '>=12'} 781 + cpu: [x64] 782 + os: [android] 783 + requiresBuild: true 784 + dev: true 785 + optional: true 786 + 787 + /esbuild-android-arm64/0.14.42: 788 + resolution: {integrity: sha512-0cOqCubq+RWScPqvtQdjXG3Czb3AWI2CaKw3HeXry2eoA2rrPr85HF7IpdU26UWdBXgPYtlTN1LUiuXbboROhg==} 870 789 engines: {node: '>=12'} 871 790 cpu: [arm64] 872 791 os: [android] ··· 874 793 dev: true 875 794 optional: true 876 795 877 - /esbuild-darwin-64/0.14.23: 878 - resolution: {integrity: sha512-lB0XRbtOYYL1tLcYw8BoBaYsFYiR48RPrA0KfA/7RFTr4MV7Bwy/J4+7nLsVnv9FGuQummM3uJ93J3ptaTqFug==} 796 + /esbuild-darwin-64/0.14.42: 797 + resolution: {integrity: sha512-ipiBdCA3ZjYgRfRLdQwP82rTiv/YVMtW36hTvAN5ZKAIfxBOyPXY7Cejp3bMXWgzKD8B6O+zoMzh01GZsCuEIA==} 879 798 engines: {node: '>=12'} 880 799 cpu: [x64] 881 800 os: [darwin] ··· 883 802 dev: true 884 803 optional: true 885 804 886 - /esbuild-darwin-arm64/0.14.23: 887 - resolution: {integrity: sha512-yat73Z/uJ5tRcfRiI4CCTv0FSnwErm3BJQeZAh+1tIP0TUNh6o+mXg338Zl5EKChD+YGp6PN+Dbhs7qa34RxSw==} 805 + /esbuild-darwin-arm64/0.14.42: 806 + resolution: {integrity: sha512-bU2tHRqTPOaoH/4m0zYHbFWpiYDmaA0gt90/3BMEFaM0PqVK/a6MA2V/ypV5PO0v8QxN6gH5hBPY4YJ2lopXgA==} 888 807 engines: {node: '>=12'} 889 808 cpu: [arm64] 890 809 os: [darwin] ··· 892 811 dev: true 893 812 optional: true 894 813 895 - /esbuild-freebsd-64/0.14.23: 896 - resolution: {integrity: sha512-/1xiTjoLuQ+LlbfjJdKkX45qK/M7ARrbLmyf7x3JhyQGMjcxRYVR6Dw81uH3qlMHwT4cfLW4aEVBhP1aNV7VsA==} 814 + /esbuild-freebsd-64/0.14.42: 815 + resolution: {integrity: sha512-75h1+22Ivy07+QvxHyhVqOdekupiTZVLN1PMwCDonAqyXd8TVNJfIRFrdL8QmSJrOJJ5h8H1I9ETyl2L8LQDaw==} 897 816 engines: {node: '>=12'} 898 817 cpu: [x64] 899 818 os: [freebsd] ··· 901 820 dev: true 902 821 optional: true 903 822 904 - /esbuild-freebsd-arm64/0.14.23: 905 - resolution: {integrity: sha512-uyPqBU/Zcp6yEAZS4LKj5jEE0q2s4HmlMBIPzbW6cTunZ8cyvjG6YWpIZXb1KK3KTJDe62ltCrk3VzmWHp+iLg==} 823 + /esbuild-freebsd-arm64/0.14.42: 824 + resolution: {integrity: sha512-W6Jebeu5TTDQMJUJVarEzRU9LlKpNkPBbjqSu+GUPTHDCly5zZEQq9uHkmHHl7OKm+mQ2zFySN83nmfCeZCyNA==} 906 825 engines: {node: '>=12'} 907 826 cpu: [arm64] 908 827 os: [freebsd] ··· 910 829 dev: true 911 830 optional: true 912 831 913 - /esbuild-linux-32/0.14.23: 914 - resolution: {integrity: sha512-37R/WMkQyUfNhbH7aJrr1uCjDVdnPeTHGeDhZPUNhfoHV0lQuZNCKuNnDvlH/u/nwIYZNdVvz1Igv5rY/zfrzQ==} 832 + /esbuild-linux-32/0.14.42: 833 + resolution: {integrity: sha512-Ooy/Bj+mJ1z4jlWcK5Dl6SlPlCgQB9zg1UrTCeY8XagvuWZ4qGPyYEWGkT94HUsRi2hKsXvcs6ThTOjBaJSMfg==} 915 834 engines: {node: '>=12'} 916 835 cpu: [ia32] 917 836 os: [linux] ··· 919 838 dev: true 920 839 optional: true 921 840 922 - /esbuild-linux-64/0.14.23: 923 - resolution: {integrity: sha512-H0gztDP60qqr8zoFhAO64waoN5yBXkmYCElFklpd6LPoobtNGNnDe99xOQm28+fuD75YJ7GKHzp/MLCLhw2+vQ==} 841 + /esbuild-linux-64/0.14.42: 842 + resolution: {integrity: sha512-2L0HbzQfbTuemUWfVqNIjOfaTRt9zsvjnme6lnr7/MO9toz/MJ5tZhjqrG6uDWDxhsaHI2/nsDgrv8uEEN2eoA==} 924 843 engines: {node: '>=12'} 925 844 cpu: [x64] 926 845 os: [linux] ··· 928 847 dev: true 929 848 optional: true 930 849 931 - /esbuild-linux-arm/0.14.23: 932 - resolution: {integrity: sha512-x64CEUxi8+EzOAIpCUeuni0bZfzPw/65r8tC5cy5zOq9dY7ysOi5EVQHnzaxS+1NmV+/RVRpmrzGw1QgY2Xpmw==} 850 + /esbuild-linux-arm/0.14.42: 851 + resolution: {integrity: sha512-STq69yzCMhdRaWnh29UYrLSr/qaWMm/KqwaRF1pMEK7kDiagaXhSL1zQGXbYv94GuGY/zAwzK98+6idCMUOOCg==} 933 852 engines: {node: '>=12'} 934 853 cpu: [arm] 935 854 os: [linux] ··· 937 856 dev: true 938 857 optional: true 939 858 940 - /esbuild-linux-arm64/0.14.23: 941 - resolution: {integrity: sha512-c4MLOIByNHR55n3KoYf9hYDfBRghMjOiHLaoYLhkQkIabb452RWi+HsNgB41sUpSlOAqfpqKPFNg7VrxL3UX9g==} 859 + /esbuild-linux-arm64/0.14.42: 860 + resolution: {integrity: sha512-c3Ug3e9JpVr8jAcfbhirtpBauLxzYPpycjWulD71CF6ZSY26tvzmXMJYooQ2YKqDY4e/fPu5K8bm7MiXMnyxuA==} 942 861 engines: {node: '>=12'} 943 862 cpu: [arm64] 944 863 os: [linux] ··· 946 865 dev: true 947 866 optional: true 948 867 949 - /esbuild-linux-mips64le/0.14.23: 950 - resolution: {integrity: sha512-kHKyKRIAedYhKug2EJpyJxOUj3VYuamOVA1pY7EimoFPzaF3NeY7e4cFBAISC/Av0/tiV0xlFCt9q0HJ68IBIw==} 868 + /esbuild-linux-mips64le/0.14.42: 869 + resolution: {integrity: sha512-QuvpHGbYlkyXWf2cGm51LBCHx6eUakjaSrRpUqhPwjh/uvNUYvLmz2LgPTTPwCqaKt0iwL+OGVL0tXA5aDbAbg==} 951 870 engines: {node: '>=12'} 952 871 cpu: [mips64el] 953 872 os: [linux] ··· 955 874 dev: true 956 875 optional: true 957 876 958 - /esbuild-linux-ppc64le/0.14.23: 959 - resolution: {integrity: sha512-7ilAiJEPuJJnJp/LiDO0oJm5ygbBPzhchJJh9HsHZzeqO+3PUzItXi+8PuicY08r0AaaOe25LA7sGJ0MzbfBag==} 877 + /esbuild-linux-ppc64le/0.14.42: 878 + resolution: {integrity: sha512-8ohIVIWDbDT+i7lCx44YCyIRrOW1MYlks9fxTo0ME2LS/fxxdoJBwHWzaDYhjvf8kNpA+MInZvyOEAGoVDrMHg==} 960 879 engines: {node: '>=12'} 961 880 cpu: [ppc64] 962 881 os: [linux] ··· 964 883 dev: true 965 884 optional: true 966 885 967 - /esbuild-linux-riscv64/0.14.23: 968 - resolution: {integrity: sha512-fbL3ggK2wY0D8I5raPIMPhpCvODFE+Bhb5QGtNP3r5aUsRR6TQV+ZBXIaw84iyvKC8vlXiA4fWLGhghAd/h/Zg==} 886 + /esbuild-linux-riscv64/0.14.42: 887 + resolution: {integrity: sha512-DzDqK3TuoXktPyG1Lwx7vhaF49Onv3eR61KwQyxYo4y5UKTpL3NmuarHSIaSVlTFDDpcIajCDwz5/uwKLLgKiQ==} 969 888 engines: {node: '>=12'} 970 889 cpu: [riscv64] 971 890 os: [linux] ··· 973 892 dev: true 974 893 optional: true 975 894 976 - /esbuild-linux-s390x/0.14.23: 977 - resolution: {integrity: sha512-GHMDCyfy7+FaNSO8RJ8KCFsnax8fLUsOrj9q5Gi2JmZMY0Zhp75keb5abTFCq2/Oy6KVcT0Dcbyo/bFb4rIFJA==} 895 + /esbuild-linux-s390x/0.14.42: 896 + resolution: {integrity: sha512-YFRhPCxl8nb//Wn6SiS5pmtplBi4z9yC2gLrYoYI/tvwuB1jldir9r7JwAGy1Ck4D7sE7wBN9GFtUUX/DLdcEQ==} 978 897 engines: {node: '>=12'} 979 898 cpu: [s390x] 980 899 os: [linux] ··· 982 901 dev: true 983 902 optional: true 984 903 985 - /esbuild-netbsd-64/0.14.23: 986 - resolution: {integrity: sha512-ovk2EX+3rrO1M2lowJfgMb/JPN1VwVYrx0QPUyudxkxLYrWeBxDKQvc6ffO+kB4QlDyTfdtAURrVzu3JeNdA2g==} 904 + /esbuild-netbsd-64/0.14.42: 905 + resolution: {integrity: sha512-QYSD2k+oT9dqB/4eEM9c+7KyNYsIPgzYOSrmfNGDIyJrbT1d+CFVKvnKahDKNJLfOYj8N4MgyFaU9/Ytc6w5Vw==} 987 906 engines: {node: '>=12'} 988 907 cpu: [x64] 989 908 os: [netbsd] ··· 991 910 dev: true 992 911 optional: true 993 912 994 - /esbuild-openbsd-64/0.14.23: 995 - resolution: {integrity: sha512-uYYNqbVR+i7k8ojP/oIROAHO9lATLN7H2QeXKt2H310Fc8FJj4y3Wce6hx0VgnJ4k1JDrgbbiXM8rbEgQyg8KA==} 913 + /esbuild-openbsd-64/0.14.42: 914 + resolution: {integrity: sha512-M2meNVIKWsm2HMY7+TU9AxM7ZVwI9havdsw6m/6EzdXysyCFFSoaTQ/Jg03izjCsK17FsVRHqRe26Llj6x0MNA==} 996 915 engines: {node: '>=12'} 997 916 cpu: [x64] 998 917 os: [openbsd] ··· 1000 919 dev: true 1001 920 optional: true 1002 921 1003 - /esbuild-sunos-64/0.14.23: 1004 - resolution: {integrity: sha512-hAzeBeET0+SbScknPzS2LBY6FVDpgE+CsHSpe6CEoR51PApdn2IB0SyJX7vGelXzlyrnorM4CAsRyb9Qev4h9g==} 922 + /esbuild-sunos-64/0.14.42: 923 + resolution: {integrity: sha512-uXV8TAZEw36DkgW8Ak3MpSJs1ofBb3Smkc/6pZ29sCAN1KzCAQzsje4sUwugf+FVicrHvlamCOlFZIXgct+iqQ==} 1005 924 engines: {node: '>=12'} 1006 925 cpu: [x64] 1007 926 os: [sunos] ··· 1009 928 dev: true 1010 929 optional: true 1011 930 1012 - /esbuild-windows-32/0.14.23: 1013 - resolution: {integrity: sha512-Kttmi3JnohdaREbk6o9e25kieJR379TsEWF0l39PQVHXq3FR6sFKtVPgY8wk055o6IB+rllrzLnbqOw/UV60EA==} 931 + /esbuild-windows-32/0.14.42: 932 + resolution: {integrity: sha512-4iw/8qWmRICWi9ZOnJJf9sYt6wmtp3hsN4TdI5NqgjfOkBVMxNdM9Vt3626G1Rda9ya2Q0hjQRD9W1o+m6Lz6g==} 1014 933 engines: {node: '>=12'} 1015 934 cpu: [ia32] 1016 935 os: [win32] ··· 1018 937 dev: true 1019 938 optional: true 1020 939 1021 - /esbuild-windows-64/0.14.23: 1022 - resolution: {integrity: sha512-JtIT0t8ymkpl6YlmOl6zoSWL5cnCgyLaBdf/SiU/Eg3C13r0NbHZWNT/RDEMKK91Y6t79kTs3vyRcNZbfu5a8g==} 940 + /esbuild-windows-64/0.14.42: 941 + resolution: {integrity: sha512-j3cdK+Y3+a5H0wHKmLGTJcq0+/2mMBHPWkItR3vytp/aUGD/ua/t2BLdfBIzbNN9nLCRL9sywCRpOpFMx3CxzA==} 1023 942 engines: {node: '>=12'} 1024 943 cpu: [x64] 1025 944 os: [win32] ··· 1027 946 dev: true 1028 947 optional: true 1029 948 1030 - /esbuild-windows-arm64/0.14.23: 1031 - resolution: {integrity: sha512-cTFaQqT2+ik9e4hePvYtRZQ3pqOvKDVNarzql0VFIzhc0tru/ZgdLoXd6epLiKT+SzoSce6V9YJ+nn6RCn6SHw==} 949 + /esbuild-windows-arm64/0.14.42: 950 + resolution: {integrity: sha512-+lRAARnF+hf8J0mN27ujO+VbhPbDqJ8rCcJKye4y7YZLV6C4n3pTRThAb388k/zqF5uM0lS5O201u0OqoWSicw==} 1032 951 engines: {node: '>=12'} 1033 952 cpu: [arm64] 1034 953 os: [win32] ··· 1036 955 dev: true 1037 956 optional: true 1038 957 1039 - /esbuild/0.14.23: 1040 - resolution: {integrity: sha512-XjnIcZ9KB6lfonCa+jRguXyRYcldmkyZ99ieDksqW/C8bnyEX299yA4QH2XcgijCgaddEZePPTgvx/2imsq7Ig==} 958 + /esbuild/0.14.42: 959 + resolution: {integrity: sha512-V0uPZotCEHokJdNqyozH6qsaQXqmZEOiZWrXnds/zaH/0SyrIayRXWRB98CENO73MIZ9T3HBIOsmds5twWtmgw==} 1041 960 engines: {node: '>=12'} 1042 961 hasBin: true 1043 962 requiresBuild: true 1044 963 optionalDependencies: 1045 - esbuild-android-arm64: 0.14.23 1046 - esbuild-darwin-64: 0.14.23 1047 - esbuild-darwin-arm64: 0.14.23 1048 - esbuild-freebsd-64: 0.14.23 1049 - esbuild-freebsd-arm64: 0.14.23 1050 - esbuild-linux-32: 0.14.23 1051 - esbuild-linux-64: 0.14.23 1052 - esbuild-linux-arm: 0.14.23 1053 - esbuild-linux-arm64: 0.14.23 1054 - esbuild-linux-mips64le: 0.14.23 1055 - esbuild-linux-ppc64le: 0.14.23 1056 - esbuild-linux-riscv64: 0.14.23 1057 - esbuild-linux-s390x: 0.14.23 1058 - esbuild-netbsd-64: 0.14.23 1059 - esbuild-openbsd-64: 0.14.23 1060 - esbuild-sunos-64: 0.14.23 1061 - esbuild-windows-32: 0.14.23 1062 - esbuild-windows-64: 0.14.23 1063 - esbuild-windows-arm64: 0.14.23 964 + esbuild-android-64: 0.14.42 965 + esbuild-android-arm64: 0.14.42 966 + esbuild-darwin-64: 0.14.42 967 + esbuild-darwin-arm64: 0.14.42 968 + esbuild-freebsd-64: 0.14.42 969 + esbuild-freebsd-arm64: 0.14.42 970 + esbuild-linux-32: 0.14.42 971 + esbuild-linux-64: 0.14.42 972 + esbuild-linux-arm: 0.14.42 973 + esbuild-linux-arm64: 0.14.42 974 + esbuild-linux-mips64le: 0.14.42 975 + esbuild-linux-ppc64le: 0.14.42 976 + esbuild-linux-riscv64: 0.14.42 977 + esbuild-linux-s390x: 0.14.42 978 + esbuild-netbsd-64: 0.14.42 979 + esbuild-openbsd-64: 0.14.42 980 + esbuild-sunos-64: 0.14.42 981 + esbuild-windows-32: 0.14.42 982 + esbuild-windows-64: 0.14.42 983 + esbuild-windows-arm64: 0.14.42 1064 984 dev: true 1065 985 1066 986 /escalade/3.1.1: ··· 1068 988 engines: {node: '>=6'} 1069 989 dev: true 1070 990 1071 - /escape-string-regexp/1.0.5: 1072 - resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} 1073 - engines: {node: '>=0.8.0'} 1074 - dev: true 1075 - 1076 991 /escape-string-regexp/4.0.0: 1077 992 resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1078 993 engines: {node: '>=10'} ··· 1086 1001 estraverse: 5.2.0 1087 1002 dev: true 1088 1003 1089 - /eslint-utils/3.0.0_eslint@8.9.0: 1004 + /eslint-utils/3.0.0_eslint@8.17.0: 1090 1005 resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 1091 1006 engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 1092 1007 peerDependencies: 1093 1008 eslint: '>=5' 1094 1009 dependencies: 1095 - eslint: 8.9.0 1010 + eslint: 8.17.0 1096 1011 eslint-visitor-keys: 2.1.0 1097 1012 dev: true 1098 1013 ··· 1106 1021 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1107 1022 dev: true 1108 1023 1109 - /eslint/8.9.0: 1110 - resolution: {integrity: sha512-PB09IGwv4F4b0/atrbcMFboF/giawbBLVC7fyDamk5Wtey4Jh2K+rYaBhCAbUyEI4QzB1ly09Uglc9iCtFaG2Q==} 1024 + /eslint/8.17.0: 1025 + resolution: {integrity: sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==} 1111 1026 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1112 1027 hasBin: true 1113 1028 dependencies: 1114 - '@eslint/eslintrc': 1.1.0 1029 + '@eslint/eslintrc': 1.3.0 1115 1030 '@humanwhocodes/config-array': 0.9.3 1116 1031 ajv: 6.12.6 1117 1032 chalk: 4.1.2 1118 1033 cross-spawn: 7.0.3 1119 - debug: 4.3.3 1034 + debug: 4.3.4 1120 1035 doctrine: 3.0.0 1121 1036 escape-string-regexp: 4.0.0 1122 1037 eslint-scope: 7.1.1 1123 - eslint-utils: 3.0.0_eslint@8.9.0 1038 + eslint-utils: 3.0.0_eslint@8.17.0 1124 1039 eslint-visitor-keys: 3.3.0 1125 - espree: 9.3.1 1040 + espree: 9.3.2 1126 1041 esquery: 1.4.0 1127 1042 esutils: 2.0.3 1128 1043 fast-deep-equal: 3.1.3 1129 1044 file-entry-cache: 6.0.1 1130 1045 functional-red-black-tree: 1.0.1 1131 1046 glob-parent: 6.0.2 1132 - globals: 13.10.0 1047 + globals: 13.15.0 1133 1048 ignore: 5.2.0 1134 1049 import-fresh: 3.3.0 1135 1050 imurmurhash: 0.1.4 ··· 1138 1053 json-stable-stringify-without-jsonify: 1.0.1 1139 1054 levn: 0.4.1 1140 1055 lodash.merge: 4.6.2 1141 - minimatch: 3.0.4 1056 + minimatch: 3.1.2 1142 1057 natural-compare: 1.4.0 1143 1058 optionator: 0.9.1 1144 1059 regexpp: 3.2.0 ··· 1150 1065 - supports-color 1151 1066 dev: true 1152 1067 1153 - /espree/9.3.1: 1154 - resolution: {integrity: sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==} 1068 + /espree/9.3.2: 1069 + resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} 1155 1070 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1156 1071 dependencies: 1157 - acorn: 8.7.0 1158 - acorn-jsx: 5.3.2_acorn@8.7.0 1072 + acorn: 8.7.1 1073 + acorn-jsx: 5.3.2_acorn@8.7.1 1159 1074 eslint-visitor-keys: 3.3.0 1160 1075 dev: true 1161 1076 ··· 1208 1123 dev: true 1209 1124 1210 1125 /fast-levenshtein/2.0.6: 1211 - resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} 1126 + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1212 1127 dev: true 1213 1128 1214 1129 /fast-levenshtein/3.0.0: ··· 1248 1163 dependencies: 1249 1164 readable-web-to-node-stream: 3.0.2 1250 1165 strtok3: 6.3.0 1251 - token-types: 4.1.1 1166 + token-types: 4.2.0 1252 1167 dev: false 1253 1168 1254 1169 /fill-range/7.0.1: ··· 1296 1211 engines: {node: '>=6.0.0'} 1297 1212 hasBin: true 1298 1213 dependencies: 1299 - debug: 4.3.3 1214 + debug: 4.3.4 1300 1215 graceful-fs: 4.2.4 1301 1216 minimatch: 3.0.4 1302 1217 transitivePeerDependencies: ··· 1306 1221 /foreach/2.0.5: 1307 1222 resolution: {integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k=} 1308 1223 1309 - /fraction.js/4.1.3: 1310 - resolution: {integrity: sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==} 1224 + /fraction.js/4.2.0: 1225 + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} 1311 1226 dev: true 1312 1227 1313 1228 /fs-extra/9.0.1: ··· 1321 1236 dev: true 1322 1237 1323 1238 /fs.realpath/1.0.0: 1324 - resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 1239 + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1325 1240 dev: true 1326 1241 1327 1242 /fsevents/2.3.2: ··· 1336 1251 resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1337 1252 1338 1253 /functional-red-black-tree/1.0.1: 1339 - resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} 1254 + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} 1340 1255 dev: true 1341 1256 1342 1257 /get-intrinsic/1.1.1: ··· 1373 1288 fs.realpath: 1.0.0 1374 1289 inflight: 1.0.6 1375 1290 inherits: 2.0.4 1376 - minimatch: 3.0.4 1291 + minimatch: 3.1.2 1377 1292 once: 1.4.0 1378 1293 path-is-absolute: 1.0.1 1379 1294 dev: true 1380 1295 1381 - /globals/13.10.0: 1382 - resolution: {integrity: sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==} 1296 + /globals/13.15.0: 1297 + resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==} 1383 1298 engines: {node: '>=8'} 1384 1299 dependencies: 1385 1300 type-fest: 0.20.2 ··· 1392 1307 '@sindresorhus/is': 2.1.1 1393 1308 '@szmarczak/http-timer': 4.0.5 1394 1309 '@types/cacheable-request': 6.0.1 1310 + '@types/keyv': 3.1.1 1311 + '@types/responselike': 1.0.0 1395 1312 cacheable-lookup: 2.0.1 1396 1313 cacheable-request: 7.0.1 1397 1314 decompress-response: 5.0.0 ··· 1412 1329 1413 1330 /has-bigints/1.0.1: 1414 1331 resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} 1415 - 1416 - /has-flag/3.0.0: 1417 - resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 1418 - engines: {node: '>=4'} 1419 - dev: true 1420 1332 1421 1333 /has-flag/4.0.0: 1422 1334 resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} ··· 1440 1352 /ieee754/1.2.1: 1441 1353 resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1442 1354 1443 - /ignore/4.0.6: 1444 - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} 1445 - engines: {node: '>= 4'} 1446 - dev: true 1447 - 1448 1355 /ignore/5.2.0: 1449 1356 resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 1450 1357 engines: {node: '>= 4'} ··· 1454 1361 resolution: {integrity: sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=} 1455 1362 dev: false 1456 1363 1457 - /import-cwd/3.0.0: 1458 - resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} 1459 - engines: {node: '>=8'} 1460 - dependencies: 1461 - import-from: 3.0.0 1462 - dev: true 1463 - 1464 1364 /import-fresh/3.3.0: 1465 1365 resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1466 1366 engines: {node: '>=6'} ··· 1469 1369 resolve-from: 4.0.0 1470 1370 dev: true 1471 1371 1472 - /import-from/3.0.0: 1473 - resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} 1474 - engines: {node: '>=8'} 1475 - dependencies: 1476 - resolve-from: 5.0.0 1477 - dev: true 1478 - 1479 1372 /imurmurhash/0.1.4: 1480 - resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} 1373 + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1481 1374 engines: {node: '>=0.8.19'} 1482 1375 dev: true 1483 1376 ··· 1486 1379 dev: true 1487 1380 1488 1381 /inflight/1.0.6: 1489 - resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 1382 + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1490 1383 dependencies: 1491 1384 once: 1.4.0 1492 1385 wrappy: 1.0.2 ··· 1499 1392 resolution: {integrity: sha512-oNHdsrWBsI/kDwUtEgt+aaZtQFKtQYN0TGZzc3SGiIA6m+plZ6malhmsygtbmDpfpIsNNC7ce9Gyaj+Tki+gVw==} 1500 1393 dependencies: 1501 1394 interface-store: 2.0.2 1502 - nanoid: 3.2.0 1395 + nanoid: 3.3.4 1503 1396 uint8arrays: 3.0.0 1504 1397 dev: false 1505 1398 ··· 1588 1481 engines: {node: '>= 0.4'} 1589 1482 dependencies: 1590 1483 call-bind: 1.0.2 1591 - 1592 - /is-arrayish/0.2.1: 1593 - resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} 1594 - dev: true 1595 1484 1596 1485 /is-bigint/1.0.2: 1597 1486 resolution: {integrity: sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==} ··· 1618 1507 resolution: {integrity: sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==} 1619 1508 engines: {node: '>= 0.4'} 1620 1509 1621 - /is-core-module/2.5.0: 1622 - resolution: {integrity: sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==} 1623 - dependencies: 1624 - has: 1.0.3 1625 - dev: true 1626 - 1627 1510 /is-core-module/2.8.1: 1628 1511 resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} 1629 1512 dependencies: ··· 1635 1518 engines: {node: '>= 0.4'} 1636 1519 1637 1520 /is-extglob/2.1.1: 1638 - resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 1521 + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1639 1522 engines: {node: '>=0.10.0'} 1640 1523 dev: true 1641 1524 ··· 1725 1608 dev: false 1726 1609 1727 1610 /isexe/2.0.0: 1728 - resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} 1611 + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1729 1612 dev: true 1730 1613 1731 1614 /it-peekable/1.0.3: ··· 1735 1618 /js-sha3/0.8.0: 1736 1619 resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} 1737 1620 dev: false 1738 - 1739 - /js-tokens/4.0.0: 1740 - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1741 - dev: true 1742 1621 1743 1622 /js-yaml/4.1.0: 1744 1623 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} ··· 1751 1630 resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1752 1631 dev: true 1753 1632 1754 - /json-parse-even-better-errors/2.3.1: 1755 - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1756 - dev: true 1757 - 1758 1633 /json-schema-traverse/0.4.1: 1759 1634 resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1760 1635 dev: true 1761 1636 1762 1637 /json-stable-stringify-without-jsonify/1.0.1: 1763 - resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} 1638 + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1764 1639 dev: true 1765 1640 1766 1641 /jsonfile/6.1.0: ··· 1820 1695 immediate: 3.0.6 1821 1696 dev: false 1822 1697 1823 - /lilconfig/2.0.3: 1824 - resolution: {integrity: sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==} 1698 + /lilconfig/2.0.5: 1699 + resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} 1825 1700 engines: {node: '>=10'} 1826 - dev: true 1827 - 1828 - /lines-and-columns/1.1.6: 1829 - resolution: {integrity: sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=} 1830 1701 dev: true 1831 1702 1832 1703 /load-script2/2.0.6: ··· 1926 1797 brace-expansion: 1.1.11 1927 1798 dev: true 1928 1799 1800 + /minimatch/3.1.2: 1801 + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1802 + dependencies: 1803 + brace-expansion: 1.1.11 1804 + dev: true 1805 + 1929 1806 /minimist/1.2.5: 1930 1807 resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 1931 1808 dev: true ··· 2023 1900 engines: {node: '>=8.0.0'} 2024 1901 dev: false 2025 1902 2026 - /music-metadata-browser/2.5.4: 2027 - resolution: {integrity: sha512-ehqKVPFQyyO2l9FtQ/xKd5N4x4JFb4wAk0JqAZ7ryeOaK/7ji0qSk8D33u9Qu4uDA/TC7kzI6tqkN3JyOgBdkg==} 1903 + /music-metadata-browser/2.5.6: 1904 + resolution: {integrity: sha512-tzv2pJh6Cr/Rnqz59KqLmzszbRy8EJtORpxYaGPk0GwTGUoOn68oqfq5QiwaJAwEbEz5WIzlEOGke2f6i0EfwQ==} 2028 1905 dependencies: 2029 1906 buffer: 6.0.3 2030 - debug: 4.3.3 2031 - music-metadata: 7.11.8 1907 + debug: 4.3.4 1908 + music-metadata: 7.12.3 2032 1909 readable-stream: 3.6.0 2033 1910 readable-web-to-node-stream: 3.0.2 2034 1911 transitivePeerDependencies: 2035 1912 - supports-color 2036 1913 dev: false 2037 1914 2038 - /music-metadata/7.11.8: 2039 - resolution: {integrity: sha512-KaJzxDlYId05zN029WaKhJYcT5FB0QmTRSGDq5bRfPTBUw4Hl0VvJvaO5C5mm0ATWMREecMANV9YUatLMg+0Mg==} 1915 + /music-metadata/7.12.3: 1916 + resolution: {integrity: sha512-6pZngaroNxGBf8KZjE8reGZJiS533eJq7dBFsyoiEAZIORQAxmVVx20ABh9W2tsLT+5mKYyDzcNi5GuHf3jitg==} 2040 1917 engines: {node: '>=10'} 2041 1918 dependencies: 2042 1919 '@tokenizer/token': 0.3.0 2043 1920 content-type: 1.0.4 2044 - debug: 4.3.3 1921 + debug: 4.3.4 2045 1922 file-type: 16.5.3 2046 1923 media-typer: 1.1.0 2047 1924 strtok3: 6.3.0 2048 - token-types: 4.1.1 1925 + token-types: 4.2.0 2049 1926 transitivePeerDependencies: 2050 1927 - supports-color 2051 1928 dev: false 2052 1929 2053 - /nanoid/3.2.0: 2054 - resolution: {integrity: sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==} 1930 + /nanoid/3.3.4: 1931 + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 2055 1932 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2056 1933 hasBin: true 2057 1934 ··· 2062 1939 dev: false 2063 1940 2064 1941 /natural-compare/1.4.0: 2065 - resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} 1942 + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2066 1943 dev: true 2067 1944 2068 1945 /node-fetch/2.6.1: ··· 2070 1947 engines: {node: 4.x || >=6.0.0} 2071 1948 dev: false 2072 1949 2073 - /node-releases/2.0.2: 2074 - resolution: {integrity: sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==} 1950 + /node-releases/2.0.5: 1951 + resolution: {integrity: sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==} 2075 1952 dev: true 2076 1953 2077 1954 /normalize-path/3.0.0: ··· 2080 1957 dev: true 2081 1958 2082 1959 /normalize-range/0.1.2: 2083 - resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} 1960 + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 2084 1961 engines: {node: '>=0.10.0'} 2085 1962 dev: true 2086 1963 ··· 2089 1966 engines: {node: '>=8'} 2090 1967 dev: true 2091 1968 2092 - /object-hash/2.2.0: 2093 - resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} 1969 + /object-hash/3.0.0: 1970 + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 2094 1971 engines: {node: '>= 6'} 2095 1972 dev: true 2096 1973 ··· 2119 1996 object-keys: 1.1.1 2120 1997 2121 1998 /once/1.4.0: 2122 - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 1999 + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2123 2000 dependencies: 2124 2001 wrappy: 1.0.2 2125 2002 dev: true ··· 2175 2052 dev: true 2176 2053 2177 2054 /p-finally/1.0.0: 2178 - resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} 2055 + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} 2179 2056 engines: {node: '>=4'} 2180 2057 dev: true 2181 2058 ··· 2224 2101 callsites: 3.1.0 2225 2102 dev: true 2226 2103 2227 - /parse-json/5.1.0: 2228 - resolution: {integrity: sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==} 2229 - engines: {node: '>=8'} 2230 - dependencies: 2231 - '@babel/code-frame': 7.12.11 2232 - error-ex: 1.3.2 2233 - json-parse-even-better-errors: 2.3.1 2234 - lines-and-columns: 1.1.6 2235 - dev: true 2236 - 2237 2104 /path-exists/4.0.0: 2238 2105 resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2239 2106 engines: {node: '>=8'} 2240 2107 dev: true 2241 2108 2242 2109 /path-is-absolute/1.0.1: 2243 - resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 2110 + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2244 2111 engines: {node: '>=0.10.0'} 2245 2112 dev: true 2246 2113 ··· 2253 2120 resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2254 2121 dev: true 2255 2122 2256 - /path-type/4.0.0: 2257 - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2258 - engines: {node: '>=8'} 2259 - dev: true 2260 - 2261 2123 /peek-readable/3.1.0: 2262 2124 resolution: {integrity: sha512-KGuODSTV6hcgdZvDrIDBUkN0utcAVj1LL7FfGbM0viKTtCHmtZcuEJ+lGqsp0fTFkGqesdtemV2yUSMeyy3ddA==} 2263 2125 engines: {node: '>=8'} ··· 2278 2140 dev: true 2279 2141 2280 2142 /pify/2.3.0: 2281 - resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=} 2143 + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 2282 2144 engines: {node: '>=0.10.0'} 2283 2145 dev: true 2284 2146 2285 - /postcss-custom-properties/12.1.4_postcss@8.4.6: 2286 - resolution: {integrity: sha512-i6AytuTCoDLJkWN/MtAIGriJz3j7UX6bV7Z5t+KgFz+dwZS15/mlTJY1S0kRizlk6ba0V8u8hN50Fz5Nm7tdZw==} 2147 + /postcss-custom-properties/12.1.7_postcss@8.4.14: 2148 + resolution: {integrity: sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==} 2287 2149 engines: {node: ^12 || ^14 || >=16} 2288 2150 peerDependencies: 2289 2151 postcss: ^8.4 2290 2152 dependencies: 2291 - postcss: 8.4.6 2153 + postcss: 8.4.14 2292 2154 postcss-value-parser: 4.2.0 2293 2155 dev: true 2294 2156 2295 - /postcss-import/14.0.2_postcss@8.4.6: 2296 - resolution: {integrity: sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==} 2157 + /postcss-import/14.1.0_postcss@8.4.14: 2158 + resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} 2297 2159 engines: {node: '>=10.0.0'} 2298 2160 peerDependencies: 2299 2161 postcss: ^8.0.0 2300 2162 dependencies: 2301 - postcss: 8.4.6 2302 - postcss-value-parser: 4.1.0 2163 + postcss: 8.4.14 2164 + postcss-value-parser: 4.2.0 2303 2165 read-cache: 1.0.0 2304 - resolve: 1.20.0 2166 + resolve: 1.22.0 2305 2167 dev: true 2306 2168 2307 - /postcss-js/4.0.0_postcss@8.4.6: 2169 + /postcss-js/4.0.0_postcss@8.4.14: 2308 2170 resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} 2309 2171 engines: {node: ^12 || ^14 || >= 16} 2310 2172 peerDependencies: 2311 2173 postcss: ^8.3.3 2312 2174 dependencies: 2313 2175 camelcase-css: 2.0.1 2314 - postcss: 8.4.6 2176 + postcss: 8.4.14 2315 2177 dev: true 2316 2178 2317 - /postcss-load-config/3.1.0: 2318 - resolution: {integrity: sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==} 2179 + /postcss-load-config/3.1.4_postcss@8.4.14: 2180 + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 2319 2181 engines: {node: '>= 10'} 2320 2182 peerDependencies: 2183 + postcss: '>=8.0.9' 2321 2184 ts-node: '>=9.0.0' 2322 2185 peerDependenciesMeta: 2186 + postcss: 2187 + optional: true 2323 2188 ts-node: 2324 2189 optional: true 2325 2190 dependencies: 2326 - import-cwd: 3.0.0 2327 - lilconfig: 2.0.3 2191 + lilconfig: 2.0.5 2192 + postcss: 8.4.14 2328 2193 yaml: 1.10.2 2329 2194 dev: true 2330 2195 2331 - /postcss-nested/5.0.6_postcss@8.4.6: 2196 + /postcss-nested/5.0.6_postcss@8.4.14: 2332 2197 resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} 2333 2198 engines: {node: '>=12.0'} 2334 2199 peerDependencies: 2335 2200 postcss: ^8.2.14 2336 2201 dependencies: 2337 - postcss: 8.4.6 2338 - postcss-selector-parser: 6.0.9 2202 + postcss: 8.4.14 2203 + postcss-selector-parser: 6.0.10 2339 2204 dev: true 2340 2205 2341 - /postcss-selector-parser/6.0.4: 2342 - resolution: {integrity: sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==} 2206 + /postcss-selector-parser/6.0.10: 2207 + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} 2343 2208 engines: {node: '>=4'} 2344 2209 dependencies: 2345 2210 cssesc: 3.0.0 2346 - indexes-of: 1.0.1 2347 - uniq: 1.0.1 2348 2211 util-deprecate: 1.0.2 2349 2212 dev: true 2350 2213 2351 - /postcss-selector-parser/6.0.9: 2352 - resolution: {integrity: sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==} 2214 + /postcss-selector-parser/6.0.4: 2215 + resolution: {integrity: sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==} 2353 2216 engines: {node: '>=4'} 2354 2217 dependencies: 2355 2218 cssesc: 3.0.0 2219 + indexes-of: 1.0.1 2220 + uniq: 1.0.1 2356 2221 util-deprecate: 1.0.2 2357 2222 dev: true 2358 2223 2359 - /postcss-value-parser/4.1.0: 2360 - resolution: {integrity: sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==} 2361 - dev: true 2362 - 2363 2224 /postcss-value-parser/4.2.0: 2364 2225 resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 2365 2226 dev: true 2366 2227 2367 - /postcss/8.4.6: 2368 - resolution: {integrity: sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==} 2228 + /postcss/8.4.14: 2229 + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} 2369 2230 engines: {node: ^10 || ^12 || >=14} 2370 2231 dependencies: 2371 - nanoid: 3.2.0 2232 + nanoid: 3.3.4 2372 2233 picocolors: 1.0.0 2373 2234 source-map-js: 1.0.2 2374 2235 dev: true ··· 2499 2360 engines: {node: '>=4'} 2500 2361 dev: true 2501 2362 2502 - /resolve-from/5.0.0: 2503 - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 2504 - engines: {node: '>=8'} 2505 - dev: true 2506 - 2507 - /resolve/1.20.0: 2508 - resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} 2509 - dependencies: 2510 - is-core-module: 2.5.0 2511 - path-parse: 1.0.7 2512 - dev: true 2513 - 2514 2363 /resolve/1.22.0: 2515 2364 resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} 2516 2365 hasBin: true ··· 2674 2523 resolution: {integrity: sha512-5R3HH7AMvvuWozRqgOCe/zJic3Hn/mdVHpg7ILuo2BV8qosTiDDngLpsvNernPnUnH57fP3IWU8Eux354E2WcQ==} 2675 2524 dev: false 2676 2525 2677 - /supports-color/5.5.0: 2678 - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2679 - engines: {node: '>=4'} 2680 - dependencies: 2681 - has-flag: 3.0.0 2682 - dev: true 2683 - 2684 2526 /supports-color/7.2.0: 2685 2527 resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2686 2528 engines: {node: '>=8'} ··· 2715 2557 postcss-selector-parser: 6.0.4 2716 2558 dev: true 2717 2559 2718 - /tailwindcss/3.0.23_autoprefixer@10.4.2: 2719 - resolution: {integrity: sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==} 2560 + /tailwindcss/3.0.24: 2561 + resolution: {integrity: sha512-H3uMmZNWzG6aqmg9q07ZIRNIawoiEcNFKDfL+YzOPuPsXuDXxJxB9icqzLgdzKNwjG3SAro2h9SYav8ewXNgig==} 2720 2562 engines: {node: '>=12.13.0'} 2721 2563 hasBin: true 2722 - peerDependencies: 2723 - autoprefixer: ^10.0.2 2724 2564 dependencies: 2725 2565 arg: 5.0.1 2726 - autoprefixer: 10.4.2_postcss@8.4.6 2727 - chalk: 4.1.2 2728 2566 chokidar: 3.5.3 2729 2567 color-name: 1.1.4 2730 - cosmiconfig: 7.0.1 2731 2568 detective: 5.2.0 2732 2569 didyoumean: 1.2.2 2733 2570 dlv: 1.1.3 2734 2571 fast-glob: 3.2.11 2735 2572 glob-parent: 6.0.2 2736 2573 is-glob: 4.0.3 2574 + lilconfig: 2.0.5 2737 2575 normalize-path: 3.0.0 2738 - object-hash: 2.2.0 2739 - postcss: 8.4.6 2740 - postcss-js: 4.0.0_postcss@8.4.6 2741 - postcss-load-config: 3.1.0 2742 - postcss-nested: 5.0.6_postcss@8.4.6 2743 - postcss-selector-parser: 6.0.9 2576 + object-hash: 3.0.0 2577 + picocolors: 1.0.0 2578 + postcss: 8.4.14 2579 + postcss-js: 4.0.0_postcss@8.4.14 2580 + postcss-load-config: 3.1.4_postcss@8.4.14 2581 + postcss-nested: 5.0.6_postcss@8.4.14 2582 + postcss-selector-parser: 6.0.10 2744 2583 postcss-value-parser: 4.2.0 2745 2584 quick-lru: 5.1.1 2746 2585 resolve: 1.22.0 ··· 2793 2632 resolution: {integrity: sha512-FXofUGAFcgEIEOS3m9Dk9URaY3x+JeerPfVFc8K820PjV0JcCsH98BFxrVOTANC8YvM4QTrmKMol2/818gFmCw==} 2794 2633 dev: false 2795 2634 2796 - /token-types/4.1.1: 2797 - resolution: {integrity: sha512-hD+QyuUAyI2spzsI0B7gf/jJ2ggR4RjkAo37j3StuePhApJUwcWDjnHDOFdIWYSwNR28H14hpwm4EI+V1Ted1w==} 2635 + /token-types/4.2.0: 2636 + resolution: {integrity: sha512-P0rrp4wUpefLncNamWIef62J0v0kQR/GfDVji9WKY7GDCWy5YbVSrKUTam07iWPZQGy0zWNOfstYTykMmPNR7w==} 2798 2637 engines: {node: '>=10'} 2799 2638 dependencies: 2800 2639 '@tokenizer/token': 0.3.0
+29 -2
src/Applications/UI.elm
··· 4 4 import Browser 5 5 import Browser.Events 6 6 import Browser.Navigation as Nav 7 - import Common exposing (Switch(..)) 7 + import Common exposing (ServiceWorkerStatus(..), Switch(..)) 8 8 import Debouncer.Basic as Debouncer 9 9 import Dict 10 10 import Equalizer ··· 82 82 83 83 page = 84 84 Maybe.withDefault Page.Index maybePage 85 + 86 + serviceWorkerStatus = 87 + if flags.isInstallingServiceWorker then 88 + InstallingInitial 89 + 90 + else 91 + Activated 85 92 in 86 - { confirmation = Nothing 93 + { buildTimestamp = flags.buildTimestamp 94 + , confirmation = Nothing 87 95 , currentTime = Time.millisToPosix flags.initialTime 96 + , currentTimeZone = Time.utc 88 97 , darkMode = flags.darkMode 89 98 , downloading = Nothing 90 99 , dnd = DnD.initialModel ··· 100 109 , page = page 101 110 , pressedKeys = [] 102 111 , processAutomatically = True 112 + , serviceWorkerStatus = serviceWorkerStatus 103 113 , uuidSeed = Random.initialSeed flags.initialTime 104 114 , url = url 115 + , version = flags.version 105 116 , viewport = flags.viewport 106 117 107 118 ----------------------------------------- ··· 228 239 ) 229 240 |> Return.command 230 241 (Task.perform SetCurrentTime Time.now) 242 + |> Return.command 243 + (Task.perform SetCurrentTimeZone Time.here) 231 244 232 245 233 246 ··· 510 523 ----------------------------------------- 511 524 -- 📭 Other 512 525 ----------------------------------------- 526 + InstalledServiceWorker -> 527 + Other.installedServiceWorker 528 + 529 + InstallingServiceWorker -> 530 + Other.installingServiceWorker 531 + 532 + ReloadApp -> 533 + Other.reloadApp 534 + 513 535 SetCurrentTime a -> 514 536 Other.setCurrentTime a 537 + 538 + SetCurrentTimeZone a -> 539 + Other.setCurrentTimeZone a 515 540 516 541 SetIsOnline a -> 517 542 Other.setIsOnline a ··· 576 601 ----------------------------------------- 577 602 -- 📭 Other 578 603 ----------------------------------------- 604 + , Ports.installedNewServiceWorker (\_ -> InstalledServiceWorker) 605 + , Ports.installingNewServiceWorker (\_ -> InstallingServiceWorker) 579 606 , Ports.setIsOnline SetIsOnline 580 607 , Ports.webnativeResponse GotWebnativeResponse 581 608 , Sub.map KeyboardMsg Keyboard.subscriptions
+22 -1
src/Applications/UI/Other/State.elm
··· 1 1 module UI.Other.State exposing (..) 2 2 3 3 import Alien 4 + import Common exposing (ServiceWorkerStatus(..)) 4 5 import Notifications 5 - import Return 6 + import Return exposing (return) 6 7 import Time 7 8 import UI.Authentication.Types as Authentication 8 9 import UI.Common.State as Common ··· 13 14 14 15 15 16 -- 🔱 17 + 18 + 19 + installedServiceWorker : Manager 20 + installedServiceWorker model = 21 + Return.singleton { model | serviceWorkerStatus = WaitingForActivation } 22 + 23 + 24 + installingServiceWorker : Manager 25 + installingServiceWorker model = 26 + Return.singleton { model | serviceWorkerStatus = InstallingNew } 27 + 28 + 29 + reloadApp : Manager 30 + reloadApp model = 31 + return model (Ports.reloadApp ()) 16 32 17 33 18 34 setIsOnline : Bool -> Manager ··· 51 67 setCurrentTime : Time.Posix -> Manager 52 68 setCurrentTime time model = 53 69 Return.singleton { model | currentTime = time } 70 + 71 + 72 + setCurrentTimeZone : Time.Zone -> Manager 73 + setCurrentTimeZone zone model = 74 + Return.singleton { model | currentTimeZone = zone } 54 75 55 76 56 77
+9
src/Applications/UI/Ports.elm
··· 37 37 port preloadAudio : Queue.EngineItem -> Cmd msg 38 38 39 39 40 + port reloadApp : () -> Cmd msg 41 + 42 + 40 43 port seek : Float -> Cmd msg 41 44 42 45 ··· 69 72 70 73 71 74 port insertCoverCache : (Json.Value -> msg) -> Sub msg 75 + 76 + 77 + port installedNewServiceWorker : (() -> msg) -> Sub msg 78 + 79 + 80 + port installingNewServiceWorker : (() -> msg) -> Sub msg 72 81 73 82 74 83 port noteProgress : ({ trackId : String, progress : Float } -> msg) -> Sub msg
+115 -1
src/Applications/UI/Settings.elm
··· 1 1 module UI.Settings exposing (Dependencies, view) 2 2 3 3 import Chunky exposing (..) 4 + import Color exposing (Color) 5 + import Common exposing (ServiceWorkerStatus(..)) 4 6 import Conditional exposing (ifThenElse) 7 + import DateFormat as Date 5 8 import Html exposing (Html, text) 6 9 import Html.Attributes exposing (..) 7 - import Html.Events exposing (onClick) 10 + import Html.Events as E exposing (onClick) 8 11 import Html.Lazy 9 12 import LastFm 10 13 import Material.Icons.Round as Icons 11 14 import Material.Icons.Types exposing (Coloring(..)) 15 + import Maybe.Extra as Maybe 16 + import Time 12 17 import UI.Authentication.Types as Authentication 13 18 import UI.Backdrop as Backdrop exposing (backgroundPositioning) 14 19 import UI.Kit ··· 28 33 29 34 type alias Dependencies = 30 35 { authenticationMethod : Maybe User.Layer.Method 36 + , buildTimestamp : Int 31 37 , chosenBackgroundImage : Maybe String 38 + , currentTimeZone : Time.Zone 39 + , extractedBackdropColor : Maybe Color 32 40 , hideDuplicateTracks : Bool 33 41 , lastFm : LastFm.Model 34 42 , processAutomatically : Bool 35 43 , rememberProgress : Bool 44 + , serviceWorkerStatus : ServiceWorkerStatus 45 + , version : String 36 46 } 37 47 38 48 ··· 135 145 ] 136 146 |> raw 137 147 |> UI.Kit.intro 148 + 149 + ----------------------------------------- 150 + -- Version 151 + ----------------------------------------- 152 + , let 153 + tag = 154 + chunk 155 + [ "bg-base06" 156 + , "inline-block" 157 + , "leading-none" 158 + , "ml-1" 159 + , "mr-3" 160 + , "p-1" 161 + , "rounded" 162 + , "text-white" 163 + 164 + -- Dark mode 165 + ------------ 166 + , "dark:bg-base01" 167 + , "dark:text-base05" 168 + ] 169 + in 170 + chunk 171 + [ "text-base05" 172 + , "text-xs" 173 + 174 + -- Dark mode 175 + ------------ 176 + , "dark:text-base03" 177 + ] 178 + [ text "Version" 179 + , tag [ text deps.version ] 180 + , text "Built on" 181 + , deps.buildTimestamp 182 + |> (*) 1000 183 + |> Time.millisToPosix 184 + |> Date.format 185 + [ Date.monthNameAbbreviated 186 + , Date.text " " 187 + , Date.dayOfMonthSuffix 188 + , Date.text " " 189 + , Date.yearNumber 190 + , Date.text ", " 191 + , Date.hourMilitaryFixed 192 + , Date.text ":" 193 + , Date.minuteFixed 194 + , Date.text ":" 195 + , Date.secondFixed 196 + ] 197 + deps.currentTimeZone 198 + |> text 199 + |> List.singleton 200 + |> tag 201 + 202 + -- 203 + , case deps.serviceWorkerStatus of 204 + InstallingInitial -> 205 + inline 206 + [ "inline-flex", "items-center" ] 207 + [ text "Setting up service worker" 208 + , inline [ "ml-1" ] [ Icons.downloading 12 Inherit ] 209 + ] 210 + 211 + InstallingNew -> 212 + inline 213 + [ "inline-flex", "items-center" ] 214 + [ text "Installing new version" 215 + , inline [ "ml-1" ] [ Icons.downloading 12 Inherit ] 216 + ] 217 + 218 + WaitingForActivation -> 219 + inline 220 + [] 221 + [ text "Update available" 222 + , brick 223 + [ Maybe.unwrap 224 + (class "bg-white-20") 225 + (style "background-color" << Color.toCssString) 226 + deps.extractedBackdropColor 227 + 228 + -- 229 + , E.onClick ReloadApp 230 + ] 231 + [ "bg-base06" 232 + , "cursor-pointer" 233 + , "inline-block" 234 + , "leading-none" 235 + , "ml-1" 236 + , "mr-3" 237 + , "p-1" 238 + , "rounded" 239 + , "text-white" 240 + 241 + -- Dark mode 242 + ------------ 243 + , "dark:bg-base01" 244 + , "dark:text-base05" 245 + ] 246 + [ text "Reload app" ] 247 + ] 248 + 249 + Activated -> 250 + nothing 251 + ] 138 252 139 253 ----------------------------------------- 140 254 -- Background
+14 -3
src/Applications/UI/Types.elm
··· 4 4 import Browser 5 5 import Browser.Navigation as Nav 6 6 import Color exposing (Color) 7 - import Common exposing (Switch) 7 + import Common exposing (ServiceWorkerStatus, Switch) 8 8 import ContextMenu exposing (ContextMenu) 9 9 import Coordinates exposing (Viewport) 10 10 import Debouncer.Basic as Debouncer exposing (Debouncer) ··· 40 40 41 41 42 42 type alias Flags = 43 - { darkMode : Bool 43 + { buildTimestamp : Int 44 + , darkMode : Bool 44 45 , initialTime : Int 46 + , isInstallingServiceWorker : Bool -- ie. Installing SW for the first time 45 47 , isOnline : Bool 46 48 , upgrade : Bool 49 + , version : String 47 50 , viewport : Viewport 48 51 } 49 52 ··· 53 56 54 57 55 58 type alias Model = 56 - { confirmation : Maybe String 59 + { buildTimestamp : Int 60 + , confirmation : Maybe String 57 61 , currentTime : Time.Posix 62 + , currentTimeZone : Time.Zone 58 63 , darkMode : Bool 59 64 , downloading : Maybe { notificationId : Int } 60 65 , dnd : DnD.Model Int ··· 70 75 , page : Page 71 76 , pressedKeys : List Keyboard.Key 72 77 , processAutomatically : Bool 78 + , serviceWorkerStatus : ServiceWorkerStatus 73 79 , uuidSeed : Random.Seed 74 80 , url : Url 81 + , version : String 75 82 , viewport : Viewport 76 83 77 84 ----------------------------------------- ··· 296 303 ----------------------------------------- 297 304 -- 📭 Other 298 305 ----------------------------------------- 306 + | InstalledServiceWorker 307 + | InstallingServiceWorker 308 + | ReloadApp 299 309 | SetCurrentTime Time.Posix 310 + | SetCurrentTimeZone Time.Zone 300 311 | SetIsOnline Bool 301 312 302 313
+5
src/Applications/UI/View.elm
··· 176 176 Lazy.lazy2 Settings.view 177 177 subPage 178 178 { authenticationMethod = Authentication.extractMethod model.authentication 179 + , buildTimestamp = model.buildTimestamp 179 180 , chosenBackgroundImage = model.chosenBackdrop 181 + , currentTimeZone = model.currentTimeZone 182 + , extractedBackdropColor = model.extractedBackdropColor 180 183 , hideDuplicateTracks = model.hideDuplicates 181 184 , lastFm = model.lastFm 182 185 , processAutomatically = model.processAutomatically 183 186 , rememberProgress = model.rememberProgress 187 + , serviceWorkerStatus = model.serviceWorkerStatus 188 + , version = model.version 184 189 } 185 190 186 191 Page.Sources subPage ->
+20 -4
src/Javascript/Workers/service.js
··· 7 7 8 8 9 9 const KEY = 10 - "diffuse-{{VERSION}}" 10 + /* eslint-disable no-undef */ 11 + `diffuse-${BUILD_TIMESTAMP}` 11 12 12 13 13 14 const EXCLUDE = ··· 40 41 const whatToCache = [ href, `${href.replace(/\/+$/, "")}/about/` ].concat(filteredTree) 41 42 return caches.open(KEY).then(c => Promise.all(whatToCache.map(x => c.add(x)))) 42 43 }) 43 - // TODO: Remove? 44 - .then(_ => self.skipWaiting()) 45 44 46 45 event.waitUntil(promise) 47 46 }) 48 47 49 48 50 - self.addEventListener("fetch", event => { 49 + self.addEventListener("fetch", async event => { 51 50 const isInternal = 52 51 !!event.request.url.match(new RegExp("^" + self.location.origin)) 53 52 ··· 82 81 "Bearer " + token 83 82 ) 84 83 84 + // When refreshing the page to update the app 85 + } else if ( 86 + event.request.mode === "navigate" && 87 + event.request.method === "GET" && 88 + registration.waiting && 89 + (await clients.matchAll()).length < 2 90 + ) { 91 + registration.waiting.postMessage("skipWaiting") 92 + event.respondWith(new Response("", { headers: { "Refresh": "0" } })) 93 + 85 94 // Use cache if internal request 86 95 } else if (isInternal) { 87 96 let url = new URL(event.request.url) ··· 93 102 .then(cache => cache.match(url)) 94 103 .then(match => match || fetch(url)) 95 104 ) 105 + } 106 + }) 107 + 108 + 109 + addEventListener("message", event => { 110 + if (event.data === "skipWaiting") { 111 + skipWaiting() 96 112 } 97 113 }) 98 114
+43 -1
src/Javascript/index.js
··· 15 15 16 16 import * as audioEngine from "./audio-engine" 17 17 import * as db from "./indexed-db" 18 + import { version } from '../../package.json' 18 19 import { WEBNATIVE_STAGING_ENV, WEBNATIVE_STAGING_MODE, debounce, fileExtension } from "./common" 20 + 19 21 20 22 21 23 // 🔐 ··· 37 39 window.addEventListener("load", () => { 38 40 navigator.serviceWorker 39 41 .register("service-worker.js") 40 - .then(initialise) 41 42 .catch(err => { 42 43 const isFirefox = navigator.userAgent.toLowerCase().includes("firefox") 43 44 ··· 48 49 : "Failed to start the service worker, try using HTTPS." 49 50 ) 50 51 }) 52 + .then(initialise) 53 + .catch(err => { 54 + console.error(err) 55 + return failure("<strong>Failed to start the application.</strong><br />See browser console for details.") 56 + }) 51 57 }) 52 58 53 59 } ··· 65 71 app = Elm.UI.init({ 66 72 node: document.getElementById("elm"), 67 73 flags: { 74 + /* eslint-disable no-undef */ 75 + buildTimestamp: BUILD_TIMESTAMP, 68 76 darkMode: preferredColorScheme().matches, 69 77 initialTime: Date.now(), 78 + isInstallingServiceWorker: !!reg.installing, 70 79 isOnline: navigator.onLine, 71 80 upgrade: viableForUpgrade(), 81 + version, 72 82 viewport: { 73 83 height: window.innerHeight, 74 84 width: window.innerWidth ··· 82 92 wire.brain() 83 93 wire.audio() 84 94 wire.backdrop() 95 + wire.broadcastChannel() 85 96 wire.clipboard() 86 97 wire.covers() 87 98 wire.serviceWorker(reg) ··· 90 101 // Other ports 91 102 app.ports.openUrlOnNewPage.subscribe(url => { 92 103 window.open(url, "_blank") 104 + }) 105 + 106 + app.ports.reloadApp.subscribe(_ => { 107 + let timeout = setTimeout(() => location.reload(), 250) 108 + 109 + bc.addEventListener("message", event => { 110 + if (event.data === "PONG") { 111 + clearTimeout(timeout) 112 + alert("⚠️ You can only update the app when you have no more than one instance open.") 113 + } 114 + }) 115 + 116 + bc.postMessage("PING") 93 117 }) 94 118 } 95 119 ··· 357 381 const avgColor = averageColorOfImage(img) 358 382 app.ports.setAverageBackgroundColor.send(avgColor) 359 383 } 384 + } 385 + 386 + 387 + 388 + // Broadcast channel 389 + // ----------------- 390 + 391 + let bc 392 + 393 + wire.broadcastChannel = () => { 394 + bc = new BroadcastChannel(`Diffuse-${location.hostname}`) 395 + bc.addEventListener("message", event => { 396 + switch (event.data) { 397 + case "PING": return bc.postMessage("PONG") 398 + } 399 + }) 360 400 } 361 401 362 402 ··· 847 887 // No worker was installed yet, so we'll only want to track the state changes 848 888 if (newWorker !== initialInstall) { 849 889 console.log("🧑‍✈️ A new version of Diffuse is available") 890 + app.ports.installingNewServiceWorker.send(null) 850 891 } 851 892 852 893 newWorker.addEventListener("statechange", (e) => { 853 894 console.log("🧑‍✈️ Service worker is", e.target.state) 895 + if (e.target.state === "installed") app.ports.installedNewServiceWorker.send(null) 854 896 }) 855 897 }) 856 898
+8 -1
src/Library/Common.elm
··· 1 - module Common exposing (Switch(..), backToIndex, boolFromString, boolToString, queryString, translateHttpResponse, urlOrigin) 1 + module Common exposing (ServiceWorkerStatus(..), Switch(..), backToIndex, boolFromString, boolToString, queryString, translateHttpResponse, urlOrigin) 2 2 3 3 import Http 4 4 import Tuple.Ext as Tuple ··· 17 17 18 18 19 19 -- 🌳 20 + 21 + 22 + type ServiceWorkerStatus 23 + = InstallingInitial 24 + | InstallingNew 25 + | WaitingForActivation 26 + | Activated 20 27 21 28 22 29 type Switch
+24 -21
system/Build/Main.hs
··· 42 42 |> makeTree 43 43 |> write "../build" 44 44 45 - -- Inject version timestamp 46 - insertVersion (de !~> "timestamp") build 45 + -- Inject build timestamp 46 + -- 47 + -- NOTE: Done by esbuild at the moment (see Justfile) 48 + -- But we leave it here in case we need it anywhere else. 49 + -- 50 + -- insertBuildTimestamp (de !~> "timestamp") build 47 51 48 52 -- Fin 49 53 return () ··· 160 164 defs 161 165 162 166 163 - insertVersion :: Text -> Dictionary -> IO () 164 - insertVersion version dict = do 165 - let sw = List.filter 166 - (\def -> localPath def == "service-worker.js") 167 - dict 168 - 169 - case headMay sw of 170 - Just def -> 171 - def 172 - |> content 173 - |> fmap Text.decodeUtf8 174 - |> fmap (Text.replace "{{VERSION}}" version) 175 - |> fmap Text.encodeUtf8 176 - |> (\c -> def { content = c }) 177 - |> writeDef "../build" 178 - |> fmap (\_ -> ()) 179 - 180 - Nothing -> 181 - return () 167 + insertBuildTimestamp :: Text -> Dictionary -> IO () 168 + insertBuildTimestamp version dict = 169 + dict 170 + |> List.filter 171 + (\def -> 172 + localPath def == "service-worker.js" 173 + ) 174 + |> List.map 175 + (\def -> 176 + def 177 + |> content 178 + |> fmap Text.decodeUtf8 179 + |> fmap (Text.replace "{{BUILD_TIMESTAMP}}" version) 180 + |> fmap Text.encodeUtf8 181 + |> (\c -> def { content = c }) 182 + ) 183 + |> write "../build" 184 + |> fmap (\_ -> ()) 182 185 183 186 184 187