diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 00000000..ea5a55b6 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +bunx lint-staged diff --git a/.vscode/settings.json b/.vscode/settings.json index 8460b289..aa6d5184 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,17 +1,19 @@ { - "typescript.validate.enable": true, - "editor.formatOnPaste": false, - "editor.formatOnType": true, - "editor.formatOnSave": true, - "editor.defaultFormatter": null, - "editor.detectIndentation": false, - "editor.insertSpaces": true, - "editor.codeActionsOnSave": { - "source.organizeImports": "explicit" - }, - "typescript.suggest.autoImports": true, - "explorer.fileNesting.enabled": true, - "explorer.fileNesting.patterns": { - "*.ts": "${capture}.css" - } -} \ No newline at end of file + "typescript.validate.enable": true, + "editor.formatOnPaste": false, + "editor.formatOnType": true, + "editor.formatOnSave": true, + "editor.defaultFormatter": null, + "editor.detectIndentation": false, + "editor.insertSpaces": true, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + }, + "typescript.suggest.autoImports": true, + "explorer.fileNesting.enabled": true, + "explorer.fileNesting.patterns": { + "*.ts": "${capture}.css" + }, + "colorWheel.settings.workspaceColor": "hsl(108,55%,55%)", + "cSpell.words": ["contactability", "Criticz", "Deezer", "Redz"] +} diff --git a/README.md b/README.md index a8a8798f..918b2fa0 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,35 @@ The BBN Website. -## External submissions +## External Contributions -We are happy for external submissions, so PRs are welcome! +We welcome external contributions! Please feel free to open a pull request. -### Setup +## Setup -1. Install Bun from -2. deno task start -3. Set overrides to prod server +1. **Install [Bun](https://bun.com)** + - Follow the instructions on the Bun website to install Bun for your platform. - 1. `localStorage.setItem("OVERRIDE_BASE_URL", "https://bbn.music/")` - 2. `localStorage.setItem("OVERRIDE_WS_URL", "wss://bbn.music/ws")` +2. **Install dependencies:** + + ```sh + bun install + ``` + +3. **Start the development server:** + + ```sh + bun run dev + ``` + +4. **Set API overrides to use the production server:** + Open your browser console and run: + + ```js + localStorage.setItem('OVERRIDE_BASE_URL', 'https://bbn.music/'); + localStorage.setItem('OVERRIDE_WS_URL', 'wss://bbn.music/ws'); + ``` + +--- + +If you have any questions or issues, please open an issue or reach out via PR! diff --git a/bun.lock b/bun.lock index 1c92e34c..633e4438 100644 --- a/bun.lock +++ b/bun.lock @@ -18,6 +18,8 @@ "@sveltejs/vite-plugin-svelte": "^6.2.1", "@tailwindcss/postcss": "^4.1.18", "autoprefixer": "^10.4.23", + "husky": "^9.1.7", + "lint-staged": "^16.2.7", "postcss": "^8.5.6", "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.1", @@ -214,6 +216,12 @@ "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], + "ansi-escapes": ["ansi-escapes@7.2.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw=="], + + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], @@ -224,6 +232,8 @@ "baseline-browser-mapping": ["baseline-browser-mapping@2.9.3", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-8QdH6czo+G7uBsNo0GiUfouPN1lRzKdJTGnKXwe12gkFbnnOUaUKGN55dMkfy+mnxmvjwl9zcI4VncczcVXDhA=="], + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], @@ -236,10 +246,16 @@ "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], + + "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="], + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], "color-support": ["color-support@1.1.3", "", { "bin": { "color-support": "bin.js" } }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="], + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + "commander": ["commander@14.0.2", "", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="], "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], @@ -276,8 +292,12 @@ "electron-to-chromium": ["electron-to-chromium@1.5.266", "", {}, "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg=="], + "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], + "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + "esbuild": ["esbuild@0.27.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.1", "@esbuild/android-arm": "0.27.1", "@esbuild/android-arm64": "0.27.1", "@esbuild/android-x64": "0.27.1", "@esbuild/darwin-arm64": "0.27.1", "@esbuild/darwin-x64": "0.27.1", "@esbuild/freebsd-arm64": "0.27.1", "@esbuild/freebsd-x64": "0.27.1", "@esbuild/linux-arm": "0.27.1", "@esbuild/linux-arm64": "0.27.1", "@esbuild/linux-ia32": "0.27.1", "@esbuild/linux-loong64": "0.27.1", "@esbuild/linux-mips64el": "0.27.1", "@esbuild/linux-ppc64": "0.27.1", "@esbuild/linux-riscv64": "0.27.1", "@esbuild/linux-s390x": "0.27.1", "@esbuild/linux-x64": "0.27.1", "@esbuild/netbsd-arm64": "0.27.1", "@esbuild/netbsd-x64": "0.27.1", "@esbuild/openbsd-arm64": "0.27.1", "@esbuild/openbsd-x64": "0.27.1", "@esbuild/openharmony-arm64": "0.27.1", "@esbuild/sunos-x64": "0.27.1", "@esbuild/win32-arm64": "0.27.1", "@esbuild/win32-ia32": "0.27.1", "@esbuild/win32-x64": "0.27.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -288,12 +308,16 @@ "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "fflate": ["fflate@0.4.8", "", {}, "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="], + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + "flowbite-svelte-icons": ["flowbite-svelte-icons@3.0.1", "", { "dependencies": { "clsx": "^2.1.1", "tailwind-merge": "^3.4.0" }, "peerDependencies": { "svelte": "^5.0.0" } }, "sha512-fz6OEueSoNau0IZdHHuvDro+iYTeG6o7pYpGk+2jc3Z+/r4MN++M6mAaApp566h56WYY6dFGCApgf7j+8Q9XVA=="], "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], @@ -302,22 +326,30 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="], "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], @@ -356,18 +388,30 @@ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="], + "lint-staged": ["lint-staged@16.2.7", "", { "dependencies": { "commander": "^14.0.2", "listr2": "^9.0.5", "micromatch": "^4.0.8", "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow=="], + + "listr2": ["listr2@9.0.5", "", { "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g=="], + "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "nano-spawn": ["nano-spawn@2.0.0", "", {}, "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw=="], + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], @@ -378,6 +422,8 @@ "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + "open": ["open@11.0.0", "", { "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.1.0", "wsl-utils": "^0.3.0" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], @@ -392,6 +438,8 @@ "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="], + "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], @@ -414,6 +462,10 @@ "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + "rollup": ["rollup@4.53.3", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.53.3", "@rollup/rollup-android-arm64": "4.53.3", "@rollup/rollup-darwin-arm64": "4.53.3", "@rollup/rollup-darwin-x64": "4.53.3", "@rollup/rollup-freebsd-arm64": "4.53.3", "@rollup/rollup-freebsd-x64": "4.53.3", "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", "@rollup/rollup-linux-arm-musleabihf": "4.53.3", "@rollup/rollup-linux-arm64-gnu": "4.53.3", "@rollup/rollup-linux-arm64-musl": "4.53.3", "@rollup/rollup-linux-loong64-gnu": "4.53.3", "@rollup/rollup-linux-ppc64-gnu": "4.53.3", "@rollup/rollup-linux-riscv64-gnu": "4.53.3", "@rollup/rollup-linux-riscv64-musl": "4.53.3", "@rollup/rollup-linux-s390x-gnu": "4.53.3", "@rollup/rollup-linux-x64-gnu": "4.53.3", "@rollup/rollup-linux-x64-musl": "4.53.3", "@rollup/rollup-openharmony-arm64": "4.53.3", "@rollup/rollup-win32-arm64-msvc": "4.53.3", "@rollup/rollup-win32-ia32-msvc": "4.53.3", "@rollup/rollup-win32-x64-gnu": "4.53.3", "@rollup/rollup-win32-x64-msvc": "4.53.3", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA=="], "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], @@ -428,10 +480,20 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "sirv": ["sirv@3.0.2", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g=="], + "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], + + "string-width": ["string-width@8.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg=="], + + "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "svelte": ["svelte@5.46.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.5.0", "esm-env": "^1.2.1", "esrap": "^2.2.1", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA=="], @@ -448,6 +510,8 @@ "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], @@ -462,8 +526,12 @@ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + "wsl-utils": ["wsl-utils@0.3.0", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-3sFIGLiaDP7rTO4xh3g+b3AzhYDIUGGywE/WsmqzJWDxus5aJXVnPTNC/6L+r2WzrwXqVOdD262OaO+cEyPMSQ=="], + "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="], "zod": ["zod@4.2.1", "", {}, "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw=="], @@ -483,5 +551,9 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "browserslist/caniuse-lite": ["caniuse-lite@1.0.30001759", "", {}, "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], } } diff --git a/package.json b/package.json index 6f1c2c69..2e272ef9 100644 --- a/package.json +++ b/package.json @@ -1,39 +1,44 @@ { - "name": "bbn.music", - "private": true, - "version": "0.0.1", - "type": "module", - "scripts": { - "dev": "vite dev", - "build": "vite build", - "preview": "vite preview", - "prepare": "svelte-kit sync || echo ''", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "format": "prettier --write ./src", - "api:generate": "bun scripts/generate-api.ts" - }, - "devDependencies": { - "@hey-api/openapi-ts": "^0.88.2", - "@sveltejs/adapter-auto": "^7.0.0", - "@sveltejs/adapter-node": "^5.4.0", - "@sveltejs/kit": "^2.49.2", - "@sveltejs/vite-plugin-svelte": "^6.2.1", - "@tailwindcss/postcss": "^4.1.18", - "autoprefixer": "^10.4.23", - "postcss": "^8.5.6", - "prettier": "^3.7.4", - "prettier-plugin-svelte": "^3.4.1", - "svelte": "^5.46.1", - "svelte-check": "^4.3.5", - "tailwindcss": "^4.1.18", - "typescript": "^5.9.3", - "vite": "^7.3.0" - }, - "dependencies": { - "flowbite-svelte-icons": "^3.0.1", - "libphonenumber-js": "^1.12.33", - "posthog-js": "^1.310.1", - "zod": "^4.2.1" - } -} \ No newline at end of file + "name": "bbn.music", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "husky", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write ./src", + "api:generate": "bun scripts/generate-api.ts" + }, + "lint-staged": { + "**/*": "prettier --write --ignore-unknown" + }, + "devDependencies": { + "@hey-api/openapi-ts": "^0.88.2", + "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/adapter-node": "^5.4.0", + "@sveltejs/kit": "^2.49.2", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tailwindcss/postcss": "^4.1.18", + "autoprefixer": "^10.4.23", + "husky": "^9.1.7", + "lint-staged": "^16.2.7", + "postcss": "^8.5.6", + "prettier": "^3.7.4", + "prettier-plugin-svelte": "^3.4.1", + "svelte": "^5.46.1", + "svelte-check": "^4.3.5", + "tailwindcss": "^4.1.18", + "typescript": "^5.9.3", + "vite": "^7.3.0" + }, + "dependencies": { + "flowbite-svelte-icons": "^3.0.1", + "libphonenumber-js": "^1.12.33", + "posthog-js": "^1.310.1", + "zod": "^4.2.1" + } +} diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 98130d27..9c4e9495 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -6,7 +6,7 @@ export const handle: Handle = async ({ event, resolve }) => { // Add crossorigin="anonymous" to stylesheet links for PostHog session replay CSS capture return html.replace( /]*crossorigin)/g, - ', ) => (options.client ?? client).get({ - requestValidator: async (data: any) => await zGetDownloadByFileByFilesByAdminData.parseAsync(data), + requestValidator: async (data: any) => + await zGetDownloadByFileByFilesByAdminData.parseAsync(data), responseValidator: async (data: any) => await zGetDownloadByFileByFilesByAdminResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], @@ -450,7 +451,8 @@ export const postCodeByProviderByOauthByAuth = , ) => (options.client ?? client).post({ - requestValidator: async (data: any) => await zPostCodeByProviderByOauthByAuthData.parseAsync(data), + requestValidator: async (data: any) => + await zPostCodeByProviderByOauthByAuthData.parseAsync(data), url: '/api/@bbn/auth/oauth/{provider}/{code}', ...options, headers: { @@ -557,7 +559,8 @@ export const getConversationsByMessaging = (options?.client ?? client).get({ requestValidator: async (data: any) => await zGetConversationsByMessagingData.parseAsync(data), - responseValidator: async (data: any) => await zGetConversationsByMessagingResponse.parseAsync(data), + responseValidator: async (data: any) => + await zGetConversationsByMessagingResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/messaging/conversations', ...options, @@ -568,7 +571,8 @@ export const postConversationsByMessaging = (options?.client ?? client).post({ requestValidator: async (data: any) => await zPostConversationsByMessagingData.parseAsync(data), - responseValidator: async (data: any) => await zPostConversationsByMessagingResponse.parseAsync(data), + responseValidator: async (data: any) => + await zPostConversationsByMessagingResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/messaging/conversations', ...options, @@ -582,7 +586,8 @@ export const getIdByConversationsByMessaging = , ) => (options.client ?? client).get({ - requestValidator: async (data: any) => await zGetIdByConversationsByMessagingData.parseAsync(data), + requestValidator: async (data: any) => + await zGetIdByConversationsByMessagingData.parseAsync(data), responseValidator: async (data: any) => await zGetIdByConversationsByMessagingResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], @@ -598,7 +603,8 @@ export const putSendByConversationsByMessaging = ({ - requestValidator: async (data: any) => await zPutSendByConversationsByMessagingData.parseAsync(data), + requestValidator: async (data: any) => + await zPutSendByConversationsByMessagingData.parseAsync(data), responseValidator: async (data: any) => await zPutSendByConversationsByMessagingResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], @@ -614,7 +620,8 @@ export const getIdByUserByMessagesByMessaging = , ) => (options.client ?? client).get({ - requestValidator: async (data: any) => await zGetIdByUserByMessagesByMessagingData.parseAsync(data), + requestValidator: async (data: any) => + await zGetIdByUserByMessagesByMessagingData.parseAsync(data), responseValidator: async (data: any) => await zGetIdByUserByMessagesByMessagingResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], @@ -652,7 +659,8 @@ export const getMyConversationsByMessaging = , ) => (options?.client ?? client).get({ - requestValidator: async (data: any) => await zGetMyConversationsByMessagingData.parseAsync(data), + requestValidator: async (data: any) => + await zGetMyConversationsByMessagingData.parseAsync(data), responseValidator: async (data: any) => await zGetMyConversationsByMessagingResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], @@ -680,7 +688,8 @@ export const getNotificationsByMessaging = (options?.client ?? client).get({ requestValidator: async (data: any) => await zGetNotificationsByMessagingData.parseAsync(data), - responseValidator: async (data: any) => await zGetNotificationsByMessagingResponse.parseAsync(data), + responseValidator: async (data: any) => + await zGetNotificationsByMessagingResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/messaging/notifications', ...options, @@ -690,7 +699,8 @@ export const getIdByNotificationsByMessaging = , ) => (options.client ?? client).get({ - requestValidator: async (data: any) => await zGetIdByNotificationsByMessagingData.parseAsync(data), + requestValidator: async (data: any) => + await zGetIdByNotificationsByMessagingData.parseAsync(data), responseValidator: async (data: any) => await zGetIdByNotificationsByMessagingResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], @@ -702,7 +712,8 @@ export const patchIdByNotificationsByMessaging = , ) => (options.client ?? client).patch({ - requestValidator: async (data: any) => await zPatchIdByNotificationsByMessagingData.parseAsync(data), + requestValidator: async (data: any) => + await zPatchIdByNotificationsByMessagingData.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/messaging/notifications/{id}', ...options, @@ -738,7 +749,8 @@ export const putPreferencesByMessaging = ( ) => (options?.client ?? client).put({ requestValidator: async (data: any) => await zPutPreferencesByMessagingData.parseAsync(data), - responseValidator: async (data: any) => await zPutPreferencesByMessagingResponse.parseAsync(data), + responseValidator: async (data: any) => + await zPutPreferencesByMessagingResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/messaging/preferences', ...options, @@ -752,7 +764,8 @@ export const getIdByPreferencesByMessaging = , ) => (options.client ?? client).get({ - requestValidator: async (data: any) => await zGetIdByPreferencesByMessagingData.parseAsync(data), + requestValidator: async (data: any) => + await zGetIdByPreferencesByMessagingData.parseAsync(data), responseValidator: async (data: any) => await zGetIdByPreferencesByMessagingResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], @@ -764,7 +777,8 @@ export const getChatsByWhatsappByMessaging = , ) => (options?.client ?? client).get({ - requestValidator: async (data: any) => await zGetChatsByWhatsappByMessagingData.parseAsync(data), + requestValidator: async (data: any) => + await zGetChatsByWhatsappByMessagingData.parseAsync(data), responseValidator: async (data: any) => await zGetChatsByWhatsappByMessagingResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], @@ -927,7 +941,8 @@ export const getDownloadByDropByDropsByMusic = , ) => (options.client ?? client).get({ - requestValidator: async (data: any) => await zGetDownloadByDropByDropsByMusicData.parseAsync(data), + requestValidator: async (data: any) => + await zGetDownloadByDropByDropsByMusicData.parseAsync(data), responseValidator: async (data: any) => await zGetDownloadByDropByDropsByMusicResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], @@ -939,7 +954,8 @@ export const getUploadByDropByDropsByMusic = , ) => (options.client ?? client).get({ - requestValidator: async (data: any) => await zGetUploadByDropByDropsByMusicData.parseAsync(data), + requestValidator: async (data: any) => + await zGetUploadByDropByDropsByMusicData.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/music/drops/{dropId}/upload', ...options, @@ -989,7 +1005,8 @@ export const deleteIdByShareByDropsByMusic = , ) => (options.client ?? client).delete({ - requestValidator: async (data: any) => await zDeleteIdByShareByDropsByMusicData.parseAsync(data), + requestValidator: async (data: any) => + await zDeleteIdByShareByDropsByMusicData.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/music/drops/share/{id}', ...options, @@ -1000,7 +1017,8 @@ export const getIdByShareByDropsByMusic = ) => (options.client ?? client).get({ requestValidator: async (data: any) => await zGetIdByShareByDropsByMusicData.parseAsync(data), - responseValidator: async (data: any) => await zGetIdByShareByDropsByMusicResponse.parseAsync(data), + responseValidator: async (data: any) => + await zGetIdByShareByDropsByMusicResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/music/drops/share/{id}', ...options, @@ -1021,7 +1039,8 @@ export const getIdByProviderByPublishByMusic = , ) => (options.client ?? client).get({ - requestValidator: async (data: any) => await zGetIdByProviderByPublishByMusicData.parseAsync(data), + requestValidator: async (data: any) => + await zGetIdByProviderByPublishByMusicData.parseAsync(data), responseValidator: async (data: any) => await zGetIdByProviderByPublishByMusicResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], @@ -1046,7 +1065,8 @@ export const getArtworkBySlugByShareByMusic = , ) => (options.client ?? client).get({ - requestValidator: async (data: any) => await zGetArtworkBySlugByShareByMusicData.parseAsync(data), + requestValidator: async (data: any) => + await zGetArtworkBySlugByShareByMusicData.parseAsync(data), url: '/api/@bbn/music/share/{slug}/artwork', ...options, headers: { @@ -1107,7 +1127,8 @@ export const getDownloadBySongBySongsByMusic = , ) => (options.client ?? client).get({ - requestValidator: async (data: any) => await zGetDownloadBySongBySongsByMusicData.parseAsync(data), + requestValidator: async (data: any) => + await zGetDownloadBySongBySongsByMusicData.parseAsync(data), responseValidator: async (data: any) => await zGetDownloadBySongBySongsByMusicResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], @@ -1130,7 +1151,8 @@ export const getIdByYearInReviewByMusic = ) => (options.client ?? client).get({ requestValidator: async (data: any) => await zGetIdByYearInReviewByMusicData.parseAsync(data), - responseValidator: async (data: any) => await zGetIdByYearInReviewByMusicResponse.parseAsync(data), + responseValidator: async (data: any) => + await zGetIdByYearInReviewByMusicResponse.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/music/year-in-review/{id}', ...options, @@ -1182,7 +1204,8 @@ export const deleteIdByApplicationsByOauth = , ) => (options.client ?? client).delete({ - requestValidator: async (data: any) => await zDeleteIdByApplicationsByOauthData.parseAsync(data), + requestValidator: async (data: any) => + await zDeleteIdByApplicationsByOauthData.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/oauth/applications/{id}', ...options, @@ -1206,7 +1229,8 @@ export const getUploadByApplicationsByOauth = , ) => (options?.client ?? client).get({ - requestValidator: async (data: any) => await zGetUploadByApplicationsByOauthData.parseAsync(data), + requestValidator: async (data: any) => + await zGetUploadByApplicationsByOauthData.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/oauth/applications/upload', ...options, @@ -1318,7 +1342,8 @@ export const postResendVerifyEmailByMailByUser = , ) => (options?.client ?? client).post({ - requestValidator: async (data: any) => await zPostResendVerifyEmailByMailByUserData.parseAsync(data), + requestValidator: async (data: any) => + await zPostResendVerifyEmailByMailByUserData.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/user/mail/resend-verify-email', ...options, @@ -1332,7 +1357,8 @@ export const postTokenByValidateByMailByUser = , ) => (options.client ?? client).post({ - requestValidator: async (data: any) => await zPostTokenByValidateByMailByUserData.parseAsync(data), + requestValidator: async (data: any) => + await zPostTokenByValidateByMailByUserData.parseAsync(data), url: '/api/@bbn/user/mail/validate/{token}', ...options, headers: { @@ -1345,7 +1371,8 @@ export const postTokenByValidateByPhoneByUser = , ) => (options.client ?? client).post({ - requestValidator: async (data: any) => await zPostTokenByValidateByPhoneByUserData.parseAsync(data), + requestValidator: async (data: any) => + await zPostTokenByValidateByPhoneByUserData.parseAsync(data), url: '/api/@bbn/user/phone/validate/{token}', ...options, headers: { @@ -1358,7 +1385,8 @@ export const getUploadByAvatarBySetMeByUser = , ) => (options?.client ?? client).get({ - requestValidator: async (data: any) => await zGetUploadByAvatarBySetMeByUserData.parseAsync(data), + requestValidator: async (data: any) => + await zGetUploadByAvatarBySetMeByUserData.parseAsync(data), security: [{ scheme: 'bearer', type: 'http' }], url: '/api/@bbn/user/set-me/avatar/upload', ...options, diff --git a/src/lib/components/HardKycModal.svelte b/src/lib/components/HardKycModal.svelte index f3b4bdbb..6a13122d 100644 --- a/src/lib/components/HardKycModal.svelte +++ b/src/lib/components/HardKycModal.svelte @@ -78,7 +78,7 @@ // Validation per step const isStep1Valid = $derived(idType.length > 0 && idNumber.trim().length > 0); const isStep2Valid = $derived( - idFrontFile !== null && (idType === 'passport' || idBackFile !== null) + idFrontFile !== null && (idType === 'passport' || idBackFile !== null), ); const isStep3Valid = $derived(selfieFile !== null); const isStep4Valid = $derived(proofOfAddressFile !== null); @@ -99,7 +99,7 @@ function handleFileChange( event: Event, setter: (file: File | null) => void, - maxSizeMB: number = 10 + maxSizeMB: number = 10, ) { const target = event.target as HTMLInputElement; const file = target.files?.[0]; @@ -424,9 +424,7 @@

Tax Information

-

- Required for tax reporting and payout processing -

+

Required for tax reporting and payout processing

-
+
import { Modal, Button, Input, SearchableSelect } from '$lib/components/ui'; import { kyc, type LightKycData, type VerificationType } from '$lib/stores/kyc'; - import { CheckCircleSolid, ExclamationCircleOutline, UserSolid, BuildingSolid } from 'flowbite-svelte-icons'; + import { + CheckCircleSolid, + ExclamationCircleOutline, + UserSolid, + BuildingSolid, + } from 'flowbite-svelte-icons'; import { extractErrorMessage } from '$lib/utils/extractError'; interface Props { @@ -82,19 +87,19 @@ const isStep1Valid = $derived(verificationType.length > 0); const isStep2Valid = $derived( - firstName.trim().length > 0 && lastName.trim().length > 0 && dateOfBirth.length > 0 + firstName.trim().length > 0 && lastName.trim().length > 0 && dateOfBirth.length > 0, ); const isStep3Valid = $derived( verificationType === 'individual' || - (companyName.trim().length > 0 && registrationNumber.trim().length > 0) + (companyName.trim().length > 0 && registrationNumber.trim().length > 0), ); const isAddressStepValid = $derived( country.length > 0 && street.trim().length > 0 && city.trim().length > 0 && - postalCode.trim().length > 0 + postalCode.trim().length > 0, ); // Age validation (must be 16+) @@ -224,23 +229,41 @@
@@ -252,7 +275,9 @@

- {verificationType === 'business' ? 'Representative Information' : 'Personal Information'} + {verificationType === 'business' + ? 'Representative Information' + : 'Personal Information'}

{verificationType === 'business' @@ -262,18 +287,8 @@

- - + +
Date of Birth {new Date(dateOfBirth).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}{new Date(dateOfBirth).toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric', + })}
@@ -466,7 +485,11 @@
Date of Birth {new Date(dateOfBirth).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}{new Date(dateOfBirth).toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric', + })}
diff --git a/src/lib/components/PhoneInput.svelte b/src/lib/components/PhoneInput.svelte index c650a1da..16a1177f 100644 --- a/src/lib/components/PhoneInput.svelte +++ b/src/lib/components/PhoneInput.svelte @@ -71,7 +71,11 @@ const newNational = parsed.nationalNumber; // Only update if different to avoid loops - if (!initialized || newCountry !== selectedCountry || newNational !== phoneNumber.replace(/\D/g, '')) { + if ( + !initialized || + newCountry !== selectedCountry || + newNational !== phoneNumber.replace(/\D/g, '') + ) { selectedCountry = newCountry; // Format the national number const formatter = new AsYouType(newCountry); diff --git a/src/lib/components/SongModal.svelte b/src/lib/components/SongModal.svelte index 97b9cbef..30c81f90 100644 --- a/src/lib/components/SongModal.svelte +++ b/src/lib/components/SongModal.svelte @@ -10,7 +10,11 @@ UserSolid, ChevronDownOutline, } from 'flowbite-svelte-icons'; - import { primaryGenreOptions, languageOptions, getSecondaryGenreOptions } from '$lib/data/options'; + import { + primaryGenreOptions, + languageOptions, + getSecondaryGenreOptions, + } from '$lib/data/options'; import type { ArtistRef } from '$lib/types/drop'; interface Props { @@ -117,9 +121,7 @@ // Validation const isValid = $derived( - song.title.trim().length > 0 && - song.artists.length > 0 && - (!requiresFile || fileUploaded), + song.title.trim().length > 0 && song.artists.length > 0 && (!requiresFile || fileUploaded), ); @@ -248,8 +250,18 @@
Content Flags
- - + +

Mark if this song contains explicit lyrics or is purely instrumental (mutually @@ -347,9 +359,7 @@

- +
{/snippet} diff --git a/src/lib/components/admin/DropDiffView.svelte b/src/lib/components/admin/DropDiffView.svelte index 2e5fa663..7b7d0bf2 100644 --- a/src/lib/components/admin/DropDiffView.svelte +++ b/src/lib/components/admin/DropDiffView.svelte @@ -27,19 +27,58 @@ // Compare drop-level fields const metadataFields = $derived([ { key: 'title', label: 'Title', current: current.title, published: published.title }, - { key: 'release', label: 'Release Date', current: current.release, published: published.release }, + { + key: 'release', + label: 'Release Date', + current: current.release, + published: published.release, + }, { key: 'artwork', label: 'Artwork', current: current.artwork, published: published.artwork }, - { key: 'language', label: 'Language', current: current.language, published: published.language }, - { key: 'primaryGenre', label: 'Primary Genre', current: current.primaryGenre, published: published.primaryGenre }, - { key: 'secondaryGenre', label: 'Secondary Genre', current: current.secondaryGenre, published: published.secondaryGenre }, - { key: 'compositionCopyright', label: 'Composition (C)', current: current.compositionCopyright, published: published.compositionCopyright }, - { key: 'soundRecordingCopyright', label: 'Sound Recording (P)', current: current.soundRecordingCopyright, published: published.soundRecordingCopyright }, + { + key: 'language', + label: 'Language', + current: current.language, + published: published.language, + }, + { + key: 'primaryGenre', + label: 'Primary Genre', + current: current.primaryGenre, + published: published.primaryGenre, + }, + { + key: 'secondaryGenre', + label: 'Secondary Genre', + current: current.secondaryGenre, + published: published.secondaryGenre, + }, + { + key: 'compositionCopyright', + label: 'Composition (C)', + current: current.compositionCopyright, + published: published.compositionCopyright, + }, + { + key: 'soundRecordingCopyright', + label: 'Sound Recording (P)', + current: current.soundRecordingCopyright, + published: published.soundRecordingCopyright, + }, { key: 'gtin', label: 'GTIN', current: current.gtin, published: published.gtin }, - { key: 'comments', label: 'Comments', current: current.comments, published: published.comments }, + { + key: 'comments', + label: 'Comments', + current: current.comments, + published: published.comments, + }, ]); - const changedMetadata = $derived(metadataFields.filter((f) => isDifferent(f.current, f.published))); - const unchangedMetadata = $derived(metadataFields.filter((f) => !isDifferent(f.current, f.published))); + const changedMetadata = $derived( + metadataFields.filter((f) => isDifferent(f.current, f.published)), + ); + const unchangedMetadata = $derived( + metadataFields.filter((f) => !isDifferent(f.current, f.published)), + ); // Compare artists function artistsMatch(a: ArtistRef, b: ArtistRef): boolean { @@ -127,7 +166,8 @@ if (isDifferent(current.explicit, published.explicit)) changes.push('explicit'); if (isDifferent(current.instrumental, published.instrumental)) changes.push('instrumental'); if (isDifferent(current.primaryGenre, published.primaryGenre)) changes.push('primaryGenre'); - if (isDifferent(current.secondaryGenre, published.secondaryGenre)) changes.push('secondaryGenre'); + if (isDifferent(current.secondaryGenre, published.secondaryGenre)) + changes.push('secondaryGenre'); if (isDifferent(current.year, published.year)) changes.push('year'); if (isDifferent(current.language, published.language)) changes.push('language'); if (isDifferent(current.country, published.country)) changes.push('country'); @@ -139,11 +179,11 @@ const hasAnyChanges = $derived( changedMetadata.length > 0 || - artistChanges.added.length > 0 || - artistChanges.removed.length > 0 || - songChanges.added.length > 0 || - songChanges.removed.length > 0 || - songChanges.modified.length > 0 + artistChanges.added.length > 0 || + artistChanges.removed.length > 0 || + songChanges.added.length > 0 || + songChanges.removed.length > 0 || + songChanges.modified.length > 0, ); function toggleSong(songId: string) { @@ -240,14 +280,18 @@

Artist Changes

{#each artistChanges.removed as artist} -
+
- {artist.type} {getArtistDisplayName(artist)}
{/each} {#each artistChanges.added as artist} -
+
+ {artist.type} {getArtistDisplayName(artist)} @@ -324,9 +368,13 @@
{#if change === 'artists'} - {(pubValue as ArtistRef[])?.map((a) => getArtistDisplayName(a)).join(', ') || '(none)'} + {(pubValue as ArtistRef[]) + ?.map((a) => getArtistDisplayName(a)) + .join(', ') || '(none)'} {:else if change === 'lyrics' || change === 'timedLyrics'} - {pubValue ? `${String(pubValue).length} chars` : '(empty)'} + {pubValue ? `${String(pubValue).length} chars` : '(empty)'} {:else if typeof pubValue === 'boolean'} {pubValue ? 'Yes' : 'No'} {:else} @@ -335,9 +383,13 @@
{#if change === 'artists'} - {(curValue as ArtistRef[])?.map((a) => getArtistDisplayName(a)).join(', ') || '(none)'} + {(curValue as ArtistRef[]) + ?.map((a) => getArtistDisplayName(a)) + .join(', ') || '(none)'} {:else if change === 'lyrics' || change === 'timedLyrics'} - {curValue ? `${String(curValue).length} chars` : '(empty)'} + {curValue ? `${String(curValue).length} chars` : '(empty)'} {:else if typeof curValue === 'boolean'} {curValue ? 'Yes' : 'No'} {:else} diff --git a/src/lib/components/ui/Input.svelte b/src/lib/components/ui/Input.svelte index 702aef19..82145993 100644 --- a/src/lib/components/ui/Input.svelte +++ b/src/lib/components/ui/Input.svelte @@ -36,7 +36,9 @@
{#if icon} -
+
{@render icon()}
{/if} diff --git a/src/lib/components/ui/SearchableSelect.svelte b/src/lib/components/ui/SearchableSelect.svelte index 5466fd9c..a2ca14fc 100644 --- a/src/lib/components/ui/SearchableSelect.svelte +++ b/src/lib/components/ui/SearchableSelect.svelte @@ -53,7 +53,7 @@ const query = searchQuery.toLowerCase(); return options.filter( (option) => - option.label.toLowerCase().includes(query) || option.value.toLowerCase().includes(query) + option.label.toLowerCase().includes(query) || option.value.toLowerCase().includes(query), ); }); @@ -205,7 +205,9 @@ onkeydown={handleKeydown} > -
+
(field ? `${field} is too long (max ${m[1]} characters)` : `Too long (max ${m[1]} characters)`), + (m) => + field + ? `${field} is too long (max ${m[1]} characters)` + : `Too long (max ${m[1]} characters)`, ], [ /^Number must be greater than or equal to (\d+)$/, diff --git a/src/lib/utils/formatDate.ts b/src/lib/utils/formatDate.ts index a651fbea..dc19eaaf 100644 --- a/src/lib/utils/formatDate.ts +++ b/src/lib/utils/formatDate.ts @@ -15,7 +15,7 @@ export interface FormatDateOptions { */ export function formatDate( input: string | number | Date | undefined | null, - options: FormatDateOptions = {} + options: FormatDateOptions = {}, ): string { if (!input) return 'N/A'; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index f91612aa..4453e15f 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -11,12 +11,12 @@ import { initApiClient, getAuthHeaders } from '$lib/apiClient'; import { postResendVerifyEmailByMailByUser } from '$lib/api/sdk.gen'; import { - initPostHog, - trackPageView, - identifyUser, - acceptTracking, - declineTracking, -} from '$lib/analytics/posthog'; + initPostHog, + trackPageView, + identifyUser, + acceptTracking, + declineTracking, + } from '$lib/analytics/posthog'; import { cookieConsent } from '$lib/stores/cookieConsent.svelte'; import CookieConsent from '$lib/components/CookieConsent.svelte'; import { avatarStore } from '$lib/stores/avatar.svelte'; @@ -428,7 +428,7 @@ {@const active = isActive(item.href, item.exact)} hidden = true} + onclick={() => (hidden = true)} class="px-4 py-2 rounded-lg transition-all duration-200 {active ? currentApp === 'admin' ? 'bg-red-500/20 text-red-600 dark:text-red-400' @@ -445,7 +445,7 @@
hidden = true} + onclick={() => (hidden = true)} class="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/10 px-4 py-2 rounded-lg transition-all duration-200" > Settings diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 68138a2d..a8c0fa81 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,6 +1,6 @@ +
diff --git a/src/routes/admin/search/+page.svelte b/src/routes/admin/search/+page.svelte index 8461597d..fc6cf4ed 100644 --- a/src/routes/admin/search/+page.svelte +++ b/src/routes/admin/search/+page.svelte @@ -414,7 +414,9 @@
-
- +