speexjs 0.2.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.
Files changed (67) hide show
  1. package/README.md +555 -0
  2. package/dist/cli/index.d.ts +1 -0
  3. package/dist/cli/index.js +1017 -0
  4. package/dist/cli/index.js.map +1 -0
  5. package/dist/client/index.d.ts +73 -0
  6. package/dist/client/index.js +927 -0
  7. package/dist/client/index.js.map +1 -0
  8. package/dist/client/signals/index.d.ts +62 -0
  9. package/dist/client/signals/index.js +248 -0
  10. package/dist/client/signals/index.js.map +1 -0
  11. package/dist/client/vdom/index.d.ts +50 -0
  12. package/dist/client/vdom/index.js +540 -0
  13. package/dist/client/vdom/index.js.map +1 -0
  14. package/dist/client/vdom/jsx-runtime.d.ts +9 -0
  15. package/dist/client/vdom/jsx-runtime.js +203 -0
  16. package/dist/client/vdom/jsx-runtime.js.map +1 -0
  17. package/dist/index-CMkhSDh7.d.ts +97 -0
  18. package/dist/index.d.ts +18 -0
  19. package/dist/index.js +6402 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/jsx-DGrnv8QB.d.ts +8 -0
  22. package/dist/response-Ca8KWK5_.d.ts +173 -0
  23. package/dist/rpc/index.d.ts +70 -0
  24. package/dist/rpc/index.js +136 -0
  25. package/dist/rpc/index.js.map +1 -0
  26. package/dist/schema/index.d.ts +231 -0
  27. package/dist/schema/index.js +1160 -0
  28. package/dist/schema/index.js.map +1 -0
  29. package/dist/server/auth/index.d.ts +61 -0
  30. package/dist/server/auth/index.js +462 -0
  31. package/dist/server/auth/index.js.map +1 -0
  32. package/dist/server/cache/index.d.ts +45 -0
  33. package/dist/server/cache/index.js +238 -0
  34. package/dist/server/cache/index.js.map +1 -0
  35. package/dist/server/container/index.d.ts +20 -0
  36. package/dist/server/container/index.js +62 -0
  37. package/dist/server/container/index.js.map +1 -0
  38. package/dist/server/controller/index.d.ts +37 -0
  39. package/dist/server/controller/index.js +139 -0
  40. package/dist/server/controller/index.js.map +1 -0
  41. package/dist/server/database/index.d.ts +461 -0
  42. package/dist/server/database/index.js +1977 -0
  43. package/dist/server/database/index.js.map +1 -0
  44. package/dist/server/events/index.d.ts +29 -0
  45. package/dist/server/events/index.js +159 -0
  46. package/dist/server/events/index.js.map +1 -0
  47. package/dist/server/gate/index.d.ts +36 -0
  48. package/dist/server/gate/index.js +169 -0
  49. package/dist/server/gate/index.js.map +1 -0
  50. package/dist/server/http/index.d.ts +45 -0
  51. package/dist/server/http/index.js +871 -0
  52. package/dist/server/http/index.js.map +1 -0
  53. package/dist/server/index.d.ts +79 -0
  54. package/dist/server/index.js +4185 -0
  55. package/dist/server/index.js.map +1 -0
  56. package/dist/server/middleware/index.d.ts +5 -0
  57. package/dist/server/middleware/index.js +416 -0
  58. package/dist/server/middleware/index.js.map +1 -0
  59. package/dist/server/router/index.d.ts +5 -0
  60. package/dist/server/router/index.js +231 -0
  61. package/dist/server/router/index.js.map +1 -0
  62. package/dist/server/storage/index.d.ts +66 -0
  63. package/dist/server/storage/index.js +244 -0
  64. package/dist/server/storage/index.js.map +1 -0
  65. package/dist/session-guard-CZeN87L9.d.ts +48 -0
  66. package/dist/types-CXH8hPei.d.ts +38 -0
  67. package/package.json +138 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/signals/index.ts","../../src/client/vdom/index.ts","../../src/client/vdom/jsx.ts","../../src/client/render/index.ts","../../src/client/adapters/index.ts","../../src/client/router.ts"],"sourcesContent":["let activeTracker: (() => void) | null = null\nlet activeSources: Set<Subscribable> | null = null\nlet batchDepth = 0\nconst pendingUpdates = new Set<() => void>()\n\ninterface Subscribable {\n _subs: Set<() => void>\n}\n\nfunction flushPending(): void {\n const fns = [...pendingUpdates]\n pendingUpdates.clear()\n for (const fn of fns) fn()\n}\n\nfunction trackSource(node: Subscribable): void {\n if (activeSources) activeSources.add(node)\n if (activeTracker) node._subs.add(activeTracker)\n}\n\nexport class Signal<T> {\n readonly _tag = 'signal' as const\n _subs = new Set<() => void>()\n private _value: T\n\n constructor(value: T) {\n this._value = value\n }\n\n get value(): T {\n trackSource(this)\n return this._value\n }\n\n set value(val: T) {\n if (val !== this._value) {\n this._value = val\n this._notify()\n }\n }\n\n peek(): T {\n return this._value\n }\n\n set(v: T): void {\n this.value = v\n }\n\n update(fn: (v: T) => T): void {\n this.value = fn(this._value)\n }\n\n subscribe(fn: (val: T) => void): () => void {\n const cb = () => fn(this._value)\n this._subs.add(cb)\n return () => this._subs.delete(cb)\n }\n\n toJSON(): T {\n return this._value\n }\n\n toString(): string {\n return String(this._value)\n }\n\n valueOf(): T {\n return this._value\n }\n\n *[Symbol.iterator](): Iterator<T> {\n yield this._value\n }\n\n private _notify(): void {\n if (batchDepth > 0) {\n for (const s of this._subs) pendingUpdates.add(s)\n } else {\n const subs = [...this._subs]\n for (const s of subs) s()\n }\n }\n}\n\nexport class Computed<T> {\n readonly _tag = 'computed' as const\n _subs = new Set<() => void>()\n private _fn: () => T\n private _value!: T\n private _dirty = true\n private _sources = new Set<Subscribable>()\n\n private _onDepChange = (): void => {\n if (!this._dirty) {\n this._dirty = true\n for (const s of [...this._subs]) s()\n }\n }\n\n constructor(fn: () => T) {\n this._fn = fn\n }\n\n get value(): T {\n trackSource(this)\n if (this._dirty) this._eval()\n return this._value\n }\n\n peek(): T {\n if (this._dirty) this._eval()\n return this._value\n }\n\n subscribe(fn: (val: T) => void): () => void {\n this.value\n const cb = () => fn(this._value)\n this._subs.add(cb)\n return () => this._subs.delete(cb)\n }\n\n toJSON(): T {\n return this.value\n }\n\n toString(): string {\n return String(this.value)\n }\n\n valueOf(): T {\n return this.value\n }\n\n private _eval(): void {\n for (const src of this._sources) {\n src._subs.delete(this._onDepChange)\n }\n this._sources.clear()\n this._dirty = false\n\n const prevSources = activeSources\n const prevTracker = activeTracker\n activeSources = new Set()\n activeTracker = null\n try {\n this._value = this._fn()\n this._sources = activeSources\n } finally {\n activeSources = prevSources\n activeTracker = prevTracker\n }\n\n for (const src of this._sources) {\n src._subs.add(this._onDepChange)\n }\n }\n}\n\nexport class Effect {\n private _fn: () => void | (() => void)\n private _sources = new Set<Subscribable>()\n private _cleanup: (() => void) | undefined\n private _alive = true\n\n constructor(fn: () => void | (() => void)) {\n this._fn = fn\n this._run()\n }\n\n get alive(): boolean {\n return this._alive\n }\n\n stop(): void {\n if (!this._alive) return\n this._alive = false\n this._removeSubscriptions()\n if (this._cleanup) {\n this._cleanup()\n this._cleanup = undefined\n }\n }\n\n start(): void {\n if (this._alive) return\n this._alive = true\n this._run()\n }\n\n private _removeSubscriptions(): void {\n for (const src of this._sources) {\n src._subs.delete(this._run)\n }\n this._sources.clear()\n }\n\n private _run = (): void => {\n if (!this._alive) return\n this._removeSubscriptions()\n if (this._cleanup) {\n this._cleanup()\n this._cleanup = undefined\n }\n\n const prevTracker = activeTracker\n const prevSources = activeSources\n activeTracker = this._run\n activeSources = this._sources\n try {\n const result = this._fn()\n if (typeof result === 'function') {\n this._cleanup = result as () => void\n }\n } finally {\n activeTracker = prevTracker\n activeSources = prevSources\n }\n }\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n return new Signal(initial)\n}\n\nexport function computed<T>(fn: () => T): Computed<T> {\n return new Computed(fn)\n}\n\nexport function effect(fn: () => void | (() => void)): Effect {\n return new Effect(fn)\n}\n\nexport function untracked<T>(fn: () => T): T {\n const prevTracker = activeTracker\n const prevSources = activeSources\n activeTracker = null\n activeSources = null\n try {\n return fn()\n } finally {\n activeTracker = prevTracker\n activeSources = prevSources\n }\n}\n\nexport function batch<T>(fn: () => T): T {\n batchDepth++\n try {\n return fn()\n } finally {\n batchDepth--\n if (batchDepth === 0) {\n flushPending()\n }\n }\n}\n\nexport function isSignal(val: unknown): val is Signal<unknown> {\n return val instanceof Signal\n}\n\nexport function isComputed(val: unknown): val is Computed<unknown> {\n return val instanceof Computed\n}\n\nexport function toSignal<T>(value: T | Signal<T>): Signal<T> {\n if (value instanceof Signal) return value\n return signal(value)\n}\n\nexport function mergeSignals<T extends Record<string, Signal<unknown>>>(signals: T): Signal<{ [K in keyof T]: T[K] extends Signal<infer V> ? V : never }> {\n return computed(() => {\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(signals)) {\n result[key] = (signals as Record<string, Signal<unknown>>)[key]!.value\n }\n return result as { [K in keyof T]: T[K] extends Signal<infer V> ? V : never }\n }) as unknown as Signal<{ [K in keyof T]: T[K] extends Signal<infer V> ? V : never }>\n}\n\nexport { type Subscribable }\r\n","import { Signal, Computed } from '../signals/index.js'\r\nimport type { signal, computed, effect } from '../signals/index.js'\n\nexport type VNode = VElement | VText | VFragment | VComponent | VSignalNode\n\nexport interface VElement {\n type: 'element'\n tag: string\n props: Record<string, any>\n children: VNode[]\n key?: string\n}\n\nexport interface VText {\n type: 'text'\n text: string\n}\n\nexport interface VFragment {\n type: 'fragment'\n children: VNode[]\n}\n\nexport interface VComponent {\n type: 'component'\n component: Component\n props: Record<string, any>\n children?: VNode[]\n}\n\nexport interface VSignalNode {\n type: 'signal'\n signal: Signal<VNode>\n}\n\nexport interface Component {\n (props: Record<string, any>, context?: ComponentContext): VNode | Promise<VNode>\n}\n\nexport interface ComponentContext {\n signal: typeof signal\n computed: typeof computed\n effect: typeof effect\n props: Record<string, any>\n children?: VNode[]\n}\n\nconst VOID_ELEMENTS = new Set([\n 'area','base','br','col','embed','hr','img','input','link','meta',\n 'param','source','track','wbr',\n])\n\nconst SVG_ELEMENTS = new Set([\n 'svg','path','circle','rect','g','text','line','polyline','polygon',\n 'ellipse','use','defs','clipPath','mask','linearGradient','radialGradient',\n 'stop','tspan','textPath','image','foreignObject','marker','pattern',\n 'symbol','filter','feBlend','feColorMatrix','feComponentTransfer',\n 'feComposite','feDropShadow','feFlood','feGaussianBlur','feMerge',\n 'feOffset','feImage','feTile','feTurbulence',\n])\n\nfunction isSignal(val: unknown): val is Signal<any> {\n return val instanceof Signal\n}\n\nfunction isComputed(val: unknown): val is Computed<any> {\n return val instanceof Computed\n}\n\nexport function normalizeChild(child: any): VNode | null {\n if (child == null || typeof child === 'boolean') return null\n if (isSignal(child) || isComputed(child)) {\n return { type: 'signal', signal: child as unknown as Signal<VNode> }\n }\n if (typeof child === 'string' || typeof child === 'number') {\n return { type: 'text', text: String(child) }\n }\n if (Array.isArray(child)) {\n const children = child.flat(Infinity).map(normalizeChild).filter(Boolean) as VNode[]\r\n if (children.length === 0) return null\r\n if (children.length === 1) return children[0] as VNode\n return { type: 'fragment', children }\n }\n if (typeof child === 'object' && child !== null && 'type' in child) {\n return child as VNode\n }\n if (typeof child === 'function') {\n return { type: 'component', component: child as Component, props: {} }\n }\n return { type: 'text', text: String(child) }\n}\n\nexport function h(tag: string | Component, props?: any, ...children: any[]): VNode {\n if (typeof tag === 'function') {\n const c = children.flat(Infinity).map(normalizeChild).filter(Boolean) as VNode[]\n return {\n type: 'component',\n component: tag as Component,\n props: { ...(props || {}), children: c.length > 0 ? c : undefined },\n }\n }\n return {\n type: 'element',\n tag,\n props: props || {},\n children: children.flat(Infinity).map(normalizeChild).filter(Boolean) as VNode[],\n key: props?.key,\n }\n}\n\nexport function fragment(...children: any[]): VNode {\n const flat = children.flat(Infinity)\n const normalized = flat.map(normalizeChild).filter(Boolean) as VNode[]\n if (normalized.length === 0) return { type: 'text', text: '' }\n if (normalized.length === 1) return normalized[0]!\n return { type: 'fragment', children: normalized }\n}\n\nexport function text(content: string): VText {\n return { type: 'text', text: content }\n}\n\nexport function createComponent(type: Component, props?: any, ...children: any[]): VComponent {\n const c = children.flat(Infinity).map(normalizeChild).filter(Boolean) as VNode[]\n return {\n type: 'component',\n component: type,\n props: { ...(props || {}), children: c.length > 0 ? c : undefined },\n }\n}\n\nfunction setProp(el: Element, key: string, value: any, oldValue?: any): void {\r\n if (key === 'key' || key === 'children' || key === 'ref') return\r\n if (isComputed(value)) {\r\n setProp(el, key, value.peek(), oldValue)\r\n value.subscribe((v: any) => setProp(el, key, v))\r\n return\r\n }\r\n if (key.startsWith('on') && typeof value === 'function') {\n const event = key.slice(2).toLowerCase()\n if (oldValue) el.removeEventListener(event, oldValue)\n el.addEventListener(event, value)\n return\n }\n if (key === 'style') {\n if (typeof value === 'string') {\n el.setAttribute('style', value)\n } else if (typeof value === 'object' && value !== null) {\n Object.assign((el as HTMLElement).style, value)\n }\n return\n }\n if (key === 'class' || key === 'className') {\n if (typeof value === 'string') {\n el.setAttribute('class', value)\n } else if (Array.isArray(value)) {\n el.setAttribute('class', value.filter(Boolean).join(' '))\n }\n return\n }\n if (key === 'dangerouslySetInnerHTML' && typeof value === 'object' && value?.__html) {\n el.innerHTML = value.__html\n return\n }\n if (key === 'value' || key === 'checked' || key === 'disabled' || key === 'selected') {\n (el as any)[key] = value\n return\n }\n if (key === 'htmlFor') {\n el.setAttribute('for', value)\n return\n }\n if (value === false || value === null || value === undefined) {\n el.removeAttribute(key)\n } else if (value === true) {\n el.setAttribute(key, '')\n } else {\n el.setAttribute(key, String(value))\n }\n}\n\nfunction removeProp(el: Element, key: string, value: any): void {\n if (key === 'key' || key === 'children' || key === 'ref') return\n if (key.startsWith('on') && typeof value === 'function') {\n el.removeEventListener(key.slice(2).toLowerCase(), value)\n return\n }\n if (key === 'style') { el.removeAttribute('style'); return }\n if (key === 'class' || key === 'className') { el.removeAttribute('class'); return }\n if (key === 'value' || key === 'checked' || key === 'disabled') { delete (el as any)[key]; return }\n el.removeAttribute(key)\n}\n\nfunction createDOM(vnode: VNode): Node {\n switch (vnode.type) {\n case 'element': {\n const isSVG = SVG_ELEMENTS.has(vnode.tag)\n const el = isSVG\n ? document.createElementNS('http://www.w3.org/2000/svg', vnode.tag)\n : document.createElement(vnode.tag)\n for (const [key, value] of Object.entries(vnode.props)) {\n if (key !== 'key') setProp(el, key, value)\n }\n for (const child of vnode.children) {\n el.appendChild(createDOM(child))\n }\n return el\n }\n case 'text':\n return document.createTextNode(vnode.text)\n case 'fragment': {\n const frag = document.createDocumentFragment()\n for (const child of vnode.children) frag.appendChild(createDOM(child))\n return frag\n }\n case 'component': {\n const result = vnode.component(vnode.props)\n if (result instanceof Promise) {\n const placeholder = document.createComment(' async ')\n result.then((resolved) => {\n const node = createDOM(resolved)\n placeholder.parentNode?.replaceChild(node, placeholder)\n })\n return placeholder\n }\n return createDOM(result)\n }\n case 'signal': {\n const val = vnode.signal.value\n const v = normalizeChild(val)\n const node = createDOM(v ?? text(''))\n vnode.signal.subscribe((newVal: any) => {\n const newV = normalizeChild(newVal)\n if (newV && node.parentNode) {\n const newNode = createDOM(newV)\n node.parentNode.replaceChild(newNode, node)\n }\n })\n return node\n }\n }\n}\n\nexport function render(vnode: VNode, container: HTMLElement): void {\n container.innerHTML = ''\n container.appendChild(createDOM(vnode))\n}\n\nfunction isSameVNodeType(a: VNode, b: VNode): boolean {\n if (a.type !== b.type) return false\n if (a.type === 'element' && b.type === 'element') {\n return a.tag === b.tag && a.key === b.key\n }\n return true\n}\n\nfunction patchProps(el: Element, oldProps: Record<string, any>, newProps: Record<string, any>): void {\n const allKeys = new Set([...Object.keys(oldProps), ...Object.keys(newProps)])\n for (const key of allKeys) {\n if (key === 'key' || key === 'children') continue\n const oldVal = oldProps[key]\n const newVal = newProps[key]\n if (oldVal === newVal) continue\n if (newVal === undefined || newVal === null) {\n removeProp(el, key, oldVal)\n } else {\n setProp(el, key, newVal, oldVal)\n }\n }\n}\n\nfunction patchChildren(parent: Node, oldChildren: VNode[], newChildren: VNode[]): void {\n const maxLen = Math.max(oldChildren.length, newChildren.length)\n for (let i = 0; i < maxLen; i++) {\n const oldChild = oldChildren[i]\n const newChild = newChildren[i]\n const existingNode = parent.childNodes[i]\n if (!oldChild && newChild) {\n parent.appendChild(createDOM(newChild))\n } else if (oldChild && !newChild) {\n if (existingNode) parent.removeChild(existingNode)\n } else if (oldChild && newChild) {\r\n if (isSameVNodeType(oldChild, newChild)) {\r\n patchVNode(existingNode ?? null, oldChild, newChild)\r\n } else {\r\n const newNode = createDOM(newChild)\r\n parent.replaceChild(newNode, existingNode!)\n }\r\n }\r\n }\r\n}\r\n\r\nfunction patchVNode(dom: Node | null, oldVNode: VNode, newVNode: VNode): void {\n if (!dom) return\n if (oldVNode.type === 'element' && newVNode.type === 'element') {\n patchProps(dom as HTMLElement, oldVNode.props, newVNode.props)\n patchChildren(dom, oldVNode.children, newVNode.children)\n } else if (oldVNode.type === 'text' && newVNode.type === 'text') {\n if (oldVNode.text !== newVNode.text) {\n (dom as Text).textContent = newVNode.text\n }\n } else if (oldVNode.type === 'fragment' && newVNode.type === 'fragment') {\n patchChildren(dom.parentNode || dom, oldVNode.children, newVNode.children)\n }\n}\n\nexport function patch(dom: HTMLElement, oldVNode: VNode, newVNode: VNode): void {\n if (isSameVNodeType(oldVNode, newVNode)) {\n patchVNode(dom, oldVNode, newVNode)\n } else {\n const parent = dom.parentNode\n if (parent) {\n parent.replaceChild(createDOM(newVNode), dom)\n }\n }\n}\n\nexport function hydrate(vnode: VNode, container: HTMLElement): void {\n function hydrateNode(vn: VNode, node: Node): void {\n if (vn.type === 'element') {\n const el = node as HTMLElement\n for (const [key, value] of Object.entries(vn.props)) {\n if (key.startsWith('on') && typeof value === 'function') {\n el.addEventListener(key.slice(2).toLowerCase(), value)\n }\n }\n for (let i = 0; i < Math.min(vn.children.length, el.childNodes.length); i++) {\n hydrateNode(vn.children[i]!, el.childNodes[i]!)\n }\n } else if (vn.type === 'component') {\n const result = vn.component(vn.props)\n if (!(result instanceof Promise)) hydrateNode(result, node)\n } else if (vn.type === 'signal') {\n vn.signal.subscribe((newVal: any) => {\n const newChild = normalizeChild(newVal)\n if (newChild && node.parentNode) {\n node.parentNode.replaceChild(createDOM(newChild), node)\n }\n })\n }\n }\n if (container.firstChild) {\n hydrateNode(vnode, container.firstChild)\n } else {\n render(vnode, container)\n }\n}\n\nconst ESCAPE_MAP: Record<string, string> = {\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;',\n}\n\nfunction escapeHtml(str: string): string {\n return str.replace(/[&<>\"']/g, (c) => ESCAPE_MAP[c] || c)\n}\n\nfunction renderProps(props: Record<string, any>): string {\n let out = ''\n for (const [key, value] of Object.entries(props)) {\n if (key === 'key' || key === 'children' || key === 'ref') continue\n if (key.startsWith('on')) continue\n if (value === false || value === null || value === undefined) continue\n if (key === 'style' && typeof value === 'object') {\n const styleStr = Object.entries(value)\n .map(([k, v]) => `${k.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase())}:${v}`)\n .join(';')\n out += ' style=\"' + escapeHtml(styleStr) + '\"'\n continue\n }\n if (key === 'class' || key === 'className') {\n const cls = Array.isArray(value) ? value.filter(Boolean).join(' ') : value\n out += ' class=\"' + escapeHtml(String(cls)) + '\"'\n continue\n }\n if (key === 'htmlFor') { out += ' for=\"' + escapeHtml(String(value)) + '\"'; continue }\n if (value === true) { out += ' ' + key }\n else { out += ' ' + key + '=\"' + escapeHtml(String(value)) + '\"' }\n }\n return out\n}\n\nfunction renderVNodeToString(vnode: VNode): string {\n switch (vnode.type) {\n case 'element': {\n const children = vnode.children.map(renderVNodeToString).join('')\n if (VOID_ELEMENTS.has(vnode.tag)) return '<' + vnode.tag + renderProps(vnode.props) + '>'\n return '<' + vnode.tag + renderProps(vnode.props) + '>' + children + '</' + vnode.tag + '>'\n }\n case 'text': return escapeHtml(vnode.text)\n case 'fragment': return vnode.children.map(renderVNodeToString).join('')\n case 'component': {\n const result = vnode.component(vnode.props)\n if (result instanceof Promise) throw new Error('Async components must use renderToStream or ServerRenderer')\n return renderVNodeToString(result)\n }\n case 'signal': return renderVNodeToString(normalizeChild(vnode.signal.value) ?? text(''))\n }\n}\n\nexport function renderToString(vnode: VNode): string {\n return renderVNodeToString(vnode)\n}\n\nexport function renderToStream(vnode: VNode): ReadableStream<string> {\n return new ReadableStream({\n start(controller) {\n const html = renderToString(vnode)\n controller.enqueue(html)\n controller.close()\n },\n })\n}\r\n","import type { VNode, VElement, VText, VFragment, VComponent, Component } from './index.js'\n\nconst emptyText = (): VText => ({ type: 'text' as const, text: '' })\n\nexport function createElement(tag: any, props: any, ...children: any[]): VNode {\n const { isSVG, ...rest } = props || {}\n if (typeof tag === 'function') {\n const childArr = children.flat(Infinity)\n const result: VComponent = {\n type: 'component' as const,\n component: tag as Component,\n props: { ...rest, children: childArr.length > 0 ? childArr : undefined },\n }\n return result\n }\n const childNodes: VNode[] = children.flat(Infinity).map((c: any): VNode => {\n if (c == null || typeof c === 'boolean') return emptyText()\n if (typeof c === 'object' && c !== null && 'type' in c) return c as VNode\n return { type: 'text' as const, text: String(c) }\n })\n const result: VElement = {\n type: 'element' as const,\n tag: tag as string,\n props: rest || {},\n children: childNodes,\n }\n return result\n}\n\nexport function Fragment(props: { children?: any }): VNode {\n const children = props?.children\n if (!children) return emptyText()\n const arr = Array.isArray(children) ? children : [children]\n const flat = arr.flat(Infinity).map((c: any): VNode => {\n if (c == null || typeof c === 'boolean') return emptyText()\n if (typeof c === 'object' && c !== null && 'type' in c) return c as VNode\n return { type: 'text' as const, text: String(c) }\n })\n if (flat.length === 1) return flat[0]!\n const result: VFragment = { type: 'fragment' as const, children: flat }\n return result\n}\n","import type { VNode, Component } from '../vdom/index.js'\nimport { renderToString, renderToStream } from '../vdom/index.js'\n\nexport class ServerRenderer {\n render(component: Component, props?: any): Promise<string> {\n const vnode: VNode = {\n type: 'component',\n component,\n props: props || {},\n }\n return Promise.resolve(renderToString(vnode))\n }\n\n renderToStream(component: Component, props?: any): ReadableStream<string> {\n const vnode: VNode = {\n type: 'component',\n component,\n props: props || {},\n }\n return renderToStream(vnode)\n }\n\n renderStatic(component: Component, props?: any): string {\n const vnode: VNode = {\n type: 'component',\n component,\n props: props || {},\n }\n return renderToString(vnode)\n }\n\n async renderServerComponent(path: string, props?: any): Promise<string> {\r\n const mod = await import(path)\r\n const compKey = Object.keys(mod).find((k) => typeof mod[k] === 'function')\r\n if (!compKey) throw new Error(`No component export found in ${path}`)\r\n const component = mod[compKey] as Component\r\n const result = component(props || {})\r\n const resolved = result instanceof Promise ? await result : result\r\n return renderToString(resolved)\r\n }\n}\n\nexport function generateHydrationScript(): string {\n return '<script>(function(){var d=document.createElement(\"div\");d.setAttribute(\"data-speedx-hydrated\",\"\");document.body.appendChild(d)})();</script>'\n}\r\n","export interface FrameworkAdapter {\n name: string\n render(component: any, container: HTMLElement): void\n hydrate(component: any, container: HTMLElement): void\n renderToString(component: any): string\n}\n\nexport function defineAdapter(adapter: FrameworkAdapter): FrameworkAdapter {\n return adapter\n}\r\n","import { signal, computed, Signal } from './signals/index.js'\nimport type { VNode, Component } from './vdom/index.js'\n\nexport interface RouteDefinition {\n path: string\n component: Component\n layout?: Component\n loading?: Component\n error?: Component\n guards?: RouteGuard[]\n}\n\nexport type RouteGuard = (to: string, from: string) => boolean | Promise<boolean>\n\nexport interface RouterOptions {\n basePath?: string\n mode?: 'history' | 'hash'\n scrollRestoration?: boolean\n}\n\ninterface RouteMatch {\n path: string\n pattern: string\n component: Component\n layout?: Component\n loading?: Component\n error?: Component\n params: Record<string, string>\n query: Record<string, string>\n}\n\nfunction parseQuery(search: string): Record<string, string> {\n const params: Record<string, string> = {}\n const qs = search.startsWith('?') ? search.slice(1) : search\n if (!qs) return params\n for (const part of qs.split('&')) {\n const [key, val] = part.split('=')\n if (key) params[decodeURIComponent(key)] = val ? decodeURIComponent(val) : ''\n }\n return params\n}\n\nfunction matchPath(routePath: string, urlPath: string): Record<string, string> | null {\n const routeParts = routePath.split('/')\n const urlParts = urlPath.split('/')\n if (routeParts.length !== urlParts.length) return null\n const params: Record<string, string> = {}\n for (let i = 0; i < routeParts.length; i++) {\n const rp = routeParts[i]!\n const up = urlParts[i]!\n if (rp.startsWith(':')) {\n params[rp.slice(1)] = decodeURIComponent(up)\n } else if (rp !== up) {\n return null\n }\n }\n return params\n}\n\nexport class ClientRouter {\n private _current: Signal<RouteMatch | null>\n private _params: Signal<Record<string, string>>\n private _query: Signal<Record<string, string>>\n private _history: string[] = []\n private _historyIndex = -1\n private _routes: RouteDefinition[]\n private _options: Required<RouterOptions>\n\n constructor(routes: RouteDefinition[], options?: RouterOptions) {\n this._routes = routes\n this._options = {\n basePath: options?.basePath ?? '',\n mode: options?.mode ?? 'history',\n scrollRestoration: options?.scrollRestoration ?? true,\n }\n\n const initialMatch = this._resolveRoute(this._getCurrentPath())\n this._current = signal<RouteMatch | null>(initialMatch)\n this._params = signal<Record<string, string>>(initialMatch?.params ?? {})\n this._query = signal<Record<string, string>>(parseQuery(window.location.search))\n\n if (this._options.scrollRestoration) {\n history.scrollRestoration = 'auto'\n }\n\n window.addEventListener('popstate', () => {\n const path = this._getCurrentPath()\n const match = this._resolveRoute(path)\n this._current.value = match\n this._params.value = match?.params ?? {}\n this._query.value = parseQuery(window.location.search)\n })\n }\n\n get current(): Signal<RouteMatch | null> {\n return this._current\n }\n\n get params(): Signal<Record<string, string>> {\n return this._params\n }\n\n get query(): Signal<Record<string, string>> {\n return this._query\n }\n\n private _getCurrentPath(): string {\n if (this._options.mode === 'hash') {\n const hash = window.location.hash.slice(1) || '/'\n return hash\n }\n let path = window.location.pathname\n if (this._options.basePath && path.startsWith(this._options.basePath)) {\n path = path.slice(this._options.basePath.length) || '/'\n }\n return path\n }\n\n private _resolveRoute(path: string): RouteMatch | null {\n for (const route of this._routes) {\n const params = matchPath(route.path, path)\n if (params !== null) {\n return {\n path,\n pattern: route.path,\n component: route.component,\n layout: route.layout,\n loading: route.loading,\n error: route.error,\n params,\n query: parseQuery(window.location.search),\n }\n }\n }\n return null\n }\n\n async navigate(path: string): Promise<void> {\n const from = this._getCurrentPath()\n const to = path\n\n const route = this._routes.find((r) => matchPath(r.path, to) !== null)\n if (route?.guards) {\n for (const guard of route.guards) {\n const allowed = await guard(to, from)\n if (!allowed) throw new Error(`Navigation guard blocked: ${from} -> ${to}`)\n }\n }\n\n const resolvedPath = this._options.basePath\n ? this._options.basePath + to\n : to\n\n if (this._options.mode === 'hash') {\n window.location.hash = to\n } else {\n history.pushState(null, '', resolvedPath)\n }\n\n if (this._historyIndex < this._history.length - 1) {\n this._history = this._history.slice(0, this._historyIndex + 1)\n }\n this._history.push(to)\n this._historyIndex++\n\n const match = this._resolveRoute(to)\n this._current.value = match\n this._params.value = match?.params ?? {}\n this._query.value = parseQuery(window.location.search)\n }\n\n back(): void {\n if (this._historyIndex > 0) {\n this._historyIndex--\n const path = this._history[this._historyIndex]!\n if (this._options.mode === 'hash') {\n window.location.hash = path\n } else {\n history.back()\n }\n }\n }\n\n forward(): void {\n if (this._historyIndex < this._history.length - 1) {\n this._historyIndex++\n const path = this._history[this._historyIndex]!\n if (this._options.mode === 'hash') {\n window.location.hash = path\n } else {\n history.forward()\n }\n }\n }\n\n link(props: { to: string; children: any; class?: string; activeClass?: string; onClick?: (e: MouseEvent) => void }): VNode {\r\n const isActive = computed(() => {\r\n const current = this._current.value\r\n return current?.path === props.to\r\n })\r\n\r\n const handleClick = (e: MouseEvent) => {\r\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.button === 1) return\r\n e.preventDefault()\r\n props.onClick?.(e)\r\n this.navigate(props.to)\r\n }\r\n\r\n const { children, to, activeClass, ...rest } = props\r\n const cls = computed(() => {\r\n const base = rest.class || ''\r\n const active = activeClass && isActive.value ? ` ${activeClass}` : ''\r\n return `${base}${active}`\r\n })\r\n\r\n const childNodes = (Array.isArray(children) ? children : [children]).flat(Infinity).map((c: any) => {\r\n if (c == null || typeof c === 'boolean') return { type: 'text', text: '' } as VNode\r\n if (typeof c === 'object' && 'type' in c) return c as VNode\r\n return { type: 'text', text: String(c) } as VNode\r\n })\r\n\r\n return {\r\n type: 'element',\r\n tag: 'a',\r\n props: { href: this._options.basePath + to, onClick: handleClick, class: cls },\r\n children: childNodes,\r\n }\r\n }\n}\r\n\r\n"],"mappings":"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","names":["isSignal","isComputed","result"]}
@@ -0,0 +1,62 @@
1
+ interface Subscribable {
2
+ _subs: Set<() => void>;
3
+ }
4
+ declare class Signal<T> {
5
+ readonly _tag: "signal";
6
+ _subs: Set<() => void>;
7
+ private _value;
8
+ constructor(value: T);
9
+ get value(): T;
10
+ set value(val: T);
11
+ peek(): T;
12
+ set(v: T): void;
13
+ update(fn: (v: T) => T): void;
14
+ subscribe(fn: (val: T) => void): () => void;
15
+ toJSON(): T;
16
+ toString(): string;
17
+ valueOf(): T;
18
+ [Symbol.iterator](): Iterator<T>;
19
+ private _notify;
20
+ }
21
+ declare class Computed<T> {
22
+ readonly _tag: "computed";
23
+ _subs: Set<() => void>;
24
+ private _fn;
25
+ private _value;
26
+ private _dirty;
27
+ private _sources;
28
+ private _onDepChange;
29
+ constructor(fn: () => T);
30
+ get value(): T;
31
+ peek(): T;
32
+ subscribe(fn: (val: T) => void): () => void;
33
+ toJSON(): T;
34
+ toString(): string;
35
+ valueOf(): T;
36
+ private _eval;
37
+ }
38
+ declare class Effect {
39
+ private _fn;
40
+ private _sources;
41
+ private _cleanup;
42
+ private _alive;
43
+ constructor(fn: () => void | (() => void));
44
+ get alive(): boolean;
45
+ stop(): void;
46
+ start(): void;
47
+ private _removeSubscriptions;
48
+ private _run;
49
+ }
50
+ declare function signal<T>(initial: T): Signal<T>;
51
+ declare function computed<T>(fn: () => T): Computed<T>;
52
+ declare function effect(fn: () => void | (() => void)): Effect;
53
+ declare function untracked<T>(fn: () => T): T;
54
+ declare function batch<T>(fn: () => T): T;
55
+ declare function isSignal(val: unknown): val is Signal<unknown>;
56
+ declare function isComputed(val: unknown): val is Computed<unknown>;
57
+ declare function toSignal<T>(value: T | Signal<T>): Signal<T>;
58
+ declare function mergeSignals<T extends Record<string, Signal<unknown>>>(signals: T): Signal<{
59
+ [K in keyof T]: T[K] extends Signal<infer V> ? V : never;
60
+ }>;
61
+
62
+ export { Computed, Effect, Signal, type Subscribable, batch, computed, effect, isComputed, isSignal, mergeSignals, signal, toSignal, untracked };
@@ -0,0 +1,248 @@
1
+ // src/client/signals/index.ts
2
+ var activeTracker = null;
3
+ var activeSources = null;
4
+ var batchDepth = 0;
5
+ var pendingUpdates = /* @__PURE__ */ new Set();
6
+ function flushPending() {
7
+ const fns = [...pendingUpdates];
8
+ pendingUpdates.clear();
9
+ for (const fn of fns) fn();
10
+ }
11
+ function trackSource(node) {
12
+ if (activeSources) activeSources.add(node);
13
+ if (activeTracker) node._subs.add(activeTracker);
14
+ }
15
+ var Signal = class {
16
+ _tag = "signal";
17
+ _subs = /* @__PURE__ */ new Set();
18
+ _value;
19
+ constructor(value) {
20
+ this._value = value;
21
+ }
22
+ get value() {
23
+ trackSource(this);
24
+ return this._value;
25
+ }
26
+ set value(val) {
27
+ if (val !== this._value) {
28
+ this._value = val;
29
+ this._notify();
30
+ }
31
+ }
32
+ peek() {
33
+ return this._value;
34
+ }
35
+ set(v) {
36
+ this.value = v;
37
+ }
38
+ update(fn) {
39
+ this.value = fn(this._value);
40
+ }
41
+ subscribe(fn) {
42
+ const cb = () => fn(this._value);
43
+ this._subs.add(cb);
44
+ return () => this._subs.delete(cb);
45
+ }
46
+ toJSON() {
47
+ return this._value;
48
+ }
49
+ toString() {
50
+ return String(this._value);
51
+ }
52
+ valueOf() {
53
+ return this._value;
54
+ }
55
+ *[Symbol.iterator]() {
56
+ yield this._value;
57
+ }
58
+ _notify() {
59
+ if (batchDepth > 0) {
60
+ for (const s of this._subs) pendingUpdates.add(s);
61
+ } else {
62
+ const subs = [...this._subs];
63
+ for (const s of subs) s();
64
+ }
65
+ }
66
+ };
67
+ var Computed = class {
68
+ _tag = "computed";
69
+ _subs = /* @__PURE__ */ new Set();
70
+ _fn;
71
+ _value;
72
+ _dirty = true;
73
+ _sources = /* @__PURE__ */ new Set();
74
+ _onDepChange = () => {
75
+ if (!this._dirty) {
76
+ this._dirty = true;
77
+ for (const s of [...this._subs]) s();
78
+ }
79
+ };
80
+ constructor(fn) {
81
+ this._fn = fn;
82
+ }
83
+ get value() {
84
+ trackSource(this);
85
+ if (this._dirty) this._eval();
86
+ return this._value;
87
+ }
88
+ peek() {
89
+ if (this._dirty) this._eval();
90
+ return this._value;
91
+ }
92
+ subscribe(fn) {
93
+ this.value;
94
+ const cb = () => fn(this._value);
95
+ this._subs.add(cb);
96
+ return () => this._subs.delete(cb);
97
+ }
98
+ toJSON() {
99
+ return this.value;
100
+ }
101
+ toString() {
102
+ return String(this.value);
103
+ }
104
+ valueOf() {
105
+ return this.value;
106
+ }
107
+ _eval() {
108
+ for (const src of this._sources) {
109
+ src._subs.delete(this._onDepChange);
110
+ }
111
+ this._sources.clear();
112
+ this._dirty = false;
113
+ const prevSources = activeSources;
114
+ const prevTracker = activeTracker;
115
+ activeSources = /* @__PURE__ */ new Set();
116
+ activeTracker = null;
117
+ try {
118
+ this._value = this._fn();
119
+ this._sources = activeSources;
120
+ } finally {
121
+ activeSources = prevSources;
122
+ activeTracker = prevTracker;
123
+ }
124
+ for (const src of this._sources) {
125
+ src._subs.add(this._onDepChange);
126
+ }
127
+ }
128
+ };
129
+ var Effect = class {
130
+ _fn;
131
+ _sources = /* @__PURE__ */ new Set();
132
+ _cleanup;
133
+ _alive = true;
134
+ constructor(fn) {
135
+ this._fn = fn;
136
+ this._run();
137
+ }
138
+ get alive() {
139
+ return this._alive;
140
+ }
141
+ stop() {
142
+ if (!this._alive) return;
143
+ this._alive = false;
144
+ this._removeSubscriptions();
145
+ if (this._cleanup) {
146
+ this._cleanup();
147
+ this._cleanup = void 0;
148
+ }
149
+ }
150
+ start() {
151
+ if (this._alive) return;
152
+ this._alive = true;
153
+ this._run();
154
+ }
155
+ _removeSubscriptions() {
156
+ for (const src of this._sources) {
157
+ src._subs.delete(this._run);
158
+ }
159
+ this._sources.clear();
160
+ }
161
+ _run = () => {
162
+ if (!this._alive) return;
163
+ this._removeSubscriptions();
164
+ if (this._cleanup) {
165
+ this._cleanup();
166
+ this._cleanup = void 0;
167
+ }
168
+ const prevTracker = activeTracker;
169
+ const prevSources = activeSources;
170
+ activeTracker = this._run;
171
+ activeSources = this._sources;
172
+ try {
173
+ const result = this._fn();
174
+ if (typeof result === "function") {
175
+ this._cleanup = result;
176
+ }
177
+ } finally {
178
+ activeTracker = prevTracker;
179
+ activeSources = prevSources;
180
+ }
181
+ };
182
+ };
183
+ function signal(initial) {
184
+ return new Signal(initial);
185
+ }
186
+ function computed(fn) {
187
+ return new Computed(fn);
188
+ }
189
+ function effect(fn) {
190
+ return new Effect(fn);
191
+ }
192
+ function untracked(fn) {
193
+ const prevTracker = activeTracker;
194
+ const prevSources = activeSources;
195
+ activeTracker = null;
196
+ activeSources = null;
197
+ try {
198
+ return fn();
199
+ } finally {
200
+ activeTracker = prevTracker;
201
+ activeSources = prevSources;
202
+ }
203
+ }
204
+ function batch(fn) {
205
+ batchDepth++;
206
+ try {
207
+ return fn();
208
+ } finally {
209
+ batchDepth--;
210
+ if (batchDepth === 0) {
211
+ flushPending();
212
+ }
213
+ }
214
+ }
215
+ function isSignal(val) {
216
+ return val instanceof Signal;
217
+ }
218
+ function isComputed(val) {
219
+ return val instanceof Computed;
220
+ }
221
+ function toSignal(value) {
222
+ if (value instanceof Signal) return value;
223
+ return signal(value);
224
+ }
225
+ function mergeSignals(signals) {
226
+ return computed(() => {
227
+ const result = {};
228
+ for (const key of Object.keys(signals)) {
229
+ result[key] = signals[key].value;
230
+ }
231
+ return result;
232
+ });
233
+ }
234
+ export {
235
+ Computed,
236
+ Effect,
237
+ Signal,
238
+ batch,
239
+ computed,
240
+ effect,
241
+ isComputed,
242
+ isSignal,
243
+ mergeSignals,
244
+ signal,
245
+ toSignal,
246
+ untracked
247
+ };
248
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/client/signals/index.ts"],"sourcesContent":["let activeTracker: (() => void) | null = null\nlet activeSources: Set<Subscribable> | null = null\nlet batchDepth = 0\nconst pendingUpdates = new Set<() => void>()\n\ninterface Subscribable {\n _subs: Set<() => void>\n}\n\nfunction flushPending(): void {\n const fns = [...pendingUpdates]\n pendingUpdates.clear()\n for (const fn of fns) fn()\n}\n\nfunction trackSource(node: Subscribable): void {\n if (activeSources) activeSources.add(node)\n if (activeTracker) node._subs.add(activeTracker)\n}\n\nexport class Signal<T> {\n readonly _tag = 'signal' as const\n _subs = new Set<() => void>()\n private _value: T\n\n constructor(value: T) {\n this._value = value\n }\n\n get value(): T {\n trackSource(this)\n return this._value\n }\n\n set value(val: T) {\n if (val !== this._value) {\n this._value = val\n this._notify()\n }\n }\n\n peek(): T {\n return this._value\n }\n\n set(v: T): void {\n this.value = v\n }\n\n update(fn: (v: T) => T): void {\n this.value = fn(this._value)\n }\n\n subscribe(fn: (val: T) => void): () => void {\n const cb = () => fn(this._value)\n this._subs.add(cb)\n return () => this._subs.delete(cb)\n }\n\n toJSON(): T {\n return this._value\n }\n\n toString(): string {\n return String(this._value)\n }\n\n valueOf(): T {\n return this._value\n }\n\n *[Symbol.iterator](): Iterator<T> {\n yield this._value\n }\n\n private _notify(): void {\n if (batchDepth > 0) {\n for (const s of this._subs) pendingUpdates.add(s)\n } else {\n const subs = [...this._subs]\n for (const s of subs) s()\n }\n }\n}\n\nexport class Computed<T> {\n readonly _tag = 'computed' as const\n _subs = new Set<() => void>()\n private _fn: () => T\n private _value!: T\n private _dirty = true\n private _sources = new Set<Subscribable>()\n\n private _onDepChange = (): void => {\n if (!this._dirty) {\n this._dirty = true\n for (const s of [...this._subs]) s()\n }\n }\n\n constructor(fn: () => T) {\n this._fn = fn\n }\n\n get value(): T {\n trackSource(this)\n if (this._dirty) this._eval()\n return this._value\n }\n\n peek(): T {\n if (this._dirty) this._eval()\n return this._value\n }\n\n subscribe(fn: (val: T) => void): () => void {\n this.value\n const cb = () => fn(this._value)\n this._subs.add(cb)\n return () => this._subs.delete(cb)\n }\n\n toJSON(): T {\n return this.value\n }\n\n toString(): string {\n return String(this.value)\n }\n\n valueOf(): T {\n return this.value\n }\n\n private _eval(): void {\n for (const src of this._sources) {\n src._subs.delete(this._onDepChange)\n }\n this._sources.clear()\n this._dirty = false\n\n const prevSources = activeSources\n const prevTracker = activeTracker\n activeSources = new Set()\n activeTracker = null\n try {\n this._value = this._fn()\n this._sources = activeSources\n } finally {\n activeSources = prevSources\n activeTracker = prevTracker\n }\n\n for (const src of this._sources) {\n src._subs.add(this._onDepChange)\n }\n }\n}\n\nexport class Effect {\n private _fn: () => void | (() => void)\n private _sources = new Set<Subscribable>()\n private _cleanup: (() => void) | undefined\n private _alive = true\n\n constructor(fn: () => void | (() => void)) {\n this._fn = fn\n this._run()\n }\n\n get alive(): boolean {\n return this._alive\n }\n\n stop(): void {\n if (!this._alive) return\n this._alive = false\n this._removeSubscriptions()\n if (this._cleanup) {\n this._cleanup()\n this._cleanup = undefined\n }\n }\n\n start(): void {\n if (this._alive) return\n this._alive = true\n this._run()\n }\n\n private _removeSubscriptions(): void {\n for (const src of this._sources) {\n src._subs.delete(this._run)\n }\n this._sources.clear()\n }\n\n private _run = (): void => {\n if (!this._alive) return\n this._removeSubscriptions()\n if (this._cleanup) {\n this._cleanup()\n this._cleanup = undefined\n }\n\n const prevTracker = activeTracker\n const prevSources = activeSources\n activeTracker = this._run\n activeSources = this._sources\n try {\n const result = this._fn()\n if (typeof result === 'function') {\n this._cleanup = result as () => void\n }\n } finally {\n activeTracker = prevTracker\n activeSources = prevSources\n }\n }\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n return new Signal(initial)\n}\n\nexport function computed<T>(fn: () => T): Computed<T> {\n return new Computed(fn)\n}\n\nexport function effect(fn: () => void | (() => void)): Effect {\n return new Effect(fn)\n}\n\nexport function untracked<T>(fn: () => T): T {\n const prevTracker = activeTracker\n const prevSources = activeSources\n activeTracker = null\n activeSources = null\n try {\n return fn()\n } finally {\n activeTracker = prevTracker\n activeSources = prevSources\n }\n}\n\nexport function batch<T>(fn: () => T): T {\n batchDepth++\n try {\n return fn()\n } finally {\n batchDepth--\n if (batchDepth === 0) {\n flushPending()\n }\n }\n}\n\nexport function isSignal(val: unknown): val is Signal<unknown> {\n return val instanceof Signal\n}\n\nexport function isComputed(val: unknown): val is Computed<unknown> {\n return val instanceof Computed\n}\n\nexport function toSignal<T>(value: T | Signal<T>): Signal<T> {\n if (value instanceof Signal) return value\n return signal(value)\n}\n\nexport function mergeSignals<T extends Record<string, Signal<unknown>>>(signals: T): Signal<{ [K in keyof T]: T[K] extends Signal<infer V> ? V : never }> {\n return computed(() => {\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(signals)) {\n result[key] = (signals as Record<string, Signal<unknown>>)[key]!.value\n }\n return result as { [K in keyof T]: T[K] extends Signal<infer V> ? V : never }\n }) as unknown as Signal<{ [K in keyof T]: T[K] extends Signal<infer V> ? V : never }>\n}\n\nexport { type Subscribable }\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,50 @@
1
+ import { signal, computed, effect, Signal } from '../signals/index.js';
2
+
3
+ type VNode = VElement | VText | VFragment | VComponent | VSignalNode;
4
+ interface VElement {
5
+ type: 'element';
6
+ tag: string;
7
+ props: Record<string, any>;
8
+ children: VNode[];
9
+ key?: string;
10
+ }
11
+ interface VText {
12
+ type: 'text';
13
+ text: string;
14
+ }
15
+ interface VFragment {
16
+ type: 'fragment';
17
+ children: VNode[];
18
+ }
19
+ interface VComponent {
20
+ type: 'component';
21
+ component: Component;
22
+ props: Record<string, any>;
23
+ children?: VNode[];
24
+ }
25
+ interface VSignalNode {
26
+ type: 'signal';
27
+ signal: Signal<VNode>;
28
+ }
29
+ interface Component {
30
+ (props: Record<string, any>, context?: ComponentContext): VNode | Promise<VNode>;
31
+ }
32
+ interface ComponentContext {
33
+ signal: typeof signal;
34
+ computed: typeof computed;
35
+ effect: typeof effect;
36
+ props: Record<string, any>;
37
+ children?: VNode[];
38
+ }
39
+ declare function normalizeChild(child: any): VNode | null;
40
+ declare function h(tag: string | Component, props?: any, ...children: any[]): VNode;
41
+ declare function fragment(...children: any[]): VNode;
42
+ declare function text(content: string): VText;
43
+ declare function createComponent(type: Component, props?: any, ...children: any[]): VComponent;
44
+ declare function render(vnode: VNode, container: HTMLElement): void;
45
+ declare function patch(dom: HTMLElement, oldVNode: VNode, newVNode: VNode): void;
46
+ declare function hydrate(vnode: VNode, container: HTMLElement): void;
47
+ declare function renderToString(vnode: VNode): string;
48
+ declare function renderToStream(vnode: VNode): ReadableStream<string>;
49
+
50
+ export { type Component, type ComponentContext, type VComponent, type VElement, type VFragment, type VNode, type VSignalNode, type VText, createComponent, fragment, h, hydrate, normalizeChild, patch, render, renderToStream, renderToString, text };