refactor(server): move serverCapabilities into lib

The serverCapabilities cluster (catalog, context, resolve, storeView, types) is
lib-level infra: it imports only @/lib/server and is consumed by both lib and
feature code, so a feature home would invert the two lib consumers. Move it to
src/lib/serverCapabilities and repoint consumers.

Pure move + import updates, no behavior change. Baseline gains one lib->store
entry (storeView reads authStore, only now caught under lib/).
This commit is contained in:
Psychotoxical
2026-07-01 14:45:15 +02:00
parent f2cf8a08df
commit b722b1abaf
15 changed files with 37 additions and 20 deletions
@@ -4,7 +4,7 @@ vi.mock('@/lib/api/subsonicScrobble', () => ({
reportPlayback: vi.fn(() => Promise.resolve()),
reportNowPlaying: vi.fn(() => Promise.resolve()),
}));
vi.mock('@/serverCapabilities/storeView', () => ({
vi.mock('@/lib/serverCapabilities/storeView', () => ({
isFeatureActiveForServer: vi.fn(),
}));
vi.mock('@/store/authStore', () => ({
@@ -25,7 +25,7 @@ vi.mock('@/store/orbitRuntime', async (importOriginal) => ({
}));
import { reportNowPlaying, reportPlayback } from '@/lib/api/subsonicScrobble';
import { isFeatureActiveForServer } from '@/serverCapabilities/storeView';
import { isFeatureActiveForServer } from '@/lib/serverCapabilities/storeView';
import { useAuthStore } from '@/store/authStore';
import {
_resetPlaybackReportSessionForTest,
@@ -1,7 +1,7 @@
import { reportNowPlaying, reportPlayback } from '@/lib/api/subsonicScrobble';
import type { PlaybackReportState } from '@/lib/api/subsonicTypes';
import { FEATURE_PLAYBACK_REPORT } from '@/serverCapabilities/catalog';
import { isFeatureActiveForServer } from '@/serverCapabilities/storeView';
import { FEATURE_PLAYBACK_REPORT } from '@/lib/serverCapabilities/catalog';
import { isFeatureActiveForServer } from '@/lib/serverCapabilities/storeView';
import { isPlaybackRateApplied } from '@/features/playback/utils/audio/playbackRateHelpers';
import { isOrbitPlaybackSyncActive } from '@/store/orbitRuntime';
import { useAuthStore } from '@/store/authStore';
@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next';
import { getCapabilityDefinition } from '@/serverCapabilities/catalog';
import { isFeatureActiveForServer, resolveFeatureForServer } from '@/serverCapabilities/storeView';
import { getCapabilityDefinition } from '@/lib/serverCapabilities/catalog';
import { isFeatureActiveForServer, resolveFeatureForServer } from '@/lib/serverCapabilities/storeView';
/** Inline badge for auto-managed server capabilities (Settings → Servers header row). */
export function ServerCapabilityHeaderBadge({
@@ -5,7 +5,7 @@ import { open as openUrl } from '@tauri-apps/plugin-shell';
import { AlertTriangle, CheckCircle2, Info, Lock, LogOut, Pencil, Plus, Power, Server, Sparkles, Wifi, WifiOff } from 'lucide-react';
import { useAuthStore } from '@/store/authStore';
import { formatServerSoftware, isNavidromeAudiomuseSoftwareEligible, type InstantMixProbeResult, type SubsonicServerIdentity } from '@/lib/server/subsonicServerIdentity';
import { buildCapabilityContext } from '@/serverCapabilities/context';
import { buildCapabilityContext } from '@/lib/serverCapabilities/context';
import { useLibraryIndexStore } from '@/store/libraryIndexStore';
import { libraryDeleteServerData, librarySyncClearSession } from '@/lib/api/library';
import { bootstrapIndexedServer } from '@/lib/library/librarySession';
@@ -29,9 +29,9 @@ import {
} from '@/lib/server/serverUrlRemigration';
import { useConfirmModalStore } from '@/store/confirmModalStore';
import { showToast } from '@/lib/dom/toast';
import { FEATURE_AUDIOMUSE_SIMILAR_TRACKS } from '@/serverCapabilities/catalog';
import { isFeatureActiveForServer, resolveFeatureForServer } from '@/serverCapabilities/storeView';
import type { ResolvedCapability } from '@/serverCapabilities/types';
import { FEATURE_AUDIOMUSE_SIMILAR_TRACKS } from '@/lib/serverCapabilities/catalog';
import { isFeatureActiveForServer, resolveFeatureForServer } from '@/lib/serverCapabilities/storeView';
import type { ResolvedCapability } from '@/lib/serverCapabilities/types';
import { serverIdentityLabel, serverListDisplayLabel, serverSettingsEntryTitle } from '@/lib/server/serverDisplayName';
import { serverIndexKeyForProfile } from '@/lib/server/serverIndexKey';
import { switchActiveServer } from '@/utils/server/switchActiveServer';
@@ -1,13 +1,13 @@
import { useAuthStore } from '@/store/authStore';
import type { NavidromeAdminRole } from '@/lib/hooks/useNavidromeAdminRole';
import { isNavidromeServer, formatServerSoftware } from '@/lib/server/subsonicServerIdentity';
import { FEATURE_AUDIOMUSE_SIMILAR_TRACKS, OP_SIMILAR_TRACKS } from '@/serverCapabilities/catalog';
import { FEATURE_AUDIOMUSE_SIMILAR_TRACKS, OP_SIMILAR_TRACKS } from '@/lib/serverCapabilities/catalog';
import {
isFeatureActiveForServer,
resolveCallRoutesForServer,
resolveFeatureForServer,
} from '@/serverCapabilities/storeView';
import type { CapabilityStatus, FeatureTrust, ResolvedCapability } from '@/serverCapabilities/types';
} from '@/lib/serverCapabilities/storeView';
import type { CapabilityStatus, FeatureTrust, ResolvedCapability } from '@/lib/serverCapabilities/types';
import { PerfProbeMetricSection } from '@/features/sidebar/components/perfProbe/PerfProbeMetricCard';
import PerfProbeDetailList, { type PerfProbeDetailRow } from '@/features/sidebar/components/perfProbe/PerfProbeDetailList';
import PerfProbeStatusBadge, { type PerfProbeBadgeTone } from '@/features/sidebar/components/perfProbe/PerfProbeStatusBadge';