feat(frontend): Q3+Q4 — Komponenten-Chunk-Map wird aus Plugin-Manifesten GENERIERT
Check Cross-Plugin Imports / check (push) Has been cancelled
Check Cross-Plugin Imports / check (push) Has been cancelled
scripts/generate_component_map.py scannt alle builtin-Manifeste + system_miniapps.py und erzeugt frontend/src/generated/pluginComponents.generated.ts (37 Komponenten). PluginLoader (STATIC_COMPONENT_MAP) und MiniAppHost (widgetRegistry) nutzen die generierte Map — ein Plugin meldet seine Komponenten nur noch im Manifest, keine zentrale Frontend-Datei muss angefasst werden. Garantien: Generator failt hart bei Ghost-Komponenten (bewiesen: exit 1), erkennt default- vs. named-exports, deterministische Ausgabe, --check-Modus fuer CI. Kontakts DedupMergePage-Pfad-Alias auf echte Datei korrigiert. Verifikation: tsc exit 0; production build exit 0; Ghost-Fail-Hard exit 1; Dashboard+MiniAppWindow 17/17; pluginStore 18/18; keine Restreferenzen auf STATIC_COMPONENT_MAP/widgetRegistry.
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
// AUTO-GENERATED by scripts/generate_component_map.py — DO NOT EDIT.
|
||||
// Regenerate with: python3 scripts/generate_component_map.py
|
||||
// Sources: app/plugins/builtins/*/plugin.py + app/core/system_miniapps.py
|
||||
// Failure mode: the generator refuses ghost components (manifest path without
|
||||
// a matching frontend file), so this map is always loadable.
|
||||
/* eslint-disable */
|
||||
// NOTE: ComponentType<any> — components take their own specific props and
|
||||
// consumers (PluginLoader, MiniAppHost) pass arbitrary props; `unknown`
|
||||
// would forbid all JSX attributes (Phase Q3).
|
||||
import type { ComponentType } from 'react';
|
||||
|
||||
type ComponentModule = Record<string, unknown> & { default?: ComponentType<any> };
|
||||
export type LazyComponentFactory = () => Promise<{ default: ComponentType<any> }>;
|
||||
|
||||
function normalizeModule(m: ComponentModule): { default: ComponentType<any> } {
|
||||
const Comp = (m.default ?? m[Object.keys(m)[0]]) as ComponentType<any>;
|
||||
return { default: Comp };
|
||||
}
|
||||
|
||||
export const PLUGIN_COMPONENT_MAP: Record<string, LazyComponentFactory> = {
|
||||
'@/components/dashboard/AuditActivityWidget': () => import('@/components/dashboard/AuditActivityWidget').then((m) => ({ default: m.AuditActivityWidget })),
|
||||
'@/components/dashboard/AutomationStatusWidget': () => import('@/components/dashboard/AutomationStatusWidget').then((m) => ({ default: m.AutomationStatusWidget })),
|
||||
'@/components/dashboard/CalendarUpcomingWidget': () => import('@/components/dashboard/CalendarUpcomingWidget').then((m) => ({ default: m.CalendarUpcomingWidget })),
|
||||
'@/components/dashboard/ContactsStatsWidget': () => import('@/components/dashboard/ContactsStatsWidget').then((m) => ({ default: m.ContactsStatsWidget })),
|
||||
'@/components/dashboard/DmsFoldersWidget': () => import('@/components/dashboard/DmsFoldersWidget').then((m) => ({ default: m.DmsFoldersWidget })),
|
||||
'@/components/dashboard/GraphOverviewWidget': () => import('@/components/dashboard/GraphOverviewWidget').then((m) => ({ default: m.GraphOverviewWidget })),
|
||||
'@/components/dashboard/MailUnreadWidget': () => import('@/components/dashboard/MailUnreadWidget').then((m) => ({ default: m.MailUnreadWidget })),
|
||||
'@/components/dashboard/RecentContactsWidget': () => import('@/components/dashboard/RecentContactsWidget').then((m) => ({ default: m.RecentContactsWidget })),
|
||||
'@/components/dashboard/SystemMetricsWidget': () => import('@/components/dashboard/SystemMetricsWidget').then((m) => ({ default: m.SystemMetricsWidget })),
|
||||
'@/components/dashboard/TasksSummaryWidget': () => import('@/components/dashboard/TasksSummaryWidget').then((m) => ({ default: m.TasksSummaryWidget })),
|
||||
'@/components/dashboard/WikiRecentWidget': () => import('@/components/dashboard/WikiRecentWidget').then((m) => ({ default: m.WikiRecentWidget })),
|
||||
'@/pages/AIAssistant': () => import('@/pages/AIAssistant').then(normalizeModule),
|
||||
'@/pages/AISettings': () => import('@/pages/AISettings').then((m) => ({ default: m.AISettingsPage })),
|
||||
'@/pages/AgentDashboard': () => import('@/pages/AgentDashboard').then((m) => ({ default: m.AgentDashboardPage })),
|
||||
'@/pages/AutomationDashboard': () => import('@/pages/AutomationDashboard').then((m) => ({ default: m.AutomationDashboardPage })),
|
||||
'@/pages/AutomationSettings': () => import('@/pages/AutomationSettings').then((m) => ({ default: m.AutomationSettingsPage })),
|
||||
'@/pages/Calendar': () => import('@/pages/Calendar').then(normalizeModule),
|
||||
'@/pages/Communication': () => import('@/pages/Communication').then(normalizeModule),
|
||||
'@/pages/ContactDetailPage': () => import('@/pages/ContactDetailPage').then((m) => ({ default: m.ContactDetailPage })),
|
||||
'@/pages/ContactsList': () => import('@/pages/ContactsList').then((m) => ({ default: m.ContactsListPage })),
|
||||
'@/pages/DedupMerge': () => import('@/pages/DedupMerge').then((m) => ({ default: m.DedupMergePage })),
|
||||
'@/pages/Dms': () => import('@/pages/Dms').then((m) => ({ default: m.DmsPage })),
|
||||
'@/pages/DmsTrash': () => import('@/pages/DmsTrash').then((m) => ({ default: m.DmsTrashPage })),
|
||||
'@/pages/DocumentSettings': () => import('@/pages/DocumentSettings').then((m) => ({ default: m.DocumentSettingsPage })),
|
||||
'@/pages/GlobalSearchResults': () => import('@/pages/GlobalSearchResults').then((m) => ({ default: m.GlobalSearchResultsPage })),
|
||||
'@/pages/ImportExport': () => import('@/pages/ImportExport').then((m) => ({ default: m.ImportExportPage })),
|
||||
'@/pages/Mail': () => import('@/pages/Mail').then((m) => ({ default: m.MailPage })),
|
||||
'@/pages/MailSettings': () => import('@/pages/MailSettings').then((m) => ({ default: m.MailSettingsPage })),
|
||||
'@/pages/ProactiveAISettings': () => import('@/pages/ProactiveAISettings').then((m) => ({ default: m.ProactiveAISettings })),
|
||||
'@/pages/Reports': () => import('@/pages/Reports').then((m) => ({ default: m.ReportsPage })),
|
||||
'@/pages/SettingsGroups': () => import('@/pages/SettingsGroups').then((m) => ({ default: m.SettingsGroupsPage })),
|
||||
'@/pages/SettingsNotifications': () => import('@/pages/SettingsNotifications').then((m) => ({ default: m.SettingsNotificationsPage })),
|
||||
'@/pages/SettingsRoles': () => import('@/pages/SettingsRoles').then((m) => ({ default: m.SettingsRolesPage })),
|
||||
'@/pages/SettingsUsers': () => import('@/pages/SettingsUsers').then((m) => ({ default: m.SettingsUsersPage })),
|
||||
'@/pages/Tasks': () => import('@/pages/Tasks').then((m) => ({ default: m.TasksPage })),
|
||||
'@/pages/Wiki': () => import('@/pages/Wiki').then((m) => ({ default: m.WikiPage })),
|
||||
'@/pages/Workflows': () => import('@/pages/Workflows').then((m) => ({ default: m.WorkflowsPage })),
|
||||
};
|
||||
Reference in New Issue
Block a user