@vobs/vobs 1.2.2 → 1.3.1

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,133 @@
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
+ accept?: string
10
+ accessKey?: string
11
+ autofocus?: boolean
12
+ checked?: boolean
13
+ class?: string
14
+ className?: string
15
+ cols?: number
16
+ disabled?: boolean
17
+ height?: number | string
18
+ hidden?: boolean
19
+ id?: string
20
+ max?: number | string
21
+ maxLength?: number
22
+ min?: number | string
23
+ minLength?: number
24
+ multiple?: boolean
25
+ name?: string
26
+ placeholder?: string
27
+ readOnly?: boolean
28
+ required?: boolean
29
+ rows?: number
30
+ selected?: boolean
31
+ size?: number
32
+ src?: string
33
+ step?: number | string
34
+ style?: string | Readonly<Record<string, string | number | boolean | null | undefined>>
35
+ tabIndex?: number
36
+ title?: string
37
+ type?: string
38
+ value?: string | number | readonly string[]
39
+ key?: string | number
40
+ width?: number | string
41
+ children?: unknown
42
+ onClick?: VobsEventHandler<MouseEvent>
43
+ onDblClick?: VobsEventHandler<MouseEvent>
44
+ onFocus?: VobsEventHandler<FocusEvent>
45
+ onBlur?: VobsEventHandler<FocusEvent>
46
+ onInput?: VobsEventHandler<InputEvent>
47
+ onChange?: VobsEventHandler<Event>
48
+ onKeyDown?: VobsEventHandler<KeyboardEvent>
49
+ onKeyUp?: VobsEventHandler<KeyboardEvent>
50
+ onSubmit?: VobsEventHandler<SubmitEvent>
51
+ [name: `data-${string}`]: string | number | boolean | undefined
52
+ [name: `aria-${string}`]: string | number | boolean | undefined
53
+ }
54
+
55
+ declare global {
56
+ namespace JSX {
57
+ type Element = VobsNode
58
+ interface ElementChildrenAttribute { children: {} }
59
+ interface IntrinsicElements {
60
+ a: VobsHTMLAttributes
61
+ abbr: VobsHTMLAttributes
62
+ address: VobsHTMLAttributes
63
+ article: VobsHTMLAttributes
64
+ aside: VobsHTMLAttributes
65
+ b: VobsHTMLAttributes
66
+ button: VobsHTMLAttributes
67
+ canvas: VobsHTMLAttributes
68
+ code: VobsHTMLAttributes
69
+ dd: VobsHTMLAttributes
70
+ del: VobsHTMLAttributes
71
+ details: VobsHTMLAttributes
72
+ dialog: VobsHTMLAttributes
73
+ div: VobsHTMLAttributes
74
+ dl: VobsHTMLAttributes
75
+ dt: VobsHTMLAttributes
76
+ em: VobsHTMLAttributes
77
+ fieldset: VobsHTMLAttributes
78
+ figcaption: VobsHTMLAttributes
79
+ figure: VobsHTMLAttributes
80
+ footer: VobsHTMLAttributes
81
+ form: VobsHTMLAttributes
82
+ h1: VobsHTMLAttributes
83
+ h2: VobsHTMLAttributes
84
+ h3: VobsHTMLAttributes
85
+ h4: VobsHTMLAttributes
86
+ h5: VobsHTMLAttributes
87
+ h6: VobsHTMLAttributes
88
+ header: VobsHTMLAttributes
89
+ hr: VobsHTMLAttributes
90
+ i: VobsHTMLAttributes
91
+ img: VobsHTMLAttributes
92
+ input: VobsHTMLAttributes
93
+ ins: VobsHTMLAttributes
94
+ kbd: VobsHTMLAttributes
95
+ label: VobsHTMLAttributes
96
+ legend: VobsHTMLAttributes
97
+ li: VobsHTMLAttributes
98
+ main: VobsHTMLAttributes
99
+ mark: VobsHTMLAttributes
100
+ nav: VobsHTMLAttributes
101
+ ol: VobsHTMLAttributes
102
+ optgroup: VobsHTMLAttributes
103
+ option: VobsHTMLAttributes
104
+ output: VobsHTMLAttributes
105
+ pre: VobsHTMLAttributes
106
+ p: VobsHTMLAttributes
107
+ q: VobsHTMLAttributes
108
+ s: VobsHTMLAttributes
109
+ section: VobsHTMLAttributes
110
+ select: VobsHTMLAttributes
111
+ small: VobsHTMLAttributes
112
+ span: VobsHTMLAttributes
113
+ strong: VobsHTMLAttributes
114
+ sub: VobsHTMLAttributes
115
+ summary: VobsHTMLAttributes
116
+ sup: VobsHTMLAttributes
117
+ table: VobsHTMLAttributes
118
+ tbody: VobsHTMLAttributes
119
+ td: VobsHTMLAttributes
120
+ textarea: VobsHTMLAttributes
121
+ tfoot: VobsHTMLAttributes
122
+ th: VobsHTMLAttributes
123
+ thead: VobsHTMLAttributes
124
+ time: VobsHTMLAttributes
125
+ tr: VobsHTMLAttributes
126
+ u: VobsHTMLAttributes
127
+ ul: VobsHTMLAttributes
128
+ video: VobsHTMLAttributes
129
+ }
130
+ }
131
+ }
132
+
133
+ 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.1",
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/dom": "1.3.1",
52
+ "@vobs/reactivity": "1.3.1",
53
+ "@vobs/runtime": "1.3.1"
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
 
@@ -7,8 +6,10 @@ type VobsEventHandler<T extends Event = Event> = (event: T) => void
7
6
 
8
7
  interface VobsHTMLAttributes {
9
8
  ref?: RefTarget<any>
9
+ accept?: string
10
10
  accessKey?: string
11
11
  autofocus?: boolean
12
+ checked?: boolean
12
13
  class?: string
13
14
  className?: string
14
15
  cols?: number
@@ -57,30 +58,62 @@ declare global {
57
58
  interface ElementChildrenAttribute { children: {} }
58
59
  interface IntrinsicElements {
59
60
  a: VobsHTMLAttributes
61
+ abbr: VobsHTMLAttributes
62
+ address: VobsHTMLAttributes
60
63
  article: VobsHTMLAttributes
61
64
  aside: VobsHTMLAttributes
65
+ b: VobsHTMLAttributes
62
66
  button: VobsHTMLAttributes
67
+ canvas: VobsHTMLAttributes
63
68
  code: VobsHTMLAttributes
69
+ dd: VobsHTMLAttributes
70
+ del: VobsHTMLAttributes
71
+ details: VobsHTMLAttributes
72
+ dialog: VobsHTMLAttributes
64
73
  div: VobsHTMLAttributes
74
+ dl: VobsHTMLAttributes
75
+ dt: VobsHTMLAttributes
76
+ em: VobsHTMLAttributes
77
+ fieldset: VobsHTMLAttributes
78
+ figcaption: VobsHTMLAttributes
79
+ figure: VobsHTMLAttributes
65
80
  footer: VobsHTMLAttributes
66
81
  form: VobsHTMLAttributes
67
82
  h1: VobsHTMLAttributes
68
83
  h2: VobsHTMLAttributes
69
84
  h3: VobsHTMLAttributes
85
+ h4: VobsHTMLAttributes
86
+ h5: VobsHTMLAttributes
87
+ h6: VobsHTMLAttributes
70
88
  header: VobsHTMLAttributes
89
+ hr: VobsHTMLAttributes
90
+ i: VobsHTMLAttributes
71
91
  img: VobsHTMLAttributes
72
92
  input: VobsHTMLAttributes
93
+ ins: VobsHTMLAttributes
94
+ kbd: VobsHTMLAttributes
73
95
  label: VobsHTMLAttributes
96
+ legend: VobsHTMLAttributes
74
97
  li: VobsHTMLAttributes
75
98
  main: VobsHTMLAttributes
99
+ mark: VobsHTMLAttributes
76
100
  nav: VobsHTMLAttributes
77
101
  ol: VobsHTMLAttributes
102
+ optgroup: VobsHTMLAttributes
78
103
  option: VobsHTMLAttributes
104
+ output: VobsHTMLAttributes
79
105
  pre: VobsHTMLAttributes
80
106
  p: VobsHTMLAttributes
107
+ q: VobsHTMLAttributes
108
+ s: VobsHTMLAttributes
81
109
  section: VobsHTMLAttributes
82
110
  select: VobsHTMLAttributes
111
+ small: VobsHTMLAttributes
83
112
  span: VobsHTMLAttributes
113
+ strong: VobsHTMLAttributes
114
+ sub: VobsHTMLAttributes
115
+ summary: VobsHTMLAttributes
116
+ sup: VobsHTMLAttributes
84
117
  table: VobsHTMLAttributes
85
118
  tbody: VobsHTMLAttributes
86
119
  td: VobsHTMLAttributes
@@ -88,8 +121,11 @@ declare global {
88
121
  tfoot: VobsHTMLAttributes
89
122
  th: VobsHTMLAttributes
90
123
  thead: VobsHTMLAttributes
124
+ time: VobsHTMLAttributes
91
125
  tr: VobsHTMLAttributes
126
+ u: VobsHTMLAttributes
92
127
  ul: VobsHTMLAttributes
128
+ video: VobsHTMLAttributes
93
129
  }
94
130
  }
95
131
  }