diff --git a/src/app/hooks/usePrefetchReleaseNotes.ts b/src/app/hooks/usePrefetchReleaseNotes.ts index b8911caa..d1349b0e 100644 --- a/src/app/hooks/usePrefetchReleaseNotes.ts +++ b/src/app/hooks/usePrefetchReleaseNotes.ts @@ -1,7 +1,7 @@ import { useEffect } from 'react'; import { version as appVersion } from '@/../package.json'; -import { isWorkspaceReleaseNotesMode } from '@/utils/releaseNotes/releaseNotesChannel'; -import { resolveReleaseNotes } from '@/utils/releaseNotes/releaseNotesResolve'; +import { isWorkspaceReleaseNotesMode } from '@/features/whatsNew/utils/releaseNotesChannel'; +import { resolveReleaseNotes } from '@/features/whatsNew/utils/releaseNotesResolve'; /** * Warm the release-notes cache after an update (RC/stable only). diff --git a/src/features/playback/hooks/useTimelinePlayHistory.test.ts b/src/features/playback/hooks/useTimelinePlayHistory.test.ts index 906dd002..c3c65f62 100644 --- a/src/features/playback/hooks/useTimelinePlayHistory.test.ts +++ b/src/features/playback/hooks/useTimelinePlayHistory.test.ts @@ -13,7 +13,7 @@ vi.mock('@/lib/api/library', () => ({ TIMELINE_HISTORY_BOOTSTRAP_LIMIT: 50, })); -vi.mock('@/utils/queue/timelineBootstrapReady', () => ({ +vi.mock('@/features/playback/utils/timelineBootstrapReady', () => ({ timelineBootstrapIndexReady: vi.fn(), })); @@ -23,7 +23,7 @@ vi.mock('@/features/playback/store/queueTrackResolver', async importOriginal => }); import { libraryGetRecentPlaySessions } from '@/lib/api/library'; -import { timelineBootstrapIndexReady } from '@/utils/queue/timelineBootstrapReady'; +import { timelineBootstrapIndexReady } from '@/features/playback/utils/timelineBootstrapReady'; describe('ensureTimelineBootstrap', () => { beforeEach(() => { diff --git a/src/features/playback/hooks/useTimelinePlayHistory.ts b/src/features/playback/hooks/useTimelinePlayHistory.ts index 157a7bf6..2c1b1e0d 100644 --- a/src/features/playback/hooks/useTimelinePlayHistory.ts +++ b/src/features/playback/hooks/useTimelinePlayHistory.ts @@ -13,8 +13,8 @@ import { import { bootstrapTrackFromPlaySession, timelineHistoryToQueueRefs, -} from '@/utils/queue/timelineHistoryRefs'; -import { timelineBootstrapIndexReady } from '@/utils/queue/timelineBootstrapReady'; +} from '@/features/playback/utils/timelineHistoryRefs'; +import { timelineBootstrapIndexReady } from '@/features/playback/utils/timelineBootstrapReady'; const BOOTSTRAP_RETRY_MS = 2_000; diff --git a/src/features/playback/store/audioEventHandlers.ts b/src/features/playback/store/audioEventHandlers.ts index 97cabbc9..b6fcc415 100644 --- a/src/features/playback/store/audioEventHandlers.ts +++ b/src/features/playback/store/audioEventHandlers.ts @@ -88,7 +88,7 @@ import { getSeekTargetSetAt, } from '@/features/playback/store/seekTargetState'; import { refreshWaveformForTrack } from '@/features/playback/store/waveformRefresh'; -import { analyzeBoundary, computeWaveformSilence } from '@/utils/waveform/waveformSilence'; +import { analyzeBoundary, computeWaveformSilence } from '@/lib/waveform/waveformSilence'; import { autodjMaxOverlapCapSec } from '@/utils/playback/autodjOverlapCap'; import { autodjJsTriggerAtSec, diff --git a/src/features/playback/store/crossfadePreload.ts b/src/features/playback/store/crossfadePreload.ts index 1246840c..d4a38253 100644 --- a/src/features/playback/store/crossfadePreload.ts +++ b/src/features/playback/store/crossfadePreload.ts @@ -1,7 +1,7 @@ import { invoke } from '@tauri-apps/api/core'; import { useAuthStore } from '@/store/authStore'; import { autodjMaxOverlapCapSec } from '@/utils/playback/autodjOverlapCap'; -import { computeWaveformSilence, planCrossfadeTransition } from '@/utils/waveform/waveformSilence'; +import { computeWaveformSilence, planCrossfadeTransition } from '@/lib/waveform/waveformSilence'; import { findLocalPlaybackUrl } from '@/store/localPlaybackResolve'; import { playbackCacheKeyForRef } from '@/features/playback/utils/playback/playbackServer'; import { resolvePlaybackUrl } from '@/features/playback/utils/playback/resolvePlaybackUrl'; diff --git a/src/features/playback/store/crossfadeTrimCache.ts b/src/features/playback/store/crossfadeTrimCache.ts index 0815185e..75a0927e 100644 --- a/src/features/playback/store/crossfadeTrimCache.ts +++ b/src/features/playback/store/crossfadeTrimCache.ts @@ -10,9 +10,9 @@ * Kept out of the persisted Zustand store on purpose: this is ephemeral, * per-transition playback data, not user state. */ -import type { CrossfadeTransitionPlan } from '@/utils/waveform/waveformSilence'; +import type { CrossfadeTransitionPlan } from '@/lib/waveform/waveformSilence'; -export type { CrossfadeTransitionPlan } from '@/utils/waveform/waveformSilence'; +export type { CrossfadeTransitionPlan } from '@/lib/waveform/waveformSilence'; /** trackId → planned transition for when this track starts under crossfade. */ const planByTrackId = new Map(); diff --git a/src/features/playback/store/playTrackAction.ts b/src/features/playback/store/playTrackAction.ts index 42fe2a9f..d27da2e9 100644 --- a/src/features/playback/store/playTrackAction.ts +++ b/src/features/playback/store/playTrackAction.ts @@ -8,7 +8,7 @@ import { computeAutodjManualBlendPlan, shouldAutodjInterruptBlend, } from '@/features/playback/utils/playback/autodjManualBlend'; -import type { CrossfadeTransitionPlan } from '@/utils/waveform/waveformSilence'; +import type { CrossfadeTransitionPlan } from '@/lib/waveform/waveformSilence'; import { armInterruptHandoff, clearInterruptHandoff, @@ -16,7 +16,7 @@ import { shouldDeferInterruptHandoffUi, } from '@/features/playback/utils/playback/autodjInterruptPrep'; import { isCrossfadeNextReady } from '@/features/playback/store/crossfadePreload'; -import { STANDARD_BLEND_SEC } from '@/utils/waveform/waveformSilence'; +import { STANDARD_BLEND_SEC } from '@/lib/waveform/waveformSilence'; import { armAutodjMixing, clearAutodjTransitionUi } from '@/features/playback/store/autodjTransitionUi'; import { bindQueueServerForTracks, diff --git a/src/features/playback/store/waveformRefresh.test.ts b/src/features/playback/store/waveformRefresh.test.ts index ac8b9056..31826138 100644 --- a/src/features/playback/store/waveformRefresh.test.ts +++ b/src/features/playback/store/waveformRefresh.test.ts @@ -22,7 +22,7 @@ const hoisted = vi.hoisted(() => ({ })); vi.mock('@tauri-apps/api/core', () => ({ invoke: hoisted.invokeMock })); -vi.mock('@/utils/waveform/waveformParse', () => ({ coerceWaveformBins: hoisted.coerceWaveformBinsMock })); +vi.mock('@/lib/waveform/waveformParse', () => ({ coerceWaveformBins: hoisted.coerceWaveformBinsMock })); vi.mock('@/features/playback/store/playerStore', () => ({ usePlayerStore: { getState: () => hoisted.playerSnapshot, diff --git a/src/features/playback/store/waveformRefresh.ts b/src/features/playback/store/waveformRefresh.ts index a6adb9ed..6e6a47f4 100644 --- a/src/features/playback/store/waveformRefresh.ts +++ b/src/features/playback/store/waveformRefresh.ts @@ -1,5 +1,5 @@ import { invoke } from '@tauri-apps/api/core'; -import { coerceWaveformBins } from '@/utils/waveform/waveformParse'; +import { coerceWaveformBins } from '@/lib/waveform/waveformParse'; import { getPlaybackIndexKey } from '@/features/playback/utils/playback/playbackServer'; import { usePlayerStore } from '@/features/playback/store/playerStore'; import { getWaveformRefreshGen } from '@/features/playback/store/waveformRefreshGen'; diff --git a/src/utils/queue/buildTimelineDisplayRows.test.ts b/src/features/playback/utils/buildTimelineDisplayRows.test.ts similarity index 94% rename from src/utils/queue/buildTimelineDisplayRows.test.ts rename to src/features/playback/utils/buildTimelineDisplayRows.test.ts index e6ed8aa0..d5c3e588 100644 --- a/src/utils/queue/buildTimelineDisplayRows.test.ts +++ b/src/features/playback/utils/buildTimelineDisplayRows.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { buildTimelineDisplayRows, findTimelineScrollLocalIndex } from './buildTimelineDisplayRows'; +import { buildTimelineDisplayRows, findTimelineScrollLocalIndex } from '@/features/playback/utils/buildTimelineDisplayRows'; import type { QueueItemRef } from '@/lib/media/trackTypes'; const ref = (trackId: string, extra?: Partial): QueueItemRef => ({ diff --git a/src/utils/queue/buildTimelineDisplayRows.ts b/src/features/playback/utils/buildTimelineDisplayRows.ts similarity index 100% rename from src/utils/queue/buildTimelineDisplayRows.ts rename to src/features/playback/utils/buildTimelineDisplayRows.ts diff --git a/src/utils/queue/playTimelineHistoryTrack.test.ts b/src/features/playback/utils/playTimelineHistoryTrack.test.ts similarity index 97% rename from src/utils/queue/playTimelineHistoryTrack.test.ts rename to src/features/playback/utils/playTimelineHistoryTrack.test.ts index db69d453..bd136bb9 100644 --- a/src/utils/queue/playTimelineHistoryTrack.test.ts +++ b/src/features/playback/utils/playTimelineHistoryTrack.test.ts @@ -3,7 +3,7 @@ import { usePlayerStore } from '@/features/playback/store/playerStore'; import { resetPlayerStore } from '@/test/helpers/storeReset'; import { makeTrack, seedQueue } from '@/test/helpers/factories'; import { seedQueueResolver } from '@/features/playback/store/queueTrackResolver'; -import { playTimelineHistoryTrack } from './playTimelineHistoryTrack'; +import { playTimelineHistoryTrack } from '@/features/playback/utils/playTimelineHistoryTrack'; vi.mock('@/features/playback/store/queueTrackResolver', async importOriginal => { const actual = await importOriginal(); diff --git a/src/utils/queue/playTimelineHistoryTrack.ts b/src/features/playback/utils/playTimelineHistoryTrack.ts similarity index 100% rename from src/utils/queue/playTimelineHistoryTrack.ts rename to src/features/playback/utils/playTimelineHistoryTrack.ts diff --git a/src/features/playback/utils/playback/autodjAutoAdvance.ts b/src/features/playback/utils/playback/autodjAutoAdvance.ts index b02fb278..35f081ed 100644 --- a/src/features/playback/utils/playback/autodjAutoAdvance.ts +++ b/src/features/playback/utils/playback/autodjAutoAdvance.ts @@ -1,4 +1,4 @@ -import { DYNAMIC_OVERLAP_HARD_CAP_SEC, STANDARD_BLEND_SEC } from '@/utils/waveform/waveformSilence'; +import { DYNAMIC_OVERLAP_HARD_CAP_SEC, STANDARD_BLEND_SEC } from '@/lib/waveform/waveformSilence'; import type { QueueItemRef } from '@/lib/media/trackTypes'; export type QueueRepeatMode = 'off' | 'all' | 'one'; diff --git a/src/features/playback/utils/playback/autodjManualBlend.ts b/src/features/playback/utils/playback/autodjManualBlend.ts index cc945d3e..0b504eed 100644 --- a/src/features/playback/utils/playback/autodjManualBlend.ts +++ b/src/features/playback/utils/playback/autodjManualBlend.ts @@ -5,7 +5,7 @@ import { planCrossfadeTransition, STANDARD_BLEND_SEC, type CrossfadeTransitionPlan, -} from '@/utils/waveform/waveformSilence'; +} from '@/lib/waveform/waveformSilence'; import { getTransitionMode } from '@/features/playback/utils/playback/playbackTransition'; /** Same trust threshold as end-of-track scenario A in `waveformSilence.ts`. */ diff --git a/src/utils/queue/timelineBootstrapReady.test.ts b/src/features/playback/utils/timelineBootstrapReady.test.ts similarity index 86% rename from src/utils/queue/timelineBootstrapReady.test.ts rename to src/features/playback/utils/timelineBootstrapReady.test.ts index 5f527aec..a385e4ef 100644 --- a/src/utils/queue/timelineBootstrapReady.test.ts +++ b/src/features/playback/utils/timelineBootstrapReady.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, beforeEach, vi } from 'vitest'; -import { useAuthStore } from '../../store/authStore'; -import { useLibraryIndexStore } from '../../store/libraryIndexStore'; -import { timelineBootstrapIndexReady } from './timelineBootstrapReady'; +import { useAuthStore } from '@/store/authStore'; +import { useLibraryIndexStore } from '@/store/libraryIndexStore'; +import { timelineBootstrapIndexReady } from '@/features/playback/utils/timelineBootstrapReady'; vi.mock('@/lib/library/libraryReady', () => ({ libraryIsReady: vi.fn(), diff --git a/src/utils/queue/timelineBootstrapReady.ts b/src/features/playback/utils/timelineBootstrapReady.ts similarity index 85% rename from src/utils/queue/timelineBootstrapReady.ts rename to src/features/playback/utils/timelineBootstrapReady.ts index c1856846..94b26387 100644 --- a/src/utils/queue/timelineBootstrapReady.ts +++ b/src/features/playback/utils/timelineBootstrapReady.ts @@ -1,5 +1,5 @@ -import { useAuthStore } from '../../store/authStore'; -import { useLibraryIndexStore } from '../../store/libraryIndexStore'; +import { useAuthStore } from '@/store/authStore'; +import { useLibraryIndexStore } from '@/store/libraryIndexStore'; import { libraryIsReady } from '@/lib/library/libraryReady'; /** diff --git a/src/utils/queue/timelineHistoryRefs.test.ts b/src/features/playback/utils/timelineHistoryRefs.test.ts similarity index 94% rename from src/utils/queue/timelineHistoryRefs.test.ts rename to src/features/playback/utils/timelineHistoryRefs.test.ts index f22b8093..610af8dc 100644 --- a/src/utils/queue/timelineHistoryRefs.test.ts +++ b/src/features/playback/utils/timelineHistoryRefs.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { bootstrapTrackFromPlaySession, timelineHistoryToQueueRefs } from './timelineHistoryRefs'; +import { bootstrapTrackFromPlaySession, timelineHistoryToQueueRefs } from '@/features/playback/utils/timelineHistoryRefs'; describe('timelineHistoryRefs', () => { it('maps history rows to queue refs', () => { diff --git a/src/utils/queue/timelineHistoryRefs.ts b/src/features/playback/utils/timelineHistoryRefs.ts similarity index 100% rename from src/utils/queue/timelineHistoryRefs.ts rename to src/features/playback/utils/timelineHistoryRefs.ts diff --git a/src/features/queue/components/QueueList.tsx b/src/features/queue/components/QueueList.tsx index 098bfe94..88be06c2 100644 --- a/src/features/queue/components/QueueList.tsx +++ b/src/features/queue/components/QueueList.tsx @@ -15,9 +15,9 @@ import { subscribeQueueResolver, } from '@/features/playback/store/queueTrackResolver'; import { findQueueItemRefIndex } from '@/features/playback/utils/playback/queueIdentity'; -import type { TimelineDisplayRow } from '@/utils/queue/buildTimelineDisplayRows'; -import { findTimelineScrollLocalIndex } from '@/utils/queue/buildTimelineDisplayRows'; -import { playTimelineHistoryTrack } from '@/utils/queue/playTimelineHistoryTrack'; +import type { TimelineDisplayRow } from '@/features/playback/utils/buildTimelineDisplayRows'; +import { findTimelineScrollLocalIndex } from '@/features/playback/utils/buildTimelineDisplayRows'; +import { playTimelineHistoryTrack } from '@/features/playback/utils/playTimelineHistoryTrack'; type StartDrag = ( payload: { data: string; label: string }, diff --git a/src/features/queue/components/QueuePanel.tsx b/src/features/queue/components/QueuePanel.tsx index 68951ea6..2ce5cb4d 100644 --- a/src/features/queue/components/QueuePanel.tsx +++ b/src/features/queue/components/QueuePanel.tsx @@ -33,7 +33,7 @@ import { QueueList } from '@/features/queue/components/QueueList'; import { QueueTabBar } from '@/features/queue/components/QueueTabBar'; import { useQueueAutoScroll } from '@/features/queue/hooks/useQueueAutoScroll'; import { useTimelineBootstrapOnMode, useTimelineHistoryResolver, useTimelinePlayHistory } from '@/features/playback/hooks/useTimelinePlayHistory'; -import { buildTimelineDisplayRows } from '@/utils/queue/buildTimelineDisplayRows'; +import { buildTimelineDisplayRows } from '@/features/playback/utils/buildTimelineDisplayRows'; import { activeServerQueueTrackIds } from '@/features/playback/utils/playback/trackServerScope'; export default function QueuePanel() { diff --git a/src/features/whatsNew/hooks/useReleaseNotes.ts b/src/features/whatsNew/hooks/useReleaseNotes.ts index 886a8099..d1909233 100644 --- a/src/features/whatsNew/hooks/useReleaseNotes.ts +++ b/src/features/whatsNew/hooks/useReleaseNotes.ts @@ -4,8 +4,8 @@ import { resolveChangelogEntry, resolveReleaseNotes, type ReleaseNotesSource, -} from '@/utils/releaseNotes/releaseNotesResolve'; -import type { ReleaseNotesEntry } from '@/utils/releaseNotes/releaseNotesMatch'; +} from '@/features/whatsNew/utils/releaseNotesResolve'; +import type { ReleaseNotesEntry } from '@/features/whatsNew/utils/releaseNotesMatch'; export interface UseReleaseNotesResult { loading: boolean; diff --git a/src/utils/changelog/changelogReleaseMatch.ts b/src/features/whatsNew/utils/changelogReleaseMatch.ts similarity index 84% rename from src/utils/changelog/changelogReleaseMatch.ts rename to src/features/whatsNew/utils/changelogReleaseMatch.ts index bc8a686e..f0032437 100644 --- a/src/utils/changelog/changelogReleaseMatch.ts +++ b/src/features/whatsNew/utils/changelogReleaseMatch.ts @@ -8,4 +8,4 @@ export { splitReleaseNotesBlocks, type ChangelogReleaseEntry, type ReleaseNotesEntry, -} from '../releaseNotes/releaseNotesMatch'; +} from '@/features/whatsNew/utils/releaseNotesMatch'; diff --git a/src/utils/releaseNotes/releaseNotesCache.ts b/src/features/whatsNew/utils/releaseNotesCache.ts similarity index 100% rename from src/utils/releaseNotes/releaseNotesCache.ts rename to src/features/whatsNew/utils/releaseNotesCache.ts diff --git a/src/utils/releaseNotes/releaseNotesChannel.test.ts b/src/features/whatsNew/utils/releaseNotesChannel.test.ts similarity index 92% rename from src/utils/releaseNotes/releaseNotesChannel.test.ts rename to src/features/whatsNew/utils/releaseNotesChannel.test.ts index 50bc10e8..7406ead5 100644 --- a/src/utils/releaseNotes/releaseNotesChannel.test.ts +++ b/src/features/whatsNew/utils/releaseNotesChannel.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { isDevChannelVersion, isWorkspaceReleaseNotesMode } from './releaseNotesChannel'; +import { isDevChannelVersion, isWorkspaceReleaseNotesMode } from '@/features/whatsNew/utils/releaseNotesChannel'; describe('releaseNotesChannel', () => { it('detects -dev channel versions', () => { diff --git a/src/utils/releaseNotes/releaseNotesChannel.ts b/src/features/whatsNew/utils/releaseNotesChannel.ts similarity index 100% rename from src/utils/releaseNotes/releaseNotesChannel.ts rename to src/features/whatsNew/utils/releaseNotesChannel.ts diff --git a/src/utils/releaseNotes/releaseNotesFetch.test.ts b/src/features/whatsNew/utils/releaseNotesFetch.test.ts similarity index 96% rename from src/utils/releaseNotes/releaseNotesFetch.test.ts rename to src/features/whatsNew/utils/releaseNotesFetch.test.ts index 1375b763..3d883c9c 100644 --- a/src/utils/releaseNotes/releaseNotesFetch.test.ts +++ b/src/features/whatsNew/utils/releaseNotesFetch.test.ts @@ -8,7 +8,7 @@ vi.mock('@tauri-apps/api/core', () => ({ isTauri: () => isTauri(), })); -const { fetchWhatsNewAsset, whatsNewDownloadUrl } = await import('./releaseNotesFetch'); +const { fetchWhatsNewAsset, whatsNewDownloadUrl } = await import('@/features/whatsNew/utils/releaseNotesFetch'); describe('releaseNotesFetch', () => { beforeEach(() => { diff --git a/src/utils/releaseNotes/releaseNotesFetch.ts b/src/features/whatsNew/utils/releaseNotesFetch.ts similarity index 100% rename from src/utils/releaseNotes/releaseNotesFetch.ts rename to src/features/whatsNew/utils/releaseNotesFetch.ts diff --git a/src/utils/releaseNotes/releaseNotesMatch.test.ts b/src/features/whatsNew/utils/releaseNotesMatch.test.ts similarity index 93% rename from src/utils/releaseNotes/releaseNotesMatch.test.ts rename to src/features/whatsNew/utils/releaseNotesMatch.test.ts index f5b38bcd..5c512b17 100644 --- a/src/utils/releaseNotes/releaseNotesMatch.test.ts +++ b/src/features/whatsNew/utils/releaseNotesMatch.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { findReleaseNotesEntry } from './releaseNotesMatch'; +import { findReleaseNotesEntry } from '@/features/whatsNew/utils/releaseNotesMatch'; const FIXTURE = ` # Notes diff --git a/src/utils/releaseNotes/releaseNotesMatch.ts b/src/features/whatsNew/utils/releaseNotesMatch.ts similarity index 100% rename from src/utils/releaseNotes/releaseNotesMatch.ts rename to src/features/whatsNew/utils/releaseNotesMatch.ts diff --git a/src/utils/releaseNotes/releaseNotesResolve.test.ts b/src/features/whatsNew/utils/releaseNotesResolve.test.ts similarity index 88% rename from src/utils/releaseNotes/releaseNotesResolve.test.ts rename to src/features/whatsNew/utils/releaseNotesResolve.test.ts index 2bc0e4b7..d48e9796 100644 --- a/src/utils/releaseNotes/releaseNotesResolve.test.ts +++ b/src/features/whatsNew/utils/releaseNotesResolve.test.ts @@ -4,21 +4,21 @@ const fetchWhatsNewAsset = vi.fn(); const readReleaseNotesCache = vi.fn(); const writeReleaseNotesCache = vi.fn(); -vi.mock('./releaseNotesChannel', () => ({ +vi.mock('@/features/whatsNew/utils/releaseNotesChannel', () => ({ isDevChannelVersion: (version: string) => /-dev(?:\b|$)/i.test(version.trim()), isWorkspaceReleaseNotesMode: (version: string) => /-dev(?:\b|$)/i.test(version.trim()), })); -vi.mock('./releaseNotesFetch', () => ({ +vi.mock('@/features/whatsNew/utils/releaseNotesFetch', () => ({ fetchWhatsNewAsset: (...args: unknown[]) => fetchWhatsNewAsset(...args), })); -vi.mock('./releaseNotesCache', () => ({ +vi.mock('@/features/whatsNew/utils/releaseNotesCache', () => ({ readReleaseNotesCache: (...args: unknown[]) => readReleaseNotesCache(...args), writeReleaseNotesCache: (...args: unknown[]) => writeReleaseNotesCache(...args), })); -vi.mock('../../generated/releaseNotesBundle', () => ({ +vi.mock('@/generated/releaseNotesBundle', () => ({ WHATS_NEW_RAW: `## [1.48.0] - 2026-06-10 ## Highlights @@ -29,7 +29,7 @@ vi.mock('../../generated/releaseNotesBundle', () => ({ - Embedded changelog fallback`, })); -const { resolveReleaseNotes } = await import('./releaseNotesResolve'); +const { resolveReleaseNotes } = await import('@/features/whatsNew/utils/releaseNotesResolve'); describe('resolveReleaseNotes (shipped channel)', () => { beforeEach(() => { diff --git a/src/utils/releaseNotes/releaseNotesResolve.ts b/src/features/whatsNew/utils/releaseNotesResolve.ts similarity index 80% rename from src/utils/releaseNotes/releaseNotesResolve.ts rename to src/features/whatsNew/utils/releaseNotesResolve.ts index cd9be2c8..2556efba 100644 --- a/src/utils/releaseNotes/releaseNotesResolve.ts +++ b/src/features/whatsNew/utils/releaseNotesResolve.ts @@ -1,7 +1,7 @@ -import { isWorkspaceReleaseNotesMode } from './releaseNotesChannel'; -import { readReleaseNotesCache, writeReleaseNotesCache } from './releaseNotesCache'; -import { fetchWhatsNewAsset } from './releaseNotesFetch'; -import { findReleaseNotesEntry, type ReleaseNotesEntry } from './releaseNotesMatch'; +import { isWorkspaceReleaseNotesMode } from '@/features/whatsNew/utils/releaseNotesChannel'; +import { readReleaseNotesCache, writeReleaseNotesCache } from '@/features/whatsNew/utils/releaseNotesCache'; +import { fetchWhatsNewAsset } from '@/features/whatsNew/utils/releaseNotesFetch'; +import { findReleaseNotesEntry, type ReleaseNotesEntry } from '@/features/whatsNew/utils/releaseNotesMatch'; export type ReleaseNotesSource = | 'workspace' @@ -19,27 +19,27 @@ export interface ResolvedReleaseNotes { async function loadWorkspaceWhatsNewRaw(): Promise { if (import.meta.env.DEV) { - return (await import('../../../WHATS_NEW.md?raw')).default; + return (await import('@/../WHATS_NEW.md?raw')).default; } - const { WHATS_NEW_RAW } = await import('../../generated/releaseNotesBundle'); + const { WHATS_NEW_RAW } = await import('@/generated/releaseNotesBundle'); return WHATS_NEW_RAW; } async function loadWorkspaceChangelogRaw(): Promise { if (import.meta.env.DEV) { - return (await import('../../../CHANGELOG.md?raw')).default; + return (await import('@/../CHANGELOG.md?raw')).default; } - const { CHANGELOG_RAW } = await import('../../generated/releaseNotesBundle'); + const { CHANGELOG_RAW } = await import('@/generated/releaseNotesBundle'); return CHANGELOG_RAW; } async function loadEmbeddedWhatsNewRaw(): Promise { - const { WHATS_NEW_RAW } = await import('../../generated/releaseNotesBundle'); + const { WHATS_NEW_RAW } = await import('@/generated/releaseNotesBundle'); return WHATS_NEW_RAW; } async function loadEmbeddedChangelogRaw(): Promise { - const { CHANGELOG_RAW } = await import('../../generated/releaseNotesBundle'); + const { CHANGELOG_RAW } = await import('@/generated/releaseNotesBundle'); return CHANGELOG_RAW; } diff --git a/src/utils/waveform/waveformParse.test.ts b/src/lib/waveform/waveformParse.test.ts similarity index 96% rename from src/utils/waveform/waveformParse.test.ts rename to src/lib/waveform/waveformParse.test.ts index 8bb38167..ff2b2546 100644 --- a/src/utils/waveform/waveformParse.test.ts +++ b/src/lib/waveform/waveformParse.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { coerceWaveformBins, waveformBlobLenOk } from '@/utils/waveform/waveformParse'; +import { coerceWaveformBins, waveformBlobLenOk } from '@/lib/waveform/waveformParse'; describe('waveformBlobLenOk', () => { it('accepts the legacy single-curve length (500)', () => { diff --git a/src/utils/waveform/waveformParse.ts b/src/lib/waveform/waveformParse.ts similarity index 100% rename from src/utils/waveform/waveformParse.ts rename to src/lib/waveform/waveformParse.ts diff --git a/src/utils/waveform/waveformSilence.test.ts b/src/lib/waveform/waveformSilence.test.ts similarity index 99% rename from src/utils/waveform/waveformSilence.test.ts rename to src/lib/waveform/waveformSilence.test.ts index 419a9ffe..632f4db7 100644 --- a/src/utils/waveform/waveformSilence.test.ts +++ b/src/lib/waveform/waveformSilence.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { analyzeBoundary, computeWaveformSilence, planCrossfadeTransition } from './waveformSilence'; +import { analyzeBoundary, computeWaveformSilence, planCrossfadeTransition } from '@/lib/waveform/waveformSilence'; /** Build a 500-bin peak curve: `lead` silent bins, a loud middle, `trail` silent bins. */ function curve(lead: number, mid: number, trail: number, loud = 200, quiet = 4): number[] { diff --git a/src/utils/waveform/waveformSilence.ts b/src/lib/waveform/waveformSilence.ts similarity index 100% rename from src/utils/waveform/waveformSilence.ts rename to src/lib/waveform/waveformSilence.ts diff --git a/src/utils/playback/autodjOverlapCap.ts b/src/utils/playback/autodjOverlapCap.ts index 8b2ef965..1639dad0 100644 --- a/src/utils/playback/autodjOverlapCap.ts +++ b/src/utils/playback/autodjOverlapCap.ts @@ -1,5 +1,5 @@ import type { AuthState } from '../../store/authStoreTypes'; -import { DYNAMIC_OVERLAP_HARD_CAP_SEC } from '../waveform/waveformSilence'; +import { DYNAMIC_OVERLAP_HARD_CAP_SEC } from '@/lib/waveform/waveformSilence'; export type AutodjOverlapCapMode = 'auto' | 'limit';