From e1077e261fa7e32f146a6fd5f1b1b0dfe11881ad Mon Sep 17 00:00:00 2001 From: Till JS Date: Fri, 3 Apr 2026 12:57:59 +0200 Subject: [PATCH] fix(manacore/web): fix entity registration hang + registry type errors - Make entity registration lazy (ensureEntitiesRegistered) to avoid circular imports at module load time - Re-enable cross-module drop target in AppPage - Fix Component type in app-registry to accept any props (AnyComponent) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/lib/components/workbench/AppPage.svelte | 14 +++++++++++--- .../src/lib/components/workbench/app-registry.ts | 7 ++++--- apps/manacore/apps/web/src/lib/entities/index.ts | 14 ++++++++++---- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/apps/manacore/apps/web/src/lib/components/workbench/AppPage.svelte b/apps/manacore/apps/web/src/lib/components/workbench/AppPage.svelte index 16a07979d..dfc4617ee 100644 --- a/apps/manacore/apps/web/src/lib/components/workbench/AppPage.svelte +++ b/apps/manacore/apps/web/src/lib/components/workbench/AppPage.svelte @@ -9,9 +9,17 @@ import { getAppEntry } from './app-registry'; import type { Component } from 'svelte'; import { dropTarget } from '@manacore/shared-ui/dnd'; - import { getEntity, getEntityByDragType, canDrop, executeDrop } from '$lib/entities'; + import { + getEntity, + getEntityByDragType, + canDrop, + executeDrop, + ensureEntitiesRegistered, + } from '$lib/entities'; import type { DragPayload } from '@manacore/shared-ui/dnd'; + ensureEntitiesRegistered(); + interface Props { appId: string; widthPx: number; @@ -39,8 +47,8 @@ let appColor = $derived(appEntry?.color ?? '#6B7280'); // ── Cross-module drop target ──────────────────────────── - // TODO: re-enable after fixing entity descriptor hang - let acceptedDropTypes: string[] = []; + let targetEntity = $derived(getEntity(appId)); + let acceptedDropTypes = $derived(targetEntity?.acceptsDropFrom ?? []); function handleCrossModuleDrop(payload: DragPayload) { const sourceEntity = getEntityByDragType(payload.type); diff --git a/apps/manacore/apps/web/src/lib/components/workbench/app-registry.ts b/apps/manacore/apps/web/src/lib/components/workbench/app-registry.ts index 0060815f3..a53b32293 100644 --- a/apps/manacore/apps/web/src/lib/components/workbench/app-registry.ts +++ b/apps/manacore/apps/web/src/lib/components/workbench/app-registry.ts @@ -5,10 +5,11 @@ * for in-panel navigation (detail, create, edit, etc.). */ -import type { Component } from 'svelte'; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type AnyComponent = import('svelte').Component; export interface ViewEntry { - load: () => Promise<{ default: Component }>; + load: () => Promise<{ default: AnyComponent }>; } export interface AppEntry { @@ -16,7 +17,7 @@ export interface AppEntry { name: string; color: string; /** Default view loader (list/main view). */ - load: () => Promise<{ default: Component }>; + load: () => Promise<{ default: AnyComponent }>; /** Named views for in-panel navigation. Fallback: { list: load }. */ views?: Record; } diff --git a/apps/manacore/apps/web/src/lib/entities/index.ts b/apps/manacore/apps/web/src/lib/entities/index.ts index 4e838ee3a..b679b508b 100644 --- a/apps/manacore/apps/web/src/lib/entities/index.ts +++ b/apps/manacore/apps/web/src/lib/entities/index.ts @@ -11,7 +11,13 @@ export { getAllEntities, } from './registry'; -// Register module entities (side-effect imports) -import '$lib/modules/todo/entity'; -import '$lib/modules/calendar/entity'; -import '$lib/modules/contacts/entity'; +// Lazy entity registration — avoids circular imports at module load time. +let registered = false; + +export function ensureEntitiesRegistered(): void { + if (registered) return; + registered = true; + import('$lib/modules/todo/entity'); + import('$lib/modules/calendar/entity'); + import('$lib/modules/contacts/entity'); +}