[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.

Use $lib, $components and $electron aliases

Kasper (Sep 17, 2025, 1:03 AM +0200) 3dbbf8fc 735f9c92

+558 -71
+4 -4
ferrum-addon/package.json
··· 1 1 { 2 - "private": true, 3 - "name": "ferrum-addon", 4 - "main": "addon.node", 5 - "types": "main.d" 2 + "private": true, 3 + "name": "ferrum-addon", 4 + "main": "addon.node", 5 + "types": "main.d" 6 6 }
+488 -7
package-lock.json
··· 25 25 "prettier-plugin-tailwindcss": "^0.6.12", 26 26 "sass": "^1.89.1", 27 27 "svelte": "^5.33.14", 28 - "svelte-check": "^4.2.1", 28 + "svelte-check": "^4.3.1", 29 29 "svelte-preprocess": "^6.0.3", 30 30 "tailwindcss": "^4.1.8", 31 31 "typescript": "~5.8.3", ··· 47 47 "engines": { 48 48 "node": ">=6.0.0" 49 49 } 50 + }, 51 + "node_modules/@bufbuild/protobuf": { 52 + "version": "2.8.0", 53 + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.8.0.tgz", 54 + "integrity": "sha512-r1/0w5C9dkbcdjyxY8ZHsC5AOWg4Pnzhm2zu7LO4UHSounp2tMm6Y+oioV9zlGbLveE7YaWRDUk48WLxRDgoqg==", 55 + "dev": true, 56 + "license": "(Apache-2.0 AND BSD-3-Clause)", 57 + "optional": true, 58 + "peer": true 50 59 }, 51 60 "node_modules/@develar/schema-utils": { 52 61 "version": "2.6.5", ··· 5258 5267 "ieee754": "^1.1.13" 5259 5268 } 5260 5269 }, 5270 + "node_modules/buffer-builder": { 5271 + "version": "0.2.0", 5272 + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", 5273 + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", 5274 + "dev": true, 5275 + "license": "MIT/X11", 5276 + "optional": true, 5277 + "peer": true 5278 + }, 5261 5279 "node_modules/buffer-crc32": { 5262 5280 "version": "0.2.13", 5263 5281 "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", ··· 5735 5753 "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", 5736 5754 "dev": true, 5737 5755 "license": "MIT" 5756 + }, 5757 + "node_modules/colorjs.io": { 5758 + "version": "0.5.2", 5759 + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", 5760 + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", 5761 + "dev": true, 5762 + "license": "MIT", 5763 + "optional": true, 5764 + "peer": true 5738 5765 }, 5739 5766 "node_modules/combined-stream": { 5740 5767 "version": "1.0.8", ··· 9747 9774 "queue-microtask": "^1.2.2" 9748 9775 } 9749 9776 }, 9777 + "node_modules/rxjs": { 9778 + "version": "7.8.2", 9779 + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", 9780 + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", 9781 + "dev": true, 9782 + "license": "Apache-2.0", 9783 + "optional": true, 9784 + "peer": true, 9785 + "dependencies": { 9786 + "tslib": "^2.1.0" 9787 + } 9788 + }, 9750 9789 "node_modules/sade": { 9751 9790 "version": "1.8.1", 9752 9791 "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", ··· 9799 9838 } 9800 9839 }, 9801 9840 "node_modules/sass": { 9802 - "version": "1.89.1", 9803 - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.1.tgz", 9804 - "integrity": "sha512-eMLLkl+qz7tx/0cJ9wI+w09GQ2zodTkcE/aVfywwdlRcI3EO19xGnbmJwg/JMIm+5MxVJ6outddLZ4Von4E++Q==", 9841 + "version": "1.92.1", 9842 + "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", 9843 + "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", 9805 9844 "dev": true, 9806 9845 "license": "MIT", 9807 9846 "dependencies": { ··· 9819 9858 "@parcel/watcher": "^2.4.1" 9820 9859 } 9821 9860 }, 9861 + "node_modules/sass-embedded": { 9862 + "version": "1.92.1", 9863 + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.92.1.tgz", 9864 + "integrity": "sha512-28YwLnF5atAhogt3E4hXzz/NB9dwKffyw08a7DEasLh94P7+aELkG3ENSHYCWB9QFN14hYNLfwr9ozUsPDhcDQ==", 9865 + "dev": true, 9866 + "license": "MIT", 9867 + "optional": true, 9868 + "peer": true, 9869 + "dependencies": { 9870 + "@bufbuild/protobuf": "^2.5.0", 9871 + "buffer-builder": "^0.2.0", 9872 + "colorjs.io": "^0.5.0", 9873 + "immutable": "^5.0.2", 9874 + "rxjs": "^7.4.0", 9875 + "supports-color": "^8.1.1", 9876 + "sync-child-process": "^1.0.2", 9877 + "varint": "^6.0.0" 9878 + }, 9879 + "bin": { 9880 + "sass": "dist/bin/sass.js" 9881 + }, 9882 + "engines": { 9883 + "node": ">=16.0.0" 9884 + }, 9885 + "optionalDependencies": { 9886 + "sass-embedded-all-unknown": "1.92.1", 9887 + "sass-embedded-android-arm": "1.92.1", 9888 + "sass-embedded-android-arm64": "1.92.1", 9889 + "sass-embedded-android-riscv64": "1.92.1", 9890 + "sass-embedded-android-x64": "1.92.1", 9891 + "sass-embedded-darwin-arm64": "1.92.1", 9892 + "sass-embedded-darwin-x64": "1.92.1", 9893 + "sass-embedded-linux-arm": "1.92.1", 9894 + "sass-embedded-linux-arm64": "1.92.1", 9895 + "sass-embedded-linux-musl-arm": "1.92.1", 9896 + "sass-embedded-linux-musl-arm64": "1.92.1", 9897 + "sass-embedded-linux-musl-riscv64": "1.92.1", 9898 + "sass-embedded-linux-musl-x64": "1.92.1", 9899 + "sass-embedded-linux-riscv64": "1.92.1", 9900 + "sass-embedded-linux-x64": "1.92.1", 9901 + "sass-embedded-unknown-all": "1.92.1", 9902 + "sass-embedded-win32-arm64": "1.92.1", 9903 + "sass-embedded-win32-x64": "1.92.1" 9904 + } 9905 + }, 9906 + "node_modules/sass-embedded-all-unknown": { 9907 + "version": "1.92.1", 9908 + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.92.1.tgz", 9909 + "integrity": "sha512-5t6/YZf+vhO3OY/49h8RCL6Cwo78luva0M+TnTM9gu9ASffRXAuOVLNKciSXa3loptyemDDS6IU5/dVH5w0KmA==", 9910 + "cpu": [ 9911 + "!arm", 9912 + "!arm64", 9913 + "!riscv64", 9914 + "!x64" 9915 + ], 9916 + "dev": true, 9917 + "license": "MIT", 9918 + "optional": true, 9919 + "peer": true, 9920 + "dependencies": { 9921 + "sass": "1.92.1" 9922 + } 9923 + }, 9924 + "node_modules/sass-embedded-android-arm": { 9925 + "version": "1.92.1", 9926 + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.92.1.tgz", 9927 + "integrity": "sha512-4EjpVVzuksERdgAd4BqeSXFnWtWN3DSRyEIUPJ7BhcS9sfDh2Gf6miI2kNTvIQLJ2XIJynDDcEQ8a1U9KwKUTQ==", 9928 + "cpu": [ 9929 + "arm" 9930 + ], 9931 + "dev": true, 9932 + "license": "MIT", 9933 + "optional": true, 9934 + "os": [ 9935 + "android" 9936 + ], 9937 + "peer": true, 9938 + "engines": { 9939 + "node": ">=14.0.0" 9940 + } 9941 + }, 9942 + "node_modules/sass-embedded-android-arm64": { 9943 + "version": "1.92.1", 9944 + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.92.1.tgz", 9945 + "integrity": "sha512-Q+UruGb7yKawHagVmVDRRKsnc4mJZvWMBnuRCu2coJo2FofyqBmXohVGXbxko97sYceA9TJTrUEx3WVKQUNCbQ==", 9946 + "cpu": [ 9947 + "arm64" 9948 + ], 9949 + "dev": true, 9950 + "license": "MIT", 9951 + "optional": true, 9952 + "os": [ 9953 + "android" 9954 + ], 9955 + "peer": true, 9956 + "engines": { 9957 + "node": ">=14.0.0" 9958 + } 9959 + }, 9960 + "node_modules/sass-embedded-android-riscv64": { 9961 + "version": "1.92.1", 9962 + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.92.1.tgz", 9963 + "integrity": "sha512-nCY5btLlX7W7Jc6cCL6D2Yklpiu540EJ2G08YVGu12DrAMCBzqM347CSRf2ojp1H8jyhvmLkaFwnrJWzh+6S+w==", 9964 + "cpu": [ 9965 + "riscv64" 9966 + ], 9967 + "dev": true, 9968 + "license": "MIT", 9969 + "optional": true, 9970 + "os": [ 9971 + "android" 9972 + ], 9973 + "peer": true, 9974 + "engines": { 9975 + "node": ">=14.0.0" 9976 + } 9977 + }, 9978 + "node_modules/sass-embedded-android-x64": { 9979 + "version": "1.92.1", 9980 + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.92.1.tgz", 9981 + "integrity": "sha512-qYWR3bftJ77aLYwYDFuzDI4dcwVVixxqQxlIQWNGkHRCexj614qGSSHemr18C2eVj3mjXAQxTQxU68U7pkGPAA==", 9982 + "cpu": [ 9983 + "x64" 9984 + ], 9985 + "dev": true, 9986 + "license": "MIT", 9987 + "optional": true, 9988 + "os": [ 9989 + "android" 9990 + ], 9991 + "peer": true, 9992 + "engines": { 9993 + "node": ">=14.0.0" 9994 + } 9995 + }, 9996 + "node_modules/sass-embedded-darwin-arm64": { 9997 + "version": "1.92.1", 9998 + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.92.1.tgz", 9999 + "integrity": "sha512-g2yQ3txjMYLKMjL2cW1xRO9nnV3ijf95NbX/QShtV6tiVUETZNWDsRMDEwBNGYY6PTE/UZerjJL1R/2xpQg6WA==", 10000 + "cpu": [ 10001 + "arm64" 10002 + ], 10003 + "dev": true, 10004 + "license": "MIT", 10005 + "optional": true, 10006 + "os": [ 10007 + "darwin" 10008 + ], 10009 + "peer": true, 10010 + "engines": { 10011 + "node": ">=14.0.0" 10012 + } 10013 + }, 10014 + "node_modules/sass-embedded-darwin-x64": { 10015 + "version": "1.92.1", 10016 + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.92.1.tgz", 10017 + "integrity": "sha512-eH+fgxLQhTEPjZPCgPAVuX5e514Qp/4DMAUMtlNShv4cr4TD5qOp1XlsPYR/b7uE7p2cKFkUpUn/bHNqJ2ay4A==", 10018 + "cpu": [ 10019 + "x64" 10020 + ], 10021 + "dev": true, 10022 + "license": "MIT", 10023 + "optional": true, 10024 + "os": [ 10025 + "darwin" 10026 + ], 10027 + "peer": true, 10028 + "engines": { 10029 + "node": ">=14.0.0" 10030 + } 10031 + }, 10032 + "node_modules/sass-embedded-linux-arm": { 10033 + "version": "1.92.1", 10034 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.92.1.tgz", 10035 + "integrity": "sha512-cT3w8yoQTqrtZvWLJeutEGmawITDTY4J6oSVQjeDcPnnoPt0gOFxem8YMznraACXvahw/2+KJDH33BTNgiPo0A==", 10036 + "cpu": [ 10037 + "arm" 10038 + ], 10039 + "dev": true, 10040 + "license": "MIT", 10041 + "optional": true, 10042 + "os": [ 10043 + "linux" 10044 + ], 10045 + "peer": true, 10046 + "engines": { 10047 + "node": ">=14.0.0" 10048 + } 10049 + }, 10050 + "node_modules/sass-embedded-linux-arm64": { 10051 + "version": "1.92.1", 10052 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.92.1.tgz", 10053 + "integrity": "sha512-dNmlpGeZkry1BofhAdGFBXrpM69y9LlYuNnncf+HfsOOUtj8j0q1RwS+zb5asknhKFUOAG8GCGRY1df7Rwu35g==", 10054 + "cpu": [ 10055 + "arm64" 10056 + ], 10057 + "dev": true, 10058 + "license": "MIT", 10059 + "optional": true, 10060 + "os": [ 10061 + "linux" 10062 + ], 10063 + "peer": true, 10064 + "engines": { 10065 + "node": ">=14.0.0" 10066 + } 10067 + }, 10068 + "node_modules/sass-embedded-linux-musl-arm": { 10069 + "version": "1.92.1", 10070 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.92.1.tgz", 10071 + "integrity": "sha512-nPBos6lI31ef2zQhqTZhFOU7ar4impJbLIax0XsqS269YsiCwjhk11VmUloJTpFlJuKMiVXNo7dPx+katxhD/Q==", 10072 + "cpu": [ 10073 + "arm" 10074 + ], 10075 + "dev": true, 10076 + "license": "MIT", 10077 + "optional": true, 10078 + "os": [ 10079 + "linux" 10080 + ], 10081 + "peer": true, 10082 + "engines": { 10083 + "node": ">=14.0.0" 10084 + } 10085 + }, 10086 + "node_modules/sass-embedded-linux-musl-arm64": { 10087 + "version": "1.92.1", 10088 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.92.1.tgz", 10089 + "integrity": "sha512-TfiEBkCyNzVoOhjHXUT+vZ6+p0ueDbvRw6f4jHdkvljZzXdXMby4wh7BU1odl69rgRTkSvYKhgbErRLDR/F7pQ==", 10090 + "cpu": [ 10091 + "arm64" 10092 + ], 10093 + "dev": true, 10094 + "license": "MIT", 10095 + "optional": true, 10096 + "os": [ 10097 + "linux" 10098 + ], 10099 + "peer": true, 10100 + "engines": { 10101 + "node": ">=14.0.0" 10102 + } 10103 + }, 10104 + "node_modules/sass-embedded-linux-musl-riscv64": { 10105 + "version": "1.92.1", 10106 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.92.1.tgz", 10107 + "integrity": "sha512-R+RcJA4EYpJDE9JM1GgPYgZo7x94FlxZ6jPodOQkEaZ1S9kvXVCuP5X/0PXRPhu08KJOfeMsAElzfdAjUf7KJg==", 10108 + "cpu": [ 10109 + "riscv64" 10110 + ], 10111 + "dev": true, 10112 + "license": "MIT", 10113 + "optional": true, 10114 + "os": [ 10115 + "linux" 10116 + ], 10117 + "peer": true, 10118 + "engines": { 10119 + "node": ">=14.0.0" 10120 + } 10121 + }, 10122 + "node_modules/sass-embedded-linux-musl-x64": { 10123 + "version": "1.92.1", 10124 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.92.1.tgz", 10125 + "integrity": "sha512-/HolYRGXJjx8nLw6oj5ZrkR7PFM7X/5kE4MYZaFMpDIPIcw3bqB2fUXLo/MYlRLsw7gBAT6hJAMBrNdKuTphfw==", 10126 + "cpu": [ 10127 + "x64" 10128 + ], 10129 + "dev": true, 10130 + "license": "MIT", 10131 + "optional": true, 10132 + "os": [ 10133 + "linux" 10134 + ], 10135 + "peer": true, 10136 + "engines": { 10137 + "node": ">=14.0.0" 10138 + } 10139 + }, 10140 + "node_modules/sass-embedded-linux-riscv64": { 10141 + "version": "1.92.1", 10142 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.92.1.tgz", 10143 + "integrity": "sha512-b9bxe0CMsbSsLx3nrR0cq8xpIkoAC6X36o4DGMITF3m2v3KsojC7ru9X0Gz+zUFr6rwpq/0lTNzFLNu6sPNo3w==", 10144 + "cpu": [ 10145 + "riscv64" 10146 + ], 10147 + "dev": true, 10148 + "license": "MIT", 10149 + "optional": true, 10150 + "os": [ 10151 + "linux" 10152 + ], 10153 + "peer": true, 10154 + "engines": { 10155 + "node": ">=14.0.0" 10156 + } 10157 + }, 10158 + "node_modules/sass-embedded-linux-x64": { 10159 + "version": "1.92.1", 10160 + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.92.1.tgz", 10161 + "integrity": "sha512-xuiK5Jp5NldW4bvlC7AuX1Wf7o0gLZ3md/hNg+bkTvxtCDgnUHtfdo8Q+xWP11bD9QX31xXFWpmUB8UDLi6XQQ==", 10162 + "cpu": [ 10163 + "x64" 10164 + ], 10165 + "dev": true, 10166 + "license": "MIT", 10167 + "optional": true, 10168 + "os": [ 10169 + "linux" 10170 + ], 10171 + "peer": true, 10172 + "engines": { 10173 + "node": ">=14.0.0" 10174 + } 10175 + }, 10176 + "node_modules/sass-embedded-unknown-all": { 10177 + "version": "1.92.1", 10178 + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.92.1.tgz", 10179 + "integrity": "sha512-AT9oXvtNY4N+Nd0wvoWqq9A5HjdH/X3aUH4boQUtXyaJ/9DUwnQmBpP5Gtn028ZS8exOGBdobmmWAuigv0k/OA==", 10180 + "dev": true, 10181 + "license": "MIT", 10182 + "optional": true, 10183 + "os": [ 10184 + "!android", 10185 + "!darwin", 10186 + "!linux", 10187 + "!win32" 10188 + ], 10189 + "peer": true, 10190 + "dependencies": { 10191 + "sass": "1.92.1" 10192 + } 10193 + }, 10194 + "node_modules/sass-embedded-win32-arm64": { 10195 + "version": "1.92.1", 10196 + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.92.1.tgz", 10197 + "integrity": "sha512-KvmpQjY9yTBMtTYz4WBqetlv9bGaDW1aStcu7MSTbH7YiSybX/9fnxlCAEQv1WlIidQhcJAiyk0Eae+LGK7cIQ==", 10198 + "cpu": [ 10199 + "arm64" 10200 + ], 10201 + "dev": true, 10202 + "license": "MIT", 10203 + "optional": true, 10204 + "os": [ 10205 + "win32" 10206 + ], 10207 + "peer": true, 10208 + "engines": { 10209 + "node": ">=14.0.0" 10210 + } 10211 + }, 10212 + "node_modules/sass-embedded-win32-x64": { 10213 + "version": "1.92.1", 10214 + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.92.1.tgz", 10215 + "integrity": "sha512-B6Nz/GbH7Vkpb2TkQHsGcczWM5t+70VWopWF1x5V5yxLpA8ZzVQ7NTKKi+jDoVY2Efu6ZyzgT9n5KgG2kWliXA==", 10216 + "cpu": [ 10217 + "x64" 10218 + ], 10219 + "dev": true, 10220 + "license": "MIT", 10221 + "optional": true, 10222 + "os": [ 10223 + "win32" 10224 + ], 10225 + "peer": true, 10226 + "engines": { 10227 + "node": ">=14.0.0" 10228 + } 10229 + }, 10230 + "node_modules/sass-embedded/node_modules/supports-color": { 10231 + "version": "8.1.1", 10232 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 10233 + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 10234 + "dev": true, 10235 + "license": "MIT", 10236 + "optional": true, 10237 + "peer": true, 10238 + "dependencies": { 10239 + "has-flag": "^4.0.0" 10240 + }, 10241 + "engines": { 10242 + "node": ">=10" 10243 + }, 10244 + "funding": { 10245 + "url": "https://github.com/chalk/supports-color?sponsor=1" 10246 + } 10247 + }, 9822 10248 "node_modules/sax": { 9823 10249 "version": "1.4.1", 9824 10250 "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", ··· 10182 10608 } 10183 10609 }, 10184 10610 "node_modules/svelte-check": { 10185 - "version": "4.2.1", 10186 - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.2.1.tgz", 10187 - "integrity": "sha512-e49SU1RStvQhoipkQ/aonDhHnG3qxHSBtNfBRb9pxVXoa+N7qybAo32KgA9wEb2PCYFNaDg7bZCdhLD1vHpdYA==", 10611 + "version": "4.3.1", 10612 + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.1.tgz", 10613 + "integrity": "sha512-lkh8gff5gpHLjxIV+IaApMxQhTGnir2pNUAqcNgeKkvK5bT/30Ey/nzBxNLDlkztCH4dP7PixkMt9SWEKFPBWg==", 10188 10614 "dev": true, 10189 10615 "license": "MIT", 10190 10616 "dependencies": { ··· 10320 10746 } 10321 10747 } 10322 10748 }, 10749 + "node_modules/sync-child-process": { 10750 + "version": "1.0.2", 10751 + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", 10752 + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", 10753 + "dev": true, 10754 + "license": "MIT", 10755 + "optional": true, 10756 + "peer": true, 10757 + "dependencies": { 10758 + "sync-message-port": "^1.0.0" 10759 + }, 10760 + "engines": { 10761 + "node": ">=16.0.0" 10762 + } 10763 + }, 10764 + "node_modules/sync-message-port": { 10765 + "version": "1.1.3", 10766 + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", 10767 + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", 10768 + "dev": true, 10769 + "license": "MIT", 10770 + "optional": true, 10771 + "peer": true, 10772 + "engines": { 10773 + "node": ">=16.0.0" 10774 + } 10775 + }, 10323 10776 "node_modules/tailwindcss": { 10324 10777 "version": "4.1.8", 10325 10778 "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.8.tgz", ··· 10797 11250 "dev": true, 10798 11251 "license": "MIT" 10799 11252 }, 11253 + "node_modules/varint": { 11254 + "version": "6.0.0", 11255 + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", 11256 + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", 11257 + "dev": true, 11258 + "license": "MIT", 11259 + "optional": true, 11260 + "peer": true 11261 + }, 10800 11262 "node_modules/verror": { 10801 11263 "version": "1.10.1", 10802 11264 "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", ··· 11144 11606 "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", 11145 11607 "dev": true, 11146 11608 "license": "MIT" 11609 + }, 11610 + "website": { 11611 + "version": "0.0.1", 11612 + "extraneous": true, 11613 + "devDependencies": { 11614 + "@octokit/plugin-rest-endpoint-methods": "^13.2.6", 11615 + "@sveltejs/adapter-static": "^3.0.5", 11616 + "@sveltejs/kit": "^2.0.0", 11617 + "@sveltejs/vite-plugin-svelte": "^4.0.0-next.6", 11618 + "@tailwindcss/vite": "4.0.0-alpha.23", 11619 + "bowser": "^2.11.0", 11620 + "mdsvex": "^0.12.3", 11621 + "sass-embedded": "^1.79.4", 11622 + "svelte": "^5.0.0-next.1", 11623 + "svelte-check": "^4.3.1", 11624 + "tailwindcss": "4.0.0-alpha.23", 11625 + "typescript": "^5.0.0", 11626 + "vite": "^5.0.3" 11627 + } 11147 11628 } 11148 11629 } 11149 11630 }
+1 -1
package.json
··· 85 85 "prettier-plugin-tailwindcss": "^0.6.12", 86 86 "sass": "^1.89.1", 87 87 "svelte": "^5.33.14", 88 - "svelte-check": "^4.2.1", 88 + "svelte-check": "^4.3.1", 89 89 "svelte-preprocess": "^6.0.3", 90 90 "tailwindcss": "^4.1.8", 91 91 "typescript": "~5.8.3",
+2 -2
src/App.svelte
··· 8 8 import TrackInfo, { track_info_state } from './components/TrackInfo.svelte' 9 9 import PlaylistInfoModal from './components/PlaylistInfo.svelte' 10 10 import { queue_visible } from './lib/queue' 11 - import { ipc_listen, ipc_renderer } from '@/lib/window' 12 - import { delete_track_list, get_track_list, import_tracks, type PlaylistInfo } from '@/lib/data' 11 + import { ipc_listen, ipc_renderer } from '$lib/window' 12 + import { delete_track_list, get_track_list, import_tracks, type PlaylistInfo } from '$lib/data' 13 13 import { play_pause } from './lib/player' 14 14 import DragGhost from './components/DragGhost.svelte' 15 15 import ItunesImport from './components/ItunesImport.svelte'
+1 -1
src/components/ArtistList.svelte
··· 1 1 <script lang="ts"> 2 - import { filter, get_artists } from '@/lib/data' 2 + import { filter, get_artists } from '$lib/data' 3 3 import fuzzysort from 'fuzzysort' 4 4 import Header from './Header.svelte' 5 5
+3 -3
src/components/CheckForUpdates.svelte
··· 1 1 <script lang="ts"> 2 - import { ipc_renderer } from '@/lib/window' 2 + import { ipc_renderer } from '$lib/window' 3 3 import Modal from './Modal.svelte' 4 4 import Button from './Button.svelte' 5 - import { is_dev, save_view_options, view_options } from '@/lib/data' 6 - import { check_shortcut } from '@/lib/helpers' 5 + import { is_dev, save_view_options, view_options } from '$lib/data' 6 + import { check_shortcut } from '$lib/helpers' 7 7 8 8 let latest_update: Awaited<ReturnType<typeof check>> | null = null 9 9
+1 -1
src/components/Filter.svelte
··· 1 1 <script lang="ts"> 2 2 import { onDestroy } from 'svelte' 3 - import { filter } from '@/lib/data' 3 + import { filter } from '$lib/data' 4 4 import { ipc_listen } from '../lib/window' 5 5 6 6 let filter_input: HTMLInputElement
+2 -2
src/components/Header.svelte
··· 1 1 <script lang="ts"> 2 - import { is_mac } from '@/lib/data' 2 + import { is_mac } from '$lib/data' 3 3 import { modal_count } from './Modal.svelte' 4 - import { queue_visible } from '@/lib/queue' 4 + import { queue_visible } from '$lib/queue' 5 5 6 6 export let title: string 7 7 export let subtitle: string
+3 -3
src/components/ItunesImport.svelte
··· 1 1 <script lang="ts"> 2 - import { ItunesImport, tracklist_updated, track_lists_details_map, save } from '@/lib/data' 3 - import { ipc_renderer } from '@/lib/window' 2 + import { ItunesImport, tracklist_updated, track_lists_details_map, save } from '$lib/data' 3 + import { ipc_renderer } from '$lib/window' 4 4 import type { ImportStatus } from 'ferrum-addon/addon' 5 5 import Button from './Button.svelte' 6 6 import Modal from './Modal.svelte' 7 - import { strict_call } from '@/lib/error' 7 + import { strict_call } from '$lib/error' 8 8 9 9 export let cancel: () => void 10 10 let itunes_import = ItunesImport.new()
+4 -4
src/components/Player.svelte
··· 13 13 } from '../lib/player' 14 14 import { get_duration } from '../lib/helpers' 15 15 import { queue_visible, toggle_queue_visibility, queue, shuffle, repeat } from '../lib/queue' 16 - import { get_track, is_dev } from '@/lib/data' 17 - import { dragged } from '@/lib/drag-drop' 16 + import { get_track, is_dev } from '$lib/data' 17 + import { dragged } from '$lib/drag-drop' 18 18 import * as dragGhost from './DragGhost.svelte' 19 19 import Slider from './Slider.svelte' 20 - import { get_flattened_tracklists, handle_selected_tracks_action } from '@/lib/menus' 21 - import { ipc_renderer } from '@/lib/window' 20 + import { get_flattened_tracklists, handle_selected_tracks_action } from '$lib/menus' 21 + import { ipc_renderer } from '$lib/window' 22 22 import { tracks_page_item_ids } from './TrackList.svelte' 23 23 24 24 async function playing_context_menu() {
+1 -1
src/components/PlaylistInfo.svelte
··· 1 1 <script lang="ts"> 2 2 import { check_shortcut } from '../lib/helpers' 3 - import { new_playlist, type PlaylistInfo, update_playlist } from '@/lib/data' 3 + import { new_playlist, type PlaylistInfo, update_playlist } from '$lib/data' 4 4 import Modal from './Modal.svelte' 5 5 import Button from './Button.svelte' 6 6
+7 -7
src/components/Queue.svelte
··· 9 9 } from '../lib/queue' 10 10 import { onDestroy, tick } from 'svelte' 11 11 import QueueItemComponent from './QueueItem.svelte' 12 - import { dragged } from '@/lib/drag-drop' 13 - import { get_track } from '@/lib/data' 12 + import { dragged } from '$lib/drag-drop' 13 + import { get_track } from '$lib/data' 14 14 import * as dragGhost from './DragGhost.svelte' 15 - import { ipc_listen, ipc_renderer } from '@/lib/window' 16 - import { check_shortcut } from '@/lib/helpers' 15 + import { ipc_listen, ipc_renderer } from '$lib/window' 16 + import { check_shortcut } from '$lib/helpers' 17 17 import { fly } from 'svelte/transition' 18 18 import VirtualListBlock, { scroll_container_keydown } from './VirtualListBlock.svelte' 19 - import type { SelectedTracksAction } from '@/electron/typed_ipc' 20 - import { get_flattened_tracklists, handle_selected_tracks_action } from '@/lib/menus' 21 - import { SvelteSelection } from '@/lib/selection' 19 + import type { SelectedTracksAction } from '$electron/typed_ipc' 20 + import { get_flattened_tracklists, handle_selected_tracks_action } from '$lib/menus' 21 + import { SvelteSelection } from '$lib/selection' 22 22 23 23 let object_urls: string[] = [] 24 24
+1 -1
src/components/QueueItem.svelte
··· 1 1 <script lang="ts"> 2 - import { get_track, join_paths, paths, tracks_updated } from '@/lib/data' 2 + import { get_track, join_paths, paths, tracks_updated } from '$lib/data' 3 3 import type { Track } from '../../ferrum-addon' 4 4 5 5 export let id: string
+3 -3
src/components/QuickNav.svelte
··· 1 1 <script lang="ts"> 2 2 import { onDestroy } from 'svelte' 3 3 import { check_shortcut } from '../lib/helpers' 4 - import { ipc_listen } from '@/lib/window' 4 + import { ipc_listen } from '$lib/window' 5 5 import fuzzysort from 'fuzzysort' 6 - import { track_lists_details_map } from '@/lib/data' 6 + import { track_lists_details_map } from '$lib/data' 7 7 import type { TrackListDetails } from '../../ferrum-addon/addon' 8 8 import Modal from './Modal.svelte' 9 9 import { special_playlists_nav } from './Sidebar.svelte' 10 - import { navigate } from '@/lib/router' 10 + import { navigate } from '$lib/router' 11 11 12 12 type Result = TrackListDetails & { path?: string } 13 13
+1 -1
src/components/Settings.svelte
··· 1 1 <script lang="ts"> 2 2 import Modal from './Modal.svelte' 3 3 import Button from './Button.svelte' 4 - import { save_view_options, view_options } from '@/lib/data' 4 + import { save_view_options, view_options } from '$lib/data' 5 5 6 6 export let on_close: () => void 7 7
+3 -3
src/components/Sidebar.svelte
··· 8 8 <script lang="ts"> 9 9 import SidebarItems, { type SidebarItemHandle } from './SidebarItems.svelte' 10 10 import Filter from './Filter.svelte' 11 - import { is_mac, track_lists_details_map, move_playlist } from '@/lib/data' 11 + import { is_mac, track_lists_details_map, move_playlist } from '$lib/data' 12 12 import { ipc_listen, ipc_renderer } from '../lib/window' 13 13 import { writable } from 'svelte/store' 14 14 import { onDestroy, setContext, tick } from 'svelte' 15 15 import { dragged } from '../lib/drag-drop' 16 - import { tracklist_actions } from '@/lib/page' 17 - import { navigate } from '@/lib/router' 16 + import { tracklist_actions } from '$lib/page' 17 + import { navigate } from '$lib/router' 18 18 import { current_playlist_id } from './TrackList.svelte' 19 19 20 20 let viewport: HTMLElement
+4 -4
src/components/SidebarItems.svelte
··· 5 5 move_playlist, 6 6 view_options, 7 7 save_view_options, 8 - } from '@/lib/data' 8 + } from '$lib/data' 9 9 import Self from './SidebarItems.svelte' 10 10 11 11 export type SidebarItemHandle = { ··· 34 34 import { getContext } from 'svelte' 35 35 import { dragged } from '../lib/drag-drop' 36 36 import * as dragGhost from './DragGhost.svelte' 37 - import { ipc_renderer } from '@/lib/window' 38 - import { check_shortcut } from '@/lib/helpers' 39 - import { navigate, url_pathname } from '@/lib/router' 37 + import { ipc_renderer } from '$lib/window' 38 + import { check_shortcut } from '$lib/helpers' 39 + import { navigate, url_pathname } from '$lib/router' 40 40 import { current_playlist_id } from './TrackList.svelte' 41 41 42 42 export let show = true
+4 -4
src/components/TrackInfo.svelte
··· 70 70 </script> 71 71 72 72 <script lang="ts"> 73 - import { check_shortcut } from '@/lib/helpers' 73 + import { check_shortcut } from '$lib/helpers' 74 74 import Button from './Button.svelte' 75 75 import type { Track, TrackID } from '../../ferrum-addon' 76 - import { ipc_listen, ipc_renderer } from '@/lib/window' 77 - import { playing_id, reload } from '@/lib/player' 76 + import { ipc_listen, ipc_renderer } from '$lib/window' 77 + import { playing_id, reload } from '$lib/player' 78 78 import { get } from 'svelte/store' 79 79 import Modal, { modal_count } from './Modal.svelte' 80 80 import { ··· 86 86 set_image, 87 87 set_image_data, 88 88 update_track_info, 89 - } from '@/lib/data' 89 + } from '$lib/data' 90 90 import { tick } from 'svelte' 91 91 92 92 const genres = get_genres()
+5 -5
src/components/TrackList.svelte
··· 33 33 view_options, 34 34 paths, 35 35 join_paths, 36 - } from '@/lib/data' 36 + } from '$lib/data' 37 37 import { new_playback_instance, playing_id } from '../lib/player' 38 38 import { get_duration, format_date, check_mouse_shortcut, check_shortcut } from '../lib/helpers' 39 39 import { tracklist_actions } from '../lib/page' ··· 44 44 import type { ItemId, Track, TracksPage } from 'ferrum-addon/addon' 45 45 import Header from './Header.svelte' 46 46 import { writable } from 'svelte/store' 47 - import { SvelteSelection } from '@/lib/selection' 48 - import { get_flattened_tracklists, handle_selected_tracks_action } from '@/lib/menus' 49 - import type { SelectedTracksAction } from '@/electron/typed_ipc' 50 - import { RefreshLevel, VirtualGrid, type Column } from '@/lib/virtual-grid.svelte' 47 + import { SvelteSelection } from '$lib/selection' 48 + import { get_flattened_tracklists, handle_selected_tracks_action } from '$lib/menus' 49 + import type { SelectedTracksAction } from '$electron/typed_ipc' 50 + import { RefreshLevel, VirtualGrid, type Column } from '$lib/virtual-grid.svelte' 51 51 52 52 let tracklist_element: HTMLDivElement 53 53
+2 -2
src/lib/data.ts
··· 1 1 import { get, writable } from 'svelte/store' 2 - import { ipc_renderer } from '@/lib/window' 2 + import { ipc_renderer } from '$lib/window' 3 3 import type { 4 4 MsSinceUnixEpoch, 5 5 TrackID, ··· 10 10 ViewOptions, 11 11 } from '../../ferrum-addon' 12 12 import { queue } from './queue' 13 - import { current_playlist_id } from '@/components/TrackList.svelte' 13 + import { current_playlist_id } from '$components/TrackList.svelte' 14 14 import { navigate } from './router' 15 15 import { call_sync, get_error_message, strict_call } from './error' 16 16
+5 -5
src/lib/menus.ts
··· 1 - import { add_tracks_to_playlist, get_track, paths, track_lists_details_map } from '@/lib/data' 2 - import { flatten_child_lists } from '@/lib/helpers' 3 - import { ipc_renderer } from '@/lib/window' 1 + import { add_tracks_to_playlist, get_track, paths, track_lists_details_map } from '$lib/data' 2 + import { flatten_child_lists } from '$lib/helpers' 3 + import { ipc_renderer } from '$lib/window' 4 4 import type { TrackID } from '../../ferrum-addon' 5 5 import { get } from 'svelte/store' 6 6 import { append_to_user_queue, prepend_to_user_queue } from './queue' 7 - import type { SelectedTracksAction } from '@/electron/typed_ipc' 8 - import { open_track_info } from '@/components/TrackInfo.svelte' 7 + import type { SelectedTracksAction } from '$electron/typed_ipc' 8 + import { open_track_info } from '$components/TrackInfo.svelte' 9 9 10 10 export function get_flattened_tracklists() { 11 11 const track_lists = get(track_lists_details_map)
+2 -2
src/lib/player.ts
··· 11 11 join_paths, 12 12 paths, 13 13 read_cover_async, 14 - } from '@/lib/data' 14 + } from '$lib/data' 15 15 import type { Track, TrackID } from '../../ferrum-addon' 16 16 import { ipc_renderer } from './window' 17 17 import { queue, set_new_queue, next as queueNext, prev as queuePrev } from './queue' 18 - import { tracks_page_item_ids } from '@/components/TrackList.svelte' 18 + import { tracks_page_item_ids } from '$components/TrackList.svelte' 19 19 20 20 const audio = new Audio() 21 21 let is_stopped = true
+1 -1
src/lib/queue.ts
··· 2 2 import { get, writable } from 'svelte/store' 3 3 import { getter_writable } from './helpers' 4 4 import { ipc_renderer } from './window' 5 - import { track_exists } from '@/lib/data' 5 + import { track_exists } from '$lib/data' 6 6 7 7 export const queue_visible = writable(false) 8 8 export function toggle_queue_visibility() {
+1 -1
src/lib/window.ts
··· 1 - import type { IpcRenderer, IpcFunctions } from '@/electron/typed_ipc' 1 + import type { IpcRenderer, IpcFunctions } from '$electron/typed_ipc' 2 2 import type Addon from 'ferrum-addon/addon' 3 3 const electron = window.require('electron') 4 4
+4 -1
tsconfig.json
··· 16 16 "isolatedModules": true, 17 17 "baseUrl": ".", 18 18 "paths": { 19 - "@/*": ["./src/*"] 19 + // These must also be specified in the vite config 20 + "$lib/*": ["src/lib/*"], 21 + "$components/*": ["src/components/*"], 22 + "$electron/*": ["src/electron/*"] 20 23 } 21 24 }, 22 25 "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.svelte", "ferrum-addon/**/*.node"]
+5 -2
vite.config.mjs
··· 1 - import { resolve } from 'path' 1 + import path from 'path' 2 2 import { defineConfig } from 'vite' 3 3 import { svelte, vitePreprocess } from '@sveltejs/vite-plugin-svelte' 4 4 import electron from 'vite-plugin-electron' ··· 9 9 clearScreen: false, 10 10 resolve: { 11 11 alias: { 12 - '@': resolve(__dirname, './src'), 12 + // These must also be specified in tsconfig.json 13 + $lib: path.resolve(__dirname, './src/lib'), 14 + $components: path.resolve(__dirname, './src/components'), 15 + $electron: path.resolve(__dirname, './src/electron'), 13 16 }, 14 17 }, 15 18 build: {