@wonderkits/app
Version:
WonderKits micro-frontend application framework with Wujie integration support
141 lines (138 loc) • 3.96 kB
TypeScript
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 };