@lytjs/core 6.4.0 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/app-context.ts","../src/plugin-registry.ts","../src/plugin-validator.ts","../src/create-app.ts","../src/h.ts","../src/define-component.ts","../src/next-tick.ts","../src/resolve.ts","../src/directives.ts","../src/composition.ts","../src/web-component.ts","../src/lifecycle.ts","../src/config-validator.ts","../src/config-transformer.ts","../src/plugin-sdk.ts","../src/config.ts","../src/common-integration.ts","../src/error-boundary.ts","../src/index.ts"],"names":["createBaseAppContext","options","error","createVNode","comp","_defineComponent","result","getCurrentInstance","ref","shallowRef","createAppContext","createComponentInstance","setupComponent","createDOMRenderer","callUnmountedHook","createApp","h","cloneVNode","computed","onBeforeUnmount","onMounted","watch","watchEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["// src/app-context.ts\r\n// @lytjs/core - AppContext 创建和配置\r\n\r\nimport type { AppConfig, DOMRenderer, VNode } from './types';\r\nimport { createAppContext as createBaseAppContext } from '@lytjs/component';\r\nimport type { AppContext as BaseAppContext, ComponentInternalInstance } from '@lytjs/component';\r\n\r\n/**\r\n * Core AppContext extends the base AppContext from @lytjs/component\r\n * with runtime fields needed by the app lifecycle (renderer, _vnode, _container).\r\n */\r\nexport interface AppContext extends BaseAppContext {\r\n renderer: DOMRenderer | null;\r\n _vnode: VNode | null;\r\n _container: Element | null;\r\n _instance: ComponentInternalInstance | null;\r\n}\r\n\r\n/**\r\n * 创建应用上下文对象\r\n * 基于 @lytjs/component 的 createAppContext 扩展运行时字段\r\n */\r\nexport function createAppContext(): AppContext {\r\n return {\r\n ...createBaseAppContext(),\r\n config: {\r\n performance: false,\r\n globalProperties: {},\r\n } as AppConfig,\r\n renderer: null,\r\n _vnode: null,\r\n _container: null,\r\n _instance: null,\r\n };\r\n}\r\n\r\n/**\r\n * 创建代理配置对象,读写操作映射到 context.config\r\n */\r\nexport function createContextConfig(context: AppContext): AppConfig {\r\n return new Proxy({} as AppConfig, {\r\n get(_, key: string) {\r\n if (key === 'globalProperties') {\r\n return context.config.globalProperties;\r\n }\r\n return (context.config as Record<string, unknown>)[key];\r\n },\r\n set(_, key: string, value: unknown) {\r\n if (key === 'globalProperties') {\r\n context.config.globalProperties = value as Record<string, unknown>;\r\n return true;\r\n }\r\n (context.config as Record<string, unknown>)[key] = value;\r\n return true;\r\n },\r\n ownKeys() {\r\n return Reflect.ownKeys(context.config);\r\n },\r\n has(_, key: string) {\r\n return key in context.config;\r\n },\r\n getOwnPropertyDescriptor(_, key: string) {\r\n return Object.getOwnPropertyDescriptor(context.config, key);\r\n },\r\n });\r\n}\r\n","// src/plugin-registry.ts\r\n// @lytjs/core - 插件注册表实现\r\n\r\nimport { error } from '@lytjs/common-error';\r\nimport type {\r\n EnhancedPlugin,\r\n Plugin,\r\n RegisteredPlugin,\r\n RegistrationResult,\r\n DependencyResult,\r\n PluginLifecycleEvent,\r\n PluginEventListener,\r\n} from './types';\r\n\r\n/**\r\n * 插件注册表\r\n * @description 管理插件的注册、注销、查询和依赖关系\r\n *\r\n * @example\r\n * ```typescript\r\n * const registry = new PluginRegistry();\r\n *\r\n * // 注册插件\r\n * registry.register(myPlugin, { theme: 'dark' });\r\n *\r\n * // 查询插件\r\n * const plugin = registry.get('my-plugin');\r\n *\r\n * // 检查依赖\r\n * const result = registry.checkDependencies(anotherPlugin);\r\n *\r\n * // 监听事件\r\n * registry.on('after:install', (event, data) => {\r\n * console.log(`Plugin ${data.name} installed`);\r\n * });\r\n * ```\r\n */\r\nexport class PluginRegistry {\r\n /** 已注册插件映射(name → RegisteredPlugin) */\r\n private plugins = new Map<string, RegisteredPlugin>();\r\n\r\n /** 事件监听器映射 */\r\n private listeners = new Map<PluginLifecycleEvent, Set<PluginEventListener>>();\r\n\r\n constructor() {}\r\n\r\n /**\r\n * 注册插件\r\n * @param plugin - 插件实例(EnhancedPlugin 或基础 Plugin)\r\n * @param options - 安装选项\r\n * @returns 注册结果\r\n */\r\n register(plugin: EnhancedPlugin | Plugin, options: unknown = undefined): RegistrationResult {\r\n // 获取插件名称\r\n const name = this.getPluginName(plugin);\r\n\r\n if (!name) {\r\n const result: RegistrationResult = {\r\n success: false,\r\n name: 'anonymous',\r\n error: 'Plugin must have a name property. Use EnhancedPlugin interface for full support.',\r\n };\r\n this.emit('error', result);\r\n return result;\r\n }\r\n\r\n // 检查是否已注册\r\n if (this.plugins.has(name)) {\r\n const result: RegistrationResult = {\r\n success: false,\r\n name,\r\n error: `Plugin \"${name}\" is already registered.`,\r\n };\r\n this.emit('error', result);\r\n return result;\r\n }\r\n\r\n // 如果是 EnhancedPlugin,检查冲突\r\n if (this.isEnhancedPlugin(plugin)) {\r\n const conflict = this.checkConflicts(plugin);\r\n if (conflict) {\r\n const result: RegistrationResult = {\r\n success: false,\r\n name,\r\n error: `Plugin \"${name}\" conflicts with: ${conflict.join(', ')}`,\r\n };\r\n this.emit('error', result);\r\n return result;\r\n }\r\n }\r\n\r\n // 触发 before:register 事件\r\n this.emit('before:register', { name, plugin });\r\n\r\n // 注册插件\r\n const registered: RegisteredPlugin = {\r\n plugin: this.normalizePlugin(plugin),\r\n options,\r\n installed: false,\r\n registeredAt: Date.now(),\r\n };\r\n\r\n this.plugins.set(name, registered);\r\n\r\n // 触发 after:register 事件\r\n this.emit('after:register', { name, plugin });\r\n\r\n return { success: true, name };\r\n }\r\n\r\n /**\r\n * 注销插件\r\n * @param name - 插件名称\r\n * @returns 是否成功注销\r\n */\r\n unregister(name: string): boolean {\r\n const registered = this.plugins.get(name);\r\n if (!registered) {\r\n return false;\r\n }\r\n\r\n // 触发 before:unregister 事件\r\n this.emit('before:unregister', { name, plugin: registered.plugin });\r\n\r\n // 如果已安装,先调用 cleanup\r\n if (registered.installed && registered.plugin.cleanup) {\r\n try {\r\n const cleanupResult = registered.plugin.cleanup();\r\n // 处理异步 cleanup\r\n if (cleanupResult instanceof Promise) {\r\n cleanupResult.catch((err) => {\r\n error(\r\n `Plugin \"${name}\" async cleanup failed: ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n });\r\n }\r\n } catch (err) {\r\n error(\r\n `Plugin \"${name}\" cleanup failed: ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n }\r\n }\r\n\r\n this.plugins.delete(name);\r\n\r\n // 触发 after:unregister 事件\r\n this.emit('after:unregister', { name });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * 获取已注册插件信息\r\n * @param name - 插件名称\r\n * @returns 插件注册信息,如果未找到则返回 undefined\r\n */\r\n get(name: string): RegisteredPlugin | undefined {\r\n return this.plugins.get(name);\r\n }\r\n\r\n /**\r\n * 获取已注册的插件实例\r\n * @param name - 插件名称\r\n * @returns 插件实例,如果未找到则返回 undefined\r\n */\r\n getPlugin(name: string): EnhancedPlugin | undefined {\r\n return this.plugins.get(name)?.plugin;\r\n }\r\n\r\n /**\r\n * 检查插件是否已注册\r\n * @param name - 插件名称\r\n */\r\n has(name: string): boolean {\r\n return this.plugins.has(name);\r\n }\r\n\r\n /**\r\n * 获取所有已注册插件名称\r\n */\r\n getNames(): string[] {\r\n return Array.from(this.plugins.keys());\r\n }\r\n\r\n /**\r\n * 获取所有已注册插件信息\r\n */\r\n getAll(): RegisteredPlugin[] {\r\n return Array.from(this.plugins.values());\r\n }\r\n\r\n /**\r\n * 获取已安装插件列表\r\n */\r\n getInstalled(): RegisteredPlugin[] {\r\n return this.getAll().filter((p) => p.installed);\r\n }\r\n\r\n /**\r\n * 标记插件为已安装\r\n * @param name - 插件名称\r\n */\r\n markInstalled(name: string): void {\r\n const registered = this.plugins.get(name);\r\n if (registered) {\r\n registered.installed = true;\r\n registered.installedAt = Date.now();\r\n }\r\n }\r\n\r\n /**\r\n * 标记插件为未安装\r\n * @param name - 插件名称\r\n */\r\n markUninstalled(name: string): void {\r\n const registered = this.plugins.get(name);\r\n if (registered) {\r\n registered.installed = false;\r\n registered.installedAt = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 检查插件依赖是否满足\r\n * @param plugin - 要检查的插件\r\n * @returns 依赖检查结果\r\n */\r\n checkDependencies(plugin: EnhancedPlugin | Plugin): DependencyResult {\r\n const result: DependencyResult = {\r\n satisfied: true,\r\n missing: [],\r\n missingOptional: [],\r\n versionMismatch: [],\r\n };\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return result;\r\n }\r\n\r\n // 检查必需依赖\r\n if (plugin.dependencies) {\r\n for (const dep of plugin.dependencies) {\r\n const registered = this.plugins.get(dep.name);\r\n if (!registered) {\r\n result.satisfied = false;\r\n result.missing.push({ name: dep.name, version: dep.version });\r\n } else if (dep.version && registered.plugin.version) {\r\n // 简单版本比较(支持前缀 ^, ~, >=, >, <, <=, =)\r\n if (!this.satisfiesVersion(registered.plugin.version, dep.version)) {\r\n result.satisfied = false;\r\n result.versionMismatch.push({\r\n name: dep.name,\r\n expected: dep.version,\r\n actual: registered.plugin.version,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 检查可选依赖\r\n if (plugin.optionalDependencies) {\r\n for (const dep of plugin.optionalDependencies) {\r\n const registered = this.plugins.get(dep.name);\r\n if (!registered) {\r\n result.missingOptional.push({ name: dep.name, version: dep.version });\r\n } else if (dep.version && registered.plugin.version) {\r\n if (!this.satisfiesVersion(registered.plugin.version, dep.version)) {\r\n result.versionMismatch.push({\r\n name: dep.name,\r\n expected: dep.version,\r\n actual: registered.plugin.version,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 解析插件加载顺序(拓扑排序)\r\n * @description 根据依赖关系计算正确的安装顺序\r\n * @returns 排序后的插件列表\r\n * @throws 如果存在循环依赖则抛出错误\r\n */\r\n resolveLoadOrder(): EnhancedPlugin[] {\r\n const visited = new Set<string>();\r\n const visiting = new Set<string>();\r\n const result: EnhancedPlugin[] = [];\r\n\r\n const visit = (name: string) => {\r\n if (visited.has(name)) return;\r\n if (visiting.has(name)) {\r\n throw new Error(`Circular dependency detected involving plugin \"${name}\"`);\r\n }\r\n\r\n visiting.add(name);\r\n\r\n const registered = this.plugins.get(name);\r\n if (registered && this.isEnhancedPlugin(registered.plugin)) {\r\n // 先访问依赖\r\n if (registered.plugin.dependencies) {\r\n for (const dep of registered.plugin.dependencies) {\r\n if (this.plugins.has(dep.name)) {\r\n visit(dep.name);\r\n }\r\n }\r\n }\r\n }\r\n\r\n visiting.delete(name);\r\n visited.add(name);\r\n\r\n if (registered) {\r\n result.push(registered.plugin);\r\n }\r\n };\r\n\r\n // 按注册顺序遍历\r\n for (const name of this.plugins.keys()) {\r\n visit(name);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 获取插件数量\r\n */\r\n get size(): number {\r\n return this.plugins.size;\r\n }\r\n\r\n /**\r\n * 清空所有已注册插件\r\n */\r\n clear(): void {\r\n // 先调用所有已安装插件的 cleanup\r\n for (const [name, registered] of this.plugins) {\r\n if (registered.installed && registered.plugin.cleanup) {\r\n try {\r\n registered.plugin.cleanup();\r\n } catch (err) {\r\n error(\r\n `Plugin \"${name}\" cleanup failed during clear: ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n }\r\n }\r\n }\r\n this.plugins.clear();\r\n }\r\n\r\n // ==================== 事件系统 ====================\r\n\r\n /**\r\n * 注册事件监听器\r\n * @param event - 事件类型\r\n * @param handler - 事件处理函数\r\n * @returns 取消监听的函数\r\n */\r\n on(event: PluginLifecycleEvent, handler: PluginEventListener): () => void {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(handler);\r\n\r\n // 返回取消监听函数\r\n return () => {\r\n this.listeners.get(event)?.delete(handler);\r\n };\r\n }\r\n\r\n /**\r\n * 触发事件\r\n * @param event - 事件类型\r\n * @param data - 事件数据\r\n */\r\n emit(event: PluginLifecycleEvent, data: unknown): void {\r\n const handlers = this.listeners.get(event);\r\n if (handlers) {\r\n for (const handler of handlers) {\r\n try {\r\n handler(event, data);\r\n } catch (err) {\r\n error(\r\n `Plugin event handler error for \"${event}\": ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 移除事件监听器\r\n * @param event - 事件类型\r\n * @param handler - 事件处理函数\r\n */\r\n off(event: PluginLifecycleEvent, handler: PluginEventListener): void {\r\n this.listeners.get(event)?.delete(handler);\r\n }\r\n\r\n // ==================== 内部工具方法 ====================\r\n\r\n /**\r\n * 获取插件名称\r\n */\r\n private getPluginName(plugin: EnhancedPlugin | Plugin): string | undefined {\r\n if (this.isEnhancedPlugin(plugin)) {\r\n return plugin.name;\r\n }\r\n // 基础 Plugin 尝试从 name 属性获取\r\n return (plugin as unknown as Record<string, unknown>).name as string | undefined;\r\n }\r\n\r\n /**\r\n * 检查是否为 EnhancedPlugin\r\n */\r\n private isEnhancedPlugin(plugin: EnhancedPlugin | Plugin): plugin is EnhancedPlugin {\r\n return 'name' in plugin && typeof (plugin as EnhancedPlugin).name === 'string';\r\n }\r\n\r\n /**\r\n * 将基础 Plugin 标准化为 EnhancedPlugin\r\n */\r\n private normalizePlugin(plugin: EnhancedPlugin | Plugin): EnhancedPlugin {\r\n if (this.isEnhancedPlugin(plugin)) {\r\n return plugin;\r\n }\r\n // 为基础 Plugin 生成匿名名称\r\n const anonymousName = `anonymous-plugin-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\r\n return {\r\n install: plugin.install,\r\n name: anonymousName,\r\n };\r\n }\r\n\r\n /**\r\n * 检查插件冲突\r\n */\r\n private checkConflicts(plugin: EnhancedPlugin): string[] | null {\r\n if (!plugin.conflicts || plugin.conflicts.length === 0) {\r\n return null;\r\n }\r\n\r\n const conflicts: string[] = [];\r\n for (const conflictName of plugin.conflicts) {\r\n if (this.plugins.has(conflictName)) {\r\n conflicts.push(conflictName);\r\n }\r\n }\r\n\r\n return conflicts.length > 0 ? conflicts : null;\r\n }\r\n\r\n /**\r\n * 简单的 semver 版本比较\r\n * @description 支持 ^, ~, >=, >, <, <=, = 前缀\r\n */\r\n private satisfiesVersion(actual: string, expected: string): boolean {\r\n const actualVersion = this.parseVersion(actual);\r\n if (!actualVersion) return false;\r\n\r\n // 解析期望版本范围\r\n const range = expected.trim();\r\n let prefix = '';\r\n let expectedVersion = range;\r\n\r\n if (\r\n range.startsWith('^') ||\r\n range.startsWith('~') ||\r\n range.startsWith('>') ||\r\n range.startsWith('<') ||\r\n range.startsWith('=')\r\n ) {\r\n const firstChar = range[0] as string;\r\n prefix = firstChar;\r\n expectedVersion = range.slice(1).trim();\r\n // 处理 >= 和 <=\r\n if (range.startsWith('>=') || range.startsWith('<=')) {\r\n prefix = range.slice(0, 2);\r\n expectedVersion = range.slice(2).trim();\r\n }\r\n }\r\n\r\n const expectedParsed = this.parseVersion(expectedVersion);\r\n if (!expectedParsed) return false;\r\n\r\n switch (prefix) {\r\n case '':\r\n case '=':\r\n // 精确匹配\r\n return (\r\n actualVersion.major === expectedParsed.major &&\r\n actualVersion.minor === expectedParsed.minor &&\r\n actualVersion.patch === expectedParsed.patch\r\n );\r\n\r\n case '^':\r\n // 兼容主版本(^1.2.3 允许 >=1.2.3 <2.0.0)\r\n return (\r\n actualVersion.major === expectedParsed.major &&\r\n (actualVersion.minor > expectedParsed.minor ||\r\n (actualVersion.minor === expectedParsed.minor &&\r\n actualVersion.patch >= expectedParsed.patch))\r\n );\r\n\r\n case '~':\r\n // 兼容次版本(~1.2.3 允许 >=1.2.3 <1.3.0)\r\n return (\r\n actualVersion.major === expectedParsed.major &&\r\n actualVersion.minor === expectedParsed.minor &&\r\n actualVersion.patch >= expectedParsed.patch\r\n );\r\n\r\n case '>':\r\n return this.compareVersions(actualVersion, expectedParsed) > 0;\r\n\r\n case '>=':\r\n return this.compareVersions(actualVersion, expectedParsed) >= 0;\r\n\r\n case '<':\r\n return this.compareVersions(actualVersion, expectedParsed) < 0;\r\n\r\n case '<=':\r\n return this.compareVersions(actualVersion, expectedParsed) <= 0;\r\n\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * 解析版本号字符串\r\n */\r\n private parseVersion(version: string): { major: number; minor: number; patch: number } | null {\r\n const match = version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)/);\r\n if (!match) return null;\r\n return {\r\n major: parseInt(match[1]!, 10),\r\n minor: parseInt(match[2]!, 10),\r\n patch: parseInt(match[3]!, 10),\r\n };\r\n }\r\n\r\n /**\r\n * 比较两个版本号\r\n * @returns 正数表示 a > b,负数表示 a < b,0 表示相等\r\n */\r\n private compareVersions(\r\n a: { major: number; minor: number; patch: number },\r\n b: { major: number; minor: number; patch: number },\r\n ): number {\r\n if (a.major !== b.major) return a.major - b.major;\r\n if (a.minor !== b.minor) return a.minor - b.minor;\r\n return a.patch - b.patch;\r\n }\r\n}\r\n","// src/plugin-validator.ts\r\n// @lytjs/core - 插件验证器实现\r\n\r\nimport type { EnhancedPlugin, Plugin, PluginDependency } from './types';\r\n\r\n/**\r\n * 验证报告中的单个问题\r\n */\r\nexport interface ValidationIssue {\r\n /** 问题级别 */\r\n level: 'error' | 'warning' | 'info';\r\n /** 问题规则名称 */\r\n rule: string;\r\n /** 问题描述 */\r\n message: string;\r\n}\r\n\r\n/**\r\n * 插件验证报告\r\n * @description 包含验证结果和所有发现的问题\r\n */\r\nexport interface ValidationReport {\r\n /** 是否通过验证(无 error 级别问题) */\r\n valid: boolean;\r\n /** 插件名称 */\r\n pluginName: string;\r\n /** 所有验证问题 */\r\n issues: ValidationIssue[];\r\n /** 错误数量 */\r\n errorCount: number;\r\n /** 警告数量 */\r\n warningCount: number;\r\n /** 信息数量 */\r\n infoCount: number;\r\n}\r\n\r\n/**\r\n * 验证规则函数类型\r\n */\r\ntype ValidationRule = (\r\n plugin: EnhancedPlugin | Plugin,\r\n context: ValidationContext,\r\n) => ValidationIssue[];\r\n\r\n/**\r\n * 验证上下文\r\n */\r\ninterface ValidationContext {\r\n /** 已知插件名称列表(用于循环依赖检测) */\r\n knownPlugins: Set<string>;\r\n}\r\n\r\n/**\r\n * 插件验证器\r\n * @description 对插件进行结构和配置验证,确保插件符合规范\r\n *\r\n * @example\r\n * ```typescript\r\n * const validator = new PluginValidator();\r\n *\r\n * // 验证单个插件\r\n * const report = validator.validate(myPlugin);\r\n * if (!report.valid) {\r\n * console.error('Plugin validation failed:', report.issues);\r\n * }\r\n *\r\n * // 批量验证\r\n * const reports = validator.validateAll([plugin1, plugin2, plugin3]);\r\n * ```\r\n */\r\nexport class PluginValidator {\r\n /** 内置验证规则列表 */\r\n private rules: ValidationRule[] = [];\r\n\r\n /** 已知插件名称集合(用于跨插件验证) */\r\n private knownPlugins = new Set<string>();\r\n\r\n constructor() {\r\n // 注册默认验证规则(绑定 this 上下文)\r\n this.rules = [\r\n this.validateStructure.bind(this),\r\n this.validateName.bind(this),\r\n this.validateVersion.bind(this),\r\n this.validateDependencies.bind(this),\r\n this.validateConflicts.bind(this),\r\n this.validatePeerRequirements.bind(this),\r\n this.validateLifecycleHooks.bind(this),\r\n ];\r\n }\r\n\r\n /**\r\n * 验证插件\r\n * @param plugin - 要验证的插件\r\n * @returns 验证报告\r\n */\r\n validate(plugin: EnhancedPlugin | Plugin): ValidationReport {\r\n const pluginName = this.getPluginName(plugin) ?? 'anonymous';\r\n const context: ValidationContext = {\r\n knownPlugins: this.knownPlugins,\r\n };\r\n\r\n const issues: ValidationIssue[] = [];\r\n\r\n // 执行所有验证规则\r\n for (const rule of this.rules) {\r\n try {\r\n const ruleIssues = rule(plugin, context);\r\n issues.push(...ruleIssues);\r\n } catch (err) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'rule-execution',\r\n message: `Validation rule execution failed: ${err instanceof Error ? err.message : String(err)}`,\r\n });\r\n }\r\n }\r\n\r\n // 统计各级别问题数量\r\n const errorCount = issues.filter((i) => i.level === 'error').length;\r\n const warningCount = issues.filter((i) => i.level === 'warning').length;\r\n const infoCount = issues.filter((i) => i.level === 'info').length;\r\n\r\n return {\r\n valid: errorCount === 0,\r\n pluginName,\r\n issues,\r\n errorCount,\r\n warningCount,\r\n infoCount,\r\n };\r\n }\r\n\r\n /**\r\n * 批量验证多个插件\r\n * @param plugins - 要验证的插件列表\r\n * @returns 验证报告列表\r\n */\r\n validateAll(plugins: (EnhancedPlugin | Plugin)[]): ValidationReport[] {\r\n return plugins.map((plugin) => this.validate(plugin));\r\n }\r\n\r\n /**\r\n * 注册已知插件名称(用于跨插件验证)\r\n * @param names - 插件名称列表\r\n */\r\n registerKnownPlugins(names: string[]): void {\r\n for (const name of names) {\r\n this.knownPlugins.add(name);\r\n }\r\n }\r\n\r\n /**\r\n * 添加自定义验证规则\r\n * @param rule - 验证规则函数\r\n */\r\n addRule(rule: ValidationRule): void {\r\n this.rules.push(rule);\r\n }\r\n\r\n /**\r\n * 移除验证规则\r\n * @param rule - 要移除的验证规则函数\r\n */\r\n removeRule(rule: ValidationRule): void {\r\n const index = this.rules.indexOf(rule);\r\n if (index !== -1) {\r\n this.rules.splice(index, 1);\r\n }\r\n }\r\n\r\n // ==================== 内置验证规则 ====================\r\n\r\n /**\r\n * 规则:验证插件基本结构\r\n * @description 确保插件有 install 方法\r\n */\r\n private validateStructure(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!plugin || typeof plugin !== 'object') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-structure',\r\n message: 'Plugin must be an object.',\r\n });\r\n return issues;\r\n }\r\n\r\n if (typeof plugin.install !== 'function') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-structure',\r\n message: 'Plugin must have an \"install\" method that is a function.',\r\n });\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证插件名称\r\n * @description 确保名称有效且不冲突\r\n */\r\n private validateName(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n // 非对象插件跳过名称验证(由 validateStructure 处理)\r\n if (!plugin || typeof plugin !== 'object') {\r\n return issues;\r\n }\r\n\r\n const name = this.getPluginName(plugin);\r\n\r\n if (name === undefined) {\r\n issues.push({\r\n level: 'warning',\r\n rule: 'validate-name',\r\n message:\r\n 'Plugin has no name. It is recommended to use EnhancedPlugin with a \"name\" property for better debugging and dependency management.',\r\n });\r\n return issues;\r\n }\r\n\r\n // 名称格式检查\r\n if (typeof name !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-name',\r\n message: `Plugin name must be a string, got ${typeof name}.`,\r\n });\r\n return issues;\r\n }\r\n\r\n if (name.trim().length === 0) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-name',\r\n message: 'Plugin name must not be empty.',\r\n });\r\n return issues;\r\n }\r\n\r\n // 名称格式规范:推荐 kebab-case\r\n const validNamePattern = /^[a-z][a-z0-9-]*$/;\r\n if (!validNamePattern.test(name)) {\r\n issues.push({\r\n level: 'warning',\r\n rule: 'validate-name',\r\n message: `Plugin name \"${name}\" does not follow kebab-case convention (e.g., \"my-plugin\").`,\r\n });\r\n }\r\n\r\n // 名称长度限制\r\n if (name.length > 100) {\r\n issues.push({\r\n level: 'warning',\r\n rule: 'validate-name',\r\n message: `Plugin name \"${name}\" is too long (max 100 characters).`,\r\n });\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证版本号格式\r\n * @description 确保版本号符合 semver 格式\r\n */\r\n private validateVersion(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return issues;\r\n }\r\n\r\n if (plugin.version !== undefined) {\r\n if (typeof plugin.version !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-version',\r\n message: `Plugin version must be a string, got ${typeof plugin.version}.`,\r\n });\r\n } else {\r\n // semver 格式检查(主版本.次版本.修订号)\r\n const semverPattern = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.]+)?(\\+[a-zA-Z0-9.]+)?$/;\r\n if (!semverPattern.test(plugin.version)) {\r\n issues.push({\r\n level: 'warning',\r\n rule: 'validate-version',\r\n message: `Plugin version \"${plugin.version}\" does not follow semver format (e.g., \"1.0.0\").`,\r\n });\r\n }\r\n }\r\n } else {\r\n issues.push({\r\n level: 'info',\r\n rule: 'validate-version',\r\n message:\r\n 'Plugin has no version. It is recommended to provide a version for compatibility checks.',\r\n });\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证依赖声明\r\n * @description 检查依赖格式和已知性\r\n */\r\n private validateDependencies(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return issues;\r\n }\r\n\r\n // 验证必需依赖\r\n if (plugin.dependencies) {\r\n if (!Array.isArray(plugin.dependencies)) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-dependencies',\r\n message: 'Plugin \"dependencies\" must be an array.',\r\n });\r\n } else {\r\n issues.push(...this.validateDependencyArray(plugin.dependencies, 'dependencies', false));\r\n }\r\n }\r\n\r\n // 验证可选依赖\r\n if (plugin.optionalDependencies) {\r\n if (!Array.isArray(plugin.optionalDependencies)) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-dependencies',\r\n message: 'Plugin \"optionalDependencies\" must be an array.',\r\n });\r\n } else {\r\n issues.push(\r\n ...this.validateDependencyArray(\r\n plugin.optionalDependencies,\r\n 'optionalDependencies',\r\n true,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n // 检查依赖是否与自身冲突\r\n if (plugin.dependencies && plugin.name) {\r\n for (const dep of plugin.dependencies) {\r\n if (dep.name === plugin.name) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-dependencies',\r\n message: `Plugin \"${plugin.name}\" cannot depend on itself.`,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 验证依赖数组\r\n */\r\n private validateDependencyArray(\r\n deps: PluginDependency[],\r\n field: string,\r\n isOptional: boolean,\r\n ): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n const seenNames = new Set<string>();\r\n\r\n for (const dep of deps) {\r\n // 检查依赖名称\r\n if (!dep.name || typeof dep.name !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-dependencies',\r\n message: `Each dependency in \"${field}\" must have a valid \"name\" string.`,\r\n });\r\n continue;\r\n }\r\n\r\n // 检查重复依赖\r\n if (seenNames.has(dep.name)) {\r\n issues.push({\r\n level: 'warning',\r\n rule: 'validate-dependencies',\r\n message: `Duplicate dependency \"${dep.name}\" in \"${field}\".`,\r\n });\r\n }\r\n seenNames.add(dep.name);\r\n\r\n // 检查版本格式\r\n if (dep.version !== undefined && typeof dep.version !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-dependencies',\r\n message: `Dependency \"${dep.name}\" version must be a string.`,\r\n });\r\n }\r\n\r\n // 检查 optional 标记是否合理\r\n if (dep.optional && !isOptional) {\r\n issues.push({\r\n level: 'info',\r\n rule: 'validate-dependencies',\r\n message: `Dependency \"${dep.name}\" has \"optional: true\" but is in required \"${field}\". Consider moving it to \"optionalDependencies\".`,\r\n });\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证冲突声明\r\n * @description 检查冲突列表格式\r\n */\r\n private validateConflicts(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return issues;\r\n }\r\n\r\n if (plugin.conflicts) {\r\n if (!Array.isArray(plugin.conflicts)) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-conflicts',\r\n message: 'Plugin \"conflicts\" must be an array of plugin name strings.',\r\n });\r\n } else {\r\n for (const conflict of plugin.conflicts) {\r\n if (typeof conflict !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-conflicts',\r\n message: `Each conflict entry must be a string, got ${typeof conflict}.`,\r\n });\r\n }\r\n }\r\n\r\n // 检查是否与自身冲突\r\n if (plugin.name && plugin.conflicts.includes(plugin.name)) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-conflicts',\r\n message: `Plugin \"${plugin.name}\" cannot conflict with itself.`,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证 peerRequirements\r\n * @description 检查宿主框架版本要求格式\r\n */\r\n private validatePeerRequirements(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return issues;\r\n }\r\n\r\n if (plugin.peerRequirements) {\r\n if (typeof plugin.peerRequirements !== 'object' || plugin.peerRequirements === null) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-peer-requirements',\r\n message: 'Plugin \"peerRequirements\" must be an object.',\r\n });\r\n return issues;\r\n }\r\n\r\n const { lytjs, node } = plugin.peerRequirements;\r\n\r\n if (lytjs !== undefined && typeof lytjs !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-peer-requirements',\r\n message: 'peerRequirements.lytjs must be a version range string.',\r\n });\r\n }\r\n\r\n if (node !== undefined && typeof node !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-peer-requirements',\r\n message: 'peerRequirements.node must be a version range string.',\r\n });\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证生命周期钩子\r\n * @description 确保生命周期钩子是函数\r\n */\r\n private validateLifecycleHooks(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return issues;\r\n }\r\n\r\n const hooks: Array<{ name: string; value: unknown }> = [\r\n { name: 'beforeInstall', value: plugin.beforeInstall },\r\n { name: 'afterInstall', value: plugin.afterInstall },\r\n { name: 'beforeMount', value: plugin.beforeMount },\r\n { name: 'afterMount', value: plugin.afterMount },\r\n { name: 'cleanup', value: plugin.cleanup },\r\n ];\r\n\r\n for (const hook of hooks) {\r\n if (hook.value !== undefined && typeof hook.value !== 'function') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-lifecycle-hooks',\r\n message: `Plugin lifecycle hook \"${hook.name}\" must be a function, got ${typeof hook.value}.`,\r\n });\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n // ==================== 工具方法 ====================\r\n\r\n /**\r\n * 获取插件名称\r\n */\r\n private getPluginName(plugin: EnhancedPlugin | Plugin): string | undefined {\r\n if (this.isEnhancedPlugin(plugin)) {\r\n return plugin.name;\r\n }\r\n // 基础 Plugin 尝试从 name 属性获取\r\n if (plugin == null || typeof plugin !== 'object') {\r\n return undefined;\r\n }\r\n const rawName = (plugin as unknown as Record<string, unknown>).name;\r\n return typeof rawName === 'string' ? rawName : undefined;\r\n }\r\n\r\n /**\r\n * 检查是否为 EnhancedPlugin\r\n */\r\n private isEnhancedPlugin(plugin: EnhancedPlugin | Plugin): plugin is EnhancedPlugin {\r\n return (\r\n plugin != null &&\r\n typeof plugin === 'object' &&\r\n 'name' in plugin &&\r\n typeof (plugin as EnhancedPlugin).name === 'string'\r\n );\r\n }\r\n}\r\n","// src/create-app.ts\r\n// @lytjs/core - createApp 工厂函数\r\n\r\nimport { createVNode } from '@lytjs/vdom';\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { error, warn } from '@lytjs/common-error';\r\nimport type {\r\n App,\r\n AppOptions,\r\n Plugin,\r\n PluginWithCleanup,\r\n PluginFunctionWithCleanup,\r\n EnhancedPlugin,\r\n Component,\r\n ComponentPublicInstance,\r\n ComponentOptions,\r\n DOMRenderer as CoreDOMRenderer,\r\n} from './types';\r\nimport { createAppContext, createContextConfig } from './app-context';\r\nimport { PluginRegistry } from './plugin-registry';\r\nimport { PluginValidator } from './plugin-validator';\r\nimport {\r\n createComponentInstance,\r\n setupComponent,\r\n createComponentPublicInstance,\r\n callUnmountedHook,\r\n initProps,\r\n} from '@lytjs/component';\r\nimport type {\r\n AppContext as ComponentAppContext,\r\n ComponentInternalInstance,\r\n} from '@lytjs/component';\r\nimport type { SignalRenderer } from '@lytjs/renderer';\r\n\r\nlet createSignalRenderer:\r\n | ((template: string, ctx: Record<string, unknown>) => Promise<SignalRenderer>)\r\n | null = null;\r\nlet createDOMRenderer: ((options?: unknown) => unknown) | null = null;\r\n\r\nasync function getSignalRenderer() {\r\n if (!createSignalRenderer) {\r\n const renderer = await import('@lytjs/renderer');\r\n createSignalRenderer = renderer.createSignalRenderer as (\r\n template: string,\r\n ctx: Record<string, unknown>,\r\n ) => Promise<SignalRenderer>;\r\n }\r\n return createSignalRenderer;\r\n}\r\n\r\nasync function getDOMRenderer() {\r\n if (!createDOMRenderer) {\r\n const renderer = await import('@lytjs/renderer');\r\n createDOMRenderer = renderer.createDOMRenderer as (options?: unknown) => unknown;\r\n }\r\n return createDOMRenderer;\r\n}\r\n\r\nexport function createApp(\r\n rootComponent: Component,\r\n rootProps: Record<string, unknown> | null = null,\r\n options?: AppOptions,\r\n): App {\r\n // FIX: P2-36 全局配置继承机制:\r\n // 如果提供了父 app context,子 app 继承父 app 的全局配置\r\n const context = createAppContext();\r\n const installedPlugins = new Set<Plugin | ((app: App, ...options: unknown[]) => void)>();\r\n const pluginRegistry = new PluginRegistry();\r\n const pluginValidator = new PluginValidator();\r\n let _isUnmounted = false;\r\n let _isMounted = false;\r\n\r\n // 跟踪挂载期间注册的全局事件监听器,以便卸载时清理\r\n const _globalListeners: Array<{\r\n target: EventTarget;\r\n event: string;\r\n handler: EventListener;\r\n options?: AddEventListenerOptions;\r\n }> = [];\r\n\r\n // 确定渲染模式('vapor' 是 'signal' 的别名)\r\n const rendererMode = options?.rendererMode ?? 'vnode';\r\n const effectiveMode = rendererMode === 'vapor' ? 'signal' : rendererMode;\r\n\r\n // Signal 模式下的渲染器引用\r\n let signalRenderer: SignalRenderer | null = null;\r\n\r\n const app: App = {\r\n config: createContextConfig(context),\r\n\r\n use(plugin: Plugin | ((app: App, ...options: unknown[]) => void), ...options: unknown[]) {\r\n // 处理 null/undefined 的情况\r\n if (plugin == null) {\r\n return app;\r\n }\r\n if (installedPlugins.has(plugin)) return app;\r\n try {\r\n // 对 EnhancedPlugin 进行验证和注册\r\n if (\r\n typeof plugin !== 'function' &&\r\n 'name' in plugin &&\r\n typeof (plugin as EnhancedPlugin).name === 'string'\r\n ) {\r\n const enhancedPlugin = plugin as EnhancedPlugin;\r\n\r\n // 验证插件\r\n const report = pluginValidator.validate(enhancedPlugin);\r\n if (!report.valid) {\r\n const errorMessages = report.issues\r\n .filter((i) => i.level === 'error')\r\n .map((i) => `[${i.rule}] ${i.message}`)\r\n .join('; ');\r\n throw new Error(`Plugin \"${enhancedPlugin.name}\" validation failed: ${errorMessages}`);\r\n }\r\n\r\n // 注册到 Registry\r\n const regResult = pluginRegistry.register(enhancedPlugin, options);\r\n if (!regResult.success) {\r\n throw new Error(regResult.error);\r\n }\r\n\r\n // 检查依赖\r\n const depResult = pluginRegistry.checkDependencies(enhancedPlugin);\r\n if (!depResult.satisfied && depResult.missing.length > 0) {\r\n const missingNames = depResult.missing.map((d) => d.name).join(', ');\r\n throw new Error(\r\n `Plugin \"${enhancedPlugin.name}\" has unsatisfied dependencies: ${missingNames}`,\r\n );\r\n }\r\n\r\n // 触发 beforeInstall 生命周期钩子\r\n if (enhancedPlugin.beforeInstall) {\r\n const shouldContinue = enhancedPlugin.beforeInstall(app);\r\n // 处理异步 beforeInstall\r\n if (shouldContinue instanceof Promise) {\r\n throw new Error(\r\n 'Plugin beforeInstall hook cannot be async when using synchronous app.use(). Use await app.use() for async plugins.',\r\n );\r\n }\r\n if (shouldContinue === false) {\r\n pluginRegistry.unregister(enhancedPlugin.name);\r\n return app;\r\n }\r\n }\r\n\r\n // 执行安装 - 检查是否存在 install 方法\r\n if (typeof plugin.install === 'function') {\r\n plugin.install(app, ...options);\r\n }\r\n\r\n // 标记为已安装\r\n pluginRegistry.markInstalled(enhancedPlugin.name);\r\n\r\n // 触发 afterInstall 生命周期钩子\r\n if (enhancedPlugin.afterInstall) {\r\n enhancedPlugin.afterInstall(app);\r\n }\r\n } else {\r\n // 基础 Plugin 或函数式插件,保持原有行为\r\n if (typeof plugin === 'function') {\r\n (plugin as (app: App, ...options: unknown[]) => void)(app, ...options);\r\n } else if (plugin && typeof (plugin as any).install === 'function') {\r\n (plugin as any).install(app, ...options);\r\n }\r\n }\r\n installedPlugins.add(plugin);\r\n } catch (err) {\r\n error(\r\n `Plugin failed to install: ${typeof plugin === 'function' ? plugin.name || 'anonymous function' : (plugin as Plugin).install?.name || 'plugin'}: ${err}`,\r\n );\r\n throw err;\r\n }\r\n return app;\r\n },\r\n\r\n /**\r\n * 获取插件注册表实例\r\n * @description 提供对 PluginRegistry 的访问,用于高级插件管理\r\n */\r\n get _pluginRegistry() {\r\n return pluginRegistry;\r\n },\r\n\r\n /**\r\n * 获取插件验证器实例\r\n * @description 提供对 PluginValidator 的访问,用于自定义验证\r\n */\r\n get _pluginValidator() {\r\n return pluginValidator;\r\n },\r\n\r\n async mount(rootContainer: string | Element) {\r\n if (_isUnmounted) {\r\n throw new Error(\r\n `[LytJS] App has been unmounted and cannot be remounted. Create a new app instance instead.`,\r\n );\r\n }\r\n\r\n if (!rootComponent) {\r\n if (__DEV__) {\r\n warn('App.mount() expects a root component.');\r\n }\r\n return null;\r\n }\r\n\r\n if (context._container) {\r\n throw new Error(\r\n `[LytJS] App is already mounted. Call app.unmount() first before mounting again.`,\r\n );\r\n }\r\n\r\n const container =\r\n typeof rootContainer === 'string' ? document.querySelector(rootContainer) : rootContainer;\r\n\r\n if (!container) {\r\n throw new Error(\r\n `[LytJS] Failed to mount app: cannot find element matching selector \"${rootContainer}\". ` +\r\n `Make sure the target element exists in the DOM before calling app.mount().`,\r\n );\r\n }\r\n\r\n context._container = container;\r\n\r\n try {\r\n // 根据渲染模式选择不同的渲染路径\r\n if (effectiveMode === 'signal') {\r\n return mountWithSignalMode(container);\r\n }\r\n\r\n // 默认 VNode 模式\r\n return await mountWithVNodeMode(container);\r\n } catch (err) {\r\n if (app.errorHandler) {\r\n app.errorHandler(err, null, 'mount');\r\n } else {\r\n error(`[LytJS] Failed to mount app: ${err instanceof Error ? err.message : String(err)}`);\r\n }\r\n throw err;\r\n }\r\n },\r\n\r\n unmount() {\r\n // 清理全局事件监听器(document、window 等上注册的监听器)\r\n for (const listener of _globalListeners) {\r\n try {\r\n listener.target.removeEventListener(listener.event, listener.handler, listener.options);\r\n } catch (err) {\r\n // FIX: P2-41 错误日志不完整:添加更多上下文信息\r\n if (__DEV__) {\r\n warn(\r\n `Failed to remove global event listener \"${listener.event}\" ` +\r\n `from target ${listener.target.constructor.name}: ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n }\r\n }\r\n }\r\n _globalListeners.length = 0;\r\n\r\n // 清理插件资源:调用插件的 cleanup 方法(如果存在)\r\n // FIX: P2-40 使用 PluginWithCleanup 类型替代类型断言链\r\n for (const plugin of installedPlugins) {\r\n const pluginWithCleanup = plugin as PluginWithCleanup | PluginFunctionWithCleanup;\r\n if (typeof pluginWithCleanup?.cleanup === 'function') {\r\n try {\r\n pluginWithCleanup.cleanup();\r\n } catch (err) {\r\n // FIX: P2-41 错误日志不完整:添加更多上下文信息\r\n const pluginName =\r\n pluginWithCleanup.name ?? (typeof plugin === 'function' ? plugin.name : 'unknown');\r\n error(\r\n `Plugin cleanup failed for \"${pluginName}\": ${err instanceof Error ? err.message : String(err)}. ` +\r\n `This may cause memory leaks.`,\r\n );\r\n }\r\n }\r\n }\r\n installedPlugins.clear();\r\n\r\n if (effectiveMode === 'signal') {\r\n // Signal 模式卸载\r\n // FIX: P2-batch2-8 添加类型守卫,确保 rootComponent 是有效对象后再访问属性\r\n const componentOptions = rootComponent as Record<string, unknown>;\r\n if (componentOptions != null && typeof componentOptions === 'object') {\r\n const beforeUnmount = componentOptions.beforeUnmount as (() => void) | undefined;\r\n if (typeof beforeUnmount === 'function') {\r\n beforeUnmount.call(componentOptions);\r\n }\r\n }\r\n if (signalRenderer) {\r\n signalRenderer.unmount();\r\n signalRenderer = null;\r\n }\r\n // FIX: P1-40 Signal 模式卸载时清理容器 DOM 内容,\r\n // 避免卸载后残留的 DOM 元素导致内存泄漏和视觉异常\r\n if (context._container) {\r\n const container = context._container;\r\n while (container.firstChild) {\r\n container.removeChild(container.firstChild);\r\n }\r\n }\r\n const unmounted = componentOptions.unmounted as (() => void) | undefined;\r\n if (typeof unmounted === 'function') {\r\n unmounted.call(componentOptions);\r\n }\r\n } else {\r\n // VNode 模式卸载\r\n if (!context.renderer || !context._vnode) return;\r\n\r\n const instance = context._instance;\r\n if (instance) {\r\n callUnmountedHook(instance);\r\n }\r\n\r\n context.renderer.unmount(context._vnode);\r\n context._vnode = null;\r\n }\r\n\r\n // 标记 app 为已卸载\r\n _isUnmounted = true;\r\n _isMounted = false;\r\n\r\n context._container = null;\r\n\r\n // 清理 app context\r\n context.mixins.length = 0;\r\n context.components = {};\r\n context.directives = {};\r\n context.provides = {};\r\n\r\n // 清理 globalProperties\r\n context.config.globalProperties = {};\r\n\r\n context._instance = null;\r\n context.renderer = null;\r\n },\r\n\r\n provide(key, value) {\r\n if (__DEV__ && _isMounted) {\r\n warn(\r\n 'app.provide() cannot be called after the app has been mounted. ' +\r\n 'Register provides before calling app.mount().',\r\n );\r\n }\r\n // FIX: P1-41 inject symbol key 保持类型,使用 string | symbol 作为键类型\r\n context.provides[key as string | symbol] = value;\r\n return app;\r\n },\r\n\r\n inject<T = unknown>(key: string | symbol): T | undefined {\r\n // FIX: P1-41 inject symbol key 保持类型,支持 symbol 类型的键\r\n return context.provides[key as string | symbol] as T | undefined;\r\n },\r\n\r\n component(name, component) {\r\n // FIX: P2 运行时类型检查:确保 component 参数是有效的组件选项对象\r\n if (component != null && typeof component !== 'object' && typeof component !== 'function') {\r\n if (__DEV__) {\r\n warn(`app.component() expects an object or function, but received ${typeof component}.`);\r\n }\r\n return app;\r\n }\r\n context.components[name] = component as unknown as ComponentOptions;\r\n return app;\r\n },\r\n\r\n directive(name, directive) {\r\n context.directives[name] = directive;\r\n return app;\r\n },\r\n\r\n mixin(mixin) {\r\n context.mixins.push(mixin);\r\n return app;\r\n },\r\n\r\n /**\r\n * Register a global event listener that will be automatically cleaned up on unmount.\r\n * This ensures no leaked event listeners when the app is destroyed.\r\n */\r\n on(\r\n target: EventTarget,\r\n event: string,\r\n handler: EventListener,\r\n options?: AddEventListenerOptions,\r\n ) {\r\n target.addEventListener(event, handler, options);\r\n _globalListeners.push({ target, event, handler, options });\r\n return app;\r\n },\r\n\r\n /**\r\n * Remove a previously registered global event listener.\r\n * FIX: P2-v11-06 off() 使用引用相等性匹配 handler,\r\n * 这意味着传入的 handler 必须与 on() 注册时使用同一个函数引用。\r\n * 如果使用匿名函数或箭头函数,将无法匹配。请保存函数引用后再传入。\r\n */\r\n off(\r\n target: EventTarget,\r\n event: string,\r\n handler: EventListener,\r\n options?: AddEventListenerOptions,\r\n ) {\r\n target.removeEventListener(event, handler, options);\r\n const idx = _globalListeners.findIndex(\r\n (l) => l.target === target && l.event === event && l.handler === handler,\r\n );\r\n if (idx !== -1) {\r\n _globalListeners.splice(idx, 1);\r\n }\r\n return app;\r\n },\r\n };\r\n\r\n // ==================== VNode 模式挂载 ====================\r\n\r\n async function mountWithVNodeMode(container: Element): Promise<ComponentPublicInstance> {\r\n // 通过组件系统的标准流程创建根 vnode\r\n const rootVNode = createVNode(rootComponent, rootProps);\r\n\r\n // 使用标准化的组件系统创建组件实例\r\n const instance = createComponentInstance(rootVNode, null);\r\n\r\n // 替换 appContext:createComponentInstance 会创建新的空上下文\r\n // when parent is null, but we need the core-level context with plugins,\r\n // components, directives, and provides registered on the app.\r\n instance.appContext = context as ComponentAppContext;\r\n\r\n // Copy app-level provides into the root instance\r\n // FIX: P2-39 使用 Object.keys 替代 for...in,避免遍历到原型链上的属性\r\n if (context.provides) {\r\n const rootProvides = instance.provides;\r\n for (const key of Object.keys(context.provides)) {\r\n if (!(key in rootProvides)) {\r\n rootProvides[key] = context.provides[key];\r\n }\r\n }\r\n }\r\n\r\n // Set up the component (runs setup, init props/slots, data, lifecycle)\r\n setupComponent(instance);\r\n\r\n // 将组件实例存储到 vnode 上,以便 patch 时访问\r\n // FIX: DTS build error - 跨包 ComponentInternalInstance 类型不兼容(component vs common-vnode),\r\n // 使用类型断言绕过,运行时类型是正确的\r\n rootVNode.component = instance as unknown as typeof rootVNode.component;\r\n\r\n // 保存根实例引用,用于卸载生命周期钩子\r\n context._instance = instance;\r\n\r\n // 使用增强的渲染器进行渲染\r\n if (effectiveMode !== 'vnode') {\r\n throw new Error('[LytJS] Invalid renderer mode');\r\n }\r\n const domRendererFn = await getDOMRenderer();\r\n const renderer = domRendererFn!({\r\n setupChildComponent(childVNode: VNode, parentComponent: ComponentInternalInstance | null) {\r\n const childInstance = createComponentInstance(childVNode, parentComponent);\r\n // 从父组件或根组件继承 appContext\r\n if (parentComponent) {\r\n childInstance.appContext = parentComponent.appContext;\r\n } else {\r\n childInstance.appContext = context as ComponentAppContext;\r\n }\r\n setupComponent(childInstance);\r\n (childVNode as unknown as { component: ComponentInternalInstance }).component =\r\n childInstance;\r\n },\r\n normalizeProps(inst: ComponentInternalInstance, rawProps: Record<string, unknown> | null) {\r\n initProps(inst, rawProps);\r\n },\r\n }) as { mount: (vnode: VNode, container: Node) => void };\r\n // FIX: P2-batch2-7 跨包类型断言说明:\r\n // context.renderer 的类型为 Renderer | null(来自 core 包),\r\n // 而 DOMRenderer 类型定义在 dom 包中。此处通过 unknown 桥接是安全的,\r\n // 因为 renderer 实例在 createRenderer() 中已正确初始化为 DOMRenderer。\r\n context.renderer = renderer as unknown as CoreDOMRenderer;\r\n context._vnode = rootVNode;\r\n\r\n // 挂载 vnode\r\n renderer.mount(rootVNode, container);\r\n\r\n // 创建并返回公共实例\r\n const publicInstance = createComponentPublicInstance(instance);\r\n\r\n _isMounted = true;\r\n\r\n return publicInstance as ComponentPublicInstance;\r\n }\r\n\r\n // ==================== Signal 模式挂载 ====================\r\n\r\n async function mountWithSignalMode(container: Element): Promise<ComponentPublicInstance> {\r\n // FIX: P2-v11-07 Signal 模式下添加类型守卫,验证 rootComponent\r\n // 是否包含 template 属性,避免对非组件对象进行不安全的属性访问\r\n if (!rootComponent || typeof rootComponent !== 'object') {\r\n throw new Error(\r\n `[LytJS] Signal mode requires rootComponent to be a valid component options object.`,\r\n );\r\n }\r\n\r\n // Signal 模式下,rootComponent 应该包含 template 属性\r\n // 或者是一个包含 template 和 setup/data 的组件选项对象\r\n const componentOptions = rootComponent as Record<string, unknown>;\r\n const template = componentOptions.template as string | undefined;\r\n\r\n if (!template) {\r\n throw new Error(\r\n `[LytJS] Signal mode requires a template string in the root component. ` +\r\n `Provide a 'template' property in your component options.`,\r\n );\r\n }\r\n\r\n // 构建上下文对象:合并 data、setup 返回值和 props\r\n const ctx: Record<string, unknown> = { ...rootProps };\r\n\r\n // 执行 data 函数\r\n if (typeof componentOptions.data === 'function') {\r\n try {\r\n const dataResult = (componentOptions.data as () => Record<string, unknown>)();\r\n Object.assign(ctx, dataResult);\r\n } catch (e) {\r\n // FIX: P2-42 静默失败:确保错误被正确抛出而不是静默吞掉\r\n // FIX: P2-41 错误日志不完整:添加更多上下文信息\r\n const enhancedError = new Error(\r\n `[LytJS] Failed to execute data() in Signal mode: ${e instanceof Error ? e.message : String(e)}. ` +\r\n `Component: ${(rootComponent as Record<string, unknown>).name ?? 'anonymous'}`,\r\n );\r\n (enhancedError as Error & { cause: unknown }).cause = e;\r\n error(enhancedError.message);\r\n throw enhancedError;\r\n }\r\n }\r\n\r\n // 执行 setup 函数\r\n if (typeof componentOptions.setup === 'function') {\r\n try {\r\n const setupResult = (\r\n componentOptions.setup as (\r\n props: Record<string, unknown>,\r\n ctx: Record<string, unknown>,\r\n ) => unknown\r\n )(rootProps ?? {}, {});\r\n if (setupResult && typeof setupResult === 'object') {\r\n Object.assign(ctx, setupResult);\r\n }\r\n } catch (e) {\r\n // FIX: P2-42 静默失败:确保错误被正确抛出而不是静默吞掉\r\n // FIX: P2-41 错误日志不完整:添加更多上下文信息\r\n const enhancedError = new Error(\r\n `[LytJS] Failed to execute setup() in Signal mode: ${e instanceof Error ? e.message : String(e)}. ` +\r\n `Component: ${(rootComponent as Record<string, unknown>).name ?? 'anonymous'}`,\r\n );\r\n (enhancedError as Error & { cause: unknown }).cause = e;\r\n error(enhancedError.message);\r\n throw enhancedError;\r\n }\r\n }\r\n\r\n // 调用 beforeMount 生命周期钩子\r\n const beforeMount = componentOptions.beforeMount as (() => void) | undefined;\r\n if (typeof beforeMount === 'function') {\r\n beforeMount.call(ctx);\r\n }\r\n\r\n // 创建 Signal 渲染器\r\n const signalRendererFn = await getSignalRenderer();\r\n signalRenderer = await signalRendererFn(template, ctx);\r\n signalRenderer.render(container);\r\n\r\n _isMounted = true;\r\n\r\n // 调用 mounted 生命周期钩子\r\n const mounted = componentOptions.mounted as (() => void) | undefined;\r\n if (typeof mounted === 'function') {\r\n mounted.call(ctx);\r\n }\r\n\r\n // Signal 模式返回一个简化的公共实例\r\n // 通过 Proxy 实现对 ctx 的访问\r\n return new Proxy({} as ComponentPublicInstance, {\r\n get(_, key: string | symbol) {\r\n if (key === '$el') return container;\r\n if (key === '$options') return componentOptions;\r\n return (ctx as Record<string | symbol, unknown>)[key];\r\n },\r\n set(_, key: string | symbol, value: unknown) {\r\n (ctx as Record<string | symbol, unknown>)[key] = value;\r\n return true;\r\n },\r\n }) as ComponentPublicInstance;\r\n }\r\n\r\n return app;\r\n}\r\n","// src/h.ts\r\n// @lytjs/core - VNode 创建辅助函数\r\n\r\nimport {\r\n createVNode,\r\n type Fragment,\r\n type Text,\r\n type Comment,\r\n type VNodeTypes,\r\n EMPTY_OBJ,\r\n} from '@lytjs/vdom';\r\nimport type { VNode, VNodeChildren, Component } from './types';\r\n\r\n// ============================================================\r\n// h() function overloads for type-safe VNode creation\r\n// ============================================================\r\n\r\n// Overload 1: h(type) - no props, no children\r\n// FIX: v7-P1-12 h() children 合并逻辑:确保嵌套数组被正确展平\r\nexport function h(type: string): VNode;\r\nexport function h(type: Component): VNode;\r\nexport function h(type: typeof Fragment): VNode;\r\nexport function h(type: typeof Text): VNode;\r\nexport function h(type: typeof Comment): VNode;\r\n\r\n// Overload 2: h(type, props) - with props, no children\r\nexport function h<P = Record<string, unknown>>(type: string, props: P | null): VNode;\r\nexport function h<P = Record<string, unknown>>(type: Component, props: P | null): VNode;\r\nexport function h(type: typeof Fragment, props: Record<string, unknown> | null): VNode;\r\nexport function h(type: typeof Text, props: Record<string, unknown> | null): VNode;\r\nexport function h(type: typeof Comment, props: Record<string, unknown> | null): VNode;\r\n\r\n// Overload 3: h(type, props, ...children) - with props and children\r\nexport function h<P = Record<string, unknown>>(\r\n type: string,\r\n props: P | null,\r\n ...children: VNodeChildren[]\r\n): VNode;\r\nexport function h<P = Record<string, unknown>>(\r\n type: Component,\r\n props: P | null,\r\n ...children: VNodeChildren[]\r\n): VNode;\r\nexport function h(\r\n type: typeof Fragment,\r\n props: Record<string, unknown> | null,\r\n ...children: VNodeChildren[]\r\n): VNode;\r\nexport function h(\r\n type: typeof Text,\r\n props: Record<string, unknown> | null,\r\n ...children: VNodeChildren[]\r\n): VNode;\r\nexport function h(\r\n type: typeof Comment,\r\n props: Record<string, unknown> | null,\r\n ...children: VNodeChildren[]\r\n): VNode;\r\n\r\n// 实现\r\nexport function h(\r\n type: string | Component | typeof Fragment | typeof Text | typeof Comment,\r\n props?: Record<string, unknown> | null,\r\n ...children: VNodeChildren[]\r\n): VNode {\r\n if (props == null) {\r\n props = EMPTY_OBJ;\r\n }\r\n\r\n // FIX: v7-P1-12 h() children 合并逻辑:递归展平嵌套数组,避免丢失嵌套子节点\r\n // 注意:children.flat(Infinity) 会递归展平所有嵌套数组。\r\n // 这意味着如果 children 中包含非 VNode 的数组(如 props 数组),\r\n // 这些数组也会被展平。调用方应确保 children 中只包含 VNode 或原始值。\r\n const flatChildren =\r\n children.length > 1\r\n ? children.flat(Infinity)\r\n : Array.isArray(children[0])\r\n ? children[0].flat(Infinity)\r\n : children[0];\r\n\r\n // 类型断言说明:flat(Infinity) 返回 unknown[],但 VNodeChildren 类型为\r\n // VNodeChild | VNodeChildren[],两者在运行时结构一致。\r\n // 通过 unknown 桥接是因为 TypeScript 无法自动推导递归展平后的类型与 VNodeChildren 的兼容性。\r\n return createVNode(type as VNodeTypes, props, flatChildren as unknown as VNodeChildren);\r\n}\r\n\r\n/**\r\n * createElement 是 h 的别名\r\n */\r\nexport { h as createElement };\r\n","// src/define-component.ts\r\n// @lytjs/core - 组件定义\r\n\r\nimport type { Component, AsyncComponentLoader, AsyncComponentOptions, VNode } from './types';\r\nimport type { ComponentOptions } from './types';\r\nimport { defineComponent as _defineComponent, onBeforeUnmount } from '@lytjs/component';\r\nimport { shallowRef, ref } from '@lytjs/reactivity';\r\nimport { warn } from '@lytjs/common-error';\r\nimport { h } from './h';\r\n\r\n/** onError 回调未响应时的默认超时时间(毫秒) */\r\nconst DEFAULT_ON_ERROR_TIMEOUT = 30000;\r\n\r\n/**\r\n * 定义组件(re-export from @lytjs/component)\r\n *\r\n * 权威实现在 @lytjs/component 中,此处统一返回类型为 ComponentOptions。\r\n * 由于 Component = ComponentOptions | (() => any),\r\n * 返回 ComponentOptions 是 Component 的子集,完全兼容。\r\n */\r\nexport const defineComponent: (options: ComponentOptions) => ComponentOptions = _defineComponent;\r\n\r\n/**\r\n * 定义异步组件\r\n */\r\nexport function defineAsyncComponent(\r\n source: AsyncComponentLoader | AsyncComponentOptions,\r\n): Component {\r\n if (typeof source === 'function') {\r\n source = { loader: source };\r\n }\r\n\r\n const { loader, loadingComponent, errorComponent, delay = 200, timeout, onError } = source;\r\n\r\n const loadedComponent = shallowRef<Component | undefined>(undefined);\r\n const error = ref<Error | undefined>(undefined);\r\n const loading = ref<boolean>(false);\r\n let retries = 0;\r\n let showLoading = false;\r\n let delayTimer: ReturnType<typeof setTimeout> | null = null;\r\n let loadingPromise: Promise<Component> | null = null;\r\n\r\n const MAX_RETRIES = 3;\r\n const retry = (): Promise<Component> | void => {\r\n if (retries >= MAX_RETRIES) {\r\n if (__DEV__) {\r\n warn(`AsyncComponent: max retries (${MAX_RETRIES}) exceeded.`);\r\n }\r\n error.value = new Error(\r\n `[lytjs/core] AsyncComponent: max retries (${MAX_RETRIES}) exceeded.`,\r\n );\r\n // FIX: P0-09 retry 耗尽后返回 Promise.reject,确保 Promise 链正确 settle,\r\n // 避免调用方永远等待一个不会 resolve/reject 的 Promise\r\n return Promise.reject(error.value);\r\n }\r\n retries++;\r\n loadedComponent.value = undefined;\r\n error.value = undefined;\r\n loadingPromise = null;\r\n startTimeout();\r\n return load();\r\n };\r\n\r\n const load = (): Promise<Component> => {\r\n // 防止重复并发加载\r\n if (loadingPromise) return loadingPromise as Promise<Component>;\r\n\r\n loading.value = true;\r\n showLoading = false;\r\n if (delayTimer) clearTimeout(delayTimer);\r\n delayTimer = setTimeout(() => {\r\n showLoading = true;\r\n }, delay);\r\n return (loadingPromise = Promise.resolve(loader())\r\n .then((comp) => {\r\n // FIX: P2-v11-15 验证 loader() 返回值,确保是有效的组件定义\r\n // FIX: P2-batch2-9 添加括号明确运算符优先级,避免 && 和 || 混合使用时的歧义\r\n if (comp == null || (typeof comp !== 'object' && typeof comp !== 'function')) {\r\n throw new Error(\r\n `[lytjs/core] AsyncComponent: loader() returned an invalid component value: ${String(comp)}. ` +\r\n `Expected a component options object or function.`,\r\n );\r\n }\r\n loadedComponent.value = comp;\r\n error.value = undefined;\r\n loading.value = false;\r\n loadingPromise = null;\r\n if (delayTimer) {\r\n clearTimeout(delayTimer);\r\n delayTimer = null;\r\n }\r\n showLoading = false;\r\n // load 成功后清除 timeout,避免不必要的超时回调\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n return comp;\r\n })\r\n .catch((err): Promise<Component> => {\r\n error.value = err;\r\n loading.value = false;\r\n if (onError) {\r\n return new Promise<Component>((resolve, reject) => {\r\n let settled = false;\r\n const ON_ERROR_TIMEOUT = DEFAULT_ON_ERROR_TIMEOUT;\r\n const timer = setTimeout(() => {\r\n if (!settled) {\r\n settled = true;\r\n reject(\r\n new Error(\r\n `[lytjs/core] AsyncComponent: onError callback did not call retry() or reject() within ${ON_ERROR_TIMEOUT / 1000}s.`,\r\n ),\r\n );\r\n }\r\n }, ON_ERROR_TIMEOUT);\r\n onError(\r\n err,\r\n () => {\r\n if (!settled) {\r\n settled = true;\r\n clearTimeout(timer);\r\n const result = retry();\r\n if (result) resolve(result);\r\n }\r\n },\r\n (reason?: unknown) => {\r\n if (!settled) {\r\n settled = true;\r\n clearTimeout(timer);\r\n reject(reason ?? err);\r\n }\r\n },\r\n retries,\r\n );\r\n });\r\n }\r\n return Promise.reject(err);\r\n }));\r\n };\r\n\r\n // 超时处理:封装为函数以便 retry 时重新设置\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n const startTimeout = () => {\r\n if (timeout == null) return;\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n if (!loadedComponent.value && !error.value) {\r\n error.value = new Error(`[lytjs/core] AsyncComponent timed out after ${timeout}ms.`);\r\n loading.value = false;\r\n }\r\n }, timeout);\r\n };\r\n startTimeout();\r\n\r\n // 延迟加载:在组件首次渲染时触发,而非立即加载\r\n // load();\r\n\r\n const comp: ComponentOptions = {\r\n name: 'AsyncComponent',\r\n setup() {\r\n const instance = {\r\n resolved: loadedComponent,\r\n loading,\r\n error,\r\n delay,\r\n timeout,\r\n };\r\n\r\n onBeforeUnmount(() => {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n if (delayTimer !== null) {\r\n clearTimeout(delayTimer);\r\n delayTimer = null;\r\n }\r\n });\r\n\r\n // 在 setup 阶段触发加载,避免 render 中触发副作用\r\n if (!loadedComponent.value && !error.value && !loading.value) {\r\n load();\r\n }\r\n\r\n return instance;\r\n },\r\n render(): VNode | null {\r\n if (loadedComponent.value) {\r\n return h(loadedComponent.value);\r\n }\r\n if (error.value && errorComponent) {\r\n return h(errorComponent);\r\n }\r\n if (showLoading && loadingComponent) {\r\n return h(loadingComponent);\r\n }\r\n return null;\r\n },\r\n } as ComponentOptions;\r\n\r\n return comp as Component;\r\n}\r\n","export { nextTick } from '@lytjs/common-scheduler';\r\n","// src/resolve.ts\r\n// @lytjs/core - 组件/指令解析\r\n\r\nimport type { Component, Directive } from './types';\r\nimport { getCurrentInstance } from '@lytjs/component';\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n/**\r\n * Common native HTML elements that should not trigger resolution warnings.\r\n */\r\nconst HTML_ELEMENTS = new Set([\r\n // 结构元素\r\n 'div',\r\n 'span',\r\n 'p',\r\n 'a',\r\n 'img',\r\n 'input',\r\n 'button',\r\n 'form',\r\n 'table',\r\n 'ul',\r\n 'ol',\r\n 'li',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'header',\r\n 'footer',\r\n 'nav',\r\n 'section',\r\n 'article',\r\n 'main',\r\n 'aside',\r\n // 文本元素\r\n 'br',\r\n 'hr',\r\n 'pre',\r\n 'code',\r\n 'blockquote',\r\n 'strong',\r\n 'em',\r\n 'i',\r\n 'b',\r\n 'u',\r\n 's',\r\n 'small',\r\n 'sub',\r\n 'sup',\r\n 'label',\r\n 'abbr',\r\n 'cite',\r\n 'dfn',\r\n 'kbd',\r\n 'mark',\r\n 'q',\r\n 'samp',\r\n 'var',\r\n 'wbr',\r\n // 表单元素\r\n 'select',\r\n 'option',\r\n 'textarea',\r\n 'optgroup',\r\n 'fieldset',\r\n 'legend',\r\n 'datalist',\r\n 'output',\r\n 'progress',\r\n 'meter',\r\n // 媒体元素\r\n 'picture',\r\n 'video',\r\n 'audio',\r\n 'source',\r\n 'track',\r\n 'canvas',\r\n 'map',\r\n 'area',\r\n 'svg',\r\n // 交互元素\r\n 'details',\r\n 'summary',\r\n 'dialog',\r\n // 模板/插槽\r\n 'template',\r\n 'slot',\r\n // 脚本/样式/元数据\r\n 'script',\r\n 'style',\r\n 'link',\r\n 'meta',\r\n 'title',\r\n 'head',\r\n 'body',\r\n 'html',\r\n 'noscript',\r\n // 表格子元素\r\n 'thead',\r\n 'tbody',\r\n 'tfoot',\r\n 'tr',\r\n 'th',\r\n 'td',\r\n 'caption',\r\n 'colgroup',\r\n 'col',\r\n // 列表子元素\r\n 'dl',\r\n 'dt',\r\n 'dd',\r\n // 其他\r\n 'figure',\r\n 'figcaption',\r\n 'iframe',\r\n 'object',\r\n 'embed',\r\n 'param',\r\n 'time',\r\n 'data',\r\n 'ruby',\r\n 'rt',\r\n 'rp',\r\n 'bdi',\r\n 'bdo',\r\n 'ins',\r\n 'del',\r\n]);\r\n\r\n/**\r\n * 解析组件:从当前组件实例的 components 选项和全局注册中查找\r\n */\r\nexport function resolveComponent(name: string): Component | undefined {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warn(\r\n `resolveComponent(\"${name}\") was called outside of a component setup function. ` +\r\n `Global components will not be resolved.`,\r\n );\r\n }\r\n return undefined;\r\n }\r\n\r\n // 1. 先从当前组件的 components 选项中查找\r\n const components = (instance.type as Record<string, unknown>)?.components;\r\n if (components && (components as Record<string, Component>)[name]) {\r\n return (components as Record<string, Component>)[name];\r\n }\r\n\r\n // 2. 再从全局注册中查找(appContext.components)\r\n const globalComponents = instance.appContext?.components;\r\n if (globalComponents && globalComponents[name]) {\r\n return globalComponents[name] as Component;\r\n }\r\n\r\n if (__DEV__) {\r\n if (!HTML_ELEMENTS.has(name)) {\r\n warn(\r\n `Failed to resolve component \"${name}\". ` +\r\n `If this is a native HTML element, register it as a component.`,\r\n );\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * 解析指令:从当前组件实例的 directives 选项和全局注册中查找\r\n */\r\nexport function resolveDirective(name: string): Directive | undefined {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warn(\r\n `resolveDirective(\"${name}\") was called outside of a component setup function. ` +\r\n `Global directives will not be resolved.`,\r\n );\r\n }\r\n return undefined;\r\n }\r\n\r\n // 1. 先从当前组件的 directives 选项中查找\r\n const directives = (instance.type as Record<string, unknown>)?.directives;\r\n if (directives && (directives as Record<string, Directive>)[name]) {\r\n return (directives as Record<string, Directive>)[name];\r\n }\r\n\r\n // 2. 再从全局注册中查找(appContext.directives)\r\n const globalDirectives = instance.appContext?.directives;\r\n if (globalDirectives && globalDirectives[name]) {\r\n return globalDirectives[name] as Directive;\r\n }\r\n\r\n if (__DEV__) {\r\n warn(`Failed to resolve directive \"${name}\".`);\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * 解析动态组件:\r\n * - 如果 tag 是字符串,尝试从 appContext.components 中解析已注册组件,\r\n * 如果找不到则返回原始字符串(可能是原生 HTML 元素)\r\n * - 如果 tag 已经是组件对象,直接返回\r\n */\r\nexport function resolveDynamicComponent(tag: string | Component): Component | string {\r\n if (typeof tag === 'string') {\r\n // 尝试从已注册组件中解析\r\n const resolved = resolveComponent(tag);\r\n return resolved ?? tag;\r\n }\r\n return tag;\r\n}\r\n","// src/directives.ts\r\n// @lytjs/core - 指令辅助函数\r\n//\r\n// FIX: P2-38 指令生命周期钩子文档:\r\n// 自定义指令支持以下生命周期钩子:\r\n// - created:元素创建后、挂载前调用\r\n// - beforeMount:元素挂载前调用\r\n// - mounted:元素挂载后调用\r\n// - beforeUpdate:元素更新前调用\r\n// - updated:元素更新后调用\r\n// - beforeUnmount:元素卸载前调用\r\n// - unmounted:元素卸载后调用\r\n\r\nimport { cloneVNode } from '@lytjs/vdom';\r\nimport { isArray } from '@lytjs/common-is';\r\nimport type { VNode, DirectiveArguments, Directive } from './types';\r\n\r\n/** 扩展 VNode 类型以支持指令存储 */\r\ninterface DirectiveVNode extends VNode {\r\n _directives?: DirectiveArguments;\r\n}\r\n\r\n/**\r\n * 将指令应用到 VNode 上。\r\n * 当指令带有 deep: true 选项时,递归遍历子 VNode 并应用指令。\r\n * FIX: P1-44 简化类型转换链,使用中间接口 DirectiveEntry 替代多层 as unknown as\r\n */\r\ninterface DirectiveEntry {\r\n dir: Directive & { deep?: boolean };\r\n value: unknown;\r\n arg: unknown;\r\n modifiers: Record<string, boolean>;\r\n}\r\n\r\nexport function withDirectives(vnode: VNode, directives: DirectiveArguments): VNode {\r\n const dirVNode = cloneVNode(vnode) as DirectiveVNode;\r\n // FIX: P1-44 使用 DirectiveEntry 中间类型简化类型转换\r\n // FIX: P2-v11-12 定义正确的类型转换函数,替代 as unknown as DirectiveArguments\r\n const normalizedDirectives: DirectiveArguments = directives.map(\r\n ([dir, value, arg, modifiers]): DirectiveArguments[0] => [\r\n dir,\r\n value,\r\n arg as string | undefined,\r\n (modifiers as Record<string, boolean>) || {},\r\n ],\r\n );\r\n dirVNode._directives = normalizedDirectives.map(\r\n ([dir, value, arg, modifiers]): DirectiveEntry => ({\r\n dir: dir as Directive & { deep?: boolean },\r\n value,\r\n arg,\r\n modifiers: modifiers ?? {},\r\n }),\r\n ) as unknown as DirectiveArguments;\r\n // FIX: P2-batch2-10 类型断言说明:\r\n // normalizedDirectives 的元素类型为 DirectiveEntry(四元组),\r\n // 而 _directives 的声明类型为 DirectiveArguments。两者结构一致,\r\n // 但 TypeScript 无法自动推导数组 map 返回类型与目标类型的兼容性,\r\n // 因此需要通过 unknown 桥接。\r\n\r\n // 处理 deep 选项:递归将指令应用到子 VNode\r\n for (const dirEntry of dirVNode._directives) {\r\n const dirObj = dirEntry as unknown as DirectiveEntry;\r\n if (dirObj.dir.deep) {\r\n applyDirectiveDeep(dirVNode, [\r\n dirObj.dir,\r\n dirObj.value,\r\n dirObj.arg as string | undefined,\r\n dirObj.modifiers,\r\n ]);\r\n }\r\n }\r\n\r\n return dirVNode;\r\n}\r\n\r\n/**\r\n * 递归地将指令应用到子 VNode。\r\n * 遍历 VNode 的 children(数组或单个子节点),为每个子 VNode\r\n * 附加相同的指令引用。\r\n * FIX: P2-v11-13 添加 visited Set 防止循环引用导致无限递归\r\n */\r\nfunction applyDirectiveDeep(vnode: DirectiveVNode, directive: DirectiveArguments[0]): void {\r\n const children = vnode.children;\r\n if (!children) return;\r\n\r\n // FIX: P2-v11-13 使用 visited Set 跟踪已处理的 VNode,\r\n // 防止循环引用(如 VNode.children 包含自身)导致栈溢出\r\n const visited = new Set<DirectiveVNode>();\r\n visited.add(vnode);\r\n\r\n const childArray = isArray(children) ? children : [children];\r\n\r\n for (const child of childArray) {\r\n if (!child || typeof child !== 'object') continue;\r\n\r\n const childVNode = child as DirectiveVNode;\r\n\r\n // 跳过已处理的 VNode,防止循环引用\r\n if (visited.has(childVNode)) continue;\r\n visited.add(childVNode);\r\n\r\n // 为子 VNode 附加指令\r\n if (!childVNode._directives) {\r\n childVNode._directives = [];\r\n }\r\n childVNode._directives.push(directive);\r\n\r\n // 递归处理子 VNode 的子节点\r\n applyDirectiveDeep(childVNode, directive);\r\n }\r\n}\r\n\r\n/** Memo 缓存条目 */\r\ninterface MemoEntry {\r\n memo: unknown[];\r\n result: VNode;\r\n}\r\n\r\n/**\r\n * 带缓存的渲染辅助\r\n */\r\nexport function withMemo(\r\n memo: unknown[],\r\n render: () => VNode,\r\n cache: MemoEntry[],\r\n index: number,\r\n): VNode {\r\n if (index < 0 || index >= cache.length) {\r\n // Index out of bounds - render and write to cache\r\n const result = render();\r\n cache[index] = { memo, result };\r\n return result;\r\n }\r\n const cached = cache[index];\r\n if (cached && isMemoSame(cached.memo, memo)) {\r\n return cached.result;\r\n }\r\n const result = render();\r\n cache[index] = { memo, result };\r\n return result;\r\n}\r\n\r\nfunction isMemoSame(prev: unknown[], next: unknown[]): boolean {\r\n if (prev.length !== next.length) return false;\r\n for (let i = 0; i < prev.length; i++) {\r\n if (prev[i] !== next[i]) return false;\r\n }\r\n return true;\r\n}\r\n","// src/composition.ts\r\n// @lytjs/core - Composition API 辅助函数\r\n\r\nimport { getCurrentInstance, onMounted } from '@lytjs/component';\r\nimport { computed, shallowRef, watch, watchEffect, readonly, onScopeDispose } from '@lytjs/reactivity';\r\nimport { warnOnce } from '@lytjs/common-error';\r\nimport type { WritableComputedRef, Ref } from '@lytjs/reactivity';\r\nimport type { InternalSlots } from './types';\r\n\r\n/**\r\n * 获取当前组件的 slots\r\n * FIX: P2-37 useSlots 类型安全增强:\r\n * 返回的 InternalSlots 类型确保 slot 函数的参数和返回值类型正确\r\n */\r\nexport function useSlots(): InternalSlots {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warnOnce('useSlots() called without an active component instance.');\r\n }\r\n return {} as InternalSlots;\r\n }\r\n return instance.slots || ({} as InternalSlots);\r\n}\r\n\r\n/**\r\n * 获取当前组件的 attrs\r\n */\r\nexport function useAttrs(): Record<string, unknown> {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warnOnce('useAttrs() was called outside of setup().');\r\n }\r\n return {};\r\n }\r\n return instance.attrs || {};\r\n}\r\n\r\n/**\r\n * 双向绑定辅助(v-model 的 composition API 版本)\r\n */\r\nexport function useModel<T>(\r\n props: Record<string, T | undefined>,\r\n key: string,\r\n): WritableComputedRef<T> {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n // FIX: P1-43 useModel 无实例时添加 DEV 警告,\r\n // 提醒开发者 useModel 必须在 setup() 中调用\r\n if (__DEV__) {\r\n warnOnce(`useModel(\"${key}\") was called outside of setup(). The model will not be reactive.`);\r\n }\r\n return computed<T>({\r\n get() {\r\n return undefined as T;\r\n },\r\n set() {\r\n // no-op when outside setup\r\n },\r\n });\r\n }\r\n\r\n return computed<T>({\r\n get() {\r\n return props[key] as T;\r\n },\r\n set(newValue: T) {\r\n instance.emit(`update:${key}`, newValue);\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * defineModel 运行时实现。\r\n * Vue 3.4+ 新增的编译器宏,在 lytjs 中以运行时函数形式提供。\r\n *\r\n * 用法:\r\n * const modelValue = defineModel() // 默认 'modelValue'\r\n * const title = defineModel('title') // 命名 model\r\n * const count = defineModel('count', { default: 0 }) // 带默认值\r\n *\r\n * 返回一个 WritableComputedRef,读取时返回 prop 值,写入时触发 update 事件。\r\n */\r\n// FIX: P1-45 默认泛型从 any 改为 unknown,提供更好的类型安全性\r\nexport function defineModel<T = unknown>(\r\n name?: string,\r\n options?: {\r\n default?: T;\r\n required?: boolean;\r\n type?: unknown;\r\n transform?: (value: T) => T;\r\n },\r\n): WritableComputedRef<T> {\r\n const instance = getCurrentInstance();\r\n const modelName = name ?? 'modelValue';\r\n\r\n if (!instance) {\r\n if (__DEV__) {\r\n warnOnce('defineModel() was called outside of setup().');\r\n }\r\n return computed<T>({\r\n get() {\r\n return options?.default as T;\r\n },\r\n set() {\r\n // no-op when outside setup\r\n },\r\n });\r\n }\r\n\r\n // 从 instance.props 中读取 model 值\r\n const props = instance.props as Record<string, T | undefined>;\r\n\r\n return computed<T>({\r\n get() {\r\n const value = props[modelName];\r\n if (value === undefined) {\r\n // required 校验:值为 undefined 且无默认值时发出警告\r\n if (__DEV__ && options?.required && options?.default === undefined) {\r\n warnOnce(\r\n `defineModel() \"${modelName}\" is marked as required but its value is undefined.`,\r\n );\r\n }\r\n return options?.default as T;\r\n }\r\n return value;\r\n },\r\n set(newValue: T) {\r\n // transform: 在 emit 前对值进行转换\r\n const emitValue = options?.transform ? options.transform(newValue) : newValue;\r\n instance.emit(`update:${modelName}`, emitValue);\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * 获取模板引用的 ref。\r\n * 通过 key 从组件实例的 refs 中获取对应的 DOM 元素或组件实例。\r\n * 使用 watch 持续追踪 refs 变化,确保响应式同步。\r\n * Vue 3.5+ 新增组合式 API。\r\n */\r\n// FIX: P1-45 默认泛型从 any 改为 unknown,提供更好的类型安全性\r\nexport function useTemplateRef<T = unknown>(key: string): Ref<T | null> {\r\n const instance = getCurrentInstance();\r\n const ref = shallowRef<T | null>(null);\r\n\r\n if (instance) {\r\n // 使用 watch 持续追踪 instance.refs[key] 的变化,\r\n // 支持 v-if 等动态绑定场景下 ref 的响应式更新。\r\n const stop = watch(\r\n () => (instance.refs as Record<string, T | null>)[key] ?? null,\r\n (newVal) => {\r\n ref.value = newVal;\r\n },\r\n { immediate: true, flush: 'pre' },\r\n );\r\n onScopeDispose(stop);\r\n } else if (__DEV__) {\r\n warnOnce('useTemplateRef() was called outside of setup().');\r\n }\r\n\r\n return ref;\r\n}\r\n\r\n// ==================== useId ====================\r\n\r\n/**\r\n * 生成高熵随机字符串作为 ID 后缀\r\n * FIX: P2-38 使用 crypto.randomUUID 或高熵随机数替代简单计数器,防止 ID 冲突\r\n */\r\nfunction generateIdSuffix(): string {\r\n // 优先使用 crypto.randomUUID(如果可用)\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID().slice(0, 8);\r\n }\r\n // 回退:使用高熵随机数(36进制,8位字符)\r\n return Math.random().toString(36).slice(2, 10);\r\n}\r\n\r\n/**\r\n * WeakMap to store per-instance ID counters, avoiding private property pollution.\r\n */\r\nconst instanceIdMap = new WeakMap<object, Map<string, number>>();\r\n\r\n/**\r\n * 生成应用范围内唯一的 ID。\r\n * Vue 3.5 新增的组合式 API,用于生成可预测的唯一标识符,\r\n * 特别适用于无障碍属性(aria-*)和表单元素关联。\r\n *\r\n * 每个组件实例会获得一个基于组件 uid 的 ID 前缀,\r\n * 确保同一组件在不同位置渲染时产生不同的 ID。\r\n *\r\n * FIX: P2-38 使用高熵随机数替代全局计数器,防止多实例/多窗口场景下的 ID 冲突\r\n */\r\nexport function useId(): Readonly<Ref<string>> {\r\n const instance = getCurrentInstance();\r\n const id = shallowRef('');\r\n\r\n if (instance) {\r\n // 使用组件 uid 作为前缀,确保组件级别的唯一性\r\n const prefix = `lyt-${instance.uid}`;\r\n // 使用 WeakMap 存储每个实例的 ID 计数器,避免私有属性依赖\r\n let map = instanceIdMap.get(instance);\r\n if (!map) {\r\n map = new Map<string, number>();\r\n instanceIdMap.set(instance, map);\r\n }\r\n const counter = (map.get('useId') ?? 0) + 1;\r\n map.set('useId', counter);\r\n // 添加高熵随机后缀,防止跨实例 ID 冲突\r\n id.value = `${prefix}-${counter}-${generateIdSuffix()}`;\r\n } else {\r\n // 降级:使用高熵随机数替代全局计数器\r\n id.value = `lyt-${generateIdSuffix()}`;\r\n }\r\n\r\n return readonly(id) as unknown as Readonly<Ref<string>>;\r\n}\r\n\r\n// ==================== useCssModule / useCssVars ====================\r\n\r\n/**\r\n * WeakMap to store per-instance CSS module mappings, avoiding private property pollution.\r\n */\r\nconst instanceCssModulesMap = new WeakMap<object, Record<string, Record<string, string>>>();\r\n\r\n/**\r\n * 获取单文件组件中 CSS Modules 的类名映射。\r\n * 在 SFC 中,`<style module>` 块会被编译为 CSS Modules,\r\n * useCssModule 返回一个包含局部类名到全局类名映射的对象。\r\n *\r\n * @param name - CSS Modules 的名称,默认为 '$style'\r\n */\r\nexport function useCssModule(name = '$style'): Record<string, string> {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warnOnce('useCssModule() was called outside of setup().');\r\n }\r\n return {};\r\n }\r\n\r\n // CSS Modules 的类名映射通过 WeakMap 存储,避免私有属性依赖\r\n const modules = instanceCssModulesMap.get(instance);\r\n return modules?.[name] ?? {};\r\n}\r\n\r\n/**\r\n * 在组件实例上注册 CSS Modules 映射(供 SFC 编译器调用)。\r\n * 替代直接设置 instance.cssModules 的方式。\r\n */\r\nexport function registerCssModules(\r\n instance: object,\r\n name: string,\r\n mapping: Record<string, string>,\r\n): void {\r\n let modules = instanceCssModulesMap.get(instance);\r\n if (!modules) {\r\n modules = {};\r\n instanceCssModulesMap.set(instance, modules);\r\n }\r\n modules[name] = mapping;\r\n}\r\n\r\n/**\r\n * 在组件实例上设置 CSS 自定义属性(CSS Variables)。\r\n * 提供响应式的方式来管理 CSS 变量。\r\n *\r\n * @param vars - 一个函数,返回包含 CSS 变量键值对的对象\r\n *\r\n * 用法:\r\n * useCssVars(() => ({\r\n * color: themeColor.value,\r\n * fontSize: size.value + 'px',\r\n * }))\r\n */\r\nexport function useCssVars(vars: () => Record<string, string>): void {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warnOnce('useCssVars() was called outside of setup().');\r\n }\r\n return;\r\n }\r\n\r\n // 在 mounted 和 updated 时将 CSS 变量设置到组件根元素上\r\n const updateStyle = (): void => {\r\n const el = instance.vnode?.el as HTMLElement | null;\r\n if (!el) return;\r\n\r\n const varsObj = vars();\r\n for (const [key, value] of Object.entries(varsObj)) {\r\n const cssVar = key.startsWith('--') ? key : `--${key}`;\r\n el.style.setProperty(cssVar, value);\r\n }\r\n };\r\n\r\n onMounted(updateStyle);\r\n\r\n // 使用 watchEffect 自动追踪 vars() 中的响应式依赖\r\n const stop = watchEffect(updateStyle);\r\n\r\n // FIX: P2-v11-10 useCssVars 卸载时清理组件根元素上设置的 CSS 变量,\r\n // 避免卸载后残留的 CSS 变量影响其他组件或导致内存泄漏\r\n onScopeDispose(() => {\r\n stop();\r\n const el = instance.vnode?.el as HTMLElement | null;\r\n if (el) {\r\n const varsObj = vars();\r\n for (const key of Object.keys(varsObj)) {\r\n const cssVar = key.startsWith('--') ? key : `--${key}`;\r\n el.style.removeProperty(cssVar);\r\n }\r\n }\r\n });\r\n}\r\n","// src/web-component.ts\r\n// @lytjs/core - Web Component 支持\r\n\r\nimport { createVNode } from '@lytjs/vdom';\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { createDOMRenderer } from '@lytjs/renderer';\r\nimport {\r\n createComponentInstance,\r\n setupComponent,\r\n callUnmountedHook,\r\n createAppContext,\r\n} from '@lytjs/component';\r\nimport type { ComponentOptions, ComponentInternalInstance, AppContext } from '@lytjs/component';\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// ==================== 类型定义 ====================\r\n\r\n/**\r\n * defineCustomElement 的配置选项\r\n */\r\nexport interface DefineCustomElementOptions {\r\n /** 是否使用 Shadow DOM(默认 true) */\r\n shadowRoot?: boolean;\r\n /** Custom Element 标签名(默认使用组件 name) */\r\n name?: string;\r\n /** CSS 样式(注入到 Shadow DOM) */\r\n css?: string;\r\n}\r\n\r\n// ==================== 内部状态 ====================\r\n\r\n/**\r\n * Per-instance context stored in a WeakMap so that multiple Custom Element\r\n * instances can coexist without clobbering each other's state.\r\n */\r\ninterface ElementContext {\r\n shadowRoot: ShadowRoot | null;\r\n host: HTMLElement;\r\n slotCallback: (() => void) | null;\r\n}\r\n\r\nconst elementContextMap = new WeakMap<HTMLElement, ElementContext>();\r\n\r\n/**\r\n * Stack of host elements currently being set up.\r\n * Since connectedCallback -> setupComponent is synchronous, the top of the\r\n * stack always refers to the element whose setup() is currently executing.\r\n * This replaces the old module-level _currentHost / _currentShadowRoot\r\n * variables and supports nested/re-entrant scenarios correctly.\r\n */\r\nconst setupStack: HTMLElement[] = [];\r\n\r\n/**\r\n * Get or create the context entry for a given host element.\r\n */\r\nfunction getElementContext(host: HTMLElement): ElementContext {\r\n let ctx = elementContextMap.get(host);\r\n if (!ctx) {\r\n ctx = { shadowRoot: null, host, slotCallback: null };\r\n elementContextMap.set(host, ctx);\r\n }\r\n return ctx;\r\n}\r\n\r\n/**\r\n * Return the context for the host element whose setup is currently running,\r\n * or undefined if called outside of a Custom Element setup.\r\n */\r\nfunction getCurrentContext(): ElementContext | undefined {\r\n const host = setupStack[setupStack.length - 1];\r\n return host ? elementContextMap.get(host) : undefined;\r\n}\r\n\r\n// ==================== Props 类型映射 ====================\r\n\r\n/**\r\n * 从组件 props 定义中提取 observedAttributes\r\n */\r\nfunction extractObservedAttributes(propsOptions: Record<string, unknown>): string[] {\r\n const attributes: string[] = [];\r\n for (const key in propsOptions) {\r\n // 将 camelCase 转换为 kebab-case\r\n const attrName = key.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n attributes.push(attrName);\r\n }\r\n return attributes;\r\n}\r\n\r\n/**\r\n * 将 kebab-case attribute 名称转换为 camelCase prop 名称\r\n */\r\nfunction attrToProp(attrName: string): string {\r\n return attrName.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\r\n}\r\n\r\n/**\r\n * 将 attribute 值反序列化为对应类型的 prop 值\r\n */\r\nfunction deserializeValue(value: string | null, propOptions: unknown): unknown {\r\n if (value === null) return undefined;\r\n\r\n const options = propOptions as { type?: unknown; default?: unknown } | true | undefined;\r\n\r\n if (options === true || options === undefined) {\r\n // 无类型声明,返回字符串\r\n return value;\r\n }\r\n\r\n const type = options.type;\r\n\r\n if (type === Number) {\r\n const num = Number(value);\r\n return isNaN(num) ? value : num;\r\n }\r\n if (type === Boolean) {\r\n // 布尔属性:只要存在即为 true\r\n return value !== 'false' && value !== '0' && value !== '';\r\n }\r\n // String 或其他类型,直接返回字符串\r\n return value;\r\n}\r\n\r\n// ==================== defineCustomElement ====================\r\n\r\n/**\r\n * 将 LytJS 组件包装为 Custom Element\r\n */\r\nexport function defineCustomElement(\r\n componentOptions: ComponentOptions,\r\n options?: DefineCustomElementOptions,\r\n): CustomElementConstructor {\r\n const useShadowDOM = options?.shadowRoot !== false;\r\n const tagName =\r\n options?.name ||\r\n (componentOptions.name\r\n ? componentOptions.name.replace(/([A-Z])/g, '-$1').toLowerCase()\r\n : 'lyt-component');\r\n const css = options?.css || '';\r\n\r\n // 从组件 props 中提取 observedAttributes\r\n const propsOptions = componentOptions.props || {};\r\n const observedAttributes = extractObservedAttributes(propsOptions);\r\n\r\n class LytCustomElement extends HTMLElement {\r\n private _instance: ComponentInternalInstance | null = null;\r\n private _root: ShadowRoot | HTMLElement;\r\n private _renderer: ReturnType<typeof createDOMRenderer> | null = null;\r\n private _vnode: VNode | null = null;\r\n private _appContext: AppContext;\r\n private _slotObserver: MutationObserver | null = null;\r\n\r\n static get observedAttributes(): string[] {\r\n return observedAttributes;\r\n }\r\n\r\n constructor() {\r\n super();\r\n\r\n if (useShadowDOM) {\r\n this._root = this.attachShadow({ mode: 'open' });\r\n // 注入 CSS 样式\r\n if (css) {\r\n const style = document.createElement('style');\r\n style.textContent = css;\r\n this._root.appendChild(style);\r\n }\r\n } else {\r\n this._root = this;\r\n }\r\n\r\n this._appContext = createAppContext();\r\n }\r\n\r\n connectedCallback(): void {\r\n // Store per-instance context in WeakMap\r\n const ctx = getElementContext(this);\r\n ctx.shadowRoot = useShadowDOM ? (this._root as ShadowRoot) : null;\r\n ctx.host = this;\r\n\r\n // 压入 setup 栈,使组合式 API 函数能找到此上下文\r\n setupStack.push(this);\r\n\r\n try {\r\n // 从 attributes 收集 props\r\n const props: Record<string, unknown> = {};\r\n for (const attr of observedAttributes) {\r\n const propKey = attrToProp(attr);\r\n const value = this.getAttribute(attr);\r\n props[propKey] = deserializeValue(value, propsOptions[propKey]);\r\n }\r\n\r\n // 创建 VNode\r\n const vnode = createVNode(componentOptions, props);\r\n this._vnode = vnode;\r\n\r\n // 创建组件实例\r\n const instance = createComponentInstance(vnode, null);\r\n instance.appContext = this._appContext;\r\n this._instance = instance;\r\n\r\n // 设置组件\r\n setupComponent(instance);\r\n\r\n // 创建渲染器并挂载\r\n const renderer = createDOMRenderer();\r\n this._renderer = renderer;\r\n renderer.mount(vnode, this._root);\r\n\r\n // 设置 slot 变化监听\r\n this._setupSlotObserver();\r\n } finally {\r\n // Pop from setup stack\r\n setupStack.pop();\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n if (this._instance) {\r\n callUnmountedHook(this._instance);\r\n }\r\n\r\n if (this._renderer && this._vnode) {\r\n this._renderer.unmount(this._vnode);\r\n }\r\n\r\n if (this._slotObserver) {\r\n this._slotObserver.disconnect();\r\n this._slotObserver = null;\r\n }\r\n\r\n // Remove per-instance context from WeakMap\r\n elementContextMap.delete(this);\r\n\r\n this._instance = null;\r\n this._renderer = null;\r\n this._vnode = null;\r\n }\r\n\r\n attributeChangedCallback(\r\n name: string,\r\n _oldValue: string | null,\r\n newValue: string | null,\r\n ): void {\r\n // 仅在已挂载时处理属性变更\r\n if (!this._instance || !this._vnode) return;\r\n\r\n const propKey = attrToProp(name);\r\n\r\n // FIX: P2-v11-14 添加防御性检查,确保 propKey 在 propsOptions 中存在,\r\n // 避免非 observedAttributes 的属性变更触发不必要的更新\r\n if (!(propKey in propsOptions)) return;\r\n\r\n const deserializedValue = deserializeValue(newValue, propsOptions[propKey]);\r\n\r\n // 如果值未实际改变则跳过\r\n if (this._instance.props[propKey] === deserializedValue) return;\r\n\r\n // 更新组件 props\r\n this._instance.props[propKey] = deserializedValue;\r\n\r\n // 更新 vnode 的 props\r\n (this._vnode.props as Record<string, unknown>)[propKey] = deserializedValue;\r\n\r\n // 触发增量更新:使用 patch 进行差异化更新而非完全重建\r\n if (this._renderer && this._vnode) {\r\n if (this._renderer.patch) {\r\n // FIX: P2-39 Shadow DOM 属性反射优化:\r\n // 在 Web Component 中,属性变化通过 attributeChangedCallback 触发,\r\n // 使用 VNode 副本确保 diff 算法正确检测到变化\r\n // FIX: P0-13 创建新 VNode 副本传入 patch,避免传入相同引用导致\r\n // diff 算法短路(n1 === n2 时直接返回,不执行任何更新)\r\n const newVNode = { ...this._vnode, props: { ...this._vnode.props } };\r\n this._renderer.patch(this._vnode, newVNode, this._root as Element);\r\n // 更新内部引用为新的 vnode\r\n this._vnode = newVNode;\r\n } else if (this._renderer.render) {\r\n this._renderer.render(this._vnode, this._root as Element);\r\n }\r\n }\r\n }\r\n\r\n private _setupSlotObserver(): void {\r\n // 监听 Light DOM slot 内容变化\r\n this._slotObserver = new MutationObserver(() => {\r\n const ctx = elementContextMap.get(this);\r\n if (ctx?.slotCallback) {\r\n ctx.slotCallback();\r\n }\r\n });\r\n\r\n this._slotObserver.observe(this, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true,\r\n });\r\n }\r\n }\r\n\r\n // 注册 Custom Element\r\n // 使用 try-catch 处理竞态条件:多个模块可能同时尝试注册同名元素\r\n try {\r\n customElements.define(tagName, LytCustomElement);\r\n } catch (e) {\r\n if (__DEV__) {\r\n warn(\r\n `defineCustomElement: failed to register \"${tagName}\". ` +\r\n `It may have already been registered by another module. Error: ${e}`,\r\n );\r\n }\r\n }\r\n\r\n return LytCustomElement;\r\n}\r\n\r\n// ==================== Composition API: useShadowRoot ====================\r\n\r\n/**\r\n * 在 setup 中获取当前 Custom Element 的 Shadow Root\r\n */\r\nexport function useShadowRoot(): ShadowRoot | null {\r\n const ctx = getCurrentContext();\r\n if (__DEV__ && !ctx?.shadowRoot) {\r\n warn(\r\n 'useShadowRoot() was called outside of a Custom Element context. ' +\r\n 'Make sure this is called inside a component wrapped by defineCustomElement.',\r\n );\r\n }\r\n return ctx?.shadowRoot ?? null;\r\n}\r\n\r\n// ==================== Composition API: useHost ====================\r\n\r\n/**\r\n * 在 setup 中获取当前 Custom Element 的宿主元素\r\n */\r\nexport function useHost(): HTMLElement | null {\r\n const ctx = getCurrentContext();\r\n if (__DEV__ && !ctx?.host) {\r\n warn(\r\n 'useHost() was called outside of a Custom Element context. ' +\r\n 'Make sure this is called inside a component wrapped by defineCustomElement.',\r\n );\r\n }\r\n return ctx?.host ?? null;\r\n}\r\n\r\n// ==================== Composition API: useSlots (Web Component 版) ====================\r\n\r\n/**\r\n * 在 setup 中获取 slot 变化通知(MutationObserver)\r\n * 返回一个注册回调的函数\r\n */\r\nexport function useWebComponentSlots(onChange: () => void): void {\r\n const ctx = getCurrentContext();\r\n if (ctx) {\r\n ctx.slotCallback = onChange;\r\n }\r\n}\r\n\r\n// ==================== injectChildStyles ====================\r\n\r\n/**\r\n * 向 Shadow DOM 注入样式\r\n */\r\nexport function injectChildStyles(styles: string): void {\r\n const ctx = getCurrentContext();\r\n const shadowRoot = ctx?.shadowRoot ?? null;\r\n if (!shadowRoot) {\r\n if (__DEV__) {\r\n warn(\r\n 'injectChildStyles() was called outside of a Custom Element context. ' +\r\n 'Styles will not be injected.',\r\n );\r\n }\r\n return;\r\n }\r\n\r\n const style = document.createElement('style');\r\n style.textContent = styles;\r\n shadowRoot.appendChild(style);\r\n}\r\n","// src/lifecycle.ts\r\n// @lytjs/core - 生命周期钩子(代理到 @lytjs/component)\r\n\r\nexport {\r\n onMounted,\r\n onUnmounted,\r\n onUpdated,\r\n onBeforeMount,\r\n onBeforeUnmount,\r\n onBeforeUpdate,\r\n onErrorCaptured,\r\n onActivated,\r\n onDeactivated,\r\n onRenderTracked,\r\n onRenderTriggered,\r\n} from '@lytjs/component';\r\n","// src/config-validator.ts\r\n// @lytjs/core - 插件配置验证器\r\n\r\nimport type {\r\n ConfigSchema,\r\n ConfigValidationReport,\r\n ConfigValidationError,\r\n ValidationContext,\r\n ValidationErrorCode,\r\n StringFormat,\r\n} from './config-schema';\r\n\r\n/**\r\n * 配置验证器\r\n * @description 根据 ConfigSchema 验证配置值\r\n */\r\nexport class ConfigValidator {\r\n /** 自定义验证规则 */\r\n private rules: Array<(value: unknown, schema: ConfigSchema, context: ValidationContext) => ConfigValidationError | null> = [];\r\n\r\n /**\r\n * 验证配置值\r\n * @param value - 要验证的值\r\n * @param schema - 配置 Schema\r\n * @param path - 当前路径(用于错误报告)\r\n * @returns 验证报告\r\n */\r\n validate(value: unknown, schema: ConfigSchema, path: string = ''): ConfigValidationReport {\r\n const errors: ConfigValidationError[] = [];\r\n const context: ValidationContext = { path, root: value };\r\n\r\n // 处理 null/undefined\r\n if (value === null) {\r\n if (!schema.nullable && schema.default === undefined) {\r\n errors.push(this.createError(path, 'type_error', 'Value cannot be null'));\r\n }\r\n return { valid: errors.length === 0, errors, errorCount: errors.length, warningCount: 0 };\r\n }\r\n\r\n if (value === undefined) {\r\n if (schema.required) {\r\n errors.push(this.createError(path, 'required', 'Value is required'));\r\n } else if (schema.default !== undefined) {\r\n // 使用默认值,不报错\r\n }\r\n return { valid: errors.length === 0, errors, errorCount: errors.length, warningCount: 0 };\r\n }\r\n\r\n // 执行自定义验证(最优先)\r\n if (schema.validate) {\r\n const result = schema.validate(value, context);\r\n if (!result.valid) {\r\n errors.push(this.createError(path, 'custom_error', result.message || 'Custom validation failed'));\r\n }\r\n }\r\n\r\n // 根据类型验证\r\n switch (schema.type) {\r\n case 'string':\r\n errors.push(...this.validateString(value, schema as ConfigSchema<string>, path));\r\n break;\r\n case 'number':\r\n errors.push(...this.validateNumber(value, schema as ConfigSchema<number>, path));\r\n break;\r\n case 'boolean':\r\n errors.push(...this.validateBoolean(value, schema as ConfigSchema<boolean>, path));\r\n break;\r\n case 'object':\r\n errors.push(...this.validateObject(value, schema as ConfigSchema<Record<string, unknown>>, path));\r\n break;\r\n case 'array':\r\n errors.push(...this.validateArray(value, schema as ConfigSchema<unknown[]>, path));\r\n break;\r\n case 'enum':\r\n errors.push(...this.validateEnum(value, schema, path));\r\n break;\r\n case 'union':\r\n errors.push(...this.validateUnion(value, schema, path));\r\n break;\r\n }\r\n\r\n // 执行自定义规则\r\n for (const rule of this.rules) {\r\n const error = rule(value, schema, context);\r\n if (error) {\r\n errors.push(error);\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n errorCount: errors.length,\r\n warningCount: 0,\r\n };\r\n }\r\n\r\n /**\r\n * 验证字符串值\r\n */\r\n private validateString(value: unknown, schema: ConfigSchema<string>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n\r\n if (typeof value !== 'string') {\r\n errors.push(this.createError(path, 'type_error', `Expected string, got ${typeof value}`, 'string', value));\r\n return errors;\r\n }\r\n\r\n const stringSchema = schema.string || {};\r\n\r\n // minLength\r\n if (stringSchema.minLength !== undefined && value.length < stringSchema.minLength) {\r\n errors.push(this.createError(\r\n path,\r\n 'min_length',\r\n `String must be at least ${stringSchema.minLength} characters`,\r\n `minLength: ${stringSchema.minLength}`,\r\n value.length,\r\n ));\r\n }\r\n\r\n // maxLength\r\n if (stringSchema.maxLength !== undefined && value.length > stringSchema.maxLength) {\r\n errors.push(this.createError(\r\n path,\r\n 'max_length',\r\n `String must be at most ${stringSchema.maxLength} characters`,\r\n `maxLength: ${stringSchema.maxLength}`,\r\n value.length,\r\n ));\r\n }\r\n\r\n // pattern\r\n if (stringSchema.pattern) {\r\n const pattern = typeof stringSchema.pattern === 'string' ? new RegExp(stringSchema.pattern) : stringSchema.pattern;\r\n if (!pattern.test(value)) {\r\n errors.push(this.createError(\r\n path,\r\n 'pattern_mismatch',\r\n `String does not match pattern: ${stringSchema.pattern}`,\r\n String(stringSchema.pattern),\r\n value,\r\n ));\r\n }\r\n }\r\n\r\n // format\r\n if (stringSchema.format && this.isStringType(value)) {\r\n const formatError = this.validateFormat(value, stringSchema.format);\r\n if (formatError) {\r\n errors.push(this.createError(path, 'format_error', formatError, stringSchema.format, value));\r\n }\r\n }\r\n\r\n // enum\r\n if (stringSchema.enum && !stringSchema.enum.includes(value)) {\r\n errors.push(this.createError(\r\n path,\r\n 'enum_mismatch',\r\n `Value must be one of: ${stringSchema.enum.join(', ')}`,\r\n stringSchema.enum.join(' | '),\r\n value,\r\n ));\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证数字值\r\n */\r\n private validateNumber(value: unknown, schema: ConfigSchema<number>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n\r\n if (typeof value !== 'number' || Number.isNaN(value)) {\r\n errors.push(this.createError(path, 'type_error', `Expected number, got ${typeof value}`, 'number', value));\r\n return errors;\r\n }\r\n\r\n const numberSchema = schema.number || {};\r\n\r\n // integer\r\n if (numberSchema.integer && !Number.isInteger(value)) {\r\n errors.push(this.createError(path, 'type_error', 'Value must be an integer', 'integer', value));\r\n }\r\n\r\n // minimum\r\n if (numberSchema.minimum !== undefined && value < numberSchema.minimum) {\r\n errors.push(this.createError(\r\n path,\r\n 'minimum',\r\n `Value must be >= ${numberSchema.minimum}`,\r\n `minimum: ${numberSchema.minimum}`,\r\n value,\r\n ));\r\n }\r\n\r\n // maximum\r\n if (numberSchema.maximum !== undefined && value > numberSchema.maximum) {\r\n errors.push(this.createError(\r\n path,\r\n 'maximum',\r\n `Value must be <= ${numberSchema.maximum}`,\r\n `maximum: ${numberSchema.maximum}`,\r\n value,\r\n ));\r\n }\r\n\r\n // exclusiveMinimum\r\n if (numberSchema.exclusiveMinimum !== undefined && value <= numberSchema.exclusiveMinimum) {\r\n errors.push(this.createError(\r\n path,\r\n 'minimum',\r\n `Value must be > ${numberSchema.exclusiveMinimum}`,\r\n `exclusiveMinimum: ${numberSchema.exclusiveMinimum}`,\r\n value,\r\n ));\r\n }\r\n\r\n // exclusiveMaximum\r\n if (numberSchema.exclusiveMaximum !== undefined && value >= numberSchema.exclusiveMaximum) {\r\n errors.push(this.createError(\r\n path,\r\n 'maximum',\r\n `Value must be < ${numberSchema.exclusiveMaximum}`,\r\n `exclusiveMaximum: ${numberSchema.exclusiveMaximum}`,\r\n value,\r\n ));\r\n }\r\n\r\n // enum\r\n if (numberSchema.enum && !numberSchema.enum.includes(value)) {\r\n errors.push(this.createError(\r\n path,\r\n 'enum_mismatch',\r\n `Value must be one of: ${numberSchema.enum.join(', ')}`,\r\n numberSchema.enum.join(' | '),\r\n value,\r\n ));\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证布尔值\r\n */\r\n private validateBoolean(value: unknown, _schema: ConfigSchema<boolean>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n\r\n if (typeof value !== 'boolean') {\r\n errors.push(this.createError(path, 'type_error', `Expected boolean, got ${typeof value}`, 'boolean', value));\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证对象值\r\n */\r\n private validateObject(value: unknown, schema: ConfigSchema<Record<string, unknown>>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n errors.push(this.createError(path, 'type_error', `Expected object, got ${typeof value}`, 'object', value));\r\n return errors;\r\n }\r\n\r\n const objectSchema = schema.object;\r\n if (!objectSchema) return errors;\r\n\r\n const obj = value as Record<string, unknown>;\r\n\r\n // maxProperties\r\n const keys = Object.keys(obj);\r\n if (objectSchema.maxProperties !== undefined && keys.length > objectSchema.maxProperties) {\r\n errors.push(this.createError(\r\n path,\r\n 'max_items',\r\n `Object must have at most ${objectSchema.maxProperties} properties`,\r\n `maxProperties: ${objectSchema.maxProperties}`,\r\n keys.length,\r\n ));\r\n }\r\n\r\n // minProperties\r\n if (objectSchema.minProperties !== undefined && keys.length < objectSchema.minProperties) {\r\n errors.push(this.createError(\r\n path,\r\n 'min_items',\r\n `Object must have at least ${objectSchema.minProperties} properties`,\r\n `minProperties: ${objectSchema.minProperties}`,\r\n keys.length,\r\n ));\r\n }\r\n\r\n // 检查每个属性\r\n for (const [key, propertySchema] of Object.entries(objectSchema.properties || {})) {\r\n const propertyPath = path ? `${path}.${key}` : key;\r\n const propertyValue = obj[key];\r\n\r\n if (propertyValue !== undefined) {\r\n const propertyReport = this.validate(propertyValue, propertySchema, propertyPath);\r\n errors.push(...propertyReport.errors);\r\n } else if (propertySchema.required) {\r\n errors.push(this.createError(propertyPath, 'required', `Property \"${key}\" is required`));\r\n }\r\n }\r\n\r\n // 检查额外属性\r\n const definedKeys = new Set(Object.keys(objectSchema.properties || {}));\r\n if (!objectSchema.additionalProperties) {\r\n for (const key of keys) {\r\n if (!definedKeys.has(key)) {\r\n // 检查 patternProperties\r\n let matchesPattern = false;\r\n if (objectSchema.patternProperties) {\r\n for (const pattern of Object.keys(objectSchema.patternProperties)) {\r\n const regex = new RegExp(pattern);\r\n if (regex.test(key)) {\r\n matchesPattern = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!matchesPattern) {\r\n errors.push(this.createError(\r\n `${path}.${key}`,\r\n 'additional_properties',\r\n `Additional property \"${key}\" is not allowed`,\r\n key,\r\n key,\r\n ));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证数组值\r\n */\r\n private validateArray(value: unknown, schema: ConfigSchema<unknown[]>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n\r\n if (!Array.isArray(value)) {\r\n errors.push(this.createError(path, 'type_error', `Expected array, got ${typeof value}`, 'array', value));\r\n return errors;\r\n }\r\n\r\n const arraySchema = schema.array || {};\r\n\r\n // minItems\r\n if (arraySchema.minItems !== undefined && value.length < arraySchema.minItems) {\r\n errors.push(this.createError(\r\n path,\r\n 'min_items',\r\n `Array must have at least ${arraySchema.minItems} items`,\r\n `minItems: ${arraySchema.minItems}`,\r\n value.length,\r\n ));\r\n }\r\n\r\n // maxItems\r\n if (arraySchema.maxItems !== undefined && value.length > arraySchema.maxItems) {\r\n errors.push(this.createError(\r\n path,\r\n 'max_items',\r\n `Array must have at most ${arraySchema.maxItems} items`,\r\n `maxItems: ${arraySchema.maxItems}`,\r\n value.length,\r\n ));\r\n }\r\n\r\n // uniqueItems\r\n if (arraySchema.uniqueItems) {\r\n const seen = new Set();\r\n for (let i = 0; i < value.length; i++) {\r\n const item = value[i];\r\n const key = JSON.stringify(item);\r\n if (seen.has(key)) {\r\n errors.push(this.createError(\r\n `${path}[${i}]`,\r\n 'unique_items',\r\n `Duplicate item found at index ${i}`,\r\n 'uniqueItems',\r\n item,\r\n ));\r\n }\r\n seen.add(key);\r\n }\r\n }\r\n\r\n // 验证每个元素\r\n if (arraySchema.items) {\r\n for (let i = 0; i < value.length; i++) {\r\n const itemPath = `${path}[${i}]`;\r\n const itemReport = this.validate(value[i], arraySchema.items, itemPath);\r\n errors.push(...itemReport.errors);\r\n }\r\n }\r\n\r\n // 验证元组\r\n if (arraySchema.tuple) {\r\n for (let i = 0; i < Math.min(value.length, arraySchema.tuple.length); i++) {\r\n const itemPath = `${path}[${i}]`;\r\n const itemReport = this.validate(value[i], arraySchema.tuple[i]!, itemPath);\r\n errors.push(...itemReport.errors);\r\n }\r\n // 元组长度不匹配\r\n if (value.length !== arraySchema.tuple.length) {\r\n errors.push(this.createError(\r\n path,\r\n 'max_items',\r\n `Tuple must have exactly ${arraySchema.tuple.length} items, got ${value.length}`,\r\n `tuple length: ${arraySchema.tuple.length}`,\r\n value.length,\r\n ));\r\n }\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证枚举值\r\n */\r\n private validateEnum<T>(value: unknown, schema: ConfigSchema<T>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n const enumSchema = schema.enum!;\r\n\r\n if (!enumSchema.values.includes(value as T)) {\r\n errors.push(this.createError(\r\n path,\r\n 'enum_mismatch',\r\n `Value must be one of: ${enumSchema.values.map((v) => JSON.stringify(v)).join(', ')}`,\r\n enumSchema.values.map((v) => JSON.stringify(v)).join(' | '),\r\n value,\r\n ));\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证联合类型\r\n */\r\n private validateUnion(value: unknown, schema: ConfigSchema<unknown>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n const unionSchema = schema.union!;\r\n\r\n // anyOf: 至少一个匹配\r\n if (unionSchema.anyOf) {\r\n let matched = false;\r\n for (const subSchema of unionSchema.anyOf) {\r\n const report = this.validate(value, subSchema, path);\r\n if (report.valid) {\r\n matched = true;\r\n break;\r\n }\r\n }\r\n if (!matched) {\r\n errors.push(this.createError(\r\n path,\r\n 'type_error',\r\n 'Value does not match any of the allowed types',\r\n 'union',\r\n value,\r\n ));\r\n }\r\n }\r\n\r\n // oneOf: 恰好一个匹配\r\n if (unionSchema.oneOf) {\r\n let matchCount = 0;\r\n for (const subSchema of unionSchema.oneOf) {\r\n const report = this.validate(value, subSchema, path);\r\n if (report.valid) {\r\n matchCount++;\r\n }\r\n }\r\n if (matchCount !== 1) {\r\n errors.push(this.createError(\r\n path,\r\n 'type_error',\r\n `Value must match exactly one of the allowed types, matched ${matchCount}`,\r\n 'oneOf',\r\n value,\r\n ));\r\n }\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证字符串格式\r\n */\r\n private validateFormat(value: string, format: StringFormat): string | null {\r\n switch (format) {\r\n case 'date':\r\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || isNaN(Date.parse(value))) {\r\n return `Invalid date format, expected YYYY-MM-DD`;\r\n }\r\n return null;\r\n\r\n case 'time':\r\n if (!/^\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$/.test(value)) {\r\n return `Invalid time format`;\r\n }\r\n return null;\r\n\r\n case 'date-time':\r\n if (isNaN(Date.parse(value))) {\r\n return `Invalid ISO 8601 date-time format`;\r\n }\r\n return null;\r\n\r\n case 'email':\r\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\r\n return `Invalid email format`;\r\n }\r\n return null;\r\n\r\n case 'url':\r\n case 'uri':\r\n try {\r\n new URL(value);\r\n return null;\r\n } catch {\r\n return `Invalid URL format`;\r\n }\r\n\r\n case 'uuid':\r\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)) {\r\n return `Invalid UUID format`;\r\n }\r\n return null;\r\n\r\n case 'semver':\r\n if (!/^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.]+)?(\\+[a-zA-Z0-9.]+)?$/.test(value)) {\r\n return `Invalid semver format, expected MAJOR.MINOR.PATCH`;\r\n }\r\n return null;\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 创建验证错误\r\n */\r\n private createError(\r\n path: string,\r\n code: ValidationErrorCode,\r\n message: string,\r\n expected?: string,\r\n actual?: unknown,\r\n ): ConfigValidationError {\r\n return { path, code, message, expected, actual };\r\n }\r\n\r\n /**\r\n * 添加自定义验证规则\r\n */\r\n addRule(rule: (value: unknown, schema: ConfigSchema, context: ValidationContext) => ConfigValidationError | null): void {\r\n this.rules.push(rule);\r\n }\r\n\r\n /**\r\n * 移除自定义验证规则\r\n */\r\n removeRule(rule: (value: unknown, schema: ConfigSchema, context: ValidationContext) => ConfigValidationError | null): void {\r\n const index = this.rules.indexOf(rule);\r\n if (index !== -1) {\r\n this.rules.splice(index, 1);\r\n }\r\n }\r\n\r\n // ==================== 类型守卫 ====================\r\n\r\n private isStringType(value: unknown): value is string {\r\n return typeof value === 'string';\r\n }\r\n}\r\n\r\n// ==================== 便捷函数 ====================\r\n\r\n/**\r\n * 快速验证配置\r\n */\r\nexport function validateConfig<T>(value: unknown, schema: ConfigSchema<T>): ConfigValidationReport {\r\n const validator = new ConfigValidator();\r\n return validator.validate(value, schema as unknown as ConfigSchema<unknown>);\r\n}\r\n","// src/config-transformer.ts\r\n// @lytjs/core - 插件配置转换器\r\n\r\nimport type {\r\n ConfigSchema,\r\n ConfigTransformReport,\r\n ConfigValidationError,\r\n} from './config-schema';\r\nimport { ConfigValidator } from './config-validator';\r\n\r\n/**\r\n * 配置转换器\r\n * @description 负责应用默认值、类型转换和预处理\r\n */\r\nexport class ConfigTransformer {\r\n private validator: ConfigValidator;\r\n\r\n constructor() {\r\n this.validator = new ConfigValidator();\r\n }\r\n\r\n /**\r\n * 转换并验证配置\r\n * @param value - 原始配置值\r\n * @param schema - 配置 Schema\r\n * @param path - 当前路径\r\n * @returns 转换报告\r\n */\r\n transform<T>(value: unknown, schema: ConfigSchema<T>, path: string = ''): ConfigTransformReport<T> {\r\n const warnings: string[] = [];\r\n const transforms: string[] = [];\r\n const errors: ConfigValidationError[] = [];\r\n let transformed = value;\r\n\r\n // 1. 处理 undefined → 应用默认值\r\n if (transformed === undefined) {\r\n if (schema.default !== undefined) {\r\n transformed = schema.default;\r\n transforms.push(`Applied default value: ${JSON.stringify(schema.default)}`);\r\n } else if (schema.required) {\r\n errors.push({\r\n path,\r\n code: 'required',\r\n message: 'Value is required',\r\n });\r\n return { config: undefined as unknown as T, success: false, errors, warnings, transforms };\r\n }\r\n }\r\n\r\n // 2. 处理 null\r\n if (transformed === null) {\r\n if (schema.nullable) {\r\n // null 是允许的\r\n } else if (schema.default !== undefined) {\r\n transformed = schema.default;\r\n transforms.push(`Applied default value for null: ${JSON.stringify(schema.default)}`);\r\n warnings.push('Null value was replaced with default');\r\n } else {\r\n errors.push({\r\n path,\r\n code: 'type_error',\r\n message: 'Value cannot be null',\r\n });\r\n return { config: null as unknown as T, success: false, errors, warnings, transforms };\r\n }\r\n }\r\n\r\n // 3. 应用类型转换\r\n if (transformed !== undefined && transformed !== null) {\r\n if (schema.transform) {\r\n try {\r\n const original = transformed;\r\n transformed = schema.transform(transformed);\r\n if (original !== transformed) {\r\n transforms.push(`Applied transform function`);\r\n }\r\n } catch (err) {\r\n errors.push({\r\n path,\r\n code: 'custom_error',\r\n message: `Transform failed: ${err instanceof Error ? err.message : String(err)}`,\r\n });\r\n return { config: transformed as T, success: false, errors, warnings, transforms };\r\n }\r\n }\r\n }\r\n\r\n // 4. 递归处理复杂类型\r\n if (schema.type === 'object' && schema.object && typeof transformed === 'object' && transformed !== null) {\r\n const objectResult = this.transformObject(transformed as Record<string, unknown>, schema as ConfigSchema<Record<string, unknown>>, path);\r\n transformed = objectResult.value as unknown as T;\r\n errors.push(...objectResult.errors);\r\n warnings.push(...objectResult.warnings);\r\n transforms.push(...objectResult.transforms);\r\n } else if (schema.type === 'array' && schema.array && Array.isArray(transformed)) {\r\n const arrayResult = this.transformArray(transformed, schema as unknown as ConfigSchema<unknown[]>, path);\r\n transformed = arrayResult.value as unknown as T;\r\n errors.push(...arrayResult.errors);\r\n warnings.push(...arrayResult.warnings);\r\n transforms.push(...arrayResult.transforms);\r\n }\r\n\r\n // 5. 验证转换后的值\r\n if (transformed !== undefined && transformed !== null) {\r\n const validationReport = this.validator.validate(transformed, schema as ConfigSchema<unknown>, path);\r\n errors.push(...validationReport.errors);\r\n }\r\n\r\n return {\r\n config: transformed as T,\r\n success: errors.length === 0,\r\n errors,\r\n warnings,\r\n transforms,\r\n };\r\n }\r\n\r\n /**\r\n * 转换对象配置\r\n */\r\n private transformObject(\r\n obj: Record<string, unknown>,\r\n schema: ConfigSchema<Record<string, unknown>>,\r\n path: string,\r\n ): { value: Record<string, unknown>; errors: ConfigValidationError[]; warnings: string[]; transforms: string[] } {\r\n const result: Record<string, unknown> = {};\r\n const errors: ConfigValidationError[] = [];\r\n const warnings: string[] = [];\r\n const transforms: string[] = [];\r\n const objectSchema = schema.object!;\r\n const definedKeys = new Set(Object.keys(objectSchema.properties || {}));\r\n\r\n // 处理每个定义的属性\r\n for (const [key, propertySchema] of Object.entries(objectSchema.properties || {})) {\r\n const propertyPath = path ? `${path}.${key}` : key;\r\n const propertyValue = obj[key];\r\n\r\n // 应用属性级别的转换\r\n if (propertyValue !== undefined) {\r\n const propertyResult = this.transform(propertyValue, propertySchema, propertyPath);\r\n result[key] = propertyResult.config;\r\n errors.push(...propertyResult.errors);\r\n warnings.push(...propertyResult.warnings);\r\n transforms.push(...propertyResult.transforms);\r\n } else if (propertySchema.default !== undefined) {\r\n result[key] = propertySchema.default;\r\n transforms.push(`Applied default for \"${key}\": ${JSON.stringify(propertySchema.default)}`);\r\n } else if (propertySchema.required) {\r\n errors.push({\r\n path: propertyPath,\r\n code: 'required',\r\n message: `Property \"${key}\" is required`,\r\n });\r\n }\r\n }\r\n\r\n // 处理 patternProperties\r\n if (objectSchema.patternProperties) {\r\n for (const key of Object.keys(obj)) {\r\n if (!definedKeys.has(key)) {\r\n for (const [pattern, patternSchema] of Object.entries(objectSchema.patternProperties)) {\r\n const regex = new RegExp(pattern);\r\n if (regex.test(key)) {\r\n const propertyPath = `${path}.${key}`;\r\n const propertyResult = this.transform(obj[key], patternSchema, propertyPath);\r\n result[key] = propertyResult.config;\r\n errors.push(...propertyResult.errors);\r\n warnings.push(...propertyResult.warnings);\r\n transforms.push(...propertyResult.transforms);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 处理额外属性\r\n if (!objectSchema.additionalProperties) {\r\n for (const key of Object.keys(obj)) {\r\n if (!definedKeys.has(key)) {\r\n let matchesPattern = false;\r\n if (objectSchema.patternProperties) {\r\n for (const pattern of Object.keys(objectSchema.patternProperties)) {\r\n const regex = new RegExp(pattern);\r\n if (regex.test(key)) {\r\n matchesPattern = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!matchesPattern) {\r\n warnings.push(`Additional property \"${key}\" will be ignored`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { value: result, errors, warnings, transforms };\r\n }\r\n\r\n /**\r\n * 转换数组配置\r\n */\r\n private transformArray(\r\n arr: unknown[],\r\n schema: ConfigSchema<unknown[]>,\r\n path: string,\r\n ): { value: unknown[]; errors: ConfigValidationError[]; warnings: string[]; transforms: string[] } {\r\n const result: unknown[] = [];\r\n const errors: ConfigValidationError[] = [];\r\n const warnings: string[] = [];\r\n const transforms: string[] = [];\r\n const arraySchema = schema.array!;\r\n\r\n for (let i = 0; i < arr.length; i++) {\r\n const itemPath = `${path}[${i}]`;\r\n const itemResult = this.transform(arr[i], arraySchema.items!, itemPath);\r\n result.push(itemResult.config);\r\n errors.push(...itemResult.errors);\r\n warnings.push(...itemResult.warnings);\r\n transforms.push(...itemResult.transforms);\r\n }\r\n\r\n // 处理元组默认值\r\n if (arraySchema.tuple) {\r\n for (let i = arr.length; i < arraySchema.tuple.length; i++) {\r\n const itemSchema = arraySchema.tuple[i];\r\n if (itemSchema && itemSchema.default !== undefined) {\r\n result.push(itemSchema.default);\r\n transforms.push(`Applied default for tuple[${i}]: ${JSON.stringify(itemSchema.default)}`);\r\n }\r\n }\r\n }\r\n\r\n return { value: result, errors, warnings, transforms };\r\n }\r\n\r\n /**\r\n * 合并多个配置(用户配置覆盖默认配置)\r\n * @param defaults - 默认配置\r\n * @param overrides - 用户配置\r\n * @param schema - 配置 Schema\r\n * @returns 合并后的配置\r\n */\r\n merge<T>(defaults: Partial<T>, overrides: Partial<T>, schema: ConfigSchema<T>): ConfigTransformReport<T> {\r\n // 深度合并\r\n const merged = this.deepMerge(defaults as Record<string, unknown>, overrides as Record<string, unknown>);\r\n return this.transform(merged, schema as ConfigSchema<T>);\r\n }\r\n\r\n /**\r\n * 深度合并两个对象\r\n */\r\n private deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\r\n const result: Record<string, unknown> = { ...target };\r\n\r\n for (const [key, value] of Object.entries(source)) {\r\n if (value !== undefined) {\r\n if (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n !Array.isArray(value) &&\r\n typeof result[key] === 'object' &&\r\n result[key] !== null &&\r\n !Array.isArray(result[key])\r\n ) {\r\n result[key] = this.deepMerge(result[key] as Record<string, unknown>, value as Record<string, unknown>);\r\n } else {\r\n result[key] = value;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 从配置中提取指定字段\r\n * @param config - 完整配置\r\n * @param schema - 配置 Schema\r\n * @param keys - 要提取的键\r\n * @returns 提取的配置子集\r\n */\r\n extract<T, K extends keyof T>(config: T, schema: ConfigSchema<T>, keys: K[]): Partial<T> {\r\n const result: Partial<T> = {} as Partial<T>;\r\n const configObj = config as unknown as Record<string, unknown>;\r\n\r\n for (const key of keys) {\r\n if (key in configObj) {\r\n const propertySchema = schema.object?.properties?.[key as string];\r\n if (propertySchema) {\r\n const propertyReport = this.transform(configObj[key as string], propertySchema as ConfigSchema<unknown>, String(key));\r\n if (propertyReport.success) {\r\n (result as Record<string, unknown>)[key as string] = propertyReport.config;\r\n }\r\n } else {\r\n (result as Record<string, unknown>)[key as string] = configObj[key as string];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n// ==================== 便捷函数 ====================\r\n\r\n/**\r\n * 快速转换配置\r\n */\r\nexport function transformConfig<T>(value: unknown, schema: ConfigSchema<T>): ConfigTransformReport<T> {\r\n const transformer = new ConfigTransformer();\r\n return transformer.transform(value, schema);\r\n}\r\n\r\n/**\r\n * 快速合并配置\r\n */\r\nexport function mergeConfig<T>(defaults: Partial<T>, overrides: Partial<T>, schema: ConfigSchema<T>): ConfigTransformReport<T> {\r\n const transformer = new ConfigTransformer();\r\n return transformer.merge(defaults, overrides, schema);\r\n}\r\n","// src/plugin-sdk.ts\r\n// @lytjs/core - 插件开发 SDK\r\n\r\nimport type { EnhancedPlugin, App } from './types';\r\nimport type { ConfigSchema, ConfigValidationReport, ConfigTransformReport } from './config-schema';\r\nimport { ConfigTransformer, transformConfig } from './config-transformer';\r\nimport { validateConfig } from './config-validator';\r\n\r\n/**\r\n * 插件配置选项\r\n */\r\nexport interface PluginConfig<TOptions = unknown> {\r\n /** 插件名称 */\r\n name: string;\r\n /** 插件版本 */\r\n version?: string;\r\n /** 插件描述 */\r\n description?: string;\r\n /** 插件作者 */\r\n author?: string;\r\n /** 关键词 */\r\n keywords?: string[];\r\n /** 插件选项 Schema */\r\n schema?: ConfigSchema<TOptions>;\r\n /** 安装函数 */\r\n install: (app: App, options: TOptions) => void | Promise<void>;\r\n}\r\n\r\n/**\r\n * 插件定义结果\r\n */\r\nexport interface PluginDefinition<TOptions = unknown> extends EnhancedPlugin<TOptions> {\r\n /** 配置验证报告 */\r\n configReport?: ConfigValidationReport;\r\n}\r\n\r\n/**\r\n * 创建插件定义\r\n * @description 提供类型安全的插件定义方式\r\n *\r\n * @example\r\n * ```typescript\r\n * const myPlugin = definePlugin({\r\n * name: 'my-plugin',\r\n * version: '1.0.0',\r\n * description: 'My awesome plugin',\r\n * schema: {\r\n * type: 'object',\r\n * properties: {\r\n * theme: { type: 'string', string: { enum: ['light', 'dark'] }, default: 'light' },\r\n * debug: { type: 'boolean', default: false },\r\n * },\r\n * },\r\n * install: (app, options) => {\r\n * console.log('Plugin installed with options:', options);\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport function definePlugin<TOptions = unknown>(config: PluginConfig<TOptions>): PluginDefinition<TOptions> {\r\n const { name, version, description, author, keywords, schema, install } = config;\r\n\r\n const plugin: PluginDefinition<TOptions> = {\r\n name,\r\n version,\r\n meta: {\r\n description,\r\n author,\r\n keywords,\r\n },\r\n configSchema: schema,\r\n install: async (app, ...options) => {\r\n const rawOptions = options[0] as TOptions | undefined;\r\n\r\n // 如果有 Schema,验证和转换配置\r\n if (schema) {\r\n const transformer = new ConfigTransformer();\r\n const report = transformer.transform(rawOptions, schema);\r\n\r\n if (!report.success) {\r\n const errors = report.errors.map((e) => `${e.path}: ${e.message}`).join(', ');\r\n throw new Error(`Plugin \"${name}\" configuration validation failed: ${errors}`);\r\n }\r\n\r\n await install(app, report.config);\r\n } else {\r\n await install(app, rawOptions as TOptions);\r\n }\r\n },\r\n };\r\n\r\n return plugin;\r\n}\r\n\r\n/**\r\n * 验证插件配置\r\n * @description 验证用户提供的配置是否符合 Schema\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = validatePluginConfig(myPlugin, { theme: 'dark', debug: true });\r\n * if (!result.valid) {\r\n * console.error(result.errors);\r\n * }\r\n * ```\r\n */\r\nexport function validatePluginConfig<TOptions>(\r\n plugin: EnhancedPlugin<TOptions>,\r\n userConfig: unknown,\r\n): ConfigValidationReport {\r\n if (!plugin.configSchema) {\r\n return { valid: true, errors: [], errorCount: 0, warningCount: 0 };\r\n }\r\n return validateConfig(userConfig, plugin.configSchema);\r\n}\r\n\r\n/**\r\n * 转换插件配置\r\n * @description 验证并转换用户配置,应用默认值\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = transformPluginConfig(myPlugin, { debug: true });\r\n * // result.config = { theme: 'light', debug: true } (theme 从 default 填充)\r\n * ```\r\n */\r\nexport function transformPluginConfig<TOptions>(\r\n plugin: EnhancedPlugin<TOptions>,\r\n userConfig: unknown,\r\n): ConfigTransformReport<TOptions> {\r\n if (!plugin.configSchema) {\r\n return {\r\n config: userConfig as TOptions,\r\n success: true,\r\n errors: [],\r\n warnings: [],\r\n transforms: [],\r\n };\r\n }\r\n return transformConfig(userConfig, plugin.configSchema);\r\n}\r\n\r\n/**\r\n * 合并插件默认配置\r\n * @description 将用户配置与插件默认配置合并\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = mergePluginConfig(myPlugin, { theme: 'dark' }, userConfig);\r\n * ```\r\n */\r\nexport function mergePluginConfig<TOptions>(\r\n plugin: EnhancedPlugin<TOptions>,\r\n defaults: Partial<TOptions>,\r\n overrides: Partial<TOptions>,\r\n): ConfigTransformReport<TOptions> {\r\n if (!plugin.configSchema) {\r\n const merged = { ...defaults, ...overrides } as TOptions;\r\n return {\r\n config: merged,\r\n success: true,\r\n errors: [],\r\n warnings: [],\r\n transforms: [],\r\n };\r\n }\r\n\r\n const transformer = new ConfigTransformer();\r\n return transformer.merge(defaults, overrides, plugin.configSchema);\r\n}\r\n\r\n/**\r\n * 创建插件测试器\r\n * @description 用于在隔离环境中测试插件\r\n */\r\nexport interface PluginTesterOptions {\r\n /** 测试用的 App 配置 */\r\n appConfig?: {\r\n performance?: boolean;\r\n globalProperties?: Record<string, unknown>;\r\n };\r\n /** 是否启用调试日志 */\r\n debug?: boolean;\r\n /** 配置验证回调 */\r\n onValidationError?: (errors: ConfigValidationReport) => void;\r\n /** 安装前回调 */\r\n onBeforeInstall?: (app: App) => void;\r\n /** 安装后回调 */\r\n onAfterInstall?: (app: App) => void;\r\n /** 清理回调 */\r\n onCleanup?: () => void;\r\n}\r\n\r\n/**\r\n * 插件测试器\r\n * @description 提供插件测试的辅助功能\r\n */\r\nexport class PluginTester {\r\n private options: Required<PluginTesterOptions>;\r\n private app: App | null = null;\r\n private installedPlugins: Set<string> = new Set();\r\n\r\n constructor(options: PluginTesterOptions = {}) {\r\n this.options = {\r\n appConfig: options.appConfig || {},\r\n debug: options.debug || false,\r\n onValidationError: options.onValidationError || (() => {}),\r\n onBeforeInstall: options.onBeforeInstall || (() => {}),\r\n onAfterInstall: options.onAfterInstall || (() => {}),\r\n onCleanup: options.onCleanup || (() => {}),\r\n };\r\n }\r\n\r\n /**\r\n * 创建测试 App\r\n */\r\n async createApp(): Promise<App> {\r\n const { createApp, h } = await import('./index');\r\n\r\n const app = createApp({\r\n render: () => h('div'),\r\n });\r\n\r\n this.app = app;\r\n return app;\r\n }\r\n\r\n /**\r\n * 安装插件进行测试\r\n */\r\n async installPlugin(plugin: EnhancedPlugin, options?: unknown): Promise<void> {\r\n if (!this.app) {\r\n await this.createApp();\r\n }\r\n\r\n // 配置验证\r\n if (plugin.configSchema) {\r\n const report = validatePluginConfig(plugin, options);\r\n if (!report.valid) {\r\n this.options.onValidationError(report);\r\n if (this.options.debug) {\r\n console.error('[PluginTester] Validation errors:', report.errors);\r\n }\r\n }\r\n }\r\n\r\n // beforeInstall 钩子\r\n this.options.onBeforeInstall(this.app!);\r\n\r\n if (this.options.debug) {\r\n console.log(`[PluginTester] Installing plugin: ${plugin.name}`);\r\n }\r\n\r\n // 安装\r\n this.app!.use(plugin, options);\r\n\r\n this.installedPlugins.add(plugin.name);\r\n\r\n // afterInstall 钩子\r\n this.options.onAfterInstall(this.app!);\r\n }\r\n\r\n /**\r\n * 卸载插件进行测试\r\n */\r\n uninstallPlugin(name: string): void {\r\n if (!this.app || !this.installedPlugins.has(name)) {\r\n return;\r\n }\r\n\r\n if (this.options.debug) {\r\n console.log(`[PluginTester] Uninstalling plugin: ${name}`);\r\n }\r\n\r\n this.app._pluginRegistry.unregister(name);\r\n this.installedPlugins.delete(name);\r\n }\r\n\r\n /**\r\n * 运行清理\r\n */\r\n cleanup(): void {\r\n if (this.app) {\r\n this.app.unmount();\r\n }\r\n this.app = null;\r\n this.installedPlugins.clear();\r\n this.options.onCleanup();\r\n }\r\n\r\n /**\r\n * 获取已安装插件列表\r\n */\r\n getInstalledPlugins(): string[] {\r\n return Array.from(this.installedPlugins);\r\n }\r\n\r\n /**\r\n * 获取 App 实例\r\n */\r\n getApp(): App | null {\r\n return this.app;\r\n }\r\n}\r\n\r\n/**\r\n * 快速创建插件测试器\r\n */\r\nexport function createPluginTester(options?: PluginTesterOptions): PluginTester {\r\n return new PluginTester(options);\r\n}\r\n\r\n/**\r\n * 测试插件安装\r\n * @description 在隔离环境中测试插件安装\r\n */\r\nexport async function testPluginInstall(\r\n plugin: EnhancedPlugin,\r\n options?: unknown,\r\n testerOptions?: PluginTesterOptions,\r\n): Promise<{ success: boolean; error?: Error; app?: App }> {\r\n const tester = createPluginTester(testerOptions);\r\n\r\n try {\r\n await tester.installPlugin(plugin, options);\r\n return { success: true, app: tester.getApp()! };\r\n } catch (err) {\r\n return { success: false, error: err instanceof Error ? err : new Error(String(err)) };\r\n } finally {\r\n tester.cleanup();\r\n }\r\n}\r\n","/**\r\n * @lytjs/core - 全局配置系统\r\n *\r\n * 提供运行时配置管理和合并功能\r\n *\r\n * @module @lytjs/core/config\r\n * @version 6.0.0\r\n */\r\n\r\nimport { deepClone } from '@lytjs/common-object';\r\nimport { hasChanged, isObject } from '@lytjs/common-is';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/**\r\n * 配置变更监听器\r\n */\r\nexport type ConfigChangeCallback<T = unknown> = (newValue: T, oldValue: T, path: string) => void;\r\n\r\n/**\r\n * 配置选项\r\n */\r\nexport interface ConfigOptions {\r\n /** 是否允许在运行时修改配置 */\r\n mutable?: boolean;\r\n /** 是否深度合并配置 */\r\n deepMerge?: boolean;\r\n /** 变更时的回调函数 */\r\n onChange?: ConfigChangeCallback;\r\n}\r\n\r\n/**\r\n * 配置对象类型\r\n */\r\nexport type ConfigValue = string | number | boolean | null | undefined | ConfigObject | ConfigArray;\r\n\r\n/**\r\n * 配置对象\r\n */\r\nexport interface ConfigObject {\r\n [key: string]: ConfigValue;\r\n}\r\n\r\n/**\r\n * 配置数组\r\n */\r\nexport type ConfigArray = ConfigValue[];\r\n\r\n// ============================================================\r\n// 配置管理器\r\n// ============================================================\r\n\r\n/**\r\n * 全局配置管理器\r\n *\r\n * 提供配置存储、合并、变更监听等功能\r\n *\r\n * @example\r\n * ```ts\r\n * // 创建配置管理器\r\n * const config = new ConfigManager({\r\n * api: { baseURL: '/api', timeout: 5000 },\r\n * theme: { primary: '#007bff' }\r\n * })\r\n *\r\n * // 获取配置\r\n * const baseURL = config.get('api.baseURL')\r\n *\r\n * // 设置配置\r\n * config.set('api.timeout', 10000)\r\n *\r\n * // 监听变更\r\n * config.watch('theme.primary', (newVal, oldVal) => {\r\n * console.log(`主题色从 ${oldVal} 变为 ${newVal}`)\r\n * })\r\n * ```\r\n */\r\nexport class ConfigManager {\r\n private config: ConfigObject = {};\r\n private options: ConfigOptions;\r\n private listeners = new Map<string, Set<ConfigChangeCallback>>();\r\n private globalListeners = new Set<ConfigChangeCallback>();\r\n\r\n constructor(initialConfig: ConfigObject = {}, options: ConfigOptions = {}) {\r\n this.options = {\r\n mutable: true,\r\n deepMerge: true,\r\n ...options,\r\n };\r\n this.config = this.options.deepMerge\r\n ? (deepClone(initialConfig) as ConfigObject)\r\n : { ...initialConfig };\r\n }\r\n\r\n /**\r\n * 获取配置值\r\n *\r\n * @param path - 配置路径(支持点号分隔,如 'api.baseURL')\r\n * @param defaultValue - 默认值\r\n * @returns 配置值或默认值\r\n *\r\n * @example\r\n * ```ts\r\n * config.get('api.baseURL') // '/api'\r\n * config.get('api.timeout', 5000) // 5000 (如果不存在)\r\n * config.get('theme.colors.primary') // 嵌套值\r\n * ```\r\n */\r\n get<T = ConfigValue>(path: string, defaultValue?: T): T | undefined {\r\n const keys = path.split('.');\r\n let value: ConfigValue | undefined = this.config;\r\n\r\n for (const key of keys) {\r\n if (isObject(value) && key in value) {\r\n value = (value as ConfigObject)[key];\r\n } else {\r\n return defaultValue;\r\n }\r\n }\r\n\r\n return value as T;\r\n }\r\n\r\n /**\r\n * 设置配置值\r\n *\r\n * @param path - 配置路径\r\n * @param value - 新值\r\n * @returns 是否设置成功\r\n *\r\n * @example\r\n * ```ts\r\n * config.set('api.timeout', 10000)\r\n * config.set('theme.colors.primary', '#ff0000')\r\n * ```\r\n */\r\n set<T = ConfigValue>(path: string, value: T): boolean {\r\n if (!this.options.mutable) {\r\n console.warn('[ConfigManager] Configuration is immutable');\r\n return false;\r\n }\r\n\r\n const keys = path.split('.');\r\n const lastKey = keys.pop()!;\r\n let target: ConfigObject = this.config;\r\n\r\n // 遍历路径创建嵌套对象\r\n for (const key of keys) {\r\n if (!isObject(target[key])) {\r\n target[key] = {};\r\n }\r\n target = target[key] as ConfigObject;\r\n }\r\n\r\n const oldValue = target[lastKey] as T;\r\n\r\n // 检查值是否变化\r\n if (!hasChanged(value, oldValue)) {\r\n return false;\r\n }\r\n\r\n // FIX: P1-10 在修改值之前,收集所有父路径的旧值快照\r\n const parentOldValues = new Map<string, unknown>();\r\n const parentParts = path.split('.');\r\n while (parentParts.length > 1) {\r\n parentParts.pop();\r\n const parentPath = parentParts.join('.');\r\n const parentVal = this.get(parentPath);\r\n parentOldValues.set(\r\n parentPath,\r\n parentVal !== null && typeof parentVal === 'object' ? deepClone(parentVal) : parentVal,\r\n );\r\n }\r\n\r\n // 设置新值\r\n target[lastKey] = value as ConfigValue;\r\n\r\n // 触发监听器\r\n this.notify(path, value, oldValue, parentOldValues);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * 批量设置配置\r\n *\r\n * @param config - 配置对象\r\n * @param merge - 是否合并(true)或替换(false)\r\n *\r\n * @example\r\n * ```ts\r\n * config.setMultiple({\r\n * 'api.timeout': 10000,\r\n * 'theme.primary': '#ff0000'\r\n * })\r\n * ```\r\n */\r\n setMultiple(config: Record<string, ConfigValue>, merge = true): void {\r\n if (!this.options.mutable) {\r\n console.warn('[ConfigManager] Configuration is immutable');\r\n return;\r\n }\r\n\r\n if (!merge) {\r\n this.config = {};\r\n }\r\n\r\n Object.entries(config).forEach(([path, value]) => {\r\n this.set(path, value);\r\n });\r\n }\r\n\r\n /**\r\n * 检查配置是否存在\r\n *\r\n * @param path - 配置路径\r\n * @returns 是否存在\r\n */\r\n has(path: string): boolean {\r\n const keys = path.split('.');\r\n let value: ConfigValue | undefined = this.config;\r\n\r\n for (const key of keys) {\r\n if (isObject(value) && key in value) {\r\n value = (value as ConfigObject)[key];\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * 删除配置\r\n *\r\n * @param path - 配置路径\r\n * @returns 是否删除成功\r\n */\r\n delete(path: string): boolean {\r\n if (!this.options.mutable) {\r\n console.warn('[ConfigManager] Configuration is immutable');\r\n return false;\r\n }\r\n\r\n const keys = path.split('.');\r\n const lastKey = keys.pop()!;\r\n let target: ConfigValue | undefined = this.config;\r\n\r\n for (const key of keys) {\r\n if (isObject(target) && key in target) {\r\n target = (target as ConfigObject)[key];\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n if (isObject(target) && lastKey in target) {\r\n const oldValue = (target as ConfigObject)[lastKey];\r\n delete (target as ConfigObject)[lastKey];\r\n this.notify(path, undefined, oldValue);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 合并配置\r\n *\r\n * @param config - 要合并的配置\r\n * @param deep - 是否深度合并\r\n *\r\n * @example\r\n * ```ts\r\n * config.merge({\r\n * api: { timeout: 10000 },\r\n * newKey: 'value'\r\n * })\r\n * ```\r\n */\r\n merge(config: ConfigObject, deep = true): void {\r\n if (!this.options.mutable) {\r\n console.warn('[ConfigManager] Configuration is immutable');\r\n return;\r\n }\r\n\r\n // FIX: P2-v11-08 merge() 合并后遍历合并的键通知路径特定监听器,\r\n // 确保通过 merge() 修改的配置项也能触发对应的 watch 回调\r\n const mergedKeys: string[] = [];\r\n\r\n if (deep) {\r\n this.deepMergeNotify(this.config, config, '', mergedKeys);\r\n } else {\r\n for (const key of Object.keys(config)) {\r\n const oldValue = this.config[key];\r\n this.config[key] = config[key];\r\n if (hasChanged(this.config[key], oldValue)) {\r\n this.notify(key, this.config[key], oldValue);\r\n mergedKeys.push(key);\r\n }\r\n }\r\n }\r\n\r\n // 触发全局监听器\r\n this.globalListeners.forEach((cb) => cb(this.config, this.config, ''));\r\n }\r\n\r\n /**\r\n * 深度合并对象,并在值变更时通知监听器\r\n * FIX: P2-v11-08 替代原 deepMerge,在合并过程中收集变更的键并通知监听器\r\n */\r\n private deepMergeNotify(\r\n target: ConfigObject,\r\n source: ConfigObject,\r\n prefix: string,\r\n mergedKeys: string[],\r\n ): void {\r\n Object.entries(source).forEach(([key, value]) => {\r\n const fullPath = prefix ? `${prefix}.${key}` : key;\r\n if (isObject(target[key]) && isObject(value)) {\r\n this.deepMergeNotify(\r\n target[key] as ConfigObject,\r\n value as ConfigObject,\r\n fullPath,\r\n mergedKeys,\r\n );\r\n } else {\r\n const oldValue = target[key];\r\n target[key] = isObject(value) ? (deepClone(value) as ConfigValue) : value;\r\n if (hasChanged(target[key], oldValue)) {\r\n this.notify(fullPath, target[key], oldValue);\r\n mergedKeys.push(fullPath);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 获取所有配置\r\n *\r\n * @returns 配置对象的深拷贝\r\n */\r\n getAll(): ConfigObject {\r\n return deepClone(this.config) as ConfigObject;\r\n }\r\n\r\n /**\r\n * 重置配置\r\n *\r\n * @param newConfig - 新的配置对象\r\n */\r\n reset(newConfig: ConfigObject = {}): void {\r\n if (!this.options.mutable) {\r\n console.warn('[ConfigManager] Configuration is immutable');\r\n return;\r\n }\r\n\r\n const oldConfig = this.config;\r\n this.config = this.options.deepMerge\r\n ? (deepClone(newConfig) as ConfigObject)\r\n : { ...newConfig };\r\n\r\n // 触发全局监听器\r\n this.globalListeners.forEach((cb) => cb(this.config, oldConfig, ''));\r\n }\r\n\r\n /**\r\n * 清空配置\r\n */\r\n clear(): void {\r\n this.reset({});\r\n }\r\n\r\n /**\r\n * 监听配置变更\r\n *\r\n * @param path - 配置路径(空字符串表示监听所有变更)\r\n * @param callback - 变更回调\r\n * @returns 取消监听函数\r\n *\r\n * @example\r\n * ```ts\r\n * // 监听特定路径\r\n * const unwatch = config.watch('api.timeout', (newVal, oldVal) => {\r\n * console.log(`timeout 从 ${oldVal} 变为 ${newVal}`)\r\n * })\r\n *\r\n * // 监听所有变更\r\n * config.watch('', (newConfig) => {\r\n * console.log('配置已更新:', newConfig)\r\n * })\r\n * ```\r\n */\r\n watch<T = ConfigValue>(path: string, callback: ConfigChangeCallback<T>): () => void {\r\n if (path === '') {\r\n this.globalListeners.add(callback as ConfigChangeCallback);\r\n return () => {\r\n this.globalListeners.delete(callback as ConfigChangeCallback);\r\n };\r\n }\r\n\r\n if (!this.listeners.has(path)) {\r\n this.listeners.set(path, new Set());\r\n }\r\n\r\n this.listeners.get(path)!.add(callback as ConfigChangeCallback);\r\n\r\n return () => {\r\n this.listeners.get(path)?.delete(callback as ConfigChangeCallback);\r\n };\r\n }\r\n\r\n /**\r\n * 通知监听器\r\n */\r\n // FIX: P1-10 增加 parentOldValues 参数,由调用方在修改值之前收集父路径旧值快照\r\n private notify<T>(\r\n path: string,\r\n newValue: T,\r\n oldValue: T,\r\n parentOldValues?: Map<string, unknown>,\r\n ): void {\r\n // 触发特定路径监听器\r\n const specificListeners = this.listeners.get(path);\r\n if (specificListeners) {\r\n specificListeners.forEach((cb) => cb(newValue, oldValue, path));\r\n }\r\n\r\n // 触发父路径监听器\r\n // FIX: P1-10 使用调用方传入的 parentOldValues 快照,确保获取的是变更前的旧值\r\n const parts = path.split('.');\r\n while (parts.length > 1) {\r\n parts.pop();\r\n const parentPath = parts.join('.');\r\n const parentListeners = this.listeners.get(parentPath);\r\n if (parentListeners) {\r\n const parentValue = this.get(parentPath);\r\n const parentOldValue = parentOldValues?.get(parentPath);\r\n parentListeners.forEach((cb) => cb(parentValue, parentOldValue, path));\r\n }\r\n }\r\n\r\n // 触发全局变更回调\r\n if (this.options.onChange) {\r\n this.options.onChange(newValue, oldValue, path);\r\n }\r\n\r\n // 触发全局监听器\r\n this.globalListeners.forEach((cb) => cb(newValue, oldValue, path));\r\n }\r\n\r\n /**\r\n * 设置可变性\r\n *\r\n * @param mutable - 是否可变\r\n */\r\n setMutable(mutable: boolean): void {\r\n this.options.mutable = mutable;\r\n }\r\n\r\n /**\r\n * 检查是否可变\r\n * FIX: P2-v11-09 简化 isMutable():mutable 在构造函数中已设置默认值为 true,\r\n * 不可能为 undefined,因此 ?? true 是冗余的\r\n */\r\n isMutable(): boolean {\r\n return this.options.mutable ?? true;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 全局配置实例\r\n// ============================================================\r\n\r\n/**\r\n * 默认全局配置\r\n */\r\nconst defaultGlobalConfig: ConfigObject = {\r\n // 开发配置\r\n dev: {\r\n warnOnImmutable: true,\r\n logLevel: 'warn',\r\n },\r\n\r\n // 性能配置\r\n performance: {\r\n asyncComponentTimeout: 5000,\r\n keepAliveMax: 10,\r\n transitionDuration: 300,\r\n },\r\n\r\n // 编译配置\r\n compiler: {\r\n comments: false,\r\n sourceMap: true,\r\n optimize: true,\r\n },\r\n\r\n // 运行时配置\r\n runtime: {\r\n errorHandler: null,\r\n warnHandler: null,\r\n globalProperties: {},\r\n },\r\n};\r\n\r\n/**\r\n * 全局配置管理器实例\r\n */\r\nlet globalConfigManager: ConfigManager | null = null;\r\n\r\n/**\r\n * 获取全局配置管理器\r\n *\r\n * @returns 全局配置管理器实例\r\n */\r\nexport function getGlobalConfig(): ConfigManager {\r\n if (!globalConfigManager) {\r\n globalConfigManager = new ConfigManager(defaultGlobalConfig);\r\n }\r\n return globalConfigManager;\r\n}\r\n\r\n/**\r\n * 设置全局配置\r\n *\r\n * @param config - 配置对象\r\n * @param merge - 是否合并\r\n */\r\nexport function setGlobalConfig(config: ConfigObject, merge = true): void {\r\n if (merge) {\r\n getGlobalConfig().merge(config);\r\n } else {\r\n getGlobalConfig().reset(config);\r\n }\r\n}\r\n\r\n/**\r\n * 获取全局配置值\r\n *\r\n * @param path - 配置路径\r\n * @param defaultValue - 默认值\r\n */\r\nexport function getConfig<T = ConfigValue>(path: string, defaultValue?: T): T | undefined {\r\n return getGlobalConfig().get(path, defaultValue);\r\n}\r\n\r\n/**\r\n * 设置全局配置值\r\n *\r\n * @param path - 配置路径\r\n * @param value - 配置值\r\n */\r\nexport function setConfig<T = ConfigValue>(path: string, value: T): boolean {\r\n return getGlobalConfig().set(path, value);\r\n}\r\n\r\n/**\r\n * 监听全局配置变更\r\n *\r\n * @param path - 配置路径\r\n * @param callback - 变更回调\r\n */\r\nexport function watchConfig<T = ConfigValue>(\r\n path: string,\r\n callback: ConfigChangeCallback<T>,\r\n): () => void {\r\n return getGlobalConfig().watch(path, callback);\r\n}\r\n\r\n// ============================================================\r\n// 配置预设\r\n// ============================================================\r\n\r\n/**\r\n * 配置预设\r\n */\r\nexport const configPresets = {\r\n /**\r\n * 开发环境预设\r\n */\r\n development: (): ConfigObject => ({\r\n dev: {\r\n warnOnImmutable: true,\r\n logLevel: 'debug',\r\n },\r\n compiler: {\r\n comments: true,\r\n sourceMap: true,\r\n optimize: false,\r\n },\r\n }),\r\n\r\n /**\r\n * 生产环境预设\r\n */\r\n production: (): ConfigObject => ({\r\n dev: {\r\n warnOnImmutable: false,\r\n logLevel: 'error',\r\n },\r\n compiler: {\r\n comments: false,\r\n sourceMap: false,\r\n optimize: true,\r\n },\r\n }),\r\n\r\n /**\r\n * 测试环境预设\r\n */\r\n test: (): ConfigObject => ({\r\n dev: {\r\n warnOnImmutable: true,\r\n logLevel: 'silent',\r\n },\r\n performance: {\r\n asyncComponentTimeout: 1000,\r\n keepAliveMax: 5,\r\n transitionDuration: 0,\r\n },\r\n }),\r\n};\r\n\r\n/**\r\n * 应用配置预设\r\n *\r\n * @param preset - 预设名称\r\n */\r\nexport function applyConfigPreset(preset: keyof typeof configPresets): void {\r\n const config = configPresets[preset]();\r\n setGlobalConfig(config, true);\r\n}\r\n\r\n// FIX: P2-batch2-5 删除底部重复的 export 块,\r\n// 所有符号已在定义处通过 export class/function/const 直接导出\r\n","// @lytjs/core - common-integration\r\n// 框架核心与 @lytjs/common-* 子包的集成点\r\n//\r\n// 此模块提供:\r\n// 1. HTTP 客户端集成(用于 SSR 数据预取等场景)\r\n// 2. URL/Query 工具集成(用于路由解析等场景)\r\n// 3. 安全工具集成(用于 XSS 防护)\r\n// 4. 缓存工具集成(用于组件缓存等场景)\r\n\r\n// ============================================================\r\n// 类型导入(避免运行时依赖)\r\n// ============================================================\r\n\r\n/**\r\n * HTTP 客户端类型(来自 @lytjs/common-http)\r\n *\r\n * 用途:\r\n * - SSR 数据预取\r\n * - API 请求封装\r\n * - 请求拦截和错误处理\r\n */\r\nexport interface HttpClientLike {\r\n get<T = unknown>(url: string, options?: unknown): Promise<T>;\r\n post<T = unknown>(url: string, data?: unknown, options?: unknown): Promise<T>;\r\n put<T = unknown>(url: string, data?: unknown, options?: unknown): Promise<T>;\r\n delete<T = unknown>(url: string, options?: unknown): Promise<T>;\r\n interceptors: {\r\n request: { use: (fn: unknown) => number };\r\n response: { use: (fn: unknown) => number };\r\n };\r\n}\r\n\r\n/**\r\n * URL 查询工具类型(来自 @lytjs/common-query)\r\n *\r\n * 用途:\r\n * - 路由参数解析\r\n * - URL 构建\r\n * - 查询字符串处理\r\n */\r\nexport interface QueryUtilsLike {\r\n parseQueryString(str: string): Record<string, string>;\r\n stringifyQueryString(obj: Record<string, unknown>): string;\r\n parseURL(url: string): {\r\n protocol: string;\r\n host: string;\r\n pathname: string;\r\n search: string;\r\n hash: string;\r\n };\r\n buildURL(base: string, params?: Record<string, unknown>): string;\r\n}\r\n\r\n/**\r\n * 安全工具类型(来自 @lytjs/common-security)\r\n *\r\n * 用途:\r\n * - XSS 防护\r\n * - HTML 转义\r\n * - 安全的动态内容处理\r\n */\r\nexport interface SecurityUtilsLike {\r\n escapeHtml(str: string): string;\r\n escapeAttr(str: string): string;\r\n sanitizeHtml(html: string, options?: unknown): string;\r\n}\r\n\r\n/**\r\n * 缓存工具类型(来自 @lytjs/common-cache)\r\n *\r\n * 用途:\r\n * - 组件实例缓存\r\n * - 计算结果缓存\r\n * - Keep-alive 实现\r\n */\r\nexport interface CacheUtilsLike {\r\n createLRUCache<K, V>(\r\n maxSize: number,\r\n ): {\r\n get(key: K): V | undefined;\r\n set(key: K, value: V): void;\r\n has(key: K): boolean;\r\n delete(key: K): boolean;\r\n clear(): void;\r\n size: number;\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 集成点注册\r\n// ============================================================\r\n\r\n/**\r\n * 框架核心集成点\r\n *\r\n * 允许外部模块(如路由、状态管理)注册其工具实现,\r\n * 使框架核心可以使用这些功能而无需直接依赖。\r\n */\r\nexport interface CoreIntegrations {\r\n http?: HttpClientLike;\r\n query?: QueryUtilsLike;\r\n security?: SecurityUtilsLike;\r\n cache?: CacheUtilsLike;\r\n}\r\n\r\n/**\r\n * 集成点作用域,与 App 实例关联。\r\n * 每个集成点作用域维护独立的集成配置,\r\n * 支持多 App 实例场景下各实例拥有不同的集成配置。\r\n */\r\nexport class IntegrationScope {\r\n private _integrations: CoreIntegrations = {};\r\n\r\n register(integrations: CoreIntegrations): void {\r\n this._integrations = { ...this._integrations, ...integrations };\r\n }\r\n\r\n unregister(...keys: (keyof CoreIntegrations)[]): void {\r\n for (const key of keys) {\r\n delete this._integrations[key];\r\n }\r\n }\r\n\r\n reset(): void {\r\n this._integrations = {};\r\n }\r\n\r\n get integrations(): CoreIntegrations {\r\n return this._integrations;\r\n }\r\n\r\n getHttpClient(): HttpClientLike | undefined {\r\n return this._integrations.http;\r\n }\r\n\r\n getQueryUtils(): QueryUtilsLike | undefined {\r\n return this._integrations.query;\r\n }\r\n\r\n getSecurityUtils(): SecurityUtilsLike | undefined {\r\n return this._integrations.security;\r\n }\r\n\r\n getCacheUtils(): CacheUtilsLike | undefined {\r\n return this._integrations.cache;\r\n }\r\n}\r\n\r\n// 全局集成点存储(向后兼容)\r\nlet _integrations: CoreIntegrations = {};\r\n\r\n/**\r\n * 注册集成点(全局,向后兼容)\r\n */\r\nexport function registerIntegrations(integrations: CoreIntegrations): void {\r\n _integrations = { ..._integrations, ...integrations };\r\n}\r\n\r\n/**\r\n * 重置全局集成点\r\n */\r\nexport function resetIntegrations(): void {\r\n _integrations = {};\r\n}\r\n\r\n/**\r\n * 获取 HTTP 客户端\r\n */\r\nexport function getHttpClient(): HttpClientLike | undefined {\r\n return _integrations.http;\r\n}\r\n\r\n/**\r\n * 获取查询工具\r\n */\r\nexport function getQueryUtils(): QueryUtilsLike | undefined {\r\n return _integrations.query;\r\n}\r\n\r\n/**\r\n * 获取安全工具\r\n */\r\nexport function getSecurityUtils(): SecurityUtilsLike | undefined {\r\n return _integrations.security;\r\n}\r\n\r\n/**\r\n * 获取缓存工具\r\n */\r\nexport function getCacheUtils(): CacheUtilsLike | undefined {\r\n return _integrations.cache;\r\n}\r\n\r\n// ============================================================\r\n// 便捷方法\r\n// ============================================================\r\n\r\n/**\r\n * 安全转义 HTML(如果有安全工具则使用,否则使用基础实现)\r\n */\r\nexport function safeEscapeHtml(str: string): string {\r\n const security = getSecurityUtils();\r\n if (security) {\r\n return security.escapeHtml(str);\r\n }\r\n // 基础实现\r\n // FIX: P2-batch1-10 添加反斜杠转义,防止 XSS 攻击\r\n return str\r\n .replace(/\\\\/g, '&#92;')\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#39;');\r\n}\r\n\r\n/**\r\n * 解析查询字符串(如果有查询工具则使用,否则使用基础实现)\r\n */\r\nexport function safeParseQueryString(str: string): Record<string, string> {\r\n const query = getQueryUtils();\r\n if (query) {\r\n return query.parseQueryString(str);\r\n }\r\n // 基础实现\r\n const result: Record<string, string> = {};\r\n if (!str) return result;\r\n const searchParams = new URLSearchParams(str.startsWith('?') ? str.slice(1) : str);\r\n for (const [key, value] of searchParams) {\r\n result[key] = value;\r\n }\r\n return result;\r\n}\r\n","/**\n * @lytjs/core - 错误边界组件\n *\n * 提供强大的错误处理和恢复机制\n */\n\nimport type { VNode } from '@lytjs/vdom';\nimport { createVNode } from '@lytjs/vdom';\n\n/** 错误信息 */\nexport interface ErrorInfo {\n componentStack?: string;\n timestamp: Date;\n}\n\n/** 降级组件属性 */\nexport interface FallbackProps {\n error: Error;\n errorInfo: ErrorInfo;\n reset: () => void;\n retry: () => void;\n retryCount: number;\n maxRetries: number;\n hasRetries: boolean;\n}\n\n/** 错误边界属性 */\nexport interface ErrorBoundaryProps {\n fallback?: any;\n fallbackRender?: (error: Error, errorInfo: ErrorInfo, reset: () => void) => VNode;\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n maxRetries?: number;\n retryDelay?: number;\n onRetry?: (retryCount: number) => void;\n onMaxRetriesReached?: (error: Error) => void;\n}\n\n/** 错误报告上下文 */\nexport interface ErrorContext {\n componentName?: string;\n props?: Record<string, unknown>;\n state?: Record<string, unknown>;\n url?: string;\n userAgent?: string;\n timestamp: Date;\n}\n\n/** 错误报告器接口 */\nexport interface ErrorReporter {\n report(error: Error, context: ErrorContext): void;\n}\n\n/** 错误日志 */\nexport interface ErrorLog {\n id: string;\n timestamp: Date;\n error: Error;\n errorInfo: ErrorInfo;\n context: ErrorContext;\n retryCount: number;\n}\n\n/** 默认错误报告器 - 控制台输出 */\nclass ConsoleErrorReporter implements ErrorReporter {\n report(error: Error, context: ErrorContext): void {\n console.error('[LytJS ErrorBoundary]', {\n message: error.message,\n stack: error.stack,\n context: context,\n });\n }\n}\n\n/** 全局错误报告器 */\nlet globalReporter: ErrorReporter = new ConsoleErrorReporter();\n\n/** 设置全局错误报告器 */\nexport function setGlobalErrorReporter(reporter: ErrorReporter): void {\n globalReporter = reporter;\n}\n\n/** 获取全局错误报告器 */\nexport function getGlobalErrorReporter(): ErrorReporter {\n return globalReporter;\n}\n\n/** 错误日志管理器 */\nclass ErrorLogManager {\n private logs: ErrorLog[] = [];\n private maxLogs: number = 100;\n\n addLog(log: ErrorLog): void {\n this.logs.unshift(log);\n if (this.logs.length > this.maxLogs) {\n this.logs = this.logs.slice(0, this.maxLogs);\n }\n }\n\n getLogs(): ErrorLog[] {\n return [...this.logs];\n }\n\n clearLogs(): void {\n this.logs = [];\n }\n\n exportLogs(): string {\n return JSON.stringify(this.logs, null, 2);\n }\n\n getLogById(id: string): ErrorLog | undefined {\n return this.logs.find(log => log.id === id);\n }\n\n getLogsByErrorType(errorType: string): ErrorLog[] {\n return this.logs.filter(log => log.error.name === errorType);\n }\n\n getLogsByDateRange(start: Date, end: Date): ErrorLog[] {\n return this.logs.filter(log => log.timestamp >= start && log.timestamp <= end);\n }\n\n getErrorStats(): {\n totalErrors: number;\n errorTypes: Record<string, number>;\n recentErrors: ErrorLog[];\n } {\n const errorTypes: Record<string, number> = {};\n this.logs.forEach(log => {\n const type = log.error.name || 'Unknown';\n errorTypes[type] = (errorTypes[type] || 0) + 1;\n });\n\n return {\n totalErrors: this.logs.length,\n errorTypes,\n recentErrors: this.logs.slice(0, 10),\n };\n }\n}\n\n/** 全局错误日志管理器实例 */\nexport const errorLogManager = new ErrorLogManager();\n\n/** 生成唯一 ID */\nexport function generateErrorId(): string {\n return `err_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/** 创建 VNode 的辅助函数 */\nfunction createElement(type: any, props: any, ...children: any[]): VNode {\n return createVNode(type, props, children);\n}\n\n/** 默认错误降级组件 */\nfunction DefaultErrorFallback(props: FallbackProps): VNode {\n return createElement('div', {\n class: 'error-boundary-fallback',\n style: 'padding: 20px; background: #fee; border: 1px solid #fcc; border-radius: 8px;',\n }, [\n createElement('h3', { style: 'color: #c00; margin-bottom: 10px;' }, '出错了'),\n createElement('p', { style: 'color: #666; margin-bottom: 10px;' }, props.error.message),\n createElement('div', { style: 'display: flex; gap: 10px; margin-top: 10px;' }, [\n props.hasRetries && createElement('button', {\n style: 'padding: 8px 16px; background: #667eea; color: white; border: none; border-radius: 4px; cursor: pointer;',\n onClick: () => props.retry(),\n }, `重试 (${props.retryCount}/${props.maxRetries})`),\n createElement('button', {\n style: 'padding: 8px 16px; background: #6c757d; color: white; border: none; border-radius: 4px; cursor: pointer;',\n onClick: () => props.reset(),\n }, '重置'),\n ]),\n props.retryCount > 0 && createElement('p', { style: 'color: #999; font-size: 0.9em; margin-top: 10px;' },\n `已重试 ${props.retryCount} 次`\n ),\n ]);\n}\n\n/** 错误边界组件状态 */\ninterface ErrorBoundaryState {\n error: Error | null;\n errorInfo: ErrorInfo | null;\n retryCount: number;\n resetKey: number;\n isRetrying: boolean;\n}\n\n/** 错误边界组件实现 */\nexport function ErrorBoundary(props: ErrorBoundaryProps): VNode {\n const maxRetries = props.maxRetries ?? 3;\n const retryDelay = props.retryDelay ?? 1000;\n\n const state: ErrorBoundaryState = {\n error: null,\n errorInfo: null,\n retryCount: 0,\n resetKey: 0,\n isRetrying: false,\n };\n\n const reset = () => {\n state.error = null;\n state.errorInfo = null;\n state.retryCount = 0;\n state.isRetrying = false;\n state.resetKey++;\n };\n\n const retry = () => {\n if (state.retryCount < maxRetries) {\n state.isRetrying = true;\n\n if (props.onRetry) {\n props.onRetry(state.retryCount + 1);\n }\n\n setTimeout(() => {\n reset();\n }, retryDelay);\n } else {\n if (props.onMaxRetriesReached && state.error) {\n props.onMaxRetriesReached(state.error);\n }\n }\n };\n\n const getFallback = (): VNode => {\n const hasRetries = state.retryCount < maxRetries;\n\n if (props.fallback) {\n return createElement(props.fallback, {\n error: state.error!,\n errorInfo: state.errorInfo!,\n reset,\n retry,\n retryCount: state.retryCount,\n maxRetries,\n hasRetries,\n } as FallbackProps);\n }\n\n if (props.fallbackRender) {\n return props.fallbackRender(state.error!, state.errorInfo!, reset);\n }\n\n return DefaultErrorFallback({\n error: state.error!,\n errorInfo: state.errorInfo!,\n reset,\n retry,\n retryCount: state.retryCount,\n maxRetries,\n hasRetries,\n });\n };\n\n if (state.error) {\n return createElement('error-boundary-wrapper', { 'data-error': 'true', key: `reset-${state.resetKey}` }, [\n getFallback(),\n ]);\n }\n\n return createElement('error-boundary-wrapper', {\n 'data-error': 'false',\n key: `reset-${state.resetKey}`,\n }, null);\n}\n\n/** 错误边界钩子 - 用于手动触发错误 */\nexport function useErrorHandler(): (error: Error) => void {\n return (error: Error) => {\n throw error;\n };\n}\n\n/** 错误边界重置钩子 */\nexport function useErrorBoundaryReset(): () => void {\n return () => {\n console.warn('useErrorBoundaryReset should be used within ErrorBoundary');\n };\n}\n\n/** 导出默认 ErrorBoundary 组件 */\nexport default ErrorBoundary;\n","// src/index.ts\r\n// @lytjs/core - 核心入口\r\n\r\nexport { createApp } from './create-app';\r\nexport { h, h as createElement } from './h';\r\nexport { defineComponent, defineAsyncComponent } from './define-component';\r\nexport { nextTick } from './next-tick';\r\nexport { resolveComponent, resolveDirective, resolveDynamicComponent } from './resolve';\r\nexport { withDirectives, withMemo } from './directives';\r\nexport {\r\n useSlots,\r\n useAttrs,\r\n useModel,\r\n useTemplateRef,\r\n defineModel,\r\n useId,\r\n useCssModule,\r\n useCssVars,\r\n} from './composition';\r\nexport {\r\n defineCustomElement,\r\n useShadowRoot,\r\n useHost,\r\n useWebComponentSlots,\r\n injectChildStyles,\r\n} from './web-component';\r\nexport type { DefineCustomElementOptions } from './web-component';\r\nexport {\r\n onMounted,\r\n onUnmounted,\r\n onUpdated,\r\n onBeforeMount,\r\n onBeforeUnmount,\r\n onBeforeUpdate,\r\n onErrorCaptured,\r\n onRenderTracked,\r\n onRenderTriggered,\r\n // FIX: P2-batch2-6 补充导出 onActivated/onDeactivated 生命周期钩子\r\n onActivated,\r\n onDeactivated,\r\n} from './lifecycle';\r\n\r\n// 插件系统增强\r\nexport { PluginRegistry } from './plugin-registry';\r\nexport { PluginValidator } from './plugin-validator';\r\nexport type {\r\n ValidationReport,\r\n ValidationIssue,\r\n} from './plugin-validator';\r\n\r\n// 配置 Schema 系统\r\nexport { ConfigValidator, validateConfig } from './config-validator';\r\nexport { ConfigTransformer, transformConfig, mergeConfig } from './config-transformer';\r\nexport type {\r\n ConfigSchema,\r\n SchemaType,\r\n StringSchema,\r\n NumberSchema,\r\n BooleanSchema,\r\n ObjectSchema,\r\n ArraySchema,\r\n EnumSchema,\r\n UnionSchema,\r\n StringFormat,\r\n ConfigValidationReport,\r\n ConfigValidationError,\r\n ValidationErrorCode,\r\n ConfigTransformReport,\r\n ValidationContext,\r\n ValidationResult,\r\n} from './config-schema';\r\n\r\n// Plugin SDK\r\nexport {\r\n definePlugin,\r\n validatePluginConfig,\r\n transformPluginConfig,\r\n mergePluginConfig,\r\n createPluginTester,\r\n testPluginInstall,\r\n} from './plugin-sdk';\r\nexport type {\r\n PluginConfig,\r\n PluginDefinition,\r\n PluginTesterOptions,\r\n PluginTester,\r\n} from './plugin-sdk';\r\n\r\n// 全局配置系统\r\nexport {\r\n ConfigManager,\r\n getGlobalConfig,\r\n setGlobalConfig,\r\n getConfig,\r\n setConfig,\r\n watchConfig,\r\n configPresets,\r\n applyConfigPreset,\r\n} from './config';\r\nexport type {\r\n ConfigChangeCallback,\r\n ConfigOptions,\r\n ConfigValue,\r\n ConfigObject,\r\n ConfigArray,\r\n} from './config';\r\n\r\n// Re-export from sub-packages\r\nexport { ref, reactive, computed, watch, watchEffect, effect } from '@lytjs/reactivity';\r\nexport { createVNode, Fragment, Text, Comment, cloneVNode, mergeProps } from '@lytjs/vdom';\r\nexport { compile } from '@lytjs/compiler';\r\n\r\nexport type {\r\n App,\r\n AppConfig,\r\n AppOptions,\r\n Plugin,\r\n PluginInstallFunction,\r\n PluginWithCleanup,\r\n PluginFunctionWithCleanup,\r\n EnhancedPlugin,\r\n PluginMeta,\r\n PluginDependency,\r\n RegisteredPlugin,\r\n RegistrationResult,\r\n DependencyResult,\r\n PluginLifecycleEvent,\r\n PluginEventListener,\r\n Component,\r\n ComponentOptions,\r\n VNode,\r\n VNodeChildren,\r\n Renderer,\r\n Directive,\r\n DirectiveBinding,\r\n DirectiveArguments,\r\n AsyncComponentLoader,\r\n AsyncComponentOptions,\r\n ErrorCapturedHook,\r\n DebuggerHook,\r\n DebuggerEvent,\r\n ComponentPublicInstance,\r\n} from './types';\r\n\r\n// Common 子包集成点\r\nexport {\r\n registerIntegrations,\r\n getHttpClient,\r\n getQueryUtils,\r\n getSecurityUtils,\r\n getCacheUtils,\r\n safeEscapeHtml,\r\n safeParseQueryString,\r\n} from './common-integration';\r\nexport type {\r\n HttpClientLike,\r\n QueryUtilsLike,\r\n SecurityUtilsLike,\r\n CacheUtilsLike,\r\n CoreIntegrations,\r\n} from './common-integration';\r\n\r\n// 错误边界系统(v6.3 新增)\r\nexport {\r\n ErrorBoundary,\r\n useErrorHandler,\r\n useErrorBoundaryReset,\r\n setGlobalErrorReporter,\r\n getGlobalErrorReporter,\r\n errorLogManager,\r\n} from './error-boundary';\r\nexport type {\r\n ErrorBoundaryProps,\r\n FallbackProps,\r\n ErrorInfo,\r\n ErrorReporter,\r\n ErrorContext,\r\n ErrorLog,\r\n} from './error-boundary';\r\n"]}
1
+ {"version":3,"sources":["../src/app-context.ts","../src/plugin-registry.ts","../src/plugin-validator.ts","../src/create-app.ts","../src/h.ts","../src/define-component.ts","../src/next-tick.ts","../src/resolve.ts","../src/directives.ts","../src/composition.ts","../src/web-component.ts","../src/lifecycle.ts","../src/config-validator.ts","../src/config-transformer.ts","../src/plugin-sdk.ts","../src/config.ts","../src/common-integration.ts","../src/error-boundary.ts","../src/index.ts"],"names":["createBaseAppContext","options","error","createVNode","comp","_defineComponent","result","getCurrentInstance","ref","shallowRef","createAppContext","createComponentInstance","setupComponent","createDOMRenderer","callUnmountedHook","createApp","h","cloneVNode","computed","onBeforeUnmount","onMounted","watch","watchEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["// src/app-context.ts\r\n// @lytjs/core - AppContext 创建和配置\r\n\r\nimport type { AppConfig, DOMRenderer, VNode } from './types';\r\nimport { createAppContext as createBaseAppContext } from '@lytjs/component';\r\nimport type { AppContext as BaseAppContext, ComponentInternalInstance } from '@lytjs/component';\r\n\r\n/**\r\n * Core AppContext extends the base AppContext from @lytjs/component\r\n * with runtime fields needed by the app lifecycle (renderer, _vnode, _container).\r\n */\r\nexport interface AppContext extends BaseAppContext {\r\n renderer: DOMRenderer | null;\r\n _vnode: VNode | null;\r\n _container: Element | null;\r\n _instance: ComponentInternalInstance | null;\r\n}\r\n\r\n/**\r\n * 创建应用上下文对象\r\n * 基于 @lytjs/component 的 createAppContext 扩展运行时字段\r\n */\r\nexport function createAppContext(): AppContext {\r\n return {\r\n ...createBaseAppContext(),\r\n config: {\r\n performance: false,\r\n globalProperties: {},\r\n } as AppConfig,\r\n renderer: null,\r\n _vnode: null,\r\n _container: null,\r\n _instance: null,\r\n };\r\n}\r\n\r\n/**\r\n * 创建代理配置对象,读写操作映射到 context.config\r\n */\r\nexport function createContextConfig(context: AppContext): AppConfig {\r\n return new Proxy({} as AppConfig, {\r\n get(_, key: string) {\r\n if (key === 'globalProperties') {\r\n return context.config.globalProperties;\r\n }\r\n return (context.config as Record<string, unknown>)[key];\r\n },\r\n set(_, key: string, value: unknown) {\r\n if (key === 'globalProperties') {\r\n context.config.globalProperties = value as Record<string, unknown>;\r\n return true;\r\n }\r\n (context.config as Record<string, unknown>)[key] = value;\r\n return true;\r\n },\r\n ownKeys() {\r\n return Reflect.ownKeys(context.config);\r\n },\r\n has(_, key: string) {\r\n return key in context.config;\r\n },\r\n getOwnPropertyDescriptor(_, key: string) {\r\n return Object.getOwnPropertyDescriptor(context.config, key);\r\n },\r\n });\r\n}\r\n","// src/plugin-registry.ts\r\n// @lytjs/core - 插件注册表实现\r\n\r\nimport { error } from '@lytjs/common-error';\r\nimport type {\r\n EnhancedPlugin,\r\n Plugin,\r\n RegisteredPlugin,\r\n RegistrationResult,\r\n DependencyResult,\r\n PluginLifecycleEvent,\r\n PluginEventListener,\r\n} from './types';\r\n\r\n/**\r\n * 插件注册表\r\n * @description 管理插件的注册、注销、查询和依赖关系\r\n *\r\n * @example\r\n * ```typescript\r\n * const registry = new PluginRegistry();\r\n *\r\n * // 注册插件\r\n * registry.register(myPlugin, { theme: 'dark' });\r\n *\r\n * // 查询插件\r\n * const plugin = registry.get('my-plugin');\r\n *\r\n * // 检查依赖\r\n * const result = registry.checkDependencies(anotherPlugin);\r\n *\r\n * // 监听事件\r\n * registry.on('after:install', (event, data) => {\r\n * console.log(`Plugin ${data.name} installed`);\r\n * });\r\n * ```\r\n */\r\nexport class PluginRegistry {\r\n /** 已注册插件映射(name → RegisteredPlugin) */\r\n private plugins = new Map<string, RegisteredPlugin>();\r\n\r\n /** 事件监听器映射 */\r\n private listeners = new Map<PluginLifecycleEvent, Set<PluginEventListener>>();\r\n\r\n constructor() {}\r\n\r\n /**\r\n * 注册插件\r\n * @param plugin - 插件实例(EnhancedPlugin 或基础 Plugin)\r\n * @param options - 安装选项\r\n * @returns 注册结果\r\n */\r\n register(plugin: EnhancedPlugin | Plugin, options: unknown = undefined): RegistrationResult {\r\n // 获取插件名称\r\n const name = this.getPluginName(plugin);\r\n\r\n if (!name) {\r\n const result: RegistrationResult = {\r\n success: false,\r\n name: 'anonymous',\r\n error: 'Plugin must have a name property. Use EnhancedPlugin interface for full support.',\r\n };\r\n this.emit('error', result);\r\n return result;\r\n }\r\n\r\n // 检查是否已注册\r\n if (this.plugins.has(name)) {\r\n const result: RegistrationResult = {\r\n success: false,\r\n name,\r\n error: `Plugin \"${name}\" is already registered.`,\r\n };\r\n this.emit('error', result);\r\n return result;\r\n }\r\n\r\n // 如果是 EnhancedPlugin,检查冲突\r\n if (this.isEnhancedPlugin(plugin)) {\r\n const conflict = this.checkConflicts(plugin);\r\n if (conflict) {\r\n const result: RegistrationResult = {\r\n success: false,\r\n name,\r\n error: `Plugin \"${name}\" conflicts with: ${conflict.join(', ')}`,\r\n };\r\n this.emit('error', result);\r\n return result;\r\n }\r\n }\r\n\r\n // 触发 before:register 事件\r\n this.emit('before:register', { name, plugin });\r\n\r\n // 注册插件\r\n const registered: RegisteredPlugin = {\r\n plugin: this.normalizePlugin(plugin),\r\n options,\r\n installed: false,\r\n registeredAt: Date.now(),\r\n };\r\n\r\n this.plugins.set(name, registered);\r\n\r\n // 触发 after:register 事件\r\n this.emit('after:register', { name, plugin });\r\n\r\n return { success: true, name };\r\n }\r\n\r\n /**\r\n * 注销插件\r\n * @param name - 插件名称\r\n * @returns 是否成功注销\r\n */\r\n unregister(name: string): boolean {\r\n const registered = this.plugins.get(name);\r\n if (!registered) {\r\n return false;\r\n }\r\n\r\n // 触发 before:unregister 事件\r\n this.emit('before:unregister', { name, plugin: registered.plugin });\r\n\r\n // 如果已安装,先调用 cleanup\r\n if (registered.installed && registered.plugin.cleanup) {\r\n try {\r\n const cleanupResult = registered.plugin.cleanup();\r\n // 处理异步 cleanup\r\n if (cleanupResult instanceof Promise) {\r\n cleanupResult.catch((err) => {\r\n error(\r\n `Plugin \"${name}\" async cleanup failed: ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n });\r\n }\r\n } catch (err) {\r\n error(\r\n `Plugin \"${name}\" cleanup failed: ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n }\r\n }\r\n\r\n this.plugins.delete(name);\r\n\r\n // 触发 after:unregister 事件\r\n this.emit('after:unregister', { name });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * 获取已注册插件信息\r\n * @param name - 插件名称\r\n * @returns 插件注册信息,如果未找到则返回 undefined\r\n */\r\n get(name: string): RegisteredPlugin | undefined {\r\n return this.plugins.get(name);\r\n }\r\n\r\n /**\r\n * 获取已注册的插件实例\r\n * @param name - 插件名称\r\n * @returns 插件实例,如果未找到则返回 undefined\r\n */\r\n getPlugin(name: string): EnhancedPlugin | undefined {\r\n return this.plugins.get(name)?.plugin;\r\n }\r\n\r\n /**\r\n * 检查插件是否已注册\r\n * @param name - 插件名称\r\n */\r\n has(name: string): boolean {\r\n return this.plugins.has(name);\r\n }\r\n\r\n /**\r\n * 获取所有已注册插件名称\r\n */\r\n getNames(): string[] {\r\n return Array.from(this.plugins.keys());\r\n }\r\n\r\n /**\r\n * 获取所有已注册插件信息\r\n */\r\n getAll(): RegisteredPlugin[] {\r\n return Array.from(this.plugins.values());\r\n }\r\n\r\n /**\r\n * 获取已安装插件列表\r\n */\r\n getInstalled(): RegisteredPlugin[] {\r\n return this.getAll().filter((p) => p.installed);\r\n }\r\n\r\n /**\r\n * 标记插件为已安装\r\n * @param name - 插件名称\r\n */\r\n markInstalled(name: string): void {\r\n const registered = this.plugins.get(name);\r\n if (registered) {\r\n registered.installed = true;\r\n registered.installedAt = Date.now();\r\n }\r\n }\r\n\r\n /**\r\n * 标记插件为未安装\r\n * @param name - 插件名称\r\n */\r\n markUninstalled(name: string): void {\r\n const registered = this.plugins.get(name);\r\n if (registered) {\r\n registered.installed = false;\r\n registered.installedAt = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 检查插件依赖是否满足\r\n * @param plugin - 要检查的插件\r\n * @returns 依赖检查结果\r\n */\r\n checkDependencies(plugin: EnhancedPlugin | Plugin): DependencyResult {\r\n const result: DependencyResult = {\r\n satisfied: true,\r\n missing: [],\r\n missingOptional: [],\r\n versionMismatch: [],\r\n };\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return result;\r\n }\r\n\r\n // 检查必需依赖\r\n if (plugin.dependencies) {\r\n for (const dep of plugin.dependencies) {\r\n const registered = this.plugins.get(dep.name);\r\n if (!registered) {\r\n result.satisfied = false;\r\n result.missing.push({ name: dep.name, version: dep.version });\r\n } else if (dep.version && registered.plugin.version) {\r\n // 简单版本比较(支持前缀 ^, ~, >=, >, <, <=, =)\r\n if (!this.satisfiesVersion(registered.plugin.version, dep.version)) {\r\n result.satisfied = false;\r\n result.versionMismatch.push({\r\n name: dep.name,\r\n expected: dep.version,\r\n actual: registered.plugin.version,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 检查可选依赖\r\n if (plugin.optionalDependencies) {\r\n for (const dep of plugin.optionalDependencies) {\r\n const registered = this.plugins.get(dep.name);\r\n if (!registered) {\r\n result.missingOptional.push({ name: dep.name, version: dep.version });\r\n } else if (dep.version && registered.plugin.version) {\r\n if (!this.satisfiesVersion(registered.plugin.version, dep.version)) {\r\n result.versionMismatch.push({\r\n name: dep.name,\r\n expected: dep.version,\r\n actual: registered.plugin.version,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 解析插件加载顺序(拓扑排序)\r\n * @description 根据依赖关系计算正确的安装顺序\r\n * @returns 排序后的插件列表\r\n * @throws 如果存在循环依赖则抛出错误\r\n */\r\n resolveLoadOrder(): EnhancedPlugin[] {\r\n const visited = new Set<string>();\r\n const visiting = new Set<string>();\r\n const result: EnhancedPlugin[] = [];\r\n\r\n const visit = (name: string) => {\r\n if (visited.has(name)) return;\r\n if (visiting.has(name)) {\r\n throw new Error(`Circular dependency detected involving plugin \"${name}\"`);\r\n }\r\n\r\n visiting.add(name);\r\n\r\n const registered = this.plugins.get(name);\r\n if (registered && this.isEnhancedPlugin(registered.plugin)) {\r\n // 先访问依赖\r\n if (registered.plugin.dependencies) {\r\n for (const dep of registered.plugin.dependencies) {\r\n if (this.plugins.has(dep.name)) {\r\n visit(dep.name);\r\n }\r\n }\r\n }\r\n }\r\n\r\n visiting.delete(name);\r\n visited.add(name);\r\n\r\n if (registered) {\r\n result.push(registered.plugin);\r\n }\r\n };\r\n\r\n // 按注册顺序遍历\r\n for (const name of this.plugins.keys()) {\r\n visit(name);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 获取插件数量\r\n */\r\n get size(): number {\r\n return this.plugins.size;\r\n }\r\n\r\n /**\r\n * 清空所有已注册插件\r\n */\r\n clear(): void {\r\n // 先调用所有已安装插件的 cleanup\r\n for (const [name, registered] of this.plugins) {\r\n if (registered.installed && registered.plugin.cleanup) {\r\n try {\r\n registered.plugin.cleanup();\r\n } catch (err) {\r\n error(\r\n `Plugin \"${name}\" cleanup failed during clear: ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n }\r\n }\r\n }\r\n this.plugins.clear();\r\n }\r\n\r\n // ==================== 事件系统 ====================\r\n\r\n /**\r\n * 注册事件监听器\r\n * @param event - 事件类型\r\n * @param handler - 事件处理函数\r\n * @returns 取消监听的函数\r\n */\r\n on(event: PluginLifecycleEvent, handler: PluginEventListener): () => void {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(handler);\r\n\r\n // 返回取消监听函数\r\n return () => {\r\n this.listeners.get(event)?.delete(handler);\r\n };\r\n }\r\n\r\n /**\r\n * 触发事件\r\n * @param event - 事件类型\r\n * @param data - 事件数据\r\n */\r\n emit(event: PluginLifecycleEvent, data: unknown): void {\r\n const handlers = this.listeners.get(event);\r\n if (handlers) {\r\n for (const handler of handlers) {\r\n try {\r\n handler(event, data);\r\n } catch (err) {\r\n error(\r\n `Plugin event handler error for \"${event}\": ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 移除事件监听器\r\n * @param event - 事件类型\r\n * @param handler - 事件处理函数\r\n */\r\n off(event: PluginLifecycleEvent, handler: PluginEventListener): void {\r\n this.listeners.get(event)?.delete(handler);\r\n }\r\n\r\n // ==================== 内部工具方法 ====================\r\n\r\n /**\r\n * 获取插件名称\r\n */\r\n private getPluginName(plugin: EnhancedPlugin | Plugin): string | undefined {\r\n if (this.isEnhancedPlugin(plugin)) {\r\n return plugin.name;\r\n }\r\n // 基础 Plugin 尝试从 name 属性获取\r\n return (plugin as unknown as Record<string, unknown>).name as string | undefined;\r\n }\r\n\r\n /**\r\n * 检查是否为 EnhancedPlugin\r\n */\r\n private isEnhancedPlugin(plugin: EnhancedPlugin | Plugin): plugin is EnhancedPlugin {\r\n return 'name' in plugin && typeof (plugin as EnhancedPlugin).name === 'string';\r\n }\r\n\r\n /**\r\n * 将基础 Plugin 标准化为 EnhancedPlugin\r\n */\r\n private normalizePlugin(plugin: EnhancedPlugin | Plugin): EnhancedPlugin {\r\n if (this.isEnhancedPlugin(plugin)) {\r\n return plugin;\r\n }\r\n // 为基础 Plugin 生成匿名名称\r\n const anonymousName = `anonymous-plugin-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\r\n return {\r\n install: plugin.install,\r\n name: anonymousName,\r\n };\r\n }\r\n\r\n /**\r\n * 检查插件冲突\r\n */\r\n private checkConflicts(plugin: EnhancedPlugin): string[] | null {\r\n if (!plugin.conflicts || plugin.conflicts.length === 0) {\r\n return null;\r\n }\r\n\r\n const conflicts: string[] = [];\r\n for (const conflictName of plugin.conflicts) {\r\n if (this.plugins.has(conflictName)) {\r\n conflicts.push(conflictName);\r\n }\r\n }\r\n\r\n return conflicts.length > 0 ? conflicts : null;\r\n }\r\n\r\n /**\r\n * 简单的 semver 版本比较\r\n * @description 支持 ^, ~, >=, >, <, <=, = 前缀\r\n */\r\n private satisfiesVersion(actual: string, expected: string): boolean {\r\n const actualVersion = this.parseVersion(actual);\r\n if (!actualVersion) return false;\r\n\r\n // 解析期望版本范围\r\n const range = expected.trim();\r\n let prefix = '';\r\n let expectedVersion = range;\r\n\r\n if (\r\n range.startsWith('^') ||\r\n range.startsWith('~') ||\r\n range.startsWith('>') ||\r\n range.startsWith('<') ||\r\n range.startsWith('=')\r\n ) {\r\n const firstChar = range[0] as string;\r\n prefix = firstChar;\r\n expectedVersion = range.slice(1).trim();\r\n // 处理 >= 和 <=\r\n if (range.startsWith('>=') || range.startsWith('<=')) {\r\n prefix = range.slice(0, 2);\r\n expectedVersion = range.slice(2).trim();\r\n }\r\n }\r\n\r\n const expectedParsed = this.parseVersion(expectedVersion);\r\n if (!expectedParsed) return false;\r\n\r\n switch (prefix) {\r\n case '':\r\n case '=':\r\n // 精确匹配\r\n return (\r\n actualVersion.major === expectedParsed.major &&\r\n actualVersion.minor === expectedParsed.minor &&\r\n actualVersion.patch === expectedParsed.patch\r\n );\r\n\r\n case '^':\r\n // 兼容主版本(^1.2.3 允许 >=1.2.3 <2.0.0)\r\n return (\r\n actualVersion.major === expectedParsed.major &&\r\n (actualVersion.minor > expectedParsed.minor ||\r\n (actualVersion.minor === expectedParsed.minor &&\r\n actualVersion.patch >= expectedParsed.patch))\r\n );\r\n\r\n case '~':\r\n // 兼容次版本(~1.2.3 允许 >=1.2.3 <1.3.0)\r\n return (\r\n actualVersion.major === expectedParsed.major &&\r\n actualVersion.minor === expectedParsed.minor &&\r\n actualVersion.patch >= expectedParsed.patch\r\n );\r\n\r\n case '>':\r\n return this.compareVersions(actualVersion, expectedParsed) > 0;\r\n\r\n case '>=':\r\n return this.compareVersions(actualVersion, expectedParsed) >= 0;\r\n\r\n case '<':\r\n return this.compareVersions(actualVersion, expectedParsed) < 0;\r\n\r\n case '<=':\r\n return this.compareVersions(actualVersion, expectedParsed) <= 0;\r\n\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * 解析版本号字符串\r\n */\r\n private parseVersion(version: string): { major: number; minor: number; patch: number } | null {\r\n const match = version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)/);\r\n if (!match) return null;\r\n return {\r\n major: parseInt(match[1]!, 10),\r\n minor: parseInt(match[2]!, 10),\r\n patch: parseInt(match[3]!, 10),\r\n };\r\n }\r\n\r\n /**\r\n * 比较两个版本号\r\n * @returns 正数表示 a > b,负数表示 a < b,0 表示相等\r\n */\r\n private compareVersions(\r\n a: { major: number; minor: number; patch: number },\r\n b: { major: number; minor: number; patch: number },\r\n ): number {\r\n if (a.major !== b.major) return a.major - b.major;\r\n if (a.minor !== b.minor) return a.minor - b.minor;\r\n return a.patch - b.patch;\r\n }\r\n}\r\n","// src/plugin-validator.ts\r\n// @lytjs/core - 插件验证器实现\r\n\r\nimport type { EnhancedPlugin, Plugin, PluginDependency } from './types';\r\n\r\n/**\r\n * 验证报告中的单个问题\r\n */\r\nexport interface ValidationIssue {\r\n /** 问题级别 */\r\n level: 'error' | 'warning' | 'info';\r\n /** 问题规则名称 */\r\n rule: string;\r\n /** 问题描述 */\r\n message: string;\r\n}\r\n\r\n/**\r\n * 插件验证报告\r\n * @description 包含验证结果和所有发现的问题\r\n */\r\nexport interface ValidationReport {\r\n /** 是否通过验证(无 error 级别问题) */\r\n valid: boolean;\r\n /** 插件名称 */\r\n pluginName: string;\r\n /** 所有验证问题 */\r\n issues: ValidationIssue[];\r\n /** 错误数量 */\r\n errorCount: number;\r\n /** 警告数量 */\r\n warningCount: number;\r\n /** 信息数量 */\r\n infoCount: number;\r\n}\r\n\r\n/**\r\n * 验证规则函数类型\r\n */\r\ntype ValidationRule = (\r\n plugin: EnhancedPlugin | Plugin,\r\n context: ValidationContext,\r\n) => ValidationIssue[];\r\n\r\n/**\r\n * 验证上下文\r\n */\r\ninterface ValidationContext {\r\n /** 已知插件名称列表(用于循环依赖检测) */\r\n knownPlugins: Set<string>;\r\n}\r\n\r\n/**\r\n * 插件验证器\r\n * @description 对插件进行结构和配置验证,确保插件符合规范\r\n *\r\n * @example\r\n * ```typescript\r\n * const validator = new PluginValidator();\r\n *\r\n * // 验证单个插件\r\n * const report = validator.validate(myPlugin);\r\n * if (!report.valid) {\r\n * console.error('Plugin validation failed:', report.issues);\r\n * }\r\n *\r\n * // 批量验证\r\n * const reports = validator.validateAll([plugin1, plugin2, plugin3]);\r\n * ```\r\n */\r\nexport class PluginValidator {\r\n /** 内置验证规则列表 */\r\n private rules: ValidationRule[] = [];\r\n\r\n /** 已知插件名称集合(用于跨插件验证) */\r\n private knownPlugins = new Set<string>();\r\n\r\n constructor() {\r\n // 注册默认验证规则(绑定 this 上下文)\r\n this.rules = [\r\n this.validateStructure.bind(this),\r\n this.validateName.bind(this),\r\n this.validateVersion.bind(this),\r\n this.validateDependencies.bind(this),\r\n this.validateConflicts.bind(this),\r\n this.validatePeerRequirements.bind(this),\r\n this.validateLifecycleHooks.bind(this),\r\n ];\r\n }\r\n\r\n /**\r\n * 验证插件\r\n * @param plugin - 要验证的插件\r\n * @returns 验证报告\r\n */\r\n validate(plugin: EnhancedPlugin | Plugin): ValidationReport {\r\n const pluginName = this.getPluginName(plugin) ?? 'anonymous';\r\n const context: ValidationContext = {\r\n knownPlugins: this.knownPlugins,\r\n };\r\n\r\n const issues: ValidationIssue[] = [];\r\n\r\n // 执行所有验证规则\r\n for (const rule of this.rules) {\r\n try {\r\n const ruleIssues = rule(plugin, context);\r\n issues.push(...ruleIssues);\r\n } catch (err) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'rule-execution',\r\n message: `Validation rule execution failed: ${err instanceof Error ? err.message : String(err)}`,\r\n });\r\n }\r\n }\r\n\r\n // 统计各级别问题数量\r\n const errorCount = issues.filter((i) => i.level === 'error').length;\r\n const warningCount = issues.filter((i) => i.level === 'warning').length;\r\n const infoCount = issues.filter((i) => i.level === 'info').length;\r\n\r\n return {\r\n valid: errorCount === 0,\r\n pluginName,\r\n issues,\r\n errorCount,\r\n warningCount,\r\n infoCount,\r\n };\r\n }\r\n\r\n /**\r\n * 批量验证多个插件\r\n * @param plugins - 要验证的插件列表\r\n * @returns 验证报告列表\r\n */\r\n validateAll(plugins: (EnhancedPlugin | Plugin)[]): ValidationReport[] {\r\n return plugins.map((plugin) => this.validate(plugin));\r\n }\r\n\r\n /**\r\n * 注册已知插件名称(用于跨插件验证)\r\n * @param names - 插件名称列表\r\n */\r\n registerKnownPlugins(names: string[]): void {\r\n for (const name of names) {\r\n this.knownPlugins.add(name);\r\n }\r\n }\r\n\r\n /**\r\n * 添加自定义验证规则\r\n * @param rule - 验证规则函数\r\n */\r\n addRule(rule: ValidationRule): void {\r\n this.rules.push(rule);\r\n }\r\n\r\n /**\r\n * 移除验证规则\r\n * @param rule - 要移除的验证规则函数\r\n */\r\n removeRule(rule: ValidationRule): void {\r\n const index = this.rules.indexOf(rule);\r\n if (index !== -1) {\r\n this.rules.splice(index, 1);\r\n }\r\n }\r\n\r\n // ==================== 内置验证规则 ====================\r\n\r\n /**\r\n * 规则:验证插件基本结构\r\n * @description 确保插件有 install 方法\r\n */\r\n private validateStructure(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!plugin || typeof plugin !== 'object') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-structure',\r\n message: 'Plugin must be an object.',\r\n });\r\n return issues;\r\n }\r\n\r\n if (typeof plugin.install !== 'function') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-structure',\r\n message: 'Plugin must have an \"install\" method that is a function.',\r\n });\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证插件名称\r\n * @description 确保名称有效且不冲突\r\n */\r\n private validateName(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n // 非对象插件跳过名称验证(由 validateStructure 处理)\r\n if (!plugin || typeof plugin !== 'object') {\r\n return issues;\r\n }\r\n\r\n const name = this.getPluginName(plugin);\r\n\r\n if (name === undefined) {\r\n issues.push({\r\n level: 'warning',\r\n rule: 'validate-name',\r\n message:\r\n 'Plugin has no name. It is recommended to use EnhancedPlugin with a \"name\" property for better debugging and dependency management.',\r\n });\r\n return issues;\r\n }\r\n\r\n // 名称格式检查\r\n if (typeof name !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-name',\r\n message: `Plugin name must be a string, got ${typeof name}.`,\r\n });\r\n return issues;\r\n }\r\n\r\n if (name.trim().length === 0) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-name',\r\n message: 'Plugin name must not be empty.',\r\n });\r\n return issues;\r\n }\r\n\r\n // 名称格式规范:推荐 kebab-case\r\n const validNamePattern = /^[a-z][a-z0-9-]*$/;\r\n if (!validNamePattern.test(name)) {\r\n issues.push({\r\n level: 'warning',\r\n rule: 'validate-name',\r\n message: `Plugin name \"${name}\" does not follow kebab-case convention (e.g., \"my-plugin\").`,\r\n });\r\n }\r\n\r\n // 名称长度限制\r\n if (name.length > 100) {\r\n issues.push({\r\n level: 'warning',\r\n rule: 'validate-name',\r\n message: `Plugin name \"${name}\" is too long (max 100 characters).`,\r\n });\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证版本号格式\r\n * @description 确保版本号符合 semver 格式\r\n */\r\n private validateVersion(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return issues;\r\n }\r\n\r\n if (plugin.version !== undefined) {\r\n if (typeof plugin.version !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-version',\r\n message: `Plugin version must be a string, got ${typeof plugin.version}.`,\r\n });\r\n } else {\r\n // semver 格式检查(主版本.次版本.修订号)\r\n const semverPattern = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.]+)?(\\+[a-zA-Z0-9.]+)?$/;\r\n if (!semverPattern.test(plugin.version)) {\r\n issues.push({\r\n level: 'warning',\r\n rule: 'validate-version',\r\n message: `Plugin version \"${plugin.version}\" does not follow semver format (e.g., \"1.0.0\").`,\r\n });\r\n }\r\n }\r\n } else {\r\n issues.push({\r\n level: 'info',\r\n rule: 'validate-version',\r\n message:\r\n 'Plugin has no version. It is recommended to provide a version for compatibility checks.',\r\n });\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证依赖声明\r\n * @description 检查依赖格式和已知性\r\n */\r\n private validateDependencies(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return issues;\r\n }\r\n\r\n // 验证必需依赖\r\n if (plugin.dependencies) {\r\n if (!Array.isArray(plugin.dependencies)) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-dependencies',\r\n message: 'Plugin \"dependencies\" must be an array.',\r\n });\r\n } else {\r\n issues.push(...this.validateDependencyArray(plugin.dependencies, 'dependencies', false));\r\n }\r\n }\r\n\r\n // 验证可选依赖\r\n if (plugin.optionalDependencies) {\r\n if (!Array.isArray(plugin.optionalDependencies)) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-dependencies',\r\n message: 'Plugin \"optionalDependencies\" must be an array.',\r\n });\r\n } else {\r\n issues.push(\r\n ...this.validateDependencyArray(\r\n plugin.optionalDependencies,\r\n 'optionalDependencies',\r\n true,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n // 检查依赖是否与自身冲突\r\n if (plugin.dependencies && plugin.name) {\r\n for (const dep of plugin.dependencies) {\r\n if (dep.name === plugin.name) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-dependencies',\r\n message: `Plugin \"${plugin.name}\" cannot depend on itself.`,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 验证依赖数组\r\n */\r\n private validateDependencyArray(\r\n deps: PluginDependency[],\r\n field: string,\r\n isOptional: boolean,\r\n ): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n const seenNames = new Set<string>();\r\n\r\n for (const dep of deps) {\r\n // 检查依赖名称\r\n if (!dep.name || typeof dep.name !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-dependencies',\r\n message: `Each dependency in \"${field}\" must have a valid \"name\" string.`,\r\n });\r\n continue;\r\n }\r\n\r\n // 检查重复依赖\r\n if (seenNames.has(dep.name)) {\r\n issues.push({\r\n level: 'warning',\r\n rule: 'validate-dependencies',\r\n message: `Duplicate dependency \"${dep.name}\" in \"${field}\".`,\r\n });\r\n }\r\n seenNames.add(dep.name);\r\n\r\n // 检查版本格式\r\n if (dep.version !== undefined && typeof dep.version !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-dependencies',\r\n message: `Dependency \"${dep.name}\" version must be a string.`,\r\n });\r\n }\r\n\r\n // 检查 optional 标记是否合理\r\n if (dep.optional && !isOptional) {\r\n issues.push({\r\n level: 'info',\r\n rule: 'validate-dependencies',\r\n message: `Dependency \"${dep.name}\" has \"optional: true\" but is in required \"${field}\". Consider moving it to \"optionalDependencies\".`,\r\n });\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证冲突声明\r\n * @description 检查冲突列表格式\r\n */\r\n private validateConflicts(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return issues;\r\n }\r\n\r\n if (plugin.conflicts) {\r\n if (!Array.isArray(plugin.conflicts)) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-conflicts',\r\n message: 'Plugin \"conflicts\" must be an array of plugin name strings.',\r\n });\r\n } else {\r\n for (const conflict of plugin.conflicts) {\r\n if (typeof conflict !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-conflicts',\r\n message: `Each conflict entry must be a string, got ${typeof conflict}.`,\r\n });\r\n }\r\n }\r\n\r\n // 检查是否与自身冲突\r\n if (plugin.name && plugin.conflicts.includes(plugin.name)) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-conflicts',\r\n message: `Plugin \"${plugin.name}\" cannot conflict with itself.`,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证 peerRequirements\r\n * @description 检查宿主框架版本要求格式\r\n */\r\n private validatePeerRequirements(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return issues;\r\n }\r\n\r\n if (plugin.peerRequirements) {\r\n if (typeof plugin.peerRequirements !== 'object' || plugin.peerRequirements === null) {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-peer-requirements',\r\n message: 'Plugin \"peerRequirements\" must be an object.',\r\n });\r\n return issues;\r\n }\r\n\r\n const { lytjs, node } = plugin.peerRequirements;\r\n\r\n if (lytjs !== undefined && typeof lytjs !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-peer-requirements',\r\n message: 'peerRequirements.lytjs must be a version range string.',\r\n });\r\n }\r\n\r\n if (node !== undefined && typeof node !== 'string') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-peer-requirements',\r\n message: 'peerRequirements.node must be a version range string.',\r\n });\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * 规则:验证生命周期钩子\r\n * @description 确保生命周期钩子是函数\r\n */\r\n private validateLifecycleHooks(plugin: EnhancedPlugin | Plugin): ValidationIssue[] {\r\n const issues: ValidationIssue[] = [];\r\n\r\n if (!this.isEnhancedPlugin(plugin)) {\r\n return issues;\r\n }\r\n\r\n const hooks: Array<{ name: string; value: unknown }> = [\r\n { name: 'beforeInstall', value: plugin.beforeInstall },\r\n { name: 'afterInstall', value: plugin.afterInstall },\r\n { name: 'beforeMount', value: plugin.beforeMount },\r\n { name: 'afterMount', value: plugin.afterMount },\r\n { name: 'cleanup', value: plugin.cleanup },\r\n ];\r\n\r\n for (const hook of hooks) {\r\n if (hook.value !== undefined && typeof hook.value !== 'function') {\r\n issues.push({\r\n level: 'error',\r\n rule: 'validate-lifecycle-hooks',\r\n message: `Plugin lifecycle hook \"${hook.name}\" must be a function, got ${typeof hook.value}.`,\r\n });\r\n }\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n // ==================== 工具方法 ====================\r\n\r\n /**\r\n * 获取插件名称\r\n */\r\n private getPluginName(plugin: EnhancedPlugin | Plugin): string | undefined {\r\n if (this.isEnhancedPlugin(plugin)) {\r\n return plugin.name;\r\n }\r\n // 基础 Plugin 尝试从 name 属性获取\r\n if (plugin == null || typeof plugin !== 'object') {\r\n return undefined;\r\n }\r\n const rawName = (plugin as unknown as Record<string, unknown>).name;\r\n return typeof rawName === 'string' ? rawName : undefined;\r\n }\r\n\r\n /**\r\n * 检查是否为 EnhancedPlugin\r\n */\r\n private isEnhancedPlugin(plugin: EnhancedPlugin | Plugin): plugin is EnhancedPlugin {\r\n return (\r\n plugin != null &&\r\n typeof plugin === 'object' &&\r\n 'name' in plugin &&\r\n typeof (plugin as EnhancedPlugin).name === 'string'\r\n );\r\n }\r\n}\r\n","// src/create-app.ts\r\n// @lytjs/core - createApp 工厂函数\r\n\r\nimport { createVNode } from '@lytjs/vdom';\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { error, warn } from '@lytjs/common-error';\r\nimport type {\r\n App,\r\n AppOptions,\r\n Plugin,\r\n PluginWithCleanup,\r\n PluginFunctionWithCleanup,\r\n EnhancedPlugin,\r\n Component,\r\n ComponentPublicInstance,\r\n ComponentOptions,\r\n DOMRenderer as CoreDOMRenderer,\r\n} from './types';\r\nimport { createAppContext, createContextConfig } from './app-context';\r\nimport { PluginRegistry } from './plugin-registry';\r\nimport { PluginValidator } from './plugin-validator';\r\nimport {\r\n createComponentInstance,\r\n setupComponent,\r\n createComponentPublicInstance,\r\n callUnmountedHook,\r\n initProps,\r\n} from '@lytjs/component';\r\nimport type {\r\n AppContext as ComponentAppContext,\r\n ComponentInternalInstance,\r\n} from '@lytjs/component';\r\nimport type { SignalRenderer } from '@lytjs/renderer';\r\n\r\nlet createSignalRenderer:\r\n | ((template: string, ctx: Record<string, unknown>) => Promise<SignalRenderer>)\r\n | null = null;\r\nlet createDOMRenderer: ((options?: unknown) => unknown) | null = null;\r\n\r\nasync function getSignalRenderer() {\r\n if (!createSignalRenderer) {\r\n const renderer = await import('@lytjs/renderer');\r\n createSignalRenderer = renderer.createSignalRenderer as (\r\n template: string,\r\n ctx: Record<string, unknown>,\r\n ) => Promise<SignalRenderer>;\r\n }\r\n return createSignalRenderer;\r\n}\r\n\r\nasync function getDOMRenderer() {\r\n if (!createDOMRenderer) {\r\n const renderer = await import('@lytjs/renderer');\r\n createDOMRenderer = renderer.createDOMRenderer as (options?: unknown) => unknown;\r\n }\r\n return createDOMRenderer;\r\n}\r\n\r\nexport function createApp(\r\n rootComponent: Component,\r\n rootProps: Record<string, unknown> | null = null,\r\n options?: AppOptions,\r\n): App {\r\n // FIX: P2-36 全局配置继承机制:\r\n // 如果提供了父 app context,子 app 继承父 app 的全局配置\r\n const context = createAppContext();\r\n const installedPlugins = new Set<Plugin | ((app: App, ...options: unknown[]) => void)>();\r\n const pluginRegistry = new PluginRegistry();\r\n const pluginValidator = new PluginValidator();\r\n let _isUnmounted = false;\r\n let _isMounted = false;\r\n\r\n // 跟踪挂载期间注册的全局事件监听器,以便卸载时清理\r\n const _globalListeners: Array<{\r\n target: EventTarget;\r\n event: string;\r\n handler: EventListener;\r\n options?: AddEventListenerOptions;\r\n }> = [];\r\n\r\n // 确定渲染模式('vapor' 是 'signal' 的别名)\r\n const rendererMode = options?.rendererMode ?? 'vnode';\r\n const effectiveMode = rendererMode === 'vapor' ? 'signal' : rendererMode;\r\n\r\n // Signal 模式下的渲染器引用\r\n let signalRenderer: SignalRenderer | null = null;\r\n\r\n const app: App = {\r\n config: createContextConfig(context),\r\n\r\n use(plugin: Plugin | ((app: App, ...options: unknown[]) => void), ...options: unknown[]) {\r\n // 处理 null/undefined 的情况\r\n if (plugin == null) {\r\n return app;\r\n }\r\n if (installedPlugins.has(plugin)) return app;\r\n try {\r\n // 对 EnhancedPlugin 进行验证和注册\r\n if (\r\n typeof plugin !== 'function' &&\r\n 'name' in plugin &&\r\n typeof (plugin as EnhancedPlugin).name === 'string'\r\n ) {\r\n const enhancedPlugin = plugin as EnhancedPlugin;\r\n\r\n // 验证插件\r\n const report = pluginValidator.validate(enhancedPlugin);\r\n if (!report.valid) {\r\n const errorMessages = report.issues\r\n .filter((i) => i.level === 'error')\r\n .map((i) => `[${i.rule}] ${i.message}`)\r\n .join('; ');\r\n throw new Error(`Plugin \"${enhancedPlugin.name}\" validation failed: ${errorMessages}`);\r\n }\r\n\r\n // 注册到 Registry\r\n const regResult = pluginRegistry.register(enhancedPlugin, options);\r\n if (!regResult.success) {\r\n throw new Error(regResult.error);\r\n }\r\n\r\n // 检查依赖\r\n const depResult = pluginRegistry.checkDependencies(enhancedPlugin);\r\n if (!depResult.satisfied && depResult.missing.length > 0) {\r\n const missingNames = depResult.missing.map((d) => d.name).join(', ');\r\n throw new Error(\r\n `Plugin \"${enhancedPlugin.name}\" has unsatisfied dependencies: ${missingNames}`,\r\n );\r\n }\r\n\r\n // 触发 beforeInstall 生命周期钩子\r\n if (enhancedPlugin.beforeInstall) {\r\n const shouldContinue = enhancedPlugin.beforeInstall(app);\r\n // 处理异步 beforeInstall\r\n if (shouldContinue instanceof Promise) {\r\n throw new Error(\r\n 'Plugin beforeInstall hook cannot be async when using synchronous app.use(). Use await app.use() for async plugins.',\r\n );\r\n }\r\n if (shouldContinue === false) {\r\n pluginRegistry.unregister(enhancedPlugin.name);\r\n return app;\r\n }\r\n }\r\n\r\n // 执行安装 - 检查是否存在 install 方法\r\n if (typeof plugin.install === 'function') {\r\n plugin.install(app, ...options);\r\n }\r\n\r\n // 标记为已安装\r\n pluginRegistry.markInstalled(enhancedPlugin.name);\r\n\r\n // 触发 afterInstall 生命周期钩子\r\n if (enhancedPlugin.afterInstall) {\r\n enhancedPlugin.afterInstall(app);\r\n }\r\n } else {\r\n // 基础 Plugin 或函数式插件,保持原有行为\r\n if (typeof plugin === 'function') {\r\n (plugin as (app: App, ...options: unknown[]) => void)(app, ...options);\r\n } else if (plugin && typeof (plugin as any).install === 'function') {\r\n (plugin as any).install(app, ...options);\r\n }\r\n }\r\n installedPlugins.add(plugin);\r\n } catch (err) {\r\n error(\r\n `Plugin failed to install: ${typeof plugin === 'function' ? plugin.name || 'anonymous function' : (plugin as Plugin).install?.name || 'plugin'}: ${err}`,\r\n );\r\n throw err;\r\n }\r\n return app;\r\n },\r\n\r\n /**\r\n * 获取插件注册表实例\r\n * @description 提供对 PluginRegistry 的访问,用于高级插件管理\r\n */\r\n get _pluginRegistry() {\r\n return pluginRegistry;\r\n },\r\n\r\n /**\r\n * 获取插件验证器实例\r\n * @description 提供对 PluginValidator 的访问,用于自定义验证\r\n */\r\n get _pluginValidator() {\r\n return pluginValidator;\r\n },\r\n\r\n async mount(rootContainer: string | Element) {\r\n if (_isUnmounted) {\r\n throw new Error(\r\n `[LytJS] App has been unmounted and cannot be remounted. Create a new app instance instead.`,\r\n );\r\n }\r\n\r\n if (!rootComponent) {\r\n if (__DEV__) {\r\n warn('App.mount() expects a root component.');\r\n }\r\n return null;\r\n }\r\n\r\n if (context._container) {\r\n throw new Error(\r\n `[LytJS] App is already mounted. Call app.unmount() first before mounting again.`,\r\n );\r\n }\r\n\r\n const container =\r\n typeof rootContainer === 'string' ? document.querySelector(rootContainer) : rootContainer;\r\n\r\n if (!container) {\r\n throw new Error(\r\n `[LytJS] Failed to mount app: cannot find element matching selector \"${rootContainer}\". ` +\r\n `Make sure the target element exists in the DOM before calling app.mount().`,\r\n );\r\n }\r\n\r\n context._container = container;\r\n\r\n try {\r\n // 根据渲染模式选择不同的渲染路径\r\n if (effectiveMode === 'signal') {\r\n return mountWithSignalMode(container);\r\n }\r\n\r\n // 默认 VNode 模式\r\n return await mountWithVNodeMode(container);\r\n } catch (err) {\r\n if (app.errorHandler) {\r\n app.errorHandler(err, null, 'mount');\r\n } else {\r\n error(`[LytJS] Failed to mount app: ${err instanceof Error ? err.message : String(err)}`);\r\n }\r\n throw err;\r\n }\r\n },\r\n\r\n unmount() {\r\n // 清理全局事件监听器(document、window 等上注册的监听器)\r\n for (const listener of _globalListeners) {\r\n try {\r\n listener.target.removeEventListener(listener.event, listener.handler, listener.options);\r\n } catch (err) {\r\n // FIX: P2-41 错误日志不完整:添加更多上下文信息\r\n if (__DEV__) {\r\n warn(\r\n `Failed to remove global event listener \"${listener.event}\" ` +\r\n `from target ${listener.target.constructor.name}: ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n }\r\n }\r\n }\r\n _globalListeners.length = 0;\r\n\r\n // 清理插件资源:调用插件的 cleanup 方法(如果存在)\r\n // FIX: P2-40 使用 PluginWithCleanup 类型替代类型断言链\r\n for (const plugin of installedPlugins) {\r\n const pluginWithCleanup = plugin as PluginWithCleanup | PluginFunctionWithCleanup;\r\n if (typeof pluginWithCleanup?.cleanup === 'function') {\r\n try {\r\n pluginWithCleanup.cleanup();\r\n } catch (err) {\r\n // FIX: P2-41 错误日志不完整:添加更多上下文信息\r\n const pluginName =\r\n pluginWithCleanup.name ?? (typeof plugin === 'function' ? plugin.name : 'unknown');\r\n error(\r\n `Plugin cleanup failed for \"${pluginName}\": ${err instanceof Error ? err.message : String(err)}. ` +\r\n `This may cause memory leaks.`,\r\n );\r\n }\r\n }\r\n }\r\n installedPlugins.clear();\r\n\r\n if (effectiveMode === 'signal') {\r\n // Signal 模式卸载\r\n // FIX: P2-batch2-8 添加类型守卫,确保 rootComponent 是有效对象后再访问属性\r\n const componentOptions = rootComponent as Record<string, unknown>;\r\n if (componentOptions != null && typeof componentOptions === 'object') {\r\n const beforeUnmount = componentOptions.beforeUnmount as (() => void) | undefined;\r\n if (typeof beforeUnmount === 'function') {\r\n beforeUnmount.call(componentOptions);\r\n }\r\n }\r\n if (signalRenderer) {\r\n signalRenderer.unmount();\r\n signalRenderer = null;\r\n }\r\n // FIX: P1-40 Signal 模式卸载时清理容器 DOM 内容,\r\n // 避免卸载后残留的 DOM 元素导致内存泄漏和视觉异常\r\n if (context._container) {\r\n const container = context._container;\r\n while (container.firstChild) {\r\n container.removeChild(container.firstChild);\r\n }\r\n }\r\n const unmounted = componentOptions.unmounted as (() => void) | undefined;\r\n if (typeof unmounted === 'function') {\r\n unmounted.call(componentOptions);\r\n }\r\n } else {\r\n // VNode 模式卸载\r\n if (!context.renderer || !context._vnode) return;\r\n\r\n const instance = context._instance;\r\n if (instance) {\r\n callUnmountedHook(instance);\r\n }\r\n\r\n context.renderer.unmount(context._vnode);\r\n context._vnode = null;\r\n }\r\n\r\n // 标记 app 为已卸载\r\n _isUnmounted = true;\r\n _isMounted = false;\r\n\r\n context._container = null;\r\n\r\n // 清理 app context\r\n context.mixins.length = 0;\r\n context.components = {};\r\n context.directives = {};\r\n context.provides = {};\r\n\r\n // 清理 globalProperties\r\n context.config.globalProperties = {};\r\n\r\n context._instance = null;\r\n context.renderer = null;\r\n },\r\n\r\n provide(key, value) {\r\n if (__DEV__ && _isMounted) {\r\n warn(\r\n 'app.provide() cannot be called after the app has been mounted. ' +\r\n 'Register provides before calling app.mount().',\r\n );\r\n }\r\n // FIX: P1-41 inject symbol key 保持类型,使用 string | symbol 作为键类型\r\n context.provides[key as string | symbol] = value;\r\n return app;\r\n },\r\n\r\n inject<T = unknown>(key: string | symbol): T | undefined {\r\n // FIX: P1-41 inject symbol key 保持类型,支持 symbol 类型的键\r\n return context.provides[key as string | symbol] as T | undefined;\r\n },\r\n\r\n component(name, component) {\r\n // FIX: P2 运行时类型检查:确保 component 参数是有效的组件选项对象\r\n if (component != null && typeof component !== 'object' && typeof component !== 'function') {\r\n if (__DEV__) {\r\n warn(`app.component() expects an object or function, but received ${typeof component}.`);\r\n }\r\n return app;\r\n }\r\n context.components[name] = component as unknown as ComponentOptions;\r\n return app;\r\n },\r\n\r\n directive(name, directive) {\r\n context.directives[name] = directive;\r\n return app;\r\n },\r\n\r\n mixin(mixin) {\r\n context.mixins.push(mixin);\r\n return app;\r\n },\r\n\r\n /**\r\n * Register a global event listener that will be automatically cleaned up on unmount.\r\n * This ensures no leaked event listeners when the app is destroyed.\r\n */\r\n on(\r\n target: EventTarget,\r\n event: string,\r\n handler: EventListener,\r\n options?: AddEventListenerOptions,\r\n ) {\r\n target.addEventListener(event, handler, options);\r\n _globalListeners.push({ target, event, handler, options });\r\n return app;\r\n },\r\n\r\n /**\r\n * Remove a previously registered global event listener.\r\n * FIX: P2-v11-06 off() 使用引用相等性匹配 handler,\r\n * 这意味着传入的 handler 必须与 on() 注册时使用同一个函数引用。\r\n * 如果使用匿名函数或箭头函数,将无法匹配。请保存函数引用后再传入。\r\n */\r\n off(\r\n target: EventTarget,\r\n event: string,\r\n handler: EventListener,\r\n options?: AddEventListenerOptions,\r\n ) {\r\n target.removeEventListener(event, handler, options);\r\n const idx = _globalListeners.findIndex(\r\n (l) => l.target === target && l.event === event && l.handler === handler,\r\n );\r\n if (idx !== -1) {\r\n _globalListeners.splice(idx, 1);\r\n }\r\n return app;\r\n },\r\n };\r\n\r\n // ==================== VNode 模式挂载 ====================\r\n\r\n async function mountWithVNodeMode(container: Element): Promise<ComponentPublicInstance> {\r\n // 通过组件系统的标准流程创建根 vnode\r\n const rootVNode = createVNode(rootComponent, rootProps);\r\n\r\n // 使用标准化的组件系统创建组件实例\r\n const instance = createComponentInstance(rootVNode, null);\r\n\r\n // 替换 appContext:createComponentInstance 会创建新的空上下文\r\n // when parent is null, but we need the core-level context with plugins,\r\n // components, directives, and provides registered on the app.\r\n instance.appContext = context as ComponentAppContext;\r\n\r\n // Copy app-level provides into the root instance\r\n // FIX: P2-39 使用 Object.keys 替代 for...in,避免遍历到原型链上的属性\r\n if (context.provides) {\r\n const rootProvides = instance.provides;\r\n for (const key of Object.keys(context.provides)) {\r\n if (!(key in rootProvides)) {\r\n rootProvides[key] = context.provides[key];\r\n }\r\n }\r\n }\r\n\r\n // Set up the component (runs setup, init props/slots, data, lifecycle)\r\n setupComponent(instance);\r\n\r\n // 将组件实例存储到 vnode 上,以便 patch 时访问\r\n // FIX: DTS build error - 跨包 ComponentInternalInstance 类型不兼容(component vs common-vnode),\r\n // 使用类型断言绕过,运行时类型是正确的\r\n rootVNode.component = instance as unknown as typeof rootVNode.component;\r\n\r\n // 保存根实例引用,用于卸载生命周期钩子\r\n context._instance = instance;\r\n\r\n // 使用增强的渲染器进行渲染\r\n if (effectiveMode !== 'vnode') {\r\n throw new Error('[LytJS] Invalid renderer mode');\r\n }\r\n const domRendererFn = await getDOMRenderer();\r\n const renderer = domRendererFn!({\r\n setupChildComponent(childVNode: VNode, parentComponent: ComponentInternalInstance | null) {\r\n const childInstance = createComponentInstance(childVNode, parentComponent);\r\n // 从父组件或根组件继承 appContext\r\n if (parentComponent) {\r\n childInstance.appContext = parentComponent.appContext;\r\n } else {\r\n childInstance.appContext = context as ComponentAppContext;\r\n }\r\n setupComponent(childInstance);\r\n (childVNode as unknown as { component: ComponentInternalInstance }).component =\r\n childInstance;\r\n },\r\n normalizeProps(inst: ComponentInternalInstance, rawProps: Record<string, unknown> | null) {\r\n initProps(inst, rawProps);\r\n },\r\n }) as { mount: (vnode: VNode, container: Node) => void };\r\n // FIX: P2-batch2-7 跨包类型断言说明:\r\n // context.renderer 的类型为 Renderer | null(来自 core 包),\r\n // 而 DOMRenderer 类型定义在 dom 包中。此处通过 unknown 桥接是安全的,\r\n // 因为 renderer 实例在 createRenderer() 中已正确初始化为 DOMRenderer。\r\n context.renderer = renderer as unknown as CoreDOMRenderer;\r\n context._vnode = rootVNode;\r\n\r\n // 挂载 vnode\r\n renderer.mount(rootVNode, container);\r\n\r\n // 创建并返回公共实例\r\n const publicInstance = createComponentPublicInstance(instance);\r\n\r\n _isMounted = true;\r\n\r\n return publicInstance as ComponentPublicInstance;\r\n }\r\n\r\n // ==================== Signal 模式挂载 ====================\r\n\r\n async function mountWithSignalMode(container: Element): Promise<ComponentPublicInstance> {\r\n // FIX: P2-v11-07 Signal 模式下添加类型守卫,验证 rootComponent\r\n // 是否包含 template 属性,避免对非组件对象进行不安全的属性访问\r\n if (!rootComponent || typeof rootComponent !== 'object') {\r\n throw new Error(\r\n `[LytJS] Signal mode requires rootComponent to be a valid component options object.`,\r\n );\r\n }\r\n\r\n // Signal 模式下,rootComponent 应该包含 template 属性\r\n // 或者是一个包含 template 和 setup/data 的组件选项对象\r\n const componentOptions = rootComponent as Record<string, unknown>;\r\n const template = componentOptions.template as string | undefined;\r\n\r\n if (!template) {\r\n throw new Error(\r\n `[LytJS] Signal mode requires a template string in the root component. ` +\r\n `Provide a 'template' property in your component options.`,\r\n );\r\n }\r\n\r\n // 构建上下文对象:合并 data、setup 返回值和 props\r\n const ctx: Record<string, unknown> = { ...rootProps };\r\n\r\n // 执行 data 函数\r\n if (typeof componentOptions.data === 'function') {\r\n try {\r\n const dataResult = (componentOptions.data as () => Record<string, unknown>)();\r\n Object.assign(ctx, dataResult);\r\n } catch (e) {\r\n // FIX: P2-42 静默失败:确保错误被正确抛出而不是静默吞掉\r\n // FIX: P2-41 错误日志不完整:添加更多上下文信息\r\n const enhancedError = new Error(\r\n `[LytJS] Failed to execute data() in Signal mode: ${e instanceof Error ? e.message : String(e)}. ` +\r\n `Component: ${(rootComponent as Record<string, unknown>).name ?? 'anonymous'}`,\r\n );\r\n (enhancedError as Error & { cause: unknown }).cause = e;\r\n error(enhancedError.message);\r\n throw enhancedError;\r\n }\r\n }\r\n\r\n // 执行 setup 函数\r\n if (typeof componentOptions.setup === 'function') {\r\n try {\r\n const setupResult = (\r\n componentOptions.setup as (\r\n props: Record<string, unknown>,\r\n ctx: Record<string, unknown>,\r\n ) => unknown\r\n )(rootProps ?? {}, {});\r\n if (setupResult && typeof setupResult === 'object') {\r\n Object.assign(ctx, setupResult);\r\n }\r\n } catch (e) {\r\n // FIX: P2-42 静默失败:确保错误被正确抛出而不是静默吞掉\r\n // FIX: P2-41 错误日志不完整:添加更多上下文信息\r\n const enhancedError = new Error(\r\n `[LytJS] Failed to execute setup() in Signal mode: ${e instanceof Error ? e.message : String(e)}. ` +\r\n `Component: ${(rootComponent as Record<string, unknown>).name ?? 'anonymous'}`,\r\n );\r\n (enhancedError as Error & { cause: unknown }).cause = e;\r\n error(enhancedError.message);\r\n throw enhancedError;\r\n }\r\n }\r\n\r\n // 调用 beforeMount 生命周期钩子\r\n const beforeMount = componentOptions.beforeMount as (() => void) | undefined;\r\n if (typeof beforeMount === 'function') {\r\n beforeMount.call(ctx);\r\n }\r\n\r\n // 创建 Signal 渲染器\r\n const signalRendererFn = await getSignalRenderer();\r\n signalRenderer = await signalRendererFn(template, ctx);\r\n signalRenderer.render(container);\r\n\r\n _isMounted = true;\r\n\r\n // 调用 mounted 生命周期钩子\r\n const mounted = componentOptions.mounted as (() => void) | undefined;\r\n if (typeof mounted === 'function') {\r\n mounted.call(ctx);\r\n }\r\n\r\n // Signal 模式返回一个简化的公共实例\r\n // 通过 Proxy 实现对 ctx 的访问\r\n return new Proxy({} as ComponentPublicInstance, {\r\n get(_, key: string | symbol) {\r\n if (key === '$el') return container;\r\n if (key === '$options') return componentOptions;\r\n return (ctx as Record<string | symbol, unknown>)[key];\r\n },\r\n set(_, key: string | symbol, value: unknown) {\r\n (ctx as Record<string | symbol, unknown>)[key] = value;\r\n return true;\r\n },\r\n }) as ComponentPublicInstance;\r\n }\r\n\r\n return app;\r\n}\r\n","// src/h.ts\r\n// @lytjs/core - VNode 创建辅助函数\r\n\r\nimport {\r\n createVNode,\r\n type Fragment,\r\n type Text,\r\n type Comment,\r\n type VNodeTypes,\r\n EMPTY_OBJ,\r\n} from '@lytjs/vdom';\r\nimport type { VNode, VNodeChildren, Component } from './types';\r\n\r\n// ============================================================\r\n// h() function overloads for type-safe VNode creation\r\n// ============================================================\r\n\r\n// Overload 1: h(type) - no props, no children\r\n// FIX: v7-P1-12 h() children 合并逻辑:确保嵌套数组被正确展平\r\nexport function h(type: string): VNode;\r\nexport function h(type: Component): VNode;\r\nexport function h(type: typeof Fragment): VNode;\r\nexport function h(type: typeof Text): VNode;\r\nexport function h(type: typeof Comment): VNode;\r\n\r\n// Overload 2: h(type, props) - with props, no children\r\nexport function h<P = Record<string, unknown>>(type: string, props: P | null): VNode;\r\nexport function h<P = Record<string, unknown>>(type: Component, props: P | null): VNode;\r\nexport function h(type: typeof Fragment, props: Record<string, unknown> | null): VNode;\r\nexport function h(type: typeof Text, props: Record<string, unknown> | null): VNode;\r\nexport function h(type: typeof Comment, props: Record<string, unknown> | null): VNode;\r\n\r\n// Overload 3: h(type, props, ...children) - with props and children\r\nexport function h<P = Record<string, unknown>>(\r\n type: string,\r\n props: P | null,\r\n ...children: VNodeChildren[]\r\n): VNode;\r\nexport function h<P = Record<string, unknown>>(\r\n type: Component,\r\n props: P | null,\r\n ...children: VNodeChildren[]\r\n): VNode;\r\nexport function h(\r\n type: typeof Fragment,\r\n props: Record<string, unknown> | null,\r\n ...children: VNodeChildren[]\r\n): VNode;\r\nexport function h(\r\n type: typeof Text,\r\n props: Record<string, unknown> | null,\r\n ...children: VNodeChildren[]\r\n): VNode;\r\nexport function h(\r\n type: typeof Comment,\r\n props: Record<string, unknown> | null,\r\n ...children: VNodeChildren[]\r\n): VNode;\r\n\r\n// 实现\r\nexport function h(\r\n type: string | Component | typeof Fragment | typeof Text | typeof Comment,\r\n props?: Record<string, unknown> | null,\r\n ...children: VNodeChildren[]\r\n): VNode {\r\n if (props == null) {\r\n props = EMPTY_OBJ;\r\n }\r\n\r\n // FIX: v7-P1-12 h() children 合并逻辑:递归展平嵌套数组,避免丢失嵌套子节点\r\n // 注意:children.flat(Infinity) 会递归展平所有嵌套数组。\r\n // 这意味着如果 children 中包含非 VNode 的数组(如 props 数组),\r\n // 这些数组也会被展平。调用方应确保 children 中只包含 VNode 或原始值。\r\n const flatChildren =\r\n children.length > 1\r\n ? children.flat(Infinity)\r\n : Array.isArray(children[0])\r\n ? children[0].flat(Infinity)\r\n : children[0];\r\n\r\n // 类型断言说明:flat(Infinity) 返回 unknown[],但 VNodeChildren 类型为\r\n // VNodeChild | VNodeChildren[],两者在运行时结构一致。\r\n // 通过 unknown 桥接是因为 TypeScript 无法自动推导递归展平后的类型与 VNodeChildren 的兼容性。\r\n return createVNode(type as VNodeTypes, props, flatChildren as unknown as VNodeChildren);\r\n}\r\n\r\n/**\r\n * createElement 是 h 的别名\r\n */\r\nexport { h as createElement };\r\n","// src/define-component.ts\r\n// @lytjs/core - 组件定义\r\n\r\nimport type { Component, AsyncComponentLoader, AsyncComponentOptions, VNode } from './types';\r\nimport type { ComponentOptions } from './types';\r\nimport { defineComponent as _defineComponent, onBeforeUnmount } from '@lytjs/component';\r\nimport { shallowRef, ref } from '@lytjs/reactivity';\r\nimport { warn } from '@lytjs/common-error';\r\nimport { h } from './h';\r\n\r\n/** onError 回调未响应时的默认超时时间(毫秒) */\r\nconst DEFAULT_ON_ERROR_TIMEOUT = 30000;\r\n\r\n/**\r\n * 定义组件(re-export from @lytjs/component)\r\n *\r\n * 权威实现在 @lytjs/component 中,此处统一返回类型为 ComponentOptions。\r\n * 由于 Component = ComponentOptions | (() => any),\r\n * 返回 ComponentOptions 是 Component 的子集,完全兼容。\r\n */\r\nexport const defineComponent: (options: ComponentOptions) => ComponentOptions = _defineComponent;\r\n\r\n/**\r\n * 定义异步组件\r\n */\r\nexport function defineAsyncComponent(\r\n source: AsyncComponentLoader | AsyncComponentOptions,\r\n): Component {\r\n if (typeof source === 'function') {\r\n source = { loader: source };\r\n }\r\n\r\n const { loader, loadingComponent, errorComponent, delay = 200, timeout, onError } = source;\r\n\r\n const loadedComponent = shallowRef<Component | undefined>(undefined);\r\n const error = ref<Error | undefined>(undefined);\r\n const loading = ref<boolean>(false);\r\n let retries = 0;\r\n let showLoading = false;\r\n let delayTimer: ReturnType<typeof setTimeout> | null = null;\r\n let loadingPromise: Promise<Component> | null = null;\r\n\r\n const MAX_RETRIES = 3;\r\n const retry = (): Promise<Component> | void => {\r\n if (retries >= MAX_RETRIES) {\r\n if (__DEV__) {\r\n warn(`AsyncComponent: max retries (${MAX_RETRIES}) exceeded.`);\r\n }\r\n error.value = new Error(\r\n `[lytjs/core] AsyncComponent: max retries (${MAX_RETRIES}) exceeded.`,\r\n );\r\n // FIX: P0-09 retry 耗尽后返回 Promise.reject,确保 Promise 链正确 settle,\r\n // 避免调用方永远等待一个不会 resolve/reject 的 Promise\r\n return Promise.reject(error.value);\r\n }\r\n retries++;\r\n loadedComponent.value = undefined;\r\n error.value = undefined;\r\n loadingPromise = null;\r\n startTimeout();\r\n return load();\r\n };\r\n\r\n const load = (): Promise<Component> => {\r\n // 防止重复并发加载\r\n if (loadingPromise) return loadingPromise as Promise<Component>;\r\n\r\n loading.value = true;\r\n showLoading = false;\r\n if (delayTimer) clearTimeout(delayTimer);\r\n delayTimer = setTimeout(() => {\r\n showLoading = true;\r\n }, delay);\r\n return (loadingPromise = Promise.resolve(loader())\r\n .then((comp) => {\r\n // FIX: P2-v11-15 验证 loader() 返回值,确保是有效的组件定义\r\n // FIX: P2-batch2-9 添加括号明确运算符优先级,避免 && 和 || 混合使用时的歧义\r\n if (comp == null || (typeof comp !== 'object' && typeof comp !== 'function')) {\r\n throw new Error(\r\n `[lytjs/core] AsyncComponent: loader() returned an invalid component value: ${String(comp)}. ` +\r\n `Expected a component options object or function.`,\r\n );\r\n }\r\n loadedComponent.value = comp;\r\n error.value = undefined;\r\n loading.value = false;\r\n loadingPromise = null;\r\n if (delayTimer) {\r\n clearTimeout(delayTimer);\r\n delayTimer = null;\r\n }\r\n showLoading = false;\r\n // load 成功后清除 timeout,避免不必要的超时回调\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n return comp;\r\n })\r\n .catch((err): Promise<Component> => {\r\n error.value = err;\r\n loading.value = false;\r\n if (onError) {\r\n return new Promise<Component>((resolve, reject) => {\r\n let settled = false;\r\n const ON_ERROR_TIMEOUT = DEFAULT_ON_ERROR_TIMEOUT;\r\n const timer = setTimeout(() => {\r\n if (!settled) {\r\n settled = true;\r\n reject(\r\n new Error(\r\n `[lytjs/core] AsyncComponent: onError callback did not call retry() or reject() within ${ON_ERROR_TIMEOUT / 1000}s.`,\r\n ),\r\n );\r\n }\r\n }, ON_ERROR_TIMEOUT);\r\n onError(\r\n err,\r\n () => {\r\n if (!settled) {\r\n settled = true;\r\n clearTimeout(timer);\r\n const result = retry();\r\n if (result) resolve(result);\r\n }\r\n },\r\n (reason?: unknown) => {\r\n if (!settled) {\r\n settled = true;\r\n clearTimeout(timer);\r\n reject(reason ?? err);\r\n }\r\n },\r\n retries,\r\n );\r\n });\r\n }\r\n return Promise.reject(err);\r\n }));\r\n };\r\n\r\n // 超时处理:封装为函数以便 retry 时重新设置\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n const startTimeout = () => {\r\n if (timeout == null) return;\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n if (!loadedComponent.value && !error.value) {\r\n error.value = new Error(`[lytjs/core] AsyncComponent timed out after ${timeout}ms.`);\r\n loading.value = false;\r\n }\r\n }, timeout);\r\n };\r\n startTimeout();\r\n\r\n // 延迟加载:在组件首次渲染时触发,而非立即加载\r\n // load();\r\n\r\n const comp: ComponentOptions = {\r\n name: 'AsyncComponent',\r\n setup() {\r\n const instance = {\r\n resolved: loadedComponent,\r\n loading,\r\n error,\r\n delay,\r\n timeout,\r\n };\r\n\r\n onBeforeUnmount(() => {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n if (delayTimer !== null) {\r\n clearTimeout(delayTimer);\r\n delayTimer = null;\r\n }\r\n });\r\n\r\n // 在 setup 阶段触发加载,避免 render 中触发副作用\r\n if (!loadedComponent.value && !error.value && !loading.value) {\r\n load();\r\n }\r\n\r\n return instance;\r\n },\r\n render(): VNode | null {\r\n if (loadedComponent.value) {\r\n return h(loadedComponent.value);\r\n }\r\n if (error.value && errorComponent) {\r\n return h(errorComponent);\r\n }\r\n if (showLoading && loadingComponent) {\r\n return h(loadingComponent);\r\n }\r\n return null;\r\n },\r\n } as ComponentOptions;\r\n\r\n return comp as Component;\r\n}\r\n","export { nextTick } from '@lytjs/common-scheduler';\r\n","// src/resolve.ts\r\n// @lytjs/core - 组件/指令解析\r\n\r\nimport type { Component, Directive } from './types';\r\nimport { getCurrentInstance } from '@lytjs/component';\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n/**\r\n * Common native HTML elements that should not trigger resolution warnings.\r\n */\r\nconst HTML_ELEMENTS = new Set([\r\n // 结构元素\r\n 'div',\r\n 'span',\r\n 'p',\r\n 'a',\r\n 'img',\r\n 'input',\r\n 'button',\r\n 'form',\r\n 'table',\r\n 'ul',\r\n 'ol',\r\n 'li',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'header',\r\n 'footer',\r\n 'nav',\r\n 'section',\r\n 'article',\r\n 'main',\r\n 'aside',\r\n // 文本元素\r\n 'br',\r\n 'hr',\r\n 'pre',\r\n 'code',\r\n 'blockquote',\r\n 'strong',\r\n 'em',\r\n 'i',\r\n 'b',\r\n 'u',\r\n 's',\r\n 'small',\r\n 'sub',\r\n 'sup',\r\n 'label',\r\n 'abbr',\r\n 'cite',\r\n 'dfn',\r\n 'kbd',\r\n 'mark',\r\n 'q',\r\n 'samp',\r\n 'var',\r\n 'wbr',\r\n // 表单元素\r\n 'select',\r\n 'option',\r\n 'textarea',\r\n 'optgroup',\r\n 'fieldset',\r\n 'legend',\r\n 'datalist',\r\n 'output',\r\n 'progress',\r\n 'meter',\r\n // 媒体元素\r\n 'picture',\r\n 'video',\r\n 'audio',\r\n 'source',\r\n 'track',\r\n 'canvas',\r\n 'map',\r\n 'area',\r\n 'svg',\r\n // 交互元素\r\n 'details',\r\n 'summary',\r\n 'dialog',\r\n // 模板/插槽\r\n 'template',\r\n 'slot',\r\n // 脚本/样式/元数据\r\n 'script',\r\n 'style',\r\n 'link',\r\n 'meta',\r\n 'title',\r\n 'head',\r\n 'body',\r\n 'html',\r\n 'noscript',\r\n // 表格子元素\r\n 'thead',\r\n 'tbody',\r\n 'tfoot',\r\n 'tr',\r\n 'th',\r\n 'td',\r\n 'caption',\r\n 'colgroup',\r\n 'col',\r\n // 列表子元素\r\n 'dl',\r\n 'dt',\r\n 'dd',\r\n // 其他\r\n 'figure',\r\n 'figcaption',\r\n 'iframe',\r\n 'object',\r\n 'embed',\r\n 'param',\r\n 'time',\r\n 'data',\r\n 'ruby',\r\n 'rt',\r\n 'rp',\r\n 'bdi',\r\n 'bdo',\r\n 'ins',\r\n 'del',\r\n]);\r\n\r\n/**\r\n * 解析组件:从当前组件实例的 components 选项和全局注册中查找\r\n */\r\nexport function resolveComponent(name: string): Component | undefined {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warn(\r\n `resolveComponent(\"${name}\") was called outside of a component setup function. ` +\r\n `Global components will not be resolved.`,\r\n );\r\n }\r\n return undefined;\r\n }\r\n\r\n // 1. 先从当前组件的 components 选项中查找\r\n const components = (instance.type as Record<string, unknown>)?.components;\r\n if (components && (components as Record<string, Component>)[name]) {\r\n return (components as Record<string, Component>)[name];\r\n }\r\n\r\n // 2. 再从全局注册中查找(appContext.components)\r\n const globalComponents = instance.appContext?.components;\r\n if (globalComponents && globalComponents[name]) {\r\n return globalComponents[name] as Component;\r\n }\r\n\r\n if (__DEV__) {\r\n if (!HTML_ELEMENTS.has(name)) {\r\n warn(\r\n `Failed to resolve component \"${name}\". ` +\r\n `If this is a native HTML element, register it as a component.`,\r\n );\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * 解析指令:从当前组件实例的 directives 选项和全局注册中查找\r\n */\r\nexport function resolveDirective(name: string): Directive | undefined {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warn(\r\n `resolveDirective(\"${name}\") was called outside of a component setup function. ` +\r\n `Global directives will not be resolved.`,\r\n );\r\n }\r\n return undefined;\r\n }\r\n\r\n // 1. 先从当前组件的 directives 选项中查找\r\n const directives = (instance.type as Record<string, unknown>)?.directives;\r\n if (directives && (directives as Record<string, Directive>)[name]) {\r\n return (directives as Record<string, Directive>)[name];\r\n }\r\n\r\n // 2. 再从全局注册中查找(appContext.directives)\r\n const globalDirectives = instance.appContext?.directives;\r\n if (globalDirectives && globalDirectives[name]) {\r\n return globalDirectives[name] as Directive;\r\n }\r\n\r\n if (__DEV__) {\r\n warn(`Failed to resolve directive \"${name}\".`);\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * 解析动态组件:\r\n * - 如果 tag 是字符串,尝试从 appContext.components 中解析已注册组件,\r\n * 如果找不到则返回原始字符串(可能是原生 HTML 元素)\r\n * - 如果 tag 已经是组件对象,直接返回\r\n */\r\nexport function resolveDynamicComponent(tag: string | Component): Component | string {\r\n if (typeof tag === 'string') {\r\n // 尝试从已注册组件中解析\r\n const resolved = resolveComponent(tag);\r\n return resolved ?? tag;\r\n }\r\n return tag;\r\n}\r\n","// src/directives.ts\r\n// @lytjs/core - 指令辅助函数\r\n//\r\n// FIX: P2-38 指令生命周期钩子文档:\r\n// 自定义指令支持以下生命周期钩子:\r\n// - created:元素创建后、挂载前调用\r\n// - beforeMount:元素挂载前调用\r\n// - mounted:元素挂载后调用\r\n// - beforeUpdate:元素更新前调用\r\n// - updated:元素更新后调用\r\n// - beforeUnmount:元素卸载前调用\r\n// - unmounted:元素卸载后调用\r\n\r\nimport { cloneVNode } from '@lytjs/vdom';\r\nimport { isArray } from '@lytjs/common-is';\r\nimport type { VNode, DirectiveArguments, Directive } from './types';\r\n\r\n/** 扩展 VNode 类型以支持指令存储 */\r\ninterface DirectiveVNode extends VNode {\r\n _directives?: DirectiveArguments;\r\n}\r\n\r\n/**\r\n * 将指令应用到 VNode 上。\r\n * 当指令带有 deep: true 选项时,递归遍历子 VNode 并应用指令。\r\n * FIX: P1-44 简化类型转换链,使用中间接口 DirectiveEntry 替代多层 as unknown as\r\n */\r\ninterface DirectiveEntry {\r\n dir: Directive & { deep?: boolean };\r\n value: unknown;\r\n arg: unknown;\r\n modifiers: Record<string, boolean>;\r\n}\r\n\r\nexport function withDirectives(vnode: VNode, directives: DirectiveArguments): VNode {\r\n const dirVNode = cloneVNode(vnode) as DirectiveVNode;\r\n // FIX: P1-44 使用 DirectiveEntry 中间类型简化类型转换\r\n // FIX: P2-v11-12 定义正确的类型转换函数,替代 as unknown as DirectiveArguments\r\n const normalizedDirectives: DirectiveArguments = directives.map(\r\n ([dir, value, arg, modifiers]): DirectiveArguments[0] => [\r\n dir,\r\n value,\r\n arg as string | undefined,\r\n (modifiers as Record<string, boolean>) || {},\r\n ],\r\n );\r\n dirVNode._directives = normalizedDirectives.map(\r\n ([dir, value, arg, modifiers]): DirectiveEntry => ({\r\n dir: dir as Directive & { deep?: boolean },\r\n value,\r\n arg,\r\n modifiers: modifiers ?? {},\r\n }),\r\n ) as unknown as DirectiveArguments;\r\n // FIX: P2-batch2-10 类型断言说明:\r\n // normalizedDirectives 的元素类型为 DirectiveEntry(四元组),\r\n // 而 _directives 的声明类型为 DirectiveArguments。两者结构一致,\r\n // 但 TypeScript 无法自动推导数组 map 返回类型与目标类型的兼容性,\r\n // 因此需要通过 unknown 桥接。\r\n\r\n // 处理 deep 选项:递归将指令应用到子 VNode\r\n for (const dirEntry of dirVNode._directives) {\r\n const dirObj = dirEntry as unknown as DirectiveEntry;\r\n if (dirObj.dir.deep) {\r\n applyDirectiveDeep(dirVNode, [\r\n dirObj.dir,\r\n dirObj.value,\r\n dirObj.arg as string | undefined,\r\n dirObj.modifiers,\r\n ]);\r\n }\r\n }\r\n\r\n return dirVNode;\r\n}\r\n\r\n/**\r\n * 递归地将指令应用到子 VNode。\r\n * 遍历 VNode 的 children(数组或单个子节点),为每个子 VNode\r\n * 附加相同的指令引用。\r\n * FIX: P2-v11-13 添加 visited Set 防止循环引用导致无限递归\r\n */\r\nfunction applyDirectiveDeep(vnode: DirectiveVNode, directive: DirectiveArguments[0]): void {\r\n const children = vnode.children;\r\n if (!children) return;\r\n\r\n // FIX: P2-v11-13 使用 visited Set 跟踪已处理的 VNode,\r\n // 防止循环引用(如 VNode.children 包含自身)导致栈溢出\r\n const visited = new Set<DirectiveVNode>();\r\n visited.add(vnode);\r\n\r\n const childArray = isArray(children) ? children : [children];\r\n\r\n for (const child of childArray) {\r\n if (!child || typeof child !== 'object') continue;\r\n\r\n const childVNode = child as DirectiveVNode;\r\n\r\n // 跳过已处理的 VNode,防止循环引用\r\n if (visited.has(childVNode)) continue;\r\n visited.add(childVNode);\r\n\r\n // 为子 VNode 附加指令\r\n if (!childVNode._directives) {\r\n childVNode._directives = [];\r\n }\r\n childVNode._directives.push(directive);\r\n\r\n // 递归处理子 VNode 的子节点\r\n applyDirectiveDeep(childVNode, directive);\r\n }\r\n}\r\n\r\n/** Memo 缓存条目 */\r\ninterface MemoEntry {\r\n memo: unknown[];\r\n result: VNode;\r\n}\r\n\r\n/**\r\n * 带缓存的渲染辅助\r\n */\r\nexport function withMemo(\r\n memo: unknown[],\r\n render: () => VNode,\r\n cache: MemoEntry[],\r\n index: number,\r\n): VNode {\r\n if (index < 0 || index >= cache.length) {\r\n // Index out of bounds - render and write to cache\r\n const result = render();\r\n cache[index] = { memo, result };\r\n return result;\r\n }\r\n const cached = cache[index];\r\n if (cached && isMemoSame(cached.memo, memo)) {\r\n return cached.result;\r\n }\r\n const result = render();\r\n cache[index] = { memo, result };\r\n return result;\r\n}\r\n\r\nfunction isMemoSame(prev: unknown[], next: unknown[]): boolean {\r\n if (prev.length !== next.length) return false;\r\n for (let i = 0; i < prev.length; i++) {\r\n if (prev[i] !== next[i]) return false;\r\n }\r\n return true;\r\n}\r\n","// src/composition.ts\r\n// @lytjs/core - Composition API 辅助函数\r\n\r\nimport { getCurrentInstance, onMounted } from '@lytjs/component';\r\nimport { computed, shallowRef, watch, watchEffect, readonly, onScopeDispose } from '@lytjs/reactivity';\r\nimport { warnOnce } from '@lytjs/common-error';\r\nimport type { WritableComputedRef, Ref } from '@lytjs/reactivity';\r\nimport type { InternalSlots } from './types';\r\n\r\n/**\r\n * 获取当前组件的 slots\r\n * FIX: P2-37 useSlots 类型安全增强:\r\n * 返回的 InternalSlots 类型确保 slot 函数的参数和返回值类型正确\r\n */\r\nexport function useSlots(): InternalSlots {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warnOnce('useSlots() called without an active component instance.');\r\n }\r\n return {} as InternalSlots;\r\n }\r\n return instance.slots || ({} as InternalSlots);\r\n}\r\n\r\n/**\r\n * 获取当前组件的 attrs\r\n */\r\nexport function useAttrs(): Record<string, unknown> {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warnOnce('useAttrs() was called outside of setup().');\r\n }\r\n return {};\r\n }\r\n return instance.attrs || {};\r\n}\r\n\r\n/**\r\n * 双向绑定辅助(v-model 的 composition API 版本)\r\n */\r\nexport function useModel<T>(\r\n props: Record<string, T | undefined>,\r\n key: string,\r\n): WritableComputedRef<T> {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n // FIX: P1-43 useModel 无实例时添加 DEV 警告,\r\n // 提醒开发者 useModel 必须在 setup() 中调用\r\n if (__DEV__) {\r\n warnOnce(`useModel(\"${key}\") was called outside of setup(). The model will not be reactive.`);\r\n }\r\n return computed<T>({\r\n get() {\r\n return undefined as T;\r\n },\r\n set() {\r\n // no-op when outside setup\r\n },\r\n });\r\n }\r\n\r\n return computed<T>({\r\n get() {\r\n return props[key] as T;\r\n },\r\n set(newValue: T) {\r\n instance.emit(`update:${key}`, newValue);\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * defineModel 运行时实现。\r\n * Vue 3.4+ 新增的编译器宏,在 lytjs 中以运行时函数形式提供。\r\n *\r\n * 用法:\r\n * const modelValue = defineModel() // 默认 'modelValue'\r\n * const title = defineModel('title') // 命名 model\r\n * const count = defineModel('count', { default: 0 }) // 带默认值\r\n *\r\n * 返回一个 WritableComputedRef,读取时返回 prop 值,写入时触发 update 事件。\r\n */\r\n// FIX: P1-45 默认泛型从 any 改为 unknown,提供更好的类型安全性\r\nexport function defineModel<T = unknown>(\r\n name?: string,\r\n options?: {\r\n default?: T;\r\n required?: boolean;\r\n type?: unknown;\r\n transform?: (value: T) => T;\r\n },\r\n): WritableComputedRef<T> {\r\n const instance = getCurrentInstance();\r\n const modelName = name ?? 'modelValue';\r\n\r\n if (!instance) {\r\n if (__DEV__) {\r\n warnOnce('defineModel() was called outside of setup().');\r\n }\r\n return computed<T>({\r\n get() {\r\n return options?.default as T;\r\n },\r\n set() {\r\n // no-op when outside setup\r\n },\r\n });\r\n }\r\n\r\n // 从 instance.props 中读取 model 值\r\n const props = instance.props as Record<string, T | undefined>;\r\n\r\n return computed<T>({\r\n get() {\r\n const value = props[modelName];\r\n if (value === undefined) {\r\n // required 校验:值为 undefined 且无默认值时发出警告\r\n if (__DEV__ && options?.required && options?.default === undefined) {\r\n warnOnce(\r\n `defineModel() \"${modelName}\" is marked as required but its value is undefined.`,\r\n );\r\n }\r\n return options?.default as T;\r\n }\r\n return value;\r\n },\r\n set(newValue: T) {\r\n // transform: 在 emit 前对值进行转换\r\n const emitValue = options?.transform ? options.transform(newValue) : newValue;\r\n instance.emit(`update:${modelName}`, emitValue);\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * 获取模板引用的 ref。\r\n * 通过 key 从组件实例的 refs 中获取对应的 DOM 元素或组件实例。\r\n * 使用 watch 持续追踪 refs 变化,确保响应式同步。\r\n * Vue 3.5+ 新增组合式 API。\r\n */\r\n// FIX: P1-45 默认泛型从 any 改为 unknown,提供更好的类型安全性\r\nexport function useTemplateRef<T = unknown>(key: string): Ref<T | null> {\r\n const instance = getCurrentInstance();\r\n const ref = shallowRef<T | null>(null);\r\n\r\n if (instance) {\r\n // 使用 watch 持续追踪 instance.refs[key] 的变化,\r\n // 支持 v-if 等动态绑定场景下 ref 的响应式更新。\r\n const stop = watch(\r\n () => (instance.refs as Record<string, T | null>)[key] ?? null,\r\n (newVal) => {\r\n ref.value = newVal;\r\n },\r\n { immediate: true, flush: 'pre' },\r\n );\r\n onScopeDispose(stop);\r\n } else if (__DEV__) {\r\n warnOnce('useTemplateRef() was called outside of setup().');\r\n }\r\n\r\n return ref;\r\n}\r\n\r\n// ==================== useId ====================\r\n\r\n/**\r\n * 生成高熵随机字符串作为 ID 后缀\r\n * FIX: P2-38 使用 crypto.randomUUID 或高熵随机数替代简单计数器,防止 ID 冲突\r\n */\r\nfunction generateIdSuffix(): string {\r\n // 优先使用 crypto.randomUUID(如果可用)\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID().slice(0, 8);\r\n }\r\n // 回退:使用高熵随机数(36进制,8位字符)\r\n return Math.random().toString(36).slice(2, 10);\r\n}\r\n\r\n/**\r\n * WeakMap to store per-instance ID counters, avoiding private property pollution.\r\n */\r\nconst instanceIdMap = new WeakMap<object, Map<string, number>>();\r\n\r\n/**\r\n * 生成应用范围内唯一的 ID。\r\n * Vue 3.5 新增的组合式 API,用于生成可预测的唯一标识符,\r\n * 特别适用于无障碍属性(aria-*)和表单元素关联。\r\n *\r\n * 每个组件实例会获得一个基于组件 uid 的 ID 前缀,\r\n * 确保同一组件在不同位置渲染时产生不同的 ID。\r\n *\r\n * FIX: P2-38 使用高熵随机数替代全局计数器,防止多实例/多窗口场景下的 ID 冲突\r\n */\r\nexport function useId(): Readonly<Ref<string>> {\r\n const instance = getCurrentInstance();\r\n const id = shallowRef('');\r\n\r\n if (instance) {\r\n // 使用组件 uid 作为前缀,确保组件级别的唯一性\r\n const prefix = `lyt-${instance.uid}`;\r\n // 使用 WeakMap 存储每个实例的 ID 计数器,避免私有属性依赖\r\n let map = instanceIdMap.get(instance);\r\n if (!map) {\r\n map = new Map<string, number>();\r\n instanceIdMap.set(instance, map);\r\n }\r\n const counter = (map.get('useId') ?? 0) + 1;\r\n map.set('useId', counter);\r\n // 添加高熵随机后缀,防止跨实例 ID 冲突\r\n id.value = `${prefix}-${counter}-${generateIdSuffix()}`;\r\n } else {\r\n // 降级:使用高熵随机数替代全局计数器\r\n id.value = `lyt-${generateIdSuffix()}`;\r\n }\r\n\r\n return readonly(id) as unknown as Readonly<Ref<string>>;\r\n}\r\n\r\n// ==================== useCssModule / useCssVars ====================\r\n\r\n/**\r\n * WeakMap to store per-instance CSS module mappings, avoiding private property pollution.\r\n */\r\nconst instanceCssModulesMap = new WeakMap<object, Record<string, Record<string, string>>>();\r\n\r\n/**\r\n * 获取单文件组件中 CSS Modules 的类名映射。\r\n * 在 SFC 中,`<style module>` 块会被编译为 CSS Modules,\r\n * useCssModule 返回一个包含局部类名到全局类名映射的对象。\r\n *\r\n * @param name - CSS Modules 的名称,默认为 '$style'\r\n */\r\nexport function useCssModule(name = '$style'): Record<string, string> {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warnOnce('useCssModule() was called outside of setup().');\r\n }\r\n return {};\r\n }\r\n\r\n // CSS Modules 的类名映射通过 WeakMap 存储,避免私有属性依赖\r\n const modules = instanceCssModulesMap.get(instance);\r\n return modules?.[name] ?? {};\r\n}\r\n\r\n/**\r\n * 在组件实例上注册 CSS Modules 映射(供 SFC 编译器调用)。\r\n * 替代直接设置 instance.cssModules 的方式。\r\n */\r\nexport function registerCssModules(\r\n instance: object,\r\n name: string,\r\n mapping: Record<string, string>,\r\n): void {\r\n let modules = instanceCssModulesMap.get(instance);\r\n if (!modules) {\r\n modules = {};\r\n instanceCssModulesMap.set(instance, modules);\r\n }\r\n modules[name] = mapping;\r\n}\r\n\r\n/**\r\n * 在组件实例上设置 CSS 自定义属性(CSS Variables)。\r\n * 提供响应式的方式来管理 CSS 变量。\r\n *\r\n * @param vars - 一个函数,返回包含 CSS 变量键值对的对象\r\n *\r\n * 用法:\r\n * useCssVars(() => ({\r\n * color: themeColor.value,\r\n * fontSize: size.value + 'px',\r\n * }))\r\n */\r\nexport function useCssVars(vars: () => Record<string, string>): void {\r\n const instance = getCurrentInstance();\r\n if (!instance) {\r\n if (__DEV__) {\r\n warnOnce('useCssVars() was called outside of setup().');\r\n }\r\n return;\r\n }\r\n\r\n // 在 mounted 和 updated 时将 CSS 变量设置到组件根元素上\r\n const updateStyle = (): void => {\r\n const el = instance.vnode?.el as HTMLElement | null;\r\n if (!el) return;\r\n\r\n const varsObj = vars();\r\n for (const [key, value] of Object.entries(varsObj)) {\r\n const cssVar = key.startsWith('--') ? key : `--${key}`;\r\n el.style.setProperty(cssVar, value);\r\n }\r\n };\r\n\r\n onMounted(updateStyle);\r\n\r\n // 使用 watchEffect 自动追踪 vars() 中的响应式依赖\r\n const stop = watchEffect(updateStyle);\r\n\r\n // FIX: P2-v11-10 useCssVars 卸载时清理组件根元素上设置的 CSS 变量,\r\n // 避免卸载后残留的 CSS 变量影响其他组件或导致内存泄漏\r\n onScopeDispose(() => {\r\n stop();\r\n const el = instance.vnode?.el as HTMLElement | null;\r\n if (el) {\r\n const varsObj = vars();\r\n for (const key of Object.keys(varsObj)) {\r\n const cssVar = key.startsWith('--') ? key : `--${key}`;\r\n el.style.removeProperty(cssVar);\r\n }\r\n }\r\n });\r\n}\r\n","// src/web-component.ts\r\n// @lytjs/core - Web Component 支持\r\n\r\nimport { createVNode } from '@lytjs/vdom';\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { createDOMRenderer } from '@lytjs/renderer';\r\nimport {\r\n createComponentInstance,\r\n setupComponent,\r\n callUnmountedHook,\r\n createAppContext,\r\n} from '@lytjs/component';\r\nimport type { ComponentOptions, ComponentInternalInstance, AppContext } from '@lytjs/component';\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// ==================== 类型定义 ====================\r\n\r\n/**\r\n * defineCustomElement 的配置选项\r\n */\r\nexport interface DefineCustomElementOptions {\r\n /** 是否使用 Shadow DOM(默认 true) */\r\n shadowRoot?: boolean;\r\n /** Custom Element 标签名(默认使用组件 name) */\r\n name?: string;\r\n /** CSS 样式(注入到 Shadow DOM) */\r\n css?: string;\r\n}\r\n\r\n// ==================== 内部状态 ====================\r\n\r\n/**\r\n * Per-instance context stored in a WeakMap so that multiple Custom Element\r\n * instances can coexist without clobbering each other's state.\r\n */\r\ninterface ElementContext {\r\n shadowRoot: ShadowRoot | null;\r\n host: HTMLElement;\r\n slotCallback: (() => void) | null;\r\n}\r\n\r\nconst elementContextMap = new WeakMap<HTMLElement, ElementContext>();\r\n\r\n/**\r\n * Stack of host elements currently being set up.\r\n * Since connectedCallback -> setupComponent is synchronous, the top of the\r\n * stack always refers to the element whose setup() is currently executing.\r\n * This replaces the old module-level _currentHost / _currentShadowRoot\r\n * variables and supports nested/re-entrant scenarios correctly.\r\n */\r\nconst setupStack: HTMLElement[] = [];\r\n\r\n/**\r\n * Get or create the context entry for a given host element.\r\n */\r\nfunction getElementContext(host: HTMLElement): ElementContext {\r\n let ctx = elementContextMap.get(host);\r\n if (!ctx) {\r\n ctx = { shadowRoot: null, host, slotCallback: null };\r\n elementContextMap.set(host, ctx);\r\n }\r\n return ctx;\r\n}\r\n\r\n/**\r\n * Return the context for the host element whose setup is currently running,\r\n * or undefined if called outside of a Custom Element setup.\r\n */\r\nfunction getCurrentContext(): ElementContext | undefined {\r\n const host = setupStack[setupStack.length - 1];\r\n return host ? elementContextMap.get(host) : undefined;\r\n}\r\n\r\n// ==================== Props 类型映射 ====================\r\n\r\n/**\r\n * 从组件 props 定义中提取 observedAttributes\r\n */\r\nfunction extractObservedAttributes(propsOptions: Record<string, unknown>): string[] {\r\n const attributes: string[] = [];\r\n for (const key in propsOptions) {\r\n // 将 camelCase 转换为 kebab-case\r\n const attrName = key.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n attributes.push(attrName);\r\n }\r\n return attributes;\r\n}\r\n\r\n/**\r\n * 将 kebab-case attribute 名称转换为 camelCase prop 名称\r\n */\r\nfunction attrToProp(attrName: string): string {\r\n return attrName.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\r\n}\r\n\r\n/**\r\n * 将 attribute 值反序列化为对应类型的 prop 值\r\n */\r\nfunction deserializeValue(value: string | null, propOptions: unknown): unknown {\r\n if (value === null) return undefined;\r\n\r\n const options = propOptions as { type?: unknown; default?: unknown } | true | undefined;\r\n\r\n if (options === true || options === undefined) {\r\n // 无类型声明,返回字符串\r\n return value;\r\n }\r\n\r\n const type = options.type;\r\n\r\n if (type === Number) {\r\n const num = Number(value);\r\n return isNaN(num) ? value : num;\r\n }\r\n if (type === Boolean) {\r\n // 布尔属性:只要存在即为 true\r\n return value !== 'false' && value !== '0' && value !== '';\r\n }\r\n // String 或其他类型,直接返回字符串\r\n return value;\r\n}\r\n\r\n// ==================== defineCustomElement ====================\r\n\r\n/**\r\n * 将 LytJS 组件包装为 Custom Element\r\n */\r\nexport function defineCustomElement(\r\n componentOptions: ComponentOptions,\r\n options?: DefineCustomElementOptions,\r\n): CustomElementConstructor {\r\n const useShadowDOM = options?.shadowRoot !== false;\r\n const tagName =\r\n options?.name ||\r\n (componentOptions.name\r\n ? componentOptions.name.replace(/([A-Z])/g, '-$1').toLowerCase()\r\n : 'lyt-component');\r\n const css = options?.css || '';\r\n\r\n // 从组件 props 中提取 observedAttributes\r\n const propsOptions = componentOptions.props || {};\r\n const observedAttributes = extractObservedAttributes(propsOptions);\r\n\r\n class LytCustomElement extends HTMLElement {\r\n private _instance: ComponentInternalInstance | null = null;\r\n private _root: ShadowRoot | HTMLElement;\r\n private _renderer: ReturnType<typeof createDOMRenderer> | null = null;\r\n private _vnode: VNode | null = null;\r\n private _appContext: AppContext;\r\n private _slotObserver: MutationObserver | null = null;\r\n\r\n static get observedAttributes(): string[] {\r\n return observedAttributes;\r\n }\r\n\r\n constructor() {\r\n super();\r\n\r\n if (useShadowDOM) {\r\n this._root = this.attachShadow({ mode: 'open' });\r\n // 注入 CSS 样式\r\n if (css) {\r\n const style = document.createElement('style');\r\n style.textContent = css;\r\n this._root.appendChild(style);\r\n }\r\n } else {\r\n this._root = this;\r\n }\r\n\r\n this._appContext = createAppContext();\r\n }\r\n\r\n connectedCallback(): void {\r\n // Store per-instance context in WeakMap\r\n const ctx = getElementContext(this);\r\n ctx.shadowRoot = useShadowDOM ? (this._root as ShadowRoot) : null;\r\n ctx.host = this;\r\n\r\n // 压入 setup 栈,使组合式 API 函数能找到此上下文\r\n setupStack.push(this);\r\n\r\n try {\r\n // 从 attributes 收集 props\r\n const props: Record<string, unknown> = {};\r\n for (const attr of observedAttributes) {\r\n const propKey = attrToProp(attr);\r\n const value = this.getAttribute(attr);\r\n props[propKey] = deserializeValue(value, propsOptions[propKey]);\r\n }\r\n\r\n // 创建 VNode\r\n const vnode = createVNode(componentOptions, props);\r\n this._vnode = vnode;\r\n\r\n // 创建组件实例\r\n const instance = createComponentInstance(vnode, null);\r\n instance.appContext = this._appContext;\r\n this._instance = instance;\r\n\r\n // 设置组件\r\n setupComponent(instance);\r\n\r\n // 创建渲染器并挂载\r\n const renderer = createDOMRenderer();\r\n this._renderer = renderer;\r\n renderer.mount(vnode, this._root);\r\n\r\n // 设置 slot 变化监听\r\n this._setupSlotObserver();\r\n } finally {\r\n // Pop from setup stack\r\n setupStack.pop();\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n if (this._instance) {\r\n callUnmountedHook(this._instance);\r\n }\r\n\r\n if (this._renderer && this._vnode) {\r\n this._renderer.unmount(this._vnode);\r\n }\r\n\r\n if (this._slotObserver) {\r\n this._slotObserver.disconnect();\r\n this._slotObserver = null;\r\n }\r\n\r\n // Remove per-instance context from WeakMap\r\n elementContextMap.delete(this);\r\n\r\n this._instance = null;\r\n this._renderer = null;\r\n this._vnode = null;\r\n }\r\n\r\n attributeChangedCallback(\r\n name: string,\r\n _oldValue: string | null,\r\n newValue: string | null,\r\n ): void {\r\n // 仅在已挂载时处理属性变更\r\n if (!this._instance || !this._vnode) return;\r\n\r\n const propKey = attrToProp(name);\r\n\r\n // FIX: P2-v11-14 添加防御性检查,确保 propKey 在 propsOptions 中存在,\r\n // 避免非 observedAttributes 的属性变更触发不必要的更新\r\n if (!(propKey in propsOptions)) return;\r\n\r\n const deserializedValue = deserializeValue(newValue, propsOptions[propKey]);\r\n\r\n // 如果值未实际改变则跳过\r\n if (this._instance.props[propKey] === deserializedValue) return;\r\n\r\n // 更新组件 props\r\n this._instance.props[propKey] = deserializedValue;\r\n\r\n // 更新 vnode 的 props\r\n (this._vnode.props as Record<string, unknown>)[propKey] = deserializedValue;\r\n\r\n // 触发增量更新:使用 patch 进行差异化更新而非完全重建\r\n if (this._renderer && this._vnode) {\r\n if (this._renderer.patch) {\r\n // FIX: P2-39 Shadow DOM 属性反射优化:\r\n // 在 Web Component 中,属性变化通过 attributeChangedCallback 触发,\r\n // 使用 VNode 副本确保 diff 算法正确检测到变化\r\n // FIX: P0-13 创建新 VNode 副本传入 patch,避免传入相同引用导致\r\n // diff 算法短路(n1 === n2 时直接返回,不执行任何更新)\r\n const newVNode = { ...this._vnode, props: { ...this._vnode.props } };\r\n this._renderer.patch(this._vnode, newVNode, this._root as Element);\r\n // 更新内部引用为新的 vnode\r\n this._vnode = newVNode;\r\n } else if (this._renderer.render) {\r\n this._renderer.render(this._vnode, this._root as Element);\r\n }\r\n }\r\n }\r\n\r\n private _setupSlotObserver(): void {\r\n // 监听 Light DOM slot 内容变化\r\n this._slotObserver = new MutationObserver(() => {\r\n const ctx = elementContextMap.get(this);\r\n if (ctx?.slotCallback) {\r\n ctx.slotCallback();\r\n }\r\n });\r\n\r\n this._slotObserver.observe(this, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true,\r\n });\r\n }\r\n }\r\n\r\n // 注册 Custom Element\r\n // 使用 try-catch 处理竞态条件:多个模块可能同时尝试注册同名元素\r\n try {\r\n customElements.define(tagName, LytCustomElement);\r\n } catch (e) {\r\n if (__DEV__) {\r\n warn(\r\n `defineCustomElement: failed to register \"${tagName}\". ` +\r\n `It may have already been registered by another module. Error: ${e}`,\r\n );\r\n }\r\n }\r\n\r\n return LytCustomElement;\r\n}\r\n\r\n// ==================== Composition API: useShadowRoot ====================\r\n\r\n/**\r\n * 在 setup 中获取当前 Custom Element 的 Shadow Root\r\n */\r\nexport function useShadowRoot(): ShadowRoot | null {\r\n const ctx = getCurrentContext();\r\n if (__DEV__ && !ctx?.shadowRoot) {\r\n warn(\r\n 'useShadowRoot() was called outside of a Custom Element context. ' +\r\n 'Make sure this is called inside a component wrapped by defineCustomElement.',\r\n );\r\n }\r\n return ctx?.shadowRoot ?? null;\r\n}\r\n\r\n// ==================== Composition API: useHost ====================\r\n\r\n/**\r\n * 在 setup 中获取当前 Custom Element 的宿主元素\r\n */\r\nexport function useHost(): HTMLElement | null {\r\n const ctx = getCurrentContext();\r\n if (__DEV__ && !ctx?.host) {\r\n warn(\r\n 'useHost() was called outside of a Custom Element context. ' +\r\n 'Make sure this is called inside a component wrapped by defineCustomElement.',\r\n );\r\n }\r\n return ctx?.host ?? null;\r\n}\r\n\r\n// ==================== Composition API: useSlots (Web Component 版) ====================\r\n\r\n/**\r\n * 在 setup 中获取 slot 变化通知(MutationObserver)\r\n * 返回一个注册回调的函数\r\n */\r\nexport function useWebComponentSlots(onChange: () => void): void {\r\n const ctx = getCurrentContext();\r\n if (ctx) {\r\n ctx.slotCallback = onChange;\r\n }\r\n}\r\n\r\n// ==================== injectChildStyles ====================\r\n\r\n/**\r\n * 向 Shadow DOM 注入样式\r\n */\r\nexport function injectChildStyles(styles: string): void {\r\n const ctx = getCurrentContext();\r\n const shadowRoot = ctx?.shadowRoot ?? null;\r\n if (!shadowRoot) {\r\n if (__DEV__) {\r\n warn(\r\n 'injectChildStyles() was called outside of a Custom Element context. ' +\r\n 'Styles will not be injected.',\r\n );\r\n }\r\n return;\r\n }\r\n\r\n const style = document.createElement('style');\r\n style.textContent = styles;\r\n shadowRoot.appendChild(style);\r\n}\r\n","// src/lifecycle.ts\r\n// @lytjs/core - 生命周期钩子(代理到 @lytjs/component)\r\n\r\nexport {\r\n onMounted,\r\n onUnmounted,\r\n onUpdated,\r\n onBeforeMount,\r\n onBeforeUnmount,\r\n onBeforeUpdate,\r\n onErrorCaptured,\r\n onActivated,\r\n onDeactivated,\r\n onRenderTracked,\r\n onRenderTriggered,\r\n} from '@lytjs/component';\r\n","// src/config-validator.ts\r\n// @lytjs/core - 插件配置验证器\r\n\r\nimport type {\r\n ConfigSchema,\r\n ConfigValidationReport,\r\n ConfigValidationError,\r\n ValidationContext,\r\n ValidationErrorCode,\r\n StringFormat,\r\n} from './config-schema';\r\n\r\n/**\r\n * 配置验证器\r\n * @description 根据 ConfigSchema 验证配置值\r\n */\r\nexport class ConfigValidator {\r\n /** 自定义验证规则 */\r\n private rules: Array<(value: unknown, schema: ConfigSchema, context: ValidationContext) => ConfigValidationError | null> = [];\r\n\r\n /**\r\n * 验证配置值\r\n * @param value - 要验证的值\r\n * @param schema - 配置 Schema\r\n * @param path - 当前路径(用于错误报告)\r\n * @returns 验证报告\r\n */\r\n validate(value: unknown, schema: ConfigSchema, path: string = ''): ConfigValidationReport {\r\n const errors: ConfigValidationError[] = [];\r\n const context: ValidationContext = { path, root: value };\r\n\r\n // 处理 null/undefined\r\n if (value === null) {\r\n if (!schema.nullable && schema.default === undefined) {\r\n errors.push(this.createError(path, 'type_error', 'Value cannot be null'));\r\n }\r\n return { valid: errors.length === 0, errors, errorCount: errors.length, warningCount: 0 };\r\n }\r\n\r\n if (value === undefined) {\r\n if (schema.required) {\r\n errors.push(this.createError(path, 'required', 'Value is required'));\r\n } else if (schema.default !== undefined) {\r\n // 使用默认值,不报错\r\n }\r\n return { valid: errors.length === 0, errors, errorCount: errors.length, warningCount: 0 };\r\n }\r\n\r\n // 执行自定义验证(最优先)\r\n if (schema.validate) {\r\n const result = schema.validate(value, context);\r\n if (!result.valid) {\r\n errors.push(this.createError(path, 'custom_error', result.message || 'Custom validation failed'));\r\n }\r\n }\r\n\r\n // 根据类型验证\r\n switch (schema.type) {\r\n case 'string':\r\n errors.push(...this.validateString(value, schema as ConfigSchema<string>, path));\r\n break;\r\n case 'number':\r\n errors.push(...this.validateNumber(value, schema as ConfigSchema<number>, path));\r\n break;\r\n case 'boolean':\r\n errors.push(...this.validateBoolean(value, schema as ConfigSchema<boolean>, path));\r\n break;\r\n case 'object':\r\n errors.push(...this.validateObject(value, schema as ConfigSchema<Record<string, unknown>>, path));\r\n break;\r\n case 'array':\r\n errors.push(...this.validateArray(value, schema as ConfigSchema<unknown[]>, path));\r\n break;\r\n case 'enum':\r\n errors.push(...this.validateEnum(value, schema, path));\r\n break;\r\n case 'union':\r\n errors.push(...this.validateUnion(value, schema, path));\r\n break;\r\n }\r\n\r\n // 执行自定义规则\r\n for (const rule of this.rules) {\r\n const error = rule(value, schema, context);\r\n if (error) {\r\n errors.push(error);\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n errorCount: errors.length,\r\n warningCount: 0,\r\n };\r\n }\r\n\r\n /**\r\n * 验证字符串值\r\n */\r\n private validateString(value: unknown, schema: ConfigSchema<string>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n\r\n if (typeof value !== 'string') {\r\n errors.push(this.createError(path, 'type_error', `Expected string, got ${typeof value}`, 'string', value));\r\n return errors;\r\n }\r\n\r\n const stringSchema = schema.string || {};\r\n\r\n // minLength\r\n if (stringSchema.minLength !== undefined && value.length < stringSchema.minLength) {\r\n errors.push(this.createError(\r\n path,\r\n 'min_length',\r\n `String must be at least ${stringSchema.minLength} characters`,\r\n `minLength: ${stringSchema.minLength}`,\r\n value.length,\r\n ));\r\n }\r\n\r\n // maxLength\r\n if (stringSchema.maxLength !== undefined && value.length > stringSchema.maxLength) {\r\n errors.push(this.createError(\r\n path,\r\n 'max_length',\r\n `String must be at most ${stringSchema.maxLength} characters`,\r\n `maxLength: ${stringSchema.maxLength}`,\r\n value.length,\r\n ));\r\n }\r\n\r\n // pattern\r\n if (stringSchema.pattern) {\r\n const pattern = typeof stringSchema.pattern === 'string' ? new RegExp(stringSchema.pattern) : stringSchema.pattern;\r\n if (!pattern.test(value)) {\r\n errors.push(this.createError(\r\n path,\r\n 'pattern_mismatch',\r\n `String does not match pattern: ${stringSchema.pattern}`,\r\n String(stringSchema.pattern),\r\n value,\r\n ));\r\n }\r\n }\r\n\r\n // format\r\n if (stringSchema.format && this.isStringType(value)) {\r\n const formatError = this.validateFormat(value, stringSchema.format);\r\n if (formatError) {\r\n errors.push(this.createError(path, 'format_error', formatError, stringSchema.format, value));\r\n }\r\n }\r\n\r\n // enum\r\n if (stringSchema.enum && !stringSchema.enum.includes(value)) {\r\n errors.push(this.createError(\r\n path,\r\n 'enum_mismatch',\r\n `Value must be one of: ${stringSchema.enum.join(', ')}`,\r\n stringSchema.enum.join(' | '),\r\n value,\r\n ));\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证数字值\r\n */\r\n private validateNumber(value: unknown, schema: ConfigSchema<number>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n\r\n if (typeof value !== 'number' || Number.isNaN(value)) {\r\n errors.push(this.createError(path, 'type_error', `Expected number, got ${typeof value}`, 'number', value));\r\n return errors;\r\n }\r\n\r\n const numberSchema = schema.number || {};\r\n\r\n // integer\r\n if (numberSchema.integer && !Number.isInteger(value)) {\r\n errors.push(this.createError(path, 'type_error', 'Value must be an integer', 'integer', value));\r\n }\r\n\r\n // minimum\r\n if (numberSchema.minimum !== undefined && value < numberSchema.minimum) {\r\n errors.push(this.createError(\r\n path,\r\n 'minimum',\r\n `Value must be >= ${numberSchema.minimum}`,\r\n `minimum: ${numberSchema.minimum}`,\r\n value,\r\n ));\r\n }\r\n\r\n // maximum\r\n if (numberSchema.maximum !== undefined && value > numberSchema.maximum) {\r\n errors.push(this.createError(\r\n path,\r\n 'maximum',\r\n `Value must be <= ${numberSchema.maximum}`,\r\n `maximum: ${numberSchema.maximum}`,\r\n value,\r\n ));\r\n }\r\n\r\n // exclusiveMinimum\r\n if (numberSchema.exclusiveMinimum !== undefined && value <= numberSchema.exclusiveMinimum) {\r\n errors.push(this.createError(\r\n path,\r\n 'minimum',\r\n `Value must be > ${numberSchema.exclusiveMinimum}`,\r\n `exclusiveMinimum: ${numberSchema.exclusiveMinimum}`,\r\n value,\r\n ));\r\n }\r\n\r\n // exclusiveMaximum\r\n if (numberSchema.exclusiveMaximum !== undefined && value >= numberSchema.exclusiveMaximum) {\r\n errors.push(this.createError(\r\n path,\r\n 'maximum',\r\n `Value must be < ${numberSchema.exclusiveMaximum}`,\r\n `exclusiveMaximum: ${numberSchema.exclusiveMaximum}`,\r\n value,\r\n ));\r\n }\r\n\r\n // enum\r\n if (numberSchema.enum && !numberSchema.enum.includes(value)) {\r\n errors.push(this.createError(\r\n path,\r\n 'enum_mismatch',\r\n `Value must be one of: ${numberSchema.enum.join(', ')}`,\r\n numberSchema.enum.join(' | '),\r\n value,\r\n ));\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证布尔值\r\n */\r\n private validateBoolean(value: unknown, _schema: ConfigSchema<boolean>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n\r\n if (typeof value !== 'boolean') {\r\n errors.push(this.createError(path, 'type_error', `Expected boolean, got ${typeof value}`, 'boolean', value));\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证对象值\r\n */\r\n private validateObject(value: unknown, schema: ConfigSchema<Record<string, unknown>>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n errors.push(this.createError(path, 'type_error', `Expected object, got ${typeof value}`, 'object', value));\r\n return errors;\r\n }\r\n\r\n const objectSchema = schema.object;\r\n if (!objectSchema) return errors;\r\n\r\n const obj = value as Record<string, unknown>;\r\n\r\n // maxProperties\r\n const keys = Object.keys(obj);\r\n if (objectSchema.maxProperties !== undefined && keys.length > objectSchema.maxProperties) {\r\n errors.push(this.createError(\r\n path,\r\n 'max_items',\r\n `Object must have at most ${objectSchema.maxProperties} properties`,\r\n `maxProperties: ${objectSchema.maxProperties}`,\r\n keys.length,\r\n ));\r\n }\r\n\r\n // minProperties\r\n if (objectSchema.minProperties !== undefined && keys.length < objectSchema.minProperties) {\r\n errors.push(this.createError(\r\n path,\r\n 'min_items',\r\n `Object must have at least ${objectSchema.minProperties} properties`,\r\n `minProperties: ${objectSchema.minProperties}`,\r\n keys.length,\r\n ));\r\n }\r\n\r\n // 检查每个属性\r\n for (const [key, propertySchema] of Object.entries(objectSchema.properties || {})) {\r\n const propertyPath = path ? `${path}.${key}` : key;\r\n const propertyValue = obj[key];\r\n\r\n if (propertyValue !== undefined) {\r\n const propertyReport = this.validate(propertyValue, propertySchema, propertyPath);\r\n errors.push(...propertyReport.errors);\r\n } else if (propertySchema.required) {\r\n errors.push(this.createError(propertyPath, 'required', `Property \"${key}\" is required`));\r\n }\r\n }\r\n\r\n // 检查额外属性\r\n const definedKeys = new Set(Object.keys(objectSchema.properties || {}));\r\n if (!objectSchema.additionalProperties) {\r\n for (const key of keys) {\r\n if (!definedKeys.has(key)) {\r\n // 检查 patternProperties\r\n let matchesPattern = false;\r\n if (objectSchema.patternProperties) {\r\n for (const pattern of Object.keys(objectSchema.patternProperties)) {\r\n const regex = new RegExp(pattern);\r\n if (regex.test(key)) {\r\n matchesPattern = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!matchesPattern) {\r\n errors.push(this.createError(\r\n `${path}.${key}`,\r\n 'additional_properties',\r\n `Additional property \"${key}\" is not allowed`,\r\n key,\r\n key,\r\n ));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证数组值\r\n */\r\n private validateArray(value: unknown, schema: ConfigSchema<unknown[]>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n\r\n if (!Array.isArray(value)) {\r\n errors.push(this.createError(path, 'type_error', `Expected array, got ${typeof value}`, 'array', value));\r\n return errors;\r\n }\r\n\r\n const arraySchema = schema.array || {};\r\n\r\n // minItems\r\n if (arraySchema.minItems !== undefined && value.length < arraySchema.minItems) {\r\n errors.push(this.createError(\r\n path,\r\n 'min_items',\r\n `Array must have at least ${arraySchema.minItems} items`,\r\n `minItems: ${arraySchema.minItems}`,\r\n value.length,\r\n ));\r\n }\r\n\r\n // maxItems\r\n if (arraySchema.maxItems !== undefined && value.length > arraySchema.maxItems) {\r\n errors.push(this.createError(\r\n path,\r\n 'max_items',\r\n `Array must have at most ${arraySchema.maxItems} items`,\r\n `maxItems: ${arraySchema.maxItems}`,\r\n value.length,\r\n ));\r\n }\r\n\r\n // uniqueItems\r\n if (arraySchema.uniqueItems) {\r\n const seen = new Set();\r\n for (let i = 0; i < value.length; i++) {\r\n const item = value[i];\r\n const key = JSON.stringify(item);\r\n if (seen.has(key)) {\r\n errors.push(this.createError(\r\n `${path}[${i}]`,\r\n 'unique_items',\r\n `Duplicate item found at index ${i}`,\r\n 'uniqueItems',\r\n item,\r\n ));\r\n }\r\n seen.add(key);\r\n }\r\n }\r\n\r\n // 验证每个元素\r\n if (arraySchema.items) {\r\n for (let i = 0; i < value.length; i++) {\r\n const itemPath = `${path}[${i}]`;\r\n const itemReport = this.validate(value[i], arraySchema.items, itemPath);\r\n errors.push(...itemReport.errors);\r\n }\r\n }\r\n\r\n // 验证元组\r\n if (arraySchema.tuple) {\r\n for (let i = 0; i < Math.min(value.length, arraySchema.tuple.length); i++) {\r\n const itemPath = `${path}[${i}]`;\r\n const itemReport = this.validate(value[i], arraySchema.tuple[i]!, itemPath);\r\n errors.push(...itemReport.errors);\r\n }\r\n // 元组长度不匹配\r\n if (value.length !== arraySchema.tuple.length) {\r\n errors.push(this.createError(\r\n path,\r\n 'max_items',\r\n `Tuple must have exactly ${arraySchema.tuple.length} items, got ${value.length}`,\r\n `tuple length: ${arraySchema.tuple.length}`,\r\n value.length,\r\n ));\r\n }\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证枚举值\r\n */\r\n private validateEnum<T>(value: unknown, schema: ConfigSchema<T>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n const enumSchema = schema.enum!;\r\n\r\n if (!enumSchema.values.includes(value as T)) {\r\n errors.push(this.createError(\r\n path,\r\n 'enum_mismatch',\r\n `Value must be one of: ${enumSchema.values.map((v) => JSON.stringify(v)).join(', ')}`,\r\n enumSchema.values.map((v) => JSON.stringify(v)).join(' | '),\r\n value,\r\n ));\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证联合类型\r\n */\r\n private validateUnion(value: unknown, schema: ConfigSchema<unknown>, path: string): ConfigValidationError[] {\r\n const errors: ConfigValidationError[] = [];\r\n const unionSchema = schema.union!;\r\n\r\n // anyOf: 至少一个匹配\r\n if (unionSchema.anyOf) {\r\n let matched = false;\r\n for (const subSchema of unionSchema.anyOf) {\r\n const report = this.validate(value, subSchema, path);\r\n if (report.valid) {\r\n matched = true;\r\n break;\r\n }\r\n }\r\n if (!matched) {\r\n errors.push(this.createError(\r\n path,\r\n 'type_error',\r\n 'Value does not match any of the allowed types',\r\n 'union',\r\n value,\r\n ));\r\n }\r\n }\r\n\r\n // oneOf: 恰好一个匹配\r\n if (unionSchema.oneOf) {\r\n let matchCount = 0;\r\n for (const subSchema of unionSchema.oneOf) {\r\n const report = this.validate(value, subSchema, path);\r\n if (report.valid) {\r\n matchCount++;\r\n }\r\n }\r\n if (matchCount !== 1) {\r\n errors.push(this.createError(\r\n path,\r\n 'type_error',\r\n `Value must match exactly one of the allowed types, matched ${matchCount}`,\r\n 'oneOf',\r\n value,\r\n ));\r\n }\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * 验证字符串格式\r\n */\r\n private validateFormat(value: string, format: StringFormat): string | null {\r\n switch (format) {\r\n case 'date':\r\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || isNaN(Date.parse(value))) {\r\n return `Invalid date format, expected YYYY-MM-DD`;\r\n }\r\n return null;\r\n\r\n case 'time':\r\n if (!/^\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$/.test(value)) {\r\n return `Invalid time format`;\r\n }\r\n return null;\r\n\r\n case 'date-time':\r\n if (isNaN(Date.parse(value))) {\r\n return `Invalid ISO 8601 date-time format`;\r\n }\r\n return null;\r\n\r\n case 'email':\r\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\r\n return `Invalid email format`;\r\n }\r\n return null;\r\n\r\n case 'url':\r\n case 'uri':\r\n try {\r\n new URL(value);\r\n return null;\r\n } catch {\r\n return `Invalid URL format`;\r\n }\r\n\r\n case 'uuid':\r\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)) {\r\n return `Invalid UUID format`;\r\n }\r\n return null;\r\n\r\n case 'semver':\r\n if (!/^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.]+)?(\\+[a-zA-Z0-9.]+)?$/.test(value)) {\r\n return `Invalid semver format, expected MAJOR.MINOR.PATCH`;\r\n }\r\n return null;\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 创建验证错误\r\n */\r\n private createError(\r\n path: string,\r\n code: ValidationErrorCode,\r\n message: string,\r\n expected?: string,\r\n actual?: unknown,\r\n ): ConfigValidationError {\r\n return { path, code, message, expected, actual };\r\n }\r\n\r\n /**\r\n * 添加自定义验证规则\r\n */\r\n addRule(rule: (value: unknown, schema: ConfigSchema, context: ValidationContext) => ConfigValidationError | null): void {\r\n this.rules.push(rule);\r\n }\r\n\r\n /**\r\n * 移除自定义验证规则\r\n */\r\n removeRule(rule: (value: unknown, schema: ConfigSchema, context: ValidationContext) => ConfigValidationError | null): void {\r\n const index = this.rules.indexOf(rule);\r\n if (index !== -1) {\r\n this.rules.splice(index, 1);\r\n }\r\n }\r\n\r\n // ==================== 类型守卫 ====================\r\n\r\n private isStringType(value: unknown): value is string {\r\n return typeof value === 'string';\r\n }\r\n}\r\n\r\n// ==================== 便捷函数 ====================\r\n\r\n/**\r\n * 快速验证配置\r\n */\r\nexport function validateConfig<T>(value: unknown, schema: ConfigSchema<T>): ConfigValidationReport {\r\n const validator = new ConfigValidator();\r\n return validator.validate(value, schema as unknown as ConfigSchema<unknown>);\r\n}\r\n","// src/config-transformer.ts\r\n// @lytjs/core - 插件配置转换器\r\n\r\nimport type {\r\n ConfigSchema,\r\n ConfigTransformReport,\r\n ConfigValidationError,\r\n} from './config-schema';\r\nimport { ConfigValidator } from './config-validator';\r\n\r\n/**\r\n * 配置转换器\r\n * @description 负责应用默认值、类型转换和预处理\r\n */\r\nexport class ConfigTransformer {\r\n private validator: ConfigValidator;\r\n\r\n constructor() {\r\n this.validator = new ConfigValidator();\r\n }\r\n\r\n /**\r\n * 转换并验证配置\r\n * @param value - 原始配置值\r\n * @param schema - 配置 Schema\r\n * @param path - 当前路径\r\n * @returns 转换报告\r\n */\r\n transform<T>(value: unknown, schema: ConfigSchema<T>, path: string = ''): ConfigTransformReport<T> {\r\n const warnings: string[] = [];\r\n const transforms: string[] = [];\r\n const errors: ConfigValidationError[] = [];\r\n let transformed = value;\r\n\r\n // 1. 处理 undefined → 应用默认值\r\n if (transformed === undefined) {\r\n if (schema.default !== undefined) {\r\n transformed = schema.default;\r\n transforms.push(`Applied default value: ${JSON.stringify(schema.default)}`);\r\n } else if (schema.required) {\r\n errors.push({\r\n path,\r\n code: 'required',\r\n message: 'Value is required',\r\n });\r\n return { config: undefined as unknown as T, success: false, errors, warnings, transforms };\r\n }\r\n }\r\n\r\n // 2. 处理 null\r\n if (transformed === null) {\r\n if (schema.nullable) {\r\n // null 是允许的\r\n } else if (schema.default !== undefined) {\r\n transformed = schema.default;\r\n transforms.push(`Applied default value for null: ${JSON.stringify(schema.default)}`);\r\n warnings.push('Null value was replaced with default');\r\n } else {\r\n errors.push({\r\n path,\r\n code: 'type_error',\r\n message: 'Value cannot be null',\r\n });\r\n return { config: null as unknown as T, success: false, errors, warnings, transforms };\r\n }\r\n }\r\n\r\n // 3. 应用类型转换\r\n if (transformed !== undefined && transformed !== null) {\r\n if (schema.transform) {\r\n try {\r\n const original = transformed;\r\n transformed = schema.transform(transformed);\r\n if (original !== transformed) {\r\n transforms.push(`Applied transform function`);\r\n }\r\n } catch (err) {\r\n errors.push({\r\n path,\r\n code: 'custom_error',\r\n message: `Transform failed: ${err instanceof Error ? err.message : String(err)}`,\r\n });\r\n return { config: transformed as T, success: false, errors, warnings, transforms };\r\n }\r\n }\r\n }\r\n\r\n // 4. 递归处理复杂类型\r\n if (schema.type === 'object' && schema.object && typeof transformed === 'object' && transformed !== null) {\r\n const objectResult = this.transformObject(transformed as Record<string, unknown>, schema as ConfigSchema<Record<string, unknown>>, path);\r\n transformed = objectResult.value as unknown as T;\r\n errors.push(...objectResult.errors);\r\n warnings.push(...objectResult.warnings);\r\n transforms.push(...objectResult.transforms);\r\n } else if (schema.type === 'array' && schema.array && Array.isArray(transformed)) {\r\n const arrayResult = this.transformArray(transformed, schema as unknown as ConfigSchema<unknown[]>, path);\r\n transformed = arrayResult.value as unknown as T;\r\n errors.push(...arrayResult.errors);\r\n warnings.push(...arrayResult.warnings);\r\n transforms.push(...arrayResult.transforms);\r\n }\r\n\r\n // 5. 验证转换后的值\r\n if (transformed !== undefined && transformed !== null) {\r\n const validationReport = this.validator.validate(transformed, schema as ConfigSchema<unknown>, path);\r\n errors.push(...validationReport.errors);\r\n }\r\n\r\n return {\r\n config: transformed as T,\r\n success: errors.length === 0,\r\n errors,\r\n warnings,\r\n transforms,\r\n };\r\n }\r\n\r\n /**\r\n * 转换对象配置\r\n */\r\n private transformObject(\r\n obj: Record<string, unknown>,\r\n schema: ConfigSchema<Record<string, unknown>>,\r\n path: string,\r\n ): { value: Record<string, unknown>; errors: ConfigValidationError[]; warnings: string[]; transforms: string[] } {\r\n const result: Record<string, unknown> = {};\r\n const errors: ConfigValidationError[] = [];\r\n const warnings: string[] = [];\r\n const transforms: string[] = [];\r\n const objectSchema = schema.object!;\r\n const definedKeys = new Set(Object.keys(objectSchema.properties || {}));\r\n\r\n // 处理每个定义的属性\r\n for (const [key, propertySchema] of Object.entries(objectSchema.properties || {})) {\r\n const propertyPath = path ? `${path}.${key}` : key;\r\n const propertyValue = obj[key];\r\n\r\n // 应用属性级别的转换\r\n if (propertyValue !== undefined) {\r\n const propertyResult = this.transform(propertyValue, propertySchema, propertyPath);\r\n result[key] = propertyResult.config;\r\n errors.push(...propertyResult.errors);\r\n warnings.push(...propertyResult.warnings);\r\n transforms.push(...propertyResult.transforms);\r\n } else if (propertySchema.default !== undefined) {\r\n result[key] = propertySchema.default;\r\n transforms.push(`Applied default for \"${key}\": ${JSON.stringify(propertySchema.default)}`);\r\n } else if (propertySchema.required) {\r\n errors.push({\r\n path: propertyPath,\r\n code: 'required',\r\n message: `Property \"${key}\" is required`,\r\n });\r\n }\r\n }\r\n\r\n // 处理 patternProperties\r\n if (objectSchema.patternProperties) {\r\n for (const key of Object.keys(obj)) {\r\n if (!definedKeys.has(key)) {\r\n for (const [pattern, patternSchema] of Object.entries(objectSchema.patternProperties)) {\r\n const regex = new RegExp(pattern);\r\n if (regex.test(key)) {\r\n const propertyPath = `${path}.${key}`;\r\n const propertyResult = this.transform(obj[key], patternSchema, propertyPath);\r\n result[key] = propertyResult.config;\r\n errors.push(...propertyResult.errors);\r\n warnings.push(...propertyResult.warnings);\r\n transforms.push(...propertyResult.transforms);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 处理额外属性\r\n if (!objectSchema.additionalProperties) {\r\n for (const key of Object.keys(obj)) {\r\n if (!definedKeys.has(key)) {\r\n let matchesPattern = false;\r\n if (objectSchema.patternProperties) {\r\n for (const pattern of Object.keys(objectSchema.patternProperties)) {\r\n const regex = new RegExp(pattern);\r\n if (regex.test(key)) {\r\n matchesPattern = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!matchesPattern) {\r\n warnings.push(`Additional property \"${key}\" will be ignored`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { value: result, errors, warnings, transforms };\r\n }\r\n\r\n /**\r\n * 转换数组配置\r\n */\r\n private transformArray(\r\n arr: unknown[],\r\n schema: ConfigSchema<unknown[]>,\r\n path: string,\r\n ): { value: unknown[]; errors: ConfigValidationError[]; warnings: string[]; transforms: string[] } {\r\n const result: unknown[] = [];\r\n const errors: ConfigValidationError[] = [];\r\n const warnings: string[] = [];\r\n const transforms: string[] = [];\r\n const arraySchema = schema.array!;\r\n\r\n for (let i = 0; i < arr.length; i++) {\r\n const itemPath = `${path}[${i}]`;\r\n const itemResult = this.transform(arr[i], arraySchema.items!, itemPath);\r\n result.push(itemResult.config);\r\n errors.push(...itemResult.errors);\r\n warnings.push(...itemResult.warnings);\r\n transforms.push(...itemResult.transforms);\r\n }\r\n\r\n // 处理元组默认值\r\n if (arraySchema.tuple) {\r\n for (let i = arr.length; i < arraySchema.tuple.length; i++) {\r\n const itemSchema = arraySchema.tuple[i];\r\n if (itemSchema && itemSchema.default !== undefined) {\r\n result.push(itemSchema.default);\r\n transforms.push(`Applied default for tuple[${i}]: ${JSON.stringify(itemSchema.default)}`);\r\n }\r\n }\r\n }\r\n\r\n return { value: result, errors, warnings, transforms };\r\n }\r\n\r\n /**\r\n * 合并多个配置(用户配置覆盖默认配置)\r\n * @param defaults - 默认配置\r\n * @param overrides - 用户配置\r\n * @param schema - 配置 Schema\r\n * @returns 合并后的配置\r\n */\r\n merge<T>(defaults: Partial<T>, overrides: Partial<T>, schema: ConfigSchema<T>): ConfigTransformReport<T> {\r\n // 深度合并\r\n const merged = this.deepMerge(defaults as Record<string, unknown>, overrides as Record<string, unknown>);\r\n return this.transform(merged, schema as ConfigSchema<T>);\r\n }\r\n\r\n /**\r\n * 深度合并两个对象\r\n */\r\n private deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\r\n const result: Record<string, unknown> = { ...target };\r\n\r\n for (const [key, value] of Object.entries(source)) {\r\n if (value !== undefined) {\r\n if (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n !Array.isArray(value) &&\r\n typeof result[key] === 'object' &&\r\n result[key] !== null &&\r\n !Array.isArray(result[key])\r\n ) {\r\n result[key] = this.deepMerge(result[key] as Record<string, unknown>, value as Record<string, unknown>);\r\n } else {\r\n result[key] = value;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 从配置中提取指定字段\r\n * @param config - 完整配置\r\n * @param schema - 配置 Schema\r\n * @param keys - 要提取的键\r\n * @returns 提取的配置子集\r\n */\r\n extract<T, K extends keyof T>(config: T, schema: ConfigSchema<T>, keys: K[]): Partial<T> {\r\n const result: Partial<T> = {} as Partial<T>;\r\n const configObj = config as unknown as Record<string, unknown>;\r\n\r\n for (const key of keys) {\r\n if (key in configObj) {\r\n const propertySchema = schema.object?.properties?.[key as string];\r\n if (propertySchema) {\r\n const propertyReport = this.transform(configObj[key as string], propertySchema as ConfigSchema<unknown>, String(key));\r\n if (propertyReport.success) {\r\n (result as Record<string, unknown>)[key as string] = propertyReport.config;\r\n }\r\n } else {\r\n (result as Record<string, unknown>)[key as string] = configObj[key as string];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n// ==================== 便捷函数 ====================\r\n\r\n/**\r\n * 快速转换配置\r\n */\r\nexport function transformConfig<T>(value: unknown, schema: ConfigSchema<T>): ConfigTransformReport<T> {\r\n const transformer = new ConfigTransformer();\r\n return transformer.transform(value, schema);\r\n}\r\n\r\n/**\r\n * 快速合并配置\r\n */\r\nexport function mergeConfig<T>(defaults: Partial<T>, overrides: Partial<T>, schema: ConfigSchema<T>): ConfigTransformReport<T> {\r\n const transformer = new ConfigTransformer();\r\n return transformer.merge(defaults, overrides, schema);\r\n}\r\n","// src/plugin-sdk.ts\r\n// @lytjs/core - 插件开发 SDK\r\n\r\nimport type { EnhancedPlugin, App } from './types';\r\nimport type { ConfigSchema, ConfigValidationReport, ConfigTransformReport } from './config-schema';\r\nimport { ConfigTransformer, transformConfig } from './config-transformer';\r\nimport { validateConfig } from './config-validator';\r\n\r\n/**\r\n * 插件配置选项\r\n */\r\nexport interface PluginConfig<TOptions = unknown> {\r\n /** 插件名称 */\r\n name: string;\r\n /** 插件版本 */\r\n version?: string;\r\n /** 插件描述 */\r\n description?: string;\r\n /** 插件作者 */\r\n author?: string;\r\n /** 关键词 */\r\n keywords?: string[];\r\n /** 插件选项 Schema */\r\n schema?: ConfigSchema<TOptions>;\r\n /** 安装函数 */\r\n install: (app: App, options: TOptions) => void | Promise<void>;\r\n}\r\n\r\n/**\r\n * 插件定义结果\r\n */\r\nexport interface PluginDefinition<TOptions = unknown> extends EnhancedPlugin<TOptions> {\r\n /** 配置验证报告 */\r\n configReport?: ConfigValidationReport;\r\n}\r\n\r\n/**\r\n * 创建插件定义\r\n * @description 提供类型安全的插件定义方式\r\n *\r\n * @example\r\n * ```typescript\r\n * const myPlugin = definePlugin({\r\n * name: 'my-plugin',\r\n * version: '1.0.0',\r\n * description: 'My awesome plugin',\r\n * schema: {\r\n * type: 'object',\r\n * properties: {\r\n * theme: { type: 'string', string: { enum: ['light', 'dark'] }, default: 'light' },\r\n * debug: { type: 'boolean', default: false },\r\n * },\r\n * },\r\n * install: (app, options) => {\r\n * console.log('Plugin installed with options:', options);\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport function definePlugin<TOptions = unknown>(config: PluginConfig<TOptions>): PluginDefinition<TOptions> {\r\n const { name, version, description, author, keywords, schema, install } = config;\r\n\r\n const plugin: PluginDefinition<TOptions> = {\r\n name,\r\n version,\r\n meta: {\r\n description,\r\n author,\r\n keywords,\r\n },\r\n configSchema: schema,\r\n install: async (app, ...options) => {\r\n const rawOptions = options[0] as TOptions | undefined;\r\n\r\n // 如果有 Schema,验证和转换配置\r\n if (schema) {\r\n const transformer = new ConfigTransformer();\r\n const report = transformer.transform(rawOptions, schema);\r\n\r\n if (!report.success) {\r\n const errors = report.errors.map((e) => `${e.path}: ${e.message}`).join(', ');\r\n throw new Error(`Plugin \"${name}\" configuration validation failed: ${errors}`);\r\n }\r\n\r\n await install(app, report.config);\r\n } else {\r\n await install(app, rawOptions as TOptions);\r\n }\r\n },\r\n };\r\n\r\n return plugin;\r\n}\r\n\r\n/**\r\n * 验证插件配置\r\n * @description 验证用户提供的配置是否符合 Schema\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = validatePluginConfig(myPlugin, { theme: 'dark', debug: true });\r\n * if (!result.valid) {\r\n * console.error(result.errors);\r\n * }\r\n * ```\r\n */\r\nexport function validatePluginConfig<TOptions>(\r\n plugin: EnhancedPlugin<TOptions>,\r\n userConfig: unknown,\r\n): ConfigValidationReport {\r\n if (!plugin.configSchema) {\r\n return { valid: true, errors: [], errorCount: 0, warningCount: 0 };\r\n }\r\n return validateConfig(userConfig, plugin.configSchema);\r\n}\r\n\r\n/**\r\n * 转换插件配置\r\n * @description 验证并转换用户配置,应用默认值\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = transformPluginConfig(myPlugin, { debug: true });\r\n * // result.config = { theme: 'light', debug: true } (theme 从 default 填充)\r\n * ```\r\n */\r\nexport function transformPluginConfig<TOptions>(\r\n plugin: EnhancedPlugin<TOptions>,\r\n userConfig: unknown,\r\n): ConfigTransformReport<TOptions> {\r\n if (!plugin.configSchema) {\r\n return {\r\n config: userConfig as TOptions,\r\n success: true,\r\n errors: [],\r\n warnings: [],\r\n transforms: [],\r\n };\r\n }\r\n return transformConfig(userConfig, plugin.configSchema);\r\n}\r\n\r\n/**\r\n * 合并插件默认配置\r\n * @description 将用户配置与插件默认配置合并\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = mergePluginConfig(myPlugin, { theme: 'dark' }, userConfig);\r\n * ```\r\n */\r\nexport function mergePluginConfig<TOptions>(\r\n plugin: EnhancedPlugin<TOptions>,\r\n defaults: Partial<TOptions>,\r\n overrides: Partial<TOptions>,\r\n): ConfigTransformReport<TOptions> {\r\n if (!plugin.configSchema) {\r\n const merged = { ...defaults, ...overrides } as TOptions;\r\n return {\r\n config: merged,\r\n success: true,\r\n errors: [],\r\n warnings: [],\r\n transforms: [],\r\n };\r\n }\r\n\r\n const transformer = new ConfigTransformer();\r\n return transformer.merge(defaults, overrides, plugin.configSchema);\r\n}\r\n\r\n/**\r\n * 创建插件测试器\r\n * @description 用于在隔离环境中测试插件\r\n */\r\nexport interface PluginTesterOptions {\r\n /** 测试用的 App 配置 */\r\n appConfig?: {\r\n performance?: boolean;\r\n globalProperties?: Record<string, unknown>;\r\n };\r\n /** 是否启用调试日志 */\r\n debug?: boolean;\r\n /** 配置验证回调 */\r\n onValidationError?: (errors: ConfigValidationReport) => void;\r\n /** 安装前回调 */\r\n onBeforeInstall?: (app: App) => void;\r\n /** 安装后回调 */\r\n onAfterInstall?: (app: App) => void;\r\n /** 清理回调 */\r\n onCleanup?: () => void;\r\n}\r\n\r\n/**\r\n * 插件测试器\r\n * @description 提供插件测试的辅助功能\r\n */\r\nexport class PluginTester {\r\n private options: Required<PluginTesterOptions>;\r\n private app: App | null = null;\r\n private installedPlugins: Set<string> = new Set();\r\n\r\n constructor(options: PluginTesterOptions = {}) {\r\n this.options = {\r\n appConfig: options.appConfig || {},\r\n debug: options.debug || false,\r\n onValidationError: options.onValidationError || (() => {}),\r\n onBeforeInstall: options.onBeforeInstall || (() => {}),\r\n onAfterInstall: options.onAfterInstall || (() => {}),\r\n onCleanup: options.onCleanup || (() => {}),\r\n };\r\n }\r\n\r\n /**\r\n * 创建测试 App\r\n */\r\n async createApp(): Promise<App> {\r\n const { createApp, h } = await import('./index');\r\n\r\n const app = createApp({\r\n render: () => h('div'),\r\n });\r\n\r\n this.app = app;\r\n return app;\r\n }\r\n\r\n /**\r\n * 安装插件进行测试\r\n */\r\n async installPlugin(plugin: EnhancedPlugin, options?: unknown): Promise<void> {\r\n if (!this.app) {\r\n await this.createApp();\r\n }\r\n\r\n // 配置验证\r\n if (plugin.configSchema) {\r\n const report = validatePluginConfig(plugin, options);\r\n if (!report.valid) {\r\n this.options.onValidationError(report);\r\n if (this.options.debug) {\r\n console.error('[PluginTester] Validation errors:', report.errors);\r\n }\r\n }\r\n }\r\n\r\n // beforeInstall 钩子\r\n this.options.onBeforeInstall(this.app!);\r\n\r\n if (this.options.debug) {\r\n console.log(`[PluginTester] Installing plugin: ${plugin.name}`);\r\n }\r\n\r\n // 安装\r\n this.app!.use(plugin, options);\r\n\r\n this.installedPlugins.add(plugin.name);\r\n\r\n // afterInstall 钩子\r\n this.options.onAfterInstall(this.app!);\r\n }\r\n\r\n /**\r\n * 卸载插件进行测试\r\n */\r\n uninstallPlugin(name: string): void {\r\n if (!this.app || !this.installedPlugins.has(name)) {\r\n return;\r\n }\r\n\r\n if (this.options.debug) {\r\n console.log(`[PluginTester] Uninstalling plugin: ${name}`);\r\n }\r\n\r\n this.app._pluginRegistry.unregister(name);\r\n this.installedPlugins.delete(name);\r\n }\r\n\r\n /**\r\n * 运行清理\r\n */\r\n cleanup(): void {\r\n if (this.app) {\r\n this.app.unmount();\r\n }\r\n this.app = null;\r\n this.installedPlugins.clear();\r\n this.options.onCleanup();\r\n }\r\n\r\n /**\r\n * 获取已安装插件列表\r\n */\r\n getInstalledPlugins(): string[] {\r\n return Array.from(this.installedPlugins);\r\n }\r\n\r\n /**\r\n * 获取 App 实例\r\n */\r\n getApp(): App | null {\r\n return this.app;\r\n }\r\n}\r\n\r\n/**\r\n * 快速创建插件测试器\r\n */\r\nexport function createPluginTester(options?: PluginTesterOptions): PluginTester {\r\n return new PluginTester(options);\r\n}\r\n\r\n/**\r\n * 测试插件安装\r\n * @description 在隔离环境中测试插件安装\r\n */\r\nexport async function testPluginInstall(\r\n plugin: EnhancedPlugin,\r\n options?: unknown,\r\n testerOptions?: PluginTesterOptions,\r\n): Promise<{ success: boolean; error?: Error; app?: App }> {\r\n const tester = createPluginTester(testerOptions);\r\n\r\n try {\r\n await tester.installPlugin(plugin, options);\r\n return { success: true, app: tester.getApp()! };\r\n } catch (err) {\r\n return { success: false, error: err instanceof Error ? err : new Error(String(err)) };\r\n } finally {\r\n tester.cleanup();\r\n }\r\n}\r\n","/**\r\n * @lytjs/core - 全局配置系统\r\n *\r\n * 提供运行时配置管理和合并功能\r\n *\r\n * @module @lytjs/core/config\r\n * @version 6.0.0\r\n */\r\n\r\nimport { deepClone } from '@lytjs/common-object';\r\nimport { hasChanged, isObject } from '@lytjs/common-is';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/**\r\n * 配置变更监听器\r\n */\r\nexport type ConfigChangeCallback<T = unknown> = (newValue: T, oldValue: T, path: string) => void;\r\n\r\n/**\r\n * 配置选项\r\n */\r\nexport interface ConfigOptions {\r\n /** 是否允许在运行时修改配置 */\r\n mutable?: boolean;\r\n /** 是否深度合并配置 */\r\n deepMerge?: boolean;\r\n /** 变更时的回调函数 */\r\n onChange?: ConfigChangeCallback;\r\n}\r\n\r\n/**\r\n * 配置对象类型\r\n */\r\nexport type ConfigValue = string | number | boolean | null | undefined | ConfigObject | ConfigArray;\r\n\r\n/**\r\n * 配置对象\r\n */\r\nexport interface ConfigObject {\r\n [key: string]: ConfigValue;\r\n}\r\n\r\n/**\r\n * 配置数组\r\n */\r\nexport type ConfigArray = ConfigValue[];\r\n\r\n// ============================================================\r\n// 配置管理器\r\n// ============================================================\r\n\r\n/**\r\n * 全局配置管理器\r\n *\r\n * 提供配置存储、合并、变更监听等功能\r\n *\r\n * @example\r\n * ```ts\r\n * // 创建配置管理器\r\n * const config = new ConfigManager({\r\n * api: { baseURL: '/api', timeout: 5000 },\r\n * theme: { primary: '#007bff' }\r\n * })\r\n *\r\n * // 获取配置\r\n * const baseURL = config.get('api.baseURL')\r\n *\r\n * // 设置配置\r\n * config.set('api.timeout', 10000)\r\n *\r\n * // 监听变更\r\n * config.watch('theme.primary', (newVal, oldVal) => {\r\n * console.log(`主题色从 ${oldVal} 变为 ${newVal}`)\r\n * })\r\n * ```\r\n */\r\nexport class ConfigManager {\r\n private config: ConfigObject = {};\r\n private options: ConfigOptions;\r\n private listeners = new Map<string, Set<ConfigChangeCallback>>();\r\n private globalListeners = new Set<ConfigChangeCallback>();\r\n\r\n constructor(initialConfig: ConfigObject = {}, options: ConfigOptions = {}) {\r\n this.options = {\r\n mutable: true,\r\n deepMerge: true,\r\n ...options,\r\n };\r\n this.config = this.options.deepMerge\r\n ? (deepClone(initialConfig) as ConfigObject)\r\n : { ...initialConfig };\r\n }\r\n\r\n /**\r\n * 获取配置值\r\n *\r\n * @param path - 配置路径(支持点号分隔,如 'api.baseURL')\r\n * @param defaultValue - 默认值\r\n * @returns 配置值或默认值\r\n *\r\n * @example\r\n * ```ts\r\n * config.get('api.baseURL') // '/api'\r\n * config.get('api.timeout', 5000) // 5000 (如果不存在)\r\n * config.get('theme.colors.primary') // 嵌套值\r\n * ```\r\n */\r\n get<T = ConfigValue>(path: string, defaultValue?: T): T | undefined {\r\n const keys = path.split('.');\r\n let value: ConfigValue | undefined = this.config;\r\n\r\n for (const key of keys) {\r\n if (isObject(value) && key in value) {\r\n value = (value as ConfigObject)[key];\r\n } else {\r\n return defaultValue;\r\n }\r\n }\r\n\r\n return value as T;\r\n }\r\n\r\n /**\r\n * 设置配置值\r\n *\r\n * @param path - 配置路径\r\n * @param value - 新值\r\n * @returns 是否设置成功\r\n *\r\n * @example\r\n * ```ts\r\n * config.set('api.timeout', 10000)\r\n * config.set('theme.colors.primary', '#ff0000')\r\n * ```\r\n */\r\n set<T = ConfigValue>(path: string, value: T): boolean {\r\n if (!this.options.mutable) {\r\n console.warn('[ConfigManager] Configuration is immutable');\r\n return false;\r\n }\r\n\r\n const keys = path.split('.');\r\n const lastKey = keys.pop()!;\r\n let target: ConfigObject = this.config;\r\n\r\n // 遍历路径创建嵌套对象\r\n for (const key of keys) {\r\n if (!isObject(target[key])) {\r\n target[key] = {};\r\n }\r\n target = target[key] as ConfigObject;\r\n }\r\n\r\n const oldValue = target[lastKey] as T;\r\n\r\n // 检查值是否变化\r\n if (!hasChanged(value, oldValue)) {\r\n return false;\r\n }\r\n\r\n // FIX: P1-10 在修改值之前,收集所有父路径的旧值快照\r\n const parentOldValues = new Map<string, unknown>();\r\n const parentParts = path.split('.');\r\n while (parentParts.length > 1) {\r\n parentParts.pop();\r\n const parentPath = parentParts.join('.');\r\n const parentVal = this.get(parentPath);\r\n parentOldValues.set(\r\n parentPath,\r\n parentVal !== null && typeof parentVal === 'object' ? deepClone(parentVal) : parentVal,\r\n );\r\n }\r\n\r\n // 设置新值\r\n target[lastKey] = value as ConfigValue;\r\n\r\n // 触发监听器\r\n this.notify(path, value, oldValue, parentOldValues);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * 批量设置配置\r\n *\r\n * @param config - 配置对象\r\n * @param merge - 是否合并(true)或替换(false)\r\n *\r\n * @example\r\n * ```ts\r\n * config.setMultiple({\r\n * 'api.timeout': 10000,\r\n * 'theme.primary': '#ff0000'\r\n * })\r\n * ```\r\n */\r\n setMultiple(config: Record<string, ConfigValue>, merge = true): void {\r\n if (!this.options.mutable) {\r\n console.warn('[ConfigManager] Configuration is immutable');\r\n return;\r\n }\r\n\r\n if (!merge) {\r\n this.config = {};\r\n }\r\n\r\n Object.entries(config).forEach(([path, value]) => {\r\n this.set(path, value);\r\n });\r\n }\r\n\r\n /**\r\n * 检查配置是否存在\r\n *\r\n * @param path - 配置路径\r\n * @returns 是否存在\r\n */\r\n has(path: string): boolean {\r\n const keys = path.split('.');\r\n let value: ConfigValue | undefined = this.config;\r\n\r\n for (const key of keys) {\r\n if (isObject(value) && key in value) {\r\n value = (value as ConfigObject)[key];\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * 删除配置\r\n *\r\n * @param path - 配置路径\r\n * @returns 是否删除成功\r\n */\r\n delete(path: string): boolean {\r\n if (!this.options.mutable) {\r\n console.warn('[ConfigManager] Configuration is immutable');\r\n return false;\r\n }\r\n\r\n const keys = path.split('.');\r\n const lastKey = keys.pop()!;\r\n let target: ConfigValue | undefined = this.config;\r\n\r\n for (const key of keys) {\r\n if (isObject(target) && key in target) {\r\n target = (target as ConfigObject)[key];\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n if (isObject(target) && lastKey in target) {\r\n const oldValue = (target as ConfigObject)[lastKey];\r\n delete (target as ConfigObject)[lastKey];\r\n this.notify(path, undefined, oldValue);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 合并配置\r\n *\r\n * @param config - 要合并的配置\r\n * @param deep - 是否深度合并\r\n *\r\n * @example\r\n * ```ts\r\n * config.merge({\r\n * api: { timeout: 10000 },\r\n * newKey: 'value'\r\n * })\r\n * ```\r\n */\r\n merge(config: ConfigObject, deep = true): void {\r\n if (!this.options.mutable) {\r\n console.warn('[ConfigManager] Configuration is immutable');\r\n return;\r\n }\r\n\r\n // FIX: P2-v11-08 merge() 合并后遍历合并的键通知路径特定监听器,\r\n // 确保通过 merge() 修改的配置项也能触发对应的 watch 回调\r\n const mergedKeys: string[] = [];\r\n\r\n if (deep) {\r\n this.deepMergeNotify(this.config, config, '', mergedKeys);\r\n } else {\r\n for (const key of Object.keys(config)) {\r\n const oldValue = this.config[key];\r\n this.config[key] = config[key];\r\n if (hasChanged(this.config[key], oldValue)) {\r\n this.notify(key, this.config[key], oldValue);\r\n mergedKeys.push(key);\r\n }\r\n }\r\n }\r\n\r\n // 触发全局监听器\r\n this.globalListeners.forEach((cb) => cb(this.config, this.config, ''));\r\n }\r\n\r\n /**\r\n * 深度合并对象,并在值变更时通知监听器\r\n * FIX: P2-v11-08 替代原 deepMerge,在合并过程中收集变更的键并通知监听器\r\n */\r\n private deepMergeNotify(\r\n target: ConfigObject,\r\n source: ConfigObject,\r\n prefix: string,\r\n mergedKeys: string[],\r\n ): void {\r\n Object.entries(source).forEach(([key, value]) => {\r\n const fullPath = prefix ? `${prefix}.${key}` : key;\r\n if (isObject(target[key]) && isObject(value)) {\r\n this.deepMergeNotify(\r\n target[key] as ConfigObject,\r\n value as ConfigObject,\r\n fullPath,\r\n mergedKeys,\r\n );\r\n } else {\r\n const oldValue = target[key];\r\n target[key] = isObject(value) ? (deepClone(value) as ConfigValue) : value;\r\n if (hasChanged(target[key], oldValue)) {\r\n this.notify(fullPath, target[key], oldValue);\r\n mergedKeys.push(fullPath);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 获取所有配置\r\n *\r\n * @returns 配置对象的深拷贝\r\n */\r\n getAll(): ConfigObject {\r\n return deepClone(this.config) as ConfigObject;\r\n }\r\n\r\n /**\r\n * 重置配置\r\n *\r\n * @param newConfig - 新的配置对象\r\n */\r\n reset(newConfig: ConfigObject = {}): void {\r\n if (!this.options.mutable) {\r\n console.warn('[ConfigManager] Configuration is immutable');\r\n return;\r\n }\r\n\r\n const oldConfig = this.config;\r\n this.config = this.options.deepMerge\r\n ? (deepClone(newConfig) as ConfigObject)\r\n : { ...newConfig };\r\n\r\n // 触发全局监听器\r\n this.globalListeners.forEach((cb) => cb(this.config, oldConfig, ''));\r\n }\r\n\r\n /**\r\n * 清空配置\r\n */\r\n clear(): void {\r\n this.reset({});\r\n }\r\n\r\n /**\r\n * 监听配置变更\r\n *\r\n * @param path - 配置路径(空字符串表示监听所有变更)\r\n * @param callback - 变更回调\r\n * @returns 取消监听函数\r\n *\r\n * @example\r\n * ```ts\r\n * // 监听特定路径\r\n * const unwatch = config.watch('api.timeout', (newVal, oldVal) => {\r\n * console.log(`timeout 从 ${oldVal} 变为 ${newVal}`)\r\n * })\r\n *\r\n * // 监听所有变更\r\n * config.watch('', (newConfig) => {\r\n * console.log('配置已更新:', newConfig)\r\n * })\r\n * ```\r\n */\r\n watch<T = ConfigValue>(path: string, callback: ConfigChangeCallback<T>): () => void {\r\n if (path === '') {\r\n this.globalListeners.add(callback as ConfigChangeCallback);\r\n return () => {\r\n this.globalListeners.delete(callback as ConfigChangeCallback);\r\n };\r\n }\r\n\r\n if (!this.listeners.has(path)) {\r\n this.listeners.set(path, new Set());\r\n }\r\n\r\n this.listeners.get(path)!.add(callback as ConfigChangeCallback);\r\n\r\n return () => {\r\n this.listeners.get(path)?.delete(callback as ConfigChangeCallback);\r\n };\r\n }\r\n\r\n /**\r\n * 通知监听器\r\n */\r\n // FIX: P1-10 增加 parentOldValues 参数,由调用方在修改值之前收集父路径旧值快照\r\n private notify<T>(\r\n path: string,\r\n newValue: T,\r\n oldValue: T,\r\n parentOldValues?: Map<string, unknown>,\r\n ): void {\r\n // 触发特定路径监听器\r\n const specificListeners = this.listeners.get(path);\r\n if (specificListeners) {\r\n specificListeners.forEach((cb) => cb(newValue, oldValue, path));\r\n }\r\n\r\n // 触发父路径监听器\r\n // FIX: P1-10 使用调用方传入的 parentOldValues 快照,确保获取的是变更前的旧值\r\n const parts = path.split('.');\r\n while (parts.length > 1) {\r\n parts.pop();\r\n const parentPath = parts.join('.');\r\n const parentListeners = this.listeners.get(parentPath);\r\n if (parentListeners) {\r\n const parentValue = this.get(parentPath);\r\n const parentOldValue = parentOldValues?.get(parentPath);\r\n parentListeners.forEach((cb) => cb(parentValue, parentOldValue, path));\r\n }\r\n }\r\n\r\n // 触发全局变更回调\r\n if (this.options.onChange) {\r\n this.options.onChange(newValue, oldValue, path);\r\n }\r\n\r\n // 触发全局监听器\r\n this.globalListeners.forEach((cb) => cb(newValue, oldValue, path));\r\n }\r\n\r\n /**\r\n * 设置可变性\r\n *\r\n * @param mutable - 是否可变\r\n */\r\n setMutable(mutable: boolean): void {\r\n this.options.mutable = mutable;\r\n }\r\n\r\n /**\r\n * 检查是否可变\r\n * FIX: P2-v11-09 简化 isMutable():mutable 在构造函数中已设置默认值为 true,\r\n * 不可能为 undefined,因此 ?? true 是冗余的\r\n */\r\n isMutable(): boolean {\r\n return this.options.mutable ?? true;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 全局配置实例\r\n// ============================================================\r\n\r\n/**\r\n * 默认全局配置\r\n */\r\nconst defaultGlobalConfig: ConfigObject = {\r\n // 开发配置\r\n dev: {\r\n warnOnImmutable: true,\r\n logLevel: 'warn',\r\n },\r\n\r\n // 性能配置\r\n performance: {\r\n asyncComponentTimeout: 5000,\r\n keepAliveMax: 10,\r\n transitionDuration: 300,\r\n },\r\n\r\n // 编译配置\r\n compiler: {\r\n comments: false,\r\n sourceMap: true,\r\n optimize: true,\r\n },\r\n\r\n // 运行时配置\r\n runtime: {\r\n errorHandler: null,\r\n warnHandler: null,\r\n globalProperties: {},\r\n },\r\n};\r\n\r\n/**\r\n * 全局配置管理器实例\r\n */\r\nlet globalConfigManager: ConfigManager | null = null;\r\n\r\n/**\r\n * 获取全局配置管理器\r\n *\r\n * @returns 全局配置管理器实例\r\n */\r\nexport function getGlobalConfig(): ConfigManager {\r\n if (!globalConfigManager) {\r\n globalConfigManager = new ConfigManager(defaultGlobalConfig);\r\n }\r\n return globalConfigManager;\r\n}\r\n\r\n/**\r\n * 设置全局配置\r\n *\r\n * @param config - 配置对象\r\n * @param merge - 是否合并\r\n */\r\nexport function setGlobalConfig(config: ConfigObject, merge = true): void {\r\n if (merge) {\r\n getGlobalConfig().merge(config);\r\n } else {\r\n getGlobalConfig().reset(config);\r\n }\r\n}\r\n\r\n/**\r\n * 获取全局配置值\r\n *\r\n * @param path - 配置路径\r\n * @param defaultValue - 默认值\r\n */\r\nexport function getConfig<T = ConfigValue>(path: string, defaultValue?: T): T | undefined {\r\n return getGlobalConfig().get(path, defaultValue);\r\n}\r\n\r\n/**\r\n * 设置全局配置值\r\n *\r\n * @param path - 配置路径\r\n * @param value - 配置值\r\n */\r\nexport function setConfig<T = ConfigValue>(path: string, value: T): boolean {\r\n return getGlobalConfig().set(path, value);\r\n}\r\n\r\n/**\r\n * 监听全局配置变更\r\n *\r\n * @param path - 配置路径\r\n * @param callback - 变更回调\r\n */\r\nexport function watchConfig<T = ConfigValue>(\r\n path: string,\r\n callback: ConfigChangeCallback<T>,\r\n): () => void {\r\n return getGlobalConfig().watch(path, callback);\r\n}\r\n\r\n// ============================================================\r\n// 配置预设\r\n// ============================================================\r\n\r\n/**\r\n * 配置预设\r\n */\r\nexport const configPresets = {\r\n /**\r\n * 开发环境预设\r\n */\r\n development: (): ConfigObject => ({\r\n dev: {\r\n warnOnImmutable: true,\r\n logLevel: 'debug',\r\n },\r\n compiler: {\r\n comments: true,\r\n sourceMap: true,\r\n optimize: false,\r\n },\r\n }),\r\n\r\n /**\r\n * 生产环境预设\r\n */\r\n production: (): ConfigObject => ({\r\n dev: {\r\n warnOnImmutable: false,\r\n logLevel: 'error',\r\n },\r\n compiler: {\r\n comments: false,\r\n sourceMap: false,\r\n optimize: true,\r\n },\r\n }),\r\n\r\n /**\r\n * 测试环境预设\r\n */\r\n test: (): ConfigObject => ({\r\n dev: {\r\n warnOnImmutable: true,\r\n logLevel: 'silent',\r\n },\r\n performance: {\r\n asyncComponentTimeout: 1000,\r\n keepAliveMax: 5,\r\n transitionDuration: 0,\r\n },\r\n }),\r\n};\r\n\r\n/**\r\n * 应用配置预设\r\n *\r\n * @param preset - 预设名称\r\n */\r\nexport function applyConfigPreset(preset: keyof typeof configPresets): void {\r\n const config = configPresets[preset]();\r\n setGlobalConfig(config, true);\r\n}\r\n\r\n// FIX: P2-batch2-5 删除底部重复的 export 块,\r\n// 所有符号已在定义处通过 export class/function/const 直接导出\r\n","// @lytjs/core - common-integration\r\n// 框架核心与 @lytjs/common-* 子包的集成点\r\n//\r\n// 此模块提供:\r\n// 1. HTTP 客户端集成(用于 SSR 数据预取等场景)\r\n// 2. URL/Query 工具集成(用于路由解析等场景)\r\n// 3. 安全工具集成(用于 XSS 防护)\r\n// 4. 缓存工具集成(用于组件缓存等场景)\r\n\r\n// ============================================================\r\n// 类型导入(避免运行时依赖)\r\n// ============================================================\r\n\r\n/**\r\n * HTTP 客户端类型(来自 @lytjs/common-http)\r\n *\r\n * 用途:\r\n * - SSR 数据预取\r\n * - API 请求封装\r\n * - 请求拦截和错误处理\r\n */\r\nexport interface HttpClientLike {\r\n get<T = unknown>(url: string, options?: unknown): Promise<T>;\r\n post<T = unknown>(url: string, data?: unknown, options?: unknown): Promise<T>;\r\n put<T = unknown>(url: string, data?: unknown, options?: unknown): Promise<T>;\r\n delete<T = unknown>(url: string, options?: unknown): Promise<T>;\r\n interceptors: {\r\n request: { use: (fn: unknown) => number };\r\n response: { use: (fn: unknown) => number };\r\n };\r\n}\r\n\r\n/**\r\n * URL 查询工具类型(来自 @lytjs/common-query)\r\n *\r\n * 用途:\r\n * - 路由参数解析\r\n * - URL 构建\r\n * - 查询字符串处理\r\n */\r\nexport interface QueryUtilsLike {\r\n parseQueryString(str: string): Record<string, string>;\r\n stringifyQueryString(obj: Record<string, unknown>): string;\r\n parseURL(url: string): {\r\n protocol: string;\r\n host: string;\r\n pathname: string;\r\n search: string;\r\n hash: string;\r\n };\r\n buildURL(base: string, params?: Record<string, unknown>): string;\r\n}\r\n\r\n/**\r\n * 安全工具类型(来自 @lytjs/common-security)\r\n *\r\n * 用途:\r\n * - XSS 防护\r\n * - HTML 转义\r\n * - 安全的动态内容处理\r\n */\r\nexport interface SecurityUtilsLike {\r\n escapeHtml(str: string): string;\r\n escapeAttr(str: string): string;\r\n sanitizeHtml(html: string, options?: unknown): string;\r\n}\r\n\r\n/**\r\n * 缓存工具类型(来自 @lytjs/common-cache)\r\n *\r\n * 用途:\r\n * - 组件实例缓存\r\n * - 计算结果缓存\r\n * - Keep-alive 实现\r\n */\r\nexport interface CacheUtilsLike {\r\n createLRUCache<K, V>(\r\n maxSize: number,\r\n ): {\r\n get(key: K): V | undefined;\r\n set(key: K, value: V): void;\r\n has(key: K): boolean;\r\n delete(key: K): boolean;\r\n clear(): void;\r\n size: number;\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 集成点注册\r\n// ============================================================\r\n\r\n/**\r\n * 框架核心集成点\r\n *\r\n * 允许外部模块(如路由、状态管理)注册其工具实现,\r\n * 使框架核心可以使用这些功能而无需直接依赖。\r\n */\r\nexport interface CoreIntegrations {\r\n http?: HttpClientLike;\r\n query?: QueryUtilsLike;\r\n security?: SecurityUtilsLike;\r\n cache?: CacheUtilsLike;\r\n}\r\n\r\n/**\r\n * 集成点作用域,与 App 实例关联。\r\n * 每个集成点作用域维护独立的集成配置,\r\n * 支持多 App 实例场景下各实例拥有不同的集成配置。\r\n */\r\nexport class IntegrationScope {\r\n private _integrations: CoreIntegrations = {};\r\n\r\n register(integrations: CoreIntegrations): void {\r\n this._integrations = { ...this._integrations, ...integrations };\r\n }\r\n\r\n unregister(...keys: (keyof CoreIntegrations)[]): void {\r\n for (const key of keys) {\r\n delete this._integrations[key];\r\n }\r\n }\r\n\r\n reset(): void {\r\n this._integrations = {};\r\n }\r\n\r\n get integrations(): CoreIntegrations {\r\n return this._integrations;\r\n }\r\n\r\n getHttpClient(): HttpClientLike | undefined {\r\n return this._integrations.http;\r\n }\r\n\r\n getQueryUtils(): QueryUtilsLike | undefined {\r\n return this._integrations.query;\r\n }\r\n\r\n getSecurityUtils(): SecurityUtilsLike | undefined {\r\n return this._integrations.security;\r\n }\r\n\r\n getCacheUtils(): CacheUtilsLike | undefined {\r\n return this._integrations.cache;\r\n }\r\n}\r\n\r\n// 全局集成点存储(向后兼容)\r\nlet _integrations: CoreIntegrations = {};\r\n\r\n/**\r\n * 注册集成点(全局,向后兼容)\r\n */\r\nexport function registerIntegrations(integrations: CoreIntegrations): void {\r\n _integrations = { ..._integrations, ...integrations };\r\n}\r\n\r\n/**\r\n * 重置全局集成点\r\n */\r\nexport function resetIntegrations(): void {\r\n _integrations = {};\r\n}\r\n\r\n/**\r\n * 获取 HTTP 客户端\r\n */\r\nexport function getHttpClient(): HttpClientLike | undefined {\r\n return _integrations.http;\r\n}\r\n\r\n/**\r\n * 获取查询工具\r\n */\r\nexport function getQueryUtils(): QueryUtilsLike | undefined {\r\n return _integrations.query;\r\n}\r\n\r\n/**\r\n * 获取安全工具\r\n */\r\nexport function getSecurityUtils(): SecurityUtilsLike | undefined {\r\n return _integrations.security;\r\n}\r\n\r\n/**\r\n * 获取缓存工具\r\n */\r\nexport function getCacheUtils(): CacheUtilsLike | undefined {\r\n return _integrations.cache;\r\n}\r\n\r\n// ============================================================\r\n// 便捷方法\r\n// ============================================================\r\n\r\n/**\r\n * 安全转义 HTML(如果有安全工具则使用,否则使用基础实现)\r\n */\r\nexport function safeEscapeHtml(str: string): string {\r\n const security = getSecurityUtils();\r\n if (security) {\r\n return security.escapeHtml(str);\r\n }\r\n // 基础实现\r\n // FIX: P2-batch1-10 添加反斜杠转义,防止 XSS 攻击\r\n return str\r\n .replace(/\\\\/g, '&#92;')\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#39;');\r\n}\r\n\r\n/**\r\n * 解析查询字符串(如果有查询工具则使用,否则使用基础实现)\r\n */\r\nexport function safeParseQueryString(str: string): Record<string, string> {\r\n const query = getQueryUtils();\r\n if (query) {\r\n return query.parseQueryString(str);\r\n }\r\n // 基础实现\r\n const result: Record<string, string> = {};\r\n if (!str) return result;\r\n const searchParams = new URLSearchParams(str.startsWith('?') ? str.slice(1) : str);\r\n for (const [key, value] of searchParams) {\r\n result[key] = value;\r\n }\r\n return result;\r\n}\r\n","/**\r\n * @lytjs/core - 错误边界组件\r\n *\r\n * 提供强大的错误处理和恢复机制\r\n */\r\n\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { createVNode } from '@lytjs/vdom';\r\n\r\n/** 错误信息 */\r\nexport interface ErrorInfo {\r\n componentStack?: string;\r\n timestamp: Date;\r\n}\r\n\r\n/** 降级组件属性 */\r\nexport interface FallbackProps {\r\n error: Error;\r\n errorInfo: ErrorInfo;\r\n reset: () => void;\r\n retry: () => void;\r\n retryCount: number;\r\n maxRetries: number;\r\n hasRetries: boolean;\r\n}\r\n\r\n/** 错误边界属性 */\r\nexport interface ErrorBoundaryProps {\r\n fallback?: any;\r\n fallbackRender?: (error: Error, errorInfo: ErrorInfo, reset: () => void) => VNode;\r\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\r\n maxRetries?: number;\r\n retryDelay?: number;\r\n onRetry?: (retryCount: number) => void;\r\n onMaxRetriesReached?: (error: Error) => void;\r\n}\r\n\r\n/** 错误报告上下文 */\r\nexport interface ErrorContext {\r\n componentName?: string;\r\n props?: Record<string, unknown>;\r\n state?: Record<string, unknown>;\r\n url?: string;\r\n userAgent?: string;\r\n timestamp: Date;\r\n}\r\n\r\n/** 错误报告器接口 */\r\nexport interface ErrorReporter {\r\n report(error: Error, context: ErrorContext): void;\r\n}\r\n\r\n/** 错误日志 */\r\nexport interface ErrorLog {\r\n id: string;\r\n timestamp: Date;\r\n error: Error;\r\n errorInfo: ErrorInfo;\r\n context: ErrorContext;\r\n retryCount: number;\r\n}\r\n\r\n/** 默认错误报告器 - 控制台输出 */\r\nclass ConsoleErrorReporter implements ErrorReporter {\r\n report(error: Error, context: ErrorContext): void {\r\n console.error('[LytJS ErrorBoundary]', {\r\n message: error.message,\r\n stack: error.stack,\r\n context: context,\r\n });\r\n }\r\n}\r\n\r\n/** 全局错误报告器 */\r\nlet globalReporter: ErrorReporter = new ConsoleErrorReporter();\r\n\r\n/** 设置全局错误报告器 */\r\nexport function setGlobalErrorReporter(reporter: ErrorReporter): void {\r\n globalReporter = reporter;\r\n}\r\n\r\n/** 获取全局错误报告器 */\r\nexport function getGlobalErrorReporter(): ErrorReporter {\r\n return globalReporter;\r\n}\r\n\r\n/** 错误日志管理器 */\r\nclass ErrorLogManager {\r\n private logs: ErrorLog[] = [];\r\n private maxLogs: number = 100;\r\n\r\n addLog(log: ErrorLog): void {\r\n this.logs.unshift(log);\r\n if (this.logs.length > this.maxLogs) {\r\n this.logs = this.logs.slice(0, this.maxLogs);\r\n }\r\n }\r\n\r\n getLogs(): ErrorLog[] {\r\n return [...this.logs];\r\n }\r\n\r\n clearLogs(): void {\r\n this.logs = [];\r\n }\r\n\r\n exportLogs(): string {\r\n return JSON.stringify(this.logs, null, 2);\r\n }\r\n\r\n getLogById(id: string): ErrorLog | undefined {\r\n return this.logs.find(log => log.id === id);\r\n }\r\n\r\n getLogsByErrorType(errorType: string): ErrorLog[] {\r\n return this.logs.filter(log => log.error.name === errorType);\r\n }\r\n\r\n getLogsByDateRange(start: Date, end: Date): ErrorLog[] {\r\n return this.logs.filter(log => log.timestamp >= start && log.timestamp <= end);\r\n }\r\n\r\n getErrorStats(): {\r\n totalErrors: number;\r\n errorTypes: Record<string, number>;\r\n recentErrors: ErrorLog[];\r\n } {\r\n const errorTypes: Record<string, number> = {};\r\n this.logs.forEach(log => {\r\n const type = log.error.name || 'Unknown';\r\n errorTypes[type] = (errorTypes[type] || 0) + 1;\r\n });\r\n\r\n return {\r\n totalErrors: this.logs.length,\r\n errorTypes,\r\n recentErrors: this.logs.slice(0, 10),\r\n };\r\n }\r\n}\r\n\r\n/** 全局错误日志管理器实例 */\r\nexport const errorLogManager = new ErrorLogManager();\r\n\r\n/** 生成唯一 ID */\r\nexport function generateErrorId(): string {\r\n return `err_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n}\r\n\r\n/** 创建 VNode 的辅助函数 */\r\nfunction createElement(type: any, props: any, ...children: any[]): VNode {\r\n return createVNode(type, props, children);\r\n}\r\n\r\n/** 默认错误降级组件 */\r\nfunction DefaultErrorFallback(props: FallbackProps): VNode {\r\n return createElement('div', {\r\n class: 'error-boundary-fallback',\r\n style: 'padding: 20px; background: #fee; border: 1px solid #fcc; border-radius: 8px;',\r\n }, [\r\n createElement('h3', { style: 'color: #c00; margin-bottom: 10px;' }, '出错了'),\r\n createElement('p', { style: 'color: #666; margin-bottom: 10px;' }, props.error.message),\r\n createElement('div', { style: 'display: flex; gap: 10px; margin-top: 10px;' }, [\r\n props.hasRetries && createElement('button', {\r\n style: 'padding: 8px 16px; background: #667eea; color: white; border: none; border-radius: 4px; cursor: pointer;',\r\n onClick: () => props.retry(),\r\n }, `重试 (${props.retryCount}/${props.maxRetries})`),\r\n createElement('button', {\r\n style: 'padding: 8px 16px; background: #6c757d; color: white; border: none; border-radius: 4px; cursor: pointer;',\r\n onClick: () => props.reset(),\r\n }, '重置'),\r\n ]),\r\n props.retryCount > 0 && createElement('p', { style: 'color: #999; font-size: 0.9em; margin-top: 10px;' },\r\n `已重试 ${props.retryCount} 次`\r\n ),\r\n ]);\r\n}\r\n\r\n/** 错误边界组件状态 */\r\ninterface ErrorBoundaryState {\r\n error: Error | null;\r\n errorInfo: ErrorInfo | null;\r\n retryCount: number;\r\n resetKey: number;\r\n isRetrying: boolean;\r\n}\r\n\r\n/** 错误边界组件实现 */\r\nexport function ErrorBoundary(props: ErrorBoundaryProps): VNode {\r\n const maxRetries = props.maxRetries ?? 3;\r\n const retryDelay = props.retryDelay ?? 1000;\r\n\r\n const state: ErrorBoundaryState = {\r\n error: null,\r\n errorInfo: null,\r\n retryCount: 0,\r\n resetKey: 0,\r\n isRetrying: false,\r\n };\r\n\r\n const reset = () => {\r\n state.error = null;\r\n state.errorInfo = null;\r\n state.retryCount = 0;\r\n state.isRetrying = false;\r\n state.resetKey++;\r\n };\r\n\r\n const retry = () => {\r\n if (state.retryCount < maxRetries) {\r\n state.isRetrying = true;\r\n\r\n if (props.onRetry) {\r\n props.onRetry(state.retryCount + 1);\r\n }\r\n\r\n setTimeout(() => {\r\n reset();\r\n }, retryDelay);\r\n } else {\r\n if (props.onMaxRetriesReached && state.error) {\r\n props.onMaxRetriesReached(state.error);\r\n }\r\n }\r\n };\r\n\r\n const getFallback = (): VNode => {\r\n const hasRetries = state.retryCount < maxRetries;\r\n\r\n if (props.fallback) {\r\n return createElement(props.fallback, {\r\n error: state.error!,\r\n errorInfo: state.errorInfo!,\r\n reset,\r\n retry,\r\n retryCount: state.retryCount,\r\n maxRetries,\r\n hasRetries,\r\n } as FallbackProps);\r\n }\r\n\r\n if (props.fallbackRender) {\r\n return props.fallbackRender(state.error!, state.errorInfo!, reset);\r\n }\r\n\r\n return DefaultErrorFallback({\r\n error: state.error!,\r\n errorInfo: state.errorInfo!,\r\n reset,\r\n retry,\r\n retryCount: state.retryCount,\r\n maxRetries,\r\n hasRetries,\r\n });\r\n };\r\n\r\n if (state.error) {\r\n return createElement('error-boundary-wrapper', { 'data-error': 'true', key: `reset-${state.resetKey}` }, [\r\n getFallback(),\r\n ]);\r\n }\r\n\r\n return createElement('error-boundary-wrapper', {\r\n 'data-error': 'false',\r\n key: `reset-${state.resetKey}`,\r\n }, null);\r\n}\r\n\r\n/** 错误边界钩子 - 用于手动触发错误 */\r\nexport function useErrorHandler(): (error: Error) => void {\r\n return (error: Error) => {\r\n throw error;\r\n };\r\n}\r\n\r\n/** 错误边界重置钩子 */\r\nexport function useErrorBoundaryReset(): () => void {\r\n return () => {\r\n console.warn('useErrorBoundaryReset should be used within ErrorBoundary');\r\n };\r\n}\r\n\r\n/** 导出默认 ErrorBoundary 组件 */\r\nexport default ErrorBoundary;\r\n","// src/index.ts\r\n// @lytjs/core - 核心入口\r\n\r\nexport { createApp } from './create-app';\r\nexport { h, h as createElement } from './h';\r\nexport { defineComponent, defineAsyncComponent } from './define-component';\r\nexport { nextTick } from './next-tick';\r\nexport { resolveComponent, resolveDirective, resolveDynamicComponent } from './resolve';\r\nexport { withDirectives, withMemo } from './directives';\r\nexport {\r\n useSlots,\r\n useAttrs,\r\n useModel,\r\n useTemplateRef,\r\n defineModel,\r\n useId,\r\n useCssModule,\r\n useCssVars,\r\n} from './composition';\r\nexport {\r\n defineCustomElement,\r\n useShadowRoot,\r\n useHost,\r\n useWebComponentSlots,\r\n injectChildStyles,\r\n} from './web-component';\r\nexport type { DefineCustomElementOptions } from './web-component';\r\nexport {\r\n onMounted,\r\n onUnmounted,\r\n onUpdated,\r\n onBeforeMount,\r\n onBeforeUnmount,\r\n onBeforeUpdate,\r\n onErrorCaptured,\r\n onRenderTracked,\r\n onRenderTriggered,\r\n // FIX: P2-batch2-6 补充导出 onActivated/onDeactivated 生命周期钩子\r\n onActivated,\r\n onDeactivated,\r\n} from './lifecycle';\r\n\r\n// 插件系统增强\r\nexport { PluginRegistry } from './plugin-registry';\r\nexport { PluginValidator } from './plugin-validator';\r\nexport type {\r\n ValidationReport,\r\n ValidationIssue,\r\n} from './plugin-validator';\r\n\r\n// 配置 Schema 系统\r\nexport { ConfigValidator, validateConfig } from './config-validator';\r\nexport { ConfigTransformer, transformConfig, mergeConfig } from './config-transformer';\r\nexport type {\r\n ConfigSchema,\r\n SchemaType,\r\n StringSchema,\r\n NumberSchema,\r\n BooleanSchema,\r\n ObjectSchema,\r\n ArraySchema,\r\n EnumSchema,\r\n UnionSchema,\r\n StringFormat,\r\n ConfigValidationReport,\r\n ConfigValidationError,\r\n ValidationErrorCode,\r\n ConfigTransformReport,\r\n ValidationContext,\r\n ValidationResult,\r\n} from './config-schema';\r\n\r\n// Plugin SDK\r\nexport {\r\n definePlugin,\r\n validatePluginConfig,\r\n transformPluginConfig,\r\n mergePluginConfig,\r\n createPluginTester,\r\n testPluginInstall,\r\n} from './plugin-sdk';\r\nexport type {\r\n PluginConfig,\r\n PluginDefinition,\r\n PluginTesterOptions,\r\n PluginTester,\r\n} from './plugin-sdk';\r\n\r\n// 全局配置系统\r\nexport {\r\n ConfigManager,\r\n getGlobalConfig,\r\n setGlobalConfig,\r\n getConfig,\r\n setConfig,\r\n watchConfig,\r\n configPresets,\r\n applyConfigPreset,\r\n} from './config';\r\nexport type {\r\n ConfigChangeCallback,\r\n ConfigOptions,\r\n ConfigValue,\r\n ConfigObject,\r\n ConfigArray,\r\n} from './config';\r\n\r\n// Re-export from sub-packages\r\nexport { ref, reactive, computed, watch, watchEffect, effect } from '@lytjs/reactivity';\r\nexport { createVNode, Fragment, Text, Comment, cloneVNode, mergeProps } from '@lytjs/vdom';\r\nexport { compile } from '@lytjs/compiler';\r\n\r\nexport type {\r\n App,\r\n AppConfig,\r\n AppOptions,\r\n Plugin,\r\n PluginInstallFunction,\r\n PluginWithCleanup,\r\n PluginFunctionWithCleanup,\r\n EnhancedPlugin,\r\n PluginMeta,\r\n PluginDependency,\r\n RegisteredPlugin,\r\n RegistrationResult,\r\n DependencyResult,\r\n PluginLifecycleEvent,\r\n PluginEventListener,\r\n Component,\r\n ComponentOptions,\r\n VNode,\r\n VNodeChildren,\r\n Renderer,\r\n Directive,\r\n DirectiveBinding,\r\n DirectiveArguments,\r\n AsyncComponentLoader,\r\n AsyncComponentOptions,\r\n ErrorCapturedHook,\r\n DebuggerHook,\r\n DebuggerEvent,\r\n ComponentPublicInstance,\r\n} from './types';\r\n\r\n// Common 子包集成点\r\nexport {\r\n registerIntegrations,\r\n getHttpClient,\r\n getQueryUtils,\r\n getSecurityUtils,\r\n getCacheUtils,\r\n safeEscapeHtml,\r\n safeParseQueryString,\r\n} from './common-integration';\r\nexport type {\r\n HttpClientLike,\r\n QueryUtilsLike,\r\n SecurityUtilsLike,\r\n CacheUtilsLike,\r\n CoreIntegrations,\r\n} from './common-integration';\r\n\r\n// 错误边界系统(v6.3 新增)\r\nexport {\r\n ErrorBoundary,\r\n useErrorHandler,\r\n useErrorBoundaryReset,\r\n setGlobalErrorReporter,\r\n getGlobalErrorReporter,\r\n errorLogManager,\r\n} from './error-boundary';\r\nexport type {\r\n ErrorBoundaryProps,\r\n FallbackProps,\r\n ErrorInfo,\r\n ErrorReporter,\r\n ErrorContext,\r\n ErrorLog,\r\n} from './error-boundary';\r\n"]}