diff --git a/.gitignore b/.gitignore index 1439e8c..c0b6f43 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,26 @@ -/node_modules +node_modules +target +src-native/appdata +ferrum-addon/addon.node + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit /build -/target -/src-native/appdata -/ferrum-addon/addon.node + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/package-lock.json b/package-lock.json index a43db22..49c7609 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ "@eslint/compat": "^2.1.0", "@eslint/js": "^10.0.1", "@napi-rs/cli": "^3.8.2", - "@sveltejs/vite-plugin-svelte": "^7.3.0", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.70.2", "@tailwindcss/vite": "^4.3.3", "@tsconfig/svelte": "^5.0.8", "@types/d3-scale": "^4.0.9", @@ -2847,6 +2848,13 @@ "node": ">=14.18.0" } }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", @@ -3153,6 +3161,13 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, "node_modules/@sveltejs/acorn-typescript": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.12.tgz", @@ -3163,6 +3178,68 @@ "acorn": "^8.9.0" } }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.70.2", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.70.2.tgz", + "integrity": "sha512-RzRoRpuR2KXqc5yMO0akQHDZeT4AslOlznGITURsqHaVbtyYP4Wn3eE3gxj9JcDyNYO0crkxhdwFHc+2vkVm6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.9", + "@types/cookie": "^0.6.0", + "acorn": "^8.16.0", + "cookie": "^0.6.0", + "devalue": "^5.8.1", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "set-cookie-parser": "^3.0.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.3.3 || ^6.0.0", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@sveltejs/kit/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/@sveltejs/load-config": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@sveltejs/load-config/-/load-config-0.2.2.tgz", @@ -3179,6 +3256,7 @@ "integrity": "sha512-QbRoJyD92e9R0ufeQIWRHrCC0ObcqSv/aBDdrQMoU+sypav3cDx5wytdQ6GLdXjEMO6xjrXGzfkUygng8JMv0A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "deepmerge": "^4.3.1", "magic-string": "^1.0.0", @@ -3519,6 +3597,13 @@ "@types/responselike": "^1.0.0" } }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/d3-scale": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", @@ -4711,6 +4796,16 @@ "url": "https://opencollective.com/express" } }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -6802,6 +6897,16 @@ "json-buffer": "3.0.1" } }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/known-css-properties": { "version": "0.37.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", @@ -7178,6 +7283,7 @@ "integrity": "sha512-kS3VHe0nEPST2saQV4Rbkchcd3UBRkVTQHo1D3h/ZTwFDhai/mfKkmtPAtD129EOI7K3HlHIsFOt0WrI2/oU9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -7377,6 +7483,16 @@ "node": ">=4" } }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -8510,6 +8626,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/set-cookie-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.2.tgz", + "integrity": "sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==", + "dev": true, + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8559,6 +8682,21 @@ "node": ">=10" } }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9061,6 +9199,16 @@ "tmp": "^0.2.0" } }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -9646,6 +9794,7 @@ "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", "dev": true, "license": "MIT", + "peer": true, "workspaces": [ "tests/deps/*", "tests/projects/*", diff --git a/package.json b/package.json index 2e62024..f1bb54b 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,8 @@ "@eslint/compat": "^2.1.0", "@eslint/js": "^10.0.1", "@napi-rs/cli": "^3.8.2", - "@sveltejs/vite-plugin-svelte": "^7.3.0", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.70.2", "@tailwindcss/vite": "^4.3.3", "@tsconfig/svelte": "^5.0.8", "@types/d3-scale": "^4.0.9", diff --git a/src/app.d.ts b/src/app.d.ts new file mode 100644 index 0000000..4e661d5 --- /dev/null +++ b/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {} diff --git a/index.html b/src/app.html similarity index 61% rename from index.html rename to src/app.html index b013b36..fb9ac9c 100755 --- a/index.html +++ b/src/app.html @@ -3,10 +3,10 @@ - - + + %sveltekit.head% - +
%sveltekit.body%
diff --git a/src/components/Player.svelte b/src/components/Player.svelte index 9e7dd3f..98f22e7 100644 --- a/src/components/Player.svelte +++ b/src/components/Player.svelte @@ -24,7 +24,7 @@ handle_selected_tracks_action, } from '$lib/menus' import { ipc_renderer } from '$lib/window' - import { tracks_page_item_ids } from './TrackList.svelte' + import { tracks_page_item_ids } from '$routes/playlist/[id]/+page.svelte' import { onDestroy } from 'svelte' interface Props { diff --git a/src/components/QuickNav.svelte b/src/components/QuickNav.svelte index 701ec56..a7d5875 100644 --- a/src/components/QuickNav.svelte +++ b/src/components/QuickNav.svelte @@ -7,9 +7,10 @@ import type { TrackListDetails } from 'ferrum-addon' import Modal from './Modal.svelte' import { special_playlists_nav } from './Sidebar.svelte' - import { navigate } from '$lib/router' + import { goto } from '$app/navigation' + import { resolve } from '$app/paths' - type Result = TrackListDetails & { path?: string } + type Result = TrackListDetails let value = $state('') let show = $state(false) @@ -47,7 +48,8 @@ show = false value = '' } else if (check_shortcut(e, 'Enter')) { - navigate('/playlist/' + filtered_items[selected_index].obj.id) + const id = filtered_items[selected_index].obj.id + goto(resolve('/playlist/[id]', { id })) show = false } else if (check_shortcut(e, 'ArrowUp')) { selected_index = clamp_index(selected_index - 1) @@ -91,7 +93,7 @@ bind:this={list_items[i]} type="button" onclick={() => { - navigate(item.obj.path ?? '/playlist/' + item.obj.id) + goto(resolve('/playlist/[id]', { id: item.obj.id })) show = false }} class:selected={selected_index === i} diff --git a/src/components/Sidebar.svelte b/src/components/Sidebar.svelte index 417d188..4200cd2 100644 --- a/src/components/Sidebar.svelte +++ b/src/components/Sidebar.svelte @@ -14,9 +14,10 @@ import { onDestroy, setContext, tick } from 'svelte' import { dragged } from '../lib/drag-drop' import { tracklist_actions } from '$lib/page' - import { navigate } from '$lib/router' - import { current_playlist_id } from './TrackList.svelte' + import { goto } from '$app/navigation' + import { current_playlist_id } from '$routes/playlist/[id]/+page.svelte' import { prevent_default_self } from '$lib/helpers' + import { resolve } from '$app/paths' let viewport: HTMLElement | undefined = $state() const item_handle = setContext('itemHandle', writable(null as SidebarItemHandle | null)) @@ -170,7 +171,8 @@ children={special_playlists_nav} on_select_down={() => { if ($track_lists_details_map.root.children && $track_lists_details_map.root.children[0]) { - navigate('/playlist/' + $track_lists_details_map.root.children[0]) + const id = $track_lists_details_map.root.children[0] + goto(resolve('/playlist/[id]', { id })) } }} /> diff --git a/src/components/SidebarItems.svelte b/src/components/SidebarItems.svelte index 1908510..317ffeb 100644 --- a/src/components/SidebarItems.svelte +++ b/src/components/SidebarItems.svelte @@ -36,9 +36,11 @@ import * as dragGhost from './DragGhost.svelte' import { ipc_renderer } from '$lib/window' import { check_shortcut } from '$lib/helpers' - import { navigate, url_pathname } from '$lib/router' - import { current_playlist_id } from './TrackList.svelte' + import { current_playlist_id } from '$routes/playlist/[id]/+page.svelte' import { tracklist_actions } from '$lib/page' + import { resolve } from '$app/paths' + import { goto } from '$app/navigation' + import { page } from '$app/state' type Child = TrackListDetails @@ -71,7 +73,8 @@ function select_first(item: Child) { const child_id = item.children?.[0] if (child_id) { - navigate('/playlist/' + $track_lists_details_map[child_id].id) + const id = $track_lists_details_map[child_id].id + goto(resolve('/playlist/[id]', { id })) } } function select_last(in_id: string) { @@ -79,24 +82,25 @@ if (children && (has_showing_children(in_id) || in_id === 'root')) { select_last(children[children.length - 1]) } else { - navigate('/playlist/' + $track_lists_details_map[in_id].id) + const id = $track_lists_details_map[in_id].id + goto(resolve('/playlist/[id]', { id })) } } function select_up(i: number) { const prev = children[i - 1] || null if (i === 0 && parent_id) { - navigate(`/playlist/${parent_id}`) + goto(resolve('/playlist/[id]', { id: parent_id })) } else if (prev && has_showing_children(prev.id)) { select_last(prev.id) } else if (prev) { - navigate(`/playlist/${prev.id}`) + goto(resolve('/playlist/[id]', { id: prev.id })) } } function select_down(i: number) { if (has_showing_children(children[i].id)) { select_first(children[i]) } else if (children[i + 1]) { - navigate(`/playlist/${children[i + 1].id}`) + goto(resolve('/playlist/[id]', { id: children[i + 1].id })) } else { on_select_down?.() } @@ -104,7 +108,7 @@ export function handle_key(e: KeyboardEvent) { const index = children.findIndex((child) => { - return `/playlist/${child.id}` === $url_pathname + return resolve('/playlist/[id]', { id: child.id }) === page.url.pathname }) if (index < 0) { return @@ -114,7 +118,7 @@ if (check_shortcut(e, 'ArrowUp')) { select_up(index) } else if (check_shortcut(e, 'ArrowUp', { alt: true })) { - navigate('/playlist/root') + goto(resolve('/playlist/root')) } else if (check_shortcut(e, 'ArrowDown', { alt: true })) { select_last('root') } else if (check_shortcut(e, 'ArrowDown')) { @@ -123,7 +127,7 @@ if (selected_list.kind === 'folder' && $shown_folders.includes(selected_list.id)) { hide_folder(selected_list.id) } else if (parent_id) { - navigate(`/playlist/${parent_id}`) + goto(resolve('/playlist/[id]', { id: parent_id })) } } else if (check_shortcut(e, 'ArrowRight') && selected_list.kind === 'folder') { show_folder(selected_list.id) @@ -133,7 +137,9 @@ e.preventDefault() } $effect(() => { - if (children.find((child) => `/playlist/${child.id}` === $url_pathname)) { + if ( + children.find((child) => resolve(`/playlist/[id]`, { id: child.id }) === page.url.pathname) + ) { const item_handle = getContext>('itemHandle') item_handle.set({ handleKey: handle_key }) } @@ -174,11 +180,11 @@ {#each children as child_list, i} {#if child_list.kind === 'folder'} on_drag_start(e, child_list)} class:show={$shown_folders.includes(child_list.id)} @@ -201,7 +207,9 @@ drag_playlist_onto_index = null } }} - onmousedown={() => navigate(`/playlist/${child_list.id}`)} + onmousedown={() => { + goto(resolve('/playlist/[id]', { id: child_list.id })) + }} oncontextmenu={() => tracklist_context_menu(child_list.id, true)} > @@ -259,7 +267,7 @@ prevent_drop={prevent_drop || dragged.playlist?.id === child_list.id} on_select_down={() => { if (i < children.length - 1) { - navigate(`/playlist/${children[i + 1].id}`) + goto(resolve('/playlist/[id]', { id: children[i + 1].id })) } else { on_select_down?.() } @@ -268,15 +276,17 @@ {:else if child_list.kind === 'playlist'} on_drag_start(e, child_list)} - class:active={`/playlist/${child_list.id}` === $url_pathname} - onmousedown={() => navigate(`/playlist/${child_list.id}`)} + class:active={resolve(`/playlist/[id]`, { id: child_list.id }) === page.url.pathname} + onmousedown={() => { + goto(resolve('/playlist/[id]', { id: child_list.id })) + }} class:droppable={drag_track_onto_index === i} class:droppable-above={drag_playlist_onto_index === i && drop_above} class:droppable-below={drag_playlist_onto_index === i && !drop_above} @@ -336,15 +346,15 @@ {:else} { e.preventDefault() - navigate(`/playlist/${child_list.id}`) + goto(resolve('/playlist/[id]', { id: child_list.id })) }} - class:active={`/playlist/${child_list.id}` === $url_pathname} + class:active={resolve(`/playlist/[id]`, { id: child_list.id }) === page.url.pathname} >
diff --git a/src/electron/main.ts b/src/electron/main.ts index 1e2f7de..bcaa6c3 100644 --- a/src/electron/main.ts +++ b/src/electron/main.ts @@ -2,7 +2,7 @@ import { app, ipcMain, session, BrowserWindow, dialog, protocol, net } from 'ele import is from './is' import { createRequire } from 'node:module' const require = createRequire(import.meta.url) -const addon = require('ferrum-addon') +const addon: typeof import('ferrum-addon') = require('ferrum-addon') if (is.dev) app.setName('Ferrum Dev') diff --git a/src/lib/Route.svelte b/src/lib/Route.svelte deleted file mode 100644 index 607bd19..0000000 --- a/src/lib/Route.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - -{#if params} - {@render children(params)} -{/if} diff --git a/src/lib/data.ts b/src/lib/data.ts index f72fce9..9e74518 100644 --- a/src/lib/data.ts +++ b/src/lib/data.ts @@ -10,9 +10,10 @@ import type { ViewOptions, } from 'ferrum-addon' import { init_queue_persistence, queue } from './queue' -import { current_playlist_id } from '$components/TrackList.svelte' -import { navigate } from './router' +import { current_playlist_id } from '$routes/playlist/[id]/+page.svelte' import { call_sync, get_error_message, strict_call } from './error' +import { goto } from '$app/navigation' +import { resolve } from '$app/paths' export const is_dev = window.is_dev export const local_data_path = window.local_data_path @@ -173,7 +174,7 @@ export function get_track_list(id: TrackListID) { export function delete_track_list(id: TrackListID) { strict_call((addon) => addon.delete_track_list(id)) if (id === get(current_playlist_id)) { - navigate('/playlist/root') + goto(resolve('/playlist/root')) } track_lists_details_map.refresh() save() diff --git a/src/lib/menus.ts b/src/lib/menus.ts index 810545a..39965e2 100644 --- a/src/lib/menus.ts +++ b/src/lib/menus.ts @@ -13,9 +13,10 @@ import { get } from 'svelte/store' import { append_to_user_queue, prepend_to_user_queue } from './queue' import type { SelectedTracksAction } from '$electron/typed_ipc' import { open_track_info } from '$components/TrackInfo.svelte' -import { navigate } from './router' import { tracklist_actions } from './page' import { tick } from 'svelte' +import { goto } from '$app/navigation' +import { resolve } from '$app/paths' export function get_flattened_tracklists() { const track_lists = get(track_lists_details_map) @@ -69,7 +70,7 @@ export function handle_selected_tracks_action({ if (list.type === 'playlist') { reveal_index = list.tracks.indexOf(first_track_id) } - navigate('/playlist/' + action.playlist_id) + goto(resolve('/playlist/[id]', { id: action.playlist_id })) tick().then(() => { tracklist_actions.go_to_index(reveal_index) }) diff --git a/src/lib/player.ts b/src/lib/player.ts index c2ddef3..84401d8 100644 --- a/src/lib/player.ts +++ b/src/lib/player.ts @@ -15,7 +15,7 @@ import { import type { Track, TrackID } from 'ferrum-addon' import { ipc_renderer } from './window' import { queue, set_new_queue, next as queueNext, prev as queuePrev } from './queue' -import { tracks_page_item_ids } from '$components/TrackList.svelte' +import { tracks_page_item_ids } from '$routes/playlist/[id]/+page.svelte' const audio = new Audio() export const audio_context = new AudioContext() diff --git a/src/lib/router.ts b/src/lib/router.ts deleted file mode 100644 index c6730ce..0000000 --- a/src/lib/router.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { writable } from 'svelte/store' - -export const url_pathname = writable(window.location.pathname) - -export function navigate(to_pathname: string, options: { replace?: boolean } = {}) { - if (to_pathname !== window.location.pathname + window.location.search) { - if (options.replace) { - window.history.replaceState({}, '', to_pathname) - } else { - window.history.pushState({}, '', to_pathname) - } - url_pathname.set(to_pathname) - } -} - -window.addEventListener('click', (e) => { - let node = e.target - while (node) { - if ((node as HTMLAnchorElement).nodeName === 'A') { - const new_url = new URL((node as HTMLAnchorElement).href) - if (new_url.origin === window.location.origin) { - e.preventDefault() - } - } - node = (node as Node).parentNode - } -}) - -export function navigate_back() { - window.history.back() -} - -export function navigate_forward() { - window.history.forward() -} -window.addEventListener('popstate', () => { - url_pathname.set(window.location.pathname) -}) diff --git a/src/main.ts b/src/main.ts deleted file mode 100755 index 8cc3eae..0000000 --- a/src/main.ts +++ /dev/null @@ -1,9 +0,0 @@ -import './app.css' -import App from './App.svelte' -import { mount } from 'svelte' - -const app = mount(App, { - target: document.body, -}) - -export default app diff --git a/src/App.svelte b/src/routes/+layout.svelte similarity index 86% rename from src/App.svelte rename to src/routes/+layout.svelte index 413c5d1..4532549 100755 --- a/src/App.svelte +++ b/src/routes/+layout.svelte @@ -1,14 +1,15 @@
diff --git a/svelte.config.js b/svelte.config.js index 9c111bf..dc4d299 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,7 +1,16 @@ +import adapter from '@sveltejs/adapter-static' import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' export default { + adapter: adapter(), // Consult https://svelte.dev/docs#compile-time-svelte-preprocess // for more information about preprocessors preprocess: vitePreprocess(), + kit: { + alias: { + $routes: 'src/routes', + $components: 'src/components', + $electron: 'src/electron', + }, + }, } diff --git a/tsconfig.json b/tsconfig.json index aae31ba..cfb0315 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,26 +1,20 @@ { - "extends": "@tsconfig/svelte/tsconfig.json", + "extends": "./.svelte-kit/tsconfig.json", "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "resolveJsonModule": true, - /** - * Typecheck JS in `.svelte` and `.js` files by default. - * Disable checkJs if you'd like to use dynamic types in JS. - * Note that setting allowJs false does not prevent the use - * of JS in `.svelte` files. - */ + "rewriteRelativeImportExtensions": true, "allowJs": true, "checkJs": true, - "isolatedModules": true, - "baseUrl": ".", - "paths": { - // These must also be specified in the vite config - "$lib/*": ["src/lib/*"], - "$components/*": ["src/components/*"], - "$electron/*": ["src/electron/*"] - } + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler", }, - "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.svelte", "ferrum-addon/**/*.node"] + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript } diff --git a/vite.config.js b/vite.config.js index 05d7fac..9182e1f 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,41 +1,30 @@ -import path from 'path' import { defineConfig } from 'vite' -import { svelte, vitePreprocess } from '@sveltejs/vite-plugin-svelte' +import { sveltekit } from '@sveltejs/kit/vite' import electron from 'vite-plugin-electron' import tailwindcss from '@tailwindcss/vite' export default defineConfig({ - base: '/', clearScreen: false, - resolve: { - alias: { - // These must also be specified in tsconfig.json - $lib: path.resolve(import.meta.dirname, './src/lib'), - $components: path.resolve(import.meta.dirname, './src/components'), - $electron: path.resolve(import.meta.dirname, './src/electron'), - }, - }, server: { watch: { ignored: ['**/src-native/**'], }, }, build: { - outDir: './build/web', sourcemap: true, minify: false, // For easier crash messages target: 'chrome106', }, plugins: [ - svelte({ - preprocess: vitePreprocess(), - }), + sveltekit(), tailwindcss(), electron({ entry: ['./src/electron/main.ts', './src/electron/preload.ts'], onstart({ startup }) { - if (process.electronApp) { - process.kill(process.electronApp.pid, 'SIGTERM') + // @ts-expect-error Global object from vite-plugin-electorn + const electron_app = process.electronApp + if (electron_app) { + process.kill(electron_app.pid, 'SIGTERM') } else { startup() }