diff --git a/.editorconfig b/.editorconfig index b4d2be4..4e1d18d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,6 +1,6 @@ -[*] -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_style = space -indent_size = 4 +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = tab +indent_size = 4 diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 3897265..0000000 --- a/.eslintignore +++ /dev/null @@ -1,13 +0,0 @@ -.DS_Store -node_modules -/build -/.svelte-kit -/package -.env -.env.* -!.env.example - -# Ignore files for PNPM, NPM and YARN -pnpm-lock.yaml -package-lock.json -yarn.lock diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 3ccf435..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], - plugins: ['svelte3', '@typescript-eslint'], - ignorePatterns: ['*.cjs'], - overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], - settings: { - 'svelte3/typescript': () => require('typescript') - }, - parserOptions: { - sourceType: 'module', - ecmaVersion: 2020 - }, - env: { - browser: true, - es2017: true, - node: true - } -}; diff --git a/.node-version b/.node-version deleted file mode 100644 index 3c03207..0000000 --- a/.node-version +++ /dev/null @@ -1 +0,0 @@ -18 diff --git a/.npmrc b/.npmrc deleted file mode 100644 index b6f27f1..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict=true diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 3897265..0000000 --- a/.prettierignore +++ /dev/null @@ -1,13 +0,0 @@ -.DS_Store -node_modules -/build -/.svelte-kit -/package -.env -.env.* -!.env.example - -# Ignore files for PNPM, NPM and YARN -pnpm-lock.yaml -package-lock.json -yarn.lock diff --git a/bun.lockb b/bun.lockb index da2e9728aaf22b215f7e05a2e101a72ac4650387..52896192903d255531b5cb4da18d1a139a417477 100755 GIT binary patch delta 34913 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 WOG*LsPTQ7E(@rocPS-fWv;+Ve?%H7h diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..c5068e1 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,50 @@ +import js from '@eslint/js'; +import svelte from 'eslint-plugin-svelte'; +import svelteParser from 'svelte-eslint-parser'; +import prettier from 'eslint-config-prettier'; +import ts from 'typescript-eslint'; + +import { includeIgnoreFile } from '@eslint/compat'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const gitignorePath = path.resolve(__dirname, '.gitignore'); + +import globals from 'globals'; + +/** @type {import("eslint").Linter.FlatConfig[]} */ +export default [ + includeIgnoreFile(gitignorePath), + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs['flat/recommended'], + prettier, + { + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + globals: { ...globals.node, ...globals.browser }, + parserOptions: { + projectService: true, + parser: ts.parser, + extraFileExtensions: ['.svelte'], + tsconfigRootDir: import.meta.dirname + } + } + }, + { + files: ['**/*.svelte', '*.svelte'], + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + globals: { ...globals.browser }, + parser: svelteParser, + parserOptions: { + parser: ts.parser, + extraFileExtensions: ['.svelte'] + } + } + } +]; diff --git a/package.json b/package.json index b027bd2..d8eda8e 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,12 @@ "preview": "vite preview", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --plugin-search-dir . --check . && eslint .", - "format": "prettier --plugin-search-dir . --write ." + "lint": "prettier --ignore-path .gitignore --plugin-search-dir . --check . && eslint .", + "format": "prettier --ignore-path .gitignore --plugin-search-dir . --write ." }, "devDependencies": { + "@eslint/compat": "^1.1.0", + "@eslint/js": "^9.6.0", "@iconify-json/carbon": "^1.1.36", "@iconify/svelte": "^4.0.2", "@iconify/utils": "^2.1.25", @@ -19,18 +21,18 @@ "@sveltejs/kit": "^2.5.18", "@tailwindcss/vite": "^4.0.0-alpha.17", "@types/node": "^20.14.10", - "@typescript-eslint/eslint-plugin": "^7.15.0", - "@typescript-eslint/parser": "^7.15.0", "eslint": "^9.6.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte3": "^4.0.0", + "eslint-plugin-svelte": "^2.41.0", "prettier": "^3.3.2", "prettier-plugin-svelte": "^3.2.5", "svelte": "^5.0.0-next.175", "svelte-check": "^3.8.4", + "svelte-eslint-parser": "^0.39.2", "tailwindcss": "^4.0.0-alpha.17", "tslib": "^2.6.3", "typescript": "^5.5.3", + "typescript-eslint": "^7.15.0", "unplugin-icons": "^0.19.0", "vite": "^5.3.3" }, diff --git a/src/routes/api/spotify/np/+server.ts b/src/routes/api/spotify/np/+server.ts index e9c4e1f..5410824 100644 --- a/src/routes/api/spotify/np/+server.ts +++ b/src/routes/api/spotify/np/+server.ts @@ -3,9 +3,9 @@ // NOT in the /functions directory. import { - SPOTIFY_CLIENT_ID, - SPOTIFY_CLIENT_SECRET, - SPOTIFY_REFRESH_TOKEN + SPOTIFY_CLIENT_ID, + SPOTIFY_CLIENT_SECRET, + SPOTIFY_REFRESH_TOKEN } from '$env/static/private'; // btoa is deprecated in node but we're not running in node! @@ -15,97 +15,97 @@ const TOKEN_ENDPOINT = `https://accounts.spotify.com/api/token`; const NOW_PLAYING_ENDPOINT = `https://api.spotify.com/v1/me/player/currently-playing`; const getAccessToken = async () => { - const response = await fetch(TOKEN_ENDPOINT, { - method: 'POST', - headers: { - Authorization: `Basic ${basic}`, - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: new URLSearchParams({ - grant_type: 'refresh_token', - refresh_token: SPOTIFY_REFRESH_TOKEN - }).toString() - }); - - return response.json(); + const response = await fetch(TOKEN_ENDPOINT, { + method: 'POST', + headers: { + Authorization: `Basic ${basic}`, + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: new URLSearchParams({ + grant_type: 'refresh_token', + refresh_token: SPOTIFY_REFRESH_TOKEN + }).toString() + }); + + return response.json(); }; const getNowPlaying = async () => { - const { access_token } = await getAccessToken(); + const { access_token } = await getAccessToken(); - return fetch(NOW_PLAYING_ENDPOINT, { - headers: { - Authorization: `Bearer ${access_token}` - } - }); + return fetch(NOW_PLAYING_ENDPOINT, { + headers: { + Authorization: `Bearer ${access_token}` + } + }); }; export async function GET() { - const response = await getNowPlaying(); - - if (response.status === 204 || response.status > 400) { - return new Response(JSON.stringify({ isPlaying: false }), { - status: 200, - headers: { - 'content-type': 'application/json' - } - }); - } - - const song = await response.json(); - - if (!song.item) { - return new Response(JSON.stringify({ isPlaying: false }), { - headers: { - 'content-type': 'application/json' - } - }); - } - - const isPlaying = song.is_playing; - - const artists = song.item.artists.map((a: Artist) => ({ - name: a.name, - url: a.external_urls.spotify - })); - - const songData = { - title: song.item.name, - url: song.item.external_urls.spotify - }; - - const album = { - coverUrl: song.item.album.images[0].url, - url: song.item.album.external_urls.spotify - }; - - if (songData.title.length > 25) { - songData.title = songData.title.substring(0, 25) + '...'; - } - - return new Response( - JSON.stringify({ - isPlaying, - song: songData, - artists, - album - }), - { - headers: { - 'content-type': 'application/json', - 'cache-control': 'public, s-maxage=60, stale-while-revalidate=30' - } - } - ); + const response = await getNowPlaying(); + + if (response.status === 204 || response.status > 400) { + return new Response(JSON.stringify({ isPlaying: false }), { + status: 200, + headers: { + 'content-type': 'application/json' + } + }); + } + + const song = await response.json(); + + if (!song.item) { + return new Response(JSON.stringify({ isPlaying: false }), { + headers: { + 'content-type': 'application/json' + } + }); + } + + const isPlaying = song.is_playing; + + const artists = song.item.artists.map((a: Artist) => ({ + name: a.name, + url: a.external_urls.spotify + })); + + const songData = { + title: song.item.name, + url: song.item.external_urls.spotify + }; + + const album = { + coverUrl: song.item.album.images[0].url, + url: song.item.album.external_urls.spotify + }; + + if (songData.title.length > 25) { + songData.title = songData.title.substring(0, 25) + '...'; + } + + return new Response( + JSON.stringify({ + isPlaying, + song: songData, + artists, + album + }), + { + headers: { + 'content-type': 'application/json', + 'cache-control': 'public, s-maxage=60, stale-while-revalidate=30' + } + } + ); } type Artist = { - external_urls: { - spotify: string; - }; - href: string; - id: string; - name: string; - type: string; - uri: string; + external_urls: { + spotify: string; + }; + href: string; + id: string; + name: string; + type: string; + uri: string; };