export const DEFAULT_APP_NAV_GROUP = '应用'; export enum FrontendAppType { Local = 'local', Remote = 'remote', } export enum FrontendLayoutMode { Standard = 'standard', Fullscreen = 'fullscreen', Immersive = 'immersive', } export enum FrontendNavIconKey { Console = 'console', User = 'user', Dashboard = 'dashboard', Setting = 'setting', Organization = 'organization', } export interface FrontendPermissionRule { anyOf?: string[]; allOf?: string[]; } export interface FrontendPermissionContext { isAuthenticated: boolean; appId?: string | null; tenantId?: string | null; roles?: string[]; permissions?: string[]; featureFlags?: string[]; } export interface FrontendAppVisibilityDefinition { enabled?: boolean; requiresAuthentication?: boolean; permissions?: FrontendPermissionRule; roles?: FrontendPermissionRule; featureFlags?: FrontendPermissionRule; allowedAppIds?: string[]; allowedTenantIds?: string[]; } export interface FrontendSidebarNavigationDefinition { label: string; group?: string; iconKey?: FrontendNavIconKey; order?: number; matchPaths?: string[]; visible?: boolean; } export interface FrontendAppNavigationDefinition { sidebar?: FrontendSidebarNavigationDefinition; } export interface FrontendAppSectionDefinition { key: string; label: string; path: string; /** 所属菜单组,默认使用 app 的 displayName */ group?: string; iconKey?: FrontendNavIconKey; description?: string; order?: number; end?: boolean; matchPaths?: string[]; } export interface FrontendLocalAppRuntimeDefinition { kind: FrontendAppType.Local; sections?: FrontendAppSectionDefinition[]; } export interface FrontendRemoteAppRuntimeDefinition { kind: FrontendAppType.Remote; remoteName: string; remoteEntry: string; exposedModule?: string; sections?: FrontendAppSectionDefinition[]; } export type FrontendAppRuntimeDefinition = | FrontendLocalAppRuntimeDefinition | FrontendRemoteAppRuntimeDefinition; export interface FrontendAppDefinition { appId: string; appType: FrontendAppType; displayName: string; routeBase: string; layoutMode?: FrontendLayoutMode; navigation?: FrontendAppNavigationDefinition; visibility?: FrontendAppVisibilityDefinition; runtime: FrontendAppRuntimeDefinition; } /** * Manifest 菜单项定义(用于 JSON 序列化) * * 自动推导规则: * - path: 默认 `${routeBase}/${key}` * - matchPaths: 默认 `[path]` * - group: 默认用 app 的 displayName * - order: 默认按数组顺序 */ export interface FrontendAppManifestMenuItem { /** 菜单项唯一标识 */ key: string; /** 菜单显示文字 */ label: string; /** 路由路径,可选。默认 `${routeBase}/${key}` */ path?: string; /** 所属菜单组,默认使用 app 的 displayName */ group?: string; /** 图标 */ iconKey?: FrontendNavIconKey; /** 描述文字 */ description?: string; /** 排序权重,默认按数组顺序 */ order?: number; /** 是否精确匹配路由 */ end?: boolean; /** 高亮匹配路径,默认 `[path]` */ matchPaths?: string[]; } /** * 轻量 manifest 文件结构,用于 Remote app 在构建时生成 app-manifest.json。 * Host 启动时加载此文件以获取菜单和路由信息。 * * 自动推导规则: * - remoteName: 默认用 appId * - exposedModule: 默认 'Module' * - menu.path: 默认 `${routeBase}/${menu.key}` * - menu.matchPaths: 默认 `[menu.path]` * - menu.group: 默认用 displayName */ export interface FrontendAppManifest { /** 应用唯一标识,同时作为 Module Federation remote 名称 */ appId: string; /** 应用显示名称 */ displayName: string; /** 路由基础路径,如 '/apps/personal' */ routeBase: string; /** 开发环境端口,用于 Host 计算本地 remoteEntry URL */ devPort: number; /** 布局模式 */ layoutMode?: FrontendLayoutMode; /** 可见性与权限配置 */ visibility?: FrontendAppVisibilityDefinition; /** Module Federation remote 名称,默认用 appId */ remoteName?: string; /** 暴露的模块名称,默认 'Module' */ exposedModule?: string; /** 菜单定义 */ menus?: FrontendAppManifestMenuItem[]; }