fix(housekeeping): preserve runtime import boundaries

This commit is contained in:
Simo committed 2026-08-30 19:40:57 +02:00
1 parent b9c47aa89a
commit 1ae59bcc1a
7 files changed
+18 -22

No files matched your search

@@ -5,6 +5,7 @@ import type {
HousekeepingSurface, HousekeepingSurface,
} from "../../../foundation/contracts"; } from "../../../foundation/contracts";
import type { HousekeepingPreferences } from "../../../foundation/preferences/schema"; import type { HousekeepingPreferences } from "../../../foundation/preferences/schema";
import type { HousekeepingWidgetOption } from "../../../foundation/preferences/widget-options";
import type { HousekeepingWidgetLoadResult } from "../../../foundation/registry"; import type { HousekeepingWidgetLoadResult } from "../../../foundation/registry";
import { Favorites } from "../../../foundation/shell/favorites"; import { Favorites } from "../../../foundation/shell/favorites";
import { WidgetGrid } from "../../../foundation/shell/widget-grid"; import { WidgetGrid } from "../../../foundation/shell/widget-grid";
@@ -12,7 +13,6 @@ import {
type HousekeepingPreferenceSaver, type HousekeepingPreferenceSaver,
WidgetSettings, WidgetSettings,
} from "../../../foundation/shell/widget-settings"; } from "../../../foundation/shell/widget-settings";
import type { OperationsWidgetOption } from "../personalization-model";
export interface OperationsPersonalizationLabels { export interface OperationsPersonalizationLabels {
readonly favorites: { readonly favorites: {
@@ -55,7 +55,7 @@ export function OperationsPersonalization({
}: { }: {
readonly preferences: HousekeepingPreferences; readonly preferences: HousekeepingPreferences;
readonly routes: readonly HousekeepingRouteDefinition[]; readonly routes: readonly HousekeepingRouteDefinition[];
readonly widgets: readonly OperationsWidgetOption[]; readonly widgets: readonly HousekeepingWidgetOption[];
readonly widgetResult: HousekeepingWidgetLoadResult; readonly widgetResult: HousekeepingWidgetLoadResult;
readonly surface: HousekeepingSurface; readonly surface: HousekeepingSurface;
readonly labels: OperationsPersonalizationLabels; readonly labels: OperationsPersonalizationLabels;
@@ -7,7 +7,7 @@ import {
ok, ok,
} from "../../../foundation/contracts"; } from "../../../foundation/contracts";
import { defaultHousekeepingPreferences } from "../../../foundation/preferences/schema"; import { defaultHousekeepingPreferences } from "../../../foundation/preferences/schema";
import type { OperationsWidgetOption } from "../personalization-model"; import type { HousekeepingWidgetOption } from "../../../foundation/preferences/widget-options";
import type { OperationsWorkspaceLoadResult } from "../queries"; import type { OperationsWorkspaceLoadResult } from "../queries";
import { OperationsWorkspacePage } from "./workspace"; import { OperationsWorkspacePage } from "./workspace";
@@ -20,7 +20,7 @@ const routes: readonly HousekeepingRouteDefinition[] = [
capability, capability,
}, },
]; ];
const widgets: readonly OperationsWidgetOption[] = [ const widgets: readonly HousekeepingWidgetOption[] = [
{ {
id: "people.queue", id: "people.queue",
kind: "mandatory", kind: "mandatory",
@@ -3,10 +3,10 @@ import type {
HousekeepingSurface, HousekeepingSurface,
} from "../../../foundation/contracts"; } from "../../../foundation/contracts";
import { HousekeepingPageShell } from "../../../foundation/page/housekeeping-page-shell"; import { HousekeepingPageShell } from "../../../foundation/page/housekeeping-page-shell";
import type { HousekeepingWidgetOption } from "../../../foundation/preferences/widget-options";
import { OperationalInbox } from "../../../foundation/shell/operational-inbox"; import { OperationalInbox } from "../../../foundation/shell/operational-inbox";
import { RecentWork } from "../../../foundation/shell/recent-work"; import { RecentWork } from "../../../foundation/shell/recent-work";
import type { HousekeepingPreferenceSaver } from "../../../foundation/shell/widget-settings"; import type { HousekeepingPreferenceSaver } from "../../../foundation/shell/widget-settings";
import type { OperationsWidgetOption } from "../personalization-model";
import type { OperationsWorkspaceLoadResult } from "../queries"; import type { OperationsWorkspaceLoadResult } from "../queries";
import { import {
OperationsPersonalization, OperationsPersonalization,
@@ -50,7 +50,7 @@ export function OperationsWorkspacePage({
}: { }: {
readonly result: OperationsWorkspaceLoadResult; readonly result: OperationsWorkspaceLoadResult;
readonly routes: readonly HousekeepingRouteDefinition[]; readonly routes: readonly HousekeepingRouteDefinition[];
readonly widgetDefinitions: readonly OperationsWidgetOption[]; readonly widgetDefinitions: readonly HousekeepingWidgetOption[];
readonly surface: HousekeepingSurface; readonly surface: HousekeepingSurface;
readonly labels: OperationsWorkspaceLabels; readonly labels: OperationsWorkspaceLabels;
readonly routeTitles: Readonly<Record<string, string>>; readonly routeTitles: Readonly<Record<string, string>>;
@@ -1,5 +1,6 @@
import { createElement } from "react"; import { createElement } from "react";
import { satisfiesCapability } from "../../foundation/capability-context"; import { satisfiesCapability } from "../../foundation/capability-context";
import { toHousekeepingWidgetOptions } from "../../foundation/preferences/widget-options";
import { createHousekeepingRegistry } from "../../foundation/registry"; import { createHousekeepingRegistry } from "../../foundation/registry";
import { HOUSEKEEPING_MANIFESTS } from "../../manifests"; import { HOUSEKEEPING_MANIFESTS } from "../../manifests";
import type { HousekeepingRouteHandler } from "../../route-handlers"; import type { HousekeepingRouteHandler } from "../../route-handlers";
@@ -7,7 +8,6 @@ import {
type OperationsWorkspaceLabels, type OperationsWorkspaceLabels,
OperationsWorkspacePage, OperationsWorkspacePage,
} from "./pages/workspace"; } from "./pages/workspace";
import { toOperationsWidgetOptions } from "./personalization-model";
import { operationsWorkspaceQuery } from "./queries"; import { operationsWorkspaceQuery } from "./queries";
export async function renderOperationsWorkspacePage( export async function renderOperationsWorkspacePage(
@@ -139,7 +139,7 @@ export async function renderOperationsWorkspacePage(
return createElement(OperationsWorkspacePage, { return createElement(OperationsWorkspacePage, {
result: workspaceResult, result: workspaceResult,
routes, routes,
widgetDefinitions: toOperationsWidgetOptions(widgetDefinitions), widgetDefinitions: toHousekeepingWidgetOptions(widgetDefinitions),
surface: input.surface ?? "preview", surface: input.surface ?? "preview",
labels, labels,
routeTitles, routeTitles,
@@ -3,10 +3,10 @@ import {
anyCapability, anyCapability,
type HousekeepingWidgetDefinition, type HousekeepingWidgetDefinition,
ok, ok,
} from "../../foundation/contracts"; } from "../contracts";
import { toOperationsWidgetOptions } from "./personalization-model"; import { toHousekeepingWidgetOptions } from "./widget-options";
describe("toOperationsWidgetOptions", () => { describe("toHousekeepingWidgetOptions", () => {
it("projects provider definitions to a serializable client view model", () => { it("projects provider definitions to a serializable client view model", () => {
const load = vi.fn(async () => ok({ count: 1 }, "widget")); const load = vi.fn(async () => ok({ count: 1 }, "widget"));
const definitions: readonly HousekeepingWidgetDefinition[] = [ const definitions: readonly HousekeepingWidgetDefinition[] = [
@@ -19,7 +19,7 @@ describe("toOperationsWidgetOptions", () => {
}, },
]; ];
const options = toOperationsWidgetOptions(definitions); const options = toHousekeepingWidgetOptions(definitions);
expect(options).toEqual([{ id: "people.queue", kind: "mandatory" }]); expect(options).toEqual([{ id: "people.queue", kind: "mandatory" }]);
expect(structuredClone(options)).toEqual(options); expect(structuredClone(options)).toEqual(options);
@@ -1,15 +1,15 @@
import type { import type {
HousekeepingWidgetDefinition, HousekeepingWidgetDefinition,
HousekeepingWidgetKind, HousekeepingWidgetKind,
} from "../../foundation/contracts"; } from "../contracts";
export interface OperationsWidgetOption { export interface HousekeepingWidgetOption {
readonly id: string; readonly id: string;
readonly kind: HousekeepingWidgetKind; readonly kind: HousekeepingWidgetKind;
} }
export function toOperationsWidgetOptions( export function toHousekeepingWidgetOptions(
definitions: readonly HousekeepingWidgetDefinition[], definitions: readonly HousekeepingWidgetDefinition[],
): readonly OperationsWidgetOption[] { ): readonly HousekeepingWidgetOption[] {
return definitions.map(({ id, kind }) => ({ id, kind })); return definitions.map(({ id, kind }) => ({ id, kind }));
} }
@@ -1,8 +1,9 @@
"use client"; "use client";
import { useState } from "react"; import { useState } from "react";
import type { HousekeepingResult, HousekeepingWidgetKind } from "../contracts"; import type { HousekeepingResult } from "../contracts";
import type { HousekeepingPreferences } from "../preferences/schema"; import type { HousekeepingPreferences } from "../preferences/schema";
import type { HousekeepingWidgetOption } from "../preferences/widget-options";
export type HousekeepingPreferenceSaver = ( export type HousekeepingPreferenceSaver = (
preferences: HousekeepingPreferences, preferences: HousekeepingPreferences,
@@ -41,11 +42,6 @@ export interface WidgetSettingsLabels {
readonly error: string; readonly error: string;
} }
export interface HousekeepingWidgetOption {
readonly id: string;
readonly kind: HousekeepingWidgetKind;
}
export function WidgetSettings({ export function WidgetSettings({
preferences: initialPreferences, preferences: initialPreferences,
widgets, widgets,