pulse-ui-client 0.0.2 → 0.0.5

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.js.map CHANGED
@@ -1,16 +1,20 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/pulse.tsx", "../src/renderer.tsx", "../src/vdom.ts", "../src/serialize.ts", "../src/client.tsx", "../src/transport.ts", "../src/helpers.ts"],
3
+ "sources": ["../src/pulse.tsx", "../src/renderer.tsx", "../src/vdom.ts", "../src/serialize/extractor.ts", "../src/serialize/elements.ts", "../src/serialize/events.ts", "../src/serialize/flatted.ts", "../src/client.tsx", "../src/transport.ts", "../src/helpers.ts", "../src/serialize/clean.ts"],
4
4
  "sourcesContent": [
5
- "import React, {\n useEffect,\n useState,\n useMemo,\n createContext,\n useContext,\n type ComponentType,\n} from \"react\";\nimport { VDOMRenderer } from \"./renderer\";\nimport { PulseSocketIOClient } from \"./client\";\nimport type { VDOM, ComponentRegistry, RegistryEntry } from \"./vdom\";\nimport { useLocation, useParams, useNavigate } from \"react-router\";\nimport type { ServerErrorInfo } from \"./messages\";\nimport type { RouteInfo } from \"./helpers\";\n\n// =================================================================\n// Types\n// =================================================================\n\nexport interface PulseConfig {\n serverAddress: string;\n}\n\n// =================================================================\n// Context and Hooks\n// =================================================================\n\n// Context for the client, provided by PulseProvider\nconst PulseClientContext = createContext<PulseSocketIOClient | null>(null);\n\nexport const usePulseClient = () => {\n const client = useContext(PulseClientContext);\n if (!client) {\n throw new Error(\"usePulseClient must be used within a PulseProvider\");\n }\n return client;\n};\n\n// Context for rendering helpers, provided by PulseView\ninterface PulseRenderHelpers {\n getCallback: (key: string) => (...args: any[]) => void;\n getComponent: (key: string) => RegistryEntry;\n}\n\nconst PulseRenderContext = createContext<PulseRenderHelpers | null>(null);\n\nexport const usePulseRenderHelpers = () => {\n const context = useContext(PulseRenderContext);\n if (!context) {\n throw new Error(\n \"usePulseRenderHelpers must be used within a PulseRenderContext (provided by <PulseView>)\"\n );\n }\n return context;\n};\n\n// =================================================================\n// Provider\n// =================================================================\n\nexport interface PulseProviderProps {\n children: React.ReactNode;\n config: PulseConfig;\n}\n\nconst inBrowser = typeof window !== \"undefined\";\n\nexport function PulseProvider({ children, config }: PulseProviderProps) {\n const [connected, setConnected] = useState(true);\n const rrNavigate = useNavigate();\n\n const client = useMemo(\n () => new PulseSocketIOClient(`${config.serverAddress}`, rrNavigate),\n [config.serverAddress, rrNavigate]\n );\n\n useEffect(() => client.onConnectionChange(setConnected), [client]);\n\n useEffect(() => {\n if (inBrowser) {\n client.connect();\n return () => client.disconnect();\n }\n }, [client]);\n\n return (\n <PulseClientContext.Provider value={client}>\n {!connected && (\n <div\n style={{\n position: \"fixed\",\n bottom: \"20px\",\n right: \"20px\",\n backgroundColor: \"red\",\n color: \"white\",\n padding: \"10px\",\n borderRadius: \"5px\",\n zIndex: 1000,\n }}\n >\n Failed to connect to the server.\n </div>\n )}\n {children}\n </PulseClientContext.Provider>\n );\n}\n\n// =================================================================\n// View\n// =================================================================\n\nexport interface PulseViewProps {\n initialVDOM: VDOM;\n externalComponents: ComponentRegistry;\n path: string;\n}\n\nexport function PulseView({\n initialVDOM,\n externalComponents,\n path,\n}: PulseViewProps) {\n const client = usePulseClient();\n const [vdom, setVdom] = useState(initialVDOM);\n const [serverError, setServerError] = useState<ServerErrorInfo | null>(null);\n\n const location = useLocation();\n const params = useParams();\n\n const routeInfo = useMemo(() => {\n const { \"*\": catchall = \"\", ...pathParams } = params;\n const queryParams = new URLSearchParams(location.search);\n return {\n hash: location.hash,\n pathname: location.pathname,\n query: location.search,\n queryParams: Object.fromEntries(queryParams.entries()),\n pathParams,\n catchall: catchall.length > 0 ? catchall.split(\"/\") : [],\n } satisfies RouteInfo;\n }, [\n location.hash,\n location.pathname,\n location.search,\n JSON.stringify(params),\n ]);\n\n useEffect(() => {\n if (inBrowser) {\n client.mountView(path, {\n vdom: initialVDOM,\n listener: setVdom,\n routeInfo,\n });\n const offErr = client.onServerError((p, err) => {\n if (p === path) setServerError(err);\n });\n return () => {\n console.log(\"Unmounting\", path)\n offErr();\n client.unmount(path);\n };\n }\n // routeInfo is NOT included here on purpose\n }, [client]);\n\n useEffect(() => {\n if (inBrowser) {\n client.navigate(path, routeInfo);\n }\n }, [client, path, routeInfo]);\n\n const renderHelpers = useMemo(() => {\n const callbackCache = new Map<string, (...args: any[]) => void>();\n\n const getCallback = (key: string) => {\n let fn = callbackCache.get(key);\n if (!fn) {\n fn = (...args) => client.invokeCallback(path, key, args);\n callbackCache.set(key, fn);\n }\n return fn;\n };\n\n const getComponent = (key: string) => {\n const component = externalComponents[key];\n if (!component) {\n throw new Error(`Component with key \"${key}\" not found.`);\n }\n return component;\n };\n\n return { getCallback, getComponent };\n }, [client, externalComponents, path]);\n\n return (\n <PulseRenderContext.Provider value={renderHelpers}>\n {serverError ? (\n <ServerError error={serverError} />\n ) : (\n <VDOMRenderer node={vdom} />\n )}\n </PulseRenderContext.Provider>\n );\n}\n\nfunction ServerError({ error }: { error: ServerErrorInfo }) {\n return (\n <div\n style={{\n padding: 16,\n border: \"1px solid #e00\",\n background: \"#fff5f5\",\n color: \"#900\",\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n whiteSpace: \"pre-wrap\",\n }}\n >\n <div style={{ fontWeight: 700, marginBottom: 8 }}>\n Server Error during {error.phase}\n </div>\n {error.message && <div>{error.message}</div>}\n {error.stack && (\n <details open style={{ marginTop: 8 }}>\n <summary>Stack trace</summary>\n <pre style={{ margin: 0 }}>{error.stack}</pre>\n </details>\n )}\n </div>\n );\n}\n",
6
- "import React, {\n memo,\n Suspense,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n} from \"react\";\nimport type {\n VDOM,\n VDOMElement,\n VDOMNode,\n VDOMUpdate,\n ComponentRegistry,\n RegistryEntry,\n} from \"./vdom\";\nimport {\n isElementNode,\n isFragment,\n isMountPointNode,\n getMountPointComponentKey,\n MOUNT_POINT_PREFIX,\n FRAGMENT_TAG,\n} from \"./vdom\";\nimport { usePulseRenderHelpers } from \"./pulse\";\n\ninterface VDOMRendererProps {\n node: VDOMNode;\n}\n\n// Helper function to generate keys for React reconciliation\nfunction getNodeKey(node: VDOMNode, index: number): string | number {\n if (isElementNode(node)) {\n return node.key || index;\n }\n return index;\n}\n\nexport const VDOMRenderer = ({ node }: VDOMRendererProps) => {\n const { getCallback, getComponent } = usePulseRenderHelpers();\n\n // 1. Handle non-renderable cases first\n if (node === null || typeof node === \"boolean\" || node === undefined) {\n return null;\n }\n\n // 2. Handle primitive nodes\n if (typeof node === \"string\" || typeof node === \"number\") {\n return <>{node}</>;\n }\n\n // 3. Handle element nodes\n if (isElementNode(node)) {\n if (process.env.NODE_ENV !== \"production\") {\n const hasTag = \"tag\" in node && typeof node.tag === \"string\";\n if (!hasTag) {\n console.error(\"Invalid VDOM element node received:\", node);\n return null;\n }\n }\n\n const { tag, props = {}, children = [] } = node;\n\n // Process props for callbacks\n const processedProps: Record<string, any> = {};\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === \"string\" && value.startsWith(\"$$fn:\")) {\n const callbackKey = value.substring(\"$$fn:\".length);\n processedProps[key] = getCallback(callbackKey);\n } else {\n processedProps[key] = value;\n }\n }\n\n if (isMountPointNode(node)) {\n const componentKey = getMountPointComponentKey(node);\n const Component = getComponent(componentKey);\n const renderedChildren = children.map((child, index) => (\n <VDOMRenderer key={getNodeKey(child, index)} node={child} />\n ));\n return <Component {...processedProps}>{renderedChildren}</Component>;\n // if (node.lazy) {\n // return <Component {...processedProps}>{renderedChildren}</Component>;\n // } else {\n // }\n }\n\n if (tag === FRAGMENT_TAG) {\n return (\n <>\n {children.map((child, index) => (\n <VDOMRenderer key={getNodeKey(child, index)} node={child} />\n ))}\n </>\n );\n }\n\n const renderedChildren = children.map((child, index) => (\n <VDOMRenderer key={getNodeKey(child, index)} node={child} />\n ));\n\n return React.createElement(tag, processedProps, ...renderedChildren);\n }\n\n // 4. Fallback for unknown node types\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Unknown VDOM node type:\", node);\n }\n return null;\n};\n\nVDOMRenderer.displayName = \"VDOMRenderer\";\n\n// =================================================================\n// Node Creation Functions\n// =================================================================\n\nexport function createElementNode(\n tag: string,\n props: Record<string, any> = {},\n children: VDOMNode[] = [],\n key?: string\n): VDOMElement {\n if (process.env.NODE_ENV !== \"production\") {\n if (tag.startsWith(MOUNT_POINT_PREFIX)) {\n console.error(\n `[Pulse] Error: The tag \"${tag}\" starts with a reserved prefix \"${MOUNT_POINT_PREFIX}\". Please use a different tag name.`\n );\n }\n }\n\n const node: VDOMElement = {\n tag,\n props,\n children,\n };\n\n if (key !== undefined) {\n node.key = key;\n }\n\n return node;\n}\n\nexport function createFragment(\n children: VDOMNode[] = [],\n key?: string\n): VDOMElement {\n const node: VDOMElement = {\n tag: FRAGMENT_TAG,\n props: {},\n children,\n };\n\n if (key !== undefined) {\n node.key = key;\n }\n\n return node;\n}\n\nexport function createMountPoint(\n componentKey: string,\n props: Record<string, any> = {},\n children: VDOMNode[] = [],\n key?: string\n): VDOMElement {\n const node: VDOMElement = {\n tag: MOUNT_POINT_PREFIX + componentKey,\n props,\n children,\n };\n\n if (key !== undefined) {\n node.key = key;\n }\n\n return node;\n}\n\n// =================================================================\n// VDOM Update Functions\n// =================================================================\n\nfunction findNodeByPath(root: VDOMNode, path: string): VDOMElement | null {\n if (path === \"\") return isElementNode(root) ? root : null;\n\n const parts = path.split(\".\").map(Number);\n let current: VDOMNode | VDOMElement = root;\n\n for (const index of parts) {\n if (!isElementNode(current)) {\n console.error(\n `[findNodeByPath] Invalid path: part of it is not an element node.`\n );\n return null;\n }\n if (!current.children || index >= current.children.length) {\n console.error(\n `[findNodeByPath] Invalid path: index ${index} out of bounds.`\n );\n return null;\n }\n current = current.children[index]!;\n }\n\n return isElementNode(current) ? current : null;\n}\n\nfunction cloneNode<T extends VDOMNode>(node: T): T {\n if (typeof node !== \"object\" || node === null) {\n return node;\n }\n // Basic deep clone for VDOM nodes\n return JSON.parse(JSON.stringify(node));\n}\n\nexport function applyVDOMUpdates(\n initialTree: VDOMNode,\n updates: VDOMUpdate[]\n): VDOMNode {\n let newTree = cloneNode(initialTree);\n\n for (const update of updates) {\n const { type, path, data } = update;\n\n // Handle root-level operations separately\n if (path === \"\") {\n switch (type) {\n case \"replace\":\n newTree = data;\n break;\n case \"update_props\":\n if (isElementNode(newTree)) {\n newTree.props = { ...(newTree.props ?? {}), ...data };\n }\n break;\n default:\n console.error(`[applyUpdates] Invalid root operation: ${type}`);\n }\n continue; // Continue to next update\n }\n\n const parentPath = path.substring(0, path.lastIndexOf(\".\"));\n const childIndex = parseInt(path.substring(path.lastIndexOf(\".\") + 1), 10);\n\n const targetParent = findNodeByPath(newTree, parentPath);\n\n if (!targetParent) {\n console.error(`[applyUpdates] Could not find parent for path: ${path}`);\n continue;\n }\n\n if (!targetParent.children) {\n targetParent.children = [];\n }\n\n switch (type) {\n case \"replace\":\n targetParent.children[childIndex] = data;\n break;\n\n case \"update_props\":\n const nodeToUpdate = targetParent.children[childIndex]!;\n if (isElementNode(nodeToUpdate)) {\n nodeToUpdate.props = { ...(nodeToUpdate.props ?? {}), ...data };\n }\n break;\n\n case \"insert\":\n targetParent.children.splice(childIndex, 0, data);\n break;\n\n case \"remove\":\n targetParent.children.splice(childIndex, 1);\n break;\n\n case \"move\": {\n const item = targetParent.children.splice(data.from_index, 1)[0]!;\n targetParent.children.splice(data.to_index, 0, item);\n break;\n }\n }\n }\n\n return newTree;\n}\n\n// The `component` prop should be something like `() =>\n// import('~/path/to/component') (we'll need to remap if we're importing a named export and not the default)\nexport function RenderLazy(\n component: () => Promise<{ default: ComponentType<any> }>,\n fallback?: React.ReactNode\n): React.FC<React.PropsWithChildren<unknown>> {\n const Component = React.lazy(component);\n return ({ children, ...props }: React.PropsWithChildren<unknown>) => {\n return (\n <Suspense fallback={fallback ?? <></>}>\n <Component {...props}>{children}</Component>\n </Suspense>\n );\n };\n}\n",
7
- "import type { ComponentType } from \"react\";\n\n// Special prefixes for reserved node types\nexport const FRAGMENT_TAG = \"$$fragment\";\nexport const MOUNT_POINT_PREFIX = \"$$\";\n\n// export type LazyComponent = () => Promise<{ default: ComponentType<any> }>;\nexport type RegistryEntry = ComponentType<any>;\nexport type ComponentRegistry = Record<string, ComponentType<any>>;\n\nexport interface VDOMElement {\n tag: string;\n props?: Record<string, any>;\n children?: VDOMNode[];\n key?: string;\n lazy?: boolean;\n}\n\n// Primitive nodes that can be rendered\nexport type PrimitiveNode = string | number | boolean;\n\n// VDOMNode is either a primitive (string, number, boolean) or an element node.\n// Booleans are valid children in React but do not render anything.\n// Mount points are just UIElementNodes with tags starting with $$ComponentKey\nexport type VDOMNode = PrimitiveNode | VDOMElement;\n\nexport type VDOM = VDOMNode;\n\nexport type UpdateType =\n | \"insert\"\n | \"remove\"\n | \"replace\"\n | \"update_props\"\n | \"move\";\n\nexport interface VDOMUpdateBase {\n type: UpdateType;\n path: string; // Dot-separated path to the node\n data?: any;\n}\n\nexport interface InsertUpdate extends VDOMUpdateBase {\n type: \"insert\";\n data: VDOMNode; // The node to insert\n}\n\nexport interface RemoveUpdate extends VDOMUpdateBase {\n type: \"remove\";\n}\n\nexport interface ReplaceUpdate extends VDOMUpdateBase {\n type: \"replace\";\n data: VDOMNode; // The new node\n}\n\nexport interface UpdatePropsUpdate extends VDOMUpdateBase {\n type: \"update_props\";\n data: Record<string, any>; // The new props\n}\n\nexport interface MoveUpdate extends VDOMUpdateBase {\n type: \"move\";\n data: {\n from_index: number;\n to_index: number;\n key: string;\n };\n}\n\nexport type VDOMUpdate =\n | InsertUpdate\n | RemoveUpdate\n | ReplaceUpdate\n | UpdatePropsUpdate\n | MoveUpdate;\n\n// Utility functions for working with the UI tree structure\nexport function isElementNode(node: VDOMNode): node is VDOMElement {\n // Matches all non-text nodes\n return typeof node === \"object\" && node !== null;\n}\n\nexport function isMountPointNode(node: VDOMNode): node is VDOMElement {\n return (\n typeof node === \"object\" &&\n node !== null &&\n node.tag.startsWith(MOUNT_POINT_PREFIX) &&\n node.tag !== FRAGMENT_TAG\n );\n}\n\nexport function isTextNode(node: VDOMNode): node is string {\n return typeof node === \"string\";\n}\n\nexport function isFragment(node: VDOMNode): boolean {\n return typeof node === \"object\" && node !== null && node.tag === FRAGMENT_TAG;\n}\n\nexport function getMountPointComponentKey(node: VDOMElement): string {\n if (!isMountPointNode(node)) {\n throw new Error(\"Node is not a mount point\");\n }\n return node.tag.slice(MOUNT_POINT_PREFIX.length);\n}\n",
8
- "/* === IMPORTANT === */\n\n// used for untyped stuff, like nativeEvent\nexport function cleanForSerialization(obj: unknown): unknown {\n const result = _cleanForSerializationRecursive(obj, new WeakSet());\n return result;\n}\n\nfunction _cleanForSerializationRecursive(\n obj: unknown,\n seen: WeakSet<WeakKey>\n): unknown {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (seen.has(obj)) {\n return undefined; // handle circular refs\n }\n\n seen.add(obj);\n\n if (Array.isArray(obj)) {\n const cleanedArray = obj\n .map((item) => _cleanForSerializationRecursive(item, seen))\n .filter((item) => item !== undefined);\n\n return cleanedArray;\n }\n\n const plainObject: Record<string, any> = {};\n\n for (const key in obj) {\n if (typeof key !== \"string\") {\n continue;\n }\n const value = obj[key as keyof typeof obj];\n if (\n typeof value === \"function\" ||\n typeof value === \"symbol\" ||\n typeof value === \"undefined\"\n ) {\n continue;\n }\n\n const cleanedValue = _cleanForSerializationRecursive(value, seen);\n if (key === \"target\") {\n console.log(\"Cleaned target value:\", cleanedValue);\n }\n if (cleanedValue !== undefined) {\n plainObject[key] = cleanedValue;\n }\n }\n\n return plainObject;\n}\n\nexport function extractElement(elt: Element): object {\n return {\n id: elt.id,\n class_name: elt.className,\n tag_name: elt.tagName.toLowerCase(),\n local_name: elt.localName,\n client_height: elt.clientHeight,\n client_left: elt.clientLeft,\n client_top: elt.clientTop,\n client_width: elt.clientWidth,\n scroll_height: elt.scrollHeight,\n scroll_left: elt.scrollLeft,\n scroll_top: elt.scrollTop,\n scroll_width: elt.scrollWidth,\n slot: elt.slot,\n };\n}\n\nexport function extractHTMLOrSVGElement(elt: HTMLOrSVGElement) {\n return {\n autofocus: elt.autofocus,\n tab_index: elt.tabIndex,\n nonce: elt.nonce,\n };\n}\n\nexport function extractHTMLElementBase(elt: HTMLElement) {\n return {\n ...extractElement(elt),\n ...extractHTMLOrSVGElement(elt),\n access_key: elt.accessKey,\n access_key_label: elt.accessKeyLabel,\n autocapitalize: elt.autocapitalize,\n dir: elt.dir,\n draggable: elt.draggable,\n hidden: elt.hidden,\n inert: elt.inert,\n lang: elt.lang,\n offset_height: elt.offsetHeight,\n offset_left: elt.offsetLeft,\n offset_top: elt.offsetTop,\n offset_width: elt.offsetWidth,\n popover: elt.popover,\n spellcheck: elt.spellcheck,\n title: elt.title,\n translate: elt.translate,\n writing_suggestions: elt.writingSuggestions,\n content_editable: elt.contentEditable,\n enter_key_hint: elt.enterKeyHint,\n is_content_editable: elt.isContentEditable,\n input_mode: elt.inputMode,\n };\n}\n\nexport function extractHTMLAnchorElement(elt: HTMLAnchorElement) {\n return {\n ...extractHTMLElementBase(elt),\n hash: elt.hash,\n host: elt.host,\n hostname: elt.hostname,\n href: elt.href,\n origin: elt.origin,\n password: elt.password,\n pathname: elt.pathname,\n port: elt.port,\n protocol: elt.protocol,\n search: elt.search,\n target: elt.target,\n download: elt.download,\n rel: elt.rel,\n hreflang: elt.hreflang,\n type: elt.type,\n username: elt.username,\n ping: elt.ping,\n referrer_policy: elt.referrerPolicy,\n text: elt.text,\n };\n}\n\nexport function extractHTMLAreaElement(elt: HTMLAreaElement) {\n return {\n ...extractHTMLElementBase(elt),\n alt: elt.alt,\n coords: elt.coords,\n download: elt.download,\n hash: elt.hash,\n host: elt.host,\n hostname: elt.hostname,\n href: elt.href,\n origin: elt.origin,\n password: elt.password,\n pathname: elt.pathname,\n port: elt.port,\n protocol: elt.protocol,\n rel: elt.rel,\n search: elt.search,\n shape: elt.shape,\n target: elt.target,\n username: elt.username,\n ping: elt.ping,\n referrer_policy: elt.referrerPolicy,\n };\n}\n\nexport function extractHTMLMediaElement(elt: HTMLMediaElement) {\n return {\n ...extractHTMLElementBase(elt),\n autoplay: elt.autoplay,\n controls: elt.controls,\n cross_origin: elt.crossOrigin,\n current_src: elt.currentSrc,\n current_time: elt.currentTime,\n default_muted: elt.defaultMuted,\n default_playback_rate: elt.defaultPlaybackRate,\n duration: elt.duration,\n ended: elt.ended,\n loop: elt.loop,\n muted: elt.muted,\n network_state: elt.networkState,\n paused: elt.paused,\n playback_rate: elt.playbackRate,\n preload: elt.preload,\n ready_state: elt.readyState,\n seeking: elt.seeking,\n src: elt.src,\n volume: elt.volume,\n preserves_pitch: elt.preservesPitch,\n };\n}\n\nexport function extractHTMLAudioElement(elt: HTMLAudioElement) {\n return {\n ...extractHTMLMediaElement(elt),\n // No additional properties for audio elements\n };\n}\n\nexport function extractHTMLButtonElement(elt: HTMLButtonElement) {\n return {\n ...extractHTMLElementBase(elt),\n disabled: elt.disabled,\n name: elt.name,\n type: elt.type,\n value: elt.value,\n form_action: elt.formAction,\n form_enctype: elt.formEnctype,\n form_method: elt.formMethod,\n form_no_validate: elt.formNoValidate,\n form_target: elt.formTarget,\n popover_target_action: elt.popoverTargetAction,\n };\n}\n\nexport function extractHTMLDataElement(elt: HTMLDataElement) {\n return {\n ...extractHTMLElementBase(elt),\n value: elt.value,\n };\n}\n\nexport function extractHTMLEmbedElement(elt: HTMLEmbedElement) {\n return {\n ...extractHTMLElementBase(elt),\n height: elt.height,\n src: elt.src,\n type: elt.type,\n width: elt.width,\n align: elt.align,\n name: elt.name,\n };\n}\n\nexport function extractHTMLFieldSetElement(elt: HTMLFieldSetElement) {\n return {\n ...extractHTMLElementBase(elt),\n disabled: elt.disabled,\n name: elt.name,\n type: elt.type,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n };\n}\n\nexport function extractHTMLFormElement(elt: HTMLFormElement) {\n return {\n ...extractHTMLElementBase(elt),\n accept_charset: elt.acceptCharset,\n action: elt.action,\n autocomplete: elt.autocomplete,\n encoding: elt.encoding,\n enctype: elt.enctype,\n length: elt.length,\n method: elt.method,\n name: elt.name,\n no_validate: elt.noValidate,\n target: elt.target,\n rel: elt.rel,\n };\n}\n\nexport function extractHTMLIFrameElement(elt: HTMLIFrameElement) {\n return {\n ...extractHTMLElementBase(elt),\n allow: elt.allow,\n allow_fullscreen: elt.allowFullscreen,\n height: elt.height,\n name: elt.name,\n referrer_policy: elt.referrerPolicy,\n src: elt.src,\n srcdoc: elt.srcdoc,\n width: elt.width,\n align: elt.align,\n frame_border: elt.frameBorder,\n long_desc: elt.longDesc,\n margin_height: elt.marginHeight,\n margin_width: elt.marginWidth,\n scrolling: elt.scrolling,\n sandbox: elt.sandbox,\n };\n}\n\nexport function extractHTMLImageElement(elt: HTMLImageElement) {\n return {\n ...extractHTMLElementBase(elt),\n alt: elt.alt,\n cross_origin: elt.crossOrigin,\n decoding: elt.decoding,\n height: elt.height,\n is_map: elt.isMap,\n loading: elt.loading,\n natural_height: elt.naturalHeight,\n natural_width: elt.naturalWidth,\n referrer_policy: elt.referrerPolicy,\n sizes: elt.sizes,\n src: elt.src,\n srcset: elt.srcset,\n use_map: elt.useMap,\n width: elt.width,\n align: elt.align,\n border: elt.border,\n complete: elt.complete,\n hspace: elt.hspace,\n long_desc: elt.longDesc,\n lowsrc: elt.lowsrc,\n name: elt.name,\n vspace: elt.vspace,\n x: elt.x,\n y: elt.y,\n fetch_priority: elt.fetchPriority,\n };\n}\n\nexport function extractHTMLInputElement(elt: HTMLInputElement) {\n return {\n ...extractHTMLElementBase(elt),\n accept: elt.accept,\n alt: elt.alt,\n autocomplete: elt.autocomplete,\n checked: elt.checked,\n default_checked: elt.defaultChecked,\n default_value: elt.defaultValue,\n dir_name: elt.dirName,\n disabled: elt.disabled,\n height: elt.height,\n indeterminate: elt.indeterminate,\n max: elt.max,\n max_length: elt.maxLength,\n min: elt.min,\n min_length: elt.minLength,\n multiple: elt.multiple,\n name: elt.name,\n pattern: elt.pattern,\n placeholder: elt.placeholder,\n read_only: elt.readOnly,\n required: elt.required,\n selection_direction: elt.selectionDirection,\n selection_end: elt.selectionEnd,\n selection_start: elt.selectionStart,\n size: elt.size,\n src: elt.src,\n step: elt.step,\n type: elt.type,\n value: elt.value,\n value_as_number: elt.valueAsNumber,\n width: elt.width,\n align: elt.align,\n capture: elt.capture,\n form_action: elt.formAction,\n form_enctype: elt.formEnctype,\n form_method: elt.formMethod,\n form_no_validate: elt.formNoValidate,\n form_target: elt.formTarget,\n use_map: elt.useMap,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n popover_target_action: elt.popoverTargetAction,\n };\n}\n\nexport function extractHTMLLabelElement(elt: HTMLLabelElement) {\n return {\n ...extractHTMLElementBase(elt),\n html_for: elt.htmlFor,\n };\n}\n\nexport function extractHTMLLiElement(elt: HTMLLIElement) {\n return {\n ...extractHTMLElementBase(elt),\n value: elt.value,\n type: elt.type,\n };\n}\n\nexport function extractHTMLLinkElement(elt: HTMLLinkElement) {\n return {\n ...extractHTMLElementBase(elt),\n as: elt.as,\n cross_origin: elt.crossOrigin,\n disabled: elt.disabled,\n fetch_priority: elt.fetchPriority,\n href: elt.href,\n href_lang: elt.hreflang,\n image_sizes: elt.imageSizes,\n image_srcset: elt.imageSrcset,\n integrity: elt.integrity,\n media: elt.media,\n referrer_policy: elt.referrerPolicy,\n rel: elt.rel,\n type: elt.type,\n charset: elt.charset,\n rev: elt.rev,\n target: elt.target,\n sizes: elt.sizes,\n };\n}\n\nexport function extractHTMLMapElement(elt: HTMLMapElement) {\n return {\n ...extractHTMLElementBase(elt),\n name: elt.name,\n };\n}\n\nexport function extractHTMLMeterElement(elt: HTMLMeterElement) {\n return {\n ...extractHTMLElementBase(elt),\n high: elt.high,\n low: elt.low,\n max: elt.max,\n min: elt.min,\n optimum: elt.optimum,\n value: elt.value,\n };\n}\n\nexport function extractHTMLModElement(elt: HTMLModElement) {\n return {\n ...extractHTMLElementBase(elt),\n cite: elt.cite,\n dateTime: elt.dateTime,\n };\n}\n\nexport function extractHTMLOListElement(elt: HTMLOListElement) {\n return {\n ...extractHTMLElementBase(elt),\n reversed: elt.reversed,\n start: elt.start,\n type: elt.type,\n compact: elt.compact,\n };\n}\n\nexport function extractHTMLObjectElement(elt: HTMLObjectElement) {\n return {\n ...extractHTMLElementBase(elt),\n data: elt.data,\n // disabled: elt.disabled,\n height: elt.height,\n name: elt.name,\n type: elt.type,\n use_map: elt.useMap,\n width: elt.width,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n align: elt.align,\n archive: elt.archive,\n border: elt.border,\n code: elt.code,\n code_base: elt.codeBase,\n code_type: elt.codeType,\n declare: elt.declare,\n hspace: elt.hspace,\n standby: elt.standby,\n vspace: elt.vspace,\n };\n}\n\nexport function extractHTMLOptGroupElement(elt: HTMLOptGroupElement) {\n return {\n ...extractHTMLElementBase(elt),\n disabled: elt.disabled,\n label: elt.label,\n };\n}\n\nexport function extractHTMLOptionElement(elt: HTMLOptionElement) {\n return {\n ...extractHTMLElementBase(elt),\n default_selected: elt.defaultSelected,\n disabled: elt.disabled,\n index: elt.index,\n label: elt.label,\n selected: elt.selected,\n text: elt.text,\n value: elt.value,\n };\n}\n\nexport function extractHTMLOutputElement(elt: HTMLOutputElement) {\n return {\n ...extractHTMLElementBase(elt),\n default_value: elt.defaultValue,\n name: elt.name,\n type: elt.type,\n value: elt.value,\n html_for: elt.htmlFor,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n };\n}\n\nexport function extractHTMLProgressElement(elt: HTMLProgressElement) {\n return {\n ...extractHTMLElementBase(elt),\n max: elt.max,\n position: elt.position,\n value: elt.value,\n };\n}\n\nexport function extractHTMLQuoteElement(elt: HTMLQuoteElement) {\n return {\n ...extractHTMLElementBase(elt),\n cite: elt.cite,\n };\n}\n\nexport function extractHTMLCiteElement(elt: HTMLElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLScriptElement(elt: HTMLScriptElement) {\n return {\n ...extractHTMLElementBase(elt),\n async_: elt.async,\n cross_origin: elt.crossOrigin,\n defer: elt.defer,\n fetch_priority: elt.fetchPriority,\n integrity: elt.integrity,\n no_module: elt.noModule,\n referrer_policy: elt.referrerPolicy,\n src: elt.src,\n text: elt.text,\n type: elt.type,\n charset: elt.charset,\n event: (elt as any).event,\n html_for: (elt as any).htmlFor,\n };\n}\n\nexport function extractHTMLSelectElement(elt: HTMLSelectElement) {\n return {\n ...extractHTMLElementBase(elt),\n autocomplete: elt.autocomplete,\n disabled: elt.disabled,\n length: elt.length,\n multiple: elt.multiple,\n name: elt.name,\n required: elt.required,\n selected_index: elt.selectedIndex,\n size: elt.size,\n type: elt.type,\n value: elt.value,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n };\n}\n\nexport function extractHTMLSlotElement(elt: HTMLSlotElement) {\n return {\n ...extractHTMLElementBase(elt),\n name: elt.name,\n };\n}\n\nexport function extractHTMLSourceElement(elt: HTMLSourceElement) {\n return {\n ...extractHTMLElementBase(elt),\n height: elt.height,\n media: elt.media,\n sizes: elt.sizes,\n src: elt.src,\n srcset: elt.srcset,\n type: elt.type,\n width: elt.width,\n };\n}\n\nexport function extractHTMLTableCaptionElement(elt: HTMLTableCaptionElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n };\n}\n\nexport function extractHTMLTableCellElement(elt: HTMLTableCellElement) {\n return {\n ...extractHTMLElementBase(elt),\n abbr: elt.abbr,\n cell_index: elt.cellIndex,\n col_span: elt.colSpan,\n headers: elt.headers,\n row_span: elt.rowSpan,\n scope: elt.scope,\n align: elt.align,\n axis: elt.axis,\n bg_color: elt.bgColor,\n ch: elt.ch,\n ch_off: elt.chOff,\n height: elt.height,\n no_wrap: elt.noWrap,\n v_align: elt.vAlign,\n width: elt.width,\n };\n}\n\nexport function extractHTMLTableColElement(elt: HTMLTableColElement) {\n return {\n ...extractHTMLElementBase(elt),\n span: elt.span,\n align: elt.align,\n ch: elt.ch,\n ch_off: elt.chOff,\n v_align: elt.vAlign,\n width: elt.width,\n };\n}\n\nexport function extractHTMLTableElement(elt: HTMLTableElement) {\n return {\n ...extractHTMLElementBase(elt),\n // caption: elt.caption ? extractHTMLTableCaptionElement(elt.caption) : null,\n align: elt.align,\n bg_color: elt.bgColor,\n border: elt.border,\n cell_padding: elt.cellPadding,\n cell_spacing: elt.cellSpacing,\n frame: elt.frame,\n rules: elt.rules,\n summary: elt.summary,\n width: elt.width,\n };\n}\n\nexport function extractHTMLTableRowElement(elt: HTMLTableRowElement) {\n return {\n ...extractHTMLElementBase(elt),\n row_index: elt.rowIndex,\n section_row_index: elt.sectionRowIndex,\n align: elt.align,\n bg_color: elt.bgColor,\n ch: elt.ch,\n ch_off: elt.chOff,\n v_align: elt.vAlign,\n };\n}\n\nexport function extractHTMLTableSectionElement(elt: HTMLTableSectionElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n ch: elt.ch,\n ch_off: elt.chOff,\n v_align: elt.vAlign,\n };\n}\n\nexport function extractHTMLTemplateElement(elt: HTMLTemplateElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLTextAreaElement(elt: HTMLTextAreaElement) {\n return {\n ...extractHTMLElementBase(elt),\n autocomplete: elt.autocomplete,\n cols: elt.cols,\n default_value: elt.defaultValue,\n dir_name: elt.dirName,\n disabled: elt.disabled,\n max_length: elt.maxLength,\n min_length: elt.minLength,\n name: elt.name,\n placeholder: elt.placeholder,\n read_only: elt.readOnly,\n required: elt.required,\n rows: elt.rows,\n selection_direction: elt.selectionDirection,\n selection_end: elt.selectionEnd,\n selection_start: elt.selectionStart,\n value: elt.value,\n wrap: elt.wrap,\n text_length: elt.textLength,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n };\n}\n\nexport function extractHTMLTimeElement(elt: HTMLTimeElement) {\n return {\n ...extractHTMLElementBase(elt),\n datetime: elt.dateTime,\n };\n}\n\nexport function extractHTMLTrackElement(elt: HTMLTrackElement) {\n return {\n ...extractHTMLElementBase(elt),\n default: elt.default,\n kind: elt.kind,\n label: elt.label,\n ready_state: elt.readyState,\n src: elt.src,\n srclang: elt.srclang,\n };\n}\n\nexport function extractHTMLVideoElement(elt: HTMLVideoElement) {\n return {\n ...extractHTMLMediaElement(elt),\n height: elt.height,\n poster: elt.poster,\n video_height: elt.videoHeight,\n video_width: elt.videoWidth,\n width: elt.width,\n plays_inline: elt.playsInline,\n };\n}\n\nexport function extractHTMLBRElement(elt: HTMLBRElement) {\n return {\n ...extractHTMLElementBase(elt),\n clear: elt.clear,\n };\n}\n\nexport function extractHTMLBaseElement(elt: HTMLBaseElement) {\n return {\n ...extractHTMLElementBase(elt),\n href: elt.href,\n target: elt.target,\n };\n}\n\nexport function extractHTMLBodyElement(elt: HTMLBodyElement) {\n return {\n ...extractHTMLElementBase(elt),\n a_link: elt.aLink,\n background: elt.background,\n bg_color: elt.bgColor,\n link: elt.link,\n text: elt.text,\n v_link: elt.vLink,\n };\n}\n\nexport function extractHTMLDListElement(elt: HTMLDListElement) {\n return {\n ...extractHTMLElementBase(elt),\n compact: elt.compact,\n };\n}\n\nexport function extractHTMLDetailsElement(elt: HTMLDetailsElement) {\n return {\n ...extractHTMLElementBase(elt),\n open: elt.open,\n };\n}\n\nexport function extractHTMLDialogElement(elt: HTMLDialogElement) {\n return {\n ...extractHTMLElementBase(elt),\n open: elt.open,\n return_value: elt.returnValue,\n };\n}\n\nexport function extractHTMLDivElement(elt: HTMLDivElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n };\n}\n\nexport function extractHTMLHeadElement(elt: HTMLHeadElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLHeadingElement(elt: HTMLHeadingElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n };\n}\n\nexport function extractHTMLHRElement(elt: HTMLHRElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n color: elt.color,\n no_shade: elt.noShade,\n size: elt.size,\n width: elt.width,\n };\n}\n\nexport function extractHTMLHtmlElement(elt: HTMLHtmlElement) {\n return {\n ...extractHTMLElementBase(elt),\n version: elt.version,\n };\n}\n\nexport function extractHTMLMenuElement(elt: HTMLMenuElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLMetaElement(elt: HTMLMetaElement) {\n return {\n ...extractHTMLElementBase(elt),\n content: elt.content,\n http_equiv: elt.httpEquiv,\n name: elt.name,\n scheme: elt.scheme,\n };\n}\n\nexport function extractHTMLParagraphElement(elt: HTMLParagraphElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n };\n}\n\nexport function extractHTMLPictureElement(elt: HTMLPictureElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLPreElement(elt: HTMLPreElement) {\n return {\n ...extractHTMLElementBase(elt),\n width: elt.width,\n };\n}\n\nexport function extractHTMLSpanElement(elt: HTMLSpanElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLStyleElement(elt: HTMLStyleElement) {\n return {\n ...extractHTMLElementBase(elt),\n media: elt.media,\n type: elt.type,\n disabled: elt.disabled,\n };\n}\n\nexport function extractHTMLTitleElement(elt: HTMLTitleElement) {\n return {\n ...extractHTMLElementBase(elt),\n text: elt.text,\n };\n}\n\nexport function extractHTMLUListElement(elt: HTMLUListElement) {\n return {\n ...extractHTMLElementBase(elt),\n compact: elt.compact,\n type: elt.type,\n };\n}\n\nexport function extractHTMLElement(elt: HTMLElement): object {\n const tagName = elt.tagName.toUpperCase();\n\n switch (tagName) {\n case \"A\":\n return extractHTMLAnchorElement(elt as HTMLAnchorElement);\n case \"AREA\":\n return extractHTMLAreaElement(elt as HTMLAreaElement);\n case \"AUDIO\":\n return extractHTMLAudioElement(elt as HTMLAudioElement);\n case \"BASE\":\n return extractHTMLBaseElement(elt as HTMLBaseElement);\n case \"BLOCKQUOTE\":\n case \"Q\":\n return extractHTMLQuoteElement(elt as HTMLQuoteElement);\n case \"BODY\":\n return extractHTMLBodyElement(elt as HTMLBodyElement);\n case \"BR\":\n return extractHTMLBRElement(elt as HTMLBRElement);\n case \"BUTTON\":\n return extractHTMLButtonElement(elt as HTMLButtonElement);\n case \"CANVAS\": // Placeholder - no specific function yet\n return extractHTMLElementBase(elt);\n case \"CAPTION\":\n return extractHTMLTableCaptionElement(elt as HTMLTableCaptionElement);\n case \"CITE\":\n return extractHTMLCiteElement(elt); // Uses base HTMLElement\n case \"COL\":\n case \"COLGROUP\":\n return extractHTMLTableColElement(elt as HTMLTableColElement);\n case \"DATA\":\n return extractHTMLDataElement(elt as HTMLDataElement);\n case \"DETAILS\":\n return extractHTMLDetailsElement(elt as HTMLDetailsElement);\n case \"DIALOG\":\n return extractHTMLDialogElement(elt as HTMLDialogElement);\n case \"DIV\":\n return extractHTMLDivElement(elt as HTMLDivElement);\n case \"DL\":\n return extractHTMLDListElement(elt as HTMLDListElement);\n case \"EMBED\":\n return extractHTMLEmbedElement(elt as HTMLEmbedElement);\n case \"FIELDSET\":\n return extractHTMLFieldSetElement(elt as HTMLFieldSetElement);\n case \"FORM\":\n return extractHTMLFormElement(elt as HTMLFormElement);\n case \"H1\":\n case \"H2\":\n case \"H3\":\n case \"H4\":\n case \"H5\":\n case \"H6\":\n return extractHTMLHeadingElement(elt as HTMLHeadingElement);\n case \"HEAD\":\n return extractHTMLHeadElement(elt as HTMLHeadElement);\n case \"HR\":\n return extractHTMLHRElement(elt as HTMLHRElement);\n case \"HTML\":\n return extractHTMLHtmlElement(elt as HTMLHtmlElement);\n case \"IFRAME\":\n return extractHTMLIFrameElement(elt as HTMLIFrameElement);\n case \"IMG\":\n return extractHTMLImageElement(elt as HTMLImageElement);\n case \"INPUT\":\n return extractHTMLInputElement(elt as HTMLInputElement);\n case \"LABEL\":\n return extractHTMLLabelElement(elt as HTMLLabelElement);\n case \"LI\":\n return extractHTMLLiElement(elt as HTMLLIElement);\n case \"LINK\":\n return extractHTMLLinkElement(elt as HTMLLinkElement);\n case \"MAP\":\n return extractHTMLMapElement(elt as HTMLMapElement);\n case \"MENU\":\n return extractHTMLMenuElement(elt as HTMLMenuElement);\n case \"META\":\n return extractHTMLMetaElement(elt as HTMLMetaElement);\n case \"METER\":\n return extractHTMLMeterElement(elt as HTMLMeterElement);\n case \"INS\":\n case \"DEL\":\n return extractHTMLModElement(elt as HTMLModElement);\n case \"OBJECT\":\n return extractHTMLObjectElement(elt as HTMLObjectElement);\n case \"OL\":\n return extractHTMLOListElement(elt as HTMLOListElement);\n case \"OPTGROUP\":\n return extractHTMLOptGroupElement(elt as HTMLOptGroupElement);\n case \"OPTION\":\n return extractHTMLOptionElement(elt as HTMLOptionElement);\n case \"OUTPUT\":\n return extractHTMLOutputElement(elt as HTMLOutputElement);\n case \"P\":\n return extractHTMLParagraphElement(elt as HTMLParagraphElement);\n case \"PICTURE\":\n return extractHTMLPictureElement(elt as HTMLPictureElement);\n case \"PRE\":\n return extractHTMLPreElement(elt as HTMLPreElement);\n case \"PROGRESS\":\n return extractHTMLProgressElement(elt as HTMLProgressElement);\n case \"SCRIPT\":\n return extractHTMLScriptElement(elt as HTMLScriptElement);\n case \"SELECT\":\n return extractHTMLSelectElement(elt as HTMLSelectElement);\n case \"SLOT\":\n return extractHTMLSlotElement(elt as HTMLSlotElement);\n case \"SOURCE\":\n return extractHTMLSourceElement(elt as HTMLSourceElement);\n case \"SPAN\":\n return extractHTMLSpanElement(elt as HTMLSpanElement);\n case \"STYLE\":\n return extractHTMLStyleElement(elt as HTMLStyleElement);\n case \"TABLE\":\n return extractHTMLTableElement(elt as HTMLTableElement);\n case \"TBODY\":\n case \"THEAD\":\n case \"TFOOT\":\n return extractHTMLTableSectionElement(elt as HTMLTableSectionElement);\n case \"TD\":\n case \"TH\":\n return extractHTMLTableCellElement(elt as HTMLTableCellElement);\n case \"TEMPLATE\":\n return extractHTMLTemplateElement(elt as HTMLTemplateElement);\n case \"TEXTAREA\":\n return extractHTMLTextAreaElement(elt as HTMLTextAreaElement);\n case \"TIME\":\n return extractHTMLTimeElement(elt as HTMLTimeElement);\n case \"TITLE\":\n return extractHTMLTitleElement(elt as HTMLTitleElement);\n case \"TR\":\n return extractHTMLTableRowElement(elt as HTMLTableRowElement);\n case \"TRACK\":\n return extractHTMLTrackElement(elt as HTMLTrackElement);\n case \"UL\":\n return extractHTMLUListElement(elt as HTMLUListElement);\n case \"VIDEO\":\n return extractHTMLVideoElement(elt as HTMLVideoElement);\n // Add other tag names as needed\n default:\n throw new Error(\n `Unexpected HTML element tag: ${elt.tagName} (update .web/custom/serialize.ts)`\n );\n }\n}\n\nexport function extractSyntheticEvent(evt: React.SyntheticEvent) {\n return {\n // Very slow right now, to investigate\n // nativeEvent: cleanForSerialization(evt.nativeEvent),\n // use extractHTMLElement in every place where a HTMLElement or generic TElement type is used\n target: extractHTMLElement(evt.target as HTMLElement), // I think this is true for all or purposes\n // currentTarget is often not available in Reflex event handlers\n bubbles: evt.bubbles,\n cancelable: evt.cancelable,\n default_prevented: evt.defaultPrevented,\n event_phase: evt.eventPhase,\n is_trusted: evt.isTrusted,\n timestamp: evt.timeStamp,\n type: evt.type,\n };\n}\n\nexport function extractUIEvent(evt: React.UIEvent) {\n return { ...extractSyntheticEvent(evt), detail: evt.detail };\n}\n\nexport function extractMouseEvent(evt: React.MouseEvent) {\n return {\n ...extractUIEvent(evt),\n\n alt_key: evt.altKey,\n button: evt.button,\n buttons: evt.buttons,\n client_x: evt.clientX,\n client_y: evt.clientY,\n ctrl_key: evt.ctrlKey,\n meta_key: evt.metaKey,\n movement_x: evt.movementX,\n movement_y: evt.movementY,\n page_x: evt.pageX,\n page_y: evt.pageY,\n related_target: evt.relatedTarget\n ? extractHTMLElement(evt.relatedTarget as HTMLElement)\n : null,\n screen_x: evt.screenX,\n screen_y: evt.screenY,\n shift_key: evt.shiftKey,\n };\n}\n\nexport function extractClipboardEvent(evt: React.ClipboardEvent) {\n return {\n ...extractSyntheticEvent(evt),\n clipboard_data: extractDataTransfer(evt.clipboardData),\n };\n}\n\nexport function extractCompositionEvent(evt: React.CompositionEvent) {\n return {\n ...extractSyntheticEvent(evt),\n data: evt.data,\n };\n}\n\nexport function extractDragEvent(evt: React.DragEvent) {\n return {\n ...extractMouseEvent(evt),\n data_transfer: extractDataTransfer(evt.dataTransfer),\n };\n}\n\nexport function extractPointerEvent(evt: React.PointerEvent) {\n return {\n ...extractMouseEvent(evt),\n pointer_id: evt.pointerId,\n pressure: evt.pressure,\n tangential_pressure: evt.tangentialPressure,\n tilt_x: evt.tiltX,\n tilt_y: evt.tiltY,\n twist: evt.twist,\n width: evt.width,\n height: evt.height,\n pointer_type: evt.pointerType,\n is_primary: evt.isPrimary,\n };\n}\n\nexport function extractFocusEvent(evt: React.FocusEvent) {\n return {\n ...extractSyntheticEvent(evt),\n // target: extractHTMLElement(evt.target as HTMLElement),\n related_target: evt.relatedTarget\n ? extractHTMLElement(evt.relatedTarget as HTMLElement)\n : null,\n };\n}\n\nexport function extractFormEvent(evt: React.FormEvent) {\n return extractSyntheticEvent(evt);\n}\n\nexport function extractInvalidEvent(evt: React.InvalidEvent) {\n return extractSyntheticEvent(evt);\n}\n\nexport function extractChangeEvent(evt: React.ChangeEvent) {\n return extractFormEvent(evt);\n}\n\nexport function extractKeyboardEvent(evt: React.KeyboardEvent) {\n return {\n ...extractUIEvent(evt),\n alt_key: evt.altKey,\n ctrl_key: evt.ctrlKey,\n code: evt.code,\n key: evt.key,\n locale: evt.locale,\n location: evt.location,\n meta_key: evt.metaKey,\n repeat: evt.repeat,\n shift_key: evt.shiftKey,\n };\n}\n\nexport function extractTouchEvent(evt: React.TouchEvent) {\n return {\n ...extractUIEvent(evt),\n alt_key: evt.altKey,\n changed_touches: Array.from(evt.changedTouches).map((touch) => ({\n target: extractHTMLElement(touch.target as HTMLElement),\n identifier: touch.identifier,\n screen_x: touch.screenX,\n screen_y: touch.screenY,\n client_x: touch.clientX,\n client_y: touch.clientY,\n page_x: touch.pageX,\n page_y: touch.pageY,\n })),\n ctrl_key: evt.ctrlKey,\n meta_key: evt.metaKey,\n shift_key: evt.shiftKey,\n target_touches: Array.from(evt.targetTouches).map((touch) => ({\n target: extractHTMLElement(touch.target as HTMLElement),\n identifier: touch.identifier,\n screen_x: touch.screenX,\n screen_y: touch.screenY,\n client_x: touch.clientX,\n client_y: touch.clientY,\n page_x: touch.pageX,\n page_y: touch.pageY,\n })),\n touches: Array.from(evt.touches).map((touch) => ({\n target: extractHTMLElement(touch.target as HTMLElement),\n identifier: touch.identifier,\n screen_x: touch.screenX,\n screen_y: touch.screenY,\n client_x: touch.clientX,\n client_y: touch.clientY,\n page_x: touch.pageX,\n page_y: touch.pageY,\n })),\n };\n}\n\nexport function extractWheelEvent(evt: React.WheelEvent) {\n return {\n ...extractMouseEvent(evt),\n delta_mode: evt.deltaMode,\n delta_x: evt.deltaX,\n delta_y: evt.deltaY,\n delta_z: evt.deltaZ,\n };\n}\n\nexport function extractAnimationEvent(evt: React.AnimationEvent) {\n return {\n ...extractSyntheticEvent(evt),\n animation_name: evt.animationName,\n elapsed_time: evt.elapsedTime,\n pseudo_element: evt.pseudoElement,\n };\n}\n\nexport function extractToggleEvent(evt: React.ToggleEvent) {\n return {\n ...extractSyntheticEvent(evt),\n old_state: evt.oldState,\n new_state: evt.newState,\n };\n}\n\nexport function extractTransitionEvent(evt: React.TransitionEvent) {\n return {\n ...extractSyntheticEvent(evt),\n elapsed_time: evt.elapsedTime,\n property_name: evt.propertyName,\n pseudo_element: evt.pseudoElement,\n };\n}\n\n// Helper function to extract DataTransfer properties\nfunction extractDataTransfer(dt: DataTransfer | null): object | null {\n if (!dt) {\n return null;\n }\n const items = [];\n if (dt.items) {\n for (let i = 0; i < dt.items.length; i++) {\n const item = dt.items[i]!;\n items.push({\n kind: item.kind,\n type: item.type,\n });\n }\n }\n return {\n drop_effect: dt.dropEffect,\n effect_allowed: dt.effectAllowed,\n items: items,\n types: Array.from(dt.types || []),\n };\n}\n\nconst eventExtractorMap: { [key: string]: (evt: any) => object } = {\n // Pointer Events\n pointerdown: extractPointerEvent,\n pointermove: extractPointerEvent,\n pointerup: extractPointerEvent,\n pointercancel: extractPointerEvent,\n gotpointercapture: extractPointerEvent,\n lostpointercapture: extractPointerEvent,\n pointerenter: extractPointerEvent,\n pointerleave: extractPointerEvent,\n pointerover: extractPointerEvent,\n pointerout: extractPointerEvent,\n\n // Mouse Events\n click: extractMouseEvent,\n contextmenu: extractMouseEvent,\n dblclick: extractMouseEvent,\n mousedown: extractMouseEvent,\n mouseenter: extractMouseEvent,\n mouseleave: extractMouseEvent,\n mousemove: extractMouseEvent,\n mouseout: extractMouseEvent,\n mouseover: extractMouseEvent,\n mouseup: extractMouseEvent,\n\n // Drag Events\n drag: extractDragEvent,\n dragend: extractDragEvent,\n dragenter: extractDragEvent,\n dragexit: extractDragEvent,\n dragleave: extractDragEvent,\n dragover: extractDragEvent,\n dragstart: extractDragEvent,\n drop: extractDragEvent,\n\n // Keyboard Events\n keydown: extractKeyboardEvent,\n keypress: extractKeyboardEvent,\n keyup: extractKeyboardEvent,\n\n // Focus Events\n focus: extractFocusEvent,\n blur: extractFocusEvent,\n\n // Form Events\n change: extractChangeEvent,\n input: extractChangeEvent, // often used with change\n invalid: extractInvalidEvent,\n reset: extractFormEvent,\n submit: extractFormEvent,\n\n // Clipboard Events\n copy: extractClipboardEvent,\n cut: extractClipboardEvent,\n paste: extractClipboardEvent,\n\n // Composition Events\n compositionend: extractCompositionEvent,\n compositionstart: extractCompositionEvent,\n compositionupdate: extractCompositionEvent,\n\n // Touch Events\n touchcancel: extractTouchEvent,\n touchend: extractTouchEvent,\n touchmove: extractTouchEvent,\n touchstart: extractTouchEvent,\n\n // UI Events\n scroll: extractUIEvent,\n\n // Wheel Events\n wheel: extractWheelEvent,\n\n // Animation Events\n animationstart: extractAnimationEvent,\n animationend: extractAnimationEvent,\n animationiteration: extractAnimationEvent,\n\n // Transition Events\n transitionend: extractTransitionEvent,\n\n // Toggle Events\n toggle: extractToggleEvent,\n};\n\nexport function extractEvent(value: any): any {\n // Duck-typing for React's SyntheticEvent.\n // We check for properties that are unique to synthetic events.\n if (\n value &&\n typeof value === \"object\" &&\n \"nativeEvent\" in value &&\n typeof value.isDefaultPrevented === \"function\"\n ) {\n const evt = value as React.SyntheticEvent;\n // The `type` property is crucial for the lookup.\n if (typeof evt.type !== \"string\") {\n return value;\n }\n\n const extractor = eventExtractorMap[evt.type.toLowerCase()];\n if (extractor) {\n return extractor(evt);\n }\n\n // Fallback for unknown but event-like types\n console.warn(\n `No specific extractor for event type \"${evt.type}\". Using synthetic.`\n );\n return extractSyntheticEvent(evt);\n }\n\n // If it's not a duck-typed event, return it as is.\n return value;\n}\n",
9
- "import type { RouteInfo } from \"./helpers\";\nimport type { ClientMountMessage } from \"./messages\";\nimport { applyVDOMUpdates } from \"./renderer\";\nimport { extractEvent } from \"./serialize\";\nimport type { VDOM, VDOMNode } from \"./vdom\";\n\nimport { io, Socket } from \"socket.io-client\";\nimport type {\n ClientApiResultMessage,\n ClientMessage,\n ServerApiCallMessage,\n ServerErrorInfo,\n ServerMessage,\n} from \"./messages\";\n\nexport interface MountedView {\n vdom: VDOM;\n listener: VDOMListener;\n routeInfo: RouteInfo;\n}\n\nexport type VDOMListener = (node: VDOMNode) => void;\nexport type ConnectionStatusListener = (connected: boolean) => void;\nexport type ServerErrorListener = (\n path: string,\n error: ServerErrorInfo | null\n) => void;\n\nexport interface PulseClient {\n // Connection management\n connect(): Promise<void>;\n disconnect(): void;\n isConnected(): boolean;\n onConnectionChange(listener: ConnectionStatusListener): () => void;\n // Messages\n navigate(path: string, routeInfo: RouteInfo): Promise<void>;\n leave(path: string): Promise<void>;\n invokeCallback(path: string, callback: string, args: any[]): Promise<void>;\n // VDOM subscription\n mountView(path: string, view: MountedView): () => void;\n}\n\nexport class PulseSocketIOClient {\n private activeViews: Map<string, MountedView>;\n private socket: Socket | null = null;\n private messageQueue: ClientMessage[];\n private connectionListeners: Set<ConnectionStatusListener> = new Set();\n private serverErrors: Map<string, ServerErrorInfo> = new Map();\n private serverErrorListeners: Set<ServerErrorListener> = new Set();\n\n constructor(\n private url: string,\n private frameworkNavigate?: (to: string) => void\n ) {\n this.socket = null;\n this.activeViews = new Map();\n this.messageQueue = [];\n }\n public isConnected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public async connect(): Promise<void> {\n if (this.socket) {\n return;\n }\n return new Promise((resolve, reject) => {\n const socket = io(this.url, {\n transports: [\"websocket\"],\n });\n this.socket = socket;\n\n socket.on(\"connect\", () => {\n console.log(\"[SocketIOTransport] Connected:\", this.socket?.id);\n // Make sure to send a navigate payload for all the routes\n for (const [path, route] of this.activeViews) {\n socket.emit(\"message\", {\n type: \"mount\",\n path: path,\n routeInfo: route.routeInfo,\n } satisfies ClientMountMessage);\n }\n\n for (const payload of this.messageQueue) {\n // Already sent above\n if (payload.type === \"mount\" && this.activeViews.has(payload.path)) {\n continue;\n }\n // We're remounting all the routes, so no need to navigate\n if (payload.type === \"navigate\") {\n continue;\n }\n socket.emit(\"message\", payload);\n }\n this.messageQueue = [];\n\n this.notifyConnectionListeners(true);\n resolve();\n });\n\n socket.on(\"connect_error\", (err) => {\n console.error(\"[SocketIOTransport] Connection failed:\", err);\n this.notifyConnectionListeners(false);\n reject(err);\n });\n\n socket.on(\"disconnect\", () => {\n console.log(\"[SocketIOTransport] Disconnected\");\n this.notifyConnectionListeners(false);\n });\n\n // Wrap in an arrow function to avoid losing the `this` reference\n socket.on(\"message\", (data) => this.handleServerMessage(data));\n });\n }\n\n onConnectionChange(listener: ConnectionStatusListener): () => void {\n this.connectionListeners.add(listener);\n listener(this.isConnected());\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n private notifyConnectionListeners(connected: boolean): void {\n for (const listener of this.connectionListeners) {\n listener(connected);\n }\n }\n\n public onServerError(listener: ServerErrorListener): () => void {\n this.serverErrorListeners.add(listener);\n // Emit current errors to new listener\n for (const [path, err] of this.serverErrors) listener(path, err);\n return () => {\n this.serverErrorListeners.delete(listener);\n };\n }\n\n private notifyServerError(path: string, error: ServerErrorInfo | null) {\n for (const listener of this.serverErrorListeners) listener(path, error);\n }\n\n private async sendMessage(payload: ClientMessage): Promise<void> {\n if (this.isConnected()) {\n // console.log(\"[SocketIOTransport] Sending:\", payload);\n this.socket!.emit(\"message\", payload);\n } else {\n // console.log(\"[SocketIOTransport] Queuing message:\", payload);\n this.messageQueue.push(payload);\n }\n }\n\n public mountView(path: string, view: MountedView) {\n if (this.activeViews.has(path)) {\n throw new Error(`Path ${path} is already mounted`);\n }\n this.activeViews.set(path, view);\n void this.sendMessage({\n type: \"mount\",\n path,\n routeInfo: view.routeInfo,\n });\n }\n\n public async navigate(path: string, routeInfo: RouteInfo) {\n await this.sendMessage({\n type: \"navigate\",\n path,\n routeInfo,\n });\n }\n\n public unmount(path: string) {\n void this.sendMessage({ type: \"unmount\", path });\n this.activeViews.delete(path);\n }\n\n public disconnect() {\n this.socket?.disconnect();\n this.socket = null;\n this.messageQueue = [];\n this.connectionListeners.clear();\n this.activeViews.clear();\n this.serverErrors.clear();\n this.serverErrorListeners.clear();\n }\n\n private handleServerMessage(message: ServerMessage) {\n // console.log(\"[PulseClient] Received message:\", message);\n switch (message.type) {\n case \"vdom_init\": {\n const route = this.activeViews.get(message.path);\n if (route) {\n route.vdom = message.vdom;\n route.listener(route.vdom);\n }\n // Clear any prior error for this path on successful init\n if (this.serverErrors.has(message.path)) {\n this.serverErrors.delete(message.path);\n this.notifyServerError(message.path, null);\n }\n break;\n }\n case \"vdom_update\": {\n const route = this.activeViews.get(message.path);\n if (!route || !route.vdom) {\n console.error(\n `[PulseClient] Received VDOM update for path ${message.path} before initial tree was set.`\n );\n return;\n }\n route.vdom = applyVDOMUpdates(route.vdom, message.ops);\n route.listener(route.vdom);\n // Clear any prior error for this path on successful update\n if (this.serverErrors.has(message.path)) {\n this.serverErrors.delete(message.path);\n this.notifyServerError(message.path, null);\n }\n break;\n }\n case \"server_error\": {\n this.serverErrors.set(message.path, message.error);\n this.notifyServerError(message.path, message.error);\n break;\n }\n case \"api_call\": {\n void this.performApiCall(message);\n break;\n }\n case \"navigate_to\": {\n try {\n const dest = (message as any).path as string;\n if (this.frameworkNavigate) {\n this.frameworkNavigate(dest);\n } else {\n window.history.pushState({}, \"\", dest);\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n } catch (e) {\n console.error(\"Navigation error:\", e);\n }\n break;\n }\n }\n }\n\n private async performApiCall(msg: ServerApiCallMessage) {\n try {\n const res = await fetch(msg.url, {\n method: msg.method || \"GET\",\n headers: {\n ...(msg.headers || {}),\n ...(msg.body != null && !(\"content-type\" in (msg.headers || {}))\n ? { \"content-type\": \"application/json\" }\n : {}),\n },\n body:\n msg.body != null\n ? typeof msg.body === \"string\"\n ? msg.body\n : JSON.stringify(msg.body)\n : undefined,\n credentials: msg.credentials || \"include\",\n });\n const headersObj: Record<string, string> = {};\n res.headers.forEach((v, k) => (headersObj[k] = v));\n let body: any = null;\n const ct = res.headers.get(\"content-type\") || \"\";\n if (ct.includes(\"application/json\")) {\n body = await res.json().catch(() => null);\n } else {\n body = await res.text().catch(() => null);\n }\n const reply: ClientApiResultMessage = {\n type: \"api_result\",\n id: msg.id,\n ok: res.ok,\n status: res.status,\n headers: headersObj,\n body,\n };\n await this.sendMessage(reply);\n } catch (err) {\n const reply: ClientApiResultMessage = {\n type: \"api_result\",\n id: msg.id,\n ok: false,\n status: 0,\n headers: {},\n body: { error: String(err) },\n };\n await this.sendMessage(reply);\n }\n }\n\n public async invokeCallback(path: string, callback: string, args: any[]) {\n await this.sendMessage({\n type: \"callback\",\n path,\n callback,\n args: args.map(extractEvent),\n });\n }\n\n // public getVDOM(path: string): VDOM | null {\n // return this.activeViews.get(path)?.vdom ?? null;\n // }\n}\n",
5
+ "import React, {\n useEffect,\n useState,\n useMemo,\n createContext,\n useContext,\n type ComponentType,\n} from \"react\";\nimport { VDOMRenderer, applyUpdates } from \"./renderer\";\nimport { PulseSocketIOClient } from \"./client\";\nimport type { VDOM, ComponentRegistry, RegistryEntry } from \"./vdom\";\nimport { useLocation, useParams, useNavigate } from \"react-router\";\nimport type { ServerErrorInfo } from \"./messages\";\nimport type { RouteInfo } from \"./helpers\";\n\n// =================================================================\n// Types\n// =================================================================\n\nexport interface PulseConfig {\n serverAddress: string;\n}\n\n// =================================================================\n// Context and Hooks\n// =================================================================\n\n// Context for the client, provided by PulseProvider\nconst PulseClientContext = createContext<PulseSocketIOClient | null>(null);\n\nexport const usePulseClient = () => {\n const client = useContext(PulseClientContext);\n if (!client) {\n throw new Error(\"usePulseClient must be used within a PulseProvider\");\n }\n return client;\n};\n\n// =================================================================\n// Provider\n// =================================================================\n\nexport interface PulseProviderProps {\n children: React.ReactNode;\n config: PulseConfig;\n}\n\nconst inBrowser = typeof window !== \"undefined\";\n\nexport function PulseProvider({ children, config }: PulseProviderProps) {\n const [connected, setConnected] = useState(true);\n const rrNavigate = useNavigate();\n\n const client = useMemo(\n () => new PulseSocketIOClient(`${config.serverAddress}`, rrNavigate),\n [config.serverAddress, rrNavigate]\n );\n\n useEffect(() => client.onConnectionChange(setConnected), [client]);\n\n useEffect(() => {\n if (inBrowser) {\n client.connect();\n return () => client.disconnect();\n }\n }, [client]);\n\n return (\n <PulseClientContext.Provider value={client}>\n {!connected && (\n <div\n style={{\n position: \"fixed\",\n bottom: \"20px\",\n right: \"20px\",\n backgroundColor: \"red\",\n color: \"white\",\n padding: \"10px\",\n borderRadius: \"5px\",\n zIndex: 1000,\n }}\n >\n Failed to connect to the server.\n </div>\n )}\n {children}\n </PulseClientContext.Provider>\n );\n}\n\n// =================================================================\n// View\n// =================================================================\n\nexport interface PulseViewProps {\n initialVDOM: VDOM;\n externalComponents: ComponentRegistry;\n path: string;\n}\n\nexport function PulseView({\n initialVDOM,\n externalComponents,\n path,\n}: PulseViewProps) {\n const client = usePulseClient();\n const renderer = useMemo(\n () => new VDOMRenderer(client, path, externalComponents),\n [client, path, externalComponents]\n );\n const [tree, setTree] = useState<React.ReactNode>(() =>\n renderer.renderNode(initialVDOM)\n );\n const [serverError, setServerError] = useState<ServerErrorInfo | null>(null);\n\n const location = useLocation();\n const params = useParams();\n\n const routeInfo = useMemo(() => {\n const { \"*\": catchall = \"\", ...pathParams } = params;\n const queryParams = new URLSearchParams(location.search);\n return {\n hash: location.hash,\n pathname: location.pathname,\n query: location.search,\n queryParams: Object.fromEntries(queryParams.entries()),\n pathParams,\n catchall: catchall.length > 0 ? catchall.split(\"/\") : [],\n } satisfies RouteInfo;\n }, [\n location.hash,\n location.pathname,\n location.search,\n JSON.stringify(params),\n ]);\n\n useEffect(() => {\n if (inBrowser) {\n client.mountView(path, {\n routeInfo,\n onInit: (vdom) => {\n setTree(renderer.renderNode(vdom));\n },\n onUpdate: (ops) => {\n setTree((prev) =>\n prev == null ? prev : applyUpdates(prev, ops, renderer)\n );\n },\n });\n const offErr = client.onServerError((p, err) => {\n if (p === path) setServerError(err);\n });\n return () => {\n offErr();\n client.unmount(path);\n };\n }\n // routeInfo is NOT included here on purpose\n }, [client]);\n\n useEffect(() => {\n if (inBrowser) {\n client.navigate(path, routeInfo);\n }\n }, [client, path, routeInfo]);\n\n if (serverError) {\n return <ServerError error={serverError} />;\n }\n\n return tree;\n}\n\nfunction ServerError({ error }: { error: ServerErrorInfo }) {\n return (\n <div\n style={{\n padding: 16,\n border: \"1px solid #e00\",\n background: \"#fff5f5\",\n color: \"#900\",\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n whiteSpace: \"pre-wrap\",\n }}\n >\n <div style={{ fontWeight: 700, marginBottom: 8 }}>\n Server Error during {error.phase}\n </div>\n {error.message && <div>{error.message}</div>}\n {error.stack && (\n <details open style={{ marginTop: 8 }}>\n <summary>Stack trace</summary>\n <pre style={{ margin: 0 }}>{error.stack}</pre>\n </details>\n )}\n </div>\n );\n}\n",
6
+ "import React, { isValidElement, Suspense, type ComponentType } from \"react\";\nimport type { ComponentRegistry, VDOMNode, VDOMUpdate } from \"./vdom\";\nimport {\n FRAGMENT_TAG,\n isElementNode,\n isMountPointNode,\n MOUNT_POINT_PREFIX,\n} from \"./vdom\";\nimport type { PulseSocketIOClient } from \"./client\";\n\nexport class VDOMRenderer {\n private callbackCache: Map<string, (...args: any[]) => void>;\n constructor(\n private client: PulseSocketIOClient,\n private path: string,\n private components: ComponentRegistry\n ) {\n this.callbackCache = new Map();\n }\n\n getCallback(key: string) {\n let fn = this.callbackCache.get(key);\n if (!fn) {\n fn = (...args) => this.client.invokeCallback(this.path, key, args);\n this.callbackCache.set(key, fn);\n }\n return fn;\n }\n\n renderNode(node: VDOMNode): React.ReactNode {\n // Handle primitives early\n if (\n node == null || // catches both null and undefined\n typeof node === \"boolean\" ||\n typeof node === \"number\" ||\n typeof node === \"string\"\n ) {\n return node;\n }\n\n // Element nodes\n if (isElementNode(node)) {\n const { tag, props = {}, children = [] } = node;\n\n // Process props for callbacks\n const processedProps: Record<string, any> = {};\n for (const [propKey, value] of Object.entries(props)) {\n if (typeof value === \"string\" && value.startsWith(\"$$fn:\")) {\n const callbackKey = value.substring(\"$$fn:\".length);\n processedProps[propKey] = this.getCallback(callbackKey);\n } else {\n processedProps[propKey] = value;\n }\n }\n if (node.key) {\n processedProps.key = node.key;\n }\n\n const renderedChildren = [];\n for (const child of children) {\n renderedChildren.push(this.renderNode(child));\n }\n\n if (isMountPointNode(node)) {\n const componentKey = node.tag.slice(MOUNT_POINT_PREFIX.length);\n const Component = this.components[componentKey]!;\n return React.createElement(\n Component,\n processedProps,\n ...renderedChildren\n );\n }\n\n return React.createElement(\n tag === FRAGMENT_TAG ? React.Fragment : tag,\n processedProps,\n ...renderedChildren\n );\n }\n\n // Fallback for unknown node types\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Unknown VDOM node type:\", node);\n }\n return null;\n }\n}\n\n// =================================================================\n// Update Functions (shallow-clone along update path)\n// =================================================================\n\nfunction toChildrenArrayFromElement(el: React.ReactElement): React.ReactNode[] {\n const children = (el.props as any)?.children as React.ReactNode | undefined;\n if (children == null) return [];\n return Array.isArray(children) ? children.slice() : [children];\n}\n\nfunction processPropsForCallbacks(\n renderer: VDOMRenderer,\n props: Record<string, any>\n): Record<string, any> {\n const processed: Record<string, any> = {};\n for (const [propKey, value] of Object.entries(props || {})) {\n if (typeof value === \"string\" && value.startsWith(\"$$fn:\")) {\n const callbackKey = value.substring(\"$$fn:\".length);\n processed[propKey] = renderer.getCallback(callbackKey);\n } else {\n processed[propKey] = value;\n }\n }\n return processed;\n}\n\nfunction cloneElementWithChildren(\n el: React.ReactElement,\n children: React.ReactNode[]\n): React.ReactElement {\n // Preserve existing props; only override children\n return React.cloneElement(el, undefined, ...children);\n}\n\nexport function applyUpdates(\n initialTree: React.ReactNode,\n updates: VDOMUpdate[],\n renderer: VDOMRenderer\n): React.ReactNode {\n let newTree: React.ReactNode = initialTree;\n for (const update of updates) {\n const parts = update.path\n .split(\".\")\n .filter((s) => s.length > 0)\n .map(Number);\n\n const descend = (node: React.ReactNode, depth: number): React.ReactNode => {\n if (depth < parts.length) {\n assertIsElement(node, parts, depth);\n node = node as React.ReactElement;\n const childIdx = parts[depth]!;\n const childrenArr = toChildrenArrayFromElement(node);\n const child = childrenArr[childIdx];\n childrenArr[childIdx] = descend(child, depth + 1) as any;\n return cloneElementWithChildren(node, childrenArr);\n }\n switch (update.type) {\n case \"replace\": {\n return renderer.renderNode(update.data);\n }\n case \"update_props\": {\n assertIsElement(node, parts, depth);\n node = node as React.ReactElement;\n const nextProps = processPropsForCallbacks(renderer, update.data);\n // Not passing children -> only update the props\n return React.cloneElement(node, nextProps);\n }\n case \"insert\": {\n assertIsElement(node, parts, depth);\n node = node as React.ReactElement;\n const children = toChildrenArrayFromElement(node);\n children.splice(update.idx, 0, renderer.renderNode(update.data));\n // Only update the children (TypeScript doesn't like the `null`, but that's what the official React docs say)\n return React.cloneElement(node, null!, ...children);\n }\n case \"remove\": {\n assertIsElement(node, parts, depth);\n node = node as React.ReactElement;\n const children = toChildrenArrayFromElement(node);\n children.splice(update.idx, 1);\n // Only update the children (TypeScript doesn't like the `null`, but that's what the official React docs say)\n return React.cloneElement(node, null!, ...children);\n }\n case \"move\": {\n assertIsElement(node, parts, depth);\n node = node as React.ReactElement;\n const children = toChildrenArrayFromElement(node);\n const item = children.splice(update.data.from_index, 1)[0];\n children.splice(update.data.to_index, 0, item);\n // Only update the children (TypeScript doesn't like the `null`, but that's what the official React docs say)\n return React.cloneElement(node, null!, ...children);\n }\n default:\n throw new Error(\n `[Pulse renderer] Unknown update type: ${update[\"type\"]}`\n );\n }\n };\n\n newTree = descend(newTree, 0);\n }\n return newTree;\n}\n\n// The `component` prop should be something like `() =>\n// import('~/path/to/component') (we'll need to remap if we're importing a named export and not the default)\nexport function RenderLazy(\n component: () => Promise<{ default: ComponentType<any> }>,\n fallback?: React.ReactNode\n): React.FC<React.PropsWithChildren<unknown>> {\n const Component = React.lazy(component);\n return ({ children, ...props }: React.PropsWithChildren<unknown>) => {\n return (\n <Suspense fallback={fallback ?? <></>}>\n <Component {...props}>{children}</Component>\n </Suspense>\n );\n };\n}\n\nfunction assertIsElement(\n node: React.ReactNode,\n parts: number[],\n depth: number\n): node is React.ReactElement {\n if (process.env.NODE_ENV !== \"production\" && !isValidElement(node)) {\n console.error(\"Invalid node:\", node);\n throw new Error(\"Invalid node at path \" + parts.slice(0, depth).join(\".\"));\n }\n return true;\n}\n",
7
+ "import type { ComponentType } from \"react\";\n\n// Special prefixes for reserved node types\nexport const FRAGMENT_TAG = \"$$fragment\";\nexport const MOUNT_POINT_PREFIX = \"$$\";\n\n// export type LazyComponent = () => Promise<{ default: ComponentType<any> }>;\nexport type RegistryEntry = ComponentType<any>;\nexport type ComponentRegistry = Record<string, ComponentType<any>>;\n\nexport interface VDOMElement {\n tag: string;\n props?: Record<string, any>;\n children?: VDOMNode[];\n key?: string;\n lazy?: boolean;\n}\n\n// Primitive nodes that can be rendered\nexport type PrimitiveNode = string | number | boolean;\n\n// VDOMNode is either a primitive (string, number, boolean) or an element node.\n// Booleans are valid children in React but do not render anything.\n// Mount points are just UIElementNodes with tags starting with $$ComponentKey\nexport type VDOMNode = PrimitiveNode | VDOMElement;\n\nexport type VDOM = VDOMNode;\n\nexport type UpdateType =\n | \"insert\"\n | \"remove\"\n | \"replace\"\n | \"update_props\"\n | \"move\";\n\nexport interface VDOMUpdateBase {\n type: UpdateType;\n path: string; // Dot-separated path to the node\n data?: any;\n}\n\nexport interface InsertUpdate extends VDOMUpdateBase {\n type: \"insert\";\n data: VDOMNode; // The node to insert\n idx: number;\n}\n\nexport interface RemoveUpdate extends VDOMUpdateBase {\n type: \"remove\";\n idx: number;\n}\n\nexport interface ReplaceUpdate extends VDOMUpdateBase {\n type: \"replace\";\n data: VDOMNode; // The new node\n}\n\nexport interface UpdatePropsUpdate extends VDOMUpdateBase {\n type: \"update_props\";\n data: Record<string, any>; // The new props\n}\n\nexport interface MoveUpdate extends VDOMUpdateBase {\n type: \"move\";\n data: {\n from_index: number;\n to_index: number;\n };\n}\n\nexport type VDOMUpdate =\n | InsertUpdate\n | RemoveUpdate\n | ReplaceUpdate\n | UpdatePropsUpdate\n | MoveUpdate;\n\n// Utility functions for working with the UI tree structure\nexport function isElementNode(node: VDOMNode): node is VDOMElement {\n // Matches all non-text nodes\n return typeof node === \"object\" && node !== null;\n}\n\nexport function isMountPointNode(node: VDOMNode): node is VDOMElement {\n return (\n typeof node === \"object\" &&\n node !== null &&\n node.tag.startsWith(MOUNT_POINT_PREFIX) &&\n node.tag !== FRAGMENT_TAG\n );\n}\n\nexport function isTextNode(node: VDOMNode): node is string {\n return typeof node === \"string\";\n}\n\nexport function isFragment(node: VDOMNode): boolean {\n return typeof node === \"object\" && node !== null && node.tag === FRAGMENT_TAG;\n}\n",
8
+ "\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\nexport function createExtractor<T extends object>() {\n function _createExtractor<\n const K extends readonly (keyof T)[],\n C extends Partial<Record<K[number] | string, (src: T) => any>>,\n >(keys: K, computed?: C) {\n return (\n src: T\n ): Simplify<\n Pick<T, K[number]> & {\n [P in keyof C]-?: C[P] extends (...args: any) => infer R ? R : never;\n }\n > => {\n const out: any = {};\n for (const key of keys) {\n out[key as string] = (src as any)[key as string];\n }\n if (computed) {\n for (const key in computed) {\n const fn = computed[key]!;\n out[key] = fn(src);\n }\n }\n return out;\n };\n }\n return _createExtractor;\n}",
9
+ "import { createExtractor } from \"./extractor\";\n\n// Base extractors (camelCase) similar to events.ts style\nconst ELEMENT_KEYS = [\n \"id\",\n \"className\",\n \"tagName\",\n \"localName\",\n \"clientHeight\",\n \"clientLeft\",\n \"clientTop\",\n \"clientWidth\",\n \"scrollHeight\",\n \"scrollLeft\",\n \"scrollTop\",\n \"scrollWidth\",\n \"slot\",\n] as const satisfies readonly (keyof Element)[];\n\nconst HTML_OR_SVG_KEYS = [\n \"autofocus\",\n \"tabIndex\",\n \"nonce\",\n] as const satisfies readonly (keyof HTMLOrSVGElement)[];\n\nconst HTML_ELEMENT_BASE_KEYS = [\n \"accessKey\",\n \"accessKeyLabel\",\n \"autocapitalize\",\n \"dir\",\n \"draggable\",\n \"hidden\",\n \"inert\",\n \"lang\",\n \"offsetHeight\",\n \"offsetLeft\",\n \"offsetTop\",\n \"offsetWidth\",\n \"popover\",\n \"spellcheck\",\n \"title\",\n \"translate\",\n \"writingSuggestions\",\n \"contentEditable\",\n \"enterKeyHint\",\n \"isContentEditable\",\n \"inputMode\",\n] as const satisfies readonly (keyof HTMLElement)[];\n\nconst extractElement = createExtractor<Element>()(ELEMENT_KEYS, {\n tagName: (e) => e.tagName.toLowerCase(),\n});\n\nconst extractHTMLOrSVGElement =\n createExtractor<HTMLOrSVGElement>()(HTML_OR_SVG_KEYS);\n\nconst extractHTMLElementBaseOnly = createExtractor<HTMLElement>()(\n HTML_ELEMENT_BASE_KEYS\n);\n\nfunction extractHTMLElementBase(elt: HTMLElement) {\n return {\n ...extractElement(elt),\n ...extractHTMLOrSVGElement(elt as HTMLOrSVGElement),\n ...extractHTMLElementBaseOnly(elt),\n };\n}\n\n// Helper to compose per-element extractors with the shared base\nfunction withBase<T extends HTMLElement>(\n keys: readonly (keyof T)[],\n computed?: Partial<Record<string, (src: T) => any>>\n) {\n const only = createExtractor<T>()(keys, computed as any);\n return (elt: T) => ({ ...extractHTMLElementBase(elt), ...only(elt) });\n}\n\nconst HTML_ANCHOR_KEYS = [\n \"hash\",\n \"host\",\n \"hostname\",\n \"href\",\n \"origin\",\n \"password\",\n \"pathname\",\n \"port\",\n \"protocol\",\n \"search\",\n \"target\",\n \"download\",\n \"rel\",\n \"hreflang\",\n \"type\",\n \"username\",\n \"ping\",\n \"referrerPolicy\",\n \"text\",\n] as const satisfies readonly (keyof HTMLAnchorElement)[];\nconst anchorExtractor = withBase<HTMLAnchorElement>(HTML_ANCHOR_KEYS);\n\nconst HTML_AREA_KEYS = [\n \"alt\",\n \"coords\",\n \"download\",\n \"hash\",\n \"host\",\n \"hostname\",\n \"href\",\n \"origin\",\n \"password\",\n \"pathname\",\n \"port\",\n \"protocol\",\n \"rel\",\n \"search\",\n \"shape\",\n \"target\",\n \"username\",\n \"ping\",\n \"referrerPolicy\",\n] as const satisfies readonly (keyof HTMLAreaElement)[];\nconst areaExtractor = withBase<HTMLAreaElement>(HTML_AREA_KEYS);\n\nconst HTML_MEDIA_KEYS = [\n \"autoplay\",\n \"controls\",\n \"crossOrigin\",\n \"currentSrc\",\n \"currentTime\",\n \"defaultMuted\",\n \"defaultPlaybackRate\",\n \"duration\",\n \"ended\",\n \"loop\",\n \"muted\",\n \"networkState\",\n \"paused\",\n \"playbackRate\",\n \"preload\",\n \"readyState\",\n \"seeking\",\n \"src\",\n \"volume\",\n \"preservesPitch\",\n] as const satisfies readonly (keyof HTMLMediaElement)[];\nconst mediaExtractor = withBase<HTMLMediaElement>(HTML_MEDIA_KEYS);\n\nconst audioExtractor = (elt: HTMLAudioElement) => mediaExtractor(elt);\n\nconst HTML_BUTTON_KEYS = [\n \"disabled\",\n \"name\",\n \"type\",\n \"value\",\n \"formAction\",\n \"formEnctype\",\n \"formMethod\",\n \"formNoValidate\",\n \"formTarget\",\n \"popoverTargetAction\",\n] as const satisfies readonly (keyof HTMLButtonElement)[];\nconst buttonExtractor = withBase<HTMLButtonElement>(HTML_BUTTON_KEYS);\n\nconst HTML_DATA_KEYS = [\n \"value\",\n] as const satisfies readonly (keyof HTMLDataElement)[];\nconst dataExtractor = withBase<HTMLDataElement>(HTML_DATA_KEYS);\n\nconst HTML_EMBED_KEYS = [\n \"height\",\n \"src\",\n \"type\",\n \"width\",\n \"align\",\n \"name\",\n] as const satisfies readonly (keyof HTMLEmbedElement)[];\nconst embedExtractor = withBase<HTMLEmbedElement>(HTML_EMBED_KEYS);\n\nconst HTML_FIELDSET_KEYS = [\n \"disabled\",\n \"name\",\n \"type\",\n \"validationMessage\",\n \"willValidate\",\n] as const satisfies readonly (keyof HTMLFieldSetElement)[];\nconst fieldsetExtractor = withBase<HTMLFieldSetElement>(HTML_FIELDSET_KEYS);\n\nconst HTML_FORM_KEYS = [\n \"acceptCharset\",\n \"action\",\n \"autocomplete\",\n \"encoding\",\n \"enctype\",\n \"length\",\n \"method\",\n \"name\",\n \"noValidate\",\n \"target\",\n \"rel\",\n] as const satisfies readonly (keyof HTMLFormElement)[];\nconst formExtractor = withBase<HTMLFormElement>(HTML_FORM_KEYS);\n\nconst HTML_IFRAME_KEYS = [\n \"allow\",\n \"allowFullscreen\",\n \"height\",\n \"name\",\n \"referrerPolicy\",\n \"src\",\n \"srcdoc\",\n \"width\",\n \"align\",\n \"frameBorder\",\n \"longDesc\",\n \"marginHeight\",\n \"marginWidth\",\n \"scrolling\",\n \"sandbox\",\n] as const satisfies readonly (keyof HTMLIFrameElement)[];\nconst iframeExtractor = withBase<HTMLIFrameElement>(HTML_IFRAME_KEYS);\n\nconst HTML_IMAGE_KEYS = [\n \"alt\",\n \"crossOrigin\",\n \"decoding\",\n \"height\",\n \"isMap\",\n \"loading\",\n \"naturalHeight\",\n \"naturalWidth\",\n \"referrerPolicy\",\n \"sizes\",\n \"src\",\n \"srcset\",\n \"useMap\",\n \"width\",\n \"align\",\n \"border\",\n \"complete\",\n \"hspace\",\n \"longDesc\",\n \"lowsrc\",\n \"name\",\n \"vspace\",\n \"x\",\n \"y\",\n \"fetchPriority\",\n] as const satisfies readonly (keyof HTMLImageElement)[];\nconst imageExtractor = withBase<HTMLImageElement>(HTML_IMAGE_KEYS);\n\nconst HTML_INPUT_KEYS = [\n \"accept\",\n \"alt\",\n \"autocomplete\",\n \"checked\",\n \"defaultChecked\",\n \"defaultValue\",\n \"dirName\",\n \"disabled\",\n \"height\",\n \"indeterminate\",\n \"max\",\n \"maxLength\",\n \"min\",\n \"minLength\",\n \"multiple\",\n \"name\",\n \"pattern\",\n \"placeholder\",\n \"readOnly\",\n \"required\",\n \"selectionDirection\",\n \"selectionEnd\",\n \"selectionStart\",\n \"size\",\n \"src\",\n \"step\",\n \"type\",\n \"value\",\n \"valueAsNumber\",\n \"width\",\n \"align\",\n \"capture\",\n \"formAction\",\n \"formEnctype\",\n \"formMethod\",\n \"formNoValidate\",\n \"formTarget\",\n \"useMap\",\n \"validationMessage\",\n \"willValidate\",\n \"popoverTargetAction\",\n] as const satisfies readonly (keyof HTMLInputElement)[];\nconst inputExtractor = withBase<HTMLInputElement>(HTML_INPUT_KEYS);\n\nconst HTML_LABEL_KEYS = [\n \"htmlFor\",\n] as const satisfies readonly (keyof HTMLLabelElement)[];\nconst labelExtractor = withBase<HTMLLabelElement>(HTML_LABEL_KEYS);\n\nconst HTML_LI_KEYS = [\n \"value\",\n \"type\",\n] as const satisfies readonly (keyof HTMLLIElement)[];\nconst liExtractor = withBase<HTMLLIElement>(HTML_LI_KEYS);\n\nconst HTML_LINK_KEYS = [\n \"as\",\n \"crossOrigin\",\n \"disabled\",\n \"fetchPriority\",\n \"href\",\n \"hreflang\",\n \"imageSizes\",\n \"imageSrcset\",\n \"integrity\",\n \"media\",\n \"referrerPolicy\",\n \"rel\",\n \"type\",\n \"charset\",\n \"rev\",\n \"target\",\n \"sizes\",\n] as const satisfies readonly (keyof HTMLLinkElement)[];\nconst linkExtractor = withBase<HTMLLinkElement>(HTML_LINK_KEYS);\n\nconst HTML_MAP_KEYS = [\n \"name\",\n] as const satisfies readonly (keyof HTMLMapElement)[];\nconst mapExtractor = withBase<HTMLMapElement>(HTML_MAP_KEYS);\n\nconst HTML_METER_KEYS = [\n \"high\",\n \"low\",\n \"max\",\n \"min\",\n \"optimum\",\n \"value\",\n] as const satisfies readonly (keyof HTMLMeterElement)[];\nconst meterExtractor = withBase<HTMLMeterElement>(HTML_METER_KEYS);\n\nconst HTML_MOD_KEYS = [\n \"cite\",\n \"dateTime\",\n] as const satisfies readonly (keyof HTMLModElement)[];\nconst modExtractor = withBase<HTMLModElement>(HTML_MOD_KEYS);\n\nconst HTML_OL_KEYS = [\n \"reversed\",\n \"start\",\n \"type\",\n \"compact\",\n] as const satisfies readonly (keyof HTMLOListElement)[];\nconst olistExtractor = withBase<HTMLOListElement>(HTML_OL_KEYS);\n\nconst HTML_OBJECT_KEYS = [\n \"data\",\n \"height\",\n \"name\",\n \"type\",\n \"useMap\",\n \"width\",\n \"validationMessage\",\n \"willValidate\",\n \"align\",\n \"archive\",\n \"border\",\n \"code\",\n \"codeBase\",\n \"codeType\",\n \"declare\",\n \"hspace\",\n \"standby\",\n \"vspace\",\n] as const satisfies readonly (keyof HTMLObjectElement)[];\nconst objectExtractor = withBase<HTMLObjectElement>(HTML_OBJECT_KEYS);\n\nconst HTML_OPTGROUP_KEYS = [\n \"disabled\",\n \"label\",\n] as const satisfies readonly (keyof HTMLOptGroupElement)[];\nconst optgroupExtractor = withBase<HTMLOptGroupElement>(HTML_OPTGROUP_KEYS);\n\nconst HTML_OPTION_KEYS = [\n \"defaultSelected\",\n \"disabled\",\n \"index\",\n \"label\",\n \"selected\",\n \"text\",\n \"value\",\n] as const satisfies readonly (keyof HTMLOptionElement)[];\nconst optionExtractor = withBase<HTMLOptionElement>(HTML_OPTION_KEYS);\n\nconst HTML_OUTPUT_KEYS = [\n \"defaultValue\",\n \"name\",\n \"type\",\n \"value\",\n \"htmlFor\",\n \"validationMessage\",\n \"willValidate\",\n] as const satisfies readonly (keyof HTMLOutputElement)[];\nconst outputExtractor = withBase<HTMLOutputElement>(HTML_OUTPUT_KEYS);\n\nconst HTML_PROGRESS_KEYS = [\n \"max\",\n \"position\",\n \"value\",\n] as const satisfies readonly (keyof HTMLProgressElement)[];\nconst progressExtractor = withBase<HTMLProgressElement>(HTML_PROGRESS_KEYS);\n\nconst HTML_QUOTE_KEYS = [\n \"cite\",\n] as const satisfies readonly (keyof HTMLQuoteElement)[];\nconst quoteExtractor = withBase<HTMLQuoteElement>(HTML_QUOTE_KEYS);\n\nconst citeExtractor = (elt: HTMLElement) => extractHTMLElementBase(elt);\n\nconst HTML_SCRIPT_KEYS = [\n \"async\",\n \"crossOrigin\",\n \"defer\",\n \"fetchPriority\",\n \"integrity\",\n \"noModule\",\n \"referrerPolicy\",\n \"src\",\n \"text\",\n \"type\",\n \"charset\",\n] as const satisfies readonly (keyof HTMLScriptElement)[];\nconst extractHTMLScriptOnly = createExtractor<HTMLScriptElement>()(\n HTML_SCRIPT_KEYS,\n {\n event: (s) => (s as any).event,\n htmlFor: (s) => (s as any).htmlFor,\n }\n);\nconst scriptExtractor = (elt: HTMLScriptElement) => ({\n ...extractHTMLElementBase(elt),\n ...extractHTMLScriptOnly(elt),\n});\n\nconst HTML_SELECT_KEYS = [\n \"autocomplete\",\n \"disabled\",\n \"length\",\n \"multiple\",\n \"name\",\n \"required\",\n \"selectedIndex\",\n \"size\",\n \"type\",\n \"value\",\n \"validationMessage\",\n \"willValidate\",\n] as const satisfies readonly (keyof HTMLSelectElement)[];\nconst selectExtractor = withBase<HTMLSelectElement>(HTML_SELECT_KEYS);\n\nconst HTML_SLOT_KEYS = [\n \"name\",\n] as const satisfies readonly (keyof HTMLSlotElement)[];\nconst slotExtractor = withBase<HTMLSlotElement>(HTML_SLOT_KEYS);\n\nconst HTML_SOURCE_KEYS = [\n \"height\",\n \"media\",\n \"sizes\",\n \"src\",\n \"srcset\",\n \"type\",\n \"width\",\n] as const satisfies readonly (keyof HTMLSourceElement)[];\nconst sourceExtractor = withBase<HTMLSourceElement>(HTML_SOURCE_KEYS);\n\nconst HTML_TABLE_CAPTION_KEYS = [\n \"align\",\n] as const satisfies readonly (keyof HTMLTableCaptionElement)[];\nconst tableCaptionExtractor = withBase<HTMLTableCaptionElement>(\n HTML_TABLE_CAPTION_KEYS\n);\n\nconst HTML_TABLE_CELL_KEYS = [\n \"abbr\",\n \"cellIndex\",\n \"colSpan\",\n \"headers\",\n \"rowSpan\",\n \"scope\",\n \"align\",\n \"axis\",\n \"bgColor\",\n \"ch\",\n \"chOff\",\n \"height\",\n \"noWrap\",\n \"vAlign\",\n \"width\",\n] as const satisfies readonly (keyof HTMLTableCellElement)[];\nconst tableCellExtractor = withBase<HTMLTableCellElement>(HTML_TABLE_CELL_KEYS);\n\nconst HTML_TABLE_COL_KEYS = [\n \"span\",\n \"align\",\n \"ch\",\n \"chOff\",\n \"vAlign\",\n \"width\",\n] as const satisfies readonly (keyof HTMLTableColElement)[];\nconst tableColExtractor = withBase<HTMLTableColElement>(HTML_TABLE_COL_KEYS);\n\nconst HTML_TABLE_KEYS = [\n \"align\",\n \"bgColor\",\n \"border\",\n \"cellPadding\",\n \"cellSpacing\",\n \"frame\",\n \"rules\",\n \"summary\",\n \"width\",\n] as const satisfies readonly (keyof HTMLTableElement)[];\nconst tableExtractor = withBase<HTMLTableElement>(HTML_TABLE_KEYS);\n\nconst HTML_TR_KEYS = [\n \"rowIndex\",\n \"sectionRowIndex\",\n \"align\",\n \"bgColor\",\n \"ch\",\n \"chOff\",\n \"vAlign\",\n] as const satisfies readonly (keyof HTMLTableRowElement)[];\nconst tableRowExtractor = withBase<HTMLTableRowElement>(HTML_TR_KEYS);\n\nconst HTML_TSECTION_KEYS = [\n \"align\",\n \"ch\",\n \"chOff\",\n \"vAlign\",\n] as const satisfies readonly (keyof HTMLTableSectionElement)[];\nconst tableSectionExtractor =\n withBase<HTMLTableSectionElement>(HTML_TSECTION_KEYS);\n\nconst templateExtractor = (elt: HTMLTemplateElement) =>\n extractHTMLElementBase(elt);\n\nconst HTML_TEXTAREA_KEYS = [\n \"autocomplete\",\n \"cols\",\n \"defaultValue\",\n \"dirName\",\n \"disabled\",\n \"maxLength\",\n \"minLength\",\n \"name\",\n \"placeholder\",\n \"readOnly\",\n \"required\",\n \"rows\",\n \"selectionDirection\",\n \"selectionEnd\",\n \"selectionStart\",\n \"value\",\n \"wrap\",\n \"textLength\",\n \"validationMessage\",\n \"willValidate\",\n] as const satisfies readonly (keyof HTMLTextAreaElement)[];\nconst textareaExtractor = withBase<HTMLTextAreaElement>(HTML_TEXTAREA_KEYS);\n\nconst HTML_TIME_KEYS = [\n \"dateTime\",\n] as const satisfies readonly (keyof HTMLTimeElement)[];\nconst timeExtractor = withBase<HTMLTimeElement>(HTML_TIME_KEYS);\n\nconst HTML_TRACK_KEYS = [\n \"default\",\n \"kind\",\n \"label\",\n \"readyState\",\n \"src\",\n \"srclang\",\n] as const satisfies readonly (keyof HTMLTrackElement)[];\nconst trackExtractor = withBase<HTMLTrackElement>(HTML_TRACK_KEYS);\n\nconst HTML_VIDEO_KEYS = [\n \"height\",\n \"poster\",\n \"videoHeight\",\n \"videoWidth\",\n \"width\",\n \"playsInline\",\n] as const satisfies readonly (keyof HTMLVideoElement)[];\nconst extractHTMLVideoOnly =\n createExtractor<HTMLVideoElement>()(HTML_VIDEO_KEYS);\nconst videoExtractor = (elt: HTMLVideoElement) => ({\n ...mediaExtractor(elt),\n ...extractHTMLVideoOnly(elt),\n});\n\nconst HTML_BR_KEYS = [\n \"clear\",\n] as const satisfies readonly (keyof HTMLBRElement)[];\nconst brExtractor = withBase<HTMLBRElement>(HTML_BR_KEYS);\n\nconst HTML_BASE_KEYS = [\n \"href\",\n \"target\",\n] as const satisfies readonly (keyof HTMLBaseElement)[];\nconst baseExtractor = withBase<HTMLBaseElement>(HTML_BASE_KEYS);\n\nconst HTML_BODY_KEYS = [\n \"aLink\",\n \"background\",\n \"bgColor\",\n \"link\",\n \"text\",\n \"vLink\",\n] as const satisfies readonly (keyof HTMLBodyElement)[];\nconst bodyExtractor = withBase<HTMLBodyElement>(HTML_BODY_KEYS);\n\nconst HTML_DLIST_KEYS = [\n \"compact\",\n] as const satisfies readonly (keyof HTMLDListElement)[];\nconst dlistExtractor = withBase<HTMLDListElement>(HTML_DLIST_KEYS);\n\nconst HTML_DETAILS_KEYS = [\n \"open\",\n] as const satisfies readonly (keyof HTMLDetailsElement)[];\nconst detailsExtractor = withBase<HTMLDetailsElement>(HTML_DETAILS_KEYS);\n\nconst HTML_DIALOG_KEYS = [\n \"open\",\n \"returnValue\",\n] as const satisfies readonly (keyof HTMLDialogElement)[];\nconst dialogExtractor = withBase<HTMLDialogElement>(HTML_DIALOG_KEYS);\n\nconst HTML_DIV_KEYS = [\n \"align\",\n] as const satisfies readonly (keyof HTMLDivElement)[];\nconst divExtractor = withBase<HTMLDivElement>(HTML_DIV_KEYS);\n\nconst headExtractor = (elt: HTMLHeadElement) => extractHTMLElementBase(elt);\n\nconst HTML_HEADING_KEYS = [\n \"align\",\n] as const satisfies readonly (keyof HTMLHeadingElement)[];\nconst headingExtractor = withBase<HTMLHeadingElement>(HTML_HEADING_KEYS);\n\nconst HTML_HR_KEYS = [\n \"align\",\n \"color\",\n \"noShade\",\n \"size\",\n \"width\",\n] as const satisfies readonly (keyof HTMLHRElement)[];\nconst hrExtractor = withBase<HTMLHRElement>(HTML_HR_KEYS);\n\nconst HTML_HTML_KEYS = [\n \"version\",\n] as const satisfies readonly (keyof HTMLHtmlElement)[];\nconst htmlExtractor = withBase<HTMLHtmlElement>(HTML_HTML_KEYS);\n\nconst menuExtractor = (elt: HTMLMenuElement) => extractHTMLElementBase(elt);\n\nconst HTML_META_KEYS = [\n \"content\",\n \"httpEquiv\",\n \"name\",\n \"scheme\",\n] as const satisfies readonly (keyof HTMLMetaElement)[];\nconst metaExtractor = withBase<HTMLMetaElement>(HTML_META_KEYS);\n\nconst HTML_P_KEYS = [\n \"align\",\n] as const satisfies readonly (keyof HTMLParagraphElement)[];\nconst paragraphExtractor = withBase<HTMLParagraphElement>(HTML_P_KEYS);\n\nconst pictureExtractor = (elt: HTMLPictureElement) =>\n extractHTMLElementBase(elt);\n\nconst HTML_PRE_KEYS = [\n \"width\",\n] as const satisfies readonly (keyof HTMLPreElement)[];\nconst preExtractor = withBase<HTMLPreElement>(HTML_PRE_KEYS);\n\nconst spanExtractor = (elt: HTMLSpanElement) => extractHTMLElementBase(elt);\n\nconst HTML_STYLE_KEYS = [\n \"media\",\n \"type\",\n \"disabled\",\n] as const satisfies readonly (keyof HTMLStyleElement)[];\nconst styleExtractor = withBase<HTMLStyleElement>(HTML_STYLE_KEYS);\n\nconst HTML_TITLE_KEYS = [\n \"text\",\n] as const satisfies readonly (keyof HTMLTitleElement)[];\nconst titleExtractor = withBase<HTMLTitleElement>(HTML_TITLE_KEYS);\n\nconst HTML_UL_KEYS = [\n \"compact\",\n \"type\",\n] as const satisfies readonly (keyof HTMLUListElement)[];\nconst ulistExtractor = withBase<HTMLUListElement>(HTML_UL_KEYS);\n\n// Map of tagName -> extractor (concise, like events.ts)\nconst elementExtractors: Record<string, (elt: any) => object> = {\n A: anchorExtractor,\n AREA: areaExtractor,\n AUDIO: audioExtractor,\n BASE: baseExtractor,\n BLOCKQUOTE: quoteExtractor,\n Q: quoteExtractor,\n BODY: bodyExtractor,\n BR: brExtractor,\n BUTTON: buttonExtractor,\n CANVAS: extractHTMLElementBase,\n CAPTION: tableCaptionExtractor,\n CITE: citeExtractor,\n COL: tableColExtractor,\n COLGROUP: tableColExtractor,\n DATA: dataExtractor,\n DETAILS: detailsExtractor,\n DIALOG: dialogExtractor,\n DIV: divExtractor,\n DL: dlistExtractor,\n EMBED: embedExtractor,\n FIELDSET: fieldsetExtractor,\n FORM: formExtractor,\n H1: headingExtractor,\n H2: headingExtractor,\n H3: headingExtractor,\n H4: headingExtractor,\n H5: headingExtractor,\n H6: headingExtractor,\n HEAD: headExtractor,\n HR: hrExtractor,\n HTML: htmlExtractor,\n IFRAME: iframeExtractor,\n IMG: imageExtractor,\n INPUT: inputExtractor,\n LABEL: labelExtractor,\n LI: liExtractor,\n LINK: linkExtractor,\n MAP: mapExtractor,\n MENU: menuExtractor,\n META: metaExtractor,\n METER: meterExtractor,\n INS: modExtractor,\n DEL: modExtractor,\n OBJECT: objectExtractor,\n OL: olistExtractor,\n OPTGROUP: optgroupExtractor,\n OPTION: optionExtractor,\n OUTPUT: outputExtractor,\n P: paragraphExtractor,\n PICTURE: pictureExtractor,\n PRE: preExtractor,\n PROGRESS: progressExtractor,\n SCRIPT: scriptExtractor,\n SELECT: selectExtractor,\n SLOT: slotExtractor,\n SOURCE: sourceExtractor,\n SPAN: spanExtractor,\n STYLE: styleExtractor,\n TABLE: tableExtractor,\n TBODY: tableSectionExtractor,\n THEAD: tableSectionExtractor,\n TFOOT: tableSectionExtractor,\n TD: tableCellExtractor,\n TH: tableCellExtractor,\n TEMPLATE: templateExtractor,\n TEXTAREA: textareaExtractor,\n TIME: timeExtractor,\n TITLE: titleExtractor,\n TR: tableRowExtractor,\n TRACK: trackExtractor,\n UL: ulistExtractor,\n VIDEO: videoExtractor,\n};\n\nexport function extractHTMLElement(elt: HTMLElement): object {\n const tagName = elt.tagName.toUpperCase();\n\n const extractor = elementExtractors[tagName];\n if (extractor) {\n return extractor(elt);\n }\n throw new Error(\n `Unexpected HTML element tag: ${elt.tagName} (update .web/custom/serialize.ts)`\n );\n}\n",
10
+ "/* === IMPORTANT === */\n\nimport { extractHTMLElement } from \"./elements\";\nimport { createExtractor } from \"./extractor\";\n\nconst SYNTHETIC_KEYS = [\n \"target\",\n \"bubbles\",\n \"cancelable\",\n \"defaultPrevented\",\n \"eventPhase\",\n \"isTrusted\",\n \"timeStamp\",\n \"type\",\n] as const satisfies readonly (keyof React.SyntheticEvent)[];\n\nconst UI_KEYS = [\n ...SYNTHETIC_KEYS,\n \"detail\",\n] as const satisfies readonly (keyof React.UIEvent)[];\n\nconst MOUSE_KEYS = [\n ...UI_KEYS,\n \"altKey\",\n \"button\",\n \"buttons\",\n \"clientX\",\n \"clientY\",\n \"ctrlKey\",\n \"metaKey\",\n \"movementX\",\n \"movementY\",\n \"pageX\",\n \"pageY\",\n \"screenX\",\n \"screenY\",\n \"shiftKey\",\n] as const satisfies readonly (keyof React.MouseEvent)[];\n\nconst POINTER_KEYS = [\n ...MOUSE_KEYS,\n \"pointerId\",\n \"pressure\",\n \"tangentialPressure\",\n \"tiltX\",\n \"tiltY\",\n \"twist\",\n \"width\",\n \"height\",\n \"pointerType\",\n \"isPrimary\",\n] as const satisfies readonly (keyof React.PointerEvent)[];\n\nconst syntheticExtractor = createExtractor<React.SyntheticEvent>()(\n SYNTHETIC_KEYS,\n {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n }\n);\n\nconst uiExtractor = createExtractor<React.UIEvent>()(UI_KEYS, {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n});\n\nconst mouseExtractor = createExtractor<React.MouseEvent>()(MOUSE_KEYS, {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n relatedTarget: (e) =>\n e.relatedTarget ? extractHTMLElement(e.relatedTarget as HTMLElement) : null,\n});\n\nconst clipboardExtractor = createExtractor<React.ClipboardEvent>()(\n SYNTHETIC_KEYS,\n {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n clipboardData: (e) => extractDataTransfer(e.clipboardData),\n }\n);\n\nconst compositionExtractor = createExtractor<React.CompositionEvent>()(\n [...SYNTHETIC_KEYS, \"data\"] as const,\n { target: (e) => extractHTMLElement(e.target as HTMLElement) }\n);\n\nconst dragExtractor = createExtractor<React.DragEvent>()(MOUSE_KEYS, {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n relatedTarget: (e) =>\n e.relatedTarget ? extractHTMLElement(e.relatedTarget as HTMLElement) : null,\n dataTransfer: (e) => extractDataTransfer(e.dataTransfer),\n});\n\nconst pointerExtractor = createExtractor<React.PointerEvent>()(POINTER_KEYS, {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n relatedTarget: (e) =>\n e.relatedTarget ? extractHTMLElement(e.relatedTarget as HTMLElement) : null,\n});\n\nconst focusExtractor = createExtractor<React.FocusEvent>()(SYNTHETIC_KEYS, {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n relatedTarget: (e) =>\n e.relatedTarget ? extractHTMLElement(e.relatedTarget as HTMLElement) : null,\n});\n\nconst formExtractor = createExtractor<React.FormEvent>()(SYNTHETIC_KEYS, {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n});\n\nconst invalidExtractor = createExtractor<React.InvalidEvent>()(SYNTHETIC_KEYS, {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n});\n\nconst changeExtractor = createExtractor<React.ChangeEvent>()(SYNTHETIC_KEYS, {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n});\n\nconst keyboardExtractor = createExtractor<React.KeyboardEvent>()(\n [\n ...UI_KEYS,\n \"altKey\",\n \"ctrlKey\",\n \"code\",\n \"key\",\n \"locale\",\n \"location\",\n \"metaKey\",\n \"repeat\",\n \"shiftKey\",\n ] as const,\n { target: (e) => extractHTMLElement(e.target as HTMLElement) }\n);\n\nconst touchExtractor = createExtractor<React.TouchEvent>()(\n [\n ...UI_KEYS,\n \"altKey\",\n \"ctrlKey\",\n \"metaKey\",\n \"shiftKey\",\n \"changedTouches\",\n \"targetTouches\",\n \"touches\",\n ] as const,\n {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n changedTouches: (e) => mapTouchList(e.changedTouches),\n targetTouches: (e) => mapTouchList(e.targetTouches),\n touches: (e) => mapTouchList(e.touches),\n }\n);\n\nconst wheelExtractor = createExtractor<React.WheelEvent>()(\n [...MOUSE_KEYS, \"deltaMode\", \"deltaX\", \"deltaY\", \"deltaZ\"] as const,\n {\n target: (e) => extractHTMLElement(e.target as HTMLElement),\n relatedTarget: (e) =>\n e.relatedTarget\n ? extractHTMLElement(e.relatedTarget as HTMLElement)\n : null,\n }\n);\n\nconst animationExtractor = createExtractor<React.AnimationEvent>()(\n [...SYNTHETIC_KEYS, \"animationName\", \"elapsedTime\", \"pseudoElement\"] as const,\n { target: (e) => extractHTMLElement(e.target as HTMLElement) }\n);\n\nconst toggleExtractor = createExtractor<React.ToggleEvent>()(\n [...SYNTHETIC_KEYS, \"oldState\", \"newState\"] as const,\n { target: (e) => extractHTMLElement(e.target as HTMLElement) }\n);\n\nconst transitionExtractor = createExtractor<React.TransitionEvent>()(\n [...SYNTHETIC_KEYS, \"elapsedTime\", \"propertyName\", \"pseudoElement\"] as const,\n { target: (e) => extractHTMLElement(e.target as HTMLElement) }\n);\n\nfunction mapTouchList(list: any): any[] {\n return Array.from(list as ArrayLike<any>).map((touch: any) => ({\n target: extractHTMLElement(touch.target as HTMLElement),\n identifier: touch.identifier,\n screenX: touch.screenX,\n screenY: touch.screenY,\n clientX: touch.clientX,\n clientY: touch.clientY,\n pageX: touch.pageX,\n pageY: touch.pageY,\n }));\n}\n\n// Helper function to extract DataTransfer properties\nfunction extractDataTransfer(dt: DataTransfer | null): object | null {\n if (!dt) {\n return null;\n }\n const items = [];\n if (dt.items) {\n for (let i = 0; i < dt.items.length; i++) {\n const item = dt.items[i]!;\n items.push({\n kind: item.kind,\n type: item.type,\n });\n }\n }\n return {\n drop_effect: dt.dropEffect,\n effect_allowed: dt.effectAllowed,\n items: items,\n types: Array.from(dt.types || []),\n };\n}\n\nconst eventExtractorMap: { [key: string]: (evt: any) => object } = {\n // Pointer Events\n pointerdown: pointerExtractor,\n pointermove: pointerExtractor,\n pointerup: pointerExtractor,\n pointercancel: pointerExtractor,\n gotpointercapture: pointerExtractor,\n lostpointercapture: pointerExtractor,\n pointerenter: pointerExtractor,\n pointerleave: pointerExtractor,\n pointerover: pointerExtractor,\n pointerout: pointerExtractor,\n\n // Mouse Events\n click: mouseExtractor,\n contextmenu: mouseExtractor,\n dblclick: mouseExtractor,\n mousedown: mouseExtractor,\n mouseenter: mouseExtractor,\n mouseleave: mouseExtractor,\n mousemove: mouseExtractor,\n mouseout: mouseExtractor,\n mouseover: mouseExtractor,\n mouseup: mouseExtractor,\n\n // Drag Events\n drag: dragExtractor,\n dragend: dragExtractor,\n dragenter: dragExtractor,\n dragexit: dragExtractor,\n dragleave: dragExtractor,\n dragover: dragExtractor,\n dragstart: dragExtractor,\n drop: dragExtractor,\n\n // Keyboard Events\n keydown: keyboardExtractor,\n keypress: keyboardExtractor,\n keyup: keyboardExtractor,\n\n // Focus Events\n focus: focusExtractor,\n blur: focusExtractor,\n\n // Form Events\n change: changeExtractor,\n input: changeExtractor, // often used with change\n invalid: invalidExtractor,\n reset: formExtractor,\n submit: formExtractor,\n\n // Clipboard Events\n copy: clipboardExtractor,\n cut: clipboardExtractor,\n paste: clipboardExtractor,\n\n // Composition Events\n compositionend: compositionExtractor,\n compositionstart: compositionExtractor,\n compositionupdate: compositionExtractor,\n\n // Touch Events\n touchcancel: touchExtractor,\n touchend: touchExtractor,\n touchmove: touchExtractor,\n touchstart: touchExtractor,\n\n // UI Events\n scroll: uiExtractor,\n\n // Wheel Events\n wheel: wheelExtractor,\n\n // Animation Events\n animationstart: animationExtractor,\n animationend: animationExtractor,\n animationiteration: animationExtractor,\n\n // Transition Events\n transitionend: transitionExtractor,\n\n // Toggle Events\n toggle: toggleExtractor,\n};\n\nexport function extractEvent(value: any): any {\n // Duck-typing for React's SyntheticEvent.\n // We check for properties that are unique to synthetic events.\n if (\n value &&\n typeof value === \"object\" &&\n \"nativeEvent\" in value &&\n typeof value.isDefaultPrevented === \"function\"\n ) {\n const evt = value as React.SyntheticEvent;\n // The `type` property is crucial for the lookup.\n if (typeof evt.type !== \"string\") {\n return value;\n }\n\n const extractor = eventExtractorMap[evt.type.toLowerCase()];\n if (extractor) {\n return extractor(evt);\n }\n\n // Fallback for unknown event types: minimal synthetic extractor\n return syntheticExtractor(evt);\n }\n\n // If it's not a duck-typed event, return it as is.\n return value;\n}\n",
11
+ "// Simple object transformation for socket.io transport\n// Handles Dates, Files (via socket.io binary), FormData, and circular references\n\nfunction isDate(value: unknown): value is Date {\n return value instanceof Date;\n}\n\nfunction isFile(value: unknown): value is File {\n return typeof File !== \"undefined\" && value instanceof File;\n}\n\nfunction isFormData(value: unknown): value is FormData {\n return typeof FormData !== \"undefined\" && value instanceof FormData;\n}\n\nexport function stringify(input: unknown): unknown {\n const seen = new Map<object, number>();\n let nextId = 1;\n\n const transform = (value: unknown): unknown => {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n\n // Handle circular references\n const obj = value as object;\n if (seen.has(obj)) {\n return { __ref: seen.get(obj) };\n }\n\n // Special type transformations\n if (isDate(value)) {\n const id = nextId++;\n seen.set(obj, id);\n return { __pulse: \"date\", __id: id, timestamp: value.getTime() };\n }\n\n if (isFile(value)) {\n // Socket.io can handle File objects directly, just add metadata wrapper\n const id = nextId++;\n seen.set(obj, id);\n return {\n __pulse: \"file\",\n __id: id,\n name: value.name,\n type: value.type,\n size: value.size,\n lastModified: value.lastModified,\n file: value, // socket.io will handle the binary data\n };\n }\n\n if (isFormData(value)) {\n const id = nextId++;\n seen.set(obj, id);\n const fields: Record<string, unknown | unknown[]> = {};\n\n for (const [key, val] of value.entries()) {\n const transformedVal = transform(val);\n if (Object.prototype.hasOwnProperty.call(fields, key)) {\n const existing = fields[key];\n if (Array.isArray(existing)) {\n existing.push(transformedVal);\n } else {\n fields[key] = [existing, transformedVal];\n }\n } else {\n fields[key] = transformedVal;\n }\n }\n\n return { __pulse: \"formdata\", __id: id, fields };\n }\n\n // Regular objects and arrays\n const id = nextId++;\n seen.set(obj, id);\n\n if (Array.isArray(value)) {\n return {\n __pulse: \"array\",\n __id: id,\n items: value.map(transform),\n };\n }\n\n // Plain objects - use __pulse_data to avoid conflicts\n const userData: Record<string, unknown> = {};\n for (const key in value as Record<string, unknown>) {\n const v = (value as Record<string, unknown>)[key];\n if (\n typeof v === \"function\" ||\n typeof v === \"symbol\" ||\n typeof v === \"undefined\"\n ) {\n continue;\n }\n userData[key] = transform(v);\n }\n\n return { __pulse: \"object\", __id: id, __data: userData };\n };\n\n return transform(input);\n}\n\nexport function parse(input: unknown): unknown {\n const objects = new Map<number, unknown>();\n\n const resolve = (value: unknown): unknown => {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(resolve);\n }\n\n const obj = value as Record<string, unknown>;\n\n // Handle references\n if (obj.__ref !== undefined) {\n const id = obj.__ref as number;\n return objects.get(id) || null;\n }\n\n // Handle special types (only if they have __pulse marker)\n if (obj.__pulse === \"date\") {\n const id = obj.__id as number;\n const resolved = new Date(obj.timestamp as number);\n objects.set(id, resolved);\n return resolved;\n }\n\n if (obj.__pulse === \"file\") {\n const id = obj.__id as number;\n // Return the original File object directly (socket.io preserves it)\n const resolved = obj.file as File;\n objects.set(id, resolved);\n return resolved;\n }\n\n if (obj.__pulse === \"formdata\") {\n const id = obj.__id as number;\n const fields = obj.fields as Record<string, unknown | unknown[]>;\n\n // Reconstruct FormData object\n const resolved = new FormData();\n objects.set(id, resolved);\n\n for (const [key, v] of Object.entries(fields)) {\n if (Array.isArray(v)) {\n // Multiple values for same key\n for (const item of v) {\n const resolvedItem = resolve(item);\n resolved.append(key, resolvedItem as string | File);\n }\n } else {\n const resolvedValue = resolve(v);\n resolved.append(key, resolvedValue as string | File);\n }\n }\n\n return resolved;\n }\n\n if (obj.__pulse === \"array\") {\n const id = obj.__id as number;\n const resolved: unknown[] = [];\n objects.set(id, resolved);\n\n const items = obj.items as unknown[];\n for (let i = 0; i < items.length; i++) {\n resolved[i] = resolve(items[i]);\n }\n return resolved;\n }\n\n if (obj.__pulse === \"object\") {\n const id = obj.__id as number;\n const resolved: Record<string, unknown> = {};\n objects.set(id, resolved);\n\n const userData = obj.__data as Record<string, unknown>;\n for (const [key, v] of Object.entries(userData)) {\n resolved[key] = resolve(v);\n }\n return resolved;\n }\n\n // Unknown object type - process properties\n const result: Record<string, unknown> = {};\n for (const [key, v] of Object.entries(obj)) {\n result[key] = resolve(v);\n }\n return result;\n };\n\n return resolve(input);\n}\n",
12
+ "import type { RouteInfo } from \"./helpers\";\nimport type { ClientMountMessage } from \"./messages\";\nimport type { VDOM, VDOMUpdate } from \"./vdom\";\nimport { extractEvent } from \"./serialize/events\";\nimport {\n stringify as flattedStringify,\n parse as flattedParse,\n} from \"./serialize/flatted\";\n\nimport { io, Socket } from \"socket.io-client\";\nimport type {\n ClientApiResultMessage,\n ClientMessage,\n ServerApiCallMessage,\n ServerErrorInfo,\n ServerMessage,\n} from \"./messages\";\n\nexport interface MountedView {\n routeInfo: RouteInfo;\n onInit: (vdom: VDOM) => void;\n onUpdate: (ops: VDOMUpdate[]) => void;\n}\nexport type ConnectionStatusListener = (connected: boolean) => void;\nexport type ServerErrorListener = (\n path: string,\n error: ServerErrorInfo | null\n) => void;\n\nexport interface PulseClient {\n // Connection management\n connect(): Promise<void>;\n disconnect(): void;\n isConnected(): boolean;\n onConnectionChange(listener: ConnectionStatusListener): () => void;\n // Messages\n navigate(path: string, routeInfo: RouteInfo): Promise<void>;\n leave(path: string): Promise<void>;\n invokeCallback(path: string, callback: string, args: any[]): Promise<void>;\n // VDOM subscription\n mountView(path: string, view: MountedView): () => void;\n}\n\nexport class PulseSocketIOClient {\n private activeViews: Map<string, MountedView>;\n private socket: Socket | null = null;\n private messageQueue: ClientMessage[];\n private connectionListeners: Set<ConnectionStatusListener> = new Set();\n private serverErrors: Map<string, ServerErrorInfo> = new Map();\n private serverErrorListeners: Set<ServerErrorListener> = new Set();\n\n constructor(\n private url: string,\n private frameworkNavigate?: (to: string) => void\n ) {\n this.socket = null;\n this.activeViews = new Map();\n this.messageQueue = [];\n }\n public isConnected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public async connect(): Promise<void> {\n if (this.socket) {\n return;\n }\n return new Promise((resolve, reject) => {\n const socket = io(this.url, {\n transports: [\"websocket\"],\n });\n this.socket = socket;\n\n socket.on(\"connect\", () => {\n console.log(\"[SocketIOTransport] Connected:\", this.socket?.id);\n // Make sure to send a navigate payload for all the routes\n for (const [path, route] of this.activeViews) {\n socket.emit(\n \"message\",\n flattedStringify({\n type: \"mount\",\n path: path,\n routeInfo: route.routeInfo,\n } satisfies ClientMountMessage)\n );\n }\n\n for (const payload of this.messageQueue) {\n // Already sent above\n if (payload.type === \"mount\" && this.activeViews.has(payload.path)) {\n continue;\n }\n // We're remounting all the routes, so no need to navigate\n if (payload.type === \"navigate\") {\n continue;\n }\n socket.emit(\"message\", flattedStringify(payload));\n }\n this.messageQueue = [];\n\n this.notifyConnectionListeners(true);\n resolve();\n });\n\n socket.on(\"connect_error\", (err) => {\n console.error(\"[SocketIOTransport] Connection failed:\", err);\n this.notifyConnectionListeners(false);\n reject(err);\n });\n\n socket.on(\"disconnect\", () => {\n console.log(\"[SocketIOTransport] Disconnected\");\n this.notifyConnectionListeners(false);\n });\n\n // Wrap in an arrow function to avoid losing the `this` reference\n socket.on(\"message\", (data) =>\n this.handleServerMessage(flattedParse(data) as ServerMessage)\n );\n });\n }\n\n onConnectionChange(listener: ConnectionStatusListener): () => void {\n this.connectionListeners.add(listener);\n listener(this.isConnected());\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n private notifyConnectionListeners(connected: boolean): void {\n for (const listener of this.connectionListeners) {\n listener(connected);\n }\n }\n\n public onServerError(listener: ServerErrorListener): () => void {\n this.serverErrorListeners.add(listener);\n // Emit current errors to new listener\n for (const [path, err] of this.serverErrors) listener(path, err);\n return () => {\n this.serverErrorListeners.delete(listener);\n };\n }\n\n private notifyServerError(path: string, error: ServerErrorInfo | null) {\n for (const listener of this.serverErrorListeners) listener(path, error);\n }\n\n private async sendMessage(payload: ClientMessage): Promise<void> {\n if (this.isConnected()) {\n // console.log(\"[SocketIOTransport] Sending:\", payload);\n this.socket!.emit(\"message\", flattedStringify(payload));\n } else {\n // console.log(\"[SocketIOTransport] Queuing message:\", payload);\n this.messageQueue.push(payload);\n }\n }\n\n public mountView(path: string, view: MountedView) {\n if (this.activeViews.has(path)) {\n throw new Error(`Path ${path} is already mounted`);\n }\n this.activeViews.set(path, view);\n void this.sendMessage({\n type: \"mount\",\n path,\n routeInfo: view.routeInfo,\n });\n }\n\n public async navigate(path: string, routeInfo: RouteInfo) {\n await this.sendMessage({\n type: \"navigate\",\n path,\n routeInfo,\n });\n }\n\n public unmount(path: string) {\n void this.sendMessage({ type: \"unmount\", path });\n this.activeViews.delete(path);\n }\n\n public disconnect() {\n this.socket?.disconnect();\n this.socket = null;\n this.messageQueue = [];\n this.connectionListeners.clear();\n this.activeViews.clear();\n this.serverErrors.clear();\n this.serverErrorListeners.clear();\n }\n\n private handleServerMessage(message: ServerMessage) {\n // console.log(\"[PulseClient] Received message:\", message);\n switch (message.type) {\n case \"vdom_init\": {\n const route = this.activeViews.get(message.path);\n if (route) {\n route.onInit(message.vdom);\n }\n // Clear any prior error for this path on successful init\n if (this.serverErrors.has(message.path)) {\n this.serverErrors.delete(message.path);\n this.notifyServerError(message.path, null);\n }\n break;\n }\n case \"vdom_update\": {\n const route = this.activeViews.get(message.path);\n if (!route) {\n console.error(\n `[PulseClient] Received VDOM update for path ${message.path} before initial tree was set.`\n );\n return;\n }\n route.onUpdate(message.ops);\n // Clear any prior error for this path on successful update\n if (this.serverErrors.has(message.path)) {\n this.serverErrors.delete(message.path);\n this.notifyServerError(message.path, null);\n }\n break;\n }\n case \"server_error\": {\n this.serverErrors.set(message.path, message.error);\n this.notifyServerError(message.path, message.error);\n break;\n }\n case \"api_call\": {\n void this.performApiCall(message);\n break;\n }\n case \"navigate_to\": {\n try {\n const dest = (message as any).path as string;\n if (this.frameworkNavigate) {\n this.frameworkNavigate(dest);\n } else {\n window.history.pushState({}, \"\", dest);\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n } catch (e) {\n console.error(\"Navigation error:\", e);\n }\n break;\n }\n default: {\n console.error(\"Unexpected message:\", message);\n }\n }\n }\n\n private async performApiCall(msg: ServerApiCallMessage) {\n try {\n const res = await fetch(msg.url, {\n method: msg.method || \"GET\",\n headers: {\n ...(msg.headers || {}),\n ...(msg.body != null && !(\"content-type\" in (msg.headers || {}))\n ? { \"content-type\": \"application/json\" }\n : {}),\n },\n body:\n msg.body != null\n ? typeof msg.body === \"string\"\n ? msg.body\n : JSON.stringify(msg.body)\n : undefined,\n credentials: msg.credentials || \"include\",\n });\n const headersObj: Record<string, string> = {};\n res.headers.forEach((v, k) => (headersObj[k] = v));\n let body: any = null;\n const ct = res.headers.get(\"content-type\") || \"\";\n if (ct.includes(\"application/json\")) {\n body = await res.json().catch(() => null);\n } else {\n body = await res.text().catch(() => null);\n }\n const reply: ClientApiResultMessage = {\n type: \"api_result\",\n id: msg.id,\n ok: res.ok,\n status: res.status,\n headers: headersObj,\n body,\n };\n await this.sendMessage(reply);\n } catch (err) {\n const reply: ClientApiResultMessage = {\n type: \"api_result\",\n id: msg.id,\n ok: false,\n status: 0,\n headers: {},\n body: { error: String(err) },\n };\n await this.sendMessage(reply);\n }\n }\n\n public async invokeCallback(path: string, callback: string, args: any[]) {\n await this.sendMessage({\n type: \"callback\",\n path,\n callback,\n args: args.map(extractEvent),\n });\n }\n\n // public getVDOM(path: string): VDOM | null {\n // return this.activeViews.get(path)?.vdom ?? null;\n // }\n}\n",
10
13
  "import { io, Socket } from \"socket.io-client\";\nimport type { ServerMessage, ClientMessage } from \"./messages\";\n\n// =================================================================\n// Transport Abstraction\n// =================================================================\n\nexport type MessageListener = (message: ServerMessage) => void;\nexport type ConnectionStatusListener = (connected: boolean) => void;\n\nexport interface Transport {\n connect(listener: MessageListener): Promise<void>;\n disconnect(): void;\n sendMessage(payload: ClientMessage): Promise<void>;\n isConnected(): boolean;\n onConnectionChange(listener: ConnectionStatusListener): () => void;\n}\n\n// =================================================================\n// Socket.IO Transport\n// =================================================================\n\nexport class SocketIOTransport implements Transport {\n private socket: Socket | null = null;\n private listener: MessageListener | null = null;\n private messageQueue: ClientMessage[] = [];\n private connectionListeners: Set<ConnectionStatusListener> = new Set();\n\n constructor(private url: string) {}\n\n connect(listener: MessageListener): Promise<void> {\n this.listener = listener;\n return new Promise((resolve, reject) => {\n this.socket = io(this.url, {\n transports: [\"websocket\"],\n });\n\n this.socket.on(\"connect\", () => {\n console.log(\"[SocketIOTransport] Connected:\", this.socket?.id);\n\n for (const payload of this.messageQueue) {\n // console.log(\"[SocketIOTransport] Sending queued message:\", payload);\n this.socket?.emit(\"message\", payload);\n }\n this.messageQueue = [];\n\n this.notifyConnectionListeners(true);\n resolve();\n });\n\n this.socket.on(\"connect_error\", (err) => {\n console.error(\"[SocketIOTransport] Connection failed:\", err);\n this.notifyConnectionListeners(false);\n reject(err);\n });\n\n this.socket.on(\"disconnect\", () => {\n console.log(\"[SocketIOTransport] Disconnected\");\n this.notifyConnectionListeners(false);\n });\n\n this.socket.on(\"message\", (data: ServerMessage) => {\n // console.log(\"[SocketIOTransport] Received message:\", data);\n this.listener?.(data);\n });\n });\n }\n\n disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n this.listener = null;\n this.messageQueue = [];\n this.connectionListeners.clear();\n }\n\n async sendMessage(payload: ClientMessage): Promise<void> {\n if (this.isConnected()) {\n // console.log(\"[SocketIOTransport] Sending:\", payload);\n this.socket!.emit(\"message\", payload);\n } else {\n // console.log(\"[SocketIOTransport] Queuing message:\", payload);\n this.messageQueue.push(payload);\n }\n }\n\n isConnected(): boolean {\n return this.socket?.connected || false;\n }\n\n onConnectionChange(listener: ConnectionStatusListener): () => void {\n this.connectionListeners.add(listener);\n listener(this.isConnected());\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n private notifyConnectionListeners(connected: boolean): void {\n for (const listener of this.connectionListeners) {\n listener(connected);\n }\n }\n}\n\n// =================================================================\n// In-Memory Transport (for testing)\n// =================================================================\n\nexport class InMemoryTransport implements Transport {\n private listener: MessageListener | null = null;\n private connected = false;\n private connectionListeners: Set<ConnectionStatusListener> = new Set();\n\n // Simulate server-side message dispatching\n public dispatchMessage(message: ServerMessage) {\n if (this.listener) {\n // Simulate async behavior\n setTimeout(() => this.listener?.(message), 0);\n }\n }\n\n async connect(listener: MessageListener): Promise<void> {\n this.listener = listener;\n this.connected = true;\n console.log(\"[InMemoryTransport] Connected.\");\n }\n\n disconnect(): void {\n this.listener = null;\n this.connected = false;\n console.log(\"[InMemoryTransport] Disconnected.\");\n }\n\n async sendMessage(payload: ClientMessage): Promise<void> {\n if (!this.connected) {\n throw new Error(\"[InMemoryTransport] Not connected.\");\n }\n console.log(`[InMemoryTransport] Sent message:`, payload);\n // In a real test setup, this might trigger a simulated server response\n // via `dispatchMessage`.\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n onConnectionChange(listener: ConnectionStatusListener): () => void {\n this.connectionListeners.add(listener);\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n}\n",
11
- "import type { LoaderFunctionArgs } from \"react-router\";\n\nexport interface RouteInfo {\n pathname: string;\n hash: string;\n query: string;\n queryParams: Record<string, string>;\n pathParams: Record<string, string | undefined>;\n catchall: string[];\n}\n\nexport function extractServerRouteInfo({\n params,\n request,\n}: LoaderFunctionArgs) {\n const { \"*\": catchall = \"\", ...pathParams } = params;\n const parsedUrl = new URL(request.url);\n\n return {\n hash: parsedUrl.hash,\n pathname: parsedUrl.pathname,\n query: parsedUrl.search,\n queryParams: Object.fromEntries(parsedUrl.searchParams.entries()),\n pathParams,\n catchall: catchall.length > 1 ? catchall.split(\"/\") : [],\n } satisfies RouteInfo;\n}"
14
+ "import type { LoaderFunctionArgs } from \"react-router\";\n\nexport interface RouteInfo {\n pathname: string;\n hash: string;\n query: string;\n queryParams: Record<string, string>;\n pathParams: Record<string, string | undefined>;\n catchall: string[];\n}\n\nexport function extractServerRouteInfo({\n params,\n request,\n}: LoaderFunctionArgs) {\n const { \"*\": catchall = \"\", ...pathParams } = params;\n const parsedUrl = new URL(request.url);\n\n return {\n hash: parsedUrl.hash,\n pathname: parsedUrl.pathname,\n query: parsedUrl.search,\n queryParams: Object.fromEntries(parsedUrl.searchParams.entries()),\n pathParams,\n catchall: catchall.length > 1 ? catchall.split(\"/\") : [],\n } satisfies RouteInfo;\n}",
15
+ "// Serialization helpers that support:\n// - Circular references via object identity refs\n// - Date instances → { __t: \"datetime\", timestamp }\n// - FormData → { __t: \"formdata\", fields }\n// - File → { __t: \"file\", name, type, size, lastModified, content: number[] }\n// Along with a decoder for the symmetric shapes (we do not reconstruct File/FormData objects).\n\ntype EncodedRef = { __t: \"ref\"; id: number };\ntype EncodedArray = { __t: \"array\"; __id: number; items: unknown[] };\ntype EncodedObject = {\n __t: \"object\";\n __id: number;\n props: Record<string, unknown>;\n};\ntype EncodedDate = { __t: \"datetime\"; timestamp: number };\ntype EncodedFile = {\n __t: \"file\";\n name: string;\n type: string;\n size: number;\n lastModified: number;\n content: number[]; // raw bytes as a JSON-safe number array\n};\ntype EncodedFormData = {\n __t: \"formdata\";\n fields: Record<string, unknown | unknown[]>;\n};\n\ntype IdentityMap = WeakMap<object, number>;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n\nfunction isDate(value: unknown): value is Date {\n return value instanceof Date;\n}\n\nfunction isSkippable(value: unknown): boolean {\n return (\n typeof value === \"function\" ||\n typeof value === \"symbol\" ||\n typeof value === \"undefined\"\n );\n}\n\nasync function fileToByteArray(file: File): Promise<number[]> {\n const ab = await file.arrayBuffer();\n return Array.from(new Uint8Array(ab));\n}\n\ninterface EncodeContext {\n seen: IdentityMap;\n nextId: number;\n}\n\nexport async function encodeForWire(input: unknown): Promise<unknown> {\n const ctx: EncodeContext = { seen: new WeakMap(), nextId: 1 };\n return await encodeRecursive(input, ctx);\n}\n\nfunction remember(ctx: EncodeContext, obj: object): number | null {\n const existing = ctx.seen.get(obj);\n if (existing !== undefined) return null;\n const id = ctx.nextId++;\n ctx.seen.set(obj, id);\n return id;\n}\n\nasync function encodeRecursive(\n value: unknown,\n ctx: EncodeContext\n): Promise<unknown> {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n\n // Special cases first\n if (value instanceof Date) {\n const date = value as Date;\n const encoded: EncodedDate = { __t: \"datetime\", timestamp: date.getTime() };\n return encoded;\n }\n\n if (value instanceof FormData) {\n const id = remember(ctx, value);\n if (id === null) {\n return { __t: \"ref\", id: ctx.seen.get(value as object)! } as EncodedRef;\n }\n const fields: Record<string, unknown | unknown[]> = {};\n for (const [key, v] of value.entries()) {\n const encodedVal = await encodeRecursive(v as unknown, ctx);\n if (encodedVal === undefined) continue;\n if (Object.prototype.hasOwnProperty.call(fields, key)) {\n const existing = fields[key];\n if (Array.isArray(existing)) {\n existing.push(encodedVal);\n } else {\n fields[key] = [existing, encodedVal];\n }\n } else {\n fields[key] = encodedVal;\n }\n }\n const encoded: EncodedFormData & { __id: number } = {\n __t: \"formdata\",\n fields,\n __id: id,\n } as any;\n return encoded;\n }\n\n if (value instanceof File) {\n const file = value;\n const bytes = await fileToByteArray(value);\n const encoded: EncodedFile = {\n __t: \"file\",\n name: file.name,\n type: file.type,\n size: file.size,\n lastModified: file.lastModified,\n content: bytes,\n };\n return encoded;\n }\n\n // Identity / circular reference handling\n const object = value as object;\n const existingId = ctx.seen.get(object);\n if (existingId !== undefined) {\n const ref: EncodedRef = { __t: \"ref\", id: existingId };\n return ref;\n }\n const thisId = ctx.nextId++;\n ctx.seen.set(object, thisId);\n\n if (Array.isArray(value)) {\n const itemsRaw = await Promise.all(\n (value as unknown[]).map((item) => encodeRecursive(item, ctx))\n );\n const items = itemsRaw.filter((it) => it !== undefined) as unknown[];\n const encoded: EncodedArray = { __t: \"array\", __id: thisId, items };\n return encoded;\n }\n\n // Plain object or other object types\n const props: Record<string, unknown> = {};\n if (isPlainObject(value)) {\n for (const key of Object.keys(value)) {\n const v = (value as Record<string, unknown>)[key];\n if (isSkippable(v)) continue;\n const encodedV = await encodeRecursive(v, ctx);\n if (encodedV !== undefined) props[key] = encodedV;\n }\n } else {\n // Non-plain objects: best effort – enumerate enumerable properties\n for (const key in value as Record<string, unknown>) {\n const v = (value as Record<string, unknown>)[key];\n if (isSkippable(v)) continue;\n const encodedV = await encodeRecursive(v, ctx);\n if (encodedV !== undefined) props[key] = encodedV;\n }\n }\n const encoded: EncodedObject = { __t: \"object\", __id: thisId, props };\n return encoded;\n}\n\nexport function decodeFromWire(input: unknown): unknown {\n return decodeRecursive(input);\n}\n\nfunction decodeRecursive(value: unknown): unknown {\n if (value === null || typeof value !== \"object\") return value;\n\n const obj = value as Record<string, unknown>;\n const tag = obj[\"__t\"];\n\n if (tag === \"datetime\") {\n const ts = obj[\"timestamp\"] as number;\n return new Date(ts);\n }\n\n if (tag === \"file\") {\n // Do not reconstruct File; keep as plain object. Optionally, turn content into Uint8Array for convenience.\n const content = obj[\"content\"];\n if (Array.isArray(content)) {\n // Return a shallow clone with Uint8Array for content\n return {\n ...obj,\n content: new Uint8Array(content as number[]),\n } as any;\n }\n return obj;\n }\n\n if (tag === \"formdata\") {\n // Keep as-is (plain object), but decode nested values\n const fields = obj[\"fields\"] as Record<string, unknown | unknown[]>;\n const decodedFields: Record<string, unknown | unknown[]> = {};\n for (const key of Object.keys(fields)) {\n const v = fields[key];\n if (Array.isArray(v)) {\n decodedFields[key] = v.map((x) => decodeRecursive(x));\n } else {\n decodedFields[key] = decodeRecursive(v);\n }\n }\n return { __t: \"formdata\", fields: decodedFields } as EncodedFormData;\n }\n\n if (tag === \"array\") {\n const items = (obj[\"items\"] as unknown[]).map((x) => decodeRecursive(x));\n return items;\n }\n\n if (tag === \"object\") {\n const props = obj[\"props\"] as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(props)) {\n out[key] = decodeRecursive(props[key]);\n }\n return out;\n }\n\n if (tag === \"ref\") {\n // Without a reconstruction context on the client, leave as-is.\n return obj;\n }\n\n // Unknown object – descend shallowly\n const copy: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n copy[key] = decodeRecursive(obj[key]);\n }\n return copy;\n}\n\n// Legacy cleaner kept for compatibility where a quick best-effort JSON-safe shape is needed\nexport function cleanForSerialization(obj: unknown): unknown {\n return cleanRecursive(obj, new WeakSet());\n}\n\nfunction cleanRecursive(obj: unknown, seen: WeakSet<object>): unknown {\n if (obj === null || typeof obj !== \"object\") return obj;\n if (seen.has(obj as object)) return undefined;\n seen.add(obj as object);\n if (Array.isArray(obj)) {\n return (obj as unknown[])\n .map((item) => cleanRecursive(item, seen))\n .filter((x) => x !== undefined);\n }\n const out: Record<string, unknown> = {};\n for (const key in obj as Record<string, unknown>) {\n const v = (obj as Record<string, unknown>)[key];\n if (isSkippable(v)) continue;\n const cleaned = cleanRecursive(v, seen);\n if (cleaned !== undefined) out[key] = cleaned;\n }\n return out;\n}\n"
12
16
  ],
13
- "mappings": "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",
14
- "debugId": "6C27788B0A510EB464756E2164756E21",
17
+ "mappings": "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,UACA,aACA,QACA,YACA,qBACA,kBACA,eACA,oBACA,WACF,EAEM,GAAiB,EAAyB,EAAE,GAAc,CAC9D,QAAS,CAAC,IAAM,EAAE,QAAQ,YAAY,CACxC,CAAC,EAEK,GACJ,EAAkC,EAAE,EAAgB,EAEhD,GAA6B,EAA6B,EAC9D,EACF,EAEA,SAAS,CAAsB,CAAC,EAAkB,CAChD,MAAO,IACF,GAAe,CAAG,KAClB,GAAwB,CAAuB,KAC/C,GAA2B,CAAG,CACnC,EAIF,SAAS,CAA+B,CACtC,EACA,EACA,CACA,IAAM,EAAO,EAAmB,EAAE,EAAM,CAAe,EACvD,MAAO,CAAC,KAAY,IAAK,EAAuB,CAAG,KAAM,EAAK,CAAG,CAAE,GAGrE,IAAM,GAAmB,CACvB,OACA,OACA,WACA,OACA,SACA,WACA,WACA,OACA,WACA,SACA,SACA,WACA,MACA,WACA,OACA,WACA,OACA,iBACA,MACF,EACM,GAAkB,EAA4B,EAAgB,EAE9D,GAAiB,CACrB,MACA,SACA,WACA,OACA,OACA,WACA,OACA,SACA,WACA,WACA,OACA,WACA,MACA,SACA,QACA,SACA,WACA,OACA,gBACF,EACM,GAAgB,EAA0B,EAAc,EAExD,GAAkB,CACtB,WACA,WACA,cACA,aACA,cACA,eACA,sBACA,WACA,QACA,OACA,QACA,eACA,SACA,eACA,UACA,aACA,UACA,MACA,SACA,gBACF,EACM,GAAiB,EAA2B,EAAe,EAE3D,GAAiB,CAAC,IAA0B,GAAe,CAAG,EAE9D,GAAmB,CACvB,WACA,OACA,OACA,QACA,aACA,cACA,aACA,iBACA,aACA,qBACF,EACM,GAAkB,EAA4B,EAAgB,EAE9D,GAAiB,CACrB,OACF,EACM,GAAgB,EAA0B,EAAc,EAExD,GAAkB,CACtB,SACA,MACA,OACA,QACA,QACA,MACF,EACM,GAAiB,EAA2B,EAAe,EAE3D,GAAqB,CACzB,WACA,OACA,OACA,oBACA,cACF,EACM,GAAoB,EAA8B,EAAkB,EAEpE,GAAiB,CACrB,gBACA,SACA,eACA,WACA,UACA,SACA,SACA,OACA,aACA,SACA,KACF,EACM,GAAgB,EAA0B,EAAc,EAExD,GAAmB,CACvB,QACA,kBACA,SACA,OACA,iBACA,MACA,SACA,QACA,QACA,cACA,WACA,eACA,cACA,YACA,SACF,EACM,GAAkB,EAA4B,EAAgB,EAE9D,GAAkB,CACtB,MACA,cACA,WACA,SACA,QACA,UACA,gBACA,eACA,iBACA,QACA,MACA,SACA,SACA,QACA,QACA,SACA,WACA,SACA,WACA,SACA,OACA,SACA,IACA,IACA,eACF,EACM,GAAiB,EAA2B,EAAe,EAE3D,GAAkB,CACtB,SACA,MACA,eACA,UACA,iBACA,eACA,UACA,WACA,SACA,gBACA,MACA,YACA,MACA,YACA,WACA,OACA,UACA,cACA,WACA,WACA,qBACA,eACA,iBACA,OACA,MACA,OACA,OACA,QACA,gBACA,QACA,QACA,UACA,aACA,cACA,aACA,iBACA,aACA,SACA,oBACA,eACA,qBACF,EACM,GAAiB,EAA2B,EAAe,EAE3D,GAAkB,CACtB,SACF,EACM,GAAiB,EAA2B,EAAe,EAE3D,GAAe,CACnB,QACA,MACF,EACM,GAAc,EAAwB,EAAY,EAElD,GAAiB,CACrB,KACA,cACA,WACA,gBACA,OACA,WACA,aACA,cACA,YACA,QACA,iBACA,MACA,OACA,UACA,MACA,SACA,OACF,EACM,GAAgB,EAA0B,EAAc,EAExD,GAAgB,CACpB,MACF,EACM,GAAe,EAAyB,EAAa,EAErD,GAAkB,CACtB,OACA,MACA,MACA,MACA,UACA,OACF,EACM,GAAiB,EAA2B,EAAe,EAE3D,GAAgB,CACpB,OACA,UACF,EACM,GAAe,EAAyB,EAAa,EAErD,GAAe,CACnB,WACA,QACA,OACA,SACF,EACM,GAAiB,EAA2B,EAAY,EAExD,GAAmB,CACvB,OACA,SACA,OACA,OACA,SACA,QACA,oBACA,eACA,QACA,UACA,SACA,OACA,WACA,WACA,UACA,SACA,UACA,QACF,EACM,GAAkB,EAA4B,EAAgB,EAE9D,GAAqB,CACzB,WACA,OACF,EACM,GAAoB,EAA8B,EAAkB,EAEpE,GAAmB,CACvB,kBACA,WACA,QACA,QACA,WACA,OACA,OACF,EACM,GAAkB,EAA4B,EAAgB,EAE9D,GAAmB,CACvB,eACA,OACA,OACA,QACA,UACA,oBACA,cACF,EACM,GAAkB,EAA4B,EAAgB,EAE9D,GAAqB,CACzB,MACA,WACA,OACF,EACM,GAAoB,EAA8B,EAAkB,EAEpE,GAAkB,CACtB,MACF,EACM,GAAiB,EAA2B,EAAe,EAE3D,GAAgB,CAAC,IAAqB,EAAuB,CAAG,EAEhE,GAAmB,CACvB,QACA,cACA,QACA,gBACA,YACA,WACA,iBACA,MACA,OACA,OACA,SACF,EACM,GAAwB,EAAmC,EAC/D,GACA,CACE,MAAO,CAAC,IAAO,EAAU,MACzB,QAAS,CAAC,IAAO,EAAU,OAC7B,CACF,EACM,GAAkB,CAAC,KAA4B,IAChD,EAAuB,CAAG,KAC1B,GAAsB,CAAG,CAC9B,GAEM,GAAmB,CACvB,eACA,WACA,SACA,WACA,OACA,WACA,gBACA,OACA,OACA,QACA,oBACA,cACF,EACM,GAAkB,EAA4B,EAAgB,EAE9D,GAAiB,CACrB,MACF,EACM,GAAgB,EAA0B,EAAc,EAExD,GAAmB,CACvB,SACA,QACA,QACA,MACA,SACA,OACA,OACF,EACM,GAAkB,EAA4B,EAAgB,EAE9D,GAA0B,CAC9B,OACF,EACM,GAAwB,EAC5B,EACF,EAEM,GAAuB,CAC3B,OACA,YACA,UACA,UACA,UACA,QACA,QACA,OACA,UACA,KACA,QACA,SACA,SACA,SACA,OACF,EACM,GAAqB,EAA+B,EAAoB,EAExE,GAAsB,CAC1B,OACA,QACA,KACA,QACA,SACA,OACF,EACM,GAAoB,EAA8B,EAAmB,EAErE,GAAkB,CACtB,QACA,UACA,SACA,cACA,cACA,QACA,QACA,UACA,OACF,EACM,GAAiB,EAA2B,EAAe,EAE3D,GAAe,CACnB,WACA,kBACA,QACA,UACA,KACA,QACA,QACF,EACM,GAAoB,EAA8B,EAAY,EAE9D,GAAqB,CACzB,QACA,KACA,QACA,QACF,EACM,EACJ,EAAkC,EAAkB,EAEhD,GAAoB,CAAC,IACzB,EA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",
18
+ "debugId": "1CF1CFA868B5A2AA64756E2164756E21",
15
19
  "names": []
16
20
  }
package/dist/pulse.d.ts CHANGED
@@ -1,15 +1,10 @@
1
1
  import React from "react";
2
2
  import { PulseSocketIOClient } from "./client";
3
- import type { VDOM, ComponentRegistry, RegistryEntry } from "./vdom";
3
+ import type { VDOM, ComponentRegistry } from "./vdom";
4
4
  export interface PulseConfig {
5
5
  serverAddress: string;
6
6
  }
7
7
  export declare const usePulseClient: () => PulseSocketIOClient;
8
- interface PulseRenderHelpers {
9
- getCallback: (key: string) => (...args: any[]) => void;
10
- getComponent: (key: string) => RegistryEntry;
11
- }
12
- export declare const usePulseRenderHelpers: () => PulseRenderHelpers;
13
8
  export interface PulseProviderProps {
14
9
  children: React.ReactNode;
15
10
  config: PulseConfig;
@@ -20,5 +15,4 @@ export interface PulseViewProps {
20
15
  externalComponents: ComponentRegistry;
21
16
  path: string;
22
17
  }
23
- export declare function PulseView({ initialVDOM, externalComponents, path, }: PulseViewProps): import("react/jsx-runtime").JSX.Element;
24
- export {};
18
+ export declare function PulseView({ initialVDOM, externalComponents, path, }: PulseViewProps): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
@@ -1,17 +1,16 @@
1
1
  import React, { type ComponentType } from "react";
2
- import type { VDOMElement, VDOMNode, VDOMUpdate } from "./vdom";
3
- interface VDOMRendererProps {
4
- node: VDOMNode;
2
+ import type { ComponentRegistry, VDOMNode, VDOMUpdate } from "./vdom";
3
+ import type { PulseSocketIOClient } from "./client";
4
+ export declare class VDOMRenderer {
5
+ private client;
6
+ private path;
7
+ private components;
8
+ private callbackCache;
9
+ constructor(client: PulseSocketIOClient, path: string, components: ComponentRegistry);
10
+ getCallback(key: string): (...args: any[]) => void;
11
+ renderNode(node: VDOMNode): React.ReactNode;
5
12
  }
6
- export declare const VDOMRenderer: {
7
- ({ node }: VDOMRendererProps): import("react/jsx-runtime").JSX.Element | null;
8
- displayName: string;
9
- };
10
- export declare function createElementNode(tag: string, props?: Record<string, any>, children?: VDOMNode[], key?: string): VDOMElement;
11
- export declare function createFragment(children?: VDOMNode[], key?: string): VDOMElement;
12
- export declare function createMountPoint(componentKey: string, props?: Record<string, any>, children?: VDOMNode[], key?: string): VDOMElement;
13
- export declare function applyVDOMUpdates(initialTree: VDOMNode, updates: VDOMUpdate[]): VDOMNode;
13
+ export declare function applyUpdates(initialTree: React.ReactNode, updates: VDOMUpdate[], renderer: VDOMRenderer): React.ReactNode;
14
14
  export declare function RenderLazy(component: () => Promise<{
15
15
  default: ComponentType<any>;
16
16
  }>, fallback?: React.ReactNode): React.FC<React.PropsWithChildren<unknown>>;
17
- export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export declare function encodeForWire(input: unknown): Promise<unknown>;
2
+ export declare function decodeFromWire(input: unknown): unknown;
3
+ export declare function cleanForSerialization(obj: unknown): unknown;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare function extractHTMLElement(elt: HTMLElement): object;
@@ -0,0 +1 @@
1
+ export declare function extractEvent(value: any): any;