UNPKG

@wonderkits/app

Version:

WonderKits micro-frontend application framework with Wujie integration support

141 lines (138 loc) 3.96 kB
import * as React from 'react'; import { RouteObject } from 'react-router-dom'; interface AppLifecycleHooks { onInstall?: () => Promise<void> | void; onActivate?: () => Promise<void> | void; onDeactivate?: () => Promise<void> | void; onUninstall?: () => Promise<void> | void; onUpdate?: (oldVersion: string, newVersion: string) => Promise<void> | void; } interface AppNavItem { name: string; href: string; matchPath?: string; icon: React.ElementType; iconPath?: React.ElementType; order?: number; visible?: boolean; current?: boolean; } interface AppPermission { id: string; name: string; description: string; required?: boolean; } interface AppRouteConfig extends Omit<RouteObject, 'children'> { meta?: { title?: string; requireAuth?: boolean; permissions?: string[]; layout?: 'default' | 'fullscreen' | 'minimal'; isMicroApp?: boolean; appId?: string; }; children?: AppRouteConfig[]; } interface AppDependency { id: string; version: string; optional?: boolean; } interface AppManifest { id: string; name: string; displayName: string; version: string; description: string; author: string; homepage?: string; keywords?: string[]; category?: string; icon?: string; screenshots?: string[]; dependencies?: AppDependency[]; permissions?: AppPermission[]; minSystemVersion?: string; } type AppMode = 'wujie' | 'module' | 'auto'; interface AppConfig { manifest: AppManifest; navigation?: AppNavItem; routes?: AppRouteConfig[]; hooks?: AppLifecycleHooks; entry?: () => Promise<React.ComponentType>; wujie?: WujieConfig; mode?: AppMode; } type AppStatus = 'installed' | 'active' | 'inactive' | 'error' | 'uninstalled'; interface AppInstance { config: AppConfig; status: AppStatus; installedAt: Date; lastActivatedAt?: Date; error?: string; } interface IAppRegistry { register(config: AppConfig): Promise<boolean>; unregister(appId: string): Promise<boolean>; activate(appId: string): Promise<boolean>; deactivate(appId: string): Promise<boolean>; getApp(appId: string): AppInstance | undefined; getAllApps(): AppInstance[]; getActiveApps(): AppInstance[]; isRegistered(appId: string): boolean; isActive(appId: string): boolean; } interface AppEvents { 'app:registered': { app: AppInstance; }; 'app:unregistered': { appId: string; }; 'app:activated': { app: AppInstance; }; 'app:deactivated': { app: AppInstance; }; 'app:error': { app: AppInstance; error: string; }; } interface AppContext { appId: string; registry: IAppRegistry; emit: <K extends keyof AppEvents>(event: K, data: AppEvents[K]) => void; subscribe: <K extends keyof AppEvents>(event: K, callback: (data: AppEvents[K]) => void) => () => void; } interface WujieConfig { name?: string; url: string; props?: Record<string, any>; attrs?: Record<string, any>; replace?: boolean; sync?: boolean; prefix?: { 'prefix-url'?: string; 'prefix-class'?: string; }; alive?: boolean; sandbox?: boolean; fetch?: (url: string, options?: any) => Promise<Response>; plugins?: Array<{ htmlLoader?: Function; jsLoader?: Function; cssLoader?: Function; }>; beforeLoad?: (appWindow: Window) => void; beforeMount?: (appWindow: Window) => void; afterMount?: (appWindow: Window) => void; beforeUnmount?: (appWindow: Window) => void; afterUnmount?: (appWindow: Window) => void; activated?: () => void; deactivated?: () => void; } export type { AppConfig, AppContext, AppDependency, AppEvents, AppInstance, AppLifecycleHooks, AppManifest, AppMode, AppNavItem, AppPermission, AppRouteConfig, AppStatus, IAppRegistry, WujieConfig };