feat(frontend): the folders are layers — an import only goes down, a module is reached through its index.ts
`local/layers` (eslint.config.js) resolves every import to its file and refuses one that goes up (lib/ → components/ui/ → features/ → modules/ → shell/) or that reaches into another module's own files. A module's index.ts is its public face: the stores, mounted at the root and read app-wide, which features/ may read too; a page is still opened lazily by import(). Its contract test probes every edge, and three mutants of the rule (off, no face check, a door for everyone) each turn it red. Six modules got that face; the shared channel UI (about, tags, tag manager) moved to features/channel, the filter chips and the saved-views context to features/filters, and the prefs store's controller type moved next to the store instead of importing it from its own page. The header's per-module controls and the eagerly loaded rails keep eight inline suppressions, each naming why: they go when the header gets slots and every rail loads lazily. `chunkGuard` fails the production build when a lazily imported module lands in a boot chunk (the entry, the shell, what they import) — e.g. a page re-exported from an index.ts, which makes its import() a silent no-op. Proved on a build with that mutant; today's build has none.
This commit is contained in:
@@ -7,14 +7,11 @@ import ErrorBoundary from "./shell/ErrorBoundary";
|
||||
import { ConfirmProvider } from "./components/ui/ConfirmProvider";
|
||||
import BootGate, { BootScreen } from "./shell/BootGate";
|
||||
import { NavigationProvider } from "./features/navigation/NavigationProvider";
|
||||
import { FeedFiltersProvider } from "./modules/feed/FeedFiltersProvider";
|
||||
import { SavedViewsProvider } from "./modules/feed/SavedViewsProvider";
|
||||
import { PlaylistsProvider } from "./modules/playlists/PlaylistsProvider";
|
||||
import { FilesProvider } from "./modules/files/FilesProvider";
|
||||
import { PlexProvider } from "./modules/plex/PlexProvider";
|
||||
import { PlexViewBridge } from "./modules/plex/PlexViewBridge";
|
||||
import { ChannelsProvider } from "./modules/channels/ChannelsProvider";
|
||||
import { FeedViewProvider } from "./modules/feed/FeedViewProvider";
|
||||
import { FeedFiltersProvider, FeedViewProvider, SavedViewsProvider } from "./modules/feed";
|
||||
import { PlaylistsProvider } from "./modules/playlists";
|
||||
import { FilesProvider } from "./modules/files";
|
||||
import { PlexProvider, PlexViewBridge } from "./modules/plex";
|
||||
import { ChannelsProvider } from "./modules/channels";
|
||||
import { PrefsProvider } from "./features/prefs/PrefsProvider";
|
||||
import { WizardProvider } from "./features/wizard/WizardProvider";
|
||||
import "./i18n";
|
||||
|
||||
Reference in New Issue
Block a user