- A library past the list's cap is searched and sorted on the server; the count says "the newest". - Each folder and each search opens on its first page (DataTable pageScope, useCardPager scope). - A file dropped where the page takes none never reaches the browser (which would unload the app). - The viewer's arrows wait while a layer opened from it is on top, and scroll a wide text line; a text shows its first 5000 lines and says where the rest is. - Confirms name the file (no more "your downloads"); the asking menu rows end in "…". - The tray names a running step beside its bar, shows a pause mark for paused work, polls slowly while only paused work waits, and forgets a finished file that was deleted. - An unchanged rename sends nothing; a paste opens the download dialog only with nothing on top; the link box never replaces what was typed. - Honest states: folders that failed to load, a file no longer there, the storage figure; the rail says "nothing downloaded" only when there is nothing. - Focus after deleting the open folder and when the format form opens; the format name's label. - ui/Meter (one danger line for both quota bars) and ui/RenameField in the platform layer. - Copy fixes, stale comments and the speculative hub key; a contract test for the list's parameters; e2e: the Files page and the paste intake.
90 lines
3.1 KiB
TypeScript
90 lines
3.1 KiB
TypeScript
// The API façade. This file owns NO endpoint logic and NO types of its own — every domain lives in
|
|
// its own api/<domain>.ts module (types + method slice together). This barrel only:
|
|
// 1. re-exports the shared HTTP machinery from api/core,
|
|
// 2. re-exports each domain's TYPES (`export type *`) so consumers import them from "./api"
|
|
// unchanged,
|
|
// 3. spreads each domain's method slice into the single `api` object consumers call.
|
|
// A new endpoint therefore has nowhere to land except a domain module — the interleave that
|
|
// motivated the split cannot re-grow here. (lib/api/facade.test.ts guards that invariant.)
|
|
import { getActiveAccount, HttpError, setActiveAccount, setUnauthorizedHandler } from "./api/core";
|
|
|
|
// Re-export the shared HTTP machinery so consumers keep importing these from "./api" unchanged.
|
|
export { HttpError, getActiveAccount, setActiveAccount, setUnauthorizedHandler };
|
|
|
|
import { accountApi } from "./api/account";
|
|
export type * from "./api/account";
|
|
import { authApi } from "./api/auth";
|
|
export type * from "./api/auth";
|
|
export { loginBlocked, deadResetLink } from "./api/auth";
|
|
import { setupApi } from "./api/setup";
|
|
export type * from "./api/setup";
|
|
import { feedApi } from "./api/feed";
|
|
export type * from "./api/feed";
|
|
import { discoverApi } from "./api/discover";
|
|
export type * from "./api/discover";
|
|
export { DISCOVER_BUDGETS, HERO_TIERS, discoverCardKey } from "./api/discover";
|
|
export type * from "./api/tagModes";
|
|
export {
|
|
DEFAULT_TAG_MODES,
|
|
TAG_CATEGORIES,
|
|
NO_TAG_SENTINEL,
|
|
coerceTagModes,
|
|
coerceUntagged,
|
|
} from "./api/tagModes";
|
|
import { channelsApi } from "./api/channels";
|
|
export type * from "./api/channels";
|
|
import { syncApi } from "./api/sync";
|
|
export type * from "./api/sync";
|
|
import { playlistsApi } from "./api/playlists";
|
|
export type * from "./api/playlists";
|
|
import { tagsApi } from "./api/tags";
|
|
export type * from "./api/tags";
|
|
import { notificationsApi } from "./api/notifications";
|
|
export type * from "./api/notifications";
|
|
import { savedViewsApi } from "./api/savedViews";
|
|
export type * from "./api/savedViews";
|
|
import { quotaApi } from "./api/quota";
|
|
export type * from "./api/quota";
|
|
import { adminApi } from "./api/admin";
|
|
export type * from "./api/admin";
|
|
import { plexApi } from "./api/plex";
|
|
export type * from "./api/plex";
|
|
export {
|
|
EMPTY_PLEX_FILTERS,
|
|
plexFilterCount,
|
|
coercePlexFilters,
|
|
plexFiltersSignature,
|
|
plexFiltersToParams,
|
|
parsePlexFilters,
|
|
isIntrinsicReadOnly,
|
|
} from "./api/plex";
|
|
import { downloadsApi } from "./api/downloads";
|
|
export type * from "./api/downloads";
|
|
import { filesApi } from "./api/files";
|
|
export type * from "./api/files";
|
|
export { FILES_LIST_CAP, FILE_SORTS } from "./api/files";
|
|
import { debugSessionsApi, diagnosticsApi } from "./api/diagnostics";
|
|
export type * from "./api/diagnostics";
|
|
export { DIAGNOSTICS_EVENTS_PATH } from "./api/diagnostics";
|
|
|
|
export const api = {
|
|
...accountApi,
|
|
...authApi,
|
|
...setupApi,
|
|
...feedApi,
|
|
...discoverApi,
|
|
...channelsApi,
|
|
...syncApi,
|
|
...playlistsApi,
|
|
...tagsApi,
|
|
...notificationsApi,
|
|
...savedViewsApi,
|
|
...quotaApi,
|
|
...adminApi,
|
|
...plexApi,
|
|
...downloadsApi,
|
|
...filesApi,
|
|
...diagnosticsApi,
|
|
...debugSessionsApi,
|
|
};
|