@lytjs/component 6.7.0 → 6.8.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.
- package/dist/index.cjs +76 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +841 -0
- package/dist/index.d.ts +841 -0
- package/dist/index.mjs +73 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/props.ts","../src/lifecycle.ts","../src/emit.ts","../src/slots.ts","../src/component-options.ts","../src/component-proxy.ts","../src/component-init.ts","../src/component-setup.ts","../src/component-inject.ts","../src/keep-alive.ts","../src/suspense.ts","../src/transition.ts","../src/transition-group.ts","../src/teleport.ts","../src/error-boundary.ts","../src/signal-state.ts","../src/async-component.ts","../src/di/index.ts"],"names":["EMPTY_OBJ","isArray","result","hasOwn","isFunction","isString","isNumber","isBoolean","isObject","kebabToCamel","isNullish","globalProperties","nextTick","reactive","computed","watch","NOOP","isPromise","createCommentVNode","ShapeFlags","createVNode","registerSuspenseLinker","createBaseVNode","error","ref","Fragment","Text","signal","computedSignal","effectScope","provide","inject"],"mappings":"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","file":"index.cjs","sourcesContent":["// src/props.ts\n// Props 处理 - 验证、规范化、默认值\n\nimport {\n isString,\n isNumber,\n isBoolean,\n isObject,\n isArray,\n isFunction,\n hasOwn,\n EMPTY_OBJ,\n} from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport type { PropOptions } from './types';\nimport type { ComponentInternalInstance } from './types';\n\n/**\n * 将 props 定义规范化为统一的 Record<string, PropOptions> 格式。\n * 处理数组形式的 props(如 ['a', 'b'])和对象形式的 props。\n */\nexport function normalizePropsOptions(\n rawProps?: Record<string, PropOptions> | string[],\n): Record<string, PropOptions> {\n if (!rawProps) return EMPTY_OBJ as Record<string, PropOptions>;\n\n if (isArray(rawProps)) {\n // 数组形式:['foo', 'bar'] => { foo: {}, bar: {} }\n const result: Record<string, PropOptions> = {};\n for (let i = 0; i < rawProps.length; i++) {\n const key = rawProps[i]!;\n result[key] = {};\n }\n return result;\n }\n\n // 对象形式:规范化每个条目\n const result: Record<string, PropOptions> = {};\n for (const key in rawProps) {\n if (hasOwn(rawProps, key)) {\n const value = rawProps[key]!;\n result[key] = (isFunction(value) || isArray(value) ? { type: value } : value) as PropOptions;\n }\n }\n return result;\n}\n\n/**\n * 解析 prop 值,处理默认值和类型检查。\n * 处理缺失 prop 的布尔类型转换。\n */\nexport function resolvePropValue<T = unknown>(\n propOptions: PropOptions,\n value: unknown,\n _instance?: ComponentInternalInstance,\n key?: string,\n): T | undefined {\n const { type, default: defaultValue, required, validator } = propOptions;\n\n // 如果值缺失(undefined)且有默认值,使用默认值\n if (value === undefined) {\n // FIX: P1-10 先检查 defaultValue,再处理 Boolean 类型\n // 如果存在默认值,优先使用默认值(包括 Boolean 类型的 default: true)\n if (defaultValue !== undefined) {\n let def: unknown;\n if (isFunction(defaultValue)) {\n try {\n def = defaultValue();\n } catch (e) {\n if (__DEV__) {\n warn(`Failed to resolve default value for prop \"${key}\": ${(e as Error).message}`);\n }\n def = undefined;\n }\n } else {\n def = defaultValue;\n }\n return def as T | undefined;\n }\n // 布尔类型转换:如果类型为 Boolean 且无默认值,默认为 false\n // 类型断言 `Boolean as unknown` 是必要的,因为 PropOptions.type 的类型\n // 为 Constructor | Constructor[],而 Boolean 构造函数需要通过 unknown 中间\n // 类型才能与数组元素类型兼容\n if (type === Boolean || (isArray(type) && type.includes(Boolean as unknown))) {\n return false as T | undefined;\n }\n // 检查必填 prop\n if (required && __DEV__) {\n warn(`Missing required prop: \"${key}\"`);\n }\n return undefined;\n }\n\n // 类型验证\n if (type !== undefined && __DEV__) {\n validateType(value, type, key);\n }\n\n // 自定义验证器\n if (validator && __DEV__) {\n if (!validator(value)) {\n warn(\n `Prop validation failed for prop \"${key}\": received ${(() => {\n try {\n return JSON.stringify(value);\n } catch {\n return '[object Object]';\n }\n })()}`,\n );\n }\n }\n\n return value as T | undefined;\n}\n\n/**\n * 根据类型或类型数组验证值。\n */\nexport function validateType(value: unknown, type: unknown, key?: string): boolean {\n if (type === null || type === undefined) return true;\n\n let expectedType: string;\n const actualType = getTypeName(value);\n\n if (isArray(type)) {\n // 类型数组 - 值必须至少匹配其中一个\n for (let i = 0; i < type.length; i++) {\n // type[i] 的静态类型为 unknown,需要断言为 PropTypeConstructor 以调用 checkType\n if (checkType(value, type[i]! as PropTypeConstructor)) return true;\n }\n expectedType = type.map((t) => getTypeName(t)).join(' | ');\n } else {\n if (checkType(value, type as PropTypeConstructor)) return true;\n expectedType = getTypeName(type);\n }\n\n if (__DEV__) {\n const keyInfo = key ? ` \"${key}\"` : '';\n warn(\n `Invalid prop${keyInfo}: expected type ${expectedType}, got ${actualType}.` +\n (value !== null && value !== undefined\n ? ` (value: ${(() => {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n })()})`\n : ''),\n );\n }\n\n return false;\n}\n\n/** Prop 类型构造器 */\ntype PropTypeConstructor = (new (...args: unknown[]) => unknown) | { (): unknown };\n\nfunction checkType(value: unknown, type: PropTypeConstructor | PropTypeConstructor[]): boolean {\n if (type === String) return isString(value);\n if (type === Number) return isNumber(value);\n if (type === Boolean) return isBoolean(value);\n if (type === Object) return isObject(value) && !isArray(value);\n if (type === Array) return isArray(value);\n if (type === Function) return isFunction(value);\n return false;\n}\n\nfunction getTypeName(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (isArray(value)) return 'Array';\n if (isString(value)) return 'String';\n if (isNumber(value)) return 'Number';\n if (isBoolean(value)) return 'Boolean';\n if (isFunction(value)) return 'Function';\n if (isObject(value)) return 'Object';\n return String(value);\n}\n","// src/lifecycle.ts\n// 生命周期钩子管理\n//\n// FIX: P2-16 生命周期钩子调用次序文档:\n// 组件生命周期钩子的调用次序如下:\n//\n// 创建阶段:\n// 1. beforeCreate(仅 Options API,setup 之前)\n// 2. setup()(Composition API)\n// 3. created(仅 Options API,setup 之后)\n//\n// 挂载阶段:\n// 4. onBeforeMount / beforeMount\n// 5. onMounted / mounted(子组件先挂载,父组件后挂载)\n//\n// 更新阶段:\n// 6. onBeforeUpdate / beforeUpdate\n// 7. onUpdated / updated(子组件先更新,父组件后更新)\n//\n// 卸载阶段:\n// 8. onBeforeUnmount / beforeUnmount(父组件先卸载,子组件后卸载)\n// 9. onUnmounted / unmounted\n//\n// 特殊钩子:\n// - errorCaptured:在子组件错误冒泡时调用(从子到父)\n// - renderTracked / renderTriggered:在渲染函数依赖追踪/触发时调用\n// - activated / deactivated:KeepAlive 组件激活/停用时调用\n\nimport type { ComponentInternalInstance, ComponentPublicInstance } from './types';\nimport { warnOnce } from '@lytjs/common-error';\nimport type { DebuggerEvent } from '@lytjs/shared-types';\n\n// 当前正在 setup 的实例(用于生命周期钩子注册)\nlet currentInstance: ComponentInternalInstance | null = null;\n\n// FIX: P1-8 COMPONENT-NEW-02 - 生命周期钩子调用顺序跟踪\n// 用于在开发模式下验证生命周期钩子调用顺序\nconst lifecycleCallOrder = new WeakMap<ComponentInternalInstance, Set<string>>();\n\n/**\n * 断言生命周期钩子调用顺序正确\n * 确保 onBeforeMount 在 onMounted 之前调用等\n */\nfunction assertLifecycleOrder(\n instance: ComponentInternalInstance,\n currentHook: string,\n requiredPrevHooks?: string[],\n): void {\n if (!__DEV__) return;\n\n let calledHooks = lifecycleCallOrder.get(instance);\n if (!calledHooks) {\n calledHooks = new Set();\n lifecycleCallOrder.set(instance, calledHooks);\n }\n\n // 检查前置钩子是否已调用\n if (requiredPrevHooks) {\n for (const requiredHook of requiredPrevHooks) {\n if (!calledHooks.has(requiredHook)) {\n warnOnce(\n `Lifecycle hook \"${currentHook}\" was called before \"${requiredHook}\". ` +\n `Expected order: ${requiredPrevHooks.join(' -> ')} -> ${currentHook}`,\n );\n }\n }\n }\n\n calledHooks.add(currentHook);\n}\n\n/**\n * 设置当前实例(在 setup 期间使用)。\n */\nexport function setCurrentInstance(instance: ComponentInternalInstance | null): void {\n currentInstance = instance;\n}\n\n/**\n * 获取当前实例。\n */\nexport function getCurrentInstance(): ComponentInternalInstance | null {\n return currentInstance;\n}\n\n/**\n * 在当前实例上注册生命周期钩子。\n */\nfunction registerLifecycleHook(\n instance: ComponentInternalInstance,\n hookName: 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeUnmount' | 'unmounted',\n fn: (...args: unknown[]) => void,\n): void {\n if (instance) {\n instance.lifecycle[hookName].add(fn);\n }\n}\n\n// ==================== 公共生命周期 API ====================\n\n/**\n * 注册组件挂载完成后调用的回调。\n */\nexport function onMounted(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'mounted', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onMounted was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册组件更新完成后调用的回调。\n */\nexport function onUpdated(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'updated', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onUpdated was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册组件卸载后调用的回调。\n */\nexport function onUnmounted(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'unmounted', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onUnmounted was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * Register a callback to be called before the component is mounted.\n */\nexport function onBeforeMount(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'beforeMount', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onBeforeMount was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册组件更新前调用的回调。\n */\nexport function onBeforeUpdate(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'beforeUpdate', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onBeforeUpdate was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册组件卸载前调用的回调。\n */\nexport function onBeforeUnmount(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'beforeUnmount', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onBeforeUnmount was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册错误捕获回调。\n * 使用数组收集每个实例的多个回调。\n */\nexport function onErrorCaptured(\n fn: (err: Error, instance: ComponentPublicInstance | null, info: string) => boolean | void,\n): void {\n if (currentInstance) {\n if (!currentInstance.errorCapturedHooks) {\n currentInstance.errorCapturedHooks = [];\n }\n currentInstance.errorCapturedHooks.push(fn);\n } else if (__DEV__) {\n // 开发模式下警告:onErrorCaptured 必须在 setup 期间调用\n warnOnce(\n 'onErrorCaptured was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册组件被 KeepAlive 激活时调用的回调。\n */\nexport function onActivated(fn: () => void): void {\n if (currentInstance) {\n if (!currentInstance.activatedHooks) {\n currentInstance.activatedHooks = [];\n }\n currentInstance.activatedHooks.push(fn);\n }\n}\n\n/**\n * 注册组件被 KeepAlive 停用时调用的回调。\n */\nexport function onDeactivated(fn: () => void): void {\n if (currentInstance) {\n if (!currentInstance.deactivatedHooks) {\n currentInstance.deactivatedHooks = [];\n }\n currentInstance.deactivatedHooks.push(fn);\n }\n}\n\n/**\n * 注册渲染期间追踪响应式依赖时调用的回调。\n * 仅在开发模式下生效。\n */\nexport function onRenderTracked(fn: (e: DebuggerEvent) => void): void {\n if (__DEV__) {\n if (currentInstance) {\n if (!currentInstance.renderTrackedHooks) {\n currentInstance.renderTrackedHooks = [];\n }\n currentInstance.renderTrackedHooks.push(fn);\n } else {\n warnOnce(\n 'onRenderTracked was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n }\n}\n\n/**\n * 注册渲染期间触发响应式依赖时调用的回调。\n * 仅在开发模式下生效。\n */\nexport function onRenderTriggered(fn: (e: DebuggerEvent) => void): void {\n if (__DEV__) {\n if (currentInstance) {\n if (!currentInstance.renderTriggeredHooks) {\n currentInstance.renderTriggeredHooks = [];\n }\n currentInstance.renderTriggeredHooks.push(fn);\n } else {\n warnOnce(\n 'onRenderTriggered was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n }\n}\n\n// ==================== 生命周期调用 ====================\n\n/**\n * 安全地调用选项式 API 生命周期钩子(带错误处理)。\n */\nfunction callOptionsHook(\n instance: ComponentInternalInstance,\n hook: ((...args: unknown[]) => void) | undefined,\n name: string,\n): void {\n if (hook) {\n try {\n hook.call(instance.ctx);\n } catch (err) {\n handleError(err as Error, instance, `${name} hook`);\n }\n }\n}\n\n/**\n * Call all registered hooks for a given lifecycle phase.\n */\nexport function callLifecycleHook(\n instance: ComponentInternalInstance,\n hookName: 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeUnmount' | 'unmounted',\n): void {\n const hooks = instance.lifecycle[hookName];\n if (hooks.size > 0) {\n for (const hook of hooks) {\n try {\n hook();\n } catch (err) {\n handleError(err as Error, instance, hookName);\n }\n }\n }\n}\n\n/**\n * 调用 beforeCreate 和 created 生命周期钩子(选项式 API)。\n */\nexport function callCreatedHook(instance: ComponentInternalInstance): void {\n const { beforeCreate, created } = instance.type;\n callOptionsHook(instance, beforeCreate, 'beforeCreate');\n callOptionsHook(instance, created, 'created');\n}\n\n/**\n * 调用 beforeMount 和 mounted 生命周期钩子(选项式 API)。\n */\nexport function callMountedHook(instance: ComponentInternalInstance): void {\n // FIX: P1-8 COMPONENT-NEW-02 - 添加生命周期调用顺序断言\n assertLifecycleOrder(instance, 'beforeMount', []);\n\n const { beforeMount, mounted } = instance.type;\n callLifecycleHook(instance, 'beforeMount');\n callOptionsHook(instance, beforeMount, 'beforeMount');\n\n // FIX: P1-8 - 确保 onBeforeMount 在 onMounted 之前调用\n assertLifecycleOrder(instance, 'mounted', ['beforeMount']);\n\n callLifecycleHook(instance, 'mounted');\n callOptionsHook(instance, mounted, 'mounted');\n instance.isMounted = true;\n}\n\n/**\n * 调用 beforeUpdate 和 updated 生命周期钩子(选项式 API)。\n */\nexport function callUpdatedHook(instance: ComponentInternalInstance): void {\n // FIX: P1-8 COMPONENT-NEW-02 - 添加生命周期调用顺序断言\n // 确保组件已挂载后才能调用更新钩子\n if (__DEV__ && !instance.isMounted) {\n warnOnce(\n `Lifecycle hook \"beforeUpdate\" was called before the component was mounted. ` +\n `Expected order: mounted -> beforeUpdate -> updated`,\n );\n }\n assertLifecycleOrder(instance, 'beforeUpdate', ['mounted']);\n\n const { beforeUpdate, updated } = instance.type;\n callLifecycleHook(instance, 'beforeUpdate');\n callOptionsHook(instance, beforeUpdate, 'beforeUpdate');\n\n // FIX: P1-8 - 确保 onBeforeUpdate 在 onUpdated 之前调用\n assertLifecycleOrder(instance, 'updated', ['beforeUpdate', 'mounted']);\n\n callLifecycleHook(instance, 'updated');\n callOptionsHook(instance, updated, 'updated');\n}\n\n/**\n * 调用 beforeUnmount 和 unmounted 生命周期钩子(选项式 API)。\n */\nexport function callUnmountedHook(instance: ComponentInternalInstance): void {\n // FIX: P1-8 COMPONENT-NEW-02 - 添加生命周期调用顺序断言\n // 确保组件已挂载后才能调用卸载钩子\n if (__DEV__ && !instance.isMounted) {\n warnOnce(\n `Lifecycle hook \"beforeUnmount\" was called before the component was mounted. ` +\n `Expected order: mounted -> beforeUnmount -> unmounted`,\n );\n }\n assertLifecycleOrder(instance, 'beforeUnmount', ['mounted']);\n\n const { beforeUnmount, unmounted } = instance.type;\n callLifecycleHook(instance, 'beforeUnmount');\n callOptionsHook(instance, beforeUnmount, 'beforeUnmount');\n\n // FIX: P1-8 - 确保 onBeforeUnmount 在 onUnmounted 之前调用\n assertLifecycleOrder(instance, 'unmounted', ['beforeUnmount', 'mounted']);\n\n callLifecycleHook(instance, 'unmounted');\n callOptionsHook(instance, unmounted, 'unmounted');\n instance.isUnmounted = true;\n}\n\n/**\n * 处理错误捕获传播。\n * 调用当前实例上所有通过 onErrorCaptured() 注册的 errorCapturedHooks(从内到外),\n * 然后传播到父组件。如果错误被处理则返回 true。\n */\nexport function handleError(\n err: Error,\n instance: ComponentInternalInstance | null,\n info: string,\n): boolean {\n let current: ComponentInternalInstance | null = instance;\n while (current) {\n // 调用当前实例上通过 onErrorCaptured() 注册的所有 errorCapturedHooks\n const hooks = current.errorCapturedHooks;\n if (hooks && hooks.length > 0) {\n for (const hook of hooks) {\n const result = hook(err, current as unknown as ComponentPublicInstance, info);\n if (result === false) return true; // 停止传播\n }\n }\n\n // 同时检查选项式 API 的 errorCaptured\n const errorHandler = current.type.errorCaptured;\n if (errorHandler) {\n const result = errorHandler.call(\n current.ctx,\n err,\n current as unknown as ComponentPublicInstance,\n info,\n );\n if (result === false) return true;\n }\n\n // 传播到父组件\n current = current.parent;\n }\n\n // 如果错误未被任何组件处理,尝试应用级 errorHandler\n if (instance) {\n const appErrorHandler = instance.root.appContext?.config?.errorHandler;\n if (typeof appErrorHandler === 'function') {\n // 传入公共实例而非内部实例,避免暴露内部实现细节\n const publicInstance = instance.ctx\n ? (instance as unknown as { ctx: ComponentPublicInstance }).ctx\n : null;\n appErrorHandler(err, publicInstance, info);\n return true;\n }\n }\n\n return false;\n}\n","// src/emit.ts\n// 事件发射系统\n\nimport { isFunction, hasOwn, isArray } from '@lytjs/common-is';\nimport { kebabToCamel } from '@lytjs/common-string';\nimport { warn } from '@lytjs/common-error';\nimport type { ComponentInternalInstance } from './types';\nimport { handleError } from './lifecycle';\n\n/**\n * Normalize emits definition into a consistent Record<string, any> format.\n */\nexport function normalizeEmitsOptions(\n emits?: string[] | Record<string, (...args: unknown[]) => unknown>,\n): Record<string, unknown> | null {\n if (!emits) return null;\n\n if (isArray(emits)) {\n // 数组形式:['click', 'change'] => { click: null, change: null }\n const result: Record<string, unknown> = {};\n for (let i = 0; i < emits.length; i++) {\n const key = emits[i]!;\n result[key] = null;\n }\n return result;\n }\n\n // 已经是对象形式(Record<string, Function | null>)\n return emits as Record<string, unknown>;\n}\n\n/**\n * 将事件名统一转换为 camelCase 形式,用于 emits 选项的声明式查找。\n * 例如: 'update:model-value' => 'update:modelValue'\n */\nfunction normalizeEventName(event: string): string {\n return kebabToCamel(event);\n}\n\n/**\n * 将事件名转换为处理器 key\n * 先将 kebab-case 转为 camelCase,再首字母大写加 on 前缀\n * 例如: 'update:model-value' => 'onUpdate:modelValue'\n */\nfunction toHandlerKey(event: string): string {\n if (!event) return '';\n const camelized = normalizeEventName(event);\n return `on${camelized[0]!.toUpperCase()}${camelized.slice(1)}`;\n}\n\n/**\n * Emit an event on a component instance.\n * Looks for `onXxx` handler in props and attrs (camelCase conversion).\n */\nexport function emit(instance: ComponentInternalInstance, event: string, ...args: unknown[]): void {\n if (instance.isUnmounted) return;\n\n if (__DEV__ && !isEmitValid(instance, event)) {\n warn(`Component emitted event \"${event}\" but it is not declared in emits.`);\n }\n\n // 规范化事件名:将 kebab-case 转为 camelCase 用于处理器查找\n const handlerName = toHandlerKey(event);\n\n // 先在 props 中查找处理器,再在 attrs 中查找\n const handler = instance.props[handlerName] ?? instance.attrs[handlerName];\n if (isFunction(handler)) {\n try {\n handler(...args);\n } catch (err) {\n handleError(err as Error, instance, `event handler for \"${event}\"`);\n }\n }\n}\n\n/**\n * 检查事件是否在 emits 选项中声明。\n * 使用与 emit() 相同的规范化(kebab-case -> camelCase)以确保\n * 一致的事件名匹配。\n */\nexport function isEmitValid(instance: ComponentInternalInstance, event: string): boolean {\n if (!instance.emitsOptions) return true;\n const normalized = normalizeEventName(event);\n return hasOwn(instance.emitsOptions, normalized) || hasOwn(instance.emitsOptions, event);\n}\n","// src/slots.ts\n// 插槽处理\n\nimport { isFunction, isArray, isObject, isNullish } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport type { VNode } from '@lytjs/common-vnode';\nimport type { ComponentInternalInstance, InternalSlots, SlotFunction } from './types';\n\n/**\n * 从 children 初始化 slots。\n * Children 可以是:\n * - 插槽函数对象(命名插槽)\n * - 单个函数(默认插槽)\n * - null/undefined(无插槽)\n *\n * FIX: P2-20 动态 slot 缓存策略:\n * slots 在初始化时被规范化并存储在 instance.slots 中。\n * 如果需要动态更新 slots(如通过 scoped slots),应通过\n * 组件更新机制触发重新初始化,而非直接修改 instance.slots。\n */\nexport function initSlots(instance: ComponentInternalInstance, children: unknown): void {\n if (isNullish(children)) {\n instance.slots = {} as InternalSlots;\n return;\n }\n\n const slots: InternalSlots = {};\n\n if (isFunction(children)) {\n // 单个函数 => 默认插槽\n slots.default = children as SlotFunction;\n } else if (isObject(children) && !isArray(children)) {\n // 插槽函数对象\n const slotObj = children as Record<string, unknown>;\n for (const key in slotObj) {\n if (isFunction(slotObj[key])) {\n slots[key] = slotObj[key] as SlotFunction;\n }\n }\n }\n\n instance.slots = slots;\n}\n\n/**\n * 将插槽返回值规范化为数组。\n * 确保插槽函数始终返回数组,以保持渲染一致性。\n */\nexport function normalizeSlotValue(value: unknown): VNode[] {\n if (isNullish(value)) return [];\n if (isArray(value)) return value as VNode[];\n // FIX: P2-13 简化检查逻辑,直接检查 __v_isVNode === true\n // 避免多余的类型检查和嵌套条件\n if ((value as VNode).__v_isVNode === true) {\n return [value as VNode];\n }\n if (__DEV__) {\n warn(\n `normalizeSlotValue: expected VNode or VNode[], got ${typeof value}. ` +\n `This may cause rendering issues.`,\n );\n }\n return [value as VNode];\n}\n","// src/component-options.ts\n// 组件选项合并、定义辅助函数和应用上下文\n\nimport { isFunction, hasOwn } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport type { ComponentOptions, ComponentPublicInstance, AppContext } from './types';\nimport type { VNode } from '@lytjs/common-vnode';\n\n// ==================== defineComponent ====================\n\n/**\n * defineComponent 是一个恒等函数,直接返回选项对象。\n * 它为组件选项提供 TypeScript 类型推断。\n */\nexport function defineComponent(options: ComponentOptions): ComponentOptions {\n return options;\n}\n\n// ==================== defineFunctionalComponent ====================\n\n/**\n * 定义函数式组件。\n * 函数式组件没有实例、没有生命周期钩子、没有响应式状态。\n * 它接收 props 并直接返回渲染函数。\n *\n * FIX: P1-22 使用精确类型替代 Record<string, any>,\n * render 参数明确为返回 VNode 的函数,props 参数使用 Record<string, unknown>\n */\nexport function defineFunctionalComponent(\n render: (props: Record<string, unknown>) => VNode | VNode[] | null,\n props?: Record<string, unknown>,\n): ComponentOptions {\n return {\n name: 'FunctionalComponent',\n props: props ?? {},\n setup(_props: Record<string, unknown>) {\n // 直接返回原始渲染函数,使 handleSetupResult\n // 将其赋值给 instance.render,让函数式组件正常工作。\n return render as unknown as () => VNode;\n },\n // 标记为函数式组件\n __isFunctional: true,\n } as ComponentOptions;\n}\n\n// ==================== mergeOptions ====================\n\n/**\n * 合并组件选项的 extends 和 mixins。\n * 使用路径跟踪提供详细的循环依赖警告,\n * 包含完整的合并链和组件名称。\n *\n * FIX: P2-37 使用 pathLength 替代 [...path] 数组复制:\n * 原实现在每次递归调用时通过 [...path] 复制整个 path 数组,\n * 在深层嵌套的 extends/mixins 链中会产生 O(n^2) 的内存开销。\n * 改为传递原始 path 引用 + 当前路径长度 pathLength,\n * 在需要构建警告信息时通过 path.slice(0, pathLength) 获取当前路径,\n * 避免不必要的数组复制。\n */\nexport function mergeOptions(\n options: ComponentOptions,\n seen = new WeakSet<ComponentOptions>(),\n path: ComponentOptions[] = [],\n pathLength: number = 0,\n): ComponentOptions {\n if (seen.has(options)) {\n if (__DEV__) {\n // 构建可读的循环路径(使用组件名称)\n const currentPath = path.slice(0, pathLength);\n const cycleStart = currentPath.indexOf(options);\n const cyclePath = currentPath\n .slice(cycleStart)\n .map((opts, i) => {\n const name =\n (opts as Record<string, unknown>).name ||\n (opts as Record<string, unknown>).__name ||\n `anonymous#${i}`;\n return String(name);\n })\n .join(' -> ');\n warn(`Circular mixin/extends detected: ${cyclePath} -> (cycle). Skipping.`);\n }\n return { ...options };\n }\n seen.add(options);\n path[pathLength] = options;\n\n let merged: ComponentOptions = { ...options };\n\n // 先应用 extends\n if (options.extends) {\n merged = mergeOptionsPair(mergeOptions(options.extends, seen, path, pathLength + 1), merged);\n }\n\n // 再应用 mixins\n if (options.mixins) {\n for (const mixin of options.mixins) {\n merged = mergeOptionsPair(merged, mergeOptions(mixin, seen, path, pathLength + 1));\n }\n }\n\n return merged;\n}\n\n/**\n * 合并两个 ComponentOptions 对象。\n */\nfunction mergeOptionsPair(parent: ComponentOptions, child: ComponentOptions): ComponentOptions {\n // 使用 Record<string, unknown> 作为中间类型以支持动态键访问,\n // 最终通过类型断言返回 ComponentOptions\n const merged: Record<string, unknown> = { ...parent };\n\n for (const key in child) {\n if (key === 'props' || key === 'emits' || key === 'inject') {\n const parentVal = (parent as Record<string, unknown>)[key];\n const childVal = (child as Record<string, unknown>)[key];\n if (parentVal && childVal) {\n merged[key] = { ...parentVal, ...childVal };\n } else if (childVal) {\n merged[key] = childVal;\n }\n } else if (key === 'data' || key === 'provide') {\n const parentVal = (parent as Record<string, unknown>)[key];\n const childVal = (child as Record<string, unknown>)[key];\n if (parentVal && childVal) {\n merged[key] = function (this: ComponentPublicInstance) {\n const parentData = isFunction(parentVal) ? parentVal.call(this) : parentVal;\n const childData = isFunction(childVal) ? childVal.call(this) : childVal;\n return {\n ...(parentData as Record<string, unknown>),\n ...(childData as Record<string, unknown>),\n };\n };\n } else if (childVal) {\n merged[key] = childVal;\n }\n } else if (key === 'computed' || key === 'methods' || key === 'watch') {\n const parentVal = (parent as Record<string, unknown>)[key];\n const childVal = (child as Record<string, unknown>)[key];\n if (parentVal && childVal) {\n merged[key] = { ...parentVal, ...childVal };\n } else if (childVal) {\n merged[key] = childVal;\n }\n } else if (\n key === 'beforeCreate' ||\n key === 'created' ||\n key === 'beforeMount' ||\n key === 'mounted' ||\n key === 'beforeUpdate' ||\n key === 'updated' ||\n key === 'beforeUnmount' ||\n key === 'unmounted'\n ) {\n const parentVal = (parent as Record<string, unknown>)[key];\n const childVal = (child as Record<string, unknown>)[key];\n if (parentVal && childVal) {\n merged[key] = function (this: ComponentPublicInstance) {\n (parentVal as (...args: unknown[]) => unknown).call(this);\n (childVal as (...args: unknown[]) => unknown).call(this);\n };\n } else if (childVal) {\n merged[key] = childVal;\n }\n } else if (key === 'mixins' || key === 'extends') {\n // 跳过 - 已处理\n } else if (hasOwn(child, key)) {\n merged[key] = (child as Record<string, unknown>)[key];\n }\n }\n\n return merged as ComponentOptions;\n}\n\n// ==================== createAppContext ====================\n\n/**\n * 创建基础应用上下文对象。\n * 导出供 @lytjs/core 扩展运行时字段。\n */\nexport function createAppContext(): AppContext {\n return {\n config: {},\n components: {},\n directives: {},\n mixins: [],\n provides: Object.create(null) as Record<string | symbol, unknown>,\n };\n}\n","// src/component-proxy.ts\n// Public instance proxy ($data, $props, $el, etc.) and access cache\n\nimport { hasOwn } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport { nextTick } from '@lytjs/common-scheduler';\nimport type { ComponentInternalInstance, ComponentPublicInstance } from './types';\n// FIX: DTS build error - VNode 未使用\n// import type { VNode } from '@lytjs/common-vnode';\n\n// ==================== accessCache 常量 ====================\n\n/**\n * PublicInstanceProxy 属性访问缓存位掩码。\n * 每个公共属性对应一个唯一的位,用于在 accessCache 数组中标记\n * 该属性首次被访问时的查找结果,避免后续重复遍历 setupState/data/props。\n *\n * 位值设计:\n * 0 - 未缓存(需要首次查找)\n * 1 - $ 属性($data, $props, $el, $emit 等)\n * 2 - setupState\n * 4 - data\n * 8 - props\n * 16 - globalProperties\n * 32 - ctx(公共实例自身属性)\n */\nexport const enum PublicInstanceProxyAccessCache {\n /** 未缓存 */\n NONE = 0,\n /** 其他(无法归类到具体来源) */\n OTHER = 1,\n /** 来自 setupState */\n SETUP_STATE = 2,\n /** 来自 data */\n DATA = 4,\n /** 来自 props */\n PROPS = 8,\n /** 来自 globalProperties */\n GLOBAL_PROPERTIES = 16,\n /** 来自 ctx(公共实例自身属性,如 $data, $el 等) */\n CONTEXT = 32,\n}\n\n/**\n * 公共属性名到 accessCache 位掩码的映射。\n * 用于快速判断一个 key 是否是 Vue 内置公共属性($data, $props 等)。\n */\nexport const PUBLIC_PROPERTIES_MAP: Record<string, number> = {\n $: 1,\n $el: 2,\n $data: 4,\n $props: 8,\n $attrs: 16,\n $slots: 32,\n $refs: 64,\n $parent: 128,\n $root: 256,\n $emit: 512,\n $options: 1024,\n $forceUpdate: 2048,\n $nextTick: 4096,\n $watch: 8192,\n};\n\n// ==================== createComponentPublicInstance ====================\n\n/**\n * Create the public instance proxy ($data, $props, $el, etc.).\n * Uses a Proxy so that Options API `this` correctly resolves properties\n * from setupState, data, props, and public instance fields ($el, $emit, etc.).\n */\nexport function createComponentPublicInstance(\n instance: ComponentInternalInstance,\n): ComponentPublicInstance {\n // 初始化 accessCache(惰性创建)\n if (!instance.accessCache) {\n instance.accessCache = Object.create(null) as Record<string, number>;\n }\n\n const PublicInstanceProxyHandlers: ProxyHandler<ComponentPublicInstance> = {\n get(target: ComponentPublicInstance, key: string | symbol): unknown {\n // Symbol.key 无法缓存,直接走原始逻辑\n if (typeof key === 'symbol') {\n if (key in target) {\n const res = (target as unknown as Record<string | symbol, unknown>)[key];\n if (typeof res === 'function' && key !== Symbol.toPrimitive && key !== Symbol.iterator) {\n return res.bind(target);\n }\n return res;\n }\n return undefined;\n }\n\n // 尝试从 accessCache 获取缓存结果\n const cachedValue = instance.accessCache![key];\n if (cachedValue !== undefined) {\n switch (cachedValue) {\n case PublicInstanceProxyAccessCache.CONTEXT: {\n const res = (target as unknown as Record<string | symbol, unknown>)[key];\n if (typeof res === 'function' && key !== '$emit') {\n return res.bind(target);\n }\n return res;\n }\n case PublicInstanceProxyAccessCache.OTHER:\n return undefined;\n case PublicInstanceProxyAccessCache.SETUP_STATE:\n return instance.setupState[key];\n case PublicInstanceProxyAccessCache.DATA:\n return instance.data[key];\n case PublicInstanceProxyAccessCache.PROPS:\n return instance.props[key];\n case PublicInstanceProxyAccessCache.GLOBAL_PROPERTIES: {\n const globalProperties = instance.appContext?.config?.globalProperties as\n | Record<string, unknown>\n | undefined;\n return globalProperties ? globalProperties[key] : undefined;\n }\n }\n }\n\n // 1. Public properties ($data, $props, $el, $emit, etc.)\n if (key in target) {\n const res = (target as unknown as Record<string | symbol, unknown>)[key];\n // Bind functions to the proxy so `this` works correctly\n if (typeof res === 'function' && key !== '$emit') {\n return res.bind(target);\n }\n // 缓存查找结果\n instance.accessCache![key] = PublicInstanceProxyAccessCache.CONTEXT;\n return res;\n }\n\n // 2. globalProperties\n const globalProperties = instance.appContext?.config?.globalProperties as\n | Record<string, unknown>\n | undefined;\n if (globalProperties && hasOwn(globalProperties, key)) {\n instance.accessCache![key] = PublicInstanceProxyAccessCache.GLOBAL_PROPERTIES;\n return globalProperties[key as string];\n }\n\n // 3. setupState\n if (hasOwn(instance.setupState, key)) {\n instance.accessCache![key] = PublicInstanceProxyAccessCache.SETUP_STATE;\n return instance.setupState[key as string];\n }\n\n // 4. data\n if (hasOwn(instance.data, key)) {\n instance.accessCache![key] = PublicInstanceProxyAccessCache.DATA;\n return instance.data[key as string];\n }\n\n // 5. props\n if (hasOwn(instance.props, key)) {\n instance.accessCache![key] = PublicInstanceProxyAccessCache.PROPS;\n return instance.props[key as string];\n }\n\n // 未找到,缓存为 OTHER 以避免重复查找\n instance.accessCache![key] = PublicInstanceProxyAccessCache.OTHER;\n return undefined;\n },\n\n set(_target: ComponentPublicInstance, key: string | symbol, value: unknown): boolean {\n // FIX: P1-16 完善 Symbol key 处理:Symbol key 不应被写入 setupState/data,\n // 应直接设置到 target 上(与 get handler 的 Symbol 处理保持一致)\n if (typeof key === 'symbol') {\n if (key === Symbol.toPrimitive || key === Symbol.iterator) {\n return false; // 不允许覆盖内置 Symbol\n }\n (_target as unknown as Record<string | symbol, unknown>)[key] = value;\n return true;\n }\n\n // 1. setupState\n if (hasOwn(instance.setupState, key)) {\n instance.setupState[key as string] = value;\n return true;\n }\n\n // 2. data\n if (hasOwn(instance.data, key)) {\n instance.data[key as string] = value;\n return true;\n }\n\n // FIX: P0-05 未找到属性时,在 DEV 模式下发出警告并返回 false,\n // 避免静默吞没写入导致调试困难\n // FIX: P2-10 注意:生产模式下此操作静默返回 false,不抛出错误。\n // 这是有意的设计,以避免在生产环境中因意外的属性写入导致应用崩溃。\n if (__DEV__) {\n warn(\n `Component public instance has no property \"${String(key)}\". ` +\n `This set operation was silently ignored.`,\n );\n }\n return false;\n },\n\n has(_target: ComponentPublicInstance, key: string | symbol): boolean {\n // Symbol key 无法使用 accessCache\n if (typeof key === 'symbol') {\n return (\n key in instance.setupState ||\n key in instance.data ||\n key in instance.props ||\n key in _target\n );\n }\n\n // 尝试从 accessCache 获取缓存结果\n const cachedValue = instance.accessCache![key];\n if (cachedValue !== undefined) {\n // 缓存值为 OTHER 表示未找到\n return cachedValue !== PublicInstanceProxyAccessCache.OTHER;\n }\n\n const globalProperties = instance.appContext?.config?.globalProperties as\n | Record<string, unknown>\n | undefined;\n const found =\n key in instance.setupState ||\n key in instance.data ||\n key in instance.props ||\n (globalProperties ? key in globalProperties : false) ||\n key in _target;\n\n // 缓存 has 结果\n instance.accessCache![key] = found\n ? PublicInstanceProxyAccessCache.CONTEXT\n : PublicInstanceProxyAccessCache.OTHER;\n\n return found;\n },\n };\n\n const ctx: ComponentPublicInstance = {\n get $data() {\n return instance.data;\n },\n get $props() {\n return instance.props;\n },\n get $el() {\n return (instance.vnode?.el as Element) ?? null;\n },\n get $options() {\n return instance.type as unknown as Record<string, unknown>;\n },\n get $refs() {\n return instance.refs as Record<string, Element | ComponentPublicInstance | null>;\n },\n get $slots() {\n return instance.slots;\n },\n $emit: instance.emit,\n $forceUpdate: () => {\n if (instance.update) {\n instance.update();\n } else if (instance.isMounted && instance.render && !instance.isUnmounted) {\n // 回退路径:已挂载但 instance.update 不可用(非标准渲染器场景)。\n // 标记需要重新渲染,在下一个 tick 中执行 render 并通过\n // instance.subTree 引用替换触发渲染器的更新机制。\n // FIX: P2-35 添加 anchor 和 ref 处理:\n // - 保留旧 subTree 的 anchor 信息(用于 Fragment 定位)\n // - 将旧 subTree 的 ref 转移到新 subTree(保持 ref 绑定)\n nextTick(() => {\n if (instance.isUnmounted) return;\n const prevTree = instance.subTree;\n const nextTree = instance.render!(instance.ctx as Parameters<typeof instance.render>[0]);\n if (nextTree) {\n instance.subTree = nextTree;\n // 将旧 subTree 标记为需要卸载,新 subTree 标记为需要挂载。\n // 渲染器在下次调度时会检测到 subTree 变化并执行 patch。\n nextTree.el = prevTree?.el ?? null;\n // FIX: P2-35 保留 anchor 信息,确保 Fragment 子节点定位正确\n if (prevTree && 'anchor' in prevTree) {\n (nextTree as unknown as Record<string, unknown>).anchor = (\n prevTree as unknown as Record<string, unknown>\n ).anchor;\n }\n // FIX: P2-35 转移 ref 绑定,避免 ref 丢失\n if (prevTree && 'ref' in prevTree) {\n (nextTree as unknown as Record<string, unknown>).ref = (\n prevTree as unknown as Record<string, unknown>\n ).ref;\n }\n }\n });\n }\n },\n $nextTick: () => nextTick(),\n };\n\n return new Proxy(ctx, PublicInstanceProxyHandlers);\n}\n","// src/component-init.ts\n// 组件完成 setup:data、methods、computed、watch、render 初始化\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\nimport { reactive, computed, watch } from '@lytjs/reactivity';\nimport { hasOwn } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport type { ComponentInternalInstance, ComponentPublicInstance } from './types';\nimport type { VNode } from '@lytjs/common-vnode';\nimport { callCreatedHook, handleError } from './lifecycle';\nimport { createComponentPublicInstance } from './component-proxy';\n\n// ==================== normalizeWatchHandler ====================\n\n/**\n * 标准化原始 watch 处理器为绑定函数。\n * 支持函数、字符串(方法名)和对象 { handler } 形式。\n */\nfunction normalizeWatchHandler(\n raw: unknown,\n methods: Record<string, Function> | undefined,\n proxy: ComponentPublicInstance,\n): Function | null {\n if (typeof raw === 'function') {\n return raw.bind(proxy);\n }\n if (typeof raw === 'string') {\n if (methods && hasOwn(methods, raw)) {\n return methods[raw]!.bind(proxy);\n }\n if (__DEV__) {\n warn(`Invalid watch handler \"${raw}\". No matching method found.`);\n }\n return null;\n }\n if (\n raw !== null &&\n typeof raw === 'object' &&\n typeof (raw as Record<string, unknown>).handler !== 'undefined'\n ) {\n return normalizeWatchHandler((raw as Record<string, unknown>).handler, methods, proxy);\n }\n if (__DEV__) {\n warn(`Invalid watch handler. Expected a function, method name string, or { handler } object.`);\n }\n return null;\n}\n\n/**\n * 完成组件 setup:处理 data、methods、computed、render。\n *\n * 错误处理:整个 setup 过程包裹在 try-catch 中,\n * 优雅地处理 data/methods/computed/watch 初始化期间的错误。\n * 错误会传播到最近的 ErrorBoundary。\n */\nexport function finishComponentSetup(instance: ComponentInternalInstance): void {\n const { type } = instance;\n\n // 步骤 1:创建公共实例代理\n try {\n instance.ctx = createComponentPublicInstance(instance);\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to create public instance proxy for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (createComponentPublicInstance)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // 步骤 2:初始化 data\n try {\n if (type.data) {\n const data = type.data.call(instance.ctx) ?? {};\n instance.data = reactive(data);\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to initialize data for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (data initialization)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // Props 冲突检测:创建 keys 集合以复用\n // FIX: P2-30 重命名为 devPropsKeys,避免与全局 __DEV__ 混淆\n const devPropsKeys = __DEV__ && instance.props ? new Set(Object.keys(instance.props)) : null;\n\n // 检查 data 与 props 冲突\n if (devPropsKeys && instance.data) {\n for (const key of Object.keys(instance.data)) {\n if (devPropsKeys.has(key)) {\n warn(\n `Data property \"${key}\" is already defined as a prop. Use default value in props instead.`,\n );\n }\n }\n }\n\n const proxy = instance.ctx;\n\n // 步骤 3:初始化 methods\n try {\n if (type.methods) {\n for (const key in type.methods) {\n if (hasOwn(type.methods, key)) {\n const method = type.methods[key]!;\n if (__DEV__ && typeof method !== 'function') {\n warn(\n `Method \"${key}\" has type \"${typeof method}\" in component ${(type as Record<string, unknown>).name || '(anonymous)'}. Expected a function.`,\n );\n continue;\n }\n instance.ctx[key as keyof ComponentPublicInstance] = method.bind(proxy) as never;\n }\n }\n // 检查 methods 与 props 冲突\n if (devPropsKeys) {\n for (const key of Object.keys(type.methods)) {\n if (devPropsKeys.has(key)) {\n warn(`Method \"${key}\" is already defined as a prop.`);\n }\n }\n }\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to initialize methods for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (methods initialization)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // 步骤 4:初始化 computed\n try {\n if (type.computed) {\n for (const key in type.computed) {\n if (hasOwn(type.computed, key)) {\n const opt = type.computed[key];\n let c;\n if (typeof opt === 'function') {\n // 函数形式 - 只有 getter\n c = computed(() => opt.call(proxy));\n } else if (opt && typeof opt === 'object') {\n // getter/setter 对象形式\n const { get, set } = opt as { get?: Function; set?: Function };\n if (__DEV__) {\n if (typeof get !== 'function') {\n warn(\n `Computed property \"${key}\" has no getter in component ${(type as Record<string, unknown>).name || '(anonymous)'}.`,\n );\n continue;\n }\n if (set !== undefined && typeof set !== 'function') {\n warn(\n `Computed property \"${key}\" setter is not a function in component ${(type as Record<string, unknown>).name || '(anonymous)'}.`,\n );\n }\n }\n c = computed({\n get: get ? () => get.call(proxy) : () => undefined,\n set: set ? (v: unknown) => set.call(proxy, v) : undefined,\n } as Parameters<typeof computed>[0]);\n } else if (__DEV__) {\n warn(\n `Computed property \"${key}\" is not a function or object in component ${(type as Record<string, unknown>).name || '(anonymous)'}.`,\n );\n continue;\n }\n if (__DEV__ && type.methods && hasOwn(type.methods, key)) {\n warn(\n `Computed property \"${key}\" conflicts with a method of the same name in component ${(type as Record<string, unknown>).name || '(anonymous)'}. The method will be overwritten.`,\n );\n }\n instance.ctx[key as keyof ComponentPublicInstance] = c as never;\n }\n }\n // 检查 computed 与 props 冲突\n if (devPropsKeys) {\n for (const key of Object.keys(type.computed)) {\n if (devPropsKeys.has(key)) {\n warn(`Computed property \"${key}\" is already defined as a prop.`);\n }\n }\n }\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to initialize computed for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (computed initialization)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // 步骤 5:初始化 watch\n try {\n if (type.watch) {\n for (const key in type.watch) {\n if (hasOwn(type.watch, key)) {\n const raw = type.watch[key];\n // 标准化为 handler 数组\n const handlers: Function[] = [];\n if (Array.isArray(raw)) {\n for (const h of raw) {\n const normalized = normalizeWatchHandler(h, type.methods, proxy);\n if (normalized) handlers.push(normalized);\n }\n } else {\n const h = normalizeWatchHandler(raw, type.methods, proxy);\n if (h) handlers.push(h);\n }\n // 提取选项(仅对象形式)\n const options: { immediate?: boolean; deep?: boolean; flush?: 'pre' | 'post' | 'sync' } =\n {};\n if (\n !Array.isArray(raw) &&\n raw !== null &&\n typeof raw === 'object' &&\n typeof (raw as Record<string, unknown>).handler !== 'undefined'\n ) {\n const watchObj = raw as Record<string, unknown>;\n if (typeof watchObj.immediate === 'boolean') options.immediate = watchObj.immediate;\n if (typeof watchObj.deep === 'boolean') options.deep = watchObj.deep;\n if (typeof watchObj.flush === 'string')\n options.flush = watchObj.flush as 'pre' | 'post' | 'sync';\n }\n for (const handler of handlers) {\n watch(\n () => proxy[key as keyof ComponentPublicInstance],\n handler as (...args: unknown[]) => void,\n options,\n );\n }\n }\n }\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to initialize watch for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (watch initialization)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // 步骤 6:调用 created 钩子并注册渲染追踪钩子\n try {\n callCreatedHook(instance);\n\n // 注册选项式 API 的 renderTracked/renderTriggered 钩子\n if (type.renderTracked) {\n if (!instance.renderTrackedHooks) {\n instance.renderTrackedHooks = [];\n }\n instance.renderTrackedHooks.push(type.renderTracked.bind(proxy));\n }\n if (type.renderTriggered) {\n if (!instance.renderTriggeredHooks) {\n instance.renderTriggeredHooks = [];\n }\n instance.renderTriggeredHooks.push(type.renderTriggered.bind(proxy));\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed during lifecycle hooks for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (lifecycle hooks)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // 步骤 7:设置渲染函数\n try {\n if (!instance.render) {\n if (type.render) {\n instance.render = type.render.bind(instance.ctx);\n }\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to set up render for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (render setup)');\n instance.render = () => null as unknown as VNode;\n }\n}\n","// src/component-setup.ts\n// 组件实例创建、setup 和 props 初始化\n\nimport { isFunction, isObject, hasOwn, NOOP, EMPTY_OBJ, isPromise } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport type {\n ComponentOptions,\n ComponentInternalInstance,\n ComponentPublicInstance,\n SetupContext,\n InternalSlots,\n RenderFunction,\n} from './types';\nimport type { VNode } from '@lytjs/common-vnode';\nimport { normalizePropsOptions, resolvePropValue } from './props';\nimport { normalizeEmitsOptions, emit } from './emit';\nimport { initSlots } from './slots';\nimport { setCurrentInstance, handleError } from './lifecycle';\nimport { createAppContext, mergeOptions } from './component-options';\nimport { finishComponentSetup } from './component-init';\n\ntype SetupResult = RenderFunction | Record<string, unknown> | void;\n\n// ==================== UID counter ====================\n\n// 异步 setup 超时时间(毫秒)\nconst ASYNC_SETUP_TIMEOUT = 30000;\n\n// 注意:uid 使用自增整数,在 JavaScript 中 Number.MAX_SAFE_INTEGER 为 2^53 - 1。\n// 在实际应用中达到此上限的概率极低(需创建约 9 * 10^15 个组件实例),\n// 因此此处不做溢出检查。如确实需要,可考虑使用 BigInt 或周期性重置。\nlet uid = 0;\n\n// FIX: P2-15 setup 上下文 WeakMap 缓存:\n// 缓存 createSetupContext 的结果,避免每次调用 runSetup 时重新创建\nconst setupContextCache = new WeakMap<ComponentInternalInstance, SetupContext>();\n\n// ==================== createComponentInstance ====================\n\n/**\n * 从 vnode 创建组件内部实例。\n *\n * 错误处理:实例创建包裹在 try-catch 中,防止\n * 组件初始化期间的未捕获异常导致应用崩溃。\n * 错误会传播到最近的 ErrorBoundary。\n */\nexport function createComponentInstance(\n vnode: VNode,\n parent: ComponentInternalInstance | null,\n): ComponentInternalInstance {\n // FIX: P1-17 在类型转换前验证 vnode.type 是否为有效组件类型\n const rawType = vnode.type;\n if (\n rawType === null ||\n rawType === undefined ||\n typeof rawType === 'string' ||\n typeof rawType === 'number' ||\n typeof rawType === 'boolean' ||\n typeof rawType === 'symbol'\n ) {\n throw new Error(\n `[lytjs/component] createComponentInstance: invalid vnode.type \"${String(rawType)}\". ` +\n `Expected a component options object or function.`,\n );\n }\n\n const type = vnode.type as ComponentOptions;\n\n try {\n // 合并 extends 和 mixins\n const mergedOptions = mergeOptions(type);\n\n const appContext = parent ? parent.appContext : createAppContext();\n\n const instance: ComponentInternalInstance = {\n uid: uid++,\n type: mergedOptions,\n vnode,\n subTree: null,\n props: EMPTY_OBJ,\n slots: {} as InternalSlots,\n ctx: {} as ComponentPublicInstance,\n setupState: {},\n data: {},\n propsOptions: normalizePropsOptions(mergedOptions.props),\n emitsOptions: normalizeEmitsOptions(mergedOptions.emits),\n emit: NOOP as (event: string, ...args: unknown[]) => void,\n isMounted: false,\n isUnmounted: false,\n isDeactivated: false,\n isKeepingAlive: false,\n refs: {},\n lifecycle: {\n beforeMount: new Set(),\n mounted: new Set(),\n beforeUpdate: new Set(),\n updated: new Set(),\n beforeUnmount: new Set(),\n unmounted: new Set(),\n },\n provides: parent\n ? parent.provides\n : (Object.create(null) as Record<string | symbol, unknown>),\n parent,\n root: null as unknown as ComponentInternalInstance,\n appContext,\n attrs: {},\n accessCache: null as Record<string, number> | null,\n };\n\n // 创建绑定到此实例的 emit 函数\n instance.emit = (event: string, ...args: unknown[]) => emit(instance, event, ...args);\n\n // FIX: P1-4 在 instance 声明完成后赋值 root,避免在 const 初始化前引用自身\n instance.root = parent ? parent.root : instance;\n\n return instance;\n } catch (err) {\n // 记录错误用于调试\n if (__DEV__) {\n warn(`Failed to create component instance: ${(err as Error).message}`);\n }\n // 通过 handleError 将错误传播到 ErrorBoundary\n handleError(err as Error, parent, 'createComponentInstance');\n // 重新抛出,让调用者处理失败\n throw err;\n }\n}\n\n// ==================== setupComponent ====================\n\n/**\n * 设置组件实例:运行 setup、初始化 props、初始化 slots。\n */\nexport function setupComponent(instance: ComponentInternalInstance): void {\n const vnode = instance.vnode;\n if (!vnode) return;\n\n const { children } = vnode;\n const props = (vnode.props as Record<string, unknown> | null) ?? null;\n\n // 初始化 props\n initProps(instance, props);\n\n // 初始化 slots\n initSlots(instance, children);\n\n // 设置组件\n const setupResult = runSetup(instance);\n\n if (isPromise(setupResult)) {\n // 异步 setup - 标记 vnode 为异步\n vnode.isAsyncPlaceholder = true;\n // FIX: P1-15 异步 setup 超时定时器在组件卸载时清理,\n // 避免组件卸载后定时器仍然触发导致内存泄漏和无效操作\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timedSetupResult = Promise.race([\n setupResult,\n new Promise<SetupResult>((_, reject) => {\n timeoutId = setTimeout(\n () => reject(new Error('Async component setup timed out')),\n ASYNC_SETUP_TIMEOUT,\n );\n }),\n ]);\n timedSetupResult\n .then((resolvedResult) => {\n // 清理超时定时器\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n if (instance.isUnmounted) return;\n handleSetupResult(instance, resolvedResult as SetupResult);\n vnode.isAsyncPlaceholder = false;\n })\n .catch((err: Error) => {\n // FIX: P1-15 清理超时定时器\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n vnode.isAsyncPlaceholder = false;\n handleError(err, instance, 'setup function');\n });\n } else {\n handleSetupResult(instance, setupResult);\n }\n}\n\n/**\n * 运行 setup 函数(如果已定义)。\n */\nfunction runSetup(instance: ComponentInternalInstance): SetupResult {\n const { setup } = instance.type;\n\n if (!setup) return undefined;\n\n setCurrentInstance(instance);\n\n try {\n const setupContext = createSetupContext(instance);\n const result = setup(instance.props, setupContext);\n return result;\n } catch (err) {\n handleError(err as Error, instance, 'setup function');\n // 设置空操作渲染函数,防止静默空渲染\n instance.render = () => null as unknown as VNode;\n return undefined;\n } finally {\n setCurrentInstance(null);\n }\n}\n\n/**\n * 处理 setup 函数的返回结果。\n */\nfunction handleSetupResult(instance: ComponentInternalInstance, setupResult: SetupResult): void {\n if (isFunction(setupResult)) {\n // Setup 返回了渲染函数\n instance.render = setupResult as RenderFunction;\n } else if (isObject(setupResult) && setupResult !== null) {\n // Setup 返回了状态对象\n instance.setupState = setupResult as Record<string, unknown>;\n }\n\n // 完成组件 setup\n finishComponentSetup(instance);\n}\n\n// ==================== initProps ====================\n\n/**\n * 初始化并验证组件实例的 props。\n */\nexport function initProps(\n instance: ComponentInternalInstance,\n rawProps: Record<string, unknown> | null,\n): void {\n const propsOptions = instance.propsOptions;\n const props: Record<string, unknown> = {};\n if (!rawProps) {\n instance.props = props;\n return;\n }\n\n // 处理声明的 props\n for (const key in propsOptions) {\n if (hasOwn(propsOptions, key)) {\n const value = rawProps[key];\n props[key] = resolvePropValue(propsOptions[key]!, value, instance, key);\n }\n }\n\n // 收集 attrs(未声明的 props)\n const attrs: Record<string, unknown> = {};\n for (const key in rawProps) {\n if (hasOwn(rawProps, key) && !hasOwn(propsOptions, key)) {\n attrs[key] = rawProps[key];\n }\n }\n\n instance.props = props;\n instance.attrs = attrs;\n}\n\n// ==================== createSetupContext ====================\n\n/**\n * 创建传递给 setup 函数的 setup 上下文对象。\n * FIX: P1-9 添加缓存逻辑,避免每次调用 runSetup 时重新创建 setupContext\n */\nexport function createSetupContext(instance: ComponentInternalInstance): SetupContext {\n // 检查缓存中是否已有该实例的 setupContext\n const cached = setupContextCache.get(instance);\n if (cached) {\n return cached;\n }\n\n const context: SetupContext = {\n attrs: instance.attrs,\n slots: instance.slots,\n emit: instance.emit,\n expose(exposed?: Record<string, unknown>) {\n if (!exposed) {\n instance.exposed = null;\n return;\n }\n // 公共属性白名单:这些属性始终可访问,不应被 expose 覆盖\n const publicApiKeys = new Set([\n '$data',\n '$props',\n '$el',\n '$emit',\n '$forceUpdate',\n '$nextTick',\n '$slots',\n '$refs',\n '$options',\n ]);\n // 过滤危险 key,防止原型污染\n const safeExposed: Record<string, unknown> = {};\n for (const key of Object.keys(exposed)) {\n if (key !== '__proto__' && key !== 'constructor' && !publicApiKeys.has(key)) {\n safeExposed[key] = exposed[key];\n }\n }\n instance.exposed = safeExposed;\n },\n };\n\n // 缓存 setupContext\n setupContextCache.set(instance, context);\n return context;\n}\n","// src/component-inject.ts\n// Provide/inject 依赖注入系统\n\nimport { hasOwn } from '@lytjs/common-is';\nimport { getCurrentInstance } from './lifecycle';\n\n// FIX: P1-9 COMPONENT-NEW-03 - provide/inject 类型推断增强\n// InjectionKey 是一个 Symbol 类型,用于在 provide/inject 之间建立类型安全的关联。\n// 使用方式:\n// const key = Symbol() as InjectionKey<string>;\n// provide(key, 'hello');\n// const value = inject(key); // 类型为 string | undefined\n//\n// 改进点:\n// 1. 使用泛型约束确保类型推断准确性\n// 2. 支持默认值类型推断\n// 3. 支持工厂函数类型推断\nexport interface InjectionKey<T> extends symbol {\n __injectKey?: T;\n}\n\n/**\n * Provide 选项接口\n * 用于类型安全的 provide 调用\n */\nexport interface ProvideOptions<T = unknown> {\n key: InjectionKey<T> | string | symbol;\n value: T;\n}\n\n/**\n * Inject 选项接口(改进版)\n * 支持更精确的类型推断\n */\nexport interface InjectOptions<T = unknown> {\n /** 如果为 true,将 defaultValue 视为工厂函数,调用它来生成默认值 */\n factory?: boolean;\n /** 从特定的祖先 key 查找值,而非注入的 key */\n from?: InjectionKey<T> | string | symbol;\n /** 如果为 true,仅从当前实例自身的 provides 中查找值(不向上查找祖先) */\n local?: boolean;\n}\n\n// ==================== provide / inject ====================\n\n/**\n * 向后代组件提供值。\n * FIX: P1-9 COMPONENT-NEW-03 - 改进类型定义,支持 InjectionKey 类型推断\n */\nexport function provide<T>(key: InjectionKey<T> | string | symbol, value: T): void {\n const instance = getCurrentInstance();\n if (instance) {\n // FIX: P2-34 添加原型链边界说明注释:\n // 首次 provide 时,如果当前 provides 与父级共享同一个引用,\n // 则创建以父级 provides 为原型的新对象,确保层级隔离。\n // 这是利用 JavaScript 原型链实现 provide/inject 的核心机制:\n // 子组件通过原型链向上查找 provides,而当前组件的 provide 会\n // 创建一个新对象遮蔽父级同名 key,不会污染父级的 provides。\n // 注意:Object.create(null) 创建的对象没有原型,因此不会继承\n // Object.prototype 上的属性(如 toString、hasOwnProperty 等),\n // 这是正确的做法,避免 key 冲突。\n if (instance.provides === (instance.parent?.provides ?? null)) {\n instance.provides = Object.create(\n instance.provides as Record<string | symbol, unknown>,\n ) as Record<string | symbol, unknown>;\n }\n // FIX: P0-4 修复 provide/inject symbol key 被转为 string 的问题,直接使用 key 而不进行类型断言\n instance.provides[key as string | symbol] = value;\n }\n}\n\n/**\n * 从祖先组件注入值。\n * FIX: P1-9 COMPONENT-NEW-03 - 改进类型定义,支持更精确的类型推断\n *\n * Supported forms:\n * - `inject('key')` - basic lookup\n * - `inject('key', defaultValue)` - with default value\n * - `inject('key', () => createDefault(), { factory: true })` - factory function default\n * - `inject('key', undefined, { from: 'optionalSourceKey' })` - from modifier\n * - `inject('key', undefined, { local: true })` - local only (no ancestor lookup)\n * - `inject(injectionKey)` - with InjectionKey for type-safe lookup\n */\nexport function inject<T>(\n key: InjectionKey<T> | string | symbol,\n defaultValue?: T | (() => T),\n options?: InjectOptions<T>,\n): T | undefined {\n const instance = getCurrentInstance();\n if (!instance) {\n // 无实例上下文 - 返回默认值\n return resolveDefault(defaultValue, options);\n }\n\n const lookupKey = options?.from ?? key;\n\n if (options?.local) {\n // local 模式:仅检查当前实例自身的 provides(不从父级原型继承)\n // 如果 instance.provides 与 parent.provides 是同一引用,说明实例\n // 尚未调用 provide(),因此没有自身的 provides 可检查。\n const provides = instance.provides as Record<string | symbol, unknown>;\n const hasOwnProvides = instance.parent ? provides !== instance.parent.provides : true;\n if (hasOwnProvides && hasOwn(provides, lookupKey as string)) {\n return provides[lookupKey as string] as T | undefined;\n }\n return resolveDefault(defaultValue, options);\n }\n\n // 沿父组件链向上查找\n let current = instance.parent;\n while (current) {\n const provides = current.provides as Record<string | symbol, unknown>;\n if ((lookupKey as string | symbol) in provides) {\n return provides[lookupKey as string] as T | undefined;\n }\n current = current.parent;\n }\n\n return resolveDefault(defaultValue, options);\n}\n\n/**\n * 解析 inject 的默认值,处理工厂函数。\n */\nfunction resolveDefault<T>(\n defaultValue: T | (() => T) | undefined,\n options?: InjectOptions,\n): T | undefined {\n if (defaultValue === undefined) return undefined;\n if (options?.factory && typeof defaultValue === 'function') {\n return (defaultValue as () => T)();\n }\n return defaultValue as T;\n}\n","// src/keep-alive.ts\n// KeepAlive 组件(简化版)\n\nimport { isString, isArray, isFunction } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport { watch } from '@lytjs/reactivity';\nimport type { ComponentInternalInstance, ComponentOptions, SetupContext } from './types';\nimport { createComponentInstance, setupComponent } from './component';\nimport { handleError } from './lifecycle';\n// FIX: DTS build error - 统一从 vdom 导入,避免类型不兼容\nimport { ShapeFlags, createVNode, createCommentVNode } from '@lytjs/vdom';\nimport type { VNode } from '@lytjs/vdom';\n\n// ==================== 类型定义 ====================\n\ninterface KeepAliveCache {\n get(key: string): ComponentInternalInstance | undefined;\n set(key: string, instance: ComponentInternalInstance): void;\n delete(key: string): boolean;\n has(key: string): boolean;\n forEach(callback: (value: ComponentInternalInstance, key: string) => void): void;\n readonly size: number;\n keys(): IterableIterator<string>;\n}\n\n/**\n * LRU(最近最少使用)缓存实现,用于 KeepAlive\n * FIX: P2-8 COMPONENT-NEW-05 - 实现 LRU 缓存策略,限制缓存组件数量\n */\nclass LRUCache implements KeepAliveCache {\n private cache: Map<string, ComponentInternalInstance>;\n private maxSize: number;\n\n constructor(maxSize: number = 10) {\n this.cache = new Map();\n this.maxSize = maxSize;\n }\n\n get(key: string): ComponentInternalInstance | undefined {\n const instance = this.cache.get(key);\n if (instance !== undefined) {\n // 移动到末尾(最近使用)\n this.cache.delete(key);\n this.cache.set(key, instance);\n }\n return instance;\n }\n\n set(key: string, instance: ComponentInternalInstance): void {\n // 如果 key 已存在,先删除以更新顺序\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // 如果达到容量上限,移除最旧的条目(Map 中的第一个)\n if (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n const oldestInstance = this.cache.get(oldestKey);\n if (oldestInstance) {\n // 停用并清理最旧的实例\n deactivateInstance(oldestInstance);\n oldestInstance.effects?.forEach((effect) => {\n effect.stop();\n });\n }\n this.cache.delete(oldestKey);\n }\n }\n\n this.cache.set(key, instance);\n }\n\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n forEach(callback: (value: ComponentInternalInstance, key: string) => void): void {\n this.cache.forEach(callback);\n }\n\n get size(): number {\n return this.cache.size;\n }\n\n keys(): IterableIterator<string> {\n return this.cache.keys();\n }\n\n /**\n * 更新缓存的最大容量\n */\n setMaxSize(newMaxSize: number): void {\n this.maxSize = newMaxSize;\n // 如有必要则修剪\n while (this.cache.size > this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n const oldestInstance = this.cache.get(oldestKey);\n if (oldestInstance) {\n deactivateInstance(oldestInstance);\n oldestInstance.effects?.forEach((effect) => {\n effect.stop();\n });\n }\n this.cache.delete(oldestKey);\n }\n }\n }\n}\n\n// ==================== KeepAlive Component ====================\n\nexport interface KeepAliveProps {\n include?: string | RegExp | (string | RegExp)[];\n exclude?: string | RegExp | (string | RegExp)[];\n /** FIX: P2-17 缓存大小限制配置(默认 10) */\n max?: number;\n /** 自定义缓存 key 函数:接收一个 vnode,返回字符串或数字作为缓存 key */\n onCacheKey?: (vnode: VNode) => string | number;\n}\n\nexport const KeepAlive: ComponentOptions = {\n name: 'KeepAlive',\n\n props: {\n include: {},\n exclude: {},\n max: { type: Number },\n onCacheKey: { type: Function },\n },\n\n setup(_props: Record<string, unknown>, _ctx: SetupContext) {\n const props = _props as KeepAliveProps;\n // FIX: P2-8 COMPONENT-NEW-05 - 使用 LRU 缓存替代普通 Map\n const maxCacheSize = props.max ?? 10;\n const cache: KeepAliveCache = new LRUCache(maxCacheSize);\n // FIX: P2-29 移除冗余的 keys Set,直接使用 cache.keys() 避免数据重复\n const _currentVNode: VNode | null = null;\n\n // FIX: P2-29 监听 max prop 变化,动态调整 LRU 缓存大小\n watch(\n () => (_props as KeepAliveProps).max,\n (newMax) => {\n if (newMax !== undefined && typeof newMax === 'number' && newMax > 0) {\n (cache as LRUCache).setMaxSize(newMax);\n }\n },\n );\n\n return {\n cache,\n _currentVNode,\n } as Record<string, unknown>;\n },\n\n render(ctx: unknown): VNode {\n // FIX: P2-12 使用 ctx 参数替代 this,避免依赖 this 上下文\n const instance = ctx as unknown as ComponentInternalInstance;\n const props = instance.props as KeepAliveProps;\n const defaultSlot = instance.slots?.default;\n\n if (!defaultSlot) return createCommentVNode('keep-alive');\n\n const children = defaultSlot();\n if (!children || children.length === 0) return createCommentVNode('keep-alive');\n\n // KeepAlive 只处理单个子组件\n const rawVNode = children[0] as VNode;\n if (rawVNode == null) return createCommentVNode('keep-alive');\n\n // 跳过非组件 vnode(文本、注释等)\n if (\n typeof rawVNode.type === 'string' ||\n rawVNode.type === (globalThis as Record<string, unknown>).__LYTJS_FRAGMENT__ ||\n rawVNode.type === (globalThis as Record<string, unknown>).__LYTJS_TEXT__ ||\n rawVNode.type === (globalThis as Record<string, unknown>).__LYTJS_COMMENT__\n ) {\n return rawVNode;\n }\n\n // 获取组件名用于匹配\n const compType = rawVNode.type as Record<string, unknown>;\n const compName =\n typeof compType === 'object' && compType !== null && 'name' in compType\n ? (compType as { name?: string }).name\n : typeof compType === 'function'\n ? (compType as { name?: string }).name\n : undefined;\n\n // FIX: P1-18 exclude 逻辑重构提高可读性,将复杂的条件表达式拆分为独立判断\n // 检查 include 过滤:组件名必须匹配 include 模式(如果提供了 include)\n const isIncluded =\n props.include === undefined || matchesPattern(compName as string | undefined, props.include);\n\n // 检查 exclude 过滤:组件名不能匹配 exclude 模式(如果提供了 exclude)\n const isExcluded =\n props.exclude !== undefined && matchesPattern(compName as string | undefined, props.exclude);\n\n if (!isIncluded || isExcluded) {\n return rawVNode;\n }\n\n // 计算缓存 key\n const cacheKey = getCacheKey(instance, rawVNode);\n\n // 检查是否已缓存\n const cachedInstance = getCachedInstance(instance, cacheKey);\n if (cachedInstance) {\n // 移动到最近使用位置\n cacheInstance(instance, cacheKey, cachedInstance);\n // 将缓存 vnode 的子节点复制到原始 vnode 上用于 patch\n // FIX: DTS build error - 类型断言避免 ComponentInternalInstance 冲突\n rawVNode.component = cachedInstance as unknown as NonNullable<typeof rawVNode.component>;\n rawVNode.shapeFlag |= ShapeFlags.COMPONENT_KEPT_ALIVE;\n activateInstance(cachedInstance);\n return rawVNode;\n }\n\n // 存储引用以便在卸载时停用\n (instance.setupState as Record<string, unknown>)._currentVNode = rawVNode;\n\n return rawVNode;\n },\n\n created() {\n // KeepAlive 实例初始化\n },\n};\n\n// ==================== KeepAlive 辅助函数 ====================\n\n/**\n * 创建 KeepAlive 组件实例。\n */\nexport function createKeepAliveInstance(\n props: KeepAliveProps = {},\n parent: ComponentInternalInstance | null = null,\n): ComponentInternalInstance {\n const vnode: VNode = createVNode(\n KeepAlive,\n {\n ...props,\n include: props.include,\n exclude: props.exclude,\n max: props.max,\n onCacheKey: props.onCacheKey,\n },\n null,\n ShapeFlags.STATEFUL_COMPONENT,\n );\n\n const instance = createComponentInstance(vnode, parent);\n setupComponent(instance);\n return instance;\n}\n\n/**\n * 检查组件名是否匹配 include/exclude 模式。\n */\nexport function matchesPattern(\n name: string | undefined,\n pattern: string | RegExp | (string | RegExp)[] | undefined,\n): boolean {\n if (!pattern) return true;\n // 当组件 name 为 undefined 时,跳过匹配(视为不匹配)\n if (name === undefined) return false;\n\n if (isString(pattern)) {\n return name === pattern;\n }\n\n if (pattern instanceof RegExp) {\n return pattern.test(name);\n }\n\n if (isArray(pattern)) {\n return pattern.some((p) => matchesPattern(name, p));\n }\n\n return true;\n}\n\n/**\n * 获取 KeepAlive 上下文中 vnode 的缓存 key。\n *\n * 如果 KeepAlive 实例有 `onCacheKey` prop(自定义函数),\n * 则使用该函数计算缓存 key。\n * 否则,默认 key 从 `vnode.type`(组件构造函数或标签名)派生。\n *\n * @param keepAlive - KeepAlive 组件实例\n * @param vnode - 需要计算缓存 key 的 vnode\n * @returns 字符串形式的缓存 key\n */\nexport function getCacheKey(keepAlive: ComponentInternalInstance, vnode: VNode): string {\n const onCacheKey = keepAlive.props.onCacheKey as ((vnode: VNode) => string | number) | undefined;\n\n if (isFunction(onCacheKey)) {\n try {\n return String(onCacheKey(vnode));\n } catch (e) {\n handleError(e as Error, keepAlive, 'onCacheKey');\n // FIX: P1-19 onCacheKey 异常时在 DEV 模式下发出警告,\n // 提醒开发者自定义缓存键函数可能存在问题\n if (__DEV__) {\n warn(\n `[KeepAlive] onCacheKey threw an error for vnode type \"${String(vnode.type)}\". ` +\n `Falling back to default cache key.`,\n );\n }\n }\n }\n\n // 默认:使用 vnode.type(组件构造函数或标签字符串)\n const type = vnode.type;\n if (typeof type === 'string') {\n return type;\n }\n if (type && typeof type === 'object' && 'name' in type) {\n return String((type as { name?: string }).name) || String(type);\n }\n if (typeof type === 'function' && 'name' in type) {\n return (type as { name?: string }).name || String(type);\n }\n return String(type);\n}\n\n/**\n * 在 KeepAlive 中缓存组件实例。\n * FIX: P2-8 COMPONENT-NEW-05 - LRU 缓存自动处理容量限制\n */\nexport function cacheInstance(\n keepAlive: ComponentInternalInstance,\n key: string,\n instance: ComponentInternalInstance,\n): void {\n const cache = keepAlive.setupState.cache as KeepAliveCache;\n\n // 如果已缓存,先删除旧条目(将以更新后的顺序重新添加)\n if (cache.has(key)) {\n cache.delete(key);\n }\n\n // LRU 缓存在 set() 中自动处理最大容量修剪\n cache.set(key, instance);\n}\n\n/**\n * Get a cached instance from KeepAlive.\n */\nexport function getCachedInstance(\n keepAlive: ComponentInternalInstance,\n key: string,\n): ComponentInternalInstance | undefined {\n const cache = keepAlive.setupState.cache as KeepAliveCache;\n return cache.get(key);\n}\n\n/**\n * 从 KeepAlive 移除缓存的实例。\n */\nexport function removeCachedInstance(keepAlive: ComponentInternalInstance, key: string): boolean {\n const cache = keepAlive.setupState.cache as KeepAliveCache;\n return cache.delete(key);\n}\n\n/**\n * 激活缓存的组件实例。\n */\nexport function activateInstance(instance: ComponentInternalInstance): void {\n instance.isDeactivated = false;\n // 如果定义了 activated 钩子则调用\n if (instance.type.activated) {\n instance.type.activated.call(instance.ctx);\n }\n if (instance.activatedHooks) {\n for (const hook of instance.activatedHooks) {\n try {\n hook();\n } catch (e) {\n handleError(e as Error, instance, 'activated hook');\n }\n }\n }\n}\n\n/**\n * 停用组件实例。\n */\nexport function deactivateInstance(instance: ComponentInternalInstance): void {\n instance.isDeactivated = true;\n // 如果定义了 deactivated 钩子则调用\n if (instance.type.deactivated) {\n instance.type.deactivated.call(instance.ctx);\n }\n if (instance.deactivatedHooks) {\n for (const hook of instance.deactivatedHooks) {\n try {\n hook();\n } catch (e) {\n handleError(e as Error, instance, 'deactivated hook');\n }\n }\n }\n}\n","// src/suspense.ts\n// Suspense 组件\n\nimport type { ComponentInternalInstance, ComponentOptions, SetupContext } from './types';\nimport { createComponentInstance, setupComponent } from './component';\nimport { ShapeFlags, createBaseVNode } from '@lytjs/common-vnode';\nimport type { VNode } from '@lytjs/common-vnode';\nimport { error, warn } from '@lytjs/common-error';\nimport { nextTick } from '@lytjs/common-scheduler';\nimport { registerSuspenseLinker } from '@lytjs/vdom';\n\n// ============================================================\n// 注册跨包的 suspense boundary 链接器\n// ============================================================\n\n// 此链接器将 vdom 层的 SuspenseBoundary 与 component 层的\n// SuspenseAsyncState 关联,使异步状态变化可以驱动 DOM 切换。\nlet _linkerRegistered = false;\nfunction ensureLinkerRegistered(): void {\n if (_linkerRegistered) return;\n _linkerRegistered = true;\n // FIX: DTS build error - SuspenseLinkerFn 参数类型是 unknown\n registerSuspenseLinker(((\n asyncState: SuspenseAsyncState,\n vnodeBoundary: SuspenseAsyncState['vnodeBoundary'],\n domSwitch: SuspenseAsyncState['domSwitch'],\n ) => {\n linkSuspenseBoundary(asyncState, vnodeBoundary, domSwitch);\n }) as (\n asyncState: unknown,\n vnodeBoundary: unknown,\n domSwitch: (boundary: unknown, toFallback: boolean) => void,\n ) => void);\n}\n\n// ==================== 类型定义 ====================\n\n/**\n * Suspense 边界被中止时抛出的错误。\n * 包含 pendingId 用于错误标识。\n */\nexport class SuspenseAbortedError extends Error {\n constructor(public pendingId: number) {\n super(`Suspense boundary (id: ${pendingId}) was aborted`);\n this.name = 'SuspenseAbortedError';\n }\n}\n\nexport interface SuspenseProps {\n timeout?: number;\n onResolve?: () => void;\n onPending?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport interface SuspenseAsyncState {\n isPending: boolean;\n error: Error | null;\n /** @deprecated 使用 pendingPromises 代替 */\n promise: Promise<unknown> | null;\n pendingPromises: Set<Promise<unknown>>;\n onResolve: (() => void)[];\n onPending: (() => void)[];\n onError: ((error: Error) => void)[];\n aborted: boolean;\n /**\n * 关联的 vdom 层 SuspenseBoundary 引用。\n * 当异步状态变化时,通过此引用驱动 DOM 切换。\n */\n vnodeBoundary?: {\n vnode: VNode;\n container: unknown;\n anchor: unknown;\n parentComponent: ComponentInternalInstance | null;\n isSVG: boolean;\n isInFallback: boolean;\n activeBranch: VNode | null;\n pendingBranch: VNode | null;\n };\n /**\n * DOM 切换函数,由 vdom 层的 patch 函数提供。\n * 用于在 pending/resolve 状态变化时执行实际的 DOM 操作。\n */\n domSwitch?: (boundary: SuspenseAsyncState, toFallback: boolean) => void;\n}\n\n// ==================== Suspense 组件 ====================\n\nexport const Suspense: ComponentOptions = {\n name: 'Suspense',\n\n props: {\n timeout: { type: Number, default: undefined },\n },\n\n setup(_props: Record<string, unknown>, _ctx: SetupContext) {\n // 确保跨包链接器已注册,以便 vdom 可以调用 linkSuspenseBoundary\n ensureLinkerRegistered();\n\n // __DEV__ mode: validate props types\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n const props = _props as SuspenseProps;\n if (props.timeout !== undefined && typeof props.timeout !== 'number') {\n warn(`[Suspense] Invalid prop: timeout should be a number, got ${typeof props.timeout}.`);\n }\n if (props.onResolve !== undefined && typeof props.onResolve !== 'function') {\n warn(\n `[Suspense] Invalid prop: onResolve should be a function, got ${typeof props.onResolve}.`,\n );\n }\n if (props.onPending !== undefined && typeof props.onPending !== 'function') {\n warn(\n `[Suspense] Invalid prop: onPending should be a function, got ${typeof props.onPending}.`,\n );\n }\n if (props.onError !== undefined && typeof props.onError !== 'function') {\n warn(`[Suspense] Invalid prop: onError should be a function, got ${typeof props.onError}.`);\n }\n }\n\n const boundary: SuspenseAsyncState = {\n isPending: false,\n error: null,\n promise: null,\n pendingPromises: new Set(),\n onResolve: [],\n onPending: [],\n onError: [],\n aborted: false,\n };\n\n const props = _props as SuspenseProps;\n if (props.onResolve) boundary.onResolve.push(props.onResolve);\n if (props.onPending) boundary.onPending.push(props.onPending);\n if (props.onError) boundary.onError.push(props.onError);\n\n return {\n boundary,\n } as Record<string, unknown>;\n },\n};\n\n// ==================== Suspense 辅助函数 ====================\n\n/**\n * 创建 Suspense 组件实例。\n */\nexport function createSuspenseInstance(\n props: SuspenseProps = {},\n parent: ComponentInternalInstance | null = null,\n): ComponentInternalInstance {\n const vnode: VNode = createBaseVNode({\n type: Suspense,\n props: {\n timeout: props.timeout,\n onResolve: props.onResolve,\n onPending: props.onPending,\n onError: props.onError,\n },\n shapeFlag: ShapeFlags.SUSPENSE | ShapeFlags.STATEFUL_COMPONENT,\n });\n\n const instance = createComponentInstance(vnode, parent);\n setupComponent(instance);\n return instance;\n}\n\n/**\n * 创建 suspense boundary 用于管理异步子组件。\n */\nexport function createSuspenseBoundary(): SuspenseAsyncState {\n return {\n isPending: false,\n error: null,\n promise: null,\n pendingPromises: new Set(),\n onResolve: [],\n onPending: [],\n onError: [],\n aborted: false,\n };\n}\n\n/**\n * Register an async child with the suspense boundary.\n * Returns true if this is the first pending child (transition to pending).\n */\nexport function registerAsyncChild(\n boundary: SuspenseAsyncState,\n promise: Promise<unknown>,\n): boolean {\n // FIX: P2-18 嵌套 suspense 支持:检查是否在嵌套 suspense 中\n // 如果当前 suspense 已被中止(可能是父级 suspense abort 导致),\n // 直接返回 false 避免无效操作\n if (boundary.aborted) return false;\n\n const wasPending = boundary.isPending;\n boundary.isPending = true;\n boundary.error = null;\n\n // 在集合中追踪此 Promise\n boundary.pendingPromises.add(promise);\n\n // 仅在第一个 pending 子组件时调用 onPending 回调\n if (!wasPending) {\n for (const cb of boundary.onPending) {\n cb();\n }\n // 触发 DOM 切换:显示 fallback slot\n if (boundary.domSwitch) {\n const switchFn = boundary.domSwitch;\n nextTick(() => {\n if (!boundary.aborted) {\n switchFn(boundary, true);\n }\n });\n }\n }\n\n promise\n .then((result: unknown) => {\n if (boundary.aborted) return;\n boundary.pendingPromises.delete(promise);\n // 当所有 Promise 都解析完成时,转换到 resolved 状态\n if (boundary.pendingPromises.size === 0) {\n boundary.isPending = false;\n boundary.promise = null;\n // 调用 onResolve 回调\n for (const cb of boundary.onResolve) {\n try {\n cb();\n } catch (e) {\n error(`Error in suspense resolve callback: ${String(e)}`);\n }\n }\n // 触发 DOM 切换:从 fallback 切回 default slot\n if (boundary.domSwitch) {\n const switchFn = boundary.domSwitch;\n nextTick(() => {\n if (!boundary.aborted) {\n switchFn(boundary, false);\n }\n });\n }\n }\n return result;\n })\n .catch((err: unknown) => {\n if (boundary.aborted) return;\n boundary.pendingPromises.delete(promise);\n const caughtError = err instanceof Error ? err : new Error(String(err));\n boundary.error = caughtError;\n // 当所有 Promise 都完成时,根据错误状态转换\n if (boundary.pendingPromises.size === 0) {\n boundary.isPending = false;\n boundary.promise = null;\n // 调用 onError 回调(P1-16 修复:之前错误地调用了 onPending)\n for (const cb of boundary.onError) {\n try {\n cb(caughtError);\n } catch (e) {\n error(`Error in suspense error callback: ${String(e)}`);\n }\n }\n }\n });\n\n return !wasPending;\n}\n\n/**\n * 检查 suspense boundary 当前是否处于 pending 状态。\n */\nexport function isSuspensePending(boundary: SuspenseAsyncState): boolean {\n return boundary.isPending;\n}\n\n/**\n * Get the error from a suspense boundary (if any).\n */\nexport function getSuspenseError(boundary: SuspenseAsyncState): Error | null {\n return boundary.error;\n}\n\n/**\n * 将 vdom 层的 SuspenseBoundary 与 component 层的 SuspenseAsyncState 关联。\n * 由 vdom 的 mountSuspense 调用,使异步状态变化能驱动 DOM 切换。\n */\nexport function linkSuspenseBoundary(\n asyncState: SuspenseAsyncState,\n vnodeBoundary: SuspenseAsyncState['vnodeBoundary'],\n domSwitch: SuspenseAsyncState['domSwitch'],\n): void {\n asyncState.vnodeBoundary = vnodeBoundary;\n asyncState.domSwitch = domSwitch;\n}\n\n/**\n * 手动解决 suspense boundary。\n *\n * FIX: P1-20 添加语义注释:\n * resolveSuspense 用于手动将 suspense 边界标记为已解决状态。\n * 调用后,所有 pending 的 Promise 将被忽略(通过设置 aborted = true),\n * onResolve 回调将被触发,DOM 将从 fallback 切回默认内容。\n * 注意:此方法不会等待正在进行的异步操作完成,而是立即强制解决。\n * 适用场景:用户手动取消等待、路由切换等需要立即恢复的场景。\n */\nexport function resolveSuspense(boundary: SuspenseAsyncState): void {\n boundary.isPending = false;\n boundary.aborted = true;\n boundary.promise = null;\n boundary.error = null;\n boundary.pendingPromises.clear();\n for (const cb of boundary.onResolve) {\n try {\n cb();\n } catch (e) {\n error(`Error in suspense resolve callback: ${String(e)}`);\n }\n }\n}\n\n/**\n * 中止 suspense boundary(例如在卸载时)。\n * 拒绝所有 pending 的 Promise 以防止内存泄漏,并允许\n * 下游消费者通过 .catch() 处理中止。\n *\n * FIX: P1-20 添加语义注释:\n * abortSuspense 用于在组件卸载等场景下中止 suspense 边界。\n * 与 resolveSuspense 不同,abortSuspense 不会触发 onResolve 回调,\n * 而是清空所有回调数组以防止后续调用。所有 pending 的 Promise\n * 将尝试通过 abort 方法取消(如果是自定义 thenable)。\n * 适用场景:组件卸载、路由切换导致组件树销毁等。\n */\nexport function abortSuspense(boundary: SuspenseAsyncState): void {\n boundary.aborted = true;\n boundary.isPending = false;\n boundary.promise = null;\n\n // 拒绝所有 pending 的 Promise 以防止内存泄漏。\n // 由于原生 JavaScript Promise 无法从外部拒绝,\n // 如果 Promise 是自定义 thenable,会尝试调用 abort 方法。\n // 对于原生 Promise,依赖 aborted 标志使\n // registerAsyncChild 中的 .then()/.catch() 回调跳过副作用。\n if (boundary.pendingPromises.size > 0) {\n // FIX: P2-33 使用实际 pendingId 标识中止的 suspense 边界,\n // 而非硬编码 pendingId=0,便于错误追踪和调试\n const abortError = new SuspenseAbortedError(boundary.pendingPromises.size);\n boundary.pendingPromises.forEach((promise) => {\n try {\n // 如果 Promise 有 abort 方法(自定义 thenable),调用它\n const p = promise as unknown as Record<string, unknown>;\n if (typeof p.abort === 'function') {\n p.abort(abortError);\n }\n } catch {\n // 忽略中止期间的错误\n }\n });\n boundary.pendingPromises.clear();\n }\n\n // 清空所有回调数组,防止 abort 后仍被调用导致内存泄漏或无效操作。\n // 使用 length = 0 方式清空数组,保持数组引用不变(避免影响外部持有的引用)。\n boundary.onResolve.length = 0;\n boundary.onPending.length = 0;\n boundary.onError.length = 0;\n}\n","// src/transition.ts\n// Transition 组件定义\n//\n// 泛型化重构:TransitionComponentProps 中的回调类型从 Element 改为泛型 HE。\n// 保留 TransitionComponentPropsLegacy 类型别名以确保向后兼容。\n\nimport type { ComponentOptions, SetupContext } from './types';\nimport type { VNode } from '@lytjs/vdom';\n\n// ==================== Transition Props ====================\n\n/**\n * Transition 组件属性(泛型版本)。\n * @template HE - 宿主元素类型\n */\nexport interface TransitionComponentProps<HE = unknown> {\n name?: string;\n appear?: boolean;\n mode?: 'in-out' | 'out-in' | 'default';\n enterFromClass?: string;\n enterActiveClass?: string;\n enterToClass?: string;\n leaveFromClass?: string;\n leaveActiveClass?: string;\n leaveToClass?: string;\n onBeforeEnter?: (el: HE) => void;\n onEnter?: (el: HE, done: () => void) => void;\n onAfterEnter?: (el: HE) => void;\n onEnterCancelled?: (el: HE) => void;\n onBeforeLeave?: (el: HE) => void;\n onLeave?: (el: HE, done: () => void) => void;\n onAfterLeave?: (el: HE) => void;\n onLeaveCancelled?: (el: HE) => void;\n}\n\n/**\n * @deprecated 使用 TransitionComponentProps<HE> 代替。\n * 保留此类型别名以确保向后兼容。\n */\nexport type TransitionComponentPropsLegacy = TransitionComponentProps<Element>;\n\n// ==================== Transition Component ====================\n\nexport const Transition: ComponentOptions = {\n name: 'Transition',\n\n props: {\n name: { type: String },\n appear: { type: Boolean, default: false },\n mode: { type: String, default: 'default' },\n enterFromClass: { type: String },\n enterActiveClass: { type: String },\n enterToClass: { type: String },\n leaveFromClass: { type: String },\n leaveActiveClass: { type: String },\n leaveToClass: { type: String },\n onBeforeEnter: { type: Function },\n onEnter: { type: Function },\n onAfterEnter: { type: Function },\n onEnterCancelled: { type: Function },\n onBeforeLeave: { type: Function },\n onLeave: { type: Function },\n onAfterLeave: { type: Function },\n onLeaveCancelled: { type: Function },\n },\n\n // FIX: P0-06 移除多余的 IIFE 包装和 as unknown as void 类型欺骗,\n // 直接返回渲染函数,让组件系统正确识别 setup 返回的渲染函数\n // FIX: DTS build error - 添加类型断言\n setup(_props: Record<string, unknown>, { slots }: SetupContext) {\n return (() => slots.default?.()) as unknown as () => VNode;\n },\n};\n","// src/transition-group.ts\n// TransitionGroup 组件定义\n//\n// 泛型化重构:TransitionGroupComponentProps 中的回调类型从 Element 改为泛型 HE。\n// 保留 TransitionGroupComponentPropsLegacy 类型别名以确保向后兼容。\n\nimport type { ComponentOptions, SetupContext } from './types';\nimport type { VNode } from '@lytjs/vdom';\n\n// ==================== TransitionGroup Props ====================\n\n/**\n * TransitionGroup 组件属性(泛型版本)。\n * @template HE - 宿主元素类型\n */\nexport interface TransitionGroupComponentProps<HE = unknown> {\n name?: string;\n appear?: boolean;\n tag?: string | false;\n moveClass?: string;\n enterFromClass?: string;\n enterActiveClass?: string;\n enterToClass?: string;\n leaveFromClass?: string;\n leaveActiveClass?: string;\n leaveToClass?: string;\n onBeforeEnter?: (el: HE) => void;\n onEnter?: (el: HE, done: () => void) => void;\n onAfterEnter?: (el: HE) => void;\n onEnterCancelled?: (el: HE) => void;\n onBeforeLeave?: (el: HE) => void;\n onLeave?: (el: HE, done: () => void) => void;\n onAfterLeave?: (el: HE) => void;\n onLeaveCancelled?: (el: HE) => void;\n}\n\n/**\n * @deprecated 使用 TransitionGroupComponentProps<HE> 代替。\n * 保留此类型别名以确保向后兼容。\n */\nexport type TransitionGroupComponentPropsLegacy = TransitionGroupComponentProps<Element>;\n\n// ==================== TransitionGroup Component ====================\n\nexport const TransitionGroup: ComponentOptions = {\n name: 'TransitionGroup',\n\n props: {\n name: { type: String },\n appear: { type: Boolean, default: false },\n tag: { type: [String, Boolean] as unknown as new () => string | boolean },\n moveClass: { type: String },\n enterFromClass: { type: String },\n enterActiveClass: { type: String },\n enterToClass: { type: String },\n leaveFromClass: { type: String },\n leaveActiveClass: { type: String },\n leaveToClass: { type: String },\n onBeforeEnter: { type: Function },\n onEnter: { type: Function },\n onAfterEnter: { type: Function },\n onEnterCancelled: { type: Function },\n onBeforeLeave: { type: Function },\n onLeave: { type: Function },\n onAfterLeave: { type: Function },\n onLeaveCancelled: { type: Function },\n },\n\n // FIX: DTS build error - 添加类型断言\n setup(_props: Record<string, unknown>, { slots }: SetupContext) {\n return (() => slots.default?.()) as unknown as () => VNode;\n },\n};\n","import type { ComponentOptions } from './types';\n\nexport interface TeleportProps {\n to: string | Element;\n disabled?: boolean;\n}\n\nexport const Teleport: ComponentOptions = {\n name: 'Teleport',\n // FIX: P1-21 定义正确的 props 类型替代 as any\n // FIX: DTS build error - 使用 any 避免 PropConstructor 类型不兼容\n // FIX: DTS build error - props 使用 any 类型\n props: {\n to: { type: [String, Object] as unknown as new (...args: unknown[]) => object, required: true },\n disabled: { type: Boolean, default: false },\n },\n setup() {\n // Teleport is handled by the vdom patch algorithm.\n // The actual Teleport logic (mounting to target, disabled handling)\n // lives in vdom's patch function (mountTeleport / patchTeleport).\n // FIX: P2-19 disabled 状态切换动画:\n // 当 disabled 属性在 true/false 之间切换时,vdom 层的 patchTeleport\n // 负责处理 DOM 节点的移动和过渡动画。组件层无需额外处理。\n },\n};\n","// src/error-boundary.ts\n// ErrorBoundary 组件,用于捕获和处理子组件中的错误\n\nimport type { ComponentOptions, RenderFunction } from './types';\nimport type { VNode as VNodeType } from '@lytjs/vdom';\nimport { onErrorCaptured, onMounted, onUnmounted } from './lifecycle';\nimport { ref } from '@lytjs/reactivity';\nimport { createVNode } from '@lytjs/vdom';\nimport { Text, Fragment } from '@lytjs/common-vnode';\nimport type { VNode } from '@lytjs/common-vnode';\n\n// FIX: P1-11 RUNTIME-NEW-01 - 异步错误捕获改进\n// FIX: P1-8 使用 Set 跟踪所有活跃的 ErrorBoundary 实例,\n// 避免后挂载实例覆盖前一个的单例问题\ninterface ActiveErrorBoundary {\n handler: (event: PromiseRejectionEvent) => void;\n}\n\nconst activeErrorBoundaries = new Set<ActiveErrorBoundary>();\nlet globalHandlerInstalled = false;\n\n// FIX: P2-18 提取全局处理器函数,以便正确移除监听器\nfunction globalUnhandledRejectionHandler(event: PromiseRejectionEvent): void {\n // 通知所有活跃的 ErrorBoundary 实例\n for (const eb of activeErrorBoundaries) {\n eb.handler(event);\n }\n}\n\nexport interface ErrorBoundaryProps {\n onError?: (error: Error, info: string) => void;\n fallback?: ComponentOptions;\n}\n\n// FIX: P2-35 类型守卫:检查 props 是否为 ErrorBoundaryProps\n// FIX: DTS build error - 添加索引签名\ninterface ErrorBoundaryPropsInternal extends ErrorBoundaryProps {\n capturePromiseRejections?: boolean;\n [key: string]: unknown;\n}\n\nfunction isErrorBoundaryProps(props: Record<string, unknown>): props is ErrorBoundaryPropsInternal {\n return props !== null && typeof props === 'object';\n}\n\nexport const ErrorBoundary: ComponentOptions = {\n name: 'ErrorBoundary',\n props: {\n onError: { type: Function },\n fallback: { type: Object },\n /** 是否捕获异步 Promise 错误 */\n capturePromiseRejections: { type: Boolean, default: false },\n },\n setup(props: Record<string, unknown>) {\n const error = ref<Error | null>(null);\n const hasError = ref(false);\n\n // FIX: P2-35 使用类型守卫替代重复的类型断言\n const typedProps = isErrorBoundaryProps(props) ? props : ({} as ErrorBoundaryPropsInternal);\n\n // 使用 onErrorCaptured 捕获子组件错误\n onErrorCaptured((err: Error, _instance: unknown, info: string) => {\n error.value = err;\n // FIX: DTS build error - 显式转换为 boolean\n (hasError as { value: boolean }).value = true;\n // FIX: P2-39 错误边界:添加更友好的错误处理\n // FIX: DTS build error - 类型断言\n (typedProps.onError as ((error: Error, info: string) => void) | undefined)?.(err, info);\n return false; // 阻止错误继续传播\n });\n\n // FIX: P1-11 RUNTIME-NEW-01 - 改进异步错误捕获\n // FIX: P1-8 使用 Set 跟踪所有活跃实例,unhandledrejection 事件通知所有实例\n let currentBoundary: ActiveErrorBoundary | null = null;\n\n onMounted(() => {\n if (typedProps.capturePromiseRejections && typeof window !== 'undefined') {\n currentBoundary = {\n handler: (event: PromiseRejectionEvent) => {\n // FIX: P2-40 错误信息不友好:改进错误消息\n const err =\n event.reason instanceof Error ? event.reason : new Error(String(event.reason));\n error.value = err;\n // FIX: DTS build error - 显式转换为 boolean\n (hasError as { value: boolean }).value = true;\n // FIX: DTS build error - 类型断言\n (typedProps.onError as ((error: Error, info: string) => void) | undefined)?.(\n err,\n 'unhandledrejection',\n );\n },\n };\n\n activeErrorBoundaries.add(currentBoundary);\n\n // 只安装一次全局 unhandledrejection 事件监听器\n if (!globalHandlerInstalled) {\n globalHandlerInstalled = true;\n window.addEventListener('unhandledrejection', globalUnhandledRejectionHandler);\n }\n }\n });\n\n onUnmounted(() => {\n if (currentBoundary) {\n activeErrorBoundaries.delete(currentBoundary);\n currentBoundary = null;\n // FIX: P2-18 当所有 ErrorBoundary 实例都被卸载时,移除全局监听器\n if (activeErrorBoundaries.size === 0 && globalHandlerInstalled) {\n globalHandlerInstalled = false;\n window.removeEventListener('unhandledrejection', globalUnhandledRejectionHandler);\n }\n }\n });\n\n const render: RenderFunction = (ctx): VNode => {\n if (hasError.value) {\n // 错误状态:如果提供了 fallback 插槽则渲染,否则渲染默认错误信息\n const fallbackSlot = ctx.$slots.fallback;\n if (fallbackSlot) {\n const result = fallbackSlot({ error: error.value });\n // FIX: P2-28 处理 fallback slot 返回单个 VNode(非数组)的情况\n if (!Array.isArray(result)) {\n return result as VNode;\n }\n if (result.length > 0) {\n // 使用 Fragment 包装插槽中的多个根节点\n if (result.length === 1) {\n return result[0] as VNode;\n }\n return createVNode(Fragment, null, result as VNode[]);\n }\n }\n // 默认错误 UI\n return createVNode(\n Text,\n null,\n error.value ? `Error: ${error.value.message}` : 'An error occurred',\n );\n }\n\n // 正常状态:渲染默认插槽(子组件)\n const defaultSlot = ctx.$slots.default;\n if (defaultSlot) {\n const result = defaultSlot();\n if (Array.isArray(result) && result.length > 0) {\n // 使用 Fragment 包装插槽中的多个根节点\n if (result.length === 1) {\n return result[0] as VNode;\n }\n return createVNode(Fragment, null, result as VNodeType[]);\n }\n }\n\n return createVNode(Text, null, '');\n };\n\n return { error, hasError, render };\n },\n};\n","// src/signal-state.ts\n// Signal 状态适配器,用于组件集成\n\nimport { signal, computedSignal } from '@lytjs/reactivity';\nimport type { Signal, ComputedSignal } from '@lytjs/reactivity';\n\n/**\n * 创建与组件协作的 Signal State\n */\nexport function createSignalState<T>(initialValue: T): Signal<T> {\n return signal(initialValue);\n}\n\n/**\n * 创建与组件协作的 Computed Signal State\n */\nexport function createComputedState<T>(getter: () => T): ComputedSignal<T> {\n return computedSignal(getter);\n}\n","// src/async-component.ts\n// 异步组件加载器(支持预加载)\n// FIX: P2-7 COMPONENT-NEW-04 - 异步组件加载与预加载支持\n\nimport type { ComponentOptions, ComponentInternalInstance } from './types';\nimport type { VNode, VNodeChildren } from '@lytjs/vdom';\n// FIX: DTS build error - 删除未使用的导入\n// import { createComponentInstance, setupComponent } from './component';\n// FIX: DTS build error - 统一从vdom 导入\nimport { ShapeFlags, createVNode, createCommentVNode } from '@lytjs/vdom';\nimport { isFunction } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport { getCurrentInstance, onBeforeUnmount } from './lifecycle';\n\n// ==================== 类型定义 ====================\n\n/**\n * 异步组件加载器函数类型\n */\nexport type AsyncComponentLoader<T = unknown> = () => Promise<T>;\n\n/**\n * 定义异步组件的选项\n */\nexport interface AsyncComponentOptions {\n /**\n * 返回 Promise 解析为组件的加载器函数\n */\n loader: AsyncComponentLoader<ComponentOptions>;\n\n /**\n * 异步组件加载时显示的组件\n */\n loadingComponent?: ComponentOptions;\n\n /**\n * 异步组件加载失败时显示的组件\n */\n errorComponent?: ComponentOptions;\n\n /**\n * 显示加载组件前的延迟时间(毫秒)\n * @default 200\n */\n delay?: number;\n\n /**\n * 异步组件加载的超时时间(毫秒)\n */\n timeout?: number;\n\n /**\n * 是否挂起组件渲染直到加载完成\n * @default false\n */\n suspensible?: boolean;\n\n /**\n * 异步组件加载失败时的错误处理器\n */\n onError?: (error: Error) => void;\n}\n\n/**\n * 异步组件加载的内部状态\n */\ninterface AsyncComponentState {\n loadedComponent: ComponentOptions | null;\n error: Error | null;\n isLoading: boolean;\n isLoaded: boolean;\n isError: boolean;\n loadingPromise: Promise<void> | null;\n}\n\n// ==================== 预加载注册表 ====================\n\n/**\n * 预加载组件的注册表\n * 将加载器函数映射到其预加载的组件 Promise\n */\nconst preloadedComponents = new WeakMap<AsyncComponentLoader, Promise<ComponentOptions>>();\n\n/**\n * 活跃的异步组件实例注册表\n * 用于跨重渲染追踪加载状态\n */\nconst asyncComponentStates = new WeakMap<ComponentInternalInstance, AsyncComponentState>();\n\n// ==================== 异步组件工厂 ====================\n\n/**\n * 定义一个异步组件,支持加载、错误和预加载功能。\n *\n * @example\n * ```ts\n * const AsyncComp = defineAsyncComponent({\n * loader: () => import('./MyComponent.vue'),\n * loadingComponent: LoadingSpinner,\n * errorComponent: ErrorDisplay,\n * delay: 200,\n * timeout: 3000,\n * });\n *\n * // Preload the component before it's needed\n * AsyncComp.preload();\n * ```\n */\nexport function defineAsyncComponent(\n options: AsyncComponentOptions | AsyncComponentLoader<ComponentOptions>,\n): ComponentOptions & { preload: () => Promise<void> } {\n // 规范化选项\n const normalizedOptions: AsyncComponentOptions = isFunction(options)\n ? { loader: options }\n : options;\n\n const {\n loader,\n loadingComponent,\n errorComponent,\n delay = 200,\n timeout,\n // FIX: DTS build error - suspensible 未使ç”?\n // suspensible = false,\n onError,\n } = normalizedOptions;\n\n let loadPromise: Promise<ComponentOptions> | null = null;\n\n /**\n * 加载异步组件\n */\n function load(): Promise<ComponentOptions> {\n // 如果有缓存的预加载 Promise 则直接返回\n if (preloadedComponents.has(loader)) {\n return preloadedComponents.get(loader)!;\n }\n\n // 如果正在加载中,返回现有的加载 Promise\n if (loadPromise) {\n return loadPromise;\n }\n\n // 创建新的加载 Promise\n loadPromise = loader()\n .then((comp) => {\n // 处理 ES 模块默认导出\n const resolvedComponent = (comp as { default?: ComponentOptions }).default || comp;\n\n // 缓存已加载的组件\n preloadedComponents.set(loader, Promise.resolve(resolvedComponent));\n\n return resolvedComponent;\n })\n .catch((err: unknown) => {\n loadPromise = null;\n const error = err instanceof Error ? err : new Error(String(err));\n\n if (onError) {\n onError(error);\n }\n\n throw error;\n });\n\n return loadPromise;\n }\n\n /**\n * Preload the async component before it's needed.\n * This allows eager loading of components that are likely to be needed soon.\n */\n function preload(): Promise<void> {\n if (preloadedComponents.has(loader)) {\n return Promise.resolve();\n }\n\n return load()\n .then(() => {\n // 预加载完成\n })\n .catch(() => {\n // 预加载错误静默处理 - 实际渲染时会处理\n });\n }\n\n // 创建异步组件包装器\n const AsyncComponentWrapper: ComponentOptions = {\n name: 'AsyncComponentWrapper',\n\n setup(_props: Record<string, unknown>, { slots }: { slots?: Record<string, unknown> }) {\n const instance = getCurrentInstance();\n\n // 获取或创建此实例的状态\n let state: AsyncComponentState;\n if (instance && asyncComponentStates.has(instance)) {\n state = asyncComponentStates.get(instance)!;\n } else {\n state = {\n loadedComponent: null,\n error: null,\n isLoading: false,\n isLoaded: false,\n isError: false,\n loadingPromise: null,\n };\n if (instance) {\n asyncComponentStates.set(instance, state);\n }\n }\n\n // 如果已加载,返回已加载的组件\n if (state.isLoaded && state.loadedComponent) {\n return () => renderLoadedComponent(state.loadedComponent!, slots);\n }\n\n // 如果发生错误,显示错误组件\n if (state.isError) {\n return () =>\n errorComponent\n ? createComponentVNode(errorComponent, { error: state.error })\n : createAsyncCommentVNode(' Async component error ');\n }\n\n // 如果尚未加载,开始加载\n if (!state.isLoading) {\n state.isLoading = true;\n\n // FIX: DTS build error - loadStartTime 未使ç”?\n // const loadStartTime = Date.now();\n\n state.loadingPromise = load()\n .then((comp) => {\n state.loadedComponent = comp;\n state.isLoaded = true;\n state.isLoading = false;\n\n // 触发重新渲染\n if (instance) {\n triggerComponentUpdate(instance);\n }\n })\n .catch((err: unknown) => {\n state.error = err instanceof Error ? err : new Error(String(err));\n state.isError = true;\n state.isLoading = false;\n\n // 触发重新渲染以显示错误\n if (instance) {\n triggerComponentUpdate(instance);\n }\n });\n\n // 处理超时\n // FIX: P2-38 超时定时器在组件卸载时通过 onScopeDispose 清理,\n // 避免组件卸载后定时器仍然触发导致无效操作和内存泄漏\n if (timeout !== undefined && timeout > 0) {\n const timeoutId = setTimeout(() => {\n if (!state.isLoaded && !state.isError) {\n state.error = new Error(`Async component loading timed out after ${timeout}ms`);\n state.isError = true;\n state.isLoading = false;\n\n if (instance) {\n triggerComponentUpdate(instance);\n }\n }\n }, timeout);\n\n // FIX: DTS build error - 使用 onBeforeUnmount 替代 onScopeDispose\n onBeforeUnmount(() => {\n clearTimeout(timeoutId);\n });\n }\n }\n\n // 加载中返回加载组件或占位符\n return () => {\n // 如果 delay 为 0 或组件已预加载,不显示加载状态\n if (delay === 0 && state.isLoading && !state.loadedComponent) {\n return createAsyncCommentVNode(' Async component loading ');\n }\n\n // 如果配置了加载组件则显示\n if (loadingComponent) {\n return createComponentVNode(loadingComponent, {});\n }\n\n return createAsyncCommentVNode(' Async component loading ');\n };\n },\n };\n\n // 将预加载方法附加到组件上\n return Object.assign(AsyncComponentWrapper, { preload });\n}\n\n// ==================== 辅助函数 ====================\n\n/**\n * 通过调用 instance.update() 触发组件更新。\n * 如果 instance.update 不可用,回退到基于 nextTick 的重新渲染。\n */\nfunction triggerComponentUpdate(instance: ComponentInternalInstance): void {\n if (instance.update) {\n instance.update();\n }\n}\n\n/**\n * 为组件创建 VNode\n */\nfunction createComponentVNode(component: ComponentOptions, props: Record<string, unknown>): VNode {\n return createVNode(component, props, null, ShapeFlags.STATEFUL_COMPONENT);\n}\n\n/**\n * 创建注释 VNode(本地辅助函数)\n * FIX: DTS build error - 重命名避免与导入的 createCommentVNode 冲突\n */\nfunction createAsyncCommentVNode(text: string): VNode {\n // FIX: DTS build error - 调用导入的 createCommentVNode\n return createCommentVNode(text);\n}\n\n/**\n * 渲染已加载的组件\n */\nfunction renderLoadedComponent(\n component: ComponentOptions,\n slots?: Record<string, unknown>,\n): VNode {\n // FIX: DTS build error - slots 类型断言\n return createVNode(component, {}, slots as VNodeChildren, ShapeFlags.STATEFUL_COMPONENT);\n}\n\n// ==================== 预加载工具函数 ====================\n\n/**\n * 一次性预加载多个异步组件。\n *\n * @example\n * ```ts\n * preloadComponents([\n * () => import('./CompA.vue'),\n * () => import('./CompB.vue'),\n * () => import('./CompC.vue'),\n * ]);\n * ```\n */\nexport function preloadComponents(loaders: AsyncComponentLoader[]): Promise<void> {\n return Promise.all(loaders.map((loader) => preloadComponent(loader))).then(() => {\n // 所有组件预加载完成\n });\n}\n\n/**\n * 通过加载器函数预加载单个组件。\n */\nexport function preloadComponent(loader: AsyncComponentLoader): Promise<void> {\n if (preloadedComponents.has(loader)) {\n return Promise.resolve();\n }\n\n return (loader() as Promise<ComponentOptions>)\n .then((comp) => {\n const resolvedComponent = (comp as { default?: ComponentOptions }).default || comp;\n preloadedComponents.set(loader, Promise.resolve(resolvedComponent));\n })\n .catch(() => {\n // 预加载错误静默处理\n });\n}\n\n/**\n * 检查组件是否已被预加载。\n */\nexport function isComponentPreloaded(loader: AsyncComponentLoader): boolean {\n return preloadedComponents.has(loader);\n}\n\n/**\n * 清除特定加载器或所有加载器的预加载缓存。\n */\nexport function clearPreloadCache(loader?: AsyncComponentLoader): void {\n if (loader) {\n preloadedComponents.delete(loader);\n } else {\n // 注意:WeakMap 无法完全清空\n // 如果需要完全清空,应改用 Map\n if (__DEV__) {\n warn(\n 'clearPreloadCache() without arguments is not supported with WeakMap. ' +\n 'Pass a specific loader to clear, or consider using a Map instead.',\n );\n }\n }\n}\n\n// ==================== 导出类型 ====================\n\nexport type { AsyncComponentState };\n","// packages/component/src/di/index.ts\n// 依赖注入增强模块\n// Phase 1.8-1.11: 多级 Provider、可选注入、InjectionToken、生命周期管理\n\nimport { hasOwn } from '@lytjs/common-is';\nimport { getCurrentInstance } from '../lifecycle';\nimport { effectScope } from '@lytjs/reactivity';\nimport type { EffectScope } from '@lytjs/reactivity';\n\n// ============================================================\n// Phase 1.10: InjectionToken - 类型安全的注入令牌\n// ============================================================\n\n/**\n * InjectionToken - 类型安全的注入令牌\n *\n * 与 InjectionKey 不同,InjectionToken 是一个类实例,\n * 可以携带更多元数据(如描述、工厂函数、生命周期等)\n *\n * @example\n * ```ts\n * const API_URL = new InjectionToken<string>('api-url');\n * const Database = new InjectionToken<Database>('database', {\n * factory: () => new Database(),\n * lifecycle: 'singleton',\n * });\n * ```\n */\nexport class InjectionToken<T> {\n /** 令牌描述 */\n readonly description: string;\n /** 令牌唯一标识 */\n readonly __token: symbol;\n /** 工厂函数 */\n readonly factory?: () => T;\n /** 生命周期 */\n readonly lifecycle?: ProviderLifecycle;\n\n constructor(\n description: string,\n options?: {\n factory?: () => T;\n lifecycle?: ProviderLifecycle;\n },\n ) {\n this.description = description;\n this.__token = Symbol(description);\n this.factory = options?.factory;\n this.lifecycle = options?.lifecycle;\n }\n\n toString(): string {\n return `InjectionToken(${this.description})`;\n }\n}\n\n/**\n * 判断是否是 InjectionToken\n */\nexport function isInjectionToken(value: unknown): value is InjectionToken<unknown> {\n return value instanceof InjectionToken;\n}\n\n// ============================================================\n// Phase 1.11: 生命周期管理\n// ============================================================\n\n/** Provider 生命周期类型 */\nexport type ProviderLifecycle = 'singleton' | 'scoped' | 'transient';\n\n/** Provider 配置 */\nexport interface ProviderConfig<T = unknown> {\n /** 提供的值 */\n provide?: T;\n /** 工厂函数 */\n useFactory?: () => T;\n /** 现有令牌别名 */\n useExisting?: InjectionToken<T> | string | symbol;\n /** 生命周期 */\n lifecycle?: ProviderLifecycle;\n /** 是否可选 */\n optional?: boolean;\n}\n\n/** Provider 记录 */\ninterface ProviderRecord {\n value: unknown;\n lifecycle: ProviderLifecycle;\n scope?: EffectScope;\n instanceId?: symbol;\n}\n\n// ============================================================\n// Phase 1.8: 多级 Provider\n// ============================================================\n\n/**\n * Provider 树节点\n * 支持嵌套的 Provider 层级结构\n */\nexport interface ProviderNode {\n /** 唯一标识 */\n id: symbol;\n /** 父节点 */\n parent: ProviderNode | null;\n /** 子节点 */\n children: Set<ProviderNode>;\n /** 提供的值 */\n providers: Map<string | symbol, ProviderRecord>;\n /** 作用域 */\n scope: EffectScope;\n}\n\n/** 全局 Provider 根节点 */\nlet globalProviderRoot: ProviderNode | null = null;\n\n/** 当前 Provider 上下文 */\nlet currentProviderNode: ProviderNode | null = null;\n\n/**\n * 创建 Provider 节点\n */\nfunction createProviderNode(parent: ProviderNode | null = null): ProviderNode {\n const node: ProviderNode = {\n id: Symbol('provider-node'),\n parent,\n children: new Set(),\n providers: new Map(),\n scope: effectScope(),\n };\n\n if (parent) {\n parent.children.add(node);\n }\n\n return node;\n}\n\n/**\n * 获取或创建全局 Provider 根节点\n */\nexport function getProviderRoot(): ProviderNode {\n if (!globalProviderRoot) {\n globalProviderRoot = createProviderNode();\n }\n return globalProviderRoot;\n}\n\n/**\n * 进入新的 Provider 作用域\n */\nexport function enterProviderScope(): ProviderNode {\n const parent = currentProviderNode || getProviderRoot();\n currentProviderNode = createProviderNode(parent);\n return currentProviderNode;\n}\n\n/**\n * 退出当前 Provider 作用域\n */\nexport function exitProviderScope(): void {\n if (currentProviderNode && currentProviderNode.parent) {\n currentProviderNode.scope.stop();\n currentProviderNode.parent.children.delete(currentProviderNode);\n currentProviderNode = currentProviderNode.parent;\n }\n}\n\n/**\n * 获取当前 Provider 节点\n */\nexport function getCurrentProviderNode(): ProviderNode | null {\n return currentProviderNode;\n}\n\n// ============================================================\n// Phase 1.9: 可选注入\n// ============================================================\n\n/**\n * 增强的 Inject 选项\n */\nexport interface EnhancedInjectOptions<T = unknown> {\n /** 是否可选(找不到时不报错) */\n optional?: boolean;\n /** 默认值 */\n default?: T | (() => T);\n /** 从特定祖先查找 */\n from?: InjectionToken<T> | string | symbol;\n /** 是否仅查找当前层级 */\n local?: boolean;\n /** 是否跳过自身(仅查找祖先) */\n skipSelf?: boolean;\n}\n\n/**\n * 注入错误\n */\nexport class InjectionError extends Error {\n constructor(\n public token: string | symbol,\n message: string,\n ) {\n super(`Injection error for token \"${String(token)}\": ${message}`);\n this.name = 'InjectionError';\n }\n}\n\n// ============================================================\n// 核心 API\n// ============================================================\n\n/**\n * 提供值到当前 Provider 作用域\n *\n * @example\n * ```ts\n * // 简单值\n * provide('api-url', 'https://api.example.com');\n *\n * // 使用 InjectionToken\n * const API_URL = new InjectionToken<string>('api-url');\n * provide(API_URL, 'https://api.example.com');\n *\n * // 使用配置对象\n * provide(API_URL, {\n * useFactory: () => config.apiUrl,\n * lifecycle: 'singleton',\n * });\n * ```\n */\nexport function provide<T>(\n key: InjectionToken<T> | string | symbol,\n valueOrConfig: T | ProviderConfig<T>,\n): void {\n const instance = getCurrentInstance();\n const providerNode = currentProviderNode || (instance ? null : getProviderRoot());\n\n // 解析 key\n const actualKey = isInjectionToken(key) ? key.__token : key;\n\n // 解析配置\n let record: ProviderRecord;\n\n if (isProviderConfig(valueOrConfig)) {\n const config = valueOrConfig;\n const lifecycle = config.lifecycle || 'singleton';\n\n if (config.provide !== undefined) {\n record = {\n value: config.provide,\n lifecycle,\n };\n } else if (config.useFactory) {\n record = {\n value: config.useFactory(),\n lifecycle,\n };\n } else if (config.useExisting) {\n // 延迟解析 useExisting\n record = {\n value: () => inject(config.useExisting!),\n lifecycle,\n };\n } else {\n throw new InjectionError(\n actualKey,\n 'ProviderConfig must have provide, useFactory, or useExisting',\n );\n }\n } else {\n record = {\n value: valueOrConfig,\n lifecycle: 'singleton',\n };\n }\n\n // 存储到适当的位置\n if (instance) {\n // 组件实例级别\n if (instance.provides === (instance.parent?.provides ?? null)) {\n instance.provides = Object.create(\n instance.provides as Record<string | symbol, unknown>,\n ) as Record<string | symbol, unknown>;\n }\n instance.provides[actualKey as string | symbol] = record.value;\n } else if (providerNode) {\n // Provider 节点级别\n providerNode.providers.set(actualKey, record);\n }\n}\n\n/**\n * 从 Provider 作用域注入值\n *\n * @example\n * ```ts\n * // 简单注入\n * const apiUrl = inject('api-url');\n *\n * // 使用 InjectionToken\n * const apiUrl = inject(API_URL);\n *\n * // 可选注入\n * const logger = inject(LOGGER, { optional: true });\n *\n * // 带默认值\n * const timeout = inject(TIMEOUT, { default: 5000 });\n * ```\n */\nexport function inject<T>(\n key: InjectionToken<T> | string | symbol,\n options?: EnhancedInjectOptions<T>,\n): T | undefined {\n const instance = getCurrentInstance();\n const providerNode = currentProviderNode;\n\n // 解析 key\n const actualKey = isInjectionToken(key) ? key.__token : key;\n const lookupKey = options?.from\n ? isInjectionToken(options.from)\n ? options.from.__token\n : options.from\n : actualKey;\n\n // 1. 检查组件实例级别\n if (instance) {\n const result = injectFromInstance(instance, lookupKey, options);\n if (result !== undefined) {\n return result as T;\n }\n }\n\n // 2. 检查 Provider 节点级别\n if (providerNode) {\n const result = injectFromProviderNode(providerNode, lookupKey, options);\n if (result !== undefined) {\n return result as T;\n }\n }\n\n // 3. 检查全局 Provider 根节点\n if (globalProviderRoot) {\n const result = injectFromProviderNode(globalProviderRoot, lookupKey, options);\n if (result !== undefined) {\n return result as T;\n }\n }\n\n // 4. 检查 InjectionToken 的默认工厂\n if (isInjectionToken(key) && key.factory) {\n return key.factory();\n }\n\n // 5. 返回默认值或抛出错误\n if (options?.default !== undefined) {\n return typeof options.default === 'function' ? (options.default as () => T)() : options.default;\n }\n\n if (!options?.optional) {\n throw new InjectionError(actualKey, 'No provider found');\n }\n\n return undefined;\n}\n\n/**\n * 从组件实例注入\n */\nfunction injectFromInstance(\n instance: Record<string, unknown>,\n key: string | symbol,\n options?: EnhancedInjectOptions,\n): unknown {\n if (options?.local) {\n const provides = instance.provides as Record<string | symbol, unknown>;\n const hasOwnProvides = instance.parent ? provides !== instance.parent.provides : true;\n if (hasOwnProvides && hasOwn(provides, key as string)) {\n return provides[key];\n }\n return undefined;\n }\n\n if (!options?.skipSelf) {\n const provides = instance.provides as Record<string | symbol, unknown>;\n if ((key as string | symbol) in provides) {\n return provides[key];\n }\n }\n\n // 向上查找\n let current = options?.skipSelf ? instance.parent : instance.parent;\n while (current) {\n const provides = current.provides as Record<string | symbol, unknown>;\n if ((key as string | symbol) in provides) {\n return provides[key];\n }\n current = current.parent;\n }\n\n return undefined;\n}\n\n/**\n * 从 Provider 节点注入\n */\nfunction injectFromProviderNode(\n node: ProviderNode,\n key: string | symbol,\n options?: EnhancedInjectOptions,\n): unknown {\n // 检查当前节点\n if (!options?.skipSelf) {\n const record = node.providers.get(key);\n if (record) {\n if (typeof record.value === 'function' && record.lifecycle === 'transient') {\n return (record.value as () => unknown)();\n }\n return record.value;\n }\n }\n\n // 向上查找父节点\n let current = options?.skipSelf ? node.parent : node.parent;\n while (current) {\n const record = current.providers.get(key);\n if (record) {\n if (typeof record.value === 'function' && record.lifecycle === 'transient') {\n return (record.value as () => unknown)();\n }\n return record.value;\n }\n current = current.parent;\n }\n\n return undefined;\n}\n\n/**\n * 检查是否是 ProviderConfig\n */\nfunction isProviderConfig<T>(value: unknown): value is ProviderConfig<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n ('provide' in value || 'useFactory' in value || 'useExisting' in value || 'lifecycle' in value)\n );\n}\n\n// ============================================================\n// 便捷 API\n// ============================================================\n\n/**\n * 创建并注册一个单例 Provider\n */\nexport function provideSingleton<T>(\n key: InjectionToken<T> | string | symbol,\n factory: () => T,\n): void {\n provide(key, {\n useFactory: factory,\n lifecycle: 'singleton',\n });\n}\n\n/**\n * 创建并注册一个作用域 Provider\n */\nexport function provideScoped<T>(key: InjectionToken<T> | string | symbol, factory: () => T): void {\n provide(key, {\n useFactory: factory,\n lifecycle: 'scoped',\n });\n}\n\n/**\n * 创建并注册一个临时 Provider\n */\nexport function provideTransient<T>(\n key: InjectionToken<T> | string | symbol,\n factory: () => T,\n): void {\n provide(key, {\n useFactory: factory,\n lifecycle: 'transient',\n });\n}\n\n/**\n * 批量注册 Providers\n */\nexport function provideAll(\n providers: Array<{\n provide: InjectionToken<unknown> | string | symbol;\n useValue?: unknown;\n useFactory?: () => unknown;\n useExisting?: InjectionToken<unknown> | string | symbol;\n lifecycle?: ProviderLifecycle;\n }>,\n): void {\n for (const provider of providers) {\n const { provide: key, useValue, useFactory, useExisting, lifecycle } = provider;\n provide(key, {\n provide: useValue,\n useFactory,\n useExisting,\n lifecycle,\n } as ProviderConfig);\n }\n}\n\n/**\n * 创建一个 Provider 作用域并执行回调\n */\nexport function withProviderScope<T>(fn: () => T): T {\n const node = enterProviderScope();\n try {\n return node.scope.run(fn) as T;\n } finally {\n exitProviderScope();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/props.ts","../src/lifecycle.ts","../src/emit.ts","../src/slots.ts","../src/component-options.ts","../src/component-proxy.ts","../src/component-init.ts","../src/component-setup.ts","../src/component-inject.ts","../src/keep-alive.ts","../src/suspense.ts","../src/transition.ts","../src/transition-group.ts","../src/teleport.ts","../src/error-boundary.ts","../src/signal-state.ts","../src/async-component.ts","../src/di/index.ts"],"names":["EMPTY_OBJ","isArray","result","hasOwn","isFunction","isString","isNumber","isBoolean","isObject","kebabToCamel","isNullish","globalProperties","nextTick","reactive","computed","watch","NOOP","isPromise","createCommentVNode","ShapeFlags","createVNode","registerSuspenseLinker","createBaseVNode","error","ref","Fragment","Text","signal","computedSignal","effectScope","provide","inject"],"mappings":"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","file":"index.cjs","sourcesContent":["// src/props.ts\n// Props 处理 - 验证、规范化、默认值\n\nimport {\n isString,\n isNumber,\n isBoolean,\n isObject,\n isArray,\n isFunction,\n hasOwn,\n EMPTY_OBJ,\n} from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport type { PropOptions } from './types';\nimport type { ComponentInternalInstance } from './types';\n\n/**\n * 将 props 定义规范化为统一的 Record<string, PropOptions> 格式。\n * 处理数组形式的 props(如 ['a', 'b'])和对象形式的 props。\n */\nexport function normalizePropsOptions(\n rawProps?: Record<string, PropOptions> | string[],\n): Record<string, PropOptions> {\n if (!rawProps) return EMPTY_OBJ as Record<string, PropOptions>;\n\n if (isArray(rawProps)) {\n // 数组形式:['foo', 'bar'] => { foo: {}, bar: {} }\n const result: Record<string, PropOptions> = {};\n for (let i = 0; i < rawProps.length; i++) {\n const key = rawProps[i]!;\n result[key] = {};\n }\n return result;\n }\n\n // 对象形式:规范化每个条目\n const result: Record<string, PropOptions> = {};\n for (const key in rawProps) {\n if (hasOwn(rawProps, key)) {\n const value = rawProps[key]!;\n result[key] = (isFunction(value) || isArray(value) ? { type: value } : value) as PropOptions;\n }\n }\n return result;\n}\n\n/**\n * 解析 prop 值,处理默认值和类型检查。\n * 处理缺失 prop 的布尔类型转换。\n */\nexport function resolvePropValue<T = unknown>(\n propOptions: PropOptions,\n value: unknown,\n _instance?: ComponentInternalInstance,\n key?: string,\n): T | undefined {\n const { type, default: defaultValue, required, validator } = propOptions;\n\n // 如果值缺失(undefined)且有默认值,使用默认值\n if (value === undefined) {\n // FIX: P1-10 先检查 defaultValue,再处理 Boolean 类型\n // 如果存在默认值,优先使用默认值(包括 Boolean 类型的 default: true)\n if (defaultValue !== undefined) {\n let def: unknown;\n if (isFunction(defaultValue)) {\n try {\n def = defaultValue();\n } catch (e) {\n if (__DEV__) {\n warn(`Failed to resolve default value for prop \"${key}\": ${(e as Error).message}`);\n }\n def = undefined;\n }\n } else {\n def = defaultValue;\n }\n return def as T | undefined;\n }\n // 布尔类型转换:如果类型为 Boolean 且无默认值,默认为 false\n // 类型断言 `Boolean as unknown` 是必要的,因为 PropOptions.type 的类型\n // 为 Constructor | Constructor[],而 Boolean 构造函数需要通过 unknown 中间\n // 类型才能与数组元素类型兼容\n if (type === Boolean || (isArray(type) && type.includes(Boolean as unknown))) {\n return false as T | undefined;\n }\n // 检查必填 prop\n if (required && __DEV__) {\n warn(`Missing required prop: \"${key}\"`);\n }\n return undefined;\n }\n\n // 类型验证\n if (type !== undefined && __DEV__) {\n validateType(value, type, key);\n }\n\n // 自定义验证器\n if (validator && __DEV__) {\n if (!validator(value)) {\n warn(\n `Prop validation failed for prop \"${key}\": received ${(() => {\n try {\n return JSON.stringify(value);\n } catch {\n return '[object Object]';\n }\n })()}`,\n );\n }\n }\n\n return value as T | undefined;\n}\n\n/**\n * 根据类型或类型数组验证值。\n */\nexport function validateType(value: unknown, type: unknown, key?: string): boolean {\n if (type === null || type === undefined) return true;\n\n let expectedType: string;\n const actualType = getTypeName(value);\n\n if (isArray(type)) {\n // 类型数组 - 值必须至少匹配其中一个\n for (let i = 0; i < type.length; i++) {\n // type[i] 的静态类型为 unknown,需要断言为 PropTypeConstructor 以调用 checkType\n if (checkType(value, type[i]! as PropTypeConstructor)) return true;\n }\n expectedType = type.map((t) => getTypeName(t)).join(' | ');\n } else {\n if (checkType(value, type as PropTypeConstructor)) return true;\n expectedType = getTypeName(type);\n }\n\n if (__DEV__) {\n const keyInfo = key ? ` \"${key}\"` : '';\n warn(\n `Invalid prop${keyInfo}: expected type ${expectedType}, got ${actualType}.` +\n (value !== null && value !== undefined\n ? ` (value: ${(() => {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n })()})`\n : ''),\n );\n }\n\n return false;\n}\n\n/** Prop 类型构造器 */\ntype PropTypeConstructor = (new (...args: unknown[]) => unknown) | { (): unknown };\n\nfunction checkType(value: unknown, type: PropTypeConstructor | PropTypeConstructor[]): boolean {\n if (type === String) return isString(value);\n if (type === Number) return isNumber(value);\n if (type === Boolean) return isBoolean(value);\n if (type === Object) return isObject(value) && !isArray(value);\n if (type === Array) return isArray(value);\n if (type === Function) return isFunction(value);\n return false;\n}\n\nfunction getTypeName(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (isArray(value)) return 'Array';\n if (isString(value)) return 'String';\n if (isNumber(value)) return 'Number';\n if (isBoolean(value)) return 'Boolean';\n if (isFunction(value)) return 'Function';\n if (isObject(value)) return 'Object';\n return String(value);\n}\n","// src/lifecycle.ts\n// 生命周期钩子管理\n//\n// FIX: P2-16 生命周期钩子调用次序文档:\n// 组件生命周期钩子的调用次序如下:\n//\n// 创建阶段:\n// 1. beforeCreate(仅 Options API,setup 之前)\n// 2. setup()(Composition API)\n// 3. created(仅 Options API,setup 之后)\n//\n// 挂载阶段:\n// 4. onBeforeMount / beforeMount\n// 5. onMounted / mounted(子组件先挂载,父组件后挂载)\n//\n// 更新阶段:\n// 6. onBeforeUpdate / beforeUpdate\n// 7. onUpdated / updated(子组件先更新,父组件后更新)\n//\n// 卸载阶段:\n// 8. onBeforeUnmount / beforeUnmount(父组件先卸载,子组件后卸载)\n// 9. onUnmounted / unmounted\n//\n// 特殊钩子:\n// - errorCaptured:在子组件错误冒泡时调用(从子到父)\n// - renderTracked / renderTriggered:在渲染函数依赖追踪/触发时调用\n// - activated / deactivated:KeepAlive 组件激活/停用时调用\n\nimport type { ComponentInternalInstance, ComponentPublicInstance } from './types';\nimport { warnOnce } from '@lytjs/common-error';\nimport type { DebuggerEvent } from '@lytjs/shared-types';\n\n// 当前正在 setup 的实例(用于生命周期钩子注册)\nlet currentInstance: ComponentInternalInstance | null = null;\n\n// FIX: P1-8 COMPONENT-NEW-02 - 生命周期钩子调用顺序跟踪\n// 用于在开发模式下验证生命周期钩子调用顺序\nconst lifecycleCallOrder = new WeakMap<ComponentInternalInstance, Set<string>>();\n\n/**\n * 断言生命周期钩子调用顺序正确\n * 确保 onBeforeMount 在 onMounted 之前调用等\n */\nfunction assertLifecycleOrder(\n instance: ComponentInternalInstance,\n currentHook: string,\n requiredPrevHooks?: string[],\n): void {\n if (!__DEV__) return;\n\n let calledHooks = lifecycleCallOrder.get(instance);\n if (!calledHooks) {\n calledHooks = new Set();\n lifecycleCallOrder.set(instance, calledHooks);\n }\n\n // 检查前置钩子是否已调用\n if (requiredPrevHooks) {\n for (const requiredHook of requiredPrevHooks) {\n if (!calledHooks.has(requiredHook)) {\n warnOnce(\n `Lifecycle hook \"${currentHook}\" was called before \"${requiredHook}\". ` +\n `Expected order: ${requiredPrevHooks.join(' -> ')} -> ${currentHook}`,\n );\n }\n }\n }\n\n calledHooks.add(currentHook);\n}\n\n/**\n * 设置当前实例(在 setup 期间使用)。\n */\nexport function setCurrentInstance(instance: ComponentInternalInstance | null): void {\n currentInstance = instance;\n}\n\n/**\n * 获取当前实例。\n */\nexport function getCurrentInstance(): ComponentInternalInstance | null {\n return currentInstance;\n}\n\n/**\n * 在当前实例上注册生命周期钩子。\n */\nfunction registerLifecycleHook(\n instance: ComponentInternalInstance,\n hookName: 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeUnmount' | 'unmounted',\n fn: (...args: unknown[]) => void,\n): void {\n if (instance) {\n instance.lifecycle[hookName].add(fn);\n }\n}\n\n// ==================== 公共生命周期 API ====================\n\n/**\n * 注册组件挂载完成后调用的回调。\n */\nexport function onMounted(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'mounted', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onMounted was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册组件更新完成后调用的回调。\n */\nexport function onUpdated(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'updated', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onUpdated was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册组件卸载后调用的回调。\n */\nexport function onUnmounted(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'unmounted', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onUnmounted was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * Register a callback to be called before the component is mounted.\n */\nexport function onBeforeMount(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'beforeMount', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onBeforeMount was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册组件更新前调用的回调。\n */\nexport function onBeforeUpdate(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'beforeUpdate', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onBeforeUpdate was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册组件卸载前调用的回调。\n */\nexport function onBeforeUnmount(fn: () => void): void {\n if (currentInstance) {\n registerLifecycleHook(currentInstance, 'beforeUnmount', fn);\n } else if (__DEV__) {\n warnOnce(\n 'onBeforeUnmount was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册错误捕获回调。\n * 使用数组收集每个实例的多个回调。\n */\nexport function onErrorCaptured(\n fn: (err: Error, instance: ComponentPublicInstance | null, info: string) => boolean | void,\n): void {\n if (currentInstance) {\n if (!currentInstance.errorCapturedHooks) {\n currentInstance.errorCapturedHooks = [];\n }\n currentInstance.errorCapturedHooks.push(fn);\n } else if (__DEV__) {\n // 开发模式下警告:onErrorCaptured 必须在 setup 期间调用\n warnOnce(\n 'onErrorCaptured was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n}\n\n/**\n * 注册组件被 KeepAlive 激活时调用的回调。\n */\nexport function onActivated(fn: () => void): void {\n if (currentInstance) {\n if (!currentInstance.activatedHooks) {\n currentInstance.activatedHooks = [];\n }\n currentInstance.activatedHooks.push(fn);\n }\n}\n\n/**\n * 注册组件被 KeepAlive 停用时调用的回调。\n */\nexport function onDeactivated(fn: () => void): void {\n if (currentInstance) {\n if (!currentInstance.deactivatedHooks) {\n currentInstance.deactivatedHooks = [];\n }\n currentInstance.deactivatedHooks.push(fn);\n }\n}\n\n/**\n * 注册渲染期间追踪响应式依赖时调用的回调。\n * 仅在开发模式下生效。\n */\nexport function onRenderTracked(fn: (e: DebuggerEvent) => void): void {\n if (__DEV__) {\n if (currentInstance) {\n if (!currentInstance.renderTrackedHooks) {\n currentInstance.renderTrackedHooks = [];\n }\n currentInstance.renderTrackedHooks.push(fn);\n } else {\n warnOnce(\n 'onRenderTracked was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n }\n}\n\n/**\n * 注册渲染期间触发响应式依赖时调用的回调。\n * 仅在开发模式下生效。\n */\nexport function onRenderTriggered(fn: (e: DebuggerEvent) => void): void {\n if (__DEV__) {\n if (currentInstance) {\n if (!currentInstance.renderTriggeredHooks) {\n currentInstance.renderTriggeredHooks = [];\n }\n currentInstance.renderTriggeredHooks.push(fn);\n } else {\n warnOnce(\n 'onRenderTriggered was called when there is no active component instance. ' +\n 'Make sure to call this function inside setup().',\n );\n }\n }\n}\n\n// ==================== 生命周期调用 ====================\n\n/**\n * 安全地调用选项式 API 生命周期钩子(带错误处理)。\n */\nfunction callOptionsHook(\n instance: ComponentInternalInstance,\n hook: ((...args: unknown[]) => void) | undefined,\n name: string,\n): void {\n if (hook) {\n try {\n hook.call(instance.ctx);\n } catch (err) {\n handleError(err as Error, instance, `${name} hook`);\n }\n }\n}\n\n/**\n * Call all registered hooks for a given lifecycle phase.\n */\nexport function callLifecycleHook(\n instance: ComponentInternalInstance,\n hookName: 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeUnmount' | 'unmounted',\n): void {\n const hooks = instance.lifecycle[hookName];\n if (hooks.size > 0) {\n for (const hook of hooks) {\n try {\n hook();\n } catch (err) {\n handleError(err as Error, instance, hookName);\n }\n }\n }\n}\n\n/**\n * 调用 beforeCreate 和 created 生命周期钩子(选项式 API)。\n */\nexport function callCreatedHook(instance: ComponentInternalInstance): void {\n const { beforeCreate, created } = instance.type;\n callOptionsHook(instance, beforeCreate, 'beforeCreate');\n callOptionsHook(instance, created, 'created');\n}\n\n/**\n * 调用 beforeMount 和 mounted 生命周期钩子(选项式 API)。\n */\nexport function callMountedHook(instance: ComponentInternalInstance): void {\n // FIX: P1-8 COMPONENT-NEW-02 - 添加生命周期调用顺序断言\n assertLifecycleOrder(instance, 'beforeMount', []);\n\n const { beforeMount, mounted } = instance.type;\n callLifecycleHook(instance, 'beforeMount');\n callOptionsHook(instance, beforeMount, 'beforeMount');\n\n // FIX: P1-8 - 确保 onBeforeMount 在 onMounted 之前调用\n assertLifecycleOrder(instance, 'mounted', ['beforeMount']);\n\n callLifecycleHook(instance, 'mounted');\n callOptionsHook(instance, mounted, 'mounted');\n instance.isMounted = true;\n}\n\n/**\n * 调用 beforeUpdate 和 updated 生命周期钩子(选项式 API)。\n */\nexport function callUpdatedHook(instance: ComponentInternalInstance): void {\n // FIX: P1-8 COMPONENT-NEW-02 - 添加生命周期调用顺序断言\n // 确保组件已挂载后才能调用更新钩子\n if (__DEV__ && !instance.isMounted) {\n warnOnce(\n `Lifecycle hook \"beforeUpdate\" was called before the component was mounted. ` +\n `Expected order: mounted -> beforeUpdate -> updated`,\n );\n }\n assertLifecycleOrder(instance, 'beforeUpdate', ['mounted']);\n\n const { beforeUpdate, updated } = instance.type;\n callLifecycleHook(instance, 'beforeUpdate');\n callOptionsHook(instance, beforeUpdate, 'beforeUpdate');\n\n // FIX: P1-8 - 确保 onBeforeUpdate 在 onUpdated 之前调用\n assertLifecycleOrder(instance, 'updated', ['beforeUpdate', 'mounted']);\n\n callLifecycleHook(instance, 'updated');\n callOptionsHook(instance, updated, 'updated');\n}\n\n/**\n * 调用 beforeUnmount 和 unmounted 生命周期钩子(选项式 API)。\n */\nexport function callUnmountedHook(instance: ComponentInternalInstance): void {\n // FIX: P1-8 COMPONENT-NEW-02 - 添加生命周期调用顺序断言\n // 确保组件已挂载后才能调用卸载钩子\n if (__DEV__ && !instance.isMounted) {\n warnOnce(\n `Lifecycle hook \"beforeUnmount\" was called before the component was mounted. ` +\n `Expected order: mounted -> beforeUnmount -> unmounted`,\n );\n }\n assertLifecycleOrder(instance, 'beforeUnmount', ['mounted']);\n\n const { beforeUnmount, unmounted } = instance.type;\n callLifecycleHook(instance, 'beforeUnmount');\n callOptionsHook(instance, beforeUnmount, 'beforeUnmount');\n\n // FIX: P1-8 - 确保 onBeforeUnmount 在 onUnmounted 之前调用\n assertLifecycleOrder(instance, 'unmounted', ['beforeUnmount', 'mounted']);\n\n callLifecycleHook(instance, 'unmounted');\n callOptionsHook(instance, unmounted, 'unmounted');\n instance.isUnmounted = true;\n}\n\n/**\n * 处理错误捕获传播。\n * 调用当前实例上所有通过 onErrorCaptured() 注册的 errorCapturedHooks(从内到外),\n * 然后传播到父组件。如果错误被处理则返回 true。\n */\nexport function handleError(\n err: Error,\n instance: ComponentInternalInstance | null,\n info: string,\n): boolean {\n let current: ComponentInternalInstance | null = instance;\n while (current) {\n // 调用当前实例上通过 onErrorCaptured() 注册的所有 errorCapturedHooks\n const hooks = current.errorCapturedHooks;\n if (hooks && hooks.length > 0) {\n for (const hook of hooks) {\n const result = hook(err, current as unknown as ComponentPublicInstance, info);\n if (result === false) return true; // 停止传播\n }\n }\n\n // 同时检查选项式 API 的 errorCaptured\n const errorHandler = current.type.errorCaptured;\n if (errorHandler) {\n const result = errorHandler.call(\n current.ctx,\n err,\n current as unknown as ComponentPublicInstance,\n info,\n );\n if (result === false) return true;\n }\n\n // 传播到父组件\n current = current.parent;\n }\n\n // 如果错误未被任何组件处理,尝试应用级 errorHandler\n if (instance) {\n const appErrorHandler = instance.root.appContext?.config?.errorHandler;\n if (typeof appErrorHandler === 'function') {\n // 传入公共实例而非内部实例,避免暴露内部实现细节\n const publicInstance = instance.ctx\n ? (instance as unknown as { ctx: ComponentPublicInstance }).ctx\n : null;\n appErrorHandler(err, publicInstance, info);\n return true;\n }\n }\n\n return false;\n}\n","// src/emit.ts\n// 事件发射系统\n\nimport { isFunction, hasOwn, isArray } from '@lytjs/common-is';\nimport { kebabToCamel } from '@lytjs/common-string';\nimport { warn } from '@lytjs/common-error';\nimport type { ComponentInternalInstance } from './types';\nimport { handleError } from './lifecycle';\n\n/**\n * Normalize emits definition into a consistent Record<string, any> format.\n */\nexport function normalizeEmitsOptions(\n emits?: string[] | Record<string, (...args: unknown[]) => unknown>,\n): Record<string, unknown> | null {\n if (!emits) return null;\n\n if (isArray(emits)) {\n // 数组形式:['click', 'change'] => { click: null, change: null }\n const result: Record<string, unknown> = {};\n for (let i = 0; i < emits.length; i++) {\n const key = emits[i]!;\n result[key] = null;\n }\n return result;\n }\n\n // 已经是对象形式(Record<string, Function | null>)\n return emits as Record<string, unknown>;\n}\n\n/**\n * 将事件名统一转换为 camelCase 形式,用于 emits 选项的声明式查找。\n * 例如: 'update:model-value' => 'update:modelValue'\n */\nfunction normalizeEventName(event: string): string {\n return kebabToCamel(event);\n}\n\n/**\n * 将事件名转换为处理器 key\n * 先将 kebab-case 转为 camelCase,再首字母大写加 on 前缀\n * 例如: 'update:model-value' => 'onUpdate:modelValue'\n */\nfunction toHandlerKey(event: string): string {\n if (!event) return '';\n const camelized = normalizeEventName(event);\n return `on${camelized[0]!.toUpperCase()}${camelized.slice(1)}`;\n}\n\n/**\n * Emit an event on a component instance.\n * Looks for `onXxx` handler in props and attrs (camelCase conversion).\n */\nexport function emit(instance: ComponentInternalInstance, event: string, ...args: unknown[]): void {\n if (instance.isUnmounted) return;\n\n if (__DEV__ && !isEmitValid(instance, event)) {\n warn(`Component emitted event \"${event}\" but it is not declared in emits.`);\n }\n\n // 规范化事件名:将 kebab-case 转为 camelCase 用于处理器查找\n const handlerName = toHandlerKey(event);\n\n // 先在 props 中查找处理器,再在 attrs 中查找\n const handler = instance.props[handlerName] ?? instance.attrs[handlerName];\n if (isFunction(handler)) {\n try {\n handler(...args);\n } catch (err) {\n handleError(err as Error, instance, `event handler for \"${event}\"`);\n }\n }\n}\n\n/**\n * 检查事件是否在 emits 选项中声明。\n * 使用与 emit() 相同的规范化(kebab-case -> camelCase)以确保\n * 一致的事件名匹配。\n */\nexport function isEmitValid(instance: ComponentInternalInstance, event: string): boolean {\n if (!instance.emitsOptions) return true;\n const normalized = normalizeEventName(event);\n return hasOwn(instance.emitsOptions, normalized) || hasOwn(instance.emitsOptions, event);\n}\n","// src/slots.ts\n// 插槽处理\n\nimport { isFunction, isArray, isObject, isNullish } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport type { VNode } from '@lytjs/common-vnode';\nimport type { ComponentInternalInstance, InternalSlots, SlotFunction } from './types';\n\n/**\n * 从 children 初始化 slots。\n * Children 可以是:\n * - 插槽函数对象(命名插槽)\n * - 单个函数(默认插槽)\n * - null/undefined(无插槽)\n *\n * FIX: P2-20 动态 slot 缓存策略:\n * slots 在初始化时被规范化并存储在 instance.slots 中。\n * 如果需要动态更新 slots(如通过 scoped slots),应通过\n * 组件更新机制触发重新初始化,而非直接修改 instance.slots。\n */\nexport function initSlots(instance: ComponentInternalInstance, children: unknown): void {\n if (isNullish(children)) {\n instance.slots = {} as InternalSlots;\n return;\n }\n\n const slots: InternalSlots = {};\n\n if (isFunction(children)) {\n // 单个函数 => 默认插槽\n slots.default = children as SlotFunction;\n } else if (isObject(children) && !isArray(children)) {\n // 插槽函数对象\n const slotObj = children as Record<string, unknown>;\n for (const key in slotObj) {\n if (isFunction(slotObj[key])) {\n slots[key] = slotObj[key] as SlotFunction;\n }\n }\n }\n\n instance.slots = slots;\n}\n\n/**\n * 将插槽返回值规范化为数组。\n * 确保插槽函数始终返回数组,以保持渲染一致性。\n */\nexport function normalizeSlotValue(value: unknown): VNode[] {\n if (isNullish(value)) return [];\n if (isArray(value)) return value as VNode[];\n // FIX: P2-13 简化检查逻辑,直接检查 __v_isVNode === true\n // 避免多余的类型检查和嵌套条件\n if ((value as VNode).__v_isVNode === true) {\n return [value as VNode];\n }\n if (__DEV__) {\n warn(\n `normalizeSlotValue: expected VNode or VNode[], got ${typeof value}. ` +\n `This may cause rendering issues.`,\n );\n }\n return [value as VNode];\n}\n","// src/component-options.ts\n// 组件选项合并、定义辅助函数和应用上下文\n\nimport { isFunction, hasOwn } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport type { ComponentOptions, ComponentPublicInstance, AppContext } from './types';\nimport type { VNode } from '@lytjs/common-vnode';\n\n// ==================== defineComponent ====================\n\n/**\n * defineComponent 是一个恒等函数,直接返回选项对象。\n * 它为组件选项提供 TypeScript 类型推断。\n */\nexport function defineComponent(options: ComponentOptions): ComponentOptions {\n return options;\n}\n\n// ==================== defineFunctionalComponent ====================\n\n/**\n * 定义函数式组件。\n * 函数式组件没有实例、没有生命周期钩子、没有响应式状态。\n * 它接收 props 并直接返回渲染函数。\n *\n * FIX: P1-22 使用精确类型替代 Record<string, any>,\n * render 参数明确为返回 VNode 的函数,props 参数使用 Record<string, unknown>\n */\nexport function defineFunctionalComponent(\n render: (props: Record<string, unknown>) => VNode | VNode[] | null,\n props?: Record<string, unknown>,\n): ComponentOptions {\n return {\n name: 'FunctionalComponent',\n props: props ?? {},\n setup(_props: Record<string, unknown>) {\n // 直接返回原始渲染函数,使 handleSetupResult\n // 将其赋值给 instance.render,让函数式组件正常工作。\n return render as unknown as () => VNode;\n },\n // 标记为函数式组件\n __isFunctional: true,\n } as ComponentOptions;\n}\n\n// ==================== mergeOptions ====================\n\n/**\n * 合并组件选项的 extends 和 mixins。\n * 使用路径跟踪提供详细的循环依赖警告,\n * 包含完整的合并链和组件名称。\n *\n * FIX: P2-37 使用 pathLength 替代 [...path] 数组复制:\n * 原实现在每次递归调用时通过 [...path] 复制整个 path 数组,\n * 在深层嵌套的 extends/mixins 链中会产生 O(n^2) 的内存开销。\n * 改为传递原始 path 引用 + 当前路径长度 pathLength,\n * 在需要构建警告信息时通过 path.slice(0, pathLength) 获取当前路径,\n * 避免不必要的数组复制。\n */\nexport function mergeOptions(\n options: ComponentOptions,\n seen = new WeakSet<ComponentOptions>(),\n path: ComponentOptions[] = [],\n pathLength: number = 0,\n): ComponentOptions {\n if (seen.has(options)) {\n if (__DEV__) {\n // 构建可读的循环路径(使用组件名称)\n const currentPath = path.slice(0, pathLength);\n const cycleStart = currentPath.indexOf(options);\n const cyclePath = currentPath\n .slice(cycleStart)\n .map((opts, i) => {\n const name =\n (opts as Record<string, unknown>).name ||\n (opts as Record<string, unknown>).__name ||\n `anonymous#${i}`;\n return String(name);\n })\n .join(' -> ');\n warn(`Circular mixin/extends detected: ${cyclePath} -> (cycle). Skipping.`);\n }\n return { ...options };\n }\n seen.add(options);\n path[pathLength] = options;\n\n let merged: ComponentOptions = { ...options };\n\n // 先应用 extends\n if (options.extends) {\n merged = mergeOptionsPair(mergeOptions(options.extends, seen, path, pathLength + 1), merged);\n }\n\n // 再应用 mixins\n if (options.mixins) {\n for (const mixin of options.mixins) {\n merged = mergeOptionsPair(merged, mergeOptions(mixin, seen, path, pathLength + 1));\n }\n }\n\n return merged;\n}\n\n/**\n * 合并两个 ComponentOptions 对象。\n */\nfunction mergeOptionsPair(parent: ComponentOptions, child: ComponentOptions): ComponentOptions {\n // 使用 Record<string, unknown> 作为中间类型以支持动态键访问,\n // 最终通过类型断言返回 ComponentOptions\n const merged: Record<string, unknown> = { ...parent };\n\n for (const key in child) {\n if (key === 'props' || key === 'emits' || key === 'inject') {\n const parentVal = (parent as Record<string, unknown>)[key];\n const childVal = (child as Record<string, unknown>)[key];\n if (parentVal && childVal) {\n merged[key] = { ...parentVal, ...childVal };\n } else if (childVal) {\n merged[key] = childVal;\n }\n } else if (key === 'data' || key === 'provide') {\n const parentVal = (parent as Record<string, unknown>)[key];\n const childVal = (child as Record<string, unknown>)[key];\n if (parentVal && childVal) {\n merged[key] = function (this: ComponentPublicInstance) {\n const parentData = isFunction(parentVal) ? parentVal.call(this) : parentVal;\n const childData = isFunction(childVal) ? childVal.call(this) : childVal;\n return {\n ...(parentData as Record<string, unknown>),\n ...(childData as Record<string, unknown>),\n };\n };\n } else if (childVal) {\n merged[key] = childVal;\n }\n } else if (key === 'computed' || key === 'methods' || key === 'watch') {\n const parentVal = (parent as Record<string, unknown>)[key];\n const childVal = (child as Record<string, unknown>)[key];\n if (parentVal && childVal) {\n merged[key] = { ...parentVal, ...childVal };\n } else if (childVal) {\n merged[key] = childVal;\n }\n } else if (\n key === 'beforeCreate' ||\n key === 'created' ||\n key === 'beforeMount' ||\n key === 'mounted' ||\n key === 'beforeUpdate' ||\n key === 'updated' ||\n key === 'beforeUnmount' ||\n key === 'unmounted'\n ) {\n const parentVal = (parent as Record<string, unknown>)[key];\n const childVal = (child as Record<string, unknown>)[key];\n if (parentVal && childVal) {\n merged[key] = function (this: ComponentPublicInstance) {\n (parentVal as (...args: unknown[]) => unknown).call(this);\n (childVal as (...args: unknown[]) => unknown).call(this);\n };\n } else if (childVal) {\n merged[key] = childVal;\n }\n } else if (key === 'mixins' || key === 'extends') {\n // 跳过 - 已处理\n } else if (hasOwn(child, key)) {\n merged[key] = (child as Record<string, unknown>)[key];\n }\n }\n\n return merged as ComponentOptions;\n}\n\n// ==================== createAppContext ====================\n\n/**\n * 创建基础应用上下文对象。\n * 导出供 @lytjs/core 扩展运行时字段。\n */\nexport function createAppContext(): AppContext {\n return {\n config: {},\n components: {},\n directives: {},\n mixins: [],\n provides: Object.create(null) as Record<string | symbol, unknown>,\n };\n}\n","// src/component-proxy.ts\n// Public instance proxy ($data, $props, $el, etc.) and access cache\n\nimport { hasOwn } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport { nextTick } from '@lytjs/common-scheduler';\nimport type { ComponentInternalInstance, ComponentPublicInstance } from './types';\n// FIX: DTS build error - VNode 未使用\n// import type { VNode } from '@lytjs/common-vnode';\n\n// ==================== accessCache 常量 ====================\n\n/**\n * PublicInstanceProxy 属性访问缓存位掩码。\n * 每个公共属性对应一个唯一的位,用于在 accessCache 数组中标记\n * 该属性首次被访问时的查找结果,避免后续重复遍历 setupState/data/props。\n *\n * 位值设计:\n * 0 - 未缓存(需要首次查找)\n * 1 - $ 属性($data, $props, $el, $emit 等)\n * 2 - setupState\n * 4 - data\n * 8 - props\n * 16 - globalProperties\n * 32 - ctx(公共实例自身属性)\n */\nexport const enum PublicInstanceProxyAccessCache {\n /** 未缓存 */\n NONE = 0,\n /** 其他(无法归类到具体来源) */\n OTHER = 1,\n /** 来自 setupState */\n SETUP_STATE = 2,\n /** 来自 data */\n DATA = 4,\n /** 来自 props */\n PROPS = 8,\n /** 来自 globalProperties */\n GLOBAL_PROPERTIES = 16,\n /** 来自 ctx(公共实例自身属性,如 $data, $el 等) */\n CONTEXT = 32,\n}\n\n/**\n * 公共属性名到 accessCache 位掩码的映射。\n * 用于快速判断一个 key 是否是 Vue 内置公共属性($data, $props 等)。\n */\nexport const PUBLIC_PROPERTIES_MAP: Record<string, number> = {\n $: 1,\n $el: 2,\n $data: 4,\n $props: 8,\n $attrs: 16,\n $slots: 32,\n $refs: 64,\n $parent: 128,\n $root: 256,\n $emit: 512,\n $options: 1024,\n $forceUpdate: 2048,\n $nextTick: 4096,\n $watch: 8192,\n};\n\n// ==================== createComponentPublicInstance ====================\n\n/**\n * Create the public instance proxy ($data, $props, $el, etc.).\n * Uses a Proxy so that Options API `this` correctly resolves properties\n * from setupState, data, props, and public instance fields ($el, $emit, etc.).\n */\nexport function createComponentPublicInstance(\n instance: ComponentInternalInstance,\n): ComponentPublicInstance {\n // 初始化 accessCache(惰性创建)\n if (!instance.accessCache) {\n instance.accessCache = Object.create(null) as Record<string, number>;\n }\n\n const PublicInstanceProxyHandlers: ProxyHandler<ComponentPublicInstance> = {\n get(target: ComponentPublicInstance, key: string | symbol): unknown {\n // Symbol.key 无法缓存,直接走原始逻辑\n if (typeof key === 'symbol') {\n if (key in target) {\n const res = (target as unknown as Record<string | symbol, unknown>)[key];\n if (typeof res === 'function' && key !== Symbol.toPrimitive && key !== Symbol.iterator) {\n return res.bind(target);\n }\n return res;\n }\n return undefined;\n }\n\n // 尝试从 accessCache 获取缓存结果\n const cachedValue = instance.accessCache![key];\n if (cachedValue !== undefined) {\n switch (cachedValue) {\n case PublicInstanceProxyAccessCache.CONTEXT: {\n const res = (target as unknown as Record<string | symbol, unknown>)[key];\n if (typeof res === 'function' && key !== '$emit') {\n return res.bind(target);\n }\n return res;\n }\n case PublicInstanceProxyAccessCache.OTHER:\n return undefined;\n case PublicInstanceProxyAccessCache.SETUP_STATE:\n return instance.setupState[key];\n case PublicInstanceProxyAccessCache.DATA:\n return instance.data[key];\n case PublicInstanceProxyAccessCache.PROPS:\n return instance.props[key];\n case PublicInstanceProxyAccessCache.GLOBAL_PROPERTIES: {\n const globalProperties = instance.appContext?.config?.globalProperties as\n | Record<string, unknown>\n | undefined;\n return globalProperties ? globalProperties[key] : undefined;\n }\n }\n }\n\n // 1. Public properties ($data, $props, $el, $emit, etc.)\n if (key in target) {\n const res = (target as unknown as Record<string | symbol, unknown>)[key];\n // Bind functions to the proxy so `this` works correctly\n if (typeof res === 'function' && key !== '$emit') {\n return res.bind(target);\n }\n // 缓存查找结果\n instance.accessCache![key] = PublicInstanceProxyAccessCache.CONTEXT;\n return res;\n }\n\n // 2. globalProperties\n const globalProperties = instance.appContext?.config?.globalProperties as\n | Record<string, unknown>\n | undefined;\n if (globalProperties && hasOwn(globalProperties, key)) {\n instance.accessCache![key] = PublicInstanceProxyAccessCache.GLOBAL_PROPERTIES;\n return globalProperties[key as string];\n }\n\n // 3. setupState\n if (hasOwn(instance.setupState, key)) {\n instance.accessCache![key] = PublicInstanceProxyAccessCache.SETUP_STATE;\n return instance.setupState[key as string];\n }\n\n // 4. data\n if (hasOwn(instance.data, key)) {\n instance.accessCache![key] = PublicInstanceProxyAccessCache.DATA;\n return instance.data[key as string];\n }\n\n // 5. props\n if (hasOwn(instance.props, key)) {\n instance.accessCache![key] = PublicInstanceProxyAccessCache.PROPS;\n return instance.props[key as string];\n }\n\n // 未找到,缓存为 OTHER 以避免重复查找\n instance.accessCache![key] = PublicInstanceProxyAccessCache.OTHER;\n return undefined;\n },\n\n set(_target: ComponentPublicInstance, key: string | symbol, value: unknown): boolean {\n // FIX: P1-16 完善 Symbol key 处理:Symbol key 不应被写入 setupState/data,\n // 应直接设置到 target 上(与 get handler 的 Symbol 处理保持一致)\n if (typeof key === 'symbol') {\n if (key === Symbol.toPrimitive || key === Symbol.iterator) {\n return false; // 不允许覆盖内置 Symbol\n }\n (_target as unknown as Record<string | symbol, unknown>)[key] = value;\n return true;\n }\n\n // 1. setupState\n if (hasOwn(instance.setupState, key)) {\n instance.setupState[key as string] = value;\n return true;\n }\n\n // 2. data\n if (hasOwn(instance.data, key)) {\n instance.data[key as string] = value;\n return true;\n }\n\n // FIX: P0-05 未找到属性时,在 DEV 模式下发出警告并返回 false,\n // 避免静默吞没写入导致调试困难\n // FIX: P2-10 注意:生产模式下此操作静默返回 false,不抛出错误。\n // 这是有意的设计,以避免在生产环境中因意外的属性写入导致应用崩溃。\n if (__DEV__) {\n warn(\n `Component public instance has no property \"${String(key)}\". ` +\n `This set operation was silently ignored.`,\n );\n }\n return false;\n },\n\n has(_target: ComponentPublicInstance, key: string | symbol): boolean {\n // Symbol key 无法使用 accessCache\n if (typeof key === 'symbol') {\n return (\n key in instance.setupState ||\n key in instance.data ||\n key in instance.props ||\n key in _target\n );\n }\n\n // 尝试从 accessCache 获取缓存结果\n const cachedValue = instance.accessCache![key];\n if (cachedValue !== undefined) {\n // 缓存值为 OTHER 表示未找到\n return cachedValue !== PublicInstanceProxyAccessCache.OTHER;\n }\n\n const globalProperties = instance.appContext?.config?.globalProperties as\n | Record<string, unknown>\n | undefined;\n const found =\n key in instance.setupState ||\n key in instance.data ||\n key in instance.props ||\n (globalProperties ? key in globalProperties : false) ||\n key in _target;\n\n // 缓存 has 结果\n instance.accessCache![key] = found\n ? PublicInstanceProxyAccessCache.CONTEXT\n : PublicInstanceProxyAccessCache.OTHER;\n\n return found;\n },\n };\n\n const ctx: ComponentPublicInstance = {\n get $data() {\n return instance.data;\n },\n get $props() {\n return instance.props;\n },\n get $el() {\n return (instance.vnode?.el as Element) ?? null;\n },\n get $options() {\n return instance.type as unknown as Record<string, unknown>;\n },\n get $refs() {\n return instance.refs as Record<string, Element | ComponentPublicInstance | null>;\n },\n get $slots() {\n return instance.slots;\n },\n $emit: instance.emit,\n $forceUpdate: () => {\n if (instance.update) {\n instance.update();\n } else if (instance.isMounted && instance.render && !instance.isUnmounted) {\n // 回退路径:已挂载但 instance.update 不可用(非标准渲染器场景)。\n // 标记需要重新渲染,在下一个 tick 中执行 render 并通过\n // instance.subTree 引用替换触发渲染器的更新机制。\n // FIX: P2-35 添加 anchor 和 ref 处理:\n // - 保留旧 subTree 的 anchor 信息(用于 Fragment 定位)\n // - 将旧 subTree 的 ref 转移到新 subTree(保持 ref 绑定)\n nextTick(() => {\n if (instance.isUnmounted) return;\n const prevTree = instance.subTree;\n const nextTree = instance.render!(instance.ctx as Parameters<typeof instance.render>[0]);\n if (nextTree) {\n instance.subTree = nextTree;\n // 将旧 subTree 标记为需要卸载,新 subTree 标记为需要挂载。\n // 渲染器在下次调度时会检测到 subTree 变化并执行 patch。\n nextTree.el = prevTree?.el ?? null;\n // FIX: P2-35 保留 anchor 信息,确保 Fragment 子节点定位正确\n if (prevTree && 'anchor' in prevTree) {\n (nextTree as unknown as Record<string, unknown>).anchor = (\n prevTree as unknown as Record<string, unknown>\n ).anchor;\n }\n // FIX: P2-35 转移 ref 绑定,避免 ref 丢失\n if (prevTree && 'ref' in prevTree) {\n (nextTree as unknown as Record<string, unknown>).ref = (\n prevTree as unknown as Record<string, unknown>\n ).ref;\n }\n }\n });\n }\n },\n $nextTick: () => nextTick(),\n };\n\n return new Proxy(ctx, PublicInstanceProxyHandlers);\n}\n","// src/component-init.ts\n// 组件完成 setup:data、methods、computed、watch、render 初始化\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\nimport { reactive, computed, watch } from '@lytjs/reactivity';\nimport { hasOwn } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport type { ComponentInternalInstance, ComponentPublicInstance } from './types';\nimport type { VNode } from '@lytjs/common-vnode';\nimport { callCreatedHook, handleError } from './lifecycle';\nimport { createComponentPublicInstance } from './component-proxy';\n\n// ==================== normalizeWatchHandler ====================\n\n/**\n * 标准化原始 watch 处理器为绑定函数。\n * 支持函数、字符串(方法名)和对象 { handler } 形式。\n */\nfunction normalizeWatchHandler(\n raw: unknown,\n methods: Record<string, Function> | undefined,\n proxy: ComponentPublicInstance,\n): Function | null {\n if (typeof raw === 'function') {\n return raw.bind(proxy);\n }\n if (typeof raw === 'string') {\n if (methods && hasOwn(methods, raw)) {\n return methods[raw]!.bind(proxy);\n }\n if (__DEV__) {\n warn(`Invalid watch handler \"${raw}\". No matching method found.`);\n }\n return null;\n }\n if (\n raw !== null &&\n typeof raw === 'object' &&\n typeof (raw as Record<string, unknown>).handler !== 'undefined'\n ) {\n return normalizeWatchHandler((raw as Record<string, unknown>).handler, methods, proxy);\n }\n if (__DEV__) {\n warn(`Invalid watch handler. Expected a function, method name string, or { handler } object.`);\n }\n return null;\n}\n\n/**\n * 完成组件 setup:处理 data、methods、computed、render。\n *\n * 错误处理:整个 setup 过程包裹在 try-catch 中,\n * 优雅地处理 data/methods/computed/watch 初始化期间的错误。\n * 错误会传播到最近的 ErrorBoundary。\n */\nexport function finishComponentSetup(instance: ComponentInternalInstance): void {\n const { type } = instance;\n\n // 步骤 1:创建公共实例代理\n try {\n instance.ctx = createComponentPublicInstance(instance);\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to create public instance proxy for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (createComponentPublicInstance)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // 步骤 2:初始化 data\n try {\n if (type.data) {\n const data = type.data.call(instance.ctx) ?? {};\n instance.data = reactive(data);\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to initialize data for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (data initialization)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // Props 冲突检测:创建 keys 集合以复用\n // FIX: P2-30 重命名为 devPropsKeys,避免与全局 __DEV__ 混淆\n const devPropsKeys = __DEV__ && instance.props ? new Set(Object.keys(instance.props)) : null;\n\n // 检查 data 与 props 冲突\n if (devPropsKeys && instance.data) {\n for (const key of Object.keys(instance.data)) {\n if (devPropsKeys.has(key)) {\n warn(\n `Data property \"${key}\" is already defined as a prop. Use default value in props instead.`,\n );\n }\n }\n }\n\n const proxy = instance.ctx;\n\n // 步骤 3:初始化 methods\n try {\n if (type.methods) {\n for (const key in type.methods) {\n if (hasOwn(type.methods, key)) {\n const method = type.methods[key]!;\n if (__DEV__ && typeof method !== 'function') {\n warn(\n `Method \"${key}\" has type \"${typeof method}\" in component ${(type as Record<string, unknown>).name || '(anonymous)'}. Expected a function.`,\n );\n continue;\n }\n instance.ctx[key as keyof ComponentPublicInstance] = method.bind(proxy) as never;\n }\n }\n // 检查 methods 与 props 冲突\n if (devPropsKeys) {\n for (const key of Object.keys(type.methods)) {\n if (devPropsKeys.has(key)) {\n warn(`Method \"${key}\" is already defined as a prop.`);\n }\n }\n }\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to initialize methods for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (methods initialization)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // 步骤 4:初始化 computed\n try {\n if (type.computed) {\n for (const key in type.computed) {\n if (hasOwn(type.computed, key)) {\n const opt = type.computed[key];\n let c;\n if (typeof opt === 'function') {\n // 函数形式 - 只有 getter\n c = computed(() => opt.call(proxy));\n } else if (opt && typeof opt === 'object') {\n // getter/setter 对象形式\n const { get, set } = opt as { get?: Function; set?: Function };\n if (__DEV__) {\n if (typeof get !== 'function') {\n warn(\n `Computed property \"${key}\" has no getter in component ${(type as Record<string, unknown>).name || '(anonymous)'}.`,\n );\n continue;\n }\n if (set !== undefined && typeof set !== 'function') {\n warn(\n `Computed property \"${key}\" setter is not a function in component ${(type as Record<string, unknown>).name || '(anonymous)'}.`,\n );\n }\n }\n c = computed({\n get: get ? () => get.call(proxy) : () => undefined,\n set: set ? (v: unknown) => set.call(proxy, v) : undefined,\n } as Parameters<typeof computed>[0]);\n } else if (__DEV__) {\n warn(\n `Computed property \"${key}\" is not a function or object in component ${(type as Record<string, unknown>).name || '(anonymous)'}.`,\n );\n continue;\n }\n if (__DEV__ && type.methods && hasOwn(type.methods, key)) {\n warn(\n `Computed property \"${key}\" conflicts with a method of the same name in component ${(type as Record<string, unknown>).name || '(anonymous)'}. The method will be overwritten.`,\n );\n }\n instance.ctx[key as keyof ComponentPublicInstance] = c as never;\n }\n }\n // 检查 computed 与 props 冲突\n if (devPropsKeys) {\n for (const key of Object.keys(type.computed)) {\n if (devPropsKeys.has(key)) {\n warn(`Computed property \"${key}\" is already defined as a prop.`);\n }\n }\n }\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to initialize computed for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (computed initialization)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // 步骤 5:初始化 watch\n try {\n if (type.watch) {\n for (const key in type.watch) {\n if (hasOwn(type.watch, key)) {\n const raw = type.watch[key];\n // 标准化为 handler 数组\n const handlers: Function[] = [];\n if (Array.isArray(raw)) {\n for (const h of raw) {\n const normalized = normalizeWatchHandler(h, type.methods, proxy);\n if (normalized) handlers.push(normalized);\n }\n } else {\n const h = normalizeWatchHandler(raw, type.methods, proxy);\n if (h) handlers.push(h);\n }\n // 提取选项(仅对象形式)\n const options: { immediate?: boolean; deep?: boolean; flush?: 'pre' | 'post' | 'sync' } =\n {};\n if (\n !Array.isArray(raw) &&\n raw !== null &&\n typeof raw === 'object' &&\n typeof (raw as Record<string, unknown>).handler !== 'undefined'\n ) {\n const watchObj = raw as Record<string, unknown>;\n if (typeof watchObj.immediate === 'boolean') options.immediate = watchObj.immediate;\n if (typeof watchObj.deep === 'boolean') options.deep = watchObj.deep;\n if (typeof watchObj.flush === 'string')\n options.flush = watchObj.flush as 'pre' | 'post' | 'sync';\n }\n for (const handler of handlers) {\n watch(\n () => proxy[key as keyof ComponentPublicInstance],\n handler as (...args: unknown[]) => void,\n options,\n );\n }\n }\n }\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to initialize watch for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (watch initialization)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // 步骤 6:调用 created 钩子并注册渲染追踪钩子\n try {\n callCreatedHook(instance);\n\n // 注册选项式 API 的 renderTracked/renderTriggered 钩子\n if (type.renderTracked) {\n if (!instance.renderTrackedHooks) {\n instance.renderTrackedHooks = [];\n }\n instance.renderTrackedHooks.push(type.renderTracked.bind(proxy));\n }\n if (type.renderTriggered) {\n if (!instance.renderTriggeredHooks) {\n instance.renderTriggeredHooks = [];\n }\n instance.renderTriggeredHooks.push(type.renderTriggered.bind(proxy));\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed during lifecycle hooks for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (lifecycle hooks)');\n instance.render = () => null as unknown as VNode;\n return;\n }\n\n // 步骤 7:设置渲染函数\n try {\n if (!instance.render) {\n if (type.render) {\n instance.render = type.render.bind(instance.ctx);\n }\n }\n } catch (err) {\n if (__DEV__) {\n warn(\n `Failed to set up render for ${(type as Record<string, unknown>).name || '(anonymous)'}: ${(err as Error).message}`,\n );\n }\n handleError(err as Error, instance, 'finishComponentSetup (render setup)');\n instance.render = () => null as unknown as VNode;\n }\n}\n","// src/component-setup.ts\n// 组件实例创建、setup 和 props 初始化\n\nimport { isFunction, isObject, hasOwn, NOOP, EMPTY_OBJ, isPromise } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport type {\n ComponentOptions,\n ComponentInternalInstance,\n ComponentPublicInstance,\n SetupContext,\n InternalSlots,\n RenderFunction,\n} from './types';\nimport type { VNode } from '@lytjs/common-vnode';\nimport { normalizePropsOptions, resolvePropValue } from './props';\nimport { normalizeEmitsOptions, emit } from './emit';\nimport { initSlots } from './slots';\nimport { setCurrentInstance, handleError } from './lifecycle';\nimport { createAppContext, mergeOptions } from './component-options';\nimport { finishComponentSetup } from './component-init';\n\ntype SetupResult = RenderFunction | Record<string, unknown> | void;\n\n// ==================== UID counter ====================\n\n// 异步 setup 超时时间(毫秒)\nconst ASYNC_SETUP_TIMEOUT = 30000;\n\n// 注意:uid 使用自增整数,在 JavaScript 中 Number.MAX_SAFE_INTEGER 为 2^53 - 1。\n// 在实际应用中达到此上限的概率极低(需创建约 9 * 10^15 个组件实例),\n// 因此此处不做溢出检查。如确实需要,可考虑使用 BigInt 或周期性重置。\nlet uid = 0;\n\n// FIX: P2-15 setup 上下文 WeakMap 缓存:\n// 缓存 createSetupContext 的结果,避免每次调用 runSetup 时重新创建\nconst setupContextCache = new WeakMap<ComponentInternalInstance, SetupContext>();\n\n// ==================== createComponentInstance ====================\n\n/**\n * 从 vnode 创建组件内部实例。\n *\n * 错误处理:实例创建包裹在 try-catch 中,防止\n * 组件初始化期间的未捕获异常导致应用崩溃。\n * 错误会传播到最近的 ErrorBoundary。\n */\nexport function createComponentInstance(\n vnode: VNode,\n parent: ComponentInternalInstance | null,\n): ComponentInternalInstance {\n // FIX: P1-17 在类型转换前验证 vnode.type 是否为有效组件类型\n const rawType = vnode.type;\n if (\n rawType === null ||\n rawType === undefined ||\n typeof rawType === 'string' ||\n typeof rawType === 'number' ||\n typeof rawType === 'boolean' ||\n typeof rawType === 'symbol'\n ) {\n throw new Error(\n `[lytjs/component] createComponentInstance: invalid vnode.type \"${String(rawType)}\". ` +\n `Expected a component options object or function.`,\n );\n }\n\n const type = vnode.type as ComponentOptions;\n\n try {\n // 合并 extends 和 mixins\n const mergedOptions = mergeOptions(type);\n\n const appContext = parent ? parent.appContext : createAppContext();\n\n const instance: ComponentInternalInstance = {\n uid: uid++,\n type: mergedOptions,\n vnode,\n subTree: null,\n props: EMPTY_OBJ,\n slots: {} as InternalSlots,\n ctx: {} as ComponentPublicInstance,\n setupState: {},\n data: {},\n propsOptions: normalizePropsOptions(mergedOptions.props),\n emitsOptions: normalizeEmitsOptions(mergedOptions.emits),\n emit: NOOP as (event: string, ...args: unknown[]) => void,\n isMounted: false,\n isUnmounted: false,\n isDeactivated: false,\n isKeepingAlive: false,\n refs: {},\n lifecycle: {\n beforeMount: new Set(),\n mounted: new Set(),\n beforeUpdate: new Set(),\n updated: new Set(),\n beforeUnmount: new Set(),\n unmounted: new Set(),\n },\n provides: parent\n ? parent.provides\n : (Object.create(null) as Record<string | symbol, unknown>),\n parent,\n root: null as unknown as ComponentInternalInstance,\n appContext,\n attrs: {},\n accessCache: null as Record<string, number> | null,\n };\n\n // 创建绑定到此实例的 emit 函数\n instance.emit = (event: string, ...args: unknown[]) => emit(instance, event, ...args);\n\n // FIX: P1-4 在 instance 声明完成后赋值 root,避免在 const 初始化前引用自身\n instance.root = parent ? parent.root : instance;\n\n return instance;\n } catch (err) {\n // 记录错误用于调试\n if (__DEV__) {\n warn(`Failed to create component instance: ${(err as Error).message}`);\n }\n // 通过 handleError 将错误传播到 ErrorBoundary\n handleError(err as Error, parent, 'createComponentInstance');\n // 重新抛出,让调用者处理失败\n throw err;\n }\n}\n\n// ==================== setupComponent ====================\n\n/**\n * 设置组件实例:运行 setup、初始化 props、初始化 slots。\n */\nexport function setupComponent(instance: ComponentInternalInstance): void {\n const vnode = instance.vnode;\n if (!vnode) return;\n\n const { children } = vnode;\n const props = (vnode.props as Record<string, unknown> | null) ?? null;\n\n // 初始化 props\n initProps(instance, props);\n\n // 初始化 slots\n initSlots(instance, children);\n\n // 设置组件\n const setupResult = runSetup(instance);\n\n if (isPromise(setupResult)) {\n // 异步 setup - 标记 vnode 为异步\n vnode.isAsyncPlaceholder = true;\n // FIX: P1-15 异步 setup 超时定时器在组件卸载时清理,\n // 避免组件卸载后定时器仍然触发导致内存泄漏和无效操作\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timedSetupResult = Promise.race([\n setupResult,\n new Promise<SetupResult>((_, reject) => {\n timeoutId = setTimeout(\n () => reject(new Error('Async component setup timed out')),\n ASYNC_SETUP_TIMEOUT,\n );\n }),\n ]);\n timedSetupResult\n .then((resolvedResult) => {\n // 清理超时定时器\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n if (instance.isUnmounted) return;\n handleSetupResult(instance, resolvedResult as SetupResult);\n vnode.isAsyncPlaceholder = false;\n })\n .catch((err: Error) => {\n // FIX: P1-15 清理超时定时器\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n vnode.isAsyncPlaceholder = false;\n handleError(err, instance, 'setup function');\n });\n } else {\n handleSetupResult(instance, setupResult);\n }\n}\n\n/**\n * 运行 setup 函数(如果已定义)。\n */\nfunction runSetup(instance: ComponentInternalInstance): SetupResult {\n const { setup } = instance.type;\n\n if (!setup) return undefined;\n\n setCurrentInstance(instance);\n\n try {\n const setupContext = createSetupContext(instance);\n const result = setup(instance.props, setupContext);\n return result;\n } catch (err) {\n handleError(err as Error, instance, 'setup function');\n // 设置空操作渲染函数,防止静默空渲染\n instance.render = () => null as unknown as VNode;\n return undefined;\n } finally {\n setCurrentInstance(null);\n }\n}\n\n/**\n * 处理 setup 函数的返回结果。\n */\nfunction handleSetupResult(instance: ComponentInternalInstance, setupResult: SetupResult): void {\n if (isFunction(setupResult)) {\n // Setup 返回了渲染函数\n instance.render = setupResult as RenderFunction;\n } else if (isObject(setupResult) && setupResult !== null) {\n // Setup 返回了状态对象\n instance.setupState = setupResult as Record<string, unknown>;\n }\n\n // 完成组件 setup\n finishComponentSetup(instance);\n}\n\n// ==================== initProps ====================\n\n/**\n * 初始化并验证组件实例的 props。\n */\nexport function initProps(\n instance: ComponentInternalInstance,\n rawProps: Record<string, unknown> | null,\n): void {\n const propsOptions = instance.propsOptions;\n const props: Record<string, unknown> = {};\n if (!rawProps) {\n instance.props = props;\n return;\n }\n\n // 处理声明的 props\n for (const key in propsOptions) {\n if (hasOwn(propsOptions, key)) {\n const value = rawProps[key];\n props[key] = resolvePropValue(propsOptions[key]!, value, instance, key);\n }\n }\n\n // 收集 attrs(未声明的 props)\n const attrs: Record<string, unknown> = {};\n for (const key in rawProps) {\n if (hasOwn(rawProps, key) && !hasOwn(propsOptions, key)) {\n attrs[key] = rawProps[key];\n }\n }\n\n instance.props = props;\n instance.attrs = attrs;\n}\n\n// ==================== createSetupContext ====================\n\n/**\n * 创建传递给 setup 函数的 setup 上下文对象。\n * FIX: P1-9 添加缓存逻辑,避免每次调用 runSetup 时重新创建 setupContext\n */\nexport function createSetupContext(instance: ComponentInternalInstance): SetupContext {\n // 检查缓存中是否已有该实例的 setupContext\n const cached = setupContextCache.get(instance);\n if (cached) {\n return cached;\n }\n\n const context: SetupContext = {\n attrs: instance.attrs,\n slots: instance.slots,\n emit: instance.emit,\n expose(exposed?: Record<string, unknown>) {\n if (!exposed) {\n instance.exposed = null;\n return;\n }\n // 公共属性白名单:这些属性始终可访问,不应被 expose 覆盖\n const publicApiKeys = new Set([\n '$data',\n '$props',\n '$el',\n '$emit',\n '$forceUpdate',\n '$nextTick',\n '$slots',\n '$refs',\n '$options',\n ]);\n // 过滤危险 key,防止原型污染\n const safeExposed: Record<string, unknown> = {};\n for (const key of Object.keys(exposed)) {\n if (key !== '__proto__' && key !== 'constructor' && !publicApiKeys.has(key)) {\n safeExposed[key] = exposed[key];\n }\n }\n instance.exposed = safeExposed;\n },\n };\n\n // 缓存 setupContext\n setupContextCache.set(instance, context);\n return context;\n}\n","// src/component-inject.ts\n// Provide/inject 依赖注入系统\n\nimport { hasOwn } from '@lytjs/common-is';\nimport { getCurrentInstance } from './lifecycle';\n\n// FIX: P1-9 COMPONENT-NEW-03 - provide/inject 类型推断增强\n// InjectionKey 是一个 Symbol 类型,用于在 provide/inject 之间建立类型安全的关联。\n// 使用方式:\n// const key = Symbol() as InjectionKey<string>;\n// provide(key, 'hello');\n// const value = inject(key); // 类型为 string | undefined\n//\n// 改进点:\n// 1. 使用泛型约束确保类型推断准确性\n// 2. 支持默认值类型推断\n// 3. 支持工厂函数类型推断\nexport interface InjectionKey<T> {\n /** 类型标志,用于类型推断,不运行时使用 */\n __injectKey__?: T;\n}\n\n/**\n * Provide 选项接口\n * 用于类型安全的 provide 调用\n */\nexport interface ProvideOptions<T = unknown> {\n key: InjectionKey<T> | string | symbol;\n value: T;\n}\n\n/**\n * Inject 选项接口(改进版)\n * 支持更精确的类型推断\n */\nexport interface InjectOptions<T = unknown> {\n /** 如果为 true,将 defaultValue 视为工厂函数,调用它来生成默认值 */\n factory?: boolean;\n /** 从特定的祖先 key 查找值,而非注入的 key */\n from?: InjectionKey<T> | string | symbol;\n /** 如果为 true,仅从当前实例自身的 provides 中查找值(不向上查找祖先) */\n local?: boolean;\n}\n\n// ==================== provide / inject ====================\n\n/**\n * 向后代组件提供值。\n * FIX: P1-9 COMPONENT-NEW-03 - 改进类型定义,支持 InjectionKey 类型推断\n */\nexport function provide<T>(key: InjectionKey<T> | string | symbol, value: T): void {\n const instance = getCurrentInstance();\n if (instance) {\n // FIX: P2-34 添加原型链边界说明注释:\n // 首次 provide 时,如果当前 provides 与父级共享同一个引用,\n // 则创建以父级 provides 为原型的新对象,确保层级隔离。\n // 这是利用 JavaScript 原型链实现 provide/inject 的核心机制:\n // 子组件通过原型链向上查找 provides,而当前组件的 provide 会\n // 创建一个新对象遮蔽父级同名 key,不会污染父级的 provides。\n // 注意:Object.create(null) 创建的对象没有原型,因此不会继承\n // Object.prototype 上的属性(如 toString、hasOwnProperty 等),\n // 这是正确的做法,避免 key 冲突。\n if (instance.provides === (instance.parent?.provides ?? null)) {\n instance.provides = Object.create(\n instance.provides as Record<string | symbol, unknown>,\n ) as Record<string | symbol, unknown>;\n }\n // FIX: P0-4 修复 provide/inject symbol key 被转为 string 的问题,直接使用 key 而不进行类型断言\n instance.provides[key as string | symbol] = value;\n }\n}\n\n/**\n * 从祖先组件注入值。\n * FIX: P1-9 COMPONENT-NEW-03 - 改进类型定义,支持更精确的类型推断\n *\n * Supported forms:\n * - `inject('key')` - basic lookup\n * - `inject('key', defaultValue)` - with default value\n * - `inject('key', () => createDefault(), { factory: true })` - factory function default\n * - `inject('key', undefined, { from: 'optionalSourceKey' })` - from modifier\n * - `inject('key', undefined, { local: true })` - local only (no ancestor lookup)\n * - `inject(injectionKey)` - with InjectionKey for type-safe lookup\n */\nexport function inject<T>(\n key: InjectionKey<T> | string | symbol,\n defaultValue?: T | (() => T),\n options?: InjectOptions<T>,\n): T | undefined {\n const instance = getCurrentInstance();\n if (!instance) {\n // 无实例上下文 - 返回默认值\n return resolveDefault(defaultValue, options);\n }\n\n const lookupKey = options?.from ?? key;\n\n if (options?.local) {\n // local 模式:仅检查当前实例自身的 provides(不从父级原型继承)\n // 如果 instance.provides 与 parent.provides 是同一引用,说明实例\n // 尚未调用 provide(),因此没有自身的 provides 可检查。\n const provides = instance.provides as Record<string | symbol, unknown>;\n const hasOwnProvides = instance.parent ? provides !== instance.parent.provides : true;\n if (hasOwnProvides && hasOwn(provides, lookupKey as string)) {\n return provides[lookupKey as string] as T | undefined;\n }\n return resolveDefault(defaultValue, options);\n }\n\n // 沿父组件链向上查找\n let current = instance.parent;\n while (current) {\n const provides = current.provides as Record<string | symbol, unknown>;\n if ((lookupKey as string | symbol) in provides) {\n return provides[lookupKey as string] as T | undefined;\n }\n current = current.parent;\n }\n\n return resolveDefault(defaultValue, options);\n}\n\n/**\n * 解析 inject 的默认值,处理工厂函数。\n */\nfunction resolveDefault<T>(\n defaultValue: T | (() => T) | undefined,\n options?: InjectOptions,\n): T | undefined {\n if (defaultValue === undefined) return undefined;\n if (options?.factory && typeof defaultValue === 'function') {\n return (defaultValue as () => T)();\n }\n return defaultValue as T;\n}\n","// src/keep-alive.ts\n// KeepAlive 组件(简化版)\n\nimport { isString, isArray, isFunction } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport { watch } from '@lytjs/reactivity';\nimport type { ComponentInternalInstance, ComponentOptions, SetupContext } from './types';\nimport { createComponentInstance, setupComponent } from './component';\nimport { handleError } from './lifecycle';\n// FIX: DTS build error - 统一从 vdom 导入,避免类型不兼容\nimport { ShapeFlags, createVNode, createCommentVNode } from '@lytjs/vdom';\nimport type { VNode } from '@lytjs/vdom';\n\n// ==================== 类型定义 ====================\n\ninterface KeepAliveCache {\n get(key: string): ComponentInternalInstance | undefined;\n set(key: string, instance: ComponentInternalInstance): void;\n delete(key: string): boolean;\n has(key: string): boolean;\n forEach(callback: (value: ComponentInternalInstance, key: string) => void): void;\n readonly size: number;\n keys(): IterableIterator<string>;\n}\n\n/**\n * LRU(最近最少使用)缓存实现,用于 KeepAlive\n * FIX: P2-8 COMPONENT-NEW-05 - 实现 LRU 缓存策略,限制缓存组件数量\n */\nclass LRUCache implements KeepAliveCache {\n private cache: Map<string, ComponentInternalInstance>;\n private maxSize: number;\n\n constructor(maxSize: number = 10) {\n this.cache = new Map();\n this.maxSize = maxSize;\n }\n\n get(key: string): ComponentInternalInstance | undefined {\n const instance = this.cache.get(key);\n if (instance !== undefined) {\n // 移动到末尾(最近使用)\n this.cache.delete(key);\n this.cache.set(key, instance);\n }\n return instance;\n }\n\n set(key: string, instance: ComponentInternalInstance): void {\n // 如果 key 已存在,先删除以更新顺序\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // 如果达到容量上限,移除最旧的条目(Map 中的第一个)\n if (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n const oldestInstance = this.cache.get(oldestKey);\n if (oldestInstance) {\n // 停用并清理最旧的实例\n deactivateInstance(oldestInstance);\n oldestInstance.effects?.forEach((effect) => {\n effect.stop();\n });\n }\n this.cache.delete(oldestKey);\n }\n }\n\n this.cache.set(key, instance);\n }\n\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n forEach(callback: (value: ComponentInternalInstance, key: string) => void): void {\n this.cache.forEach(callback);\n }\n\n get size(): number {\n return this.cache.size;\n }\n\n keys(): IterableIterator<string> {\n return this.cache.keys();\n }\n\n /**\n * 更新缓存的最大容量\n */\n setMaxSize(newMaxSize: number): void {\n this.maxSize = newMaxSize;\n // 如有必要则修剪\n while (this.cache.size > this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n const oldestInstance = this.cache.get(oldestKey);\n if (oldestInstance) {\n deactivateInstance(oldestInstance);\n oldestInstance.effects?.forEach((effect) => {\n effect.stop();\n });\n }\n this.cache.delete(oldestKey);\n }\n }\n }\n}\n\n// ==================== KeepAlive Component ====================\n\nexport interface KeepAliveProps {\n include?: string | RegExp | (string | RegExp)[];\n exclude?: string | RegExp | (string | RegExp)[];\n /** FIX: P2-17 缓存大小限制配置(默认 10) */\n max?: number;\n /** 自定义缓存 key 函数:接收一个 vnode,返回字符串或数字作为缓存 key */\n onCacheKey?: (vnode: VNode) => string | number;\n}\n\nexport const KeepAlive: ComponentOptions = {\n name: 'KeepAlive',\n\n props: {\n include: {},\n exclude: {},\n max: { type: Number },\n onCacheKey: { type: Function },\n },\n\n setup(_props: Record<string, unknown>, _ctx: SetupContext) {\n const props = _props as KeepAliveProps;\n // FIX: P2-8 COMPONENT-NEW-05 - 使用 LRU 缓存替代普通 Map\n const maxCacheSize = props.max ?? 10;\n const cache: KeepAliveCache = new LRUCache(maxCacheSize);\n // FIX: P2-29 移除冗余的 keys Set,直接使用 cache.keys() 避免数据重复\n const _currentVNode: VNode | null = null;\n\n // FIX: P2-29 监听 max prop 变化,动态调整 LRU 缓存大小\n watch(\n () => (_props as KeepAliveProps).max,\n (newMax) => {\n if (newMax !== undefined && typeof newMax === 'number' && newMax > 0) {\n (cache as LRUCache).setMaxSize(newMax);\n }\n },\n );\n\n return {\n cache,\n _currentVNode,\n } as Record<string, unknown>;\n },\n\n render(ctx: unknown): VNode {\n // FIX: P2-12 使用 ctx 参数替代 this,避免依赖 this 上下文\n const instance = ctx as unknown as ComponentInternalInstance;\n const props = instance.props as KeepAliveProps;\n const defaultSlot = instance.slots?.default;\n\n if (!defaultSlot) return createCommentVNode('keep-alive');\n\n const children = defaultSlot();\n if (!children || children.length === 0) return createCommentVNode('keep-alive');\n\n // KeepAlive 只处理单个子组件\n const rawVNode = children[0] as VNode;\n if (rawVNode == null) return createCommentVNode('keep-alive');\n\n // 跳过非组件 vnode(文本、注释等)\n if (\n typeof rawVNode.type === 'string' ||\n rawVNode.type === (globalThis as Record<string, unknown>).__LYTJS_FRAGMENT__ ||\n rawVNode.type === (globalThis as Record<string, unknown>).__LYTJS_TEXT__ ||\n rawVNode.type === (globalThis as Record<string, unknown>).__LYTJS_COMMENT__\n ) {\n return rawVNode;\n }\n\n // 获取组件名用于匹配\n const compType = rawVNode.type as Record<string, unknown>;\n const compName =\n typeof compType === 'object' && compType !== null && 'name' in compType\n ? (compType as { name?: string }).name\n : typeof compType === 'function'\n ? (compType as { name?: string }).name\n : undefined;\n\n // FIX: P1-18 exclude 逻辑重构提高可读性,将复杂的条件表达式拆分为独立判断\n // 检查 include 过滤:组件名必须匹配 include 模式(如果提供了 include)\n const isIncluded =\n props.include === undefined || matchesPattern(compName as string | undefined, props.include);\n\n // 检查 exclude 过滤:组件名不能匹配 exclude 模式(如果提供了 exclude)\n const isExcluded =\n props.exclude !== undefined && matchesPattern(compName as string | undefined, props.exclude);\n\n if (!isIncluded || isExcluded) {\n return rawVNode;\n }\n\n // 计算缓存 key\n const cacheKey = getCacheKey(instance, rawVNode);\n\n // 检查是否已缓存\n const cachedInstance = getCachedInstance(instance, cacheKey);\n if (cachedInstance) {\n // 移动到最近使用位置\n cacheInstance(instance, cacheKey, cachedInstance);\n // 将缓存 vnode 的子节点复制到原始 vnode 上用于 patch\n // FIX: DTS build error - 类型断言避免 ComponentInternalInstance 冲突\n rawVNode.component = cachedInstance as unknown as NonNullable<typeof rawVNode.component>;\n rawVNode.shapeFlag |= ShapeFlags.COMPONENT_KEPT_ALIVE;\n activateInstance(cachedInstance);\n return rawVNode;\n }\n\n // 存储引用以便在卸载时停用\n (instance.setupState as Record<string, unknown>)._currentVNode = rawVNode;\n\n return rawVNode;\n },\n\n created() {\n // KeepAlive 实例初始化\n },\n};\n\n// ==================== KeepAlive 辅助函数 ====================\n\n/**\n * 创建 KeepAlive 组件实例。\n */\nexport function createKeepAliveInstance(\n props: KeepAliveProps = {},\n parent: ComponentInternalInstance | null = null,\n): ComponentInternalInstance {\n const vnode: VNode = createVNode(\n KeepAlive,\n {\n ...props,\n include: props.include,\n exclude: props.exclude,\n max: props.max,\n onCacheKey: props.onCacheKey,\n },\n null,\n ShapeFlags.STATEFUL_COMPONENT,\n );\n\n const instance = createComponentInstance(vnode, parent);\n setupComponent(instance);\n return instance;\n}\n\n/**\n * 检查组件名是否匹配 include/exclude 模式。\n */\nexport function matchesPattern(\n name: string | undefined,\n pattern: string | RegExp | (string | RegExp)[] | undefined,\n): boolean {\n if (!pattern) return true;\n // 当组件 name 为 undefined 时,跳过匹配(视为不匹配)\n if (name === undefined) return false;\n\n if (isString(pattern)) {\n return name === pattern;\n }\n\n if (pattern instanceof RegExp) {\n return pattern.test(name);\n }\n\n if (isArray(pattern)) {\n return pattern.some((p) => matchesPattern(name, p));\n }\n\n return true;\n}\n\n/**\n * 获取 KeepAlive 上下文中 vnode 的缓存 key。\n *\n * 如果 KeepAlive 实例有 `onCacheKey` prop(自定义函数),\n * 则使用该函数计算缓存 key。\n * 否则,默认 key 从 `vnode.type`(组件构造函数或标签名)派生。\n *\n * @param keepAlive - KeepAlive 组件实例\n * @param vnode - 需要计算缓存 key 的 vnode\n * @returns 字符串形式的缓存 key\n */\nexport function getCacheKey(keepAlive: ComponentInternalInstance, vnode: VNode): string {\n const onCacheKey = keepAlive.props.onCacheKey as ((vnode: VNode) => string | number) | undefined;\n\n if (isFunction(onCacheKey)) {\n try {\n return String(onCacheKey(vnode));\n } catch (e) {\n handleError(e as Error, keepAlive, 'onCacheKey');\n // FIX: P1-19 onCacheKey 异常时在 DEV 模式下发出警告,\n // 提醒开发者自定义缓存键函数可能存在问题\n if (__DEV__) {\n warn(\n `[KeepAlive] onCacheKey threw an error for vnode type \"${String(vnode.type)}\". ` +\n `Falling back to default cache key.`,\n );\n }\n }\n }\n\n // 默认:使用 vnode.type(组件构造函数或标签字符串)\n const type = vnode.type;\n if (typeof type === 'string') {\n return type;\n }\n if (type && typeof type === 'object' && 'name' in type) {\n return String((type as { name?: string }).name) || String(type);\n }\n if (typeof type === 'function' && 'name' in type) {\n return (type as { name?: string }).name || String(type);\n }\n return String(type);\n}\n\n/**\n * 在 KeepAlive 中缓存组件实例。\n * FIX: P2-8 COMPONENT-NEW-05 - LRU 缓存自动处理容量限制\n */\nexport function cacheInstance(\n keepAlive: ComponentInternalInstance,\n key: string,\n instance: ComponentInternalInstance,\n): void {\n const cache = keepAlive.setupState.cache as KeepAliveCache;\n\n // 如果已缓存,先删除旧条目(将以更新后的顺序重新添加)\n if (cache.has(key)) {\n cache.delete(key);\n }\n\n // LRU 缓存在 set() 中自动处理最大容量修剪\n cache.set(key, instance);\n}\n\n/**\n * Get a cached instance from KeepAlive.\n */\nexport function getCachedInstance(\n keepAlive: ComponentInternalInstance,\n key: string,\n): ComponentInternalInstance | undefined {\n const cache = keepAlive.setupState.cache as KeepAliveCache;\n return cache.get(key);\n}\n\n/**\n * 从 KeepAlive 移除缓存的实例。\n */\nexport function removeCachedInstance(keepAlive: ComponentInternalInstance, key: string): boolean {\n const cache = keepAlive.setupState.cache as KeepAliveCache;\n return cache.delete(key);\n}\n\n/**\n * 激活缓存的组件实例。\n */\nexport function activateInstance(instance: ComponentInternalInstance): void {\n instance.isDeactivated = false;\n // 如果定义了 activated 钩子则调用\n if (instance.type.activated) {\n instance.type.activated.call(instance.ctx);\n }\n if (instance.activatedHooks) {\n for (const hook of instance.activatedHooks) {\n try {\n hook();\n } catch (e) {\n handleError(e as Error, instance, 'activated hook');\n }\n }\n }\n}\n\n/**\n * 停用组件实例。\n */\nexport function deactivateInstance(instance: ComponentInternalInstance): void {\n instance.isDeactivated = true;\n // 如果定义了 deactivated 钩子则调用\n if (instance.type.deactivated) {\n instance.type.deactivated.call(instance.ctx);\n }\n if (instance.deactivatedHooks) {\n for (const hook of instance.deactivatedHooks) {\n try {\n hook();\n } catch (e) {\n handleError(e as Error, instance, 'deactivated hook');\n }\n }\n }\n}\n","// src/suspense.ts\n// Suspense 组件\n\nimport type { ComponentInternalInstance, ComponentOptions, SetupContext } from './types';\nimport { createComponentInstance, setupComponent } from './component';\nimport { ShapeFlags, createBaseVNode } from '@lytjs/common-vnode';\nimport type { VNode } from '@lytjs/common-vnode';\nimport { error, warn } from '@lytjs/common-error';\nimport { nextTick } from '@lytjs/common-scheduler';\nimport { registerSuspenseLinker } from '@lytjs/vdom';\nimport { getCurrentInstance } from './lifecycle';\n\n// ============================================================\n// 注册跨包的 suspense boundary 链接器\n// ============================================================\n\n// 此链接器将 vdom 层的 SuspenseBoundary 与 component 层的\n// SuspenseAsyncState 关联,使异步状态变化可以驱动 DOM 切换。\nlet _linkerRegistered = false;\nfunction ensureLinkerRegistered(): void {\n if (_linkerRegistered) return;\n _linkerRegistered = true;\n // FIX: DTS build error - SuspenseLinkerFn 参数类型是 unknown\n registerSuspenseLinker(((\n asyncState: SuspenseAsyncState,\n vnodeBoundary: SuspenseAsyncState['vnodeBoundary'],\n domSwitch: SuspenseAsyncState['domSwitch'],\n ) => {\n linkSuspenseBoundary(asyncState, vnodeBoundary, domSwitch);\n }) as (\n asyncState: unknown,\n vnodeBoundary: unknown,\n domSwitch: (boundary: unknown, toFallback: boolean) => void,\n ) => void);\n}\n\n// ==================== 类型定义 ====================\n\n/**\n * Suspense 边界被中止时抛出的错误。\n * 包含 pendingId 用于错误标识。\n */\nexport class SuspenseAbortedError extends Error {\n constructor(public pendingId: number) {\n super(`Suspense boundary (id: ${pendingId}) was aborted`);\n this.name = 'SuspenseAbortedError';\n }\n}\n\nexport interface SuspenseProps {\n timeout?: number;\n onResolve?: () => void;\n onPending?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport interface SuspenseAsyncState {\n isPending: boolean;\n error: Error | null;\n /** @deprecated 使用 pendingPromises 代替 */\n promise: Promise<unknown> | null;\n pendingPromises: Set<Promise<unknown>>;\n onResolve: (() => void)[];\n onPending: (() => void)[];\n onError: ((error: Error) => void)[];\n aborted: boolean;\n /**\n * 关联的 vdom 层 SuspenseBoundary 引用。\n * 当异步状态变化时,通过此引用驱动 DOM 切换。\n */\n vnodeBoundary?: {\n vnode: VNode;\n container: unknown;\n anchor: unknown;\n parentComponent: ComponentInternalInstance | null;\n isSVG: boolean;\n isInFallback: boolean;\n activeBranch: VNode | null;\n pendingBranch: VNode | null;\n };\n /**\n * DOM 切换函数,由 vdom 层的 patch 函数提供。\n * 用于在 pending/resolve 状态变化时执行实际的 DOM 操作。\n */\n domSwitch?: (boundary: SuspenseAsyncState, toFallback: boolean) => void;\n}\n\n// ==================== Suspense 组件 ====================\n\nexport const Suspense: ComponentOptions = {\n name: 'Suspense',\n\n props: {\n timeout: { type: Number, default: undefined },\n },\n\n setup(_props: Record<string, unknown>, _ctx: SetupContext) {\n // 确保跨包链接器已注册,以便 vdom 可以调用 linkSuspenseBoundary\n ensureLinkerRegistered();\n\n // __DEV__ mode: validate props types\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n const props = _props as SuspenseProps;\n if (props.timeout !== undefined && typeof props.timeout !== 'number') {\n warn(`[Suspense] Invalid prop: timeout should be a number, got ${typeof props.timeout}.`);\n }\n if (props.onResolve !== undefined && typeof props.onResolve !== 'function') {\n warn(\n `[Suspense] Invalid prop: onResolve should be a function, got ${typeof props.onResolve}.`,\n );\n }\n if (props.onPending !== undefined && typeof props.onPending !== 'function') {\n warn(\n `[Suspense] Invalid prop: onPending should be a function, got ${typeof props.onPending}.`,\n );\n }\n if (props.onError !== undefined && typeof props.onError !== 'function') {\n warn(`[Suspense] Invalid prop: onError should be a function, got ${typeof props.onError}.`);\n }\n }\n\n const boundary: SuspenseAsyncState = {\n isPending: false,\n error: null,\n promise: null,\n pendingPromises: new Set(),\n onResolve: [],\n onPending: [],\n onError: [],\n aborted: false,\n };\n\n const props = _props as SuspenseProps;\n if (props.onResolve) boundary.onResolve.push(props.onResolve);\n if (props.onPending) boundary.onPending.push(props.onPending);\n if (props.onError) boundary.onError.push(props.onError);\n\n return {\n boundary,\n } as Record<string, unknown>;\n },\n};\n\n// ==================== Suspense 辅助函数 ====================\n\n/**\n * 创建 Suspense 组件实例。\n */\nexport function createSuspenseInstance(\n props: SuspenseProps = {},\n parent: ComponentInternalInstance | null = null,\n): ComponentInternalInstance {\n const vnode: VNode = createBaseVNode({\n type: Suspense,\n props: {\n timeout: props.timeout,\n onResolve: props.onResolve,\n onPending: props.onPending,\n onError: props.onError,\n },\n shapeFlag: ShapeFlags.SUSPENSE | ShapeFlags.STATEFUL_COMPONENT,\n });\n\n const instance = createComponentInstance(vnode, parent);\n setupComponent(instance);\n return instance;\n}\n\n/**\n * 创建 suspense boundary 用于管理异步子组件。\n */\nexport function createSuspenseBoundary(): SuspenseAsyncState {\n return {\n isPending: false,\n error: null,\n promise: null,\n pendingPromises: new Set(),\n onResolve: [],\n onPending: [],\n onError: [],\n aborted: false,\n };\n}\n\n/**\n * Register an async child with the suspense boundary.\n * Returns true if this is the first pending child (transition to pending).\n */\nexport function registerAsyncChild(\n boundary: SuspenseAsyncState,\n promise: Promise<unknown>,\n): boolean {\n // FIX: P2-18 嵌套 suspense 支持:检查是否在嵌套 suspense 中\n // 如果当前 suspense 已被中止(可能是父级 suspense abort 导致),\n // 直接返回 false 避免无效操作\n if (boundary.aborted) return false;\n\n const wasPending = boundary.isPending;\n boundary.isPending = true;\n boundary.error = null;\n\n // 在集合中追踪此 Promise\n boundary.pendingPromises.add(promise);\n\n // 仅在第一个 pending 子组件时调用 onPending 回调\n if (!wasPending) {\n for (const cb of boundary.onPending) {\n cb();\n }\n // 触发 DOM 切换:显示 fallback slot\n if (boundary.domSwitch) {\n const switchFn = boundary.domSwitch;\n nextTick(() => {\n if (!boundary.aborted) {\n switchFn(boundary, true);\n }\n });\n }\n }\n\n promise\n .then((result: unknown) => {\n if (boundary.aborted) return;\n boundary.pendingPromises.delete(promise);\n // 当所有 Promise 都解析完成时,转换到 resolved 状态\n if (boundary.pendingPromises.size === 0) {\n boundary.isPending = false;\n boundary.promise = null;\n // 调用 onResolve 回调\n for (const cb of boundary.onResolve) {\n try {\n cb();\n } catch (e) {\n error(`Error in suspense resolve callback: ${String(e)}`);\n }\n }\n // 触发 DOM 切换:从 fallback 切回 default slot\n if (boundary.domSwitch) {\n const switchFn = boundary.domSwitch;\n nextTick(() => {\n if (!boundary.aborted) {\n switchFn(boundary, false);\n }\n });\n }\n }\n return result;\n })\n .catch((err: unknown) => {\n if (boundary.aborted) return;\n boundary.pendingPromises.delete(promise);\n const caughtError = err instanceof Error ? err : new Error(String(err));\n boundary.error = caughtError;\n // 当所有 Promise 都完成时,根据错误状态转换\n if (boundary.pendingPromises.size === 0) {\n boundary.isPending = false;\n boundary.promise = null;\n // 调用 onError 回调(P1-16 修复:之前错误地调用了 onPending)\n for (const cb of boundary.onError) {\n try {\n cb(caughtError);\n } catch (e) {\n error(`Error in suspense error callback: ${String(e)}`);\n }\n }\n }\n });\n\n return !wasPending;\n}\n\n/**\n * 检查 suspense boundary 当前是否处于 pending 状态。\n */\nexport function isSuspensePending(boundary: SuspenseAsyncState): boolean {\n return boundary.isPending;\n}\n\n/**\n * Get the error from a suspense boundary (if any).\n */\nexport function getSuspenseError(boundary: SuspenseAsyncState): Error | null {\n return boundary.error;\n}\n\n/**\n * 将 vdom 层的 SuspenseBoundary 与 component 层的 SuspenseAsyncState 关联。\n * 由 vdom 的 mountSuspense 调用,使异步状态变化能驱动 DOM 切换。\n */\nexport function linkSuspenseBoundary(\n asyncState: SuspenseAsyncState,\n vnodeBoundary: SuspenseAsyncState['vnodeBoundary'],\n domSwitch: SuspenseAsyncState['domSwitch'],\n): void {\n asyncState.vnodeBoundary = vnodeBoundary;\n asyncState.domSwitch = domSwitch;\n}\n\n/**\n * 手动解决 suspense boundary。\n *\n * FIX: P1-20 添加语义注释:\n * resolveSuspense 用于手动将 suspense 边界标记为已解决状态。\n * 调用后,所有 pending 的 Promise 将被忽略(通过设置 aborted = true),\n * onResolve 回调将被触发,DOM 将从 fallback 切回默认内容。\n * 注意:此方法不会等待正在进行的异步操作完成,而是立即强制解决。\n * 适用场景:用户手动取消等待、路由切换等需要立即恢复的场景。\n */\nexport function resolveSuspense(boundary: SuspenseAsyncState): void {\n boundary.isPending = false;\n boundary.aborted = true;\n boundary.promise = null;\n boundary.error = null;\n boundary.pendingPromises.clear();\n for (const cb of boundary.onResolve) {\n try {\n cb();\n } catch (e) {\n error(`Error in suspense resolve callback: ${String(e)}`);\n }\n }\n}\n\n/**\n * 中止 suspense boundary(例如在卸载时)。\n * 拒绝所有 pending 的 Promise 以防止内存泄漏,并允许\n * 下游消费者通过 .catch() 处理中止。\n *\n * FIX: P1-20 添加语义注释:\n * abortSuspense 用于在组件卸载等场景下中止 suspense 边界。\n * 与 resolveSuspense 不同,abortSuspense 不会触发 onResolve 回调,\n * 而是清空所有回调数组以防止后续调用。所有 pending 的 Promise\n * 将尝试通过 abort 方法取消(如果是自定义 thenable)。\n * 适用场景:组件卸载、路由切换导致组件树销毁等。\n */\nexport function abortSuspense(boundary: SuspenseAsyncState): void {\n boundary.aborted = true;\n boundary.isPending = false;\n boundary.promise = null;\n\n // 拒绝所有 pending 的 Promise 以防止内存泄漏。\n // 由于原生 JavaScript Promise 无法从外部拒绝,\n // 如果 Promise 是自定义 thenable,会尝试调用 abort 方法。\n // 对于原生 Promise,依赖 aborted 标志使\n // registerAsyncChild 中的 .then()/.catch() 回调跳过副作用。\n if (boundary.pendingPromises.size > 0) {\n // FIX: P2-33 使用实际 pendingId 标识中止的 suspense 边界,\n // 而非硬编码 pendingId=0,便于错误追踪和调试\n const abortError = new SuspenseAbortedError(boundary.pendingPromises.size);\n boundary.pendingPromises.forEach((promise) => {\n try {\n // 如果 Promise 有 abort 方法(自定义 thenable),调用它\n const p = promise as unknown as Record<string, unknown>;\n if (typeof p.abort === 'function') {\n p.abort(abortError);\n }\n } catch {\n // 忽略中止期间的错误\n }\n });\n boundary.pendingPromises.clear();\n }\n\n // 清空所有回调数组,防止 abort 后仍被调用导致内存泄漏或无效操作。\n // 使用 length = 0 方式清空数组,保持数组引用不变(避免影响外部持有的引用)。\n boundary.onResolve.length = 0;\n boundary.onPending.length = 0;\n boundary.onError.length = 0;\n}\n\n// ==================== useSuspense 和 startTransition ====================\n\n// 全局当前 suspense boundary 追踪\nlet currentSuspenseBoundary: SuspenseAsyncState | null = null;\n\n/**\n * useSuspense Hook\n * 将 Promise 注册到当前 Suspense 边界\n */\nexport function useSuspense<T>(promise: Promise<T>, _key?: string): T {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error('useSuspense must be called within a component setup function');\n }\n\n // 查找最近的 Suspense 边界\n let boundary = findNearestSuspenseBoundary(instance);\n if (!boundary) {\n // 如果没有找到,创建一个临时的\n boundary = createSuspenseBoundary();\n }\n\n // 注册异步子组件\n registerAsyncChild(boundary, promise);\n\n // 同步抛出 Promise 以触发 Suspense(标准 Suspense 模式)\n // 这里我们返回一个占位值,实际值在 Promise 解析后可用\n // 对于实际实现,这需要与渲染器集成\n return undefined as T;\n}\n\n/**\n * 查找最近的 Suspense 边界\n */\nfunction findNearestSuspenseBoundary(\n instance: ComponentInternalInstance,\n): SuspenseAsyncState | null {\n let current: ComponentInternalInstance | null = instance;\n while (current) {\n // 检查当前实例是否是 Suspense 组件或有 suspense boundary\n if (current.type === Suspense) {\n const setupState = current.setupState as Record<string, unknown>;\n if (setupState?.boundary) {\n return setupState.boundary as SuspenseAsyncState;\n }\n }\n current = current.parent;\n }\n return null;\n}\n\n/**\n * startTransition 函数\n * 标记更新为过渡更新,不会立即触发 Suspense fallback\n */\nexport function startTransition(callback: () => void): void {\n const previousBoundary = currentSuspenseBoundary;\n try {\n // 设置一个标记,表示这是过渡更新\n // 实际实现需要与调度器集成\n callback();\n } finally {\n currentSuspenseBoundary = previousBoundary;\n }\n}\n\n/**\n * SuspenseResource 类\n * 用于管理可缓存的异步资源\n */\nexport class SuspenseResource<T> {\n private status: 'pending' | 'success' | 'error' = 'pending';\n private value: T | null = null;\n private error: Error | null = null;\n private promise: Promise<T> | null = null;\n\n constructor(factory: () => Promise<T>) {\n this.load(factory);\n }\n\n private load(factory: () => Promise<T>): void {\n this.status = 'pending';\n this.promise = factory()\n .then((result) => {\n this.value = result;\n this.status = 'success';\n return result;\n })\n .catch((err) => {\n this.error = err instanceof Error ? err : new Error(String(err));\n this.status = 'error';\n throw this.error;\n });\n }\n\n read(): T {\n if (this.status === 'success') {\n return this.value!;\n }\n if (this.status === 'error') {\n throw this.error;\n }\n throw this.promise;\n }\n\n refresh(factory: () => Promise<T>): void {\n this.load(factory);\n }\n}\n\n/**\n * 创建 Suspense 资源\n */\nexport function createSuspenseResource<T>(factory: () => Promise<T>): SuspenseResource<T> {\n return new SuspenseResource(factory);\n}\n","// src/transition.ts\n// Transition 组件定义\n//\n// 泛型化重构:TransitionComponentProps 中的回调类型从 Element 改为泛型 HE。\n// 保留 TransitionComponentPropsLegacy 类型别名以确保向后兼容。\n\nimport type { ComponentOptions, SetupContext } from './types';\nimport type { VNode } from '@lytjs/vdom';\n\n// ==================== Transition Props ====================\n\n/**\n * Transition 组件属性(泛型版本)。\n * @template HE - 宿主元素类型\n */\nexport interface TransitionComponentProps<HE = unknown> {\n name?: string;\n appear?: boolean;\n mode?: 'in-out' | 'out-in' | 'default';\n enterFromClass?: string;\n enterActiveClass?: string;\n enterToClass?: string;\n leaveFromClass?: string;\n leaveActiveClass?: string;\n leaveToClass?: string;\n onBeforeEnter?: (el: HE) => void;\n onEnter?: (el: HE, done: () => void) => void;\n onAfterEnter?: (el: HE) => void;\n onEnterCancelled?: (el: HE) => void;\n onBeforeLeave?: (el: HE) => void;\n onLeave?: (el: HE, done: () => void) => void;\n onAfterLeave?: (el: HE) => void;\n onLeaveCancelled?: (el: HE) => void;\n}\n\n/**\n * @deprecated 使用 TransitionComponentProps<HE> 代替。\n * 保留此类型别名以确保向后兼容。\n */\nexport type TransitionComponentPropsLegacy = TransitionComponentProps<Element>;\n\n// ==================== Transition Component ====================\n\nexport const Transition: ComponentOptions = {\n name: 'Transition',\n\n props: {\n name: { type: String },\n appear: { type: Boolean, default: false },\n mode: { type: String, default: 'default' },\n enterFromClass: { type: String },\n enterActiveClass: { type: String },\n enterToClass: { type: String },\n leaveFromClass: { type: String },\n leaveActiveClass: { type: String },\n leaveToClass: { type: String },\n onBeforeEnter: { type: Function },\n onEnter: { type: Function },\n onAfterEnter: { type: Function },\n onEnterCancelled: { type: Function },\n onBeforeLeave: { type: Function },\n onLeave: { type: Function },\n onAfterLeave: { type: Function },\n onLeaveCancelled: { type: Function },\n },\n\n // FIX: P0-06 移除多余的 IIFE 包装和 as unknown as void 类型欺骗,\n // 直接返回渲染函数,让组件系统正确识别 setup 返回的渲染函数\n // FIX: DTS build error - 添加类型断言\n setup(_props: Record<string, unknown>, { slots }: SetupContext) {\n return (() => slots.default?.()) as unknown as () => VNode;\n },\n};\n","// src/transition-group.ts\n// TransitionGroup 组件定义\n//\n// 泛型化重构:TransitionGroupComponentProps 中的回调类型从 Element 改为泛型 HE。\n// 保留 TransitionGroupComponentPropsLegacy 类型别名以确保向后兼容。\n\nimport type { ComponentOptions, SetupContext } from './types';\nimport type { VNode } from '@lytjs/vdom';\n\n// ==================== TransitionGroup Props ====================\n\n/**\n * TransitionGroup 组件属性(泛型版本)。\n * @template HE - 宿主元素类型\n */\nexport interface TransitionGroupComponentProps<HE = unknown> {\n name?: string;\n appear?: boolean;\n tag?: string | false;\n moveClass?: string;\n enterFromClass?: string;\n enterActiveClass?: string;\n enterToClass?: string;\n leaveFromClass?: string;\n leaveActiveClass?: string;\n leaveToClass?: string;\n onBeforeEnter?: (el: HE) => void;\n onEnter?: (el: HE, done: () => void) => void;\n onAfterEnter?: (el: HE) => void;\n onEnterCancelled?: (el: HE) => void;\n onBeforeLeave?: (el: HE) => void;\n onLeave?: (el: HE, done: () => void) => void;\n onAfterLeave?: (el: HE) => void;\n onLeaveCancelled?: (el: HE) => void;\n}\n\n/**\n * @deprecated 使用 TransitionGroupComponentProps<HE> 代替。\n * 保留此类型别名以确保向后兼容。\n */\nexport type TransitionGroupComponentPropsLegacy = TransitionGroupComponentProps<Element>;\n\n// ==================== TransitionGroup Component ====================\n\nexport const TransitionGroup: ComponentOptions = {\n name: 'TransitionGroup',\n\n props: {\n name: { type: String },\n appear: { type: Boolean, default: false },\n tag: { type: [String, Boolean] as unknown as new () => string | boolean },\n moveClass: { type: String },\n enterFromClass: { type: String },\n enterActiveClass: { type: String },\n enterToClass: { type: String },\n leaveFromClass: { type: String },\n leaveActiveClass: { type: String },\n leaveToClass: { type: String },\n onBeforeEnter: { type: Function },\n onEnter: { type: Function },\n onAfterEnter: { type: Function },\n onEnterCancelled: { type: Function },\n onBeforeLeave: { type: Function },\n onLeave: { type: Function },\n onAfterLeave: { type: Function },\n onLeaveCancelled: { type: Function },\n },\n\n // FIX: DTS build error - 添加类型断言\n setup(_props: Record<string, unknown>, { slots }: SetupContext) {\n return (() => slots.default?.()) as unknown as () => VNode;\n },\n};\n","import type { ComponentOptions } from './types';\n\nexport interface TeleportProps {\n to: string | Element;\n disabled?: boolean;\n}\n\nexport const Teleport: ComponentOptions = {\n name: 'Teleport',\n // FIX: P1-21 定义正确的 props 类型替代 as any\n // FIX: DTS build error - 使用 any 避免 PropConstructor 类型不兼容\n // FIX: DTS build error - props 使用 any 类型\n props: {\n to: { type: [String, Object] as unknown as new (...args: unknown[]) => object, required: true },\n disabled: { type: Boolean, default: false },\n },\n setup() {\n // Teleport is handled by the vdom patch algorithm.\n // The actual Teleport logic (mounting to target, disabled handling)\n // lives in vdom's patch function (mountTeleport / patchTeleport).\n // FIX: P2-19 disabled 状态切换动画:\n // 当 disabled 属性在 true/false 之间切换时,vdom 层的 patchTeleport\n // 负责处理 DOM 节点的移动和过渡动画。组件层无需额外处理。\n },\n};\n","// src/error-boundary.ts\n// ErrorBoundary 组件,用于捕获和处理子组件中的错误\n\nimport type { ComponentOptions, RenderFunction } from './types';\nimport type { VNode as VNodeType } from '@lytjs/vdom';\nimport { onErrorCaptured, onMounted, onUnmounted } from './lifecycle';\nimport { ref } from '@lytjs/reactivity';\nimport { createVNode } from '@lytjs/vdom';\nimport { Text, Fragment } from '@lytjs/common-vnode';\nimport type { VNode } from '@lytjs/common-vnode';\n\n// FIX: P1-11 RUNTIME-NEW-01 - 异步错误捕获改进\n// FIX: P1-8 使用 Set 跟踪所有活跃的 ErrorBoundary 实例,\n// 避免后挂载实例覆盖前一个的单例问题\ninterface ActiveErrorBoundary {\n handler: (event: PromiseRejectionEvent) => void;\n}\n\nconst activeErrorBoundaries = new Set<ActiveErrorBoundary>();\nlet globalHandlerInstalled = false;\n\n// FIX: P2-18 提取全局处理器函数,以便正确移除监听器\nfunction globalUnhandledRejectionHandler(event: PromiseRejectionEvent): void {\n // 通知所有活跃的 ErrorBoundary 实例\n for (const eb of activeErrorBoundaries) {\n eb.handler(event);\n }\n}\n\nexport interface ErrorBoundaryProps {\n onError?: (error: Error, info: string) => void;\n fallback?: ComponentOptions;\n}\n\n// FIX: P2-35 类型守卫:检查 props 是否为 ErrorBoundaryProps\n// FIX: DTS build error - 添加索引签名\ninterface ErrorBoundaryPropsInternal extends ErrorBoundaryProps {\n capturePromiseRejections?: boolean;\n [key: string]: unknown;\n}\n\nfunction isErrorBoundaryProps(props: Record<string, unknown>): props is ErrorBoundaryPropsInternal {\n return props !== null && typeof props === 'object';\n}\n\nexport const ErrorBoundary: ComponentOptions = {\n name: 'ErrorBoundary',\n props: {\n onError: { type: Function },\n fallback: { type: Object },\n /** 是否捕获异步 Promise 错误 */\n capturePromiseRejections: { type: Boolean, default: false },\n },\n setup(props: Record<string, unknown>) {\n const error = ref<Error | null>(null);\n const hasError = ref(false);\n\n // FIX: P2-35 使用类型守卫替代重复的类型断言\n const typedProps = isErrorBoundaryProps(props) ? props : ({} as ErrorBoundaryPropsInternal);\n\n // 使用 onErrorCaptured 捕获子组件错误\n onErrorCaptured((err: Error, _instance: unknown, info: string) => {\n error.value = err;\n // FIX: DTS build error - 显式转换为 boolean\n (hasError as { value: boolean }).value = true;\n // FIX: P2-39 错误边界:添加更友好的错误处理\n // FIX: DTS build error - 类型断言\n (typedProps.onError as ((error: Error, info: string) => void) | undefined)?.(err, info);\n return false; // 阻止错误继续传播\n });\n\n // FIX: P1-11 RUNTIME-NEW-01 - 改进异步错误捕获\n // FIX: P1-8 使用 Set 跟踪所有活跃实例,unhandledrejection 事件通知所有实例\n let currentBoundary: ActiveErrorBoundary | null = null;\n\n onMounted(() => {\n if (typedProps.capturePromiseRejections && typeof window !== 'undefined') {\n currentBoundary = {\n handler: (event: PromiseRejectionEvent) => {\n // FIX: P2-40 错误信息不友好:改进错误消息\n const err =\n event.reason instanceof Error ? event.reason : new Error(String(event.reason));\n error.value = err;\n // FIX: DTS build error - 显式转换为 boolean\n (hasError as { value: boolean }).value = true;\n // FIX: DTS build error - 类型断言\n (typedProps.onError as ((error: Error, info: string) => void) | undefined)?.(\n err,\n 'unhandledrejection',\n );\n },\n };\n\n activeErrorBoundaries.add(currentBoundary);\n\n // 只安装一次全局 unhandledrejection 事件监听器\n if (!globalHandlerInstalled) {\n globalHandlerInstalled = true;\n window.addEventListener('unhandledrejection', globalUnhandledRejectionHandler);\n }\n }\n });\n\n onUnmounted(() => {\n if (currentBoundary) {\n activeErrorBoundaries.delete(currentBoundary);\n currentBoundary = null;\n // FIX: P2-18 当所有 ErrorBoundary 实例都被卸载时,移除全局监听器\n if (activeErrorBoundaries.size === 0 && globalHandlerInstalled) {\n globalHandlerInstalled = false;\n window.removeEventListener('unhandledrejection', globalUnhandledRejectionHandler);\n }\n }\n });\n\n const render: RenderFunction = (ctx): VNode => {\n if (hasError.value) {\n // 错误状态:如果提供了 fallback 插槽则渲染,否则渲染默认错误信息\n const fallbackSlot = ctx.$slots.fallback;\n if (fallbackSlot) {\n const result = fallbackSlot({ error: error.value });\n // FIX: P2-28 处理 fallback slot 返回单个 VNode(非数组)的情况\n if (!Array.isArray(result)) {\n return result as VNode;\n }\n if (result.length > 0) {\n // 使用 Fragment 包装插槽中的多个根节点\n if (result.length === 1) {\n return result[0] as VNode;\n }\n return createVNode(Fragment, null, result as VNode[]);\n }\n }\n // 默认错误 UI\n return createVNode(\n Text,\n null,\n error.value ? `Error: ${error.value.message}` : 'An error occurred',\n );\n }\n\n // 正常状态:渲染默认插槽(子组件)\n const defaultSlot = ctx.$slots.default;\n if (defaultSlot) {\n const result = defaultSlot();\n if (Array.isArray(result) && result.length > 0) {\n // 使用 Fragment 包装插槽中的多个根节点\n if (result.length === 1) {\n return result[0] as VNode;\n }\n return createVNode(Fragment, null, result as VNodeType[]);\n }\n }\n\n return createVNode(Text, null, '');\n };\n\n return { error, hasError, render };\n },\n};\n","// src/signal-state.ts\n// Signal 状态适配器,用于组件集成\n\nimport { signal, computedSignal } from '@lytjs/reactivity';\nimport type { Signal, ComputedSignal } from '@lytjs/reactivity';\n\n/**\n * 创建与组件协作的 Signal State\n */\nexport function createSignalState<T>(initialValue: T): Signal<T> {\n return signal(initialValue);\n}\n\n/**\n * 创建与组件协作的 Computed Signal State\n */\nexport function createComputedState<T>(getter: () => T): ComputedSignal<T> {\n return computedSignal(getter);\n}\n","// src/async-component.ts\n// 异步组件加载器(支持预加载)\n// FIX: P2-7 COMPONENT-NEW-04 - 异步组件加载与预加载支持\n\nimport type { ComponentOptions, ComponentInternalInstance } from './types';\nimport type { VNode, VNodeChildren } from '@lytjs/vdom';\n// FIX: DTS build error - 删除未使用的导入\n// import { createComponentInstance, setupComponent } from './component';\n// FIX: DTS build error - 统一从vdom 导入\nimport { ShapeFlags, createVNode, createCommentVNode } from '@lytjs/vdom';\nimport { isFunction } from '@lytjs/common-is';\nimport { warn } from '@lytjs/common-error';\nimport { getCurrentInstance, onBeforeUnmount } from './lifecycle';\n\n// ==================== 类型定义 ====================\n\n/**\n * 异步组件加载器函数类型\n */\nexport type AsyncComponentLoader<T = unknown> = () => Promise<T>;\n\n/**\n * 定义异步组件的选项\n */\nexport interface AsyncComponentOptions {\n /**\n * 返回 Promise 解析为组件的加载器函数\n */\n loader: AsyncComponentLoader<ComponentOptions>;\n\n /**\n * 异步组件加载时显示的组件\n */\n loadingComponent?: ComponentOptions;\n\n /**\n * 异步组件加载失败时显示的组件\n */\n errorComponent?: ComponentOptions;\n\n /**\n * 显示加载组件前的延迟时间(毫秒)\n * @default 200\n */\n delay?: number;\n\n /**\n * 异步组件加载的超时时间(毫秒)\n */\n timeout?: number;\n\n /**\n * 是否挂起组件渲染直到加载完成\n * @default false\n */\n suspensible?: boolean;\n\n /**\n * 异步组件加载失败时的错误处理器\n */\n onError?: (error: Error) => void;\n}\n\n/**\n * 异步组件加载的内部状态\n */\ninterface AsyncComponentState {\n loadedComponent: ComponentOptions | null;\n error: Error | null;\n isLoading: boolean;\n isLoaded: boolean;\n isError: boolean;\n loadingPromise: Promise<void> | null;\n}\n\n// ==================== 预加载注册表 ====================\n\n/**\n * 预加载组件的注册表\n * 将加载器函数映射到其预加载的组件 Promise\n */\nconst preloadedComponents = new WeakMap<AsyncComponentLoader, Promise<ComponentOptions>>();\n\n/**\n * 活跃的异步组件实例注册表\n * 用于跨重渲染追踪加载状态\n */\nconst asyncComponentStates = new WeakMap<ComponentInternalInstance, AsyncComponentState>();\n\n// ==================== 异步组件工厂 ====================\n\n/**\n * 定义一个异步组件,支持加载、错误和预加载功能。\n *\n * @example\n * ```ts\n * const AsyncComp = defineAsyncComponent({\n * loader: () => import('./MyComponent.vue'),\n * loadingComponent: LoadingSpinner,\n * errorComponent: ErrorDisplay,\n * delay: 200,\n * timeout: 3000,\n * });\n *\n * // Preload the component before it's needed\n * AsyncComp.preload();\n * ```\n */\nexport function defineAsyncComponent(\n options: AsyncComponentOptions | AsyncComponentLoader<ComponentOptions>,\n): ComponentOptions & { preload: () => Promise<void> } {\n // 规范化选项\n const normalizedOptions: AsyncComponentOptions = isFunction(options)\n ? { loader: options }\n : options;\n\n const {\n loader,\n loadingComponent,\n errorComponent,\n delay = 200,\n timeout,\n // FIX: DTS build error - suspensible 未使ç”?\n // suspensible = false,\n onError,\n } = normalizedOptions;\n\n let loadPromise: Promise<ComponentOptions> | null = null;\n\n /**\n * 加载异步组件\n */\n function load(): Promise<ComponentOptions> {\n // 如果有缓存的预加载 Promise 则直接返回\n if (preloadedComponents.has(loader)) {\n return preloadedComponents.get(loader)!;\n }\n\n // 如果正在加载中,返回现有的加载 Promise\n if (loadPromise) {\n return loadPromise;\n }\n\n // 创建新的加载 Promise\n loadPromise = loader()\n .then((comp) => {\n // 处理 ES 模块默认导出\n const resolvedComponent = (comp as { default?: ComponentOptions }).default || comp;\n\n // 缓存已加载的组件\n preloadedComponents.set(loader, Promise.resolve(resolvedComponent));\n\n return resolvedComponent;\n })\n .catch((err: unknown) => {\n loadPromise = null;\n const error = err instanceof Error ? err : new Error(String(err));\n\n if (onError) {\n onError(error);\n }\n\n throw error;\n });\n\n return loadPromise;\n }\n\n /**\n * Preload the async component before it's needed.\n * This allows eager loading of components that are likely to be needed soon.\n */\n function preload(): Promise<void> {\n if (preloadedComponents.has(loader)) {\n return Promise.resolve();\n }\n\n return load()\n .then(() => {\n // 预加载完成\n })\n .catch(() => {\n // 预加载错误静默处理 - 实际渲染时会处理\n });\n }\n\n // 创建异步组件包装器\n const AsyncComponentWrapper: ComponentOptions = {\n name: 'AsyncComponentWrapper',\n\n setup(_props: Record<string, unknown>, { slots }: { slots?: Record<string, unknown> }) {\n const instance = getCurrentInstance();\n\n // 获取或创建此实例的状态\n let state: AsyncComponentState;\n if (instance && asyncComponentStates.has(instance)) {\n state = asyncComponentStates.get(instance)!;\n } else {\n state = {\n loadedComponent: null,\n error: null,\n isLoading: false,\n isLoaded: false,\n isError: false,\n loadingPromise: null,\n };\n if (instance) {\n asyncComponentStates.set(instance, state);\n }\n }\n\n // 如果已加载,返回已加载的组件\n if (state.isLoaded && state.loadedComponent) {\n return () => renderLoadedComponent(state.loadedComponent!, slots);\n }\n\n // 如果发生错误,显示错误组件\n if (state.isError) {\n return () =>\n errorComponent\n ? createComponentVNode(errorComponent, { error: state.error })\n : createAsyncCommentVNode(' Async component error ');\n }\n\n // 如果尚未加载,开始加载\n if (!state.isLoading) {\n state.isLoading = true;\n\n // FIX: DTS build error - loadStartTime 未使ç”?\n // const loadStartTime = Date.now();\n\n state.loadingPromise = load()\n .then((comp) => {\n state.loadedComponent = comp;\n state.isLoaded = true;\n state.isLoading = false;\n\n // 触发重新渲染\n if (instance) {\n triggerComponentUpdate(instance);\n }\n })\n .catch((err: unknown) => {\n state.error = err instanceof Error ? err : new Error(String(err));\n state.isError = true;\n state.isLoading = false;\n\n // 触发重新渲染以显示错误\n if (instance) {\n triggerComponentUpdate(instance);\n }\n });\n\n // 处理超时\n // FIX: P2-38 超时定时器在组件卸载时通过 onScopeDispose 清理,\n // 避免组件卸载后定时器仍然触发导致无效操作和内存泄漏\n if (timeout !== undefined && timeout > 0) {\n const timeoutId = setTimeout(() => {\n if (!state.isLoaded && !state.isError) {\n state.error = new Error(`Async component loading timed out after ${timeout}ms`);\n state.isError = true;\n state.isLoading = false;\n\n if (instance) {\n triggerComponentUpdate(instance);\n }\n }\n }, timeout);\n\n // FIX: DTS build error - 使用 onBeforeUnmount 替代 onScopeDispose\n onBeforeUnmount(() => {\n clearTimeout(timeoutId);\n });\n }\n }\n\n // 加载中返回加载组件或占位符\n return () => {\n // 如果 delay 为 0 或组件已预加载,不显示加载状态\n if (delay === 0 && state.isLoading && !state.loadedComponent) {\n return createAsyncCommentVNode(' Async component loading ');\n }\n\n // 如果配置了加载组件则显示\n if (loadingComponent) {\n return createComponentVNode(loadingComponent, {});\n }\n\n return createAsyncCommentVNode(' Async component loading ');\n };\n },\n };\n\n // 将预加载方法附加到组件上\n return Object.assign(AsyncComponentWrapper, { preload });\n}\n\n// ==================== 辅助函数 ====================\n\n/**\n * 通过调用 instance.update() 触发组件更新。\n * 如果 instance.update 不可用,回退到基于 nextTick 的重新渲染。\n */\nfunction triggerComponentUpdate(instance: ComponentInternalInstance): void {\n if (instance.update) {\n instance.update();\n }\n}\n\n/**\n * 为组件创建 VNode\n */\nfunction createComponentVNode(component: ComponentOptions, props: Record<string, unknown>): VNode {\n return createVNode(component, props, null, ShapeFlags.STATEFUL_COMPONENT);\n}\n\n/**\n * 创建注释 VNode(本地辅助函数)\n * FIX: DTS build error - 重命名避免与导入的 createCommentVNode 冲突\n */\nfunction createAsyncCommentVNode(text: string): VNode {\n // FIX: DTS build error - 调用导入的 createCommentVNode\n return createCommentVNode(text);\n}\n\n/**\n * 渲染已加载的组件\n */\nfunction renderLoadedComponent(\n component: ComponentOptions,\n slots?: Record<string, unknown>,\n): VNode {\n // FIX: DTS build error - slots 类型断言\n return createVNode(component, {}, slots as VNodeChildren, ShapeFlags.STATEFUL_COMPONENT);\n}\n\n// ==================== 预加载工具函数 ====================\n\n/**\n * 一次性预加载多个异步组件。\n *\n * @example\n * ```ts\n * preloadComponents([\n * () => import('./CompA.vue'),\n * () => import('./CompB.vue'),\n * () => import('./CompC.vue'),\n * ]);\n * ```\n */\nexport function preloadComponents(loaders: AsyncComponentLoader[]): Promise<void> {\n return Promise.all(loaders.map((loader) => preloadComponent(loader))).then(() => {\n // 所有组件预加载完成\n });\n}\n\n/**\n * 通过加载器函数预加载单个组件。\n */\nexport function preloadComponent(loader: AsyncComponentLoader): Promise<void> {\n if (preloadedComponents.has(loader)) {\n return Promise.resolve();\n }\n\n return (loader() as Promise<ComponentOptions>)\n .then((comp) => {\n const resolvedComponent = (comp as { default?: ComponentOptions }).default || comp;\n preloadedComponents.set(loader, Promise.resolve(resolvedComponent));\n })\n .catch(() => {\n // 预加载错误静默处理\n });\n}\n\n/**\n * 检查组件是否已被预加载。\n */\nexport function isComponentPreloaded(loader: AsyncComponentLoader): boolean {\n return preloadedComponents.has(loader);\n}\n\n/**\n * 清除特定加载器或所有加载器的预加载缓存。\n */\nexport function clearPreloadCache(loader?: AsyncComponentLoader): void {\n if (loader) {\n preloadedComponents.delete(loader);\n } else {\n // 注意:WeakMap 无法完全清空\n // 如果需要完全清空,应改用 Map\n if (__DEV__) {\n warn(\n 'clearPreloadCache() without arguments is not supported with WeakMap. ' +\n 'Pass a specific loader to clear, or consider using a Map instead.',\n );\n }\n }\n}\n\n// ==================== 导出类型 ====================\n\nexport type { AsyncComponentState };\n","// packages/component/src/di/index.ts\n// 依赖注入增强模块\n// Phase 1.8-1.11: 多级 Provider、可选注入、InjectionToken、生命周期管理\n\nimport { hasOwn } from '@lytjs/common-is';\nimport { getCurrentInstance } from '../lifecycle';\nimport { effectScope } from '@lytjs/reactivity';\nimport type { EffectScope } from '@lytjs/reactivity';\nimport type { ComponentInternalInstance } from '@lytjs/shared-types';\n\n// ============================================================\n// Phase 1.10: InjectionToken - 类型安全的注入令牌\n// ============================================================\n\n/**\n * InjectionToken - 类型安全的注入令牌\n *\n * 与 InjectionKey 不同,InjectionToken 是一个类实例,\n * 可以携带更多元数据(如描述、工厂函数、生命周期等)\n *\n * @example\n * ```ts\n * const API_URL = new InjectionToken<string>('api-url');\n * const Database = new InjectionToken<Database>('database', {\n * factory: () => new Database(),\n * lifecycle: 'singleton',\n * });\n * ```\n */\nexport class InjectionToken<T> {\n /** 令牌描述 */\n readonly description: string;\n /** 令牌唯一标识 */\n readonly __token: symbol;\n /** 工厂函数 */\n readonly factory?: () => T;\n /** 生命周期 */\n readonly lifecycle?: ProviderLifecycle;\n\n constructor(\n description: string,\n options?: {\n factory?: () => T;\n lifecycle?: ProviderLifecycle;\n },\n ) {\n this.description = description;\n this.__token = Symbol(description);\n this.factory = options?.factory;\n this.lifecycle = options?.lifecycle;\n }\n\n toString(): string {\n return `InjectionToken(${this.description})`;\n }\n}\n\n/**\n * 判断是否是 InjectionToken\n */\nexport function isInjectionToken(value: unknown): value is InjectionToken<unknown> {\n return value instanceof InjectionToken;\n}\n\n// ============================================================\n// Phase 1.11: 生命周期管理\n// ============================================================\n\n/** Provider 生命周期类型 */\nexport type ProviderLifecycle = 'singleton' | 'scoped' | 'transient';\n\n/** Provider 配置 */\nexport interface ProviderConfig<T = unknown> {\n /** 提供的值 */\n provide?: T;\n /** 工厂函数 */\n useFactory?: () => T;\n /** 现有令牌别名 */\n useExisting?: InjectionToken<T> | string | symbol;\n /** 生命周期 */\n lifecycle?: ProviderLifecycle;\n /** 是否可选 */\n optional?: boolean;\n}\n\n/** Provider 记录 */\ninterface ProviderRecord {\n value: unknown;\n lifecycle: ProviderLifecycle;\n scope?: EffectScope;\n instanceId?: symbol;\n}\n\n// ============================================================\n// Phase 1.8: 多级 Provider\n// ============================================================\n\n/**\n * Provider 树节点\n * 支持嵌套的 Provider 层级结构\n */\nexport interface ProviderNode {\n /** 唯一标识 */\n id: symbol;\n /** 父节点 */\n parent: ProviderNode | null;\n /** 子节点 */\n children: Set<ProviderNode>;\n /** 提供的值 */\n providers: Map<string | symbol, ProviderRecord>;\n /** 作用域 */\n scope: EffectScope;\n}\n\n/** 全局 Provider 根节点 */\nlet globalProviderRoot: ProviderNode | null = null;\n\n/** 当前 Provider 上下文 */\nlet currentProviderNode: ProviderNode | null = null;\n\n/**\n * 创建 Provider 节点\n */\nfunction createProviderNode(parent: ProviderNode | null = null): ProviderNode {\n const node: ProviderNode = {\n id: Symbol('provider-node'),\n parent,\n children: new Set(),\n providers: new Map(),\n scope: effectScope(),\n };\n\n if (parent) {\n parent.children.add(node);\n }\n\n return node;\n}\n\n/**\n * 获取或创建全局 Provider 根节点\n */\nexport function getProviderRoot(): ProviderNode {\n if (!globalProviderRoot) {\n globalProviderRoot = createProviderNode();\n }\n return globalProviderRoot;\n}\n\n/**\n * 进入新的 Provider 作用域\n */\nexport function enterProviderScope(): ProviderNode {\n const parent = currentProviderNode || getProviderRoot();\n currentProviderNode = createProviderNode(parent);\n return currentProviderNode;\n}\n\n/**\n * 退出当前 Provider 作用域\n */\nexport function exitProviderScope(): void {\n if (currentProviderNode && currentProviderNode.parent) {\n currentProviderNode.scope.stop();\n currentProviderNode.parent.children.delete(currentProviderNode);\n currentProviderNode = currentProviderNode.parent;\n }\n}\n\n/**\n * 获取当前 Provider 节点\n */\nexport function getCurrentProviderNode(): ProviderNode | null {\n return currentProviderNode;\n}\n\n// ============================================================\n// Phase 1.9: 可选注入\n// ============================================================\n\n/**\n * 增强的 Inject 选项\n */\nexport interface EnhancedInjectOptions<T = unknown> {\n /** 是否可选(找不到时不报错) */\n optional?: boolean;\n /** 默认值 */\n default?: T | (() => T);\n /** 从特定祖先查找 */\n from?: InjectionToken<T> | string | symbol;\n /** 是否仅查找当前层级 */\n local?: boolean;\n /** 是否跳过自身(仅查找祖先) */\n skipSelf?: boolean;\n}\n\n/**\n * 注入错误\n */\nexport class InjectionError extends Error {\n constructor(\n public token: string | symbol,\n message: string,\n ) {\n super(`Injection error for token \"${String(token)}\": ${message}`);\n this.name = 'InjectionError';\n }\n}\n\n// ============================================================\n// 核心 API\n// ============================================================\n\n/**\n * 提供值到当前 Provider 作用域\n *\n * @example\n * ```ts\n * // 简单值\n * provide('api-url', 'https://api.example.com');\n *\n * // 使用 InjectionToken\n * const API_URL = new InjectionToken<string>('api-url');\n * provide(API_URL, 'https://api.example.com');\n *\n * // 使用配置对象\n * provide(API_URL, {\n * useFactory: () => config.apiUrl,\n * lifecycle: 'singleton',\n * });\n * ```\n */\nexport function provide<T>(\n key: InjectionToken<T> | string | symbol,\n valueOrConfig: T | ProviderConfig<T>,\n): void {\n const instance = getCurrentInstance();\n const providerNode = currentProviderNode || (instance ? null : getProviderRoot());\n\n // 解析 key\n const actualKey = isInjectionToken(key) ? key.__token : key;\n\n // 解析配置\n let record: ProviderRecord;\n\n if (isProviderConfig(valueOrConfig)) {\n const config = valueOrConfig;\n const lifecycle = config.lifecycle || 'singleton';\n\n if (config.provide !== undefined) {\n record = {\n value: config.provide,\n lifecycle,\n };\n } else if (config.useFactory) {\n record = {\n value: config.useFactory(),\n lifecycle,\n };\n } else if (config.useExisting) {\n // 延迟解析 useExisting\n record = {\n value: () => inject(config.useExisting!),\n lifecycle,\n };\n } else {\n throw new InjectionError(\n actualKey,\n 'ProviderConfig must have provide, useFactory, or useExisting',\n );\n }\n } else {\n record = {\n value: valueOrConfig,\n lifecycle: 'singleton',\n };\n }\n\n // 存储到适当的位置\n if (instance) {\n // 组件实例级别\n if (instance.provides === (instance.parent?.provides ?? null)) {\n instance.provides = Object.create(\n instance.provides as Record<string | symbol, unknown>,\n ) as Record<string | symbol, unknown>;\n }\n instance.provides[actualKey as string | symbol] = record.value;\n } else if (providerNode) {\n // Provider 节点级别\n providerNode.providers.set(actualKey, record);\n }\n}\n\n/**\n * 从 Provider 作用域注入值\n *\n * @example\n * ```ts\n * // 简单注入\n * const apiUrl = inject('api-url');\n *\n * // 使用 InjectionToken\n * const apiUrl = inject(API_URL);\n *\n * // 可选注入\n * const logger = inject(LOGGER, { optional: true });\n *\n * // 带默认值\n * const timeout = inject(TIMEOUT, { default: 5000 });\n * ```\n */\nexport function inject<T>(\n key: InjectionToken<T> | string | symbol,\n options?: EnhancedInjectOptions<T>,\n): T | undefined {\n const instance = getCurrentInstance();\n const providerNode = currentProviderNode;\n\n // 解析 key\n const actualKey = isInjectionToken(key) ? key.__token : key;\n const lookupKey = options?.from\n ? isInjectionToken(options.from)\n ? options.from.__token\n : options.from\n : actualKey;\n\n // 1. 检查组件实例级别\n if (instance) {\n const result = injectFromInstance(\n instance as unknown as ComponentInternalInstance,\n lookupKey,\n options,\n );\n if (result !== undefined) {\n return result as T;\n }\n }\n\n // 2. 检查 Provider 节点级别\n if (providerNode) {\n const result = injectFromProviderNode(providerNode, lookupKey, options);\n if (result !== undefined) {\n return result as T;\n }\n }\n\n // 3. 检查全局 Provider 根节点\n if (globalProviderRoot) {\n const result = injectFromProviderNode(globalProviderRoot, lookupKey, options);\n if (result !== undefined) {\n return result as T;\n }\n }\n\n // 4. 检查 InjectionToken 的默认工厂\n if (isInjectionToken(key) && key.factory) {\n return key.factory();\n }\n\n // 5. 返回默认值或抛出错误\n if (options?.default !== undefined) {\n return typeof options.default === 'function' ? (options.default as () => T)() : options.default;\n }\n\n if (!options?.optional) {\n throw new InjectionError(actualKey, 'No provider found');\n }\n\n return undefined;\n}\n\n/**\n * 从组件实例注入\n */\nfunction injectFromInstance(\n instance: ComponentInternalInstance,\n key: string | symbol,\n options?: EnhancedInjectOptions,\n): unknown {\n if (options?.local) {\n const provides = instance.provides as Record<string | symbol, unknown>;\n const hasOwnProvides = instance.parent ? provides !== instance.parent.provides : true;\n if (hasOwnProvides && hasOwn(provides, key as string)) {\n return provides[key];\n }\n return undefined;\n }\n\n if (!options?.skipSelf) {\n const provides = instance.provides as Record<string | symbol, unknown>;\n if ((key as string | symbol) in provides) {\n return provides[key];\n }\n }\n\n // 向上查找\n let current = options?.skipSelf ? instance.parent : instance.parent;\n while (current) {\n const provides = current.provides as Record<string | symbol, unknown>;\n if ((key as string | symbol) in provides) {\n return provides[key];\n }\n current = current.parent;\n }\n\n return undefined;\n}\n\n/**\n * 从 Provider 节点注入\n */\nfunction injectFromProviderNode(\n node: ProviderNode,\n key: string | symbol,\n options?: EnhancedInjectOptions,\n): unknown {\n // 检查当前节点\n if (!options?.skipSelf) {\n const record = node.providers.get(key);\n if (record) {\n if (typeof record.value === 'function' && record.lifecycle === 'transient') {\n return (record.value as () => unknown)();\n }\n return record.value;\n }\n }\n\n // 向上查找父节点\n let current = options?.skipSelf ? node.parent : node.parent;\n while (current) {\n const record = current.providers.get(key);\n if (record) {\n if (typeof record.value === 'function' && record.lifecycle === 'transient') {\n return (record.value as () => unknown)();\n }\n return record.value;\n }\n current = current.parent;\n }\n\n return undefined;\n}\n\n/**\n * 检查是否是 ProviderConfig\n */\nfunction isProviderConfig<T>(value: unknown): value is ProviderConfig<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n ('provide' in value || 'useFactory' in value || 'useExisting' in value || 'lifecycle' in value)\n );\n}\n\n// ============================================================\n// 便捷 API\n// ============================================================\n\n/**\n * 创建并注册一个单例 Provider\n */\nexport function provideSingleton<T>(\n key: InjectionToken<T> | string | symbol,\n factory: () => T,\n): void {\n provide(key, {\n useFactory: factory,\n lifecycle: 'singleton',\n });\n}\n\n/**\n * 创建并注册一个作用域 Provider\n */\nexport function provideScoped<T>(key: InjectionToken<T> | string | symbol, factory: () => T): void {\n provide(key, {\n useFactory: factory,\n lifecycle: 'scoped',\n });\n}\n\n/**\n * 创建并注册一个临时 Provider\n */\nexport function provideTransient<T>(\n key: InjectionToken<T> | string | symbol,\n factory: () => T,\n): void {\n provide(key, {\n useFactory: factory,\n lifecycle: 'transient',\n });\n}\n\n/**\n * 批量注册 Providers\n */\nexport function provideAll(\n providers: Array<{\n provide: InjectionToken<unknown> | string | symbol;\n useValue?: unknown;\n useFactory?: () => unknown;\n useExisting?: InjectionToken<unknown> | string | symbol;\n lifecycle?: ProviderLifecycle;\n }>,\n): void {\n for (const provider of providers) {\n const { provide: key, useValue, useFactory, useExisting, lifecycle } = provider;\n provide(key, {\n provide: useValue,\n useFactory,\n useExisting,\n lifecycle,\n } as ProviderConfig);\n }\n}\n\n/**\n * 创建一个 Provider 作用域并执行回调\n */\nexport function withProviderScope<T>(fn: () => T): T {\n const node = enterProviderScope();\n try {\n return node.scope.run(fn) as T;\n } finally {\n exitProviderScope();\n }\n}\n"]}
|