pulse-ui-client 0.0.10 → 0.0.13

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,21 +1,23 @@
1
1
  {
2
2
  "version": 3,
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/v2.ts", "../src/client.tsx", "../src/transport.ts", "../src/helpers.ts", "../src/serialize/clean.ts", "../src/serialize/v1.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/v3.ts", "../src/client.tsx", "../src/channel.ts", "../src/usePulseChannel.ts", "../src/form.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, 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\nexport type PulsePrerender = {\n renderId: string;\n views: Record<string, VDOM>;\n};\n// =================================================================\n// Context and Hooks\n// =================================================================\n\n// Context for the client, provided by PulseProvider\nconst PulseClientContext = createContext<PulseSocketIOClient | null>(null);\nconst PulsePrerenderContext = createContext<PulsePrerender | 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\nexport const usePulsePrerender = (path: string) => {\n const ctx = useContext(PulsePrerenderContext);\n if (!ctx) {\n throw new Error(\"usePulsePrerender must be used within a PulseProvider\");\n }\n const view = ctx.views[path];\n if (!view) {\n throw new Error(`No prerender found for '${path}'`);\n }\n return view;\n};\n\n// =================================================================\n// Provider\n// =================================================================\n\nexport interface PulseProviderProps {\n children: React.ReactNode;\n config: PulseConfig;\n prerender: PulsePrerender;\n}\n\nconst inBrowser = typeof window !== \"undefined\";\n\nexport function PulseProvider({\n children,\n config,\n prerender,\n}: PulseProviderProps) {\n const [connected, setConnected] = useState(true);\n const rrNavigate = useNavigate();\n const { renderId, views } = prerender;\n\n const client = useMemo(\n () => new PulseSocketIOClient(config.serverAddress, renderId, rrNavigate),\n [config.serverAddress, rrNavigate, renderId]\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 <PulsePrerenderContext.Provider value={prerender}>\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 </PulsePrerenderContext.Provider>\n </PulseClientContext.Provider>\n );\n}\n\n// =================================================================\n// View\n// =================================================================\n\nexport interface PulseViewProps {\n externalComponents: ComponentRegistry;\n path: string;\n}\n\nexport function PulseView({ externalComponents, path }: PulseViewProps) {\n const client = usePulseClient();\n const initialVDOM = usePulsePrerender(path);\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, {\n cloneElement,\n createElement,\n isValidElement,\n lazy,\n Suspense,\n type ComponentType,\n} 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 createElement(Component, processedProps, ...renderedChildren);\n }\n\n return 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 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 currentProps = (node.props ?? {}) as object;\n const nextProps: Record<string, any> = { ...currentProps };\n\n console.log(\"update_props, data:\", update.data);\n const delta = update.data;\n if (delta.remove && delta.remove.length > 0) {\n for (const key of delta.remove) {\n if (key in nextProps) delete nextProps[key];\n }\n }\n if (delta.set) {\n const processed = processPropsForCallbacks(renderer, delta.set);\n for (const [k, v] of Object.entries(processed)) {\n nextProps[k] = v;\n }\n }\n // Not passing children -> only update the props\n console.log(\"Old props:\", node.props);\n console.log(\"New props:\", nextProps);\n return 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 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 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 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 = 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",
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\nexport type PulsePrerender = {\n renderId: string;\n views: Record<string, VDOM>;\n};\n// =================================================================\n// Context and Hooks\n// =================================================================\n\n// Context for the client, provided by PulseProvider\nconst PulseClientContext = createContext<PulseSocketIOClient | null>(null);\nconst PulsePrerenderContext = createContext<PulsePrerender | 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\nexport const usePulsePrerender = (path: string) => {\n const ctx = useContext(PulsePrerenderContext);\n if (!ctx) {\n throw new Error(\"usePulsePrerender must be used within a PulseProvider\");\n }\n const view = ctx.views[path];\n if (!view) {\n throw new Error(`No prerender found for '${path}'`);\n }\n return view;\n};\n\n// =================================================================\n// Provider\n// =================================================================\n\nexport interface PulseProviderProps {\n children: React.ReactNode;\n config: PulseConfig;\n prerender: PulsePrerender;\n}\n\nconst inBrowser = typeof window !== \"undefined\";\n\nexport function PulseProvider({\n children,\n config,\n prerender,\n}: PulseProviderProps) {\n const [connected, setConnected] = useState(true);\n const rrNavigate = useNavigate();\n const { renderId } = prerender;\n\n const client = useMemo(\n () => new PulseSocketIOClient(config.serverAddress, renderId, rrNavigate),\n [config.serverAddress, rrNavigate, renderId]\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 <PulsePrerenderContext.Provider value={prerender}>\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 </PulsePrerenderContext.Provider>\n </PulseClientContext.Provider>\n );\n}\n\n// =================================================================\n// View\n// =================================================================\n\nexport interface PulseViewProps {\n externalComponents: ComponentRegistry;\n path: string;\n}\n\nexport function PulseView({ externalComponents, path }: PulseViewProps) {\n const client = usePulseClient();\n const initialVDOM = usePulsePrerender(path);\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, {\n cloneElement,\n createElement,\n isValidElement,\n lazy,\n Suspense,\n type ComponentType,\n} 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 createElement(Component, processedProps, ...renderedChildren);\n }\n\n return 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 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 currentProps = (node.props ?? {}) as object;\n const nextProps: Record<string, any> = { ...currentProps };\n const delta = update.data;\n if (delta.remove && delta.remove.length > 0) {\n for (const key of delta.remove) {\n if (key in nextProps) delete nextProps[key];\n }\n }\n if (delta.set) {\n const processed = processPropsForCallbacks(renderer, delta.set);\n for (const [k, v] of Object.entries(processed)) {\n nextProps[k] = v;\n }\n }\n // Not passing children -> only update the props\n return 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 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 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 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 = 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
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: {\n set?: Record<string, any>;\n remove?: string[];\n };\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
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
9
  "import { createExtractor } from \"./extractor\";\n\n// Base extractors (camelCase) similar to events.ts style\nconst lowerTagName = (e: Element) => e.tagName.toLowerCase();\n\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: lowerTagName,\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
10
  "/* === IMPORTANT === */\n\nimport { extractHTMLElement } from \"./elements\";\nimport { createExtractor } from \"./extractor\";\n\n// Reusable computed mappers (helps bundlers/minifiers share references)\nconst mapTarget = (e: { target: EventTarget | null }) =>\n extractHTMLElement(e.target as HTMLElement);\nconst mapRelated = (e: { relatedTarget: EventTarget | null }) =>\n e.relatedTarget ? extractHTMLElement(e.relatedTarget as HTMLElement) : null;\n\nfunction makeExtractor<K extends readonly any[]>(\n keys: K,\n computed?: Record<string, (evt: any) => any>\n) {\n return createExtractor<any>()(\n keys as any,\n {\n target: mapTarget,\n ...(computed || {}),\n } as any\n );\n}\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 = makeExtractor(SYNTHETIC_KEYS);\n\nconst uiExtractor = makeExtractor(UI_KEYS);\n\nconst mouseExtractor = makeExtractor(MOUSE_KEYS, { relatedTarget: mapRelated });\n\nconst clipboardExtractor = makeExtractor(SYNTHETIC_KEYS, {\n clipboardData: (e) => extractDataTransfer(e.clipboardData),\n});\n\nconst compositionExtractor = makeExtractor([\n ...SYNTHETIC_KEYS,\n \"data\",\n] as const);\n\nconst dragExtractor = makeExtractor(MOUSE_KEYS, {\n relatedTarget: mapRelated,\n dataTransfer: (e) => extractDataTransfer(e.dataTransfer),\n});\n\nconst pointerExtractor = makeExtractor(POINTER_KEYS, {\n relatedTarget: mapRelated,\n});\n\nconst focusExtractor = makeExtractor(SYNTHETIC_KEYS, {\n relatedTarget: mapRelated,\n});\n\nconst formExtractor = makeExtractor(SYNTHETIC_KEYS);\n\nconst invalidExtractor = makeExtractor(SYNTHETIC_KEYS);\n\nconst changeExtractor = makeExtractor(SYNTHETIC_KEYS);\n\nconst keyboardExtractor = makeExtractor([\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\nconst touchExtractor = makeExtractor(\n [\n ...UI_KEYS,\n \"altKey\",\n \"ctrlKey\",\n \"metaKey\",\n \"shiftKey\",\n \"changedTouches\",\n \"targetTouches\",\n \"touches\",\n ] as const,\n {\n changedTouches: (e) => mapTouchList(e.changedTouches),\n targetTouches: (e) => mapTouchList(e.targetTouches),\n touches: (e) => mapTouchList(e.touches),\n }\n);\n\nconst wheelExtractor = makeExtractor(\n [...MOUSE_KEYS, \"deltaMode\", \"deltaX\", \"deltaY\", \"deltaZ\"] as const,\n {\n relatedTarget: mapRelated,\n }\n);\n\nconst animationExtractor = makeExtractor([\n ...SYNTHETIC_KEYS,\n \"animationName\",\n \"elapsedTime\",\n \"pseudoElement\",\n] as const);\n\nconst toggleExtractor = makeExtractor([\n ...SYNTHETIC_KEYS,\n \"oldState\",\n \"newState\",\n] as const);\n\nconst transitionExtractor = makeExtractor([\n ...SYNTHETIC_KEYS,\n \"elapsedTime\",\n \"propertyName\",\n \"pseudoElement\",\n] as const);\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\nfunction add(map: Record<string, any>, names: readonly string[], fn: any) {\n for (const n of names) map[n] = fn;\n}\n\nadd(\n eventExtractorMap,\n [\n \"pointerdown\",\n \"pointermove\",\n \"pointerup\",\n \"pointercancel\",\n \"gotpointercapture\",\n \"lostpointercapture\",\n \"pointerenter\",\n \"pointerleave\",\n \"pointerover\",\n \"pointerout\",\n ],\n pointerExtractor\n);\n\nadd(\n eventExtractorMap,\n [\n \"click\",\n \"contextmenu\",\n \"dblclick\",\n \"mousedown\",\n \"mouseenter\",\n \"mouseleave\",\n \"mousemove\",\n \"mouseout\",\n \"mouseover\",\n \"mouseup\",\n ],\n mouseExtractor\n);\n\nadd(\n eventExtractorMap,\n [\n \"drag\",\n \"dragend\",\n \"dragenter\",\n \"dragexit\",\n \"dragleave\",\n \"dragover\",\n \"dragstart\",\n \"drop\",\n ],\n dragExtractor\n);\n\nadd(eventExtractorMap, [\"keydown\", \"keypress\", \"keyup\"], keyboardExtractor);\nadd(eventExtractorMap, [\"focus\", \"blur\"], focusExtractor);\nadd(eventExtractorMap, [\"change\", \"input\"], changeExtractor);\nadd(eventExtractorMap, [\"invalid\"], invalidExtractor);\nadd(eventExtractorMap, [\"reset\", \"submit\"], formExtractor);\nadd(eventExtractorMap, [\"copy\", \"cut\", \"paste\"], clipboardExtractor);\nadd(\n eventExtractorMap,\n [\"compositionend\", \"compositionstart\", \"compositionupdate\"],\n compositionExtractor\n);\nadd(\n eventExtractorMap,\n [\"touchcancel\", \"touchend\", \"touchmove\", \"touchstart\"],\n touchExtractor\n);\nadd(eventExtractorMap, [\"scroll\"], uiExtractor);\nadd(eventExtractorMap, [\"wheel\"], wheelExtractor);\nadd(\n eventExtractorMap,\n [\"animationstart\", \"animationend\", \"animationiteration\"],\n animationExtractor\n);\nadd(eventExtractorMap, [\"transitionend\"], transitionExtractor);\nadd(eventExtractorMap, [\"toggle\"], toggleExtractor);\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
- "/* -- Data format -- \nSerialized data consists of:\n1) A first array containing one entry per extension provided during\n serialization. For each extension, an array of indices is provided. These\n indices refer to the entries in the second array that were serialized using\n this extension. These entries should be deserialized by their corresponding\n extension. \n2) A second array containing the data entries. Each entry can be:\n - A primitive (number, string, boolean).\n - A record whose keys are strings and whose values are indices into the data\n entries array.\n - An array whose values are indices into the data entries array.\n\nExtensions need to encode their inputs into plain JSON. The entries marked for\ndecoding by an extension will first reconstruct the plain JSON from the\ncorresponding data entry, before handing it off to the extension.\n\nThis format is similar to the one adopted by Flatted, but with a different\nextension system.\n*/\nexport type Primitive = number | string | boolean | null | undefined;\nexport type DataEntry = Primitive | Record<string, number> | Array<number>;\nexport type Serialized = [Array<Array<number>>, Array<DataEntry>];\n\nexport type Extension<T = unknown> = {\n check(value: unknown): value is T;\n encode(value: T, encode: (value: unknown) => number): DataEntry;\n decode(entry: DataEntry, decode: (index: number) => unknown): T;\n};\n\ntype ExtensionType<E extends Extension<unknown>> =\n E extends Extension<infer T> ? T : never;\ntype ExtensionTypes<Extensions extends Array<Extension<unknown>>> =\n ExtensionType<Extensions[number]>;\n\nexport type PrimitiveWithExt<Ext extends unknown = never> = Primitive | Ext;\nexport type Serializable<Ext extends unknown = never> =\n | PrimitiveWithExt<Ext>\n | Array<PrimitiveWithExt<Ext>>\n | Record<string, PrimitiveWithExt<Ext>>;\n\nexport type SerializableWith<Extensions extends Array<Extension<any>>> =\n Serializable<ExtensionTypes<Extensions>>;\n\nexport function serialize<Extensions extends Array<Extension>>(\n data: SerializableWith<Extensions>,\n extensions: Extensions\n): Serialized {\n const entries: Array<DataEntry> = [];\n const extIdxLists: Array<Array<number>> = extensions.map(() => []);\n\n const seen = new Map<any, number>();\n\n const add = (value: any): number => {\n const cached = seen.get(value);\n if (cached !== undefined) return cached;\n // Primitives (as defined by this format) are stored directly\n if (\n value == null || // catch both null and undefined\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n const idx = entries.length;\n entries.push(value as Primitive);\n seen.set(value, idx);\n return idx;\n }\n\n // Handle extension-encoded values\n for (let e = 0; e < extensions.length; e++) {\n const ext = extensions[e]!;\n if (ext.check(value)) {\n if (seen.has(value)) {\n return seen.get(value)!;\n }\n const idx = entries.length;\n // placeholder to support cycles while encoding children\n entries.push([]);\n seen.set(value, idx);\n const entry = ext.encode(value as any, (v: unknown) => add(v));\n entries[idx] = entry as DataEntry;\n extIdxLists[e]!.push(idx);\n return idx;\n }\n }\n\n // Non-primitive, non-extension values must be arrays or plain objects\n if (value && typeof value === \"object\") {\n if (seen.has(value)) {\n return seen.get(value)!;\n }\n\n if (Array.isArray(value)) {\n const idx = entries.length;\n // placeholder first to establish index for cycles\n entries.push([]);\n seen.set(value, idx);\n const childIndices: number[] = [];\n for (let i = 0; i < value.length; i++) {\n childIndices.push(add(value[i]));\n }\n entries[idx] = childIndices;\n return idx;\n }\n\n // plain object\n const idx = entries.length;\n entries.push({});\n seen.set(value, idx);\n const rec: Record<string, number> = {};\n for (const key of Object.keys(value)) {\n const v = (value as Record<string, any>)[key];\n const childIdx = add(v);\n rec[key] = childIdx as number;\n }\n entries[idx] = rec;\n return idx;\n }\n\n // Unsupported types (undefined, function, symbol, bigints, null)\n // Note: null is not part of Primitive in this v2 format. Skip it explicitly.\n throw new Error(\n `Unsupported value in serialize(): ${String(value)} (type ${typeof value})`\n );\n };\n\n // By convention, the root value is the first entry (index 0)\n add(data as any);\n\n return [extIdxLists, entries];\n}\n\nexport function deserialize<Extensions extends Array<Extension>>(\n data: Serialized,\n extensions: Extensions\n): SerializableWith<Extensions> {\n const [extIdxLists, entries] = data;\n\n // Map node index -> extension index responsible for decoding it\n const nodeToExt = new Map<number, number>();\n for (let e = 0; e < extIdxLists.length; e++) {\n for (const idx of extIdxLists[e] ?? []) {\n nodeToExt.set(idx, e);\n }\n }\n\n // Single resolver with extension-aware decode\n const resolved = new Map<number, any>();\n const resolve = (idx: number): any => {\n if (resolved.has(idx)) return resolved.get(idx);\n\n if (idx < 0 || idx >= entries.length) {\n throw new Error(`Invalid serialized data: missing entry at index ${idx}`);\n }\n let entry = entries[idx];\n\n if (nodeToExt.has(idx)) {\n const ext = extensions[nodeToExt.get(idx)!]!;\n const value = ext.decode(entries[idx] as DataEntry, (j: number) =>\n resolve(j)\n );\n resolved.set(idx, value);\n return value;\n }\n\n if (\n entry == null ||\n typeof entry === \"number\" ||\n typeof entry === \"string\" ||\n typeof entry === \"boolean\"\n ) {\n entry ??= undefined;\n resolved.set(idx, entry);\n return entry;\n }\n\n if (Array.isArray(entry)) {\n const arr: any[] = [];\n resolved.set(idx, arr);\n for (const childIndex of entry as number[]) {\n arr.push(resolve(childIndex));\n }\n return arr;\n }\n\n const obj: Record<string, any> = {};\n resolved.set(idx, obj);\n const map = entry as Record<string, number>;\n for (const k in map) {\n obj[k] = resolve(map[k] as number);\n }\n return obj;\n };\n\n if (entries.length === 0) {\n throw new Error(\"Invalid serialized data: empty entries array\");\n }\n return resolve(0);\n}\n\nconst dateExt: Extension<Date> = {\n check(value: unknown): value is Date {\n return value instanceof Date;\n },\n encode(value, encode) {\n return { t: encode(\"date\"), ts: encode(value.getTime()) };\n },\n decode(entry, decode) {\n const t = decode((entry as Record<string, number>).t) as string;\n if (t !== \"date\") throw new Error(\"Invalid date payload\");\n const ts = decode((entry as Record<string, number>).ts) as number;\n return new Date(ts);\n },\n};\n\nconst fileExt: Extension<File> = {\n check(value: unknown): value is File {\n return typeof File !== \"undefined\" && value instanceof File;\n },\n encode(file: File, encode: (v: unknown) => number) {\n return {\n t: encode(\"file\"),\n n: encode(file.name),\n tp: encode(file.type),\n sz: encode(file.size),\n lm: encode(file.lastModified),\n // raw browser File object - socket.io will carry it as binary\n b: file,\n } as any;\n },\n decode(entry: DataEntry, decode: (i: number) => unknown): File {\n const e = entry as any;\n const t = decode(e.t) as string;\n if (t !== \"file\") throw new Error(\"Invalid file payload\");\n const name = decode(e.n) as string;\n const type = decode(e.tp) as string;\n const size = decode(e.sz) as number;\n const lastModified = decode(e.lm) as number;\n const raw = e.file;\n if (typeof File !== \"undefined\") {\n if (raw instanceof File) return raw;\n if (raw && (raw instanceof Uint8Array || raw instanceof ArrayBuffer)) {\n const buf =\n raw instanceof Uint8Array ? raw : new Uint8Array(raw as ArrayBuffer);\n return new File([buf as unknown as BlobPart], name, {\n type,\n lastModified,\n });\n }\n // Try Blob\n if (typeof Blob !== \"undefined\" && raw instanceof Blob) {\n return new File([raw], name, { type, lastModified });\n }\n }\n // Fallback return a plain object if File is not available\n return { name, type, size, lastModified, file: raw } as unknown as File;\n },\n} as any;\n\nconst formDataExt: Extension<FormData> = {\n check(value: unknown): value is FormData {\n return typeof FormData !== \"undefined\" && value instanceof FormData;\n },\n encode(fd: FormData, encode: (v: unknown) => number) {\n const fields: Record<string, unknown | unknown[]> = {};\n for (const [key, val] of fd.entries()) {\n const prev = fields[key];\n if (prev === undefined) fields[key] = val as any;\n else if (Array.isArray(prev)) prev.push(val as any);\n else fields[key] = [prev, val as any];\n }\n return { t: encode(\"formdata\"), f: encode(fields) };\n },\n decode(entry: DataEntry, decode: (i: number) => unknown) {\n const t = decode((entry as Record<string, number>).t) as string;\n if (t !== \"formdata\") throw new Error(\"Invalid formdata payload\");\n const data = decode((entry as Record<string, number>).f) as Record<\n string,\n unknown | unknown[]\n >;\n const fd = new FormData();\n for (const [k, v] of Object.entries(data)) {\n if (Array.isArray(v)) {\n for (const item of v) fd.append(k, item as any);\n } else {\n fd.append(k, v as any);\n }\n }\n return fd;\n },\n} as any;\n\nconst setExt: Extension<Set<unknown>> = {\n check(value: unknown): value is Set<unknown> {\n return value instanceof Set;\n },\n encode(set, encode) {\n return { t: encode(\"set\"), items: encode(Array.from(set.values())) };\n },\n decode(entry, decode) {\n const t = decode((entry as Record<string, number>).t) as string;\n if (t !== \"set\") throw new Error(\"Invalid set payload\");\n const items = decode((entry as Record<string, number>).items) as unknown[];\n return new Set(items);\n },\n};\n\nconst mapExt: Extension<Map<unknown, unknown>> = {\n check(value: unknown): value is Map<unknown, unknown> {\n return value instanceof Map;\n },\n encode(map, encode) {\n return { t: encode(\"map\"), entries: encode(Array.from(map.entries())) };\n },\n decode(entry, decode) {\n const t = decode((entry as Record<string, number>).t) as string;\n if (t !== \"map\") throw new Error(\"Invalid map payload\");\n const entriesArr = decode(\n (entry as Record<string, number>).entries\n ) as Array<[unknown, unknown]>;\n return new Map(entriesArr);\n },\n};\n// Default extensions for browser/runtime usage (order MUST match server)\nexport function defaultExtensions() {\n return [dateExt, fileExt, formDataExt, setExt, mapExt];\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 { serialize, deserialize, defaultExtensions } from \"./serialize/v2\";\n\nimport { io, Socket } from \"socket.io-client\";\nimport type {\n ClientApiResultMessage,\n ClientMessage,\n ServerApiCallMessage,\n ServerErrorInfo,\n ServerMessage,\n} from \"./messages\";\nimport type { NavigateFunction } from \"react-router\";\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 renderId: string,\n private frameworkNavigate: NavigateFunction\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\", \"webtransport\"],\n auth: { renderId: this.renderId },\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 serialize(\n {\n type: \"mount\",\n path: path,\n routeInfo: route.routeInfo,\n } as any,\n defaultExtensions()\n )\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(\n \"message\",\n serialize(payload as any, defaultExtensions())\n );\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(deserialize(data, defaultExtensions()) as any)\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(\n \"message\",\n serialize(payload as any, defaultExtensions())\n );\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 // Ignore messages for paths that are not mounted\n if (!route) return;\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) return; // Not an active path; discard\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 if (!this.activeViews.has(message.path)) return; // discard for inactive paths\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 // `navigate_to` is navigational; allow regardless of activeViews membership\n const replace = !!message.replace;\n let dest = message.path || \"\";\n // Normalize protocol-relative URLs to absolute\n if (dest.startsWith(\"//\")) dest = `${window.location.protocol}${dest}`;\n const hasScheme = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(dest);\n if (hasScheme) {\n if (dest.startsWith(\"http://\") || dest.startsWith(\"https://\")) {\n try {\n const url = new URL(dest);\n if (url.origin === window.location.origin) {\n const internal = `${url.pathname}${url.search}${url.hash}`;\n this.frameworkNavigate(internal, { replace });\n } else {\n if (replace) window.location.replace(dest);\n else window.location.assign(dest);\n }\n } catch {\n if (replace) window.location.replace(dest);\n else window.location.assign(dest);\n }\n } else {\n // mailto:, tel:, data:, etc.\n if (replace) window.location.replace(dest);\n else window.location.assign(dest);\n }\n } else {\n // Relative or root-relative path → SPA navigate\n this.frameworkNavigate(dest, { replace });\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",
11
+ "export type Primitive = number | string | boolean | null | undefined;\nexport type JSON<T> = T | Array<JSON<T>> | { [K: string]: JSON<T> };\nexport type PlainJSON = JSON<Primitive>;\nexport type Serializable = any;\n\nexport type Serialized = [[number[], number[], number[], number[]], PlainJSON];\n\nexport function serialize(data: Serializable): Serialized {\n const seen = new Map<any, number>();\n const refs: number[] = [];\n const dates: number[] = [];\n const sets: number[] = [];\n const maps: number[] = [];\n\n // Single global counter - increments once per node visit\n let globalIndex = 0;\n\n function process(value: Serializable): PlainJSON {\n if (\n value == null ||\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n const idx = globalIndex++;\n const prevRef = seen.get(value);\n if (prevRef !== undefined) {\n // Make sure to push the current index, but use the ref's index as the value!\n refs.push(idx);\n return prevRef;\n }\n\n seen.set(value, idx);\n\n if (value instanceof Date) {\n dates.push(idx);\n return value.getTime();\n }\n\n if (Array.isArray(value)) {\n const length = value.length;\n const result = new Array(length);\n for (let i = 0; i < length; i++) {\n result[i] = process(value[i]);\n }\n return result;\n }\n\n if (value instanceof Map) {\n maps.push(idx);\n const rec: Record<string, any> = {};\n for (const [key, entry] of value.entries()) {\n rec[String(key)] = process(entry);\n }\n return rec;\n }\n\n if (value instanceof Set) {\n sets.push(idx);\n const size = value.size;\n const result = new Array(size);\n let i = 0;\n for (const entry of value) {\n result[i] = process(entry);\n i += 1;\n }\n return result;\n }\n\n if (typeof value === \"object\") {\n const rec: Record<string, any> = {};\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n rec[key] = process(value[key]);\n }\n return rec;\n }\n\n throw new Error(`Unsupported value in serialization: ${value}`);\n }\n\n const payload = process(data);\n return [[refs, dates, sets, maps], payload];\n}\n\nexport interface DeserializationOptions {\n coerceNullsToUndefined?: boolean;\n}\n\nexport function deserialize<Data extends Serializable = Serializable>(\n payload: Serialized,\n options?: DeserializationOptions\n): Data {\n const [[refsA, datesA, setsA, mapsA], data] = payload;\n\n const refs = new Set(refsA);\n const dates = new Set(datesA);\n const sets = new Set(setsA);\n const maps = new Set(mapsA);\n\n const objects: Array<any> = [];\n\n function reconstruct(value: PlainJSON): any {\n const idx = objects.length;\n if (refs.has(idx)) {\n // We increment the counter on refs during serialization. We're never\n // going to use this entry, so we can just push null.\n objects.push(null);\n return objects[value as number];\n }\n\n if (dates.has(idx)) {\n const dt = new Date(value as number);\n objects.push(dt);\n return dt;\n }\n\n if (\n value == null ||\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n if (options?.coerceNullsToUndefined) {\n return value ?? undefined;\n }\n return value;\n }\n\n if (Array.isArray(value)) {\n if (sets.has(idx)) {\n const result = new Set();\n objects.push(result);\n for (let i = 0; i < value.length; i++) {\n result.add(reconstruct(value[i]));\n }\n return result;\n }\n\n const length = value.length;\n const arr = new Array(length);\n objects.push(arr);\n for (let i = 0; i < length; i++) {\n arr[i] = reconstruct(value[i]);\n }\n return arr;\n }\n\n if (typeof value === \"object\") {\n if (maps.has(idx)) {\n const result = new Map<string, any>();\n objects.push(result);\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n result.set(key, reconstruct(value[key]));\n }\n return result;\n }\n\n const result: Record<string, any> = {};\n objects.push(result);\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n result[key] = reconstruct(value[key]);\n }\n return result;\n }\n\n throw new Error(`Unsupported value in deserialization: ${value}`);\n }\n\n return reconstruct(data);\n}\n",
12
+ "import type { RouteInfo } from \"./helpers\";\nimport type { VDOM, VDOMUpdate } from \"./vdom\";\nimport { extractEvent } from \"./serialize/events\";\nimport { serialize, deserialize } from \"./serialize/v3\";\n\nimport { io, Socket } from \"socket.io-client\";\nimport type {\n ClientApiResultMessage,\n ClientChannelMessage,\n ClientMessage,\n ServerApiCallMessage,\n ServerChannelMessage,\n ServerErrorInfo,\n ServerMessage,\n} from \"./messages\";\nimport type { NavigateFunction } from \"react-router\";\nimport type { ChannelBridge } from \"./channel\";\nimport { createChannelBridge, PulseChannelResetError } from \"./channel\";\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 private channels: Map<string, { bridge: ChannelBridge; refCount: number }> = new Map();\n\n constructor(\n private url: string,\n private renderId: string,\n private frameworkNavigate: NavigateFunction\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\", \"webtransport\"],\n auth: { renderId: this.renderId },\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 serialize({\n type: \"mount\",\n path: path,\n routeInfo: route.routeInfo,\n })\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\", serialize(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.handleTransportDisconnect();\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(deserialize(data, {coerceNullsToUndefined: true}))\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\", serialize(payload as any));\n } else {\n // console.log(\"[SocketIOTransport] Queuing message:\", payload);\n this.messageQueue.push(payload);\n }\n }\n\n public async sendChannelMessage(message: ClientChannelMessage): Promise<void> {\n await this.sendMessage(message);\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 for (const { bridge } of this.channels.values()) {\n bridge.dispose(new PulseChannelResetError(\"Client disconnected\"));\n }\n this.channels.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 // Ignore messages for paths that are not mounted\n if (!route) return;\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) return; // Not an active path; discard\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 if (!this.activeViews.has(message.path)) return; // discard for inactive paths\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 // `navigate_to` is navigational; allow regardless of activeViews membership\n const replace = !!message.replace;\n let dest = message.path || \"\";\n // Normalize protocol-relative URLs to absolute\n if (dest.startsWith(\"//\")) dest = `${window.location.protocol}${dest}`;\n const hasScheme = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(dest);\n if (hasScheme) {\n if (dest.startsWith(\"http://\") || dest.startsWith(\"https://\")) {\n try {\n const url = new URL(dest);\n if (url.origin === window.location.origin) {\n const internal = `${url.pathname}${url.search}${url.hash}`;\n this.frameworkNavigate(internal, { replace });\n } else {\n if (replace) window.location.replace(dest);\n else window.location.assign(dest);\n }\n } catch {\n if (replace) window.location.replace(dest);\n else window.location.assign(dest);\n }\n } else {\n // mailto:, tel:, data:, etc.\n if (replace) window.location.replace(dest);\n else window.location.assign(dest);\n }\n } else {\n // Relative or root-relative path → SPA navigate\n this.frameworkNavigate(dest, { replace });\n }\n break;\n }\n case \"channel_message\": {\n this.routeChannelMessage(message);\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 acquireChannel(id: string): ChannelBridge {\n const entry = this.ensureChannelEntry(id);\n entry.refCount += 1;\n return entry.bridge;\n }\n\n public releaseChannel(id: string): void {\n const entry = this.channels.get(id);\n if (!entry) {\n return;\n }\n entry.refCount = Math.max(0, entry.refCount - 1);\n if (entry.refCount === 0) {\n entry.bridge.dispose(new PulseChannelResetError(\"Channel released\"));\n this.channels.delete(id);\n }\n }\n\n private ensureChannelEntry(id: string): {\n bridge: ChannelBridge;\n refCount: number;\n } {\n let entry = this.channels.get(id);\n if (!entry) {\n entry = {\n bridge: createChannelBridge(this, id),\n refCount: 0,\n };\n this.channels.set(id, entry);\n }\n return entry;\n }\n\n private routeChannelMessage(message: ServerChannelMessage): void {\n const entry = this.ensureChannelEntry(message.channel);\n const closed = entry.bridge.handleServerMessage(message);\n if (closed && entry.refCount === 0) {\n this.channels.delete(message.channel);\n }\n }\n\n private handleTransportDisconnect(): void {\n for (const entry of this.channels.values()) {\n entry.bridge.handleDisconnect(new PulseChannelResetError(\"Connection lost\"));\n }\n }\n\n // public getVDOM(path: string): VDOM | null {\n // return this.activeViews.get(path)?.vdom ?? null;\n // }\n}\n",
13
+ "import type {\n ServerChannelMessage,\n ServerChannelRequestMessage,\n ServerChannelResponseMessage,\n} from \"./messages\";\nimport type { PulseSocketIOClient } from \"./client\";\n\nexport class PulseChannelResetError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PulseChannelResetError\";\n }\n}\n\nexport type ChannelEventHandler = (payload: any) => any | Promise<any>;\n\ninterface PendingRequest {\n resolve: (value: any) => void;\n reject: (error: any) => void;\n}\n\nfunction randomId(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID().replace(/-/g, \"\");\n }\n return Math.random().toString(16).slice(2) + Math.random().toString(16).slice(2);\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"string\") return error;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n}\n\nfunction isServerResponseMessage(\n message: ServerChannelMessage\n): message is ServerChannelResponseMessage {\n return typeof (message as ServerChannelResponseMessage).responseTo === \"string\";\n}\n\nfunction isServerRequestMessage(\n message: ServerChannelMessage\n): message is ServerChannelRequestMessage {\n return typeof (message as ServerChannelRequestMessage).event === \"string\";\n}\n\nexport class ChannelBridge {\n private handlers = new Map<string, Set<ChannelEventHandler>>();\n private pending = new Map<string, PendingRequest>();\n private backlog: ServerChannelRequestMessage[] = [];\n private closed = false;\n\n constructor(private client: PulseSocketIOClient, public readonly id: string) {}\n\n emit(event: string, payload?: any): void {\n this.ensureOpen();\n void this.client.sendChannelMessage({\n type: \"channel_message\",\n channel: this.id,\n event,\n payload,\n });\n }\n\n async request(event: string, payload?: any): Promise<any> {\n this.ensureOpen();\n const requestId = randomId();\n return new Promise((resolve, reject) => {\n this.pending.set(requestId, { resolve, reject });\n void this.client\n .sendChannelMessage({\n type: \"channel_message\",\n channel: this.id,\n event,\n payload,\n requestId,\n })\n .catch((err) => {\n this.pending.delete(requestId);\n reject(err);\n });\n });\n }\n\n on(event: string, handler: ChannelEventHandler): () => void {\n this.ensureOpen();\n let bucket = this.handlers.get(event);\n if (!bucket) {\n bucket = new Set();\n this.handlers.set(event, bucket);\n }\n bucket.add(handler);\n this.flushBacklog(event);\n return () => {\n const set = this.handlers.get(event);\n if (!set) return;\n set.delete(handler);\n if (set.size === 0) {\n this.handlers.delete(event);\n }\n };\n }\n\n handleServerMessage(message: ServerChannelMessage): boolean {\n if (isServerResponseMessage(message)) {\n this.resolvePending(message);\n return this.closed;\n }\n if (this.closed) {\n return true;\n }\n if (!isServerRequestMessage(message)) {\n return this.closed;\n }\n\n if (message.event === \"__close__\") {\n this.close(new PulseChannelResetError(\"Channel closed by server\"));\n return true;\n }\n if (message.requestId) {\n void this.dispatchRequest(message as ServerChannelRequestMessage & {\n requestId: string;\n });\n } else {\n this.dispatchEvent(message);\n }\n return this.closed;\n }\n\n handleDisconnect(reason: PulseChannelResetError): void {\n this.close(reason);\n }\n\n dispose(reason: PulseChannelResetError): void {\n this.close(reason);\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw new PulseChannelResetError(\"Channel is closed\");\n }\n }\n\n private flushBacklog(event: string): void {\n if (this.backlog.length === 0) return;\n const remaining: ServerChannelRequestMessage[] = [];\n for (const item of this.backlog) {\n if (item.event === event) {\n this.dispatchEvent(item);\n } else {\n remaining.push(item);\n }\n }\n this.backlog = remaining;\n }\n\n private dispatchEvent(message: ServerChannelRequestMessage): void {\n const handlers = this.handlers.get(message.event);\n if (!handlers || handlers.size === 0) {\n this.backlog.push(message);\n return;\n }\n for (const handler of handlers) {\n try {\n const result = handler(message.payload);\n if (result && typeof (result as Promise<any>).then === \"function\") {\n void (result as Promise<any>).catch((err) => {\n console.error(\"Pulse channel handler error\", err);\n });\n }\n } catch (err) {\n console.error(\"Pulse channel handler error\", err);\n }\n }\n }\n\n private async dispatchRequest(\n message: ServerChannelRequestMessage & { requestId: string }\n ): Promise<void> {\n const handlers = this.handlers.get(message.event);\n let response: any;\n let error: any;\n if (handlers && handlers.size > 0) {\n for (const handler of handlers) {\n try {\n const result = handler(message.payload);\n response = await Promise.resolve(result);\n if (response !== undefined) {\n break;\n }\n } catch (err) {\n error = err;\n break;\n }\n }\n }\n if (error) {\n await this.client.sendChannelMessage({\n type: \"channel_message\",\n channel: this.id,\n event: undefined,\n responseTo: message.requestId,\n error: formatError(error),\n });\n return;\n }\n await this.client.sendChannelMessage({\n type: \"channel_message\",\n channel: this.id,\n event: undefined,\n responseTo: message.requestId,\n payload: response,\n });\n }\n\n private resolvePending(message: ServerChannelResponseMessage): void {\n const entry = message.responseTo ? this.pending.get(message.responseTo) : undefined;\n if (!entry) {\n return;\n }\n this.pending.delete(message.responseTo!);\n if (message.error !== undefined && message.error !== null) {\n entry.reject(new PulseChannelResetError(String(message.error)));\n } else {\n entry.resolve(message.payload);\n }\n }\n\n private close(reason: PulseChannelResetError): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const request of this.pending.values()) {\n request.reject(reason);\n }\n this.pending.clear();\n this.handlers.clear();\n this.backlog = [];\n // No-op: owning client manages registry lifecycle.\n }\n}\n\nexport function createChannelBridge(\n client: PulseSocketIOClient,\n id: string\n): ChannelBridge {\n return new ChannelBridge(client, id);\n}\n",
14
+ "import { useEffect, useMemo } from \"react\";\nimport { usePulseClient } from \"./pulse\";\nimport type { ChannelBridge } from \"./channel\";\n\nexport function usePulseChannel(channelId: string): ChannelBridge {\n const client = usePulseClient();\n const bridge = useMemo(() => {\n if (!channelId) {\n throw new Error(\"usePulseChannel requires a non-empty channelId\");\n }\n return client.acquireChannel(channelId);\n }, [client, channelId]);\n\n useEffect(() => {\n return () => {\n client.releaseChannel(channelId);\n };\n }, [client, channelId]);\n\n return bridge;\n}\n",
15
+ "import React, { forwardRef, useCallback, type FormEvent } from \"react\";\n\nexport type PulseFormProps = React.ComponentPropsWithoutRef<\"form\"> & {\n action: string;\n};\n\n/**\n * PulseForm intercepts native form submissions and sends them through fetch so the\n * surrounding Pulse view stays mounted. Server-side handlers are still invoked via\n * the form action endpoint and reactive updates propagate over the socket.\n */\nexport const PulseForm = forwardRef<HTMLFormElement, PulseFormProps>(\n function PulseForm({ onSubmit, action, ...rest }, ref) {\n return (\n <form\n {...rest}\n action={action}\n ref={ref}\n onSubmit={useCallback(\n (event: FormEvent<HTMLFormElement>) =>\n submitForm({ event, action, onSubmit }),\n [action, onSubmit]\n )}\n />\n );\n }\n);\n\ninterface SubmitForm {\n event: React.FormEvent<HTMLFormElement>;\n action: string;\n onSubmit?: PulseFormProps[\"onSubmit\"];\n formData?: FormData;\n force?: boolean\n}\n\nexport async function submitForm({\n event,\n action,\n onSubmit,\n formData,\n force\n}: SubmitForm) {\n onSubmit?.(event);\n if (!force && event.defaultPrevented) {\n return;\n }\n const form = event.currentTarget;\n event.preventDefault();\n const nativeEvent = event.nativeEvent as SubmitEvent;\n if (!formData) {\n formData = new FormData(form, nativeEvent.submitter);\n }\n const url = new URL(action, window.location.href);\n try {\n await fetch(url, {\n method: \"POST\",\n // Required for our hosting scenarios of same host + different ports or 2 subdomains\n credentials: \"include\",\n body: formData,\n });\n } catch (err) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"[Pulse] Form submission failed\", err);\n } else {\n throw err;\n }\n }\n}\n",
13
16
  "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",
14
17
  "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",
16
- "// 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"
18
+ "// 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"
17
19
  ],
18
- "mappings": "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,YACA,eACA,aACA,YACA,cACA,eACA,aACA,YACA,cACA,MACF,EAEM,GAAmB,CACvB,YACA,WACA,OACF,EAEM,GAAyB,CAC7B,YACA,iBACA,iBACA,MACA,YACA,SACA,QACA,OACA,eACA,aACA,YACA,cACA,UACA,aACA,QACA,YACA,qBACA,kBACA,eACA,oBACA,WACF,EAEM,GAAiB,EAAyB,EAAE,GAAc,CAC9D,QAAS,EACX,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,EAAuB,CAAG,EAEtB,GAAqB,CACzB,eACA,OACA,eACA,UACA,WACA,YACA,YACA,OACA,cACA,WACA,WACA,OACA,qBACA,eACA,iBACA,QACA,OACA,aACA,oBACA,cACF,EACM,GAAoB,EAA8B,EAAkB,EAEpE,GAAiB,CACrB,UACF,EACM,GAAgB,EAA0B,EAAc,EAExD,GAAkB,CACtB,UACA,OACA,QACA,aACA,MACA,SACF,EACM,GAAiB,EAA2B,EAAe,EAE3D,GAAkB,CACtB,SACA,SACA,cACA,aACA,QACA,aACF,EACM,GACJ,EAAkC,EAAE,EAAe,EAC/C,GAAiB,CAAC,KAA2B,IAC9C,GAAe,CAAG,KAClB,GAAqB,CAAG,CAC7B,GAEM,GAAe,CACnB,OACF,EACM,GAAc,EAAwB,EAAY,EAElD,GAAiB,CACrB,OACA,QACF,EACM,GAAgB,EAA0B,EAAc,EAExD,GAAiB,CACrB,QACA,aACA,UACA,OACA,OACA,OACF,EACM,GAAgB,EAA0B,EAAc,EAExD,GAAkB,CACtB,SACF,EACM,GAAiB,EAA2B,EAAe,EAE3D,GAAoB,CACxB,MACF,EACM,GAAmB,EAA6B,EAAiB,EAEjE,GAAmB,CACvB,OACA,aACF,EACM,GAAkB,EAA4B,EAAgB,EAE9D,GAAgB,CACpB,OACF,EACM,GAAe,EAAyB,EAAa,EAErD,GAAgB,CAAC,IAAyB,EAAuB,CAAG,EAEpE,GAAoB,CACxB,OACF,EACM,EAAmB,EAA6B,EAAiB,EAEjE,GAAe,CACnB,QACA,QACA,UACA,OACA,OACF,EACM,GAAc,EAAwB,EAAY,EAElD,GAAiB,CACrB,SACF,EACM,GAAgB,EAA0B,EAAc,EAExD,GAAgB,CAAC,IAAyB,EAAuB,CAAG,EAEpE,GAAiB,CACrB,UACA,YACA,OACA,QACF,EACM,GAAgB,EAA0B,EAAc,EAExD,GAAc,CAClB,OACF,EACM,GAAq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",
19
- "debugId": "9693F40BB63A52DC64756E2164756E21",
20
+ "mappings": "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AC7B,YACA,iBACA,iBACA,MACA,YACA,SACA,QACA,OACA,eACA,aACA,YACA,cACA,UACA,aACA,QACA,YACA,qBACA,kBACA,eACA,oBACA,WACF,EAEM,GAAiB,EAAyB,EAAE,GAAc,CAC9D,QAAS,EACX,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,EA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",
21
+ "debugId": "618B63A0B4F1253264756E2164756E21",
20
22
  "names": []
21
23
  }