pulse-ui-client 0.0.13 → 0.0.15
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/client.d.ts +1 -1
- package/dist/index.bun.js +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +6 -6
- package/dist/index.node.js +3 -3
- package/dist/messages.d.ts +3 -0
- package/dist/pulse.d.ts +10 -3
- package/dist/renderer.d.ts +29 -3
- package/dist/vdom.d.ts +23 -2
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
"version": 3,
|
|
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/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
|
|
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
|
-
"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",
|
|
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 PulsePrerenderView = {\n vdom: VDOM;\n callbacks: string[];\n render_props: string[];\n css_refs: string[];\n};\n\nexport type PulsePrerender = {\n renderId: string;\n views: Record<string, PulsePrerenderView>;\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 cssModules: Record<string, Record<string, string>>;\n}\n\nexport function PulseView({\n externalComponents,\n path,\n cssModules,\n}: PulseViewProps) {\n const client = usePulseClient();\n const initialView = usePulsePrerender(path);\n const initialVDOM = initialView.vdom;\n const renderer = useMemo(\n () =>\n new VDOMRenderer(\n client,\n path,\n externalComponents,\n cssModules,\n initialView.callbacks,\n initialView.render_props,\n initialView.css_refs\n ),\n [client, path, externalComponents, cssModules, initialView]\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, callbacks, renderProps, cssRefs) => {\n renderer.setCallbacks(callbacks);\n renderer.setRenderProps(renderProps);\n renderer.setCssRefs(cssRefs);\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, VDOM } 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 private callbackProps: Map<string, Set<string>>;\n private renderPropKeys: Set<string>;\n private cssProps: Set<string>;\n constructor(\n private client: PulseSocketIOClient,\n private path: string,\n private components: ComponentRegistry,\n private cssModules: Record<string, Record<string, string>>,\n initialCallbacks: string[] = [],\n initialRenderProps: string[] = [],\n initialCssRefs: string[] = []\n ) {\n this.callbackCache = new Map();\n this.callbackProps = new Map();\n this.renderPropKeys = new Set(initialRenderProps);\n this.cssProps = new Set(initialCssRefs);\n this.setCallbacks(initialCallbacks);\n }\n\n setCallbacks(keys: string[]) {\n this.callbackProps.clear();\n this.callbackCache.clear();\n for (const key of keys) {\n const [path, prop] = this.splitPropPath(key);\n if (!this.callbackProps.has(path)) {\n this.callbackProps.set(path, new Set());\n }\n this.callbackProps.get(path)!.add(prop);\n }\n }\n\n applyCallbackDelta(\n delta: { add?: string[]; remove?: string[] },\n tree: React.ReactNode\n ): React.ReactNode {\n const beforeMap = new Map<string, Set<string>>();\n const recordBefore = (path: string) => {\n if (!beforeMap.has(path)) {\n beforeMap.set(path, new Set(this.callbackProps.get(path) ?? []));\n }\n };\n\n if (delta.remove) {\n for (const key of delta.remove) {\n const [path, prop] = this.splitPropPath(key);\n recordBefore(path);\n const current = this.callbackProps.get(path);\n if (!current) {\n this.callbackCache.delete(key);\n continue;\n }\n this.callbackCache.delete(key);\n current.delete(prop);\n if (current.size === 0) {\n this.callbackProps.delete(path);\n }\n }\n }\n\n if (delta.add) {\n for (const key of delta.add) {\n const [path, prop] = this.splitPropPath(key);\n recordBefore(path);\n if (!this.callbackProps.has(path)) {\n this.callbackProps.set(path, new Set());\n }\n this.callbackProps.get(path)!.add(prop);\n }\n }\n\n let nextTree = tree;\n for (const [path, before] of beforeMap.entries()) {\n const after = new Set(this.callbackProps.get(path) ?? []);\n if (this.setsEqual(before, after)) {\n continue;\n }\n const parts = path\n ? path.split(\".\").filter((segment) => segment.length > 0)\n : [];\n nextTree = this.updateCallbacksOnTree(\n nextTree,\n parts,\n 0,\n \"\",\n before,\n after\n );\n }\n\n return nextTree;\n }\n\n setRenderProps(keys: string[]) {\n this.renderPropKeys = new Set(keys);\n }\n\n setCssRefs(entries: string[]) {\n this.cssProps = new Set(entries);\n }\n\n applyRenderPropsDelta(delta: { add?: string[]; remove?: string[] }) {\n if (delta.remove) {\n for (const key of delta.remove) {\n this.renderPropKeys.delete(key);\n }\n }\n if (delta.add) {\n for (const key of delta.add) {\n this.renderPropKeys.add(key);\n }\n }\n }\n\n applyCssRefsDelta(delta: { set?: string[]; remove?: string[] }) {\n if (delta.set) {\n for (const prop of delta.set) {\n this.cssProps.add(prop);\n }\n }\n if (delta.remove) {\n for (const prop of delta.remove) {\n this.cssProps.delete(prop);\n }\n }\n }\n\n getCallback(path: string, prop: string) {\n const key = this.propPath(path, prop);\n let fn = this.callbackCache.get(key);\n if (!fn) {\n fn = (...args: any[]) => this.client.invokeCallback(this.path, key, args);\n this.callbackCache.set(key, fn);\n }\n return fn;\n }\n\n renderNode(node: VDOMNode, currentPath = \"\"): 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 const newProps = { ...props };\n\n // Apply callbacks\n for (const propName of this.getCallbackNames(currentPath)) {\n newProps[propName] = this.getCallback(currentPath, propName);\n }\n\n for (const [propName, propValue] of Object.entries(newProps)) {\n const propPath = this.propPath(currentPath, propName);\n if (this.cssProps.has(propPath)) {\n newProps[propName] = this.resolveCssToken(propValue);\n }\n if (this.renderPropKeys.has(propPath)) {\n // This prop is a render prop - render the VDOM to React\n newProps[propName] = this.renderNode(propValue, propPath);\n }\n }\n\n if (node.key) {\n newProps.key = node.key;\n }\n\n const renderedChildren = [];\n for (let index = 0; index < children.length; index += 1) {\n const child = children[index]!;\n const childPath = currentPath\n ? `${currentPath}.${index}`\n : String(index);\n renderedChildren.push(this.renderNode(child, childPath));\n }\n\n if (isMountPointNode(node)) {\n const componentKey = node.tag.slice(MOUNT_POINT_PREFIX.length);\n const Component = this.components[componentKey]!;\n if (!Component) {\n throw new Error(\n `Could not find component ${componentKey}. This is a Pulse internal error.`\n );\n }\n return createElement(Component, newProps, ...renderedChildren);\n }\n\n return createElement(\n tag === FRAGMENT_TAG ? React.Fragment : tag,\n newProps,\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 private splitPropPath(key: string): [path: string, prop: string] {\n const lastDot = key.lastIndexOf(\".\");\n if (lastDot === -1) {\n return [\"\", key];\n }\n return [key.slice(0, lastDot), key.slice(lastDot + 1)];\n }\n\n private propPath(path: string, prop: string) {\n return path ? `${path}.${prop}` : prop;\n }\n\n private getCallbackNames(path: string): string[] {\n const props = this.callbackProps.get(path);\n return props ? Array.from(props) : [];\n }\n\n transformValue(path: string, key: string, value: any) {\n const callbacks = this.callbackProps.get(path);\n const propPath = this.propPath(path, key);\n if (callbacks && callbacks.size > 0 && callbacks.has(key)) {\n return this.getCallback(path, key);\n }\n if (this.renderPropKeys.has(propPath)) {\n return this.renderNode(value, propPath);\n }\n if (this.cssProps.has(propPath)) {\n return this.resolveCssToken(value);\n }\n return value;\n }\n\n private resolveCssToken(token: string): string {\n const idx = token.indexOf(\":\");\n if (idx === -1) {\n return token;\n }\n const moduleId = token.slice(0, idx);\n const className = token.slice(idx + 1);\n if (!moduleId || !className) {\n return token;\n }\n const mod = this.cssModules[moduleId];\n if (!mod) {\n throw new Error(\n `Received CSS reference for unknown module '${moduleId}'`\n );\n }\n const resolved = mod[className];\n if (typeof resolved !== \"string\") {\n throw new Error(\n `Received CSS reference for missing class '${className}' in module '${moduleId}'`\n );\n }\n return resolved;\n }\n\n private updateCallbacksOnTree(\n node: React.ReactNode,\n parts: string[],\n depth: number,\n currentPath: string,\n before: Set<string>,\n after: Set<string>\n ): React.ReactNode {\n if (depth < parts.length) {\n assertIsElement(node, parts, depth);\n const element = node as React.ReactElement<Record<string, any> | null>;\n const segment = parts[depth]!;\n const childIdx = Number(segment);\n const nextPath = currentPath ? `${currentPath}.${segment}` : segment;\n if (!Number.isNaN(childIdx)) {\n const childrenArr = ensureChildrenArray(element);\n const child = childrenArr[childIdx];\n const updatedChild = this.updateCallbacksOnTree(\n child,\n parts,\n depth + 1,\n nextPath,\n before,\n after\n );\n if (updatedChild === child) {\n return node;\n }\n childrenArr[childIdx] = updatedChild as any;\n return cloneElement(element, undefined, ...childrenArr);\n } else {\n const baseProps = (element.props ?? {}) as Record<string, any>;\n const child = baseProps[segment];\n const updatedChild = this.updateCallbacksOnTree(\n child,\n parts,\n depth + 1,\n nextPath,\n before,\n after\n );\n if (updatedChild === child) {\n return node;\n }\n return cloneElement(element, {\n ...baseProps,\n [segment]: updatedChild,\n });\n }\n }\n\n if (!isValidElement(node)) {\n return node;\n }\n\n const element = node as React.ReactElement<Record<string, any> | null>;\n const currentProps = (element.props ?? {}) as Record<string, any>;\n let changed = false;\n const nextProps: Record<string, any> = { ...currentProps };\n\n for (const prop of before) {\n if (!after.has(prop) && prop in nextProps) {\n delete nextProps[prop];\n changed = true;\n }\n }\n\n for (const prop of after) {\n const fn = this.getCallback(currentPath, prop);\n if (nextProps[prop] !== fn) {\n nextProps[prop] = fn;\n changed = true;\n }\n }\n\n if (!changed) {\n return node;\n }\n return cloneElement(element, nextProps);\n }\n\n private setsEqual(left: Set<string>, right: Set<string>): boolean {\n if (left.size !== right.size) {\n return false;\n }\n for (const value of left) {\n if (!right.has(value)) {\n return false;\n }\n }\n return true;\n }\n}\n\n// =================================================================\n// Update Functions (shallow-clone along update path)\n// =================================================================\n\nfunction ensureChildrenArray(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\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 if (update.type === \"update_callbacks\") {\n newTree = renderer.applyCallbackDelta(update.data, newTree);\n continue;\n }\n if (update.type === \"update_css_refs\") {\n renderer.applyCssRefsDelta(update.data);\n continue;\n }\n if (update.type === \"update_render_props\") {\n renderer.applyRenderPropsDelta(update.data);\n continue;\n }\n\n const parts = update.path.split(\".\").filter((s) => s.length > 0);\n\n const descend = (\n node: React.ReactNode,\n depth: number,\n currentPath: string\n ): React.ReactNode => {\n if (depth < parts.length) {\n assertIsElement(node, parts, depth);\n const element = node as React.ReactElement<Record<string, any> | null>;\n const childKey = parts[depth]!;\n const childIdx = +childKey;\n const childPath = currentPath ? `${currentPath}.${childKey}` : childKey;\n if (!Number.isNaN(childIdx)) {\n // Regular child traversal\n const childrenArr = ensureChildrenArray(element);\n const child = childrenArr[childIdx];\n childrenArr[childIdx] = descend(child, depth + 1, childPath) as any;\n return cloneElement(element, undefined, ...childrenArr);\n } else {\n // Render prop traversal\n const baseProps = (element.props ?? {}) as Record<string, any>;\n const child = baseProps[childKey];\n const props = {\n ...baseProps,\n [childKey]: descend(child, depth + 1, childPath),\n };\n return cloneElement(element, props);\n }\n }\n switch (update.type) {\n case \"replace\": {\n return renderer.renderNode(update.data, update.path);\n }\n case \"update_props\": {\n assertIsElement(node, parts, depth);\n const element = node as React.ReactElement;\n const currentProps = (element.props ?? {}) as Record<string, any>;\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) {\n delete nextProps[key];\n }\n }\n }\n if (delta.set) {\n for (const [k, v] of Object.entries(delta.set)) {\n nextProps[k] = renderer.transformValue(currentPath, k, v);\n }\n }\n // Not passing children -> only update the props\n return cloneElement(element, nextProps);\n }\n case \"insert\": {\n assertIsElement(node, parts, depth);\n const element = node as React.ReactElement;\n const children = ensureChildrenArray(element);\n const childPath = currentPath\n ? `${currentPath}.${update.idx}`\n : String(update.idx);\n children.splice(\n update.idx,\n 0,\n renderer.renderNode(update.data, childPath)\n );\n // Only update the children (TypeScript doesn't like the `null`, but that's what the official React docs say)\n return cloneElement(element, null!, ...children);\n }\n case \"remove\": {\n assertIsElement(node, parts, depth);\n const element = node as React.ReactElement;\n const children = ensureChildrenArray(element);\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(element, null!, ...children);\n }\n case \"move\": {\n assertIsElement(node, parts, depth);\n const element = node as React.ReactElement;\n const children = ensureChildrenArray(element);\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(element, 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: string[],\n depth: number\n): node is React.ReactElement {\n if (process.env.NODE_ENV !== \"production\" && !isValidElement(node)) {\n console.error(\"Invalid node:\", node);\n throw new Error(\"Invalid node at path \" + parts.slice(0, depth).join(\".\"));\n }\n return true;\n}\n",
|
|
7
|
+
"import type { ComponentType } from \"react\";\n\n// Special prefixes for reserved node types\nexport const FRAGMENT_TAG = \"$$fragment\";\nexport const MOUNT_POINT_PREFIX = \"$$\";\n\n// export type LazyComponent = () => Promise<{ default: ComponentType<any> }>;\nexport type RegistryEntry = ComponentType<any>;\nexport type ComponentRegistry = Record<string, ComponentType<any>>;\n\nexport interface VDOMElement {\n tag: string;\n props?: Record<string, any>;\n children?: VDOMNode[];\n key?: string;\n lazy?: boolean;\n}\n\n// Primitive nodes that can be rendered\nexport type PrimitiveNode = string | number | boolean;\n\n// VDOMNode is either a primitive (string, number, boolean) or an element node.\n// Booleans are valid children in React but do not render anything.\n// Mount points are just UIElementNodes with tags starting with $$ComponentKey\nexport type VDOMNode = PrimitiveNode | VDOMElement;\n\nexport type VDOM = VDOMNode;\n\nexport type UpdateType =\n | \"insert\"\n | \"remove\"\n | \"replace\"\n | \"update_props\"\n | \"move\"\n | \"update_callbacks\"\n | \"update_render_props\"\n | \"update_css_refs\";\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 interface UpdateCallbacksUpdate extends VDOMUpdateBase {\n type: \"update_callbacks\";\n data: {\n add?: string[]; // full callback keys like \"0.1.onClick\"\n remove?: string[];\n };\n}\n\nexport interface UpdateRenderPropsUpdate extends VDOMUpdateBase {\n type: \"update_render_props\";\n data: {\n add?: string[]; // render prop keys like \"0.1.leftSection\"\n remove?: string[];\n };\n}\n\nexport interface UpdateCssRefsUpdate extends VDOMUpdateBase {\n type: \"update_css_refs\";\n data: {\n set?: string[];\n remove?: string[];\n };\n}\n\nexport type VDOMUpdate =\n | InsertUpdate\n | RemoveUpdate\n | ReplaceUpdate\n | UpdatePropsUpdate\n | MoveUpdate\n | UpdateCallbacksUpdate\n | UpdateRenderPropsUpdate\n | UpdateCssRefsUpdate;\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
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",
|
|
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: (\n vdom: VDOM,\n callbacks: string[],\n renderProps: string[],\n cssRefs: string[]\n ) => 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 }> =\n 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(\n deserialize(data, { coerceNullsToUndefined: true })\n )\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(\n message: ClientChannelMessage\n ): 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(\n message.vdom,\n message.callbacks,\n message.render_props,\n message.css_refs\n );\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(\n new PulseChannelResetError(\"Connection lost\")\n );\n }\n }\n\n // public getVDOM(path: string): VDOM | null {\n // return this.activeViews.get(path)?.vdom ?? null;\n // }\n}\n",
|
|
13
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
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
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",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
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}",
|
|
18
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"
|
|
19
19
|
],
|
|
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": "
|
|
20
|
+
"mappings": "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,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,G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",
|
|
21
|
+
"debugId": "E15FD8696B30CE4A64756E2164756E21",
|
|
22
22
|
"names": []
|
|
23
23
|
}
|