···88 import TrackInfo, { track_info_state } from './components/TrackInfo.svelte'
99 import PlaylistInfoModal from './components/PlaylistInfo.svelte'
1010 import { queue_visible } from './lib/queue'
1111- import { ipc_listen, ipc_renderer } from '@/lib/window'
1212- import { delete_track_list, get_track_list, import_tracks, type PlaylistInfo } from '@/lib/data'
1111+ import { ipc_listen, ipc_renderer } from '$lib/window'
1212+ import { delete_track_list, get_track_list, import_tracks, type PlaylistInfo } from '$lib/data'
1313 import { play_pause } from './lib/player'
1414 import DragGhost from './components/DragGhost.svelte'
1515 import ItunesImport from './components/ItunesImport.svelte'
+1-1
src/components/ArtistList.svelte
···11<script lang="ts">
22- import { filter, get_artists } from '@/lib/data'
22+ import { filter, get_artists } from '$lib/data'
33 import fuzzysort from 'fuzzysort'
44 import Header from './Header.svelte'
55
+3-3
src/components/CheckForUpdates.svelte
···11<script lang="ts">
22- import { ipc_renderer } from '@/lib/window'
22+ import { ipc_renderer } from '$lib/window'
33 import Modal from './Modal.svelte'
44 import Button from './Button.svelte'
55- import { is_dev, save_view_options, view_options } from '@/lib/data'
66- import { check_shortcut } from '@/lib/helpers'
55+ import { is_dev, save_view_options, view_options } from '$lib/data'
66+ import { check_shortcut } from '$lib/helpers'
7788 let latest_update: Awaited<ReturnType<typeof check>> | null = null
99
+1-1
src/components/Filter.svelte
···11<script lang="ts">
22 import { onDestroy } from 'svelte'
33- import { filter } from '@/lib/data'
33+ import { filter } from '$lib/data'
44 import { ipc_listen } from '../lib/window'
5566 let filter_input: HTMLInputElement
+2-2
src/components/Header.svelte
···11<script lang="ts">
22- import { is_mac } from '@/lib/data'
22+ import { is_mac } from '$lib/data'
33 import { modal_count } from './Modal.svelte'
44- import { queue_visible } from '@/lib/queue'
44+ import { queue_visible } from '$lib/queue'
5566 export let title: string
77 export let subtitle: string
+3-3
src/components/ItunesImport.svelte
···11<script lang="ts">
22- import { ItunesImport, tracklist_updated, track_lists_details_map, save } from '@/lib/data'
33- import { ipc_renderer } from '@/lib/window'
22+ import { ItunesImport, tracklist_updated, track_lists_details_map, save } from '$lib/data'
33+ import { ipc_renderer } from '$lib/window'
44 import type { ImportStatus } from 'ferrum-addon/addon'
55 import Button from './Button.svelte'
66 import Modal from './Modal.svelte'
77- import { strict_call } from '@/lib/error'
77+ import { strict_call } from '$lib/error'
8899 export let cancel: () => void
1010 let itunes_import = ItunesImport.new()
+4-4
src/components/Player.svelte
···1313 } from '../lib/player'
1414 import { get_duration } from '../lib/helpers'
1515 import { queue_visible, toggle_queue_visibility, queue, shuffle, repeat } from '../lib/queue'
1616- import { get_track, is_dev } from '@/lib/data'
1717- import { dragged } from '@/lib/drag-drop'
1616+ import { get_track, is_dev } from '$lib/data'
1717+ import { dragged } from '$lib/drag-drop'
1818 import * as dragGhost from './DragGhost.svelte'
1919 import Slider from './Slider.svelte'
2020- import { get_flattened_tracklists, handle_selected_tracks_action } from '@/lib/menus'
2121- import { ipc_renderer } from '@/lib/window'
2020+ import { get_flattened_tracklists, handle_selected_tracks_action } from '$lib/menus'
2121+ import { ipc_renderer } from '$lib/window'
2222 import { tracks_page_item_ids } from './TrackList.svelte'
23232424 async function playing_context_menu() {
+1-1
src/components/PlaylistInfo.svelte
···11<script lang="ts">
22 import { check_shortcut } from '../lib/helpers'
33- import { new_playlist, type PlaylistInfo, update_playlist } from '@/lib/data'
33+ import { new_playlist, type PlaylistInfo, update_playlist } from '$lib/data'
44 import Modal from './Modal.svelte'
55 import Button from './Button.svelte'
66
+7-7
src/components/Queue.svelte
···99 } from '../lib/queue'
1010 import { onDestroy, tick } from 'svelte'
1111 import QueueItemComponent from './QueueItem.svelte'
1212- import { dragged } from '@/lib/drag-drop'
1313- import { get_track } from '@/lib/data'
1212+ import { dragged } from '$lib/drag-drop'
1313+ import { get_track } from '$lib/data'
1414 import * as dragGhost from './DragGhost.svelte'
1515- import { ipc_listen, ipc_renderer } from '@/lib/window'
1616- import { check_shortcut } from '@/lib/helpers'
1515+ import { ipc_listen, ipc_renderer } from '$lib/window'
1616+ import { check_shortcut } from '$lib/helpers'
1717 import { fly } from 'svelte/transition'
1818 import VirtualListBlock, { scroll_container_keydown } from './VirtualListBlock.svelte'
1919- import type { SelectedTracksAction } from '@/electron/typed_ipc'
2020- import { get_flattened_tracklists, handle_selected_tracks_action } from '@/lib/menus'
2121- import { SvelteSelection } from '@/lib/selection'
1919+ import type { SelectedTracksAction } from '$electron/typed_ipc'
2020+ import { get_flattened_tracklists, handle_selected_tracks_action } from '$lib/menus'
2121+ import { SvelteSelection } from '$lib/selection'
22222323 let object_urls: string[] = []
2424
+1-1
src/components/QueueItem.svelte
···11<script lang="ts">
22- import { get_track, join_paths, paths, tracks_updated } from '@/lib/data'
22+ import { get_track, join_paths, paths, tracks_updated } from '$lib/data'
33 import type { Track } from '../../ferrum-addon'
4455 export let id: string
+3-3
src/components/QuickNav.svelte
···11<script lang="ts">
22 import { onDestroy } from 'svelte'
33 import { check_shortcut } from '../lib/helpers'
44- import { ipc_listen } from '@/lib/window'
44+ import { ipc_listen } from '$lib/window'
55 import fuzzysort from 'fuzzysort'
66- import { track_lists_details_map } from '@/lib/data'
66+ import { track_lists_details_map } from '$lib/data'
77 import type { TrackListDetails } from '../../ferrum-addon/addon'
88 import Modal from './Modal.svelte'
99 import { special_playlists_nav } from './Sidebar.svelte'
1010- import { navigate } from '@/lib/router'
1010+ import { navigate } from '$lib/router'
11111212 type Result = TrackListDetails & { path?: string }
1313
+1-1
src/components/Settings.svelte
···11<script lang="ts">
22 import Modal from './Modal.svelte'
33 import Button from './Button.svelte'
44- import { save_view_options, view_options } from '@/lib/data'
44+ import { save_view_options, view_options } from '$lib/data'
5566 export let on_close: () => void
77
+3-3
src/components/Sidebar.svelte
···88<script lang="ts">
99 import SidebarItems, { type SidebarItemHandle } from './SidebarItems.svelte'
1010 import Filter from './Filter.svelte'
1111- import { is_mac, track_lists_details_map, move_playlist } from '@/lib/data'
1111+ import { is_mac, track_lists_details_map, move_playlist } from '$lib/data'
1212 import { ipc_listen, ipc_renderer } from '../lib/window'
1313 import { writable } from 'svelte/store'
1414 import { onDestroy, setContext, tick } from 'svelte'
1515 import { dragged } from '../lib/drag-drop'
1616- import { tracklist_actions } from '@/lib/page'
1717- import { navigate } from '@/lib/router'
1616+ import { tracklist_actions } from '$lib/page'
1717+ import { navigate } from '$lib/router'
1818 import { current_playlist_id } from './TrackList.svelte'
19192020 let viewport: HTMLElement
+4-4
src/components/SidebarItems.svelte
···55 move_playlist,
66 view_options,
77 save_view_options,
88- } from '@/lib/data'
88+ } from '$lib/data'
99 import Self from './SidebarItems.svelte'
10101111 export type SidebarItemHandle = {
···3434 import { getContext } from 'svelte'
3535 import { dragged } from '../lib/drag-drop'
3636 import * as dragGhost from './DragGhost.svelte'
3737- import { ipc_renderer } from '@/lib/window'
3838- import { check_shortcut } from '@/lib/helpers'
3939- import { navigate, url_pathname } from '@/lib/router'
3737+ import { ipc_renderer } from '$lib/window'
3838+ import { check_shortcut } from '$lib/helpers'
3939+ import { navigate, url_pathname } from '$lib/router'
4040 import { current_playlist_id } from './TrackList.svelte'
41414242 export let show = true
+4-4
src/components/TrackInfo.svelte
···7070</script>
71717272<script lang="ts">
7373- import { check_shortcut } from '@/lib/helpers'
7373+ import { check_shortcut } from '$lib/helpers'
7474 import Button from './Button.svelte'
7575 import type { Track, TrackID } from '../../ferrum-addon'
7676- import { ipc_listen, ipc_renderer } from '@/lib/window'
7777- import { playing_id, reload } from '@/lib/player'
7676+ import { ipc_listen, ipc_renderer } from '$lib/window'
7777+ import { playing_id, reload } from '$lib/player'
7878 import { get } from 'svelte/store'
7979 import Modal, { modal_count } from './Modal.svelte'
8080 import {
···8686 set_image,
8787 set_image_data,
8888 update_track_info,
8989- } from '@/lib/data'
8989+ } from '$lib/data'
9090 import { tick } from 'svelte'
91919292 const genres = get_genres()
+5-5
src/components/TrackList.svelte
···3333 view_options,
3434 paths,
3535 join_paths,
3636- } from '@/lib/data'
3636+ } from '$lib/data'
3737 import { new_playback_instance, playing_id } from '../lib/player'
3838 import { get_duration, format_date, check_mouse_shortcut, check_shortcut } from '../lib/helpers'
3939 import { tracklist_actions } from '../lib/page'
···4444 import type { ItemId, Track, TracksPage } from 'ferrum-addon/addon'
4545 import Header from './Header.svelte'
4646 import { writable } from 'svelte/store'
4747- import { SvelteSelection } from '@/lib/selection'
4848- import { get_flattened_tracklists, handle_selected_tracks_action } from '@/lib/menus'
4949- import type { SelectedTracksAction } from '@/electron/typed_ipc'
5050- import { RefreshLevel, VirtualGrid, type Column } from '@/lib/virtual-grid.svelte'
4747+ import { SvelteSelection } from '$lib/selection'
4848+ import { get_flattened_tracklists, handle_selected_tracks_action } from '$lib/menus'
4949+ import type { SelectedTracksAction } from '$electron/typed_ipc'
5050+ import { RefreshLevel, VirtualGrid, type Column } from '$lib/virtual-grid.svelte'
51515252 let tracklist_element: HTMLDivElement
5353
+2-2
src/lib/data.ts
···11import { get, writable } from 'svelte/store'
22-import { ipc_renderer } from '@/lib/window'
22+import { ipc_renderer } from '$lib/window'
33import type {
44 MsSinceUnixEpoch,
55 TrackID,
···1010 ViewOptions,
1111} from '../../ferrum-addon'
1212import { queue } from './queue'
1313-import { current_playlist_id } from '@/components/TrackList.svelte'
1313+import { current_playlist_id } from '$components/TrackList.svelte'
1414import { navigate } from './router'
1515import { call_sync, get_error_message, strict_call } from './error'
1616
+5-5
src/lib/menus.ts
···11-import { add_tracks_to_playlist, get_track, paths, track_lists_details_map } from '@/lib/data'
22-import { flatten_child_lists } from '@/lib/helpers'
33-import { ipc_renderer } from '@/lib/window'
11+import { add_tracks_to_playlist, get_track, paths, track_lists_details_map } from '$lib/data'
22+import { flatten_child_lists } from '$lib/helpers'
33+import { ipc_renderer } from '$lib/window'
44import type { TrackID } from '../../ferrum-addon'
55import { get } from 'svelte/store'
66import { append_to_user_queue, prepend_to_user_queue } from './queue'
77-import type { SelectedTracksAction } from '@/electron/typed_ipc'
88-import { open_track_info } from '@/components/TrackInfo.svelte'
77+import type { SelectedTracksAction } from '$electron/typed_ipc'
88+import { open_track_info } from '$components/TrackInfo.svelte'
991010export function get_flattened_tracklists() {
1111 const track_lists = get(track_lists_details_map)
+2-2
src/lib/player.ts
···1111 join_paths,
1212 paths,
1313 read_cover_async,
1414-} from '@/lib/data'
1414+} from '$lib/data'
1515import type { Track, TrackID } from '../../ferrum-addon'
1616import { ipc_renderer } from './window'
1717import { queue, set_new_queue, next as queueNext, prev as queuePrev } from './queue'
1818-import { tracks_page_item_ids } from '@/components/TrackList.svelte'
1818+import { tracks_page_item_ids } from '$components/TrackList.svelte'
19192020const audio = new Audio()
2121let is_stopped = true
+1-1
src/lib/queue.ts
···22import { get, writable } from 'svelte/store'
33import { getter_writable } from './helpers'
44import { ipc_renderer } from './window'
55-import { track_exists } from '@/lib/data'
55+import { track_exists } from '$lib/data'
6677export const queue_visible = writable(false)
88export function toggle_queue_visibility() {
+1-1
src/lib/window.ts
···11-import type { IpcRenderer, IpcFunctions } from '@/electron/typed_ipc'
11+import type { IpcRenderer, IpcFunctions } from '$electron/typed_ipc'
22import type Addon from 'ferrum-addon/addon'
33const electron = window.require('electron')
44
+4-1
tsconfig.json
···1616 "isolatedModules": true,
1717 "baseUrl": ".",
1818 "paths": {
1919- "@/*": ["./src/*"]
1919+ // These must also be specified in the vite config
2020+ "$lib/*": ["src/lib/*"],
2121+ "$components/*": ["src/components/*"],
2222+ "$electron/*": ["src/electron/*"]
2023 }
2124 },
2225 "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.svelte", "ferrum-addon/**/*.node"]
+5-2
vite.config.mjs
···11-import { resolve } from 'path'
11+import path from 'path'
22import { defineConfig } from 'vite'
33import { svelte, vitePreprocess } from '@sveltejs/vite-plugin-svelte'
44import electron from 'vite-plugin-electron'
···99 clearScreen: false,
1010 resolve: {
1111 alias: {
1212- '@': resolve(__dirname, './src'),
1212+ // These must also be specified in tsconfig.json
1313+ $lib: path.resolve(__dirname, './src/lib'),
1414+ $components: path.resolve(__dirname, './src/components'),
1515+ $electron: path.resolve(__dirname, './src/electron'),
1316 },
1417 },
1518 build: {