@vobs/vobs 1.2.2 → 1.3.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 CHANGED
@@ -52,6 +52,7 @@ __export(src_exports, {
52
52
  getRenderer: () => import_runtime7.getRenderer,
53
53
  getRuntimeDebugContext: () => import_runtime6.getRuntimeDebugContext,
54
54
  getRuntimeDebugHooks: () => import_runtime6.getRuntimeDebugHooks,
55
+ hmrStateRef: () => import_runtime13.hmrStateRef,
55
56
  inject: () => inject,
56
57
  injectRequired: () => injectRequired,
57
58
  insertAsyncBoundary: () => import_runtime16.insertAsyncBoundary,
@@ -373,6 +374,7 @@ var Vobs = { Fragment };
373
374
  getRenderer,
374
375
  getRuntimeDebugContext,
375
376
  getRuntimeDebugHooks,
377
+ hmrStateRef,
376
378
  inject,
377
379
  injectRequired,
378
380
  insertAsyncBoundary,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/app.ts","../src/context.ts","../src/jsx-dev-runtime.ts"],"sourcesContent":["/// <reference path=\"./jsx.d.ts\" />\n\nexport * from '@vobs/reactivity'\nexport { createDOMRenderer } from '@vobs/dom'\nexport type { VobsRenderer } from '@vobs/runtime'\nexport {\n getRuntimeDebugContext,\n getRuntimeDebugHooks,\n pushRuntimeDebugContext,\n runWithRuntimeDebugContext,\n setRuntimeDebugHooks\n} from '@vobs/runtime'\nexport type {\n RuntimeDebugContext,\n RuntimeDebugEnvironment,\n RuntimeDebugHooks,\n RuntimeDomMutation,\n RuntimeDomMutationOperation,\n RuntimeErrorEvent,\n RuntimeHydrationMismatch\n} from '@vobs/runtime'\nexport {\n setRenderer,\n getRenderer,\n createText,\n createElement,\n createComment,\n insertBefore,\n removeChild,\n setTextContent,\n setProperty,\n setAttribute,\n setStaticProps,\n spreadProps,\n addEventListener,\n removeEventListener,\n clear,\n createComponent,\n createFragment,\n isVobsFragment,\n disposeNodeOwner\n} from '@vobs/runtime'\nexport type { FragmentFactory, VobsFragment, VobsNode } from '@vobs/runtime'\nexport { bindText, bindAttribute, bindProperty } from '@vobs/runtime'\nexport type { ValueSource } from '@vobs/runtime'\nexport { ref, setRef } from '@vobs/runtime'\nexport type { Ref, RefTarget } from '@vobs/runtime'\nexport { insertDynamic, insertDynamicValue, insertList, normalizeDynamicChild } from '@vobs/runtime'\nexport type { DynamicChild, NodeFactory } from '@vobs/runtime'\nexport { createTemplate, cloneTemplate } from '@vobs/runtime'\nexport type { VobsLocatedError, VobsSourceLocation } from '@vobs/runtime'\nexport {\n VobsError,\n createVobsError,\n formatVobsError,\n isVobsError,\n normalizeVobsError\n} from '@vobs/runtime'\nexport type {\n FormatVobsErrorOptions,\n VobsErrorDefaults,\n VobsErrorLayer,\n VobsErrorLocation,\n VobsErrorOptions,\n VobsErrorSeverity\n} from '@vobs/runtime'\nexport {\n createHmrStateStore,\n disposeHmrModule,\n resolveComponent,\n updateHmrModule\n} from '@vobs/runtime'\nexport type { HmrComponent, HmrInstance, HmrStateStore } from '@vobs/runtime'\nexport { insertErrorBoundary } from '@vobs/runtime'\nexport { ErrorBoundary, insertBoundary } from '@vobs/runtime'\nexport type { BoundaryFallback, BoundaryOptions, BoundaryRetry, ErrorBoundaryFallback, ErrorBoundaryOptions, ErrorBoundaryProps } from '@vobs/runtime'\nexport { AsyncBoundary, insertAsyncBoundary, Profiler, insertProfiler } from '@vobs/runtime'\nexport type { AsyncBoundaryFallback, AsyncBoundaryOptions, AsyncBoundaryProps, AsyncBoundaryView, ProfilerOptions, ProfilerProps, ProfilerRenderInfo } from '@vobs/runtime'\nexport { createVobs, createInjectionKey } from './app'\nexport { Fragment, Vobs } from './jsx-dev-runtime'\nexport { provide, inject, injectRequired } from './context'\nexport type {\n InjectionKey,\n ProvideOptions,\n VobsApp,\n VobsConfig,\n VobsPlugin,\n VobsContext\n} from './app'\n","import { createOwner, scheduler, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { createDOMRenderer } from '@vobs/dom'\nimport { insertBefore as insertRuntimeNode, setRenderer, type VobsFragment, type VobsRenderer } from '@vobs/runtime'\nimport { injectFromOwner, provideToOwner } from './context'\n\nexport type InjectionKey<T> = symbol & {\n readonly __vobsType?: T\n}\n\nexport interface ProvideOptions {\n override?: boolean\n}\n\nexport interface VobsPlugin {\n name: string\n version?: string\n requires?: readonly VobsPlugin[]\n optional?: readonly VobsPlugin[]\n install?: (ctx: VobsContext) => void | (() => void)\n}\n\nexport interface VobsContext {\n readonly app: VobsApp\n provide<T>(key: InjectionKey<T>, value: T, options?: ProvideOptions): void\n inject<T>(key: InjectionKey<T>): T | undefined\n injectRequired<T>(key: InjectionKey<T>, description?: string): T\n onDestroy(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n}\n\nexport interface VobsConfig<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n> {\n render: () => NodeType | VobsFragment | Node | null | undefined\n renderer?: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n plugins?: VobsPlugin[]\n /** Optional application-level error observer. Observers are isolated from the app. */\n onError?: (error: unknown) => void\n}\n\nexport interface VobsApp<NodeType = Node> {\n readonly mounted: boolean\n readonly destroyed: boolean\n use(plugin: VobsPlugin): VobsApp<NodeType>\n mount(target: string | NodeType): void\n hydrate(target: string | NodeType): void\n update(): void\n destroy(): void\n}\n\nexport function createInjectionKey<T>(description: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>\n}\n\nexport function createVobs(\n config: VobsConfig<Node, Text, Element, Comment>\n): VobsApp<Node>\nexport function createVobs<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n>(\n config: VobsConfig<NodeType, TextNode, ElementNode, CommentNode> & {\n renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n }\n): VobsApp<NodeType>\nexport function createVobs(\n config: VobsConfig<any, any, any, any>\n): VobsApp<any> {\n if (!config.render) throw new Error('createVobs: render 不能为空')\n\n const renderer = config.renderer ?? createDOMRenderer()\n const rootOwner: Owner = createOwner()\n setOwnerDebugName(rootOwner, 'App')\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n const installed = new Set<string>()\n const installing = new Set<string>()\n let mounted = false\n let destroyed = false\n let container: any = null\n let app!: VobsApp<any>\n\n if (config.onError) {\n errorHandlers.add(config.onError)\n cleanups.push(() => errorHandlers.delete(config.onError!))\n }\n\n const context: VobsContext = {\n get app(): VobsApp<any> {\n return app\n },\n\n provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n provideToOwner(rootOwner, key, value, options)\n },\n\n inject<T>(key: InjectionKey<T>): T | undefined {\n return injectFromOwner(rootOwner, key)\n },\n\n injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = injectFromOwner(rootOwner, key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n },\n\n onDestroy(cleanup: () => void): void {\n cleanups.push(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n cleanups.push(remove)\n return remove\n }\n }\n\n function notifyError(error: unknown): void {\n for (const handler of [...errorHandlers]) {\n try {\n handler(error)\n } catch {\n // 错误处理器不能覆盖触发它的原始错误。\n }\n }\n }\n\n function installPlugin(plugin: VobsPlugin): void {\n if (installed.has(plugin.name)) return\n if (installing.has(plugin.name)) {\n throw new Error(`Vobs: 插件依赖存在循环:${plugin.name}`)\n }\n\n installing.add(plugin.name)\n try {\n for (const dependency of plugin.requires ?? []) installPlugin(dependency)\n const cleanup = plugin.install?.(context)\n if (cleanup) cleanups.push(cleanup)\n installed.add(plugin.name)\n } finally {\n installing.delete(plugin.name)\n }\n }\n\n function cleanup(clearContainer = true): unknown {\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n try {\n rootOwner.dispose()\n } catch (error) {\n firstError ??= error\n }\n\n if (container && clearContainer) {\n try {\n renderer.clear(container)\n } catch (error) {\n firstError ??= error\n }\n }\n return firstError\n }\n\n function start(target: string | any, hydrating: boolean): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能挂载')\n if (mounted) return\n\n container = typeof target === 'string' ? document.querySelector(target) : target\n if (!container) throw new Error(`mount: 目标不存在: ${target}`)\n if (hydrating && !renderer.beginHydration) {\n throw new Error('Vobs: 当前渲染器不支持 Hydration')\n }\n\n setRenderer(renderer)\n try {\n if (hydrating) renderer.beginHydration?.()\n const rootNode = rootOwner.run(config.render)\n if (!hydrating) renderer.clear(container)\n if (rootNode) insertRuntimeNode(container, rootNode as any, null)\n if (hydrating) renderer.completeHydration?.()\n mounted = true\n } catch (error) {\n notifyError(error)\n const cleanupError = cleanup(!hydrating)\n destroyed = true\n throw cleanupError ?? error\n }\n }\n\n app = {\n get mounted(): boolean {\n return mounted\n },\n\n get destroyed(): boolean {\n return destroyed\n },\n\n use(plugin: VobsPlugin): VobsApp<any> {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能安装插件')\n installPlugin(plugin)\n return app\n },\n\n mount(target: string | any): void {\n start(target, false)\n },\n\n hydrate(target: string | any): void {\n start(target, true)\n },\n\n update(): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能更新')\n try {\n scheduler.flush()\n } catch (error) {\n notifyError(error)\n throw error\n }\n },\n\n destroy(): void {\n if (destroyed) return\n try {\n const cleanupError = cleanup()\n if (cleanupError) {\n notifyError(cleanupError)\n throw cleanupError\n }\n } finally {\n mounted = false\n destroyed = true\n }\n }\n }\n\n try {\n for (const plugin of config.plugins ?? []) app.use(plugin)\n } catch (error) {\n notifyError(error)\n cleanup()\n destroyed = true\n throw error\n }\n\n return app\n}\n","import { getCurrentOwner, type Owner } from '@vobs/reactivity'\nimport type { InjectionKey, ProvideOptions } from './app'\n\nconst ownerProviders = new WeakMap<Owner, Map<InjectionKey<unknown>, unknown>>()\n\nexport function provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n const owner = getCurrentOwner()\n if (!owner) throw new Error('Vobs: provide 必须在组件或 Owner 作用域内调用')\n provideToOwner(owner, key, value, options)\n}\n\nexport function inject<T>(key: InjectionKey<T>): T | undefined\nexport function inject<T>(key: InjectionKey<T>, fallback: T): T\nexport function inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const owner = getCurrentOwner()\n const value = owner ? injectFromOwner(owner, key) : undefined\n return value === undefined ? fallback : value\n}\n\nexport function injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = inject(key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n}\n\nexport function provideToOwner<T>(\n owner: Owner,\n key: InjectionKey<T>,\n value: T,\n options: ProvideOptions = {}\n): void {\n let providers = ownerProviders.get(owner)\n if (!providers) {\n providers = new Map<InjectionKey<unknown>, unknown>()\n ownerProviders.set(owner, providers)\n owner.onDispose(() => ownerProviders.delete(owner))\n }\n if (providers.has(key) && !options.override) {\n throw new Error(`Vobs: 注入项 ${String(key)} 已存在;如需覆盖请传入 override: true`)\n }\n providers.set(key, value)\n}\n\nexport function injectFromOwner<T>(owner: Owner, key: InjectionKey<T>): T | undefined {\n let current: Owner | null = owner\n while (current) {\n const providers = ownerProviders.get(current)\n if (providers?.has(key)) return providers.get(key) as T\n current = current.parent\n }\n return undefined\n}\n","import {\n createComponent,\n createElement,\n createFragment,\n insertBefore,\n normalizeDynamicChild,\n spreadProps,\n type VobsNode\n} from '@vobs/runtime'\n\r\nexport function jsxDEV(\r\n tag: string | Function,\r\n props: Record<string, unknown> | null,\r\n _key?: unknown,\r\n _isStaticChildren?: boolean,\r\n _source?: unknown,\r\n _self?: unknown\r\n): VobsNode {\n if (typeof tag === 'function') {\n return createComponent(tag as (props: Record<string, unknown>) => VobsNode, props ?? {})\n }\r\n\r\n const { children, ...attrs } = props ?? {}\r\n\r\n const el = createElement(tag as string)\n\r\n spreadProps(el, attrs)\n\r\n appendChildren(el, children)\r\n\r\n return el\r\n}\r\n\r\nfunction appendChildren(parent: Node, children: unknown, anchor: Node | null = null): void {\n if (children === undefined || children === null) return\r\n\r\n const childArray = Array.isArray(children) ? children : [children]\r\n\r\n for (const child of childArray) {\r\n const node = normalizeDynamicChild(child as Parameters<typeof normalizeDynamicChild>[0])\n if (node) insertBefore(parent, node, anchor)\n }\r\n}\r\n\r\nexport function jsx(tag: string | Function, props: Record<string, unknown> | null): VobsNode {\n return jsxDEV(tag, props)\r\n}\r\n\r\nexport function jsxs(tag: string | Function, props: Record<string, unknown> | null): VobsNode {\n return jsxDEV(tag, props)\r\n}\r\n\r\nexport function Fragment(props: { children?: unknown }): VobsNode {\n return createFragment((parent, anchor) => appendChildren(parent, props?.children, anchor))\n}\n\n/** Namespace for explicit built-in JSX primitives such as <Vobs.Fragment>. */\nexport const Vobs = { Fragment }\n"],"mappings":"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","names":["import_dom","import_runtime","import_reactivity","import_runtime","cleanup","insertRuntimeNode","import_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/app.ts","../src/context.ts","../src/jsx-dev-runtime.ts"],"sourcesContent":["/// <reference path=\"./jsx.d.ts\" />\n\nexport * from '@vobs/reactivity'\nexport { createDOMRenderer } from '@vobs/dom'\nexport type { VobsRenderer } from '@vobs/runtime'\nexport {\n getRuntimeDebugContext,\n getRuntimeDebugHooks,\n pushRuntimeDebugContext,\n runWithRuntimeDebugContext,\n setRuntimeDebugHooks\n} from '@vobs/runtime'\nexport type {\n RuntimeDebugContext,\n RuntimeDebugEnvironment,\n RuntimeDebugHooks,\n RuntimeDomMutation,\n RuntimeDomMutationOperation,\n RuntimeErrorEvent,\n RuntimeHydrationMismatch\n} from '@vobs/runtime'\nexport {\n setRenderer,\n getRenderer,\n createText,\n createElement,\n createComment,\n insertBefore,\n removeChild,\n setTextContent,\n setProperty,\n setAttribute,\n setStaticProps,\n spreadProps,\n addEventListener,\n removeEventListener,\n clear,\n createComponent,\n createFragment,\n isVobsFragment,\n disposeNodeOwner\n} from '@vobs/runtime'\nexport type { FragmentFactory, VobsFragment, VobsNode } from '@vobs/runtime'\nexport { bindText, bindAttribute, bindProperty } from '@vobs/runtime'\nexport type { ValueSource } from '@vobs/runtime'\nexport { ref, setRef } from '@vobs/runtime'\nexport type { Ref, RefTarget } from '@vobs/runtime'\nexport { insertDynamic, insertDynamicValue, insertList, normalizeDynamicChild } from '@vobs/runtime'\nexport type { DynamicChild, NodeFactory } from '@vobs/runtime'\nexport { createTemplate, cloneTemplate } from '@vobs/runtime'\nexport type { VobsLocatedError, VobsSourceLocation } from '@vobs/runtime'\nexport {\n VobsError,\n createVobsError,\n formatVobsError,\n isVobsError,\n normalizeVobsError\n} from '@vobs/runtime'\nexport type {\n FormatVobsErrorOptions,\n VobsErrorDefaults,\n VobsErrorLayer,\n VobsErrorLocation,\n VobsErrorOptions,\n VobsErrorSeverity\n} from '@vobs/runtime'\nexport {\n createHmrStateStore,\n disposeHmrModule,\n hmrStateRef,\n resolveComponent,\n updateHmrModule\n} from '@vobs/runtime'\nexport type { HmrComponent, HmrInstance, HmrStateStore } from '@vobs/runtime'\nexport { insertErrorBoundary } from '@vobs/runtime'\nexport { ErrorBoundary, insertBoundary } from '@vobs/runtime'\nexport type { BoundaryFallback, BoundaryOptions, BoundaryRetry, ErrorBoundaryFallback, ErrorBoundaryOptions, ErrorBoundaryProps } from '@vobs/runtime'\nexport { AsyncBoundary, insertAsyncBoundary, Profiler, insertProfiler } from '@vobs/runtime'\nexport type { AsyncBoundaryFallback, AsyncBoundaryOptions, AsyncBoundaryProps, AsyncBoundaryView, ProfilerOptions, ProfilerProps, ProfilerRenderInfo } from '@vobs/runtime'\nexport { createVobs, createInjectionKey } from './app'\nexport { Fragment, Vobs } from './jsx-dev-runtime'\nexport { provide, inject, injectRequired } from './context'\nexport type {\n InjectionKey,\n ProvideOptions,\n VobsApp,\n VobsConfig,\n VobsPlugin,\n VobsContext\n} from './app'\n","import { createOwner, scheduler, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { createDOMRenderer } from '@vobs/dom'\nimport { insertBefore as insertRuntimeNode, setRenderer, type VobsFragment, type VobsRenderer } from '@vobs/runtime'\nimport { injectFromOwner, provideToOwner } from './context'\n\nexport type InjectionKey<T> = symbol & {\n readonly __vobsType?: T\n}\n\nexport interface ProvideOptions {\n override?: boolean\n}\n\nexport interface VobsPlugin {\n name: string\n version?: string\n requires?: readonly VobsPlugin[]\n optional?: readonly VobsPlugin[]\n install?: (ctx: VobsContext) => void | (() => void)\n}\n\nexport interface VobsContext {\n readonly app: VobsApp\n provide<T>(key: InjectionKey<T>, value: T, options?: ProvideOptions): void\n inject<T>(key: InjectionKey<T>): T | undefined\n injectRequired<T>(key: InjectionKey<T>, description?: string): T\n onDestroy(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n}\n\nexport interface VobsConfig<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n> {\n render: () => NodeType | VobsFragment | Node | null | undefined\n renderer?: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n plugins?: VobsPlugin[]\n /** Optional application-level error observer. Observers are isolated from the app. */\n onError?: (error: unknown) => void\n}\n\nexport interface VobsApp<NodeType = Node> {\n readonly mounted: boolean\n readonly destroyed: boolean\n use(plugin: VobsPlugin): VobsApp<NodeType>\n mount(target: string | NodeType): void\n hydrate(target: string | NodeType): void\n update(): void\n destroy(): void\n}\n\nexport function createInjectionKey<T>(description: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>\n}\n\nexport function createVobs(\n config: VobsConfig<Node, Text, Element, Comment>\n): VobsApp<Node>\nexport function createVobs<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n>(\n config: VobsConfig<NodeType, TextNode, ElementNode, CommentNode> & {\n renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n }\n): VobsApp<NodeType>\nexport function createVobs(\n config: VobsConfig<any, any, any, any>\n): VobsApp<any> {\n if (!config.render) throw new Error('createVobs: render 不能为空')\n\n const renderer = config.renderer ?? createDOMRenderer()\n const rootOwner: Owner = createOwner()\n setOwnerDebugName(rootOwner, 'App')\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n const installed = new Set<string>()\n const installing = new Set<string>()\n let mounted = false\n let destroyed = false\n let container: any = null\n let app!: VobsApp<any>\n\n if (config.onError) {\n errorHandlers.add(config.onError)\n cleanups.push(() => errorHandlers.delete(config.onError!))\n }\n\n const context: VobsContext = {\n get app(): VobsApp<any> {\n return app\n },\n\n provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n provideToOwner(rootOwner, key, value, options)\n },\n\n inject<T>(key: InjectionKey<T>): T | undefined {\n return injectFromOwner(rootOwner, key)\n },\n\n injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = injectFromOwner(rootOwner, key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n },\n\n onDestroy(cleanup: () => void): void {\n cleanups.push(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n cleanups.push(remove)\n return remove\n }\n }\n\n function notifyError(error: unknown): void {\n for (const handler of [...errorHandlers]) {\n try {\n handler(error)\n } catch {\n // 错误处理器不能覆盖触发它的原始错误。\n }\n }\n }\n\n function installPlugin(plugin: VobsPlugin): void {\n if (installed.has(plugin.name)) return\n if (installing.has(plugin.name)) {\n throw new Error(`Vobs: 插件依赖存在循环:${plugin.name}`)\n }\n\n installing.add(plugin.name)\n try {\n for (const dependency of plugin.requires ?? []) installPlugin(dependency)\n const cleanup = plugin.install?.(context)\n if (cleanup) cleanups.push(cleanup)\n installed.add(plugin.name)\n } finally {\n installing.delete(plugin.name)\n }\n }\n\n function cleanup(clearContainer = true): unknown {\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n try {\n rootOwner.dispose()\n } catch (error) {\n firstError ??= error\n }\n\n if (container && clearContainer) {\n try {\n renderer.clear(container)\n } catch (error) {\n firstError ??= error\n }\n }\n return firstError\n }\n\n function start(target: string | any, hydrating: boolean): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能挂载')\n if (mounted) return\n\n container = typeof target === 'string' ? document.querySelector(target) : target\n if (!container) throw new Error(`mount: 目标不存在: ${target}`)\n if (hydrating && !renderer.beginHydration) {\n throw new Error('Vobs: 当前渲染器不支持 Hydration')\n }\n\n setRenderer(renderer)\n try {\n if (hydrating) renderer.beginHydration?.()\n const rootNode = rootOwner.run(config.render)\n if (!hydrating) renderer.clear(container)\n if (rootNode) insertRuntimeNode(container, rootNode as any, null)\n if (hydrating) renderer.completeHydration?.()\n mounted = true\n } catch (error) {\n notifyError(error)\n const cleanupError = cleanup(!hydrating)\n destroyed = true\n throw cleanupError ?? error\n }\n }\n\n app = {\n get mounted(): boolean {\n return mounted\n },\n\n get destroyed(): boolean {\n return destroyed\n },\n\n use(plugin: VobsPlugin): VobsApp<any> {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能安装插件')\n installPlugin(plugin)\n return app\n },\n\n mount(target: string | any): void {\n start(target, false)\n },\n\n hydrate(target: string | any): void {\n start(target, true)\n },\n\n update(): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能更新')\n try {\n scheduler.flush()\n } catch (error) {\n notifyError(error)\n throw error\n }\n },\n\n destroy(): void {\n if (destroyed) return\n try {\n const cleanupError = cleanup()\n if (cleanupError) {\n notifyError(cleanupError)\n throw cleanupError\n }\n } finally {\n mounted = false\n destroyed = true\n }\n }\n }\n\n try {\n for (const plugin of config.plugins ?? []) app.use(plugin)\n } catch (error) {\n notifyError(error)\n cleanup()\n destroyed = true\n throw error\n }\n\n return app\n}\n","import { getCurrentOwner, type Owner } from '@vobs/reactivity'\nimport type { InjectionKey, ProvideOptions } from './app'\n\nconst ownerProviders = new WeakMap<Owner, Map<InjectionKey<unknown>, unknown>>()\n\nexport function provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n const owner = getCurrentOwner()\n if (!owner) throw new Error('Vobs: provide 必须在组件或 Owner 作用域内调用')\n provideToOwner(owner, key, value, options)\n}\n\nexport function inject<T>(key: InjectionKey<T>): T | undefined\nexport function inject<T>(key: InjectionKey<T>, fallback: T): T\nexport function inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const owner = getCurrentOwner()\n const value = owner ? injectFromOwner(owner, key) : undefined\n return value === undefined ? fallback : value\n}\n\nexport function injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = inject(key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n}\n\nexport function provideToOwner<T>(\n owner: Owner,\n key: InjectionKey<T>,\n value: T,\n options: ProvideOptions = {}\n): void {\n let providers = ownerProviders.get(owner)\n if (!providers) {\n providers = new Map<InjectionKey<unknown>, unknown>()\n ownerProviders.set(owner, providers)\n owner.onDispose(() => ownerProviders.delete(owner))\n }\n if (providers.has(key) && !options.override) {\n throw new Error(`Vobs: 注入项 ${String(key)} 已存在;如需覆盖请传入 override: true`)\n }\n providers.set(key, value)\n}\n\nexport function injectFromOwner<T>(owner: Owner, key: InjectionKey<T>): T | undefined {\n let current: Owner | null = owner\n while (current) {\n const providers = ownerProviders.get(current)\n if (providers?.has(key)) return providers.get(key) as T\n current = current.parent\n }\n return undefined\n}\n","import {\n createComponent,\n createElement,\n createFragment,\n insertBefore,\n normalizeDynamicChild,\n spreadProps,\n type VobsNode\n} from '@vobs/runtime'\n\r\nexport function jsxDEV(\r\n tag: string | Function,\r\n props: Record<string, unknown> | null,\r\n _key?: unknown,\r\n _isStaticChildren?: boolean,\r\n _source?: unknown,\r\n _self?: unknown\r\n): VobsNode {\n if (typeof tag === 'function') {\n return createComponent(tag as (props: Record<string, unknown>) => VobsNode, props ?? {})\n }\r\n\r\n const { children, ...attrs } = props ?? {}\r\n\r\n const el = createElement(tag as string)\n\r\n spreadProps(el, attrs)\n\r\n appendChildren(el, children)\r\n\r\n return el\r\n}\r\n\r\nfunction appendChildren(parent: Node, children: unknown, anchor: Node | null = null): void {\n if (children === undefined || children === null) return\r\n\r\n const childArray = Array.isArray(children) ? children : [children]\r\n\r\n for (const child of childArray) {\r\n const node = normalizeDynamicChild(child as Parameters<typeof normalizeDynamicChild>[0])\n if (node) insertBefore(parent, node, anchor)\n }\r\n}\r\n\r\nexport function jsx(tag: string | Function, props: Record<string, unknown> | null): VobsNode {\n return jsxDEV(tag, props)\r\n}\r\n\r\nexport function jsxs(tag: string | Function, props: Record<string, unknown> | null): VobsNode {\n return jsxDEV(tag, props)\r\n}\r\n\r\nexport function Fragment(props: { children?: unknown }): VobsNode {\n return createFragment((parent, anchor) => appendChildren(parent, props?.children, anchor))\n}\n\n/** Namespace for explicit built-in JSX primitives such as <Vobs.Fragment>. */\nexport const Vobs = { Fragment }\n"],"mappings":"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","names":["import_dom","import_runtime","import_reactivity","import_runtime","cleanup","insertRuntimeNode","import_runtime"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  export * from '@vobs/reactivity';
2
2
  export { createDOMRenderer } from '@vobs/dom';
3
- export { AsyncBoundary, AsyncBoundaryFallback, AsyncBoundaryOptions, AsyncBoundaryProps, AsyncBoundaryView, BoundaryFallback, BoundaryOptions, BoundaryRetry, DynamicChild, ErrorBoundary, ErrorBoundaryFallback, ErrorBoundaryOptions, ErrorBoundaryProps, FormatVobsErrorOptions, FragmentFactory, HmrComponent, HmrInstance, HmrStateStore, NodeFactory, Profiler, ProfilerOptions, ProfilerProps, ProfilerRenderInfo, Ref, RefTarget, RuntimeDebugContext, RuntimeDebugEnvironment, RuntimeDebugHooks, RuntimeDomMutation, RuntimeDomMutationOperation, RuntimeErrorEvent, RuntimeHydrationMismatch, ValueSource, VobsError, VobsErrorDefaults, VobsErrorLayer, VobsErrorLocation, VobsErrorOptions, VobsErrorSeverity, VobsFragment, VobsLocatedError, VobsNode, VobsRenderer, VobsSourceLocation, addEventListener, bindAttribute, bindProperty, bindText, clear, cloneTemplate, createComment, createComponent, createElement, createFragment, createHmrStateStore, createTemplate, createText, createVobsError, disposeHmrModule, disposeNodeOwner, formatVobsError, getRenderer, getRuntimeDebugContext, getRuntimeDebugHooks, insertAsyncBoundary, insertBefore, insertBoundary, insertDynamic, insertDynamicValue, insertErrorBoundary, insertList, insertProfiler, isVobsError, isVobsFragment, normalizeDynamicChild, normalizeVobsError, pushRuntimeDebugContext, ref, removeChild, removeEventListener, resolveComponent, runWithRuntimeDebugContext, setAttribute, setProperty, setRef, setRenderer, setRuntimeDebugHooks, setStaticProps, setTextContent, spreadProps, updateHmrModule } from '@vobs/runtime';
3
+ export { AsyncBoundary, AsyncBoundaryFallback, AsyncBoundaryOptions, AsyncBoundaryProps, AsyncBoundaryView, BoundaryFallback, BoundaryOptions, BoundaryRetry, DynamicChild, ErrorBoundary, ErrorBoundaryFallback, ErrorBoundaryOptions, ErrorBoundaryProps, FormatVobsErrorOptions, FragmentFactory, HmrComponent, HmrInstance, HmrStateStore, NodeFactory, Profiler, ProfilerOptions, ProfilerProps, ProfilerRenderInfo, Ref, RefTarget, RuntimeDebugContext, RuntimeDebugEnvironment, RuntimeDebugHooks, RuntimeDomMutation, RuntimeDomMutationOperation, RuntimeErrorEvent, RuntimeHydrationMismatch, ValueSource, VobsError, VobsErrorDefaults, VobsErrorLayer, VobsErrorLocation, VobsErrorOptions, VobsErrorSeverity, VobsFragment, VobsLocatedError, VobsNode, VobsRenderer, VobsSourceLocation, addEventListener, bindAttribute, bindProperty, bindText, clear, cloneTemplate, createComment, createComponent, createElement, createFragment, createHmrStateStore, createTemplate, createText, createVobsError, disposeHmrModule, disposeNodeOwner, formatVobsError, getRenderer, getRuntimeDebugContext, getRuntimeDebugHooks, hmrStateRef, insertAsyncBoundary, insertBefore, insertBoundary, insertDynamic, insertDynamicValue, insertErrorBoundary, insertList, insertProfiler, isVobsError, isVobsFragment, normalizeDynamicChild, normalizeVobsError, pushRuntimeDebugContext, ref, removeChild, removeEventListener, resolveComponent, runWithRuntimeDebugContext, setAttribute, setProperty, setRef, setRenderer, setRuntimeDebugHooks, setStaticProps, setTextContent, spreadProps, updateHmrModule } from '@vobs/runtime';
4
4
  export { InjectionKey, ProvideOptions, VobsApp, VobsConfig, VobsContext, VobsPlugin, createInjectionKey, createVobs } from './app.cjs';
5
5
  export { Fragment, Vobs } from './jsx-dev-runtime.cjs';
6
6
  export { inject, injectRequired, provide } from './context.cjs';
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export * from '@vobs/reactivity';
2
2
  export { createDOMRenderer } from '@vobs/dom';
3
- export { AsyncBoundary, AsyncBoundaryFallback, AsyncBoundaryOptions, AsyncBoundaryProps, AsyncBoundaryView, BoundaryFallback, BoundaryOptions, BoundaryRetry, DynamicChild, ErrorBoundary, ErrorBoundaryFallback, ErrorBoundaryOptions, ErrorBoundaryProps, FormatVobsErrorOptions, FragmentFactory, HmrComponent, HmrInstance, HmrStateStore, NodeFactory, Profiler, ProfilerOptions, ProfilerProps, ProfilerRenderInfo, Ref, RefTarget, RuntimeDebugContext, RuntimeDebugEnvironment, RuntimeDebugHooks, RuntimeDomMutation, RuntimeDomMutationOperation, RuntimeErrorEvent, RuntimeHydrationMismatch, ValueSource, VobsError, VobsErrorDefaults, VobsErrorLayer, VobsErrorLocation, VobsErrorOptions, VobsErrorSeverity, VobsFragment, VobsLocatedError, VobsNode, VobsRenderer, VobsSourceLocation, addEventListener, bindAttribute, bindProperty, bindText, clear, cloneTemplate, createComment, createComponent, createElement, createFragment, createHmrStateStore, createTemplate, createText, createVobsError, disposeHmrModule, disposeNodeOwner, formatVobsError, getRenderer, getRuntimeDebugContext, getRuntimeDebugHooks, insertAsyncBoundary, insertBefore, insertBoundary, insertDynamic, insertDynamicValue, insertErrorBoundary, insertList, insertProfiler, isVobsError, isVobsFragment, normalizeDynamicChild, normalizeVobsError, pushRuntimeDebugContext, ref, removeChild, removeEventListener, resolveComponent, runWithRuntimeDebugContext, setAttribute, setProperty, setRef, setRenderer, setRuntimeDebugHooks, setStaticProps, setTextContent, spreadProps, updateHmrModule } from '@vobs/runtime';
3
+ export { AsyncBoundary, AsyncBoundaryFallback, AsyncBoundaryOptions, AsyncBoundaryProps, AsyncBoundaryView, BoundaryFallback, BoundaryOptions, BoundaryRetry, DynamicChild, ErrorBoundary, ErrorBoundaryFallback, ErrorBoundaryOptions, ErrorBoundaryProps, FormatVobsErrorOptions, FragmentFactory, HmrComponent, HmrInstance, HmrStateStore, NodeFactory, Profiler, ProfilerOptions, ProfilerProps, ProfilerRenderInfo, Ref, RefTarget, RuntimeDebugContext, RuntimeDebugEnvironment, RuntimeDebugHooks, RuntimeDomMutation, RuntimeDomMutationOperation, RuntimeErrorEvent, RuntimeHydrationMismatch, ValueSource, VobsError, VobsErrorDefaults, VobsErrorLayer, VobsErrorLocation, VobsErrorOptions, VobsErrorSeverity, VobsFragment, VobsLocatedError, VobsNode, VobsRenderer, VobsSourceLocation, addEventListener, bindAttribute, bindProperty, bindText, clear, cloneTemplate, createComment, createComponent, createElement, createFragment, createHmrStateStore, createTemplate, createText, createVobsError, disposeHmrModule, disposeNodeOwner, formatVobsError, getRenderer, getRuntimeDebugContext, getRuntimeDebugHooks, hmrStateRef, insertAsyncBoundary, insertBefore, insertBoundary, insertDynamic, insertDynamicValue, insertErrorBoundary, insertList, insertProfiler, isVobsError, isVobsFragment, normalizeDynamicChild, normalizeVobsError, pushRuntimeDebugContext, ref, removeChild, removeEventListener, resolveComponent, runWithRuntimeDebugContext, setAttribute, setProperty, setRef, setRenderer, setRuntimeDebugHooks, setStaticProps, setTextContent, spreadProps, updateHmrModule } from '@vobs/runtime';
4
4
  export { InjectionKey, ProvideOptions, VobsApp, VobsConfig, VobsContext, VobsPlugin, createInjectionKey, createVobs } from './app.js';
5
5
  export { Fragment, Vobs } from './jsx-dev-runtime.js';
6
6
  export { inject, injectRequired, provide } from './context.js';
package/dist/index.js CHANGED
@@ -46,6 +46,7 @@ import {
46
46
  import {
47
47
  createHmrStateStore,
48
48
  disposeHmrModule,
49
+ hmrStateRef,
49
50
  resolveComponent,
50
51
  updateHmrModule
51
52
  } from "@vobs/runtime";
@@ -334,6 +335,7 @@ export {
334
335
  getRenderer,
335
336
  getRuntimeDebugContext,
336
337
  getRuntimeDebugHooks,
338
+ hmrStateRef,
337
339
  inject,
338
340
  injectRequired,
339
341
  insertAsyncBoundary,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/app.ts","../src/context.ts","../src/jsx-dev-runtime.ts"],"sourcesContent":["/// <reference path=\"./jsx.d.ts\" />\n\nexport * from '@vobs/reactivity'\nexport { createDOMRenderer } from '@vobs/dom'\nexport type { VobsRenderer } from '@vobs/runtime'\nexport {\n getRuntimeDebugContext,\n getRuntimeDebugHooks,\n pushRuntimeDebugContext,\n runWithRuntimeDebugContext,\n setRuntimeDebugHooks\n} from '@vobs/runtime'\nexport type {\n RuntimeDebugContext,\n RuntimeDebugEnvironment,\n RuntimeDebugHooks,\n RuntimeDomMutation,\n RuntimeDomMutationOperation,\n RuntimeErrorEvent,\n RuntimeHydrationMismatch\n} from '@vobs/runtime'\nexport {\n setRenderer,\n getRenderer,\n createText,\n createElement,\n createComment,\n insertBefore,\n removeChild,\n setTextContent,\n setProperty,\n setAttribute,\n setStaticProps,\n spreadProps,\n addEventListener,\n removeEventListener,\n clear,\n createComponent,\n createFragment,\n isVobsFragment,\n disposeNodeOwner\n} from '@vobs/runtime'\nexport type { FragmentFactory, VobsFragment, VobsNode } from '@vobs/runtime'\nexport { bindText, bindAttribute, bindProperty } from '@vobs/runtime'\nexport type { ValueSource } from '@vobs/runtime'\nexport { ref, setRef } from '@vobs/runtime'\nexport type { Ref, RefTarget } from '@vobs/runtime'\nexport { insertDynamic, insertDynamicValue, insertList, normalizeDynamicChild } from '@vobs/runtime'\nexport type { DynamicChild, NodeFactory } from '@vobs/runtime'\nexport { createTemplate, cloneTemplate } from '@vobs/runtime'\nexport type { VobsLocatedError, VobsSourceLocation } from '@vobs/runtime'\nexport {\n VobsError,\n createVobsError,\n formatVobsError,\n isVobsError,\n normalizeVobsError\n} from '@vobs/runtime'\nexport type {\n FormatVobsErrorOptions,\n VobsErrorDefaults,\n VobsErrorLayer,\n VobsErrorLocation,\n VobsErrorOptions,\n VobsErrorSeverity\n} from '@vobs/runtime'\nexport {\n createHmrStateStore,\n disposeHmrModule,\n resolveComponent,\n updateHmrModule\n} from '@vobs/runtime'\nexport type { HmrComponent, HmrInstance, HmrStateStore } from '@vobs/runtime'\nexport { insertErrorBoundary } from '@vobs/runtime'\nexport { ErrorBoundary, insertBoundary } from '@vobs/runtime'\nexport type { BoundaryFallback, BoundaryOptions, BoundaryRetry, ErrorBoundaryFallback, ErrorBoundaryOptions, ErrorBoundaryProps } from '@vobs/runtime'\nexport { AsyncBoundary, insertAsyncBoundary, Profiler, insertProfiler } from '@vobs/runtime'\nexport type { AsyncBoundaryFallback, AsyncBoundaryOptions, AsyncBoundaryProps, AsyncBoundaryView, ProfilerOptions, ProfilerProps, ProfilerRenderInfo } from '@vobs/runtime'\nexport { createVobs, createInjectionKey } from './app'\nexport { Fragment, Vobs } from './jsx-dev-runtime'\nexport { provide, inject, injectRequired } from './context'\nexport type {\n InjectionKey,\n ProvideOptions,\n VobsApp,\n VobsConfig,\n VobsPlugin,\n VobsContext\n} from './app'\n","import { createOwner, scheduler, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { createDOMRenderer } from '@vobs/dom'\nimport { insertBefore as insertRuntimeNode, setRenderer, type VobsFragment, type VobsRenderer } from '@vobs/runtime'\nimport { injectFromOwner, provideToOwner } from './context'\n\nexport type InjectionKey<T> = symbol & {\n readonly __vobsType?: T\n}\n\nexport interface ProvideOptions {\n override?: boolean\n}\n\nexport interface VobsPlugin {\n name: string\n version?: string\n requires?: readonly VobsPlugin[]\n optional?: readonly VobsPlugin[]\n install?: (ctx: VobsContext) => void | (() => void)\n}\n\nexport interface VobsContext {\n readonly app: VobsApp\n provide<T>(key: InjectionKey<T>, value: T, options?: ProvideOptions): void\n inject<T>(key: InjectionKey<T>): T | undefined\n injectRequired<T>(key: InjectionKey<T>, description?: string): T\n onDestroy(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n}\n\nexport interface VobsConfig<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n> {\n render: () => NodeType | VobsFragment | Node | null | undefined\n renderer?: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n plugins?: VobsPlugin[]\n /** Optional application-level error observer. Observers are isolated from the app. */\n onError?: (error: unknown) => void\n}\n\nexport interface VobsApp<NodeType = Node> {\n readonly mounted: boolean\n readonly destroyed: boolean\n use(plugin: VobsPlugin): VobsApp<NodeType>\n mount(target: string | NodeType): void\n hydrate(target: string | NodeType): void\n update(): void\n destroy(): void\n}\n\nexport function createInjectionKey<T>(description: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>\n}\n\nexport function createVobs(\n config: VobsConfig<Node, Text, Element, Comment>\n): VobsApp<Node>\nexport function createVobs<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n>(\n config: VobsConfig<NodeType, TextNode, ElementNode, CommentNode> & {\n renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n }\n): VobsApp<NodeType>\nexport function createVobs(\n config: VobsConfig<any, any, any, any>\n): VobsApp<any> {\n if (!config.render) throw new Error('createVobs: render 不能为空')\n\n const renderer = config.renderer ?? createDOMRenderer()\n const rootOwner: Owner = createOwner()\n setOwnerDebugName(rootOwner, 'App')\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n const installed = new Set<string>()\n const installing = new Set<string>()\n let mounted = false\n let destroyed = false\n let container: any = null\n let app!: VobsApp<any>\n\n if (config.onError) {\n errorHandlers.add(config.onError)\n cleanups.push(() => errorHandlers.delete(config.onError!))\n }\n\n const context: VobsContext = {\n get app(): VobsApp<any> {\n return app\n },\n\n provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n provideToOwner(rootOwner, key, value, options)\n },\n\n inject<T>(key: InjectionKey<T>): T | undefined {\n return injectFromOwner(rootOwner, key)\n },\n\n injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = injectFromOwner(rootOwner, key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n },\n\n onDestroy(cleanup: () => void): void {\n cleanups.push(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n cleanups.push(remove)\n return remove\n }\n }\n\n function notifyError(error: unknown): void {\n for (const handler of [...errorHandlers]) {\n try {\n handler(error)\n } catch {\n // 错误处理器不能覆盖触发它的原始错误。\n }\n }\n }\n\n function installPlugin(plugin: VobsPlugin): void {\n if (installed.has(plugin.name)) return\n if (installing.has(plugin.name)) {\n throw new Error(`Vobs: 插件依赖存在循环:${plugin.name}`)\n }\n\n installing.add(plugin.name)\n try {\n for (const dependency of plugin.requires ?? []) installPlugin(dependency)\n const cleanup = plugin.install?.(context)\n if (cleanup) cleanups.push(cleanup)\n installed.add(plugin.name)\n } finally {\n installing.delete(plugin.name)\n }\n }\n\n function cleanup(clearContainer = true): unknown {\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n try {\n rootOwner.dispose()\n } catch (error) {\n firstError ??= error\n }\n\n if (container && clearContainer) {\n try {\n renderer.clear(container)\n } catch (error) {\n firstError ??= error\n }\n }\n return firstError\n }\n\n function start(target: string | any, hydrating: boolean): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能挂载')\n if (mounted) return\n\n container = typeof target === 'string' ? document.querySelector(target) : target\n if (!container) throw new Error(`mount: 目标不存在: ${target}`)\n if (hydrating && !renderer.beginHydration) {\n throw new Error('Vobs: 当前渲染器不支持 Hydration')\n }\n\n setRenderer(renderer)\n try {\n if (hydrating) renderer.beginHydration?.()\n const rootNode = rootOwner.run(config.render)\n if (!hydrating) renderer.clear(container)\n if (rootNode) insertRuntimeNode(container, rootNode as any, null)\n if (hydrating) renderer.completeHydration?.()\n mounted = true\n } catch (error) {\n notifyError(error)\n const cleanupError = cleanup(!hydrating)\n destroyed = true\n throw cleanupError ?? error\n }\n }\n\n app = {\n get mounted(): boolean {\n return mounted\n },\n\n get destroyed(): boolean {\n return destroyed\n },\n\n use(plugin: VobsPlugin): VobsApp<any> {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能安装插件')\n installPlugin(plugin)\n return app\n },\n\n mount(target: string | any): void {\n start(target, false)\n },\n\n hydrate(target: string | any): void {\n start(target, true)\n },\n\n update(): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能更新')\n try {\n scheduler.flush()\n } catch (error) {\n notifyError(error)\n throw error\n }\n },\n\n destroy(): void {\n if (destroyed) return\n try {\n const cleanupError = cleanup()\n if (cleanupError) {\n notifyError(cleanupError)\n throw cleanupError\n }\n } finally {\n mounted = false\n destroyed = true\n }\n }\n }\n\n try {\n for (const plugin of config.plugins ?? []) app.use(plugin)\n } catch (error) {\n notifyError(error)\n cleanup()\n destroyed = true\n throw error\n }\n\n return app\n}\n","import { getCurrentOwner, type Owner } from '@vobs/reactivity'\nimport type { InjectionKey, ProvideOptions } from './app'\n\nconst ownerProviders = new WeakMap<Owner, Map<InjectionKey<unknown>, unknown>>()\n\nexport function provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n const owner = getCurrentOwner()\n if (!owner) throw new Error('Vobs: provide 必须在组件或 Owner 作用域内调用')\n provideToOwner(owner, key, value, options)\n}\n\nexport function inject<T>(key: InjectionKey<T>): T | undefined\nexport function inject<T>(key: InjectionKey<T>, fallback: T): T\nexport function inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const owner = getCurrentOwner()\n const value = owner ? injectFromOwner(owner, key) : undefined\n return value === undefined ? fallback : value\n}\n\nexport function injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = inject(key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n}\n\nexport function provideToOwner<T>(\n owner: Owner,\n key: InjectionKey<T>,\n value: T,\n options: ProvideOptions = {}\n): void {\n let providers = ownerProviders.get(owner)\n if (!providers) {\n providers = new Map<InjectionKey<unknown>, unknown>()\n ownerProviders.set(owner, providers)\n owner.onDispose(() => ownerProviders.delete(owner))\n }\n if (providers.has(key) && !options.override) {\n throw new Error(`Vobs: 注入项 ${String(key)} 已存在;如需覆盖请传入 override: true`)\n }\n providers.set(key, value)\n}\n\nexport function injectFromOwner<T>(owner: Owner, key: InjectionKey<T>): T | undefined {\n let current: Owner | null = owner\n while (current) {\n const providers = ownerProviders.get(current)\n if (providers?.has(key)) return providers.get(key) as T\n current = current.parent\n }\n return undefined\n}\n","import {\n createComponent,\n createElement,\n createFragment,\n insertBefore,\n normalizeDynamicChild,\n spreadProps,\n type VobsNode\n} from '@vobs/runtime'\n\r\nexport function jsxDEV(\r\n tag: string | Function,\r\n props: Record<string, unknown> | null,\r\n _key?: unknown,\r\n _isStaticChildren?: boolean,\r\n _source?: unknown,\r\n _self?: unknown\r\n): VobsNode {\n if (typeof tag === 'function') {\n return createComponent(tag as (props: Record<string, unknown>) => VobsNode, props ?? {})\n }\r\n\r\n const { children, ...attrs } = props ?? {}\r\n\r\n const el = createElement(tag as string)\n\r\n spreadProps(el, attrs)\n\r\n appendChildren(el, children)\r\n\r\n return el\r\n}\r\n\r\nfunction appendChildren(parent: Node, children: unknown, anchor: Node | null = null): void {\n if (children === undefined || children === null) return\r\n\r\n const childArray = Array.isArray(children) ? children : [children]\r\n\r\n for (const child of childArray) {\r\n const node = normalizeDynamicChild(child as Parameters<typeof normalizeDynamicChild>[0])\n if (node) insertBefore(parent, node, anchor)\n }\r\n}\r\n\r\nexport function jsx(tag: string | Function, props: Record<string, unknown> | null): VobsNode {\n return jsxDEV(tag, props)\r\n}\r\n\r\nexport function jsxs(tag: string | Function, props: Record<string, unknown> | null): VobsNode {\n return jsxDEV(tag, props)\r\n}\r\n\r\nexport function Fragment(props: { children?: unknown }): VobsNode {\n return createFragment((parent, anchor) => appendChildren(parent, props?.children, anchor))\n}\n\n/** Namespace for explicit built-in JSX primitives such as <Vobs.Fragment>. */\nexport const Vobs = { Fragment }\n"],"mappings":"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","names":["createDOMRenderer","setRenderer","createElement","insertBefore","spreadProps","createComponent","createFragment","normalizeDynamicChild","cleanup"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/app.ts","../src/context.ts","../src/jsx-dev-runtime.ts"],"sourcesContent":["/// <reference path=\"./jsx.d.ts\" />\n\nexport * from '@vobs/reactivity'\nexport { createDOMRenderer } from '@vobs/dom'\nexport type { VobsRenderer } from '@vobs/runtime'\nexport {\n getRuntimeDebugContext,\n getRuntimeDebugHooks,\n pushRuntimeDebugContext,\n runWithRuntimeDebugContext,\n setRuntimeDebugHooks\n} from '@vobs/runtime'\nexport type {\n RuntimeDebugContext,\n RuntimeDebugEnvironment,\n RuntimeDebugHooks,\n RuntimeDomMutation,\n RuntimeDomMutationOperation,\n RuntimeErrorEvent,\n RuntimeHydrationMismatch\n} from '@vobs/runtime'\nexport {\n setRenderer,\n getRenderer,\n createText,\n createElement,\n createComment,\n insertBefore,\n removeChild,\n setTextContent,\n setProperty,\n setAttribute,\n setStaticProps,\n spreadProps,\n addEventListener,\n removeEventListener,\n clear,\n createComponent,\n createFragment,\n isVobsFragment,\n disposeNodeOwner\n} from '@vobs/runtime'\nexport type { FragmentFactory, VobsFragment, VobsNode } from '@vobs/runtime'\nexport { bindText, bindAttribute, bindProperty } from '@vobs/runtime'\nexport type { ValueSource } from '@vobs/runtime'\nexport { ref, setRef } from '@vobs/runtime'\nexport type { Ref, RefTarget } from '@vobs/runtime'\nexport { insertDynamic, insertDynamicValue, insertList, normalizeDynamicChild } from '@vobs/runtime'\nexport type { DynamicChild, NodeFactory } from '@vobs/runtime'\nexport { createTemplate, cloneTemplate } from '@vobs/runtime'\nexport type { VobsLocatedError, VobsSourceLocation } from '@vobs/runtime'\nexport {\n VobsError,\n createVobsError,\n formatVobsError,\n isVobsError,\n normalizeVobsError\n} from '@vobs/runtime'\nexport type {\n FormatVobsErrorOptions,\n VobsErrorDefaults,\n VobsErrorLayer,\n VobsErrorLocation,\n VobsErrorOptions,\n VobsErrorSeverity\n} from '@vobs/runtime'\nexport {\n createHmrStateStore,\n disposeHmrModule,\n hmrStateRef,\n resolveComponent,\n updateHmrModule\n} from '@vobs/runtime'\nexport type { HmrComponent, HmrInstance, HmrStateStore } from '@vobs/runtime'\nexport { insertErrorBoundary } from '@vobs/runtime'\nexport { ErrorBoundary, insertBoundary } from '@vobs/runtime'\nexport type { BoundaryFallback, BoundaryOptions, BoundaryRetry, ErrorBoundaryFallback, ErrorBoundaryOptions, ErrorBoundaryProps } from '@vobs/runtime'\nexport { AsyncBoundary, insertAsyncBoundary, Profiler, insertProfiler } from '@vobs/runtime'\nexport type { AsyncBoundaryFallback, AsyncBoundaryOptions, AsyncBoundaryProps, AsyncBoundaryView, ProfilerOptions, ProfilerProps, ProfilerRenderInfo } from '@vobs/runtime'\nexport { createVobs, createInjectionKey } from './app'\nexport { Fragment, Vobs } from './jsx-dev-runtime'\nexport { provide, inject, injectRequired } from './context'\nexport type {\n InjectionKey,\n ProvideOptions,\n VobsApp,\n VobsConfig,\n VobsPlugin,\n VobsContext\n} from './app'\n","import { createOwner, scheduler, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { createDOMRenderer } from '@vobs/dom'\nimport { insertBefore as insertRuntimeNode, setRenderer, type VobsFragment, type VobsRenderer } from '@vobs/runtime'\nimport { injectFromOwner, provideToOwner } from './context'\n\nexport type InjectionKey<T> = symbol & {\n readonly __vobsType?: T\n}\n\nexport interface ProvideOptions {\n override?: boolean\n}\n\nexport interface VobsPlugin {\n name: string\n version?: string\n requires?: readonly VobsPlugin[]\n optional?: readonly VobsPlugin[]\n install?: (ctx: VobsContext) => void | (() => void)\n}\n\nexport interface VobsContext {\n readonly app: VobsApp\n provide<T>(key: InjectionKey<T>, value: T, options?: ProvideOptions): void\n inject<T>(key: InjectionKey<T>): T | undefined\n injectRequired<T>(key: InjectionKey<T>, description?: string): T\n onDestroy(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n}\n\nexport interface VobsConfig<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n> {\n render: () => NodeType | VobsFragment | Node | null | undefined\n renderer?: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n plugins?: VobsPlugin[]\n /** Optional application-level error observer. Observers are isolated from the app. */\n onError?: (error: unknown) => void\n}\n\nexport interface VobsApp<NodeType = Node> {\n readonly mounted: boolean\n readonly destroyed: boolean\n use(plugin: VobsPlugin): VobsApp<NodeType>\n mount(target: string | NodeType): void\n hydrate(target: string | NodeType): void\n update(): void\n destroy(): void\n}\n\nexport function createInjectionKey<T>(description: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>\n}\n\nexport function createVobs(\n config: VobsConfig<Node, Text, Element, Comment>\n): VobsApp<Node>\nexport function createVobs<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n>(\n config: VobsConfig<NodeType, TextNode, ElementNode, CommentNode> & {\n renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n }\n): VobsApp<NodeType>\nexport function createVobs(\n config: VobsConfig<any, any, any, any>\n): VobsApp<any> {\n if (!config.render) throw new Error('createVobs: render 不能为空')\n\n const renderer = config.renderer ?? createDOMRenderer()\n const rootOwner: Owner = createOwner()\n setOwnerDebugName(rootOwner, 'App')\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n const installed = new Set<string>()\n const installing = new Set<string>()\n let mounted = false\n let destroyed = false\n let container: any = null\n let app!: VobsApp<any>\n\n if (config.onError) {\n errorHandlers.add(config.onError)\n cleanups.push(() => errorHandlers.delete(config.onError!))\n }\n\n const context: VobsContext = {\n get app(): VobsApp<any> {\n return app\n },\n\n provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n provideToOwner(rootOwner, key, value, options)\n },\n\n inject<T>(key: InjectionKey<T>): T | undefined {\n return injectFromOwner(rootOwner, key)\n },\n\n injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = injectFromOwner(rootOwner, key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n },\n\n onDestroy(cleanup: () => void): void {\n cleanups.push(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n cleanups.push(remove)\n return remove\n }\n }\n\n function notifyError(error: unknown): void {\n for (const handler of [...errorHandlers]) {\n try {\n handler(error)\n } catch {\n // 错误处理器不能覆盖触发它的原始错误。\n }\n }\n }\n\n function installPlugin(plugin: VobsPlugin): void {\n if (installed.has(plugin.name)) return\n if (installing.has(plugin.name)) {\n throw new Error(`Vobs: 插件依赖存在循环:${plugin.name}`)\n }\n\n installing.add(plugin.name)\n try {\n for (const dependency of plugin.requires ?? []) installPlugin(dependency)\n const cleanup = plugin.install?.(context)\n if (cleanup) cleanups.push(cleanup)\n installed.add(plugin.name)\n } finally {\n installing.delete(plugin.name)\n }\n }\n\n function cleanup(clearContainer = true): unknown {\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n try {\n rootOwner.dispose()\n } catch (error) {\n firstError ??= error\n }\n\n if (container && clearContainer) {\n try {\n renderer.clear(container)\n } catch (error) {\n firstError ??= error\n }\n }\n return firstError\n }\n\n function start(target: string | any, hydrating: boolean): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能挂载')\n if (mounted) return\n\n container = typeof target === 'string' ? document.querySelector(target) : target\n if (!container) throw new Error(`mount: 目标不存在: ${target}`)\n if (hydrating && !renderer.beginHydration) {\n throw new Error('Vobs: 当前渲染器不支持 Hydration')\n }\n\n setRenderer(renderer)\n try {\n if (hydrating) renderer.beginHydration?.()\n const rootNode = rootOwner.run(config.render)\n if (!hydrating) renderer.clear(container)\n if (rootNode) insertRuntimeNode(container, rootNode as any, null)\n if (hydrating) renderer.completeHydration?.()\n mounted = true\n } catch (error) {\n notifyError(error)\n const cleanupError = cleanup(!hydrating)\n destroyed = true\n throw cleanupError ?? error\n }\n }\n\n app = {\n get mounted(): boolean {\n return mounted\n },\n\n get destroyed(): boolean {\n return destroyed\n },\n\n use(plugin: VobsPlugin): VobsApp<any> {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能安装插件')\n installPlugin(plugin)\n return app\n },\n\n mount(target: string | any): void {\n start(target, false)\n },\n\n hydrate(target: string | any): void {\n start(target, true)\n },\n\n update(): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能更新')\n try {\n scheduler.flush()\n } catch (error) {\n notifyError(error)\n throw error\n }\n },\n\n destroy(): void {\n if (destroyed) return\n try {\n const cleanupError = cleanup()\n if (cleanupError) {\n notifyError(cleanupError)\n throw cleanupError\n }\n } finally {\n mounted = false\n destroyed = true\n }\n }\n }\n\n try {\n for (const plugin of config.plugins ?? []) app.use(plugin)\n } catch (error) {\n notifyError(error)\n cleanup()\n destroyed = true\n throw error\n }\n\n return app\n}\n","import { getCurrentOwner, type Owner } from '@vobs/reactivity'\nimport type { InjectionKey, ProvideOptions } from './app'\n\nconst ownerProviders = new WeakMap<Owner, Map<InjectionKey<unknown>, unknown>>()\n\nexport function provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n const owner = getCurrentOwner()\n if (!owner) throw new Error('Vobs: provide 必须在组件或 Owner 作用域内调用')\n provideToOwner(owner, key, value, options)\n}\n\nexport function inject<T>(key: InjectionKey<T>): T | undefined\nexport function inject<T>(key: InjectionKey<T>, fallback: T): T\nexport function inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const owner = getCurrentOwner()\n const value = owner ? injectFromOwner(owner, key) : undefined\n return value === undefined ? fallback : value\n}\n\nexport function injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = inject(key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n}\n\nexport function provideToOwner<T>(\n owner: Owner,\n key: InjectionKey<T>,\n value: T,\n options: ProvideOptions = {}\n): void {\n let providers = ownerProviders.get(owner)\n if (!providers) {\n providers = new Map<InjectionKey<unknown>, unknown>()\n ownerProviders.set(owner, providers)\n owner.onDispose(() => ownerProviders.delete(owner))\n }\n if (providers.has(key) && !options.override) {\n throw new Error(`Vobs: 注入项 ${String(key)} 已存在;如需覆盖请传入 override: true`)\n }\n providers.set(key, value)\n}\n\nexport function injectFromOwner<T>(owner: Owner, key: InjectionKey<T>): T | undefined {\n let current: Owner | null = owner\n while (current) {\n const providers = ownerProviders.get(current)\n if (providers?.has(key)) return providers.get(key) as T\n current = current.parent\n }\n return undefined\n}\n","import {\n createComponent,\n createElement,\n createFragment,\n insertBefore,\n normalizeDynamicChild,\n spreadProps,\n type VobsNode\n} from '@vobs/runtime'\n\r\nexport function jsxDEV(\r\n tag: string | Function,\r\n props: Record<string, unknown> | null,\r\n _key?: unknown,\r\n _isStaticChildren?: boolean,\r\n _source?: unknown,\r\n _self?: unknown\r\n): VobsNode {\n if (typeof tag === 'function') {\n return createComponent(tag as (props: Record<string, unknown>) => VobsNode, props ?? {})\n }\r\n\r\n const { children, ...attrs } = props ?? {}\r\n\r\n const el = createElement(tag as string)\n\r\n spreadProps(el, attrs)\n\r\n appendChildren(el, children)\r\n\r\n return el\r\n}\r\n\r\nfunction appendChildren(parent: Node, children: unknown, anchor: Node | null = null): void {\n if (children === undefined || children === null) return\r\n\r\n const childArray = Array.isArray(children) ? children : [children]\r\n\r\n for (const child of childArray) {\r\n const node = normalizeDynamicChild(child as Parameters<typeof normalizeDynamicChild>[0])\n if (node) insertBefore(parent, node, anchor)\n }\r\n}\r\n\r\nexport function jsx(tag: string | Function, props: Record<string, unknown> | null): VobsNode {\n return jsxDEV(tag, props)\r\n}\r\n\r\nexport function jsxs(tag: string | Function, props: Record<string, unknown> | null): VobsNode {\n return jsxDEV(tag, props)\r\n}\r\n\r\nexport function Fragment(props: { children?: unknown }): VobsNode {\n return createFragment((parent, anchor) => appendChildren(parent, props?.children, anchor))\n}\n\n/** Namespace for explicit built-in JSX primitives such as <Vobs.Fragment>. */\nexport const Vobs = { Fragment }\n"],"mappings":"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","names":["createDOMRenderer","setRenderer","createElement","insertBefore","spreadProps","createComponent","createFragment","normalizeDynamicChild","cleanup"]}
package/dist/jsx.d.ts ADDED
@@ -0,0 +1,132 @@
1
+ import type { Ref, RefTarget, VobsNode } from '@vobs/runtime'
2
+
3
+ // JSX 类型声明
4
+
5
+ type VobsEventHandler<T extends Event = Event> = (event: T) => void
6
+
7
+ interface VobsHTMLAttributes {
8
+ ref?: RefTarget<any>
9
+ accessKey?: string
10
+ autofocus?: boolean
11
+ checked?: boolean
12
+ class?: string
13
+ className?: string
14
+ cols?: number
15
+ disabled?: boolean
16
+ height?: number | string
17
+ hidden?: boolean
18
+ id?: string
19
+ max?: number | string
20
+ maxLength?: number
21
+ min?: number | string
22
+ minLength?: number
23
+ multiple?: boolean
24
+ name?: string
25
+ placeholder?: string
26
+ readOnly?: boolean
27
+ required?: boolean
28
+ rows?: number
29
+ selected?: boolean
30
+ size?: number
31
+ src?: string
32
+ step?: number | string
33
+ style?: string | Readonly<Record<string, string | number | boolean | null | undefined>>
34
+ tabIndex?: number
35
+ title?: string
36
+ type?: string
37
+ value?: string | number | readonly string[]
38
+ key?: string | number
39
+ width?: number | string
40
+ children?: unknown
41
+ onClick?: VobsEventHandler<MouseEvent>
42
+ onDblClick?: VobsEventHandler<MouseEvent>
43
+ onFocus?: VobsEventHandler<FocusEvent>
44
+ onBlur?: VobsEventHandler<FocusEvent>
45
+ onInput?: VobsEventHandler<InputEvent>
46
+ onChange?: VobsEventHandler<Event>
47
+ onKeyDown?: VobsEventHandler<KeyboardEvent>
48
+ onKeyUp?: VobsEventHandler<KeyboardEvent>
49
+ onSubmit?: VobsEventHandler<SubmitEvent>
50
+ [name: `data-${string}`]: string | number | boolean | undefined
51
+ [name: `aria-${string}`]: string | number | boolean | undefined
52
+ }
53
+
54
+ declare global {
55
+ namespace JSX {
56
+ type Element = VobsNode
57
+ interface ElementChildrenAttribute { children: {} }
58
+ interface IntrinsicElements {
59
+ a: VobsHTMLAttributes
60
+ abbr: VobsHTMLAttributes
61
+ address: VobsHTMLAttributes
62
+ article: VobsHTMLAttributes
63
+ aside: VobsHTMLAttributes
64
+ b: VobsHTMLAttributes
65
+ button: VobsHTMLAttributes
66
+ canvas: VobsHTMLAttributes
67
+ code: VobsHTMLAttributes
68
+ dd: VobsHTMLAttributes
69
+ del: VobsHTMLAttributes
70
+ details: VobsHTMLAttributes
71
+ dialog: VobsHTMLAttributes
72
+ div: VobsHTMLAttributes
73
+ dl: VobsHTMLAttributes
74
+ dt: VobsHTMLAttributes
75
+ em: VobsHTMLAttributes
76
+ fieldset: VobsHTMLAttributes
77
+ figcaption: VobsHTMLAttributes
78
+ figure: VobsHTMLAttributes
79
+ footer: VobsHTMLAttributes
80
+ form: VobsHTMLAttributes
81
+ h1: VobsHTMLAttributes
82
+ h2: VobsHTMLAttributes
83
+ h3: VobsHTMLAttributes
84
+ h4: VobsHTMLAttributes
85
+ h5: VobsHTMLAttributes
86
+ h6: VobsHTMLAttributes
87
+ header: VobsHTMLAttributes
88
+ hr: VobsHTMLAttributes
89
+ i: VobsHTMLAttributes
90
+ img: VobsHTMLAttributes
91
+ input: VobsHTMLAttributes
92
+ ins: VobsHTMLAttributes
93
+ kbd: VobsHTMLAttributes
94
+ label: VobsHTMLAttributes
95
+ legend: VobsHTMLAttributes
96
+ li: VobsHTMLAttributes
97
+ main: VobsHTMLAttributes
98
+ mark: VobsHTMLAttributes
99
+ nav: VobsHTMLAttributes
100
+ ol: VobsHTMLAttributes
101
+ optgroup: VobsHTMLAttributes
102
+ option: VobsHTMLAttributes
103
+ output: VobsHTMLAttributes
104
+ pre: VobsHTMLAttributes
105
+ p: VobsHTMLAttributes
106
+ q: VobsHTMLAttributes
107
+ s: VobsHTMLAttributes
108
+ section: VobsHTMLAttributes
109
+ select: VobsHTMLAttributes
110
+ small: VobsHTMLAttributes
111
+ span: VobsHTMLAttributes
112
+ strong: VobsHTMLAttributes
113
+ sub: VobsHTMLAttributes
114
+ summary: VobsHTMLAttributes
115
+ sup: VobsHTMLAttributes
116
+ table: VobsHTMLAttributes
117
+ tbody: VobsHTMLAttributes
118
+ td: VobsHTMLAttributes
119
+ textarea: VobsHTMLAttributes
120
+ tfoot: VobsHTMLAttributes
121
+ th: VobsHTMLAttributes
122
+ thead: VobsHTMLAttributes
123
+ time: VobsHTMLAttributes
124
+ tr: VobsHTMLAttributes
125
+ u: VobsHTMLAttributes
126
+ ul: VobsHTMLAttributes
127
+ video: VobsHTMLAttributes
128
+ }
129
+ }
130
+ }
131
+
132
+ export {}
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "type": "git",
12
12
  "url": "git+https://github.com/vobsjs/vobs.git"
13
13
  },
14
- "version": "1.2.2",
14
+ "version": "1.3.0",
15
15
  "publishConfig": {
16
16
  "access": "public"
17
17
  },
@@ -38,6 +38,9 @@
38
38
  "require": "./dist/jsx-dev-runtime.cjs",
39
39
  "default": "./dist/jsx-dev-runtime.js"
40
40
  },
41
+ "./jsx": {
42
+ "types": "./dist/jsx.d.ts"
43
+ },
41
44
  "./source": {
42
45
  "types": "./src/index.ts",
43
46
  "default": "./src/index.ts"
@@ -45,8 +48,8 @@
45
48
  "./source/*": "./src/*"
46
49
  },
47
50
  "dependencies": {
48
- "@vobs/reactivity": "1.2.2",
49
- "@vobs/dom": "1.2.2",
50
- "@vobs/runtime": "1.2.2"
51
+ "@vobs/reactivity": "1.3.0",
52
+ "@vobs/dom": "1.3.0",
53
+ "@vobs/runtime": "1.3.0"
51
54
  }
52
55
  }
package/src/index.ts CHANGED
@@ -67,6 +67,7 @@ export type {
67
67
  export {
68
68
  createHmrStateStore,
69
69
  disposeHmrModule,
70
+ hmrStateRef,
70
71
  resolveComponent,
71
72
  updateHmrModule
72
73
  } from '@vobs/runtime'
package/src/jsx.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import type { VobsNode } from './fragment'
2
- import type { Ref, RefTarget } from '@vobs/runtime'
1
+ import type { Ref, RefTarget, VobsNode } from '@vobs/runtime'
3
2
 
4
3
  // JSX 类型声明
5
4
 
@@ -9,6 +8,7 @@ interface VobsHTMLAttributes {
9
8
  ref?: RefTarget<any>
10
9
  accessKey?: string
11
10
  autofocus?: boolean
11
+ checked?: boolean
12
12
  class?: string
13
13
  className?: string
14
14
  cols?: number
@@ -57,30 +57,62 @@ declare global {
57
57
  interface ElementChildrenAttribute { children: {} }
58
58
  interface IntrinsicElements {
59
59
  a: VobsHTMLAttributes
60
+ abbr: VobsHTMLAttributes
61
+ address: VobsHTMLAttributes
60
62
  article: VobsHTMLAttributes
61
63
  aside: VobsHTMLAttributes
64
+ b: VobsHTMLAttributes
62
65
  button: VobsHTMLAttributes
66
+ canvas: VobsHTMLAttributes
63
67
  code: VobsHTMLAttributes
68
+ dd: VobsHTMLAttributes
69
+ del: VobsHTMLAttributes
70
+ details: VobsHTMLAttributes
71
+ dialog: VobsHTMLAttributes
64
72
  div: VobsHTMLAttributes
73
+ dl: VobsHTMLAttributes
74
+ dt: VobsHTMLAttributes
75
+ em: VobsHTMLAttributes
76
+ fieldset: VobsHTMLAttributes
77
+ figcaption: VobsHTMLAttributes
78
+ figure: VobsHTMLAttributes
65
79
  footer: VobsHTMLAttributes
66
80
  form: VobsHTMLAttributes
67
81
  h1: VobsHTMLAttributes
68
82
  h2: VobsHTMLAttributes
69
83
  h3: VobsHTMLAttributes
84
+ h4: VobsHTMLAttributes
85
+ h5: VobsHTMLAttributes
86
+ h6: VobsHTMLAttributes
70
87
  header: VobsHTMLAttributes
88
+ hr: VobsHTMLAttributes
89
+ i: VobsHTMLAttributes
71
90
  img: VobsHTMLAttributes
72
91
  input: VobsHTMLAttributes
92
+ ins: VobsHTMLAttributes
93
+ kbd: VobsHTMLAttributes
73
94
  label: VobsHTMLAttributes
95
+ legend: VobsHTMLAttributes
74
96
  li: VobsHTMLAttributes
75
97
  main: VobsHTMLAttributes
98
+ mark: VobsHTMLAttributes
76
99
  nav: VobsHTMLAttributes
77
100
  ol: VobsHTMLAttributes
101
+ optgroup: VobsHTMLAttributes
78
102
  option: VobsHTMLAttributes
103
+ output: VobsHTMLAttributes
79
104
  pre: VobsHTMLAttributes
80
105
  p: VobsHTMLAttributes
106
+ q: VobsHTMLAttributes
107
+ s: VobsHTMLAttributes
81
108
  section: VobsHTMLAttributes
82
109
  select: VobsHTMLAttributes
110
+ small: VobsHTMLAttributes
83
111
  span: VobsHTMLAttributes
112
+ strong: VobsHTMLAttributes
113
+ sub: VobsHTMLAttributes
114
+ summary: VobsHTMLAttributes
115
+ sup: VobsHTMLAttributes
84
116
  table: VobsHTMLAttributes
85
117
  tbody: VobsHTMLAttributes
86
118
  td: VobsHTMLAttributes
@@ -88,8 +120,11 @@ declare global {
88
120
  tfoot: VobsHTMLAttributes
89
121
  th: VobsHTMLAttributes
90
122
  thead: VobsHTMLAttributes
123
+ time: VobsHTMLAttributes
91
124
  tr: VobsHTMLAttributes
125
+ u: VobsHTMLAttributes
92
126
  ul: VobsHTMLAttributes
127
+ video: VobsHTMLAttributes
93
128
  }
94
129
  }
95
130
  }