pulse-ui-client 0.0.1 → 0.0.2

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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # pulse-react
1
+ # pulse-client
2
2
 
3
3
  To install dependencies:
4
4
 
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export type { PulseConfig, PulseProviderProps } from "./pulse";
3
3
  export { PulseSocketIOClient } from "./client";
4
4
  export type { PulseClient, MountedView, VDOMListener, ConnectionStatusListener, ServerErrorListener, } from "./client";
5
5
  export type { VDOM, VDOMNode, VDOMElement, VDOMUpdate, ComponentRegistry, } from "./vdom";
6
- export { VDOMRenderer, createElementNode, createFragment, createMountPoint, applyVDOMUpdates, } from "./renderer";
6
+ export { VDOMRenderer, createElementNode, createFragment, createMountPoint, applyVDOMUpdates, RenderLazy, } from "./renderer";
7
7
  export type { ServerMessage, ServerInitMessage, ServerUpdateMessage, ServerErrorMessage, ServerErrorInfo, ServerApiCallMessage, ServerNavigateToMessage, ClientMessage, ClientCallbackMessage, ClientMountMessage, ClientNavigateMessage, ClientUnmountMessage, ClientApiResultMessage, } from "./messages";
8
8
  export { SocketIOTransport } from "./transport";
9
9
  export type { Transport, MessageListener } from "./transport";
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import{useEffect as g,useState as x,useMemo as v,createContext as t,useContext as e}from"react";import Qq,{memo as Wq}from"react";var p="$$fragment",j="$$";function w(q){return typeof q==="object"&&q!==null}function L(q){return typeof q==="object"&&q!==null&&q.tag.startsWith("$$")&&q.tag!=="$$fragment"}function o(q){if(!L(q))throw new Error("Node is not a mount point");return q.tag.slice(2)}import{jsxDEV as V,Fragment as c}from"react/jsx-dev-runtime";function H(q,J){if(w(q))return q.key||J;return J}var O=Wq(({node:q})=>{let{getCallback:J,getComponent:Z}=h();if(q===null||typeof q==="boolean"||q===void 0)return null;if(typeof q==="string"||typeof q==="number")return V(c,{children:q},void 0,!1,void 0,this);if(w(q)){if(!(("tag"in q)&&typeof q.tag==="string"))return console.error("Invalid VDOM element node received:",q),null;let{tag:$,props:Q={},children:X=[]}=q,z={};for(let[W,f]of Object.entries(Q))if(typeof f==="string"&&f.startsWith("$$fn:")){let G=f.substring(5);z[W]=J(G)}else z[W]=f;if(L(q)){let W=o(q),f=Z(W),G=X.map((N,_)=>V(O,{node:N},H(N,_),!1,void 0,this));return V(f,{...z,children:G},void 0,!1,void 0,this)}if($===p)return V(c,{children:X.map((W,f)=>V(O,{node:W},H(W,f),!1,void 0,this))},void 0,!1,void 0,this);let S=X.map((W,f)=>V(O,{node:W},H(W,f),!1,void 0,this));return Qq.createElement($,z,...S)}return console.error("Unknown VDOM node type:",q),null});O.displayName="VDOMRenderer";function fq(q,J={},Z=[],$){if(q.startsWith(j))console.error(`[Pulse] Error: The tag "${q}" starts with a reserved prefix "${j}". Please use a different tag name.`);let Q={tag:q,props:J,children:Z};if($!==void 0)Q.key=$;return Q}function Xq(q=[],J){let Z={tag:p,props:{},children:q};if(J!==void 0)Z.key=J;return Z}function zq(q,J={},Z=[],$){let Q={tag:j+q,props:J,children:Z};if($!==void 0)Q.key=$;return Q}function Aq(q,J){if(J==="")return w(q)?q:null;let Z=J.split(".").map(Number),$=q;for(let Q of Z){if(!w($))return console.error("[findNodeByPath] Invalid path: part of it is not an element node."),null;if(!$.children||Q>=$.children.length)return console.error(`[findNodeByPath] Invalid path: index ${Q} out of bounds.`),null;$=$.children[Q]}return w($)?$:null}function Gq(q){if(typeof q!=="object"||q===null)return q;return JSON.parse(JSON.stringify(q))}function u(q,J){let Z=Gq(q);for(let $ of J){let{type:Q,path:X,data:z}=$;if(X===""){switch(Q){case"replace":Z=z;break;case"update_props":if(w(Z))Z.props={...Z.props??{},...z};break;default:console.error(`[applyUpdates] Invalid root operation: ${Q}`)}continue}let S=X.substring(0,X.lastIndexOf(".")),W=parseInt(X.substring(X.lastIndexOf(".")+1),10),f=Aq(Z,S);if(!f){console.error(`[applyUpdates] Could not find parent for path: ${X}`);continue}if(!f.children)f.children=[];switch(Q){case"replace":f.children[W]=z;break;case"update_props":let G=f.children[W];if(w(G))G.props={...G.props??{},...z};break;case"insert":f.children.splice(W,0,z);break;case"remove":f.children.splice(W,1);break;case"move":{let N=f.children.splice(z.from_index,1)[0];f.children.splice(z.to_index,0,N);break}}}return Z}function Rq(q){return{id:q.id,class_name:q.className,tag_name:q.tagName.toLowerCase(),local_name:q.localName,client_height:q.clientHeight,client_left:q.clientLeft,client_top:q.clientTop,client_width:q.clientWidth,scroll_height:q.scrollHeight,scroll_left:q.scrollLeft,scroll_top:q.scrollTop,scroll_width:q.scrollWidth,slot:q.slot}}function Uq(q){return{autofocus:q.autofocus,tab_index:q.tabIndex,nonce:q.nonce}}function Y(q){return{...Rq(q),...Uq(q),access_key:q.accessKey,access_key_label:q.accessKeyLabel,autocapitalize:q.autocapitalize,dir:q.dir,draggable:q.draggable,hidden:q.hidden,inert:q.inert,lang:q.lang,offset_height:q.offsetHeight,offset_left:q.offsetLeft,offset_top:q.offsetTop,offset_width:q.offsetWidth,popover:q.popover,spellcheck:q.spellcheck,title:q.title,translate:q.translate,writing_suggestions:q.writingSuggestions,content_editable:q.contentEditable,enter_key_hint:q.enterKeyHint,is_content_editable:q.isContentEditable,input_mode:q.inputMode}}function Kq(q){return{...Y(q),hash:q.hash,host:q.host,hostname:q.hostname,href:q.href,origin:q.origin,password:q.password,pathname:q.pathname,port:q.port,protocol:q.protocol,search:q.search,target:q.target,download:q.download,rel:q.rel,hreflang:q.hreflang,type:q.type,username:q.username,ping:q.ping,referrer_policy:q.referrerPolicy,text:q.text}}function _q(q){return{...Y(q),alt:q.alt,coords:q.coords,download:q.download,hash:q.hash,host:q.host,hostname:q.hostname,href:q.href,origin:q.origin,password:q.password,pathname:q.pathname,port:q.port,protocol:q.protocol,rel:q.rel,search:q.search,shape:q.shape,target:q.target,username:q.username,ping:q.ping,referrer_policy:q.referrerPolicy}}function a(q){return{...Y(q),autoplay:q.autoplay,controls:q.controls,cross_origin:q.crossOrigin,current_src:q.currentSrc,current_time:q.currentTime,default_muted:q.defaultMuted,default_playback_rate:q.defaultPlaybackRate,duration:q.duration,ended:q.ended,loop:q.loop,muted:q.muted,network_state:q.networkState,paused:q.paused,playback_rate:q.playbackRate,preload:q.preload,ready_state:q.readyState,seeking:q.seeking,src:q.src,volume:q.volume,preserves_pitch:q.preservesPitch}}function wq(q){return{...a(q)}}function Fq(q){return{...Y(q),disabled:q.disabled,name:q.name,type:q.type,value:q.value,form_action:q.formAction,form_enctype:q.formEnctype,form_method:q.formMethod,form_no_validate:q.formNoValidate,form_target:q.formTarget,popover_target_action:q.popoverTargetAction}}function Sq(q){return{...Y(q),value:q.value}}function Iq(q){return{...Y(q),height:q.height,src:q.src,type:q.type,width:q.width,align:q.align,name:q.name}}function Oq(q){return{...Y(q),disabled:q.disabled,name:q.name,type:q.type,validation_message:q.validationMessage,will_validate:q.willValidate}}function Nq(q){return{...Y(q),accept_charset:q.acceptCharset,action:q.action,autocomplete:q.autocomplete,encoding:q.encoding,enctype:q.enctype,length:q.length,method:q.method,name:q.name,no_validate:q.noValidate,target:q.target,rel:q.rel}}function Cq(q){return{...Y(q),allow:q.allow,allow_fullscreen:q.allowFullscreen,height:q.height,name:q.name,referrer_policy:q.referrerPolicy,src:q.src,srcdoc:q.srcdoc,width:q.width,align:q.align,frame_border:q.frameBorder,long_desc:q.longDesc,margin_height:q.marginHeight,margin_width:q.marginWidth,scrolling:q.scrolling,sandbox:q.sandbox}}function Vq(q){return{...Y(q),alt:q.alt,cross_origin:q.crossOrigin,decoding:q.decoding,height:q.height,is_map:q.isMap,loading:q.loading,natural_height:q.naturalHeight,natural_width:q.naturalWidth,referrer_policy:q.referrerPolicy,sizes:q.sizes,src:q.src,srcset:q.srcset,use_map:q.useMap,width:q.width,align:q.align,border:q.border,complete:q.complete,hspace:q.hspace,long_desc:q.longDesc,lowsrc:q.lowsrc,name:q.name,vspace:q.vspace,x:q.x,y:q.y,fetch_priority:q.fetchPriority}}function Pq(q){return{...Y(q),accept:q.accept,alt:q.alt,autocomplete:q.autocomplete,checked:q.checked,default_checked:q.defaultChecked,default_value:q.defaultValue,dir_name:q.dirName,disabled:q.disabled,height:q.height,indeterminate:q.indeterminate,max:q.max,max_length:q.maxLength,min:q.min,min_length:q.minLength,multiple:q.multiple,name:q.name,pattern:q.pattern,placeholder:q.placeholder,read_only:q.readOnly,required:q.required,selection_direction:q.selectionDirection,selection_end:q.selectionEnd,selection_start:q.selectionStart,size:q.size,src:q.src,step:q.step,type:q.type,value:q.value,value_as_number:q.valueAsNumber,width:q.width,align:q.align,capture:q.capture,form_action:q.formAction,form_enctype:q.formEnctype,form_method:q.formMethod,form_no_validate:q.formNoValidate,form_target:q.formTarget,use_map:q.useMap,validation_message:q.validationMessage,will_validate:q.willValidate,popover_target_action:q.popoverTargetAction}}function Dq(q){return{...Y(q),html_for:q.htmlFor}}function bq(q){return{...Y(q),value:q.value,type:q.type}}function jq(q){return{...Y(q),as:q.as,cross_origin:q.crossOrigin,disabled:q.disabled,fetch_priority:q.fetchPriority,href:q.href,href_lang:q.hreflang,image_sizes:q.imageSizes,image_srcset:q.imageSrcset,integrity:q.integrity,media:q.media,referrer_policy:q.referrerPolicy,rel:q.rel,type:q.type,charset:q.charset,rev:q.rev,target:q.target,sizes:q.sizes}}function kq(q){return{...Y(q),name:q.name}}function yq(q){return{...Y(q),high:q.high,low:q.low,max:q.max,min:q.min,optimum:q.optimum,value:q.value}}function Bq(q){return{...Y(q),cite:q.cite,dateTime:q.dateTime}}function gq(q){return{...Y(q),reversed:q.reversed,start:q.start,type:q.type,compact:q.compact}}function pq(q){return{...Y(q),data:q.data,height:q.height,name:q.name,type:q.type,use_map:q.useMap,width:q.width,validation_message:q.validationMessage,will_validate:q.willValidate,align:q.align,archive:q.archive,border:q.border,code:q.code,code_base:q.codeBase,code_type:q.codeType,declare:q.declare,hspace:q.hspace,standby:q.standby,vspace:q.vspace}}function Lq(q){return{...Y(q),disabled:q.disabled,label:q.label}}function Hq(q){return{...Y(q),default_selected:q.defaultSelected,disabled:q.disabled,index:q.index,label:q.label,selected:q.selected,text:q.text,value:q.value}}function uq(q){return{...Y(q),default_value:q.defaultValue,name:q.name,type:q.type,value:q.value,html_for:q.htmlFor,validation_message:q.validationMessage,will_validate:q.willValidate}}function hq(q){return{...Y(q),max:q.max,position:q.position,value:q.value}}function Mq(q){return{...Y(q),cite:q.cite}}function Tq(q){return{...Y(q)}}function iq(q){return{...Y(q),async_:q.async,cross_origin:q.crossOrigin,defer:q.defer,fetch_priority:q.fetchPriority,integrity:q.integrity,no_module:q.noModule,referrer_policy:q.referrerPolicy,src:q.src,text:q.text,type:q.type,charset:q.charset,event:q.event,html_for:q.htmlFor}}function mq(q){return{...Y(q),autocomplete:q.autocomplete,disabled:q.disabled,length:q.length,multiple:q.multiple,name:q.name,required:q.required,selected_index:q.selectedIndex,size:q.size,type:q.type,value:q.value,validation_message:q.validationMessage,will_validate:q.willValidate}}function dq(q){return{...Y(q),name:q.name}}function Eq(q){return{...Y(q),height:q.height,media:q.media,sizes:q.sizes,src:q.src,srcset:q.srcset,type:q.type,width:q.width}}function xq(q){return{...Y(q),align:q.align}}function vq(q){return{...Y(q),abbr:q.abbr,cell_index:q.cellIndex,col_span:q.colSpan,headers:q.headers,row_span:q.rowSpan,scope:q.scope,align:q.align,axis:q.axis,bg_color:q.bgColor,ch:q.ch,ch_off:q.chOff,height:q.height,no_wrap:q.noWrap,v_align:q.vAlign,width:q.width}}function sq(q){return{...Y(q),span:q.span,align:q.align,ch:q.ch,ch_off:q.chOff,v_align:q.vAlign,width:q.width}}function oq(q){return{...Y(q),align:q.align,bg_color:q.bgColor,border:q.border,cell_padding:q.cellPadding,cell_spacing:q.cellSpacing,frame:q.frame,rules:q.rules,summary:q.summary,width:q.width}}function cq(q){return{...Y(q),row_index:q.rowIndex,section_row_index:q.sectionRowIndex,align:q.align,bg_color:q.bgColor,ch:q.ch,ch_off:q.chOff,v_align:q.vAlign}}function rq(q){return{...Y(q),align:q.align,ch:q.ch,ch_off:q.chOff,v_align:q.vAlign}}function nq(q){return{...Y(q)}}function aq(q){return{...Y(q),autocomplete:q.autocomplete,cols:q.cols,default_value:q.defaultValue,dir_name:q.dirName,disabled:q.disabled,max_length:q.maxLength,min_length:q.minLength,name:q.name,placeholder:q.placeholder,read_only:q.readOnly,required:q.required,rows:q.rows,selection_direction:q.selectionDirection,selection_end:q.selectionEnd,selection_start:q.selectionStart,value:q.value,wrap:q.wrap,text_length:q.textLength,validation_message:q.validationMessage,will_validate:q.willValidate}}function lq(q){return{...Y(q),datetime:q.dateTime}}function tq(q){return{...Y(q),default:q.default,kind:q.kind,label:q.label,ready_state:q.readyState,src:q.src,srclang:q.srclang}}function eq(q){return{...a(q),height:q.height,poster:q.poster,video_height:q.videoHeight,video_width:q.videoWidth,width:q.width,plays_inline:q.playsInline}}function q1(q){return{...Y(q),clear:q.clear}}function J1(q){return{...Y(q),href:q.href,target:q.target}}function Y1(q){return{...Y(q),a_link:q.aLink,background:q.background,bg_color:q.bgColor,link:q.link,text:q.text,v_link:q.vLink}}function Z1(q){return{...Y(q),compact:q.compact}}function $1(q){return{...Y(q),open:q.open}}function Q1(q){return{...Y(q),open:q.open,return_value:q.returnValue}}function W1(q){return{...Y(q),align:q.align}}function f1(q){return{...Y(q)}}function X1(q){return{...Y(q),align:q.align}}function z1(q){return{...Y(q),align:q.align,color:q.color,no_shade:q.noShade,size:q.size,width:q.width}}function A1(q){return{...Y(q),version:q.version}}function G1(q){return{...Y(q)}}function R1(q){return{...Y(q),content:q.content,http_equiv:q.httpEquiv,name:q.name,scheme:q.scheme}}function U1(q){return{...Y(q),align:q.align}}function K1(q){return{...Y(q)}}function _1(q){return{...Y(q),width:q.width}}function w1(q){return{...Y(q)}}function F1(q){return{...Y(q),media:q.media,type:q.type,disabled:q.disabled}}function S1(q){return{...Y(q),text:q.text}}function I1(q){return{...Y(q),compact:q.compact,type:q.type}}function P(q){switch(q.tagName.toUpperCase()){case"A":return Kq(q);case"AREA":return _q(q);case"AUDIO":return wq(q);case"BASE":return J1(q);case"BLOCKQUOTE":case"Q":return Mq(q);case"BODY":return Y1(q);case"BR":return q1(q);case"BUTTON":return Fq(q);case"CANVAS":return Y(q);case"CAPTION":return xq(q);case"CITE":return Tq(q);case"COL":case"COLGROUP":return sq(q);case"DATA":return Sq(q);case"DETAILS":return $1(q);case"DIALOG":return Q1(q);case"DIV":return W1(q);case"DL":return Z1(q);case"EMBED":return Iq(q);case"FIELDSET":return Oq(q);case"FORM":return Nq(q);case"H1":case"H2":case"H3":case"H4":case"H5":case"H6":return X1(q);case"HEAD":return f1(q);case"HR":return z1(q);case"HTML":return A1(q);case"IFRAME":return Cq(q);case"IMG":return Vq(q);case"INPUT":return Pq(q);case"LABEL":return Dq(q);case"LI":return bq(q);case"LINK":return jq(q);case"MAP":return kq(q);case"MENU":return G1(q);case"META":return R1(q);case"METER":return yq(q);case"INS":case"DEL":return Bq(q);case"OBJECT":return pq(q);case"OL":return gq(q);case"OPTGROUP":return Lq(q);case"OPTION":return Hq(q);case"OUTPUT":return uq(q);case"P":return U1(q);case"PICTURE":return K1(q);case"PRE":return _1(q);case"PROGRESS":return hq(q);case"SCRIPT":return iq(q);case"SELECT":return mq(q);case"SLOT":return dq(q);case"SOURCE":return Eq(q);case"SPAN":return w1(q);case"STYLE":return F1(q);case"TABLE":return oq(q);case"TBODY":case"THEAD":case"TFOOT":return rq(q);case"TD":case"TH":return vq(q);case"TEMPLATE":return nq(q);case"TEXTAREA":return aq(q);case"TIME":return lq(q);case"TITLE":return S1(q);case"TR":return cq(q);case"TRACK":return tq(q);case"UL":return I1(q);case"VIDEO":return eq(q);default:throw new Error(`Unexpected HTML element tag: ${q.tagName} (update .web/custom/serialize.ts)`)}}function K(q){return{target:P(q.target),bubbles:q.bubbles,cancelable:q.cancelable,default_prevented:q.defaultPrevented,event_phase:q.eventPhase,is_trusted:q.isTrusted,timestamp:q.timeStamp,type:q.type}}function y(q){return{...K(q),detail:q.detail}}function A(q){return{...y(q),alt_key:q.altKey,button:q.button,buttons:q.buttons,client_x:q.clientX,client_y:q.clientY,ctrl_key:q.ctrlKey,meta_key:q.metaKey,movement_x:q.movementX,movement_y:q.movementY,page_x:q.pageX,page_y:q.pageY,related_target:q.relatedTarget?P(q.relatedTarget):null,screen_x:q.screenX,screen_y:q.screenY,shift_key:q.shiftKey}}function M(q){return{...K(q),clipboard_data:l(q.clipboardData)}}function T(q){return{...K(q),data:q.data}}function F(q){return{...A(q),data_transfer:l(q.dataTransfer)}}function U(q){return{...A(q),pointer_id:q.pointerId,pressure:q.pressure,tangential_pressure:q.tangentialPressure,tilt_x:q.tiltX,tilt_y:q.tiltY,twist:q.twist,width:q.width,height:q.height,pointer_type:q.pointerType,is_primary:q.isPrimary}}function r(q){return{...K(q),related_target:q.relatedTarget?P(q.relatedTarget):null}}function d(q){return K(q)}function O1(q){return K(q)}function n(q){return d(q)}function i(q){return{...y(q),alt_key:q.altKey,ctrl_key:q.ctrlKey,code:q.code,key:q.key,locale:q.locale,location:q.location,meta_key:q.metaKey,repeat:q.repeat,shift_key:q.shiftKey}}function k(q){return{...y(q),alt_key:q.altKey,changed_touches:Array.from(q.changedTouches).map((J)=>({target:P(J.target),identifier:J.identifier,screen_x:J.screenX,screen_y:J.screenY,client_x:J.clientX,client_y:J.clientY,page_x:J.pageX,page_y:J.pageY})),ctrl_key:q.ctrlKey,meta_key:q.metaKey,shift_key:q.shiftKey,target_touches:Array.from(q.targetTouches).map((J)=>({target:P(J.target),identifier:J.identifier,screen_x:J.screenX,screen_y:J.screenY,client_x:J.clientX,client_y:J.clientY,page_x:J.pageX,page_y:J.pageY})),touches:Array.from(q.touches).map((J)=>({target:P(J.target),identifier:J.identifier,screen_x:J.screenX,screen_y:J.screenY,client_x:J.clientX,client_y:J.clientY,page_x:J.pageX,page_y:J.pageY}))}}function N1(q){return{...A(q),delta_mode:q.deltaMode,delta_x:q.deltaX,delta_y:q.deltaY,delta_z:q.deltaZ}}function m(q){return{...K(q),animation_name:q.animationName,elapsed_time:q.elapsedTime,pseudo_element:q.pseudoElement}}function C1(q){return{...K(q),old_state:q.oldState,new_state:q.newState}}function V1(q){return{...K(q),elapsed_time:q.elapsedTime,property_name:q.propertyName,pseudo_element:q.pseudoElement}}function l(q){if(!q)return null;let J=[];if(q.items)for(let Z=0;Z<q.items.length;Z++){let $=q.items[Z];J.push({kind:$.kind,type:$.type})}return{drop_effect:q.dropEffect,effect_allowed:q.effectAllowed,items:J,types:Array.from(q.types||[])}}var P1={pointerdown:U,pointermove:U,pointerup:U,pointercancel:U,gotpointercapture:U,lostpointercapture:U,pointerenter:U,pointerleave:U,pointerover:U,pointerout:U,click:A,contextmenu:A,dblclick:A,mousedown:A,mouseenter:A,mouseleave:A,mousemove:A,mouseout:A,mouseover:A,mouseup:A,drag:F,dragend:F,dragenter:F,dragexit:F,dragleave:F,dragover:F,dragstart:F,drop:F,keydown:i,keypress:i,keyup:i,focus:r,blur:r,change:n,input:n,invalid:O1,reset:d,submit:d,copy:M,cut:M,paste:M,compositionend:T,compositionstart:T,compositionupdate:T,touchcancel:k,touchend:k,touchmove:k,touchstart:k,scroll:y,wheel:N1,animationstart:m,animationend:m,animationiteration:m,transitionend:V1,toggle:C1};function E(q){if(q&&typeof q==="object"&&"nativeEvent"in q&&typeof q.isDefaultPrevented==="function"){let J=q;if(typeof J.type!=="string")return q;let Z=P1[J.type.toLowerCase()];if(Z)return Z(J);return console.warn(`No specific extractor for event type "${J.type}". Using synthetic.`),K(J)}return q}import{io as D1}from"socket.io-client";class B{url;frameworkNavigate;activeViews;socket=null;messageQueue;connectionListeners=new Set;serverErrors=new Map;serverErrorListeners=new Set;constructor(q,J){this.url=q;this.frameworkNavigate=J;this.socket=null,this.activeViews=new Map,this.messageQueue=[]}isConnected(){return this.socket?.connected??!1}async connect(){if(this.socket)return;return new Promise((q,J)=>{let Z=D1(this.url,{transports:["websocket"]});this.socket=Z,Z.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let[$,Q]of this.activeViews)Z.emit("message",{type:"mount",path:$,routeInfo:Q.routeInfo});for(let $ of this.messageQueue){if($.type==="mount"&&this.activeViews.has($.path))continue;if($.type==="navigate")continue;Z.emit("message",$)}this.messageQueue=[],this.notifyConnectionListeners(!0),q()}),Z.on("connect_error",($)=>{console.error("[SocketIOTransport] Connection failed:",$),this.notifyConnectionListeners(!1),J($)}),Z.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.notifyConnectionListeners(!1)}),Z.on("message",($)=>this.handleServerMessage($))})}onConnectionChange(q){return this.connectionListeners.add(q),q(this.isConnected()),()=>{this.connectionListeners.delete(q)}}notifyConnectionListeners(q){for(let J of this.connectionListeners)J(q)}onServerError(q){this.serverErrorListeners.add(q);for(let[J,Z]of this.serverErrors)q(J,Z);return()=>{this.serverErrorListeners.delete(q)}}notifyServerError(q,J){for(let Z of this.serverErrorListeners)Z(q,J)}async sendMessage(q){if(this.isConnected())this.socket.emit("message",q);else this.messageQueue.push(q)}mountView(q,J){if(this.activeViews.has(q))throw new Error(`Path ${q} is already mounted`);this.activeViews.set(q,J),this.sendMessage({type:"mount",path:q,routeInfo:J.routeInfo})}async navigate(q,J){await this.sendMessage({type:"navigate",path:q,routeInfo:J})}unmount(q){this.sendMessage({type:"unmount",path:q}),this.activeViews.delete(q)}disconnect(){this.socket?.disconnect(),this.socket=null,this.messageQueue=[],this.connectionListeners.clear(),this.activeViews.clear(),this.serverErrors.clear(),this.serverErrorListeners.clear()}handleServerMessage(q){switch(q.type){case"vdom_init":{let J=this.activeViews.get(q.path);if(J)J.vdom=q.vdom,J.listener(J.vdom);if(this.serverErrors.has(q.path))this.serverErrors.delete(q.path),this.notifyServerError(q.path,null);break}case"vdom_update":{let J=this.activeViews.get(q.path);if(!J||!J.vdom){console.error(`[PulseClient] Received VDOM update for path ${q.path} before initial tree was set.`);return}if(J.vdom=u(J.vdom,q.ops),J.listener(J.vdom),this.serverErrors.has(q.path))this.serverErrors.delete(q.path),this.notifyServerError(q.path,null);break}case"server_error":{this.serverErrors.set(q.path,q.error),this.notifyServerError(q.path,q.error);break}case"api_call":{this.performApiCall(q);break}case"navigate_to":{try{let J=q.path;if(this.frameworkNavigate)this.frameworkNavigate(J);else window.history.pushState({},"",J),window.dispatchEvent(new PopStateEvent("popstate"))}catch(J){console.error("Navigation error:",J)}break}}}async performApiCall(q){try{let J=await fetch(q.url,{method:q.method||"GET",headers:{...q.headers||{},...q.body!=null&&!("content-type"in(q.headers||{}))?{"content-type":"application/json"}:{}},body:q.body!=null?typeof q.body==="string"?q.body:JSON.stringify(q.body):void 0,credentials:q.credentials||"include"}),Z={};J.headers.forEach((z,S)=>Z[S]=z);let $=null;if((J.headers.get("content-type")||"").includes("application/json"))$=await J.json().catch(()=>null);else $=await J.text().catch(()=>null);let X={type:"api_result",id:q.id,ok:J.ok,status:J.status,headers:Z,body:$};await this.sendMessage(X)}catch(J){let Z={type:"api_result",id:q.id,ok:!1,status:0,headers:{},body:{error:String(J)}};await this.sendMessage(Z)}}async invokeCallback(q,J,Z){await this.sendMessage({type:"callback",path:q,callback:J,args:Z.map(E)})}}import{useLocation as b1,useParams as j1,useNavigate as k1}from"react-router";import{jsxDEV as R}from"react/jsx-dev-runtime";var qq=t(null),Jq=()=>{let q=e(qq);if(!q)throw new Error("usePulseClient must be used within a PulseProvider");return q},Yq=t(null),h=()=>{let q=e(Yq);if(!q)throw new Error("usePulseRenderHelpers must be used within a PulseRenderContext (provided by <PulseView>)");return q},s=typeof window!=="undefined";function y1({children:q,config:J}){let[Z,$]=x(!0),Q=k1(),X=v(()=>new B(`${J.serverAddress}`,Q),[J.serverAddress,Q]);return g(()=>X.onConnectionChange($),[X]),g(()=>{if(s)return X.connect(),()=>X.disconnect()},[X]),R(qq.Provider,{value:X,children:[!Z&&R("div",{style:{position:"fixed",bottom:"20px",right:"20px",backgroundColor:"red",color:"white",padding:"10px",borderRadius:"5px",zIndex:1000},children:"Failed to connect to the server."},void 0,!1,void 0,this),q]},void 0,!0,void 0,this)}function B1({initialVDOM:q,externalComponents:J,path:Z}){let $=Jq(),[Q,X]=x(q),[z,S]=x(null),W=b1(),f=j1(),G=v(()=>{let{"*":_="",...D}=f,b=new URLSearchParams(W.search);return{hash:W.hash,pathname:W.pathname,query:W.search,queryParams:Object.fromEntries(b.entries()),pathParams:D,catchall:_.length>0?_.split("/"):[]}},[W.hash,W.pathname,W.search,JSON.stringify(f)]);g(()=>{if(s){$.mountView(Z,{vdom:q,listener:X,routeInfo:G});let _=$.onServerError((D,b)=>{if(D===Z)S(b)});return()=>{console.log("Unmounting",Z),_(),$.unmount(Z)}}},[$]),g(()=>{if(s)$.navigate(Z,G)},[$,Z,G]);let N=v(()=>{let _=new Map;return{getCallback:(C)=>{let I=_.get(C);if(!I)I=(...$q)=>$.invokeCallback(Z,C,$q),_.set(C,I);return I},getComponent:(C)=>{let I=J[C];if(!I)throw new Error(`Component with key "${C}" not found.`);return I}}},[$,J,Z]);return R(Yq.Provider,{value:N,children:z?R(g1,{error:z},void 0,!1,void 0,this):R(O,{node:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this)}function g1({error:q}){return R("div",{style:{padding:16,border:"1px solid #e00",background:"#fff5f5",color:"#900",fontFamily:'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',whiteSpace:"pre-wrap"},children:[R("div",{style:{fontWeight:700,marginBottom:8},children:["Server Error during ",q.phase]},void 0,!0,void 0,this),q.message&&R("div",{children:q.message},void 0,!1,void 0,this),q.stack&&R("details",{open:!0,style:{marginTop:8},children:[R("summary",{children:"Stack trace"},void 0,!1,void 0,this),R("pre",{style:{margin:0},children:q.stack},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}import{io as p1}from"socket.io-client";class Zq{url;socket=null;listener=null;messageQueue=[];connectionListeners=new Set;constructor(q){this.url=q}connect(q){return this.listener=q,new Promise((J,Z)=>{this.socket=p1(this.url,{transports:["websocket"]}),this.socket.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let $ of this.messageQueue)this.socket?.emit("message",$);this.messageQueue=[],this.notifyConnectionListeners(!0),J()}),this.socket.on("connect_error",($)=>{console.error("[SocketIOTransport] Connection failed:",$),this.notifyConnectionListeners(!1),Z($)}),this.socket.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.notifyConnectionListeners(!1)}),this.socket.on("message",($)=>{this.listener?.($)})})}disconnect(){this.socket?.disconnect(),this.socket=null,this.listener=null,this.messageQueue=[],this.connectionListeners.clear()}async sendMessage(q){if(this.isConnected())this.socket.emit("message",q);else this.messageQueue.push(q)}isConnected(){return this.socket?.connected||!1}onConnectionChange(q){return this.connectionListeners.add(q),q(this.isConnected()),()=>{this.connectionListeners.delete(q)}}notifyConnectionListeners(q){for(let J of this.connectionListeners)J(q)}}function L1({params:q,request:J}){let{"*":Z="",...$}=q,Q=new URL(J.url);return{hash:Q.hash,pathname:Q.pathname,query:Q.search,queryParams:Object.fromEntries(Q.searchParams.entries()),pathParams:$,catchall:Z.length>1?Z.split("/"):[]}}export{h as usePulseRenderHelpers,Jq as usePulseClient,L1 as extractServerRouteInfo,E as extractEvent,zq as createMountPoint,Xq as createFragment,fq as createElementNode,u as applyVDOMUpdates,O as VDOMRenderer,Zq as SocketIOTransport,B1 as PulseView,B as PulseSocketIOClient,y1 as PulseProvider};
1
+ import{useEffect as g,useState as v,useMemo as s,createContext as e,useContext as qq}from"react";import r,{Suspense as Wq}from"react";var p="$$fragment",k="$$";function F(q){return typeof q==="object"&&q!==null}function L(q){return typeof q==="object"&&q!==null&&q.tag.startsWith("$$")&&q.tag!=="$$fragment"}function c(q){if(!L(q))throw new Error("Node is not a mount point");return q.tag.slice(2)}import{jsxDEV as w,Fragment as u}from"react/jsx-dev-runtime";function H(q,J){if(F(q))return q.key||J;return J}var N=({node:q})=>{let{getCallback:J,getComponent:Y}=M();if(q===null||typeof q==="boolean"||q===void 0)return null;if(typeof q==="string"||typeof q==="number")return w(u,{children:q},void 0,!1,void 0,this);if(F(q)){if(!(("tag"in q)&&typeof q.tag==="string"))return console.error("Invalid VDOM element node received:",q),null;let{tag:$,props:Q={},children:X=[]}=q,A={};for(let[W,z]of Object.entries(Q))if(typeof z==="string"&&z.startsWith("$$fn:")){let f=z.substring(5);A[W]=J(f)}else A[W]=z;if(L(q)){let W=c(q),z=Y(W),f=X.map((C,_)=>w(N,{node:C},H(C,_),!1,void 0,this));return w(z,{...A,children:f},void 0,!1,void 0,this)}if($===p)return w(u,{children:X.map((W,z)=>w(N,{node:W},H(W,z),!1,void 0,this))},void 0,!1,void 0,this);let I=X.map((W,z)=>w(N,{node:W},H(W,z),!1,void 0,this));return r.createElement($,A,...I)}return console.error("Unknown VDOM node type:",q),null};N.displayName="VDOMRenderer";function zq(q,J={},Y=[],$){if(q.startsWith(k))console.error(`[Pulse] Error: The tag "${q}" starts with a reserved prefix "${k}". Please use a different tag name.`);let Q={tag:q,props:J,children:Y};if($!==void 0)Q.key=$;return Q}function Xq(q=[],J){let Y={tag:p,props:{},children:q};if(J!==void 0)Y.key=J;return Y}function Aq(q,J={},Y=[],$){let Q={tag:k+q,props:J,children:Y};if($!==void 0)Q.key=$;return Q}function Gq(q,J){if(J==="")return F(q)?q:null;let Y=J.split(".").map(Number),$=q;for(let Q of Y){if(!F($))return console.error("[findNodeByPath] Invalid path: part of it is not an element node."),null;if(!$.children||Q>=$.children.length)return console.error(`[findNodeByPath] Invalid path: index ${Q} out of bounds.`),null;$=$.children[Q]}return F($)?$:null}function fq(q){if(typeof q!=="object"||q===null)return q;return JSON.parse(JSON.stringify(q))}function h(q,J){let Y=fq(q);for(let $ of J){let{type:Q,path:X,data:A}=$;if(X===""){switch(Q){case"replace":Y=A;break;case"update_props":if(F(Y))Y.props={...Y.props??{},...A};break;default:console.error(`[applyUpdates] Invalid root operation: ${Q}`)}continue}let I=X.substring(0,X.lastIndexOf(".")),W=parseInt(X.substring(X.lastIndexOf(".")+1),10),z=Gq(Y,I);if(!z){console.error(`[applyUpdates] Could not find parent for path: ${X}`);continue}if(!z.children)z.children=[];switch(Q){case"replace":z.children[W]=A;break;case"update_props":let f=z.children[W];if(F(f))f.props={...f.props??{},...A};break;case"insert":z.children.splice(W,0,A);break;case"remove":z.children.splice(W,1);break;case"move":{let C=z.children.splice(A.from_index,1)[0];z.children.splice(A.to_index,0,C);break}}}return Y}function Rq(q,J){let Y=r.lazy(q);return({children:$,...Q})=>{return w(Wq,{fallback:J??w(u,{},void 0,!1,void 0,this),children:w(Y,{...Q,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}function Uq(q){return{id:q.id,class_name:q.className,tag_name:q.tagName.toLowerCase(),local_name:q.localName,client_height:q.clientHeight,client_left:q.clientLeft,client_top:q.clientTop,client_width:q.clientWidth,scroll_height:q.scrollHeight,scroll_left:q.scrollLeft,scroll_top:q.scrollTop,scroll_width:q.scrollWidth,slot:q.slot}}function Kq(q){return{autofocus:q.autofocus,tab_index:q.tabIndex,nonce:q.nonce}}function Z(q){return{...Uq(q),...Kq(q),access_key:q.accessKey,access_key_label:q.accessKeyLabel,autocapitalize:q.autocapitalize,dir:q.dir,draggable:q.draggable,hidden:q.hidden,inert:q.inert,lang:q.lang,offset_height:q.offsetHeight,offset_left:q.offsetLeft,offset_top:q.offsetTop,offset_width:q.offsetWidth,popover:q.popover,spellcheck:q.spellcheck,title:q.title,translate:q.translate,writing_suggestions:q.writingSuggestions,content_editable:q.contentEditable,enter_key_hint:q.enterKeyHint,is_content_editable:q.isContentEditable,input_mode:q.inputMode}}function _q(q){return{...Z(q),hash:q.hash,host:q.host,hostname:q.hostname,href:q.href,origin:q.origin,password:q.password,pathname:q.pathname,port:q.port,protocol:q.protocol,search:q.search,target:q.target,download:q.download,rel:q.rel,hreflang:q.hreflang,type:q.type,username:q.username,ping:q.ping,referrer_policy:q.referrerPolicy,text:q.text}}function wq(q){return{...Z(q),alt:q.alt,coords:q.coords,download:q.download,hash:q.hash,host:q.host,hostname:q.hostname,href:q.href,origin:q.origin,password:q.password,pathname:q.pathname,port:q.port,protocol:q.protocol,rel:q.rel,search:q.search,shape:q.shape,target:q.target,username:q.username,ping:q.ping,referrer_policy:q.referrerPolicy}}function l(q){return{...Z(q),autoplay:q.autoplay,controls:q.controls,cross_origin:q.crossOrigin,current_src:q.currentSrc,current_time:q.currentTime,default_muted:q.defaultMuted,default_playback_rate:q.defaultPlaybackRate,duration:q.duration,ended:q.ended,loop:q.loop,muted:q.muted,network_state:q.networkState,paused:q.paused,playback_rate:q.playbackRate,preload:q.preload,ready_state:q.readyState,seeking:q.seeking,src:q.src,volume:q.volume,preserves_pitch:q.preservesPitch}}function Fq(q){return{...l(q)}}function Sq(q){return{...Z(q),disabled:q.disabled,name:q.name,type:q.type,value:q.value,form_action:q.formAction,form_enctype:q.formEnctype,form_method:q.formMethod,form_no_validate:q.formNoValidate,form_target:q.formTarget,popover_target_action:q.popoverTargetAction}}function Iq(q){return{...Z(q),value:q.value}}function Oq(q){return{...Z(q),height:q.height,src:q.src,type:q.type,width:q.width,align:q.align,name:q.name}}function Nq(q){return{...Z(q),disabled:q.disabled,name:q.name,type:q.type,validation_message:q.validationMessage,will_validate:q.willValidate}}function Cq(q){return{...Z(q),accept_charset:q.acceptCharset,action:q.action,autocomplete:q.autocomplete,encoding:q.encoding,enctype:q.enctype,length:q.length,method:q.method,name:q.name,no_validate:q.noValidate,target:q.target,rel:q.rel}}function Vq(q){return{...Z(q),allow:q.allow,allow_fullscreen:q.allowFullscreen,height:q.height,name:q.name,referrer_policy:q.referrerPolicy,src:q.src,srcdoc:q.srcdoc,width:q.width,align:q.align,frame_border:q.frameBorder,long_desc:q.longDesc,margin_height:q.marginHeight,margin_width:q.marginWidth,scrolling:q.scrolling,sandbox:q.sandbox}}function Pq(q){return{...Z(q),alt:q.alt,cross_origin:q.crossOrigin,decoding:q.decoding,height:q.height,is_map:q.isMap,loading:q.loading,natural_height:q.naturalHeight,natural_width:q.naturalWidth,referrer_policy:q.referrerPolicy,sizes:q.sizes,src:q.src,srcset:q.srcset,use_map:q.useMap,width:q.width,align:q.align,border:q.border,complete:q.complete,hspace:q.hspace,long_desc:q.longDesc,lowsrc:q.lowsrc,name:q.name,vspace:q.vspace,x:q.x,y:q.y,fetch_priority:q.fetchPriority}}function Dq(q){return{...Z(q),accept:q.accept,alt:q.alt,autocomplete:q.autocomplete,checked:q.checked,default_checked:q.defaultChecked,default_value:q.defaultValue,dir_name:q.dirName,disabled:q.disabled,height:q.height,indeterminate:q.indeterminate,max:q.max,max_length:q.maxLength,min:q.min,min_length:q.minLength,multiple:q.multiple,name:q.name,pattern:q.pattern,placeholder:q.placeholder,read_only:q.readOnly,required:q.required,selection_direction:q.selectionDirection,selection_end:q.selectionEnd,selection_start:q.selectionStart,size:q.size,src:q.src,step:q.step,type:q.type,value:q.value,value_as_number:q.valueAsNumber,width:q.width,align:q.align,capture:q.capture,form_action:q.formAction,form_enctype:q.formEnctype,form_method:q.formMethod,form_no_validate:q.formNoValidate,form_target:q.formTarget,use_map:q.useMap,validation_message:q.validationMessage,will_validate:q.willValidate,popover_target_action:q.popoverTargetAction}}function bq(q){return{...Z(q),html_for:q.htmlFor}}function kq(q){return{...Z(q),value:q.value,type:q.type}}function jq(q){return{...Z(q),as:q.as,cross_origin:q.crossOrigin,disabled:q.disabled,fetch_priority:q.fetchPriority,href:q.href,href_lang:q.hreflang,image_sizes:q.imageSizes,image_srcset:q.imageSrcset,integrity:q.integrity,media:q.media,referrer_policy:q.referrerPolicy,rel:q.rel,type:q.type,charset:q.charset,rev:q.rev,target:q.target,sizes:q.sizes}}function yq(q){return{...Z(q),name:q.name}}function Bq(q){return{...Z(q),high:q.high,low:q.low,max:q.max,min:q.min,optimum:q.optimum,value:q.value}}function gq(q){return{...Z(q),cite:q.cite,dateTime:q.dateTime}}function pq(q){return{...Z(q),reversed:q.reversed,start:q.start,type:q.type,compact:q.compact}}function Lq(q){return{...Z(q),data:q.data,height:q.height,name:q.name,type:q.type,use_map:q.useMap,width:q.width,validation_message:q.validationMessage,will_validate:q.willValidate,align:q.align,archive:q.archive,border:q.border,code:q.code,code_base:q.codeBase,code_type:q.codeType,declare:q.declare,hspace:q.hspace,standby:q.standby,vspace:q.vspace}}function Hq(q){return{...Z(q),disabled:q.disabled,label:q.label}}function uq(q){return{...Z(q),default_selected:q.defaultSelected,disabled:q.disabled,index:q.index,label:q.label,selected:q.selected,text:q.text,value:q.value}}function hq(q){return{...Z(q),default_value:q.defaultValue,name:q.name,type:q.type,value:q.value,html_for:q.htmlFor,validation_message:q.validationMessage,will_validate:q.willValidate}}function Mq(q){return{...Z(q),max:q.max,position:q.position,value:q.value}}function Tq(q){return{...Z(q),cite:q.cite}}function iq(q){return{...Z(q)}}function dq(q){return{...Z(q),async_:q.async,cross_origin:q.crossOrigin,defer:q.defer,fetch_priority:q.fetchPriority,integrity:q.integrity,no_module:q.noModule,referrer_policy:q.referrerPolicy,src:q.src,text:q.text,type:q.type,charset:q.charset,event:q.event,html_for:q.htmlFor}}function mq(q){return{...Z(q),autocomplete:q.autocomplete,disabled:q.disabled,length:q.length,multiple:q.multiple,name:q.name,required:q.required,selected_index:q.selectedIndex,size:q.size,type:q.type,value:q.value,validation_message:q.validationMessage,will_validate:q.willValidate}}function Eq(q){return{...Z(q),name:q.name}}function xq(q){return{...Z(q),height:q.height,media:q.media,sizes:q.sizes,src:q.src,srcset:q.srcset,type:q.type,width:q.width}}function vq(q){return{...Z(q),align:q.align}}function sq(q){return{...Z(q),abbr:q.abbr,cell_index:q.cellIndex,col_span:q.colSpan,headers:q.headers,row_span:q.rowSpan,scope:q.scope,align:q.align,axis:q.axis,bg_color:q.bgColor,ch:q.ch,ch_off:q.chOff,height:q.height,no_wrap:q.noWrap,v_align:q.vAlign,width:q.width}}function oq(q){return{...Z(q),span:q.span,align:q.align,ch:q.ch,ch_off:q.chOff,v_align:q.vAlign,width:q.width}}function cq(q){return{...Z(q),align:q.align,bg_color:q.bgColor,border:q.border,cell_padding:q.cellPadding,cell_spacing:q.cellSpacing,frame:q.frame,rules:q.rules,summary:q.summary,width:q.width}}function rq(q){return{...Z(q),row_index:q.rowIndex,section_row_index:q.sectionRowIndex,align:q.align,bg_color:q.bgColor,ch:q.ch,ch_off:q.chOff,v_align:q.vAlign}}function nq(q){return{...Z(q),align:q.align,ch:q.ch,ch_off:q.chOff,v_align:q.vAlign}}function aq(q){return{...Z(q)}}function lq(q){return{...Z(q),autocomplete:q.autocomplete,cols:q.cols,default_value:q.defaultValue,dir_name:q.dirName,disabled:q.disabled,max_length:q.maxLength,min_length:q.minLength,name:q.name,placeholder:q.placeholder,read_only:q.readOnly,required:q.required,rows:q.rows,selection_direction:q.selectionDirection,selection_end:q.selectionEnd,selection_start:q.selectionStart,value:q.value,wrap:q.wrap,text_length:q.textLength,validation_message:q.validationMessage,will_validate:q.willValidate}}function tq(q){return{...Z(q),datetime:q.dateTime}}function eq(q){return{...Z(q),default:q.default,kind:q.kind,label:q.label,ready_state:q.readyState,src:q.src,srclang:q.srclang}}function q1(q){return{...l(q),height:q.height,poster:q.poster,video_height:q.videoHeight,video_width:q.videoWidth,width:q.width,plays_inline:q.playsInline}}function J1(q){return{...Z(q),clear:q.clear}}function Y1(q){return{...Z(q),href:q.href,target:q.target}}function Z1(q){return{...Z(q),a_link:q.aLink,background:q.background,bg_color:q.bgColor,link:q.link,text:q.text,v_link:q.vLink}}function $1(q){return{...Z(q),compact:q.compact}}function Q1(q){return{...Z(q),open:q.open}}function W1(q){return{...Z(q),open:q.open,return_value:q.returnValue}}function z1(q){return{...Z(q),align:q.align}}function X1(q){return{...Z(q)}}function A1(q){return{...Z(q),align:q.align}}function G1(q){return{...Z(q),align:q.align,color:q.color,no_shade:q.noShade,size:q.size,width:q.width}}function f1(q){return{...Z(q),version:q.version}}function R1(q){return{...Z(q)}}function U1(q){return{...Z(q),content:q.content,http_equiv:q.httpEquiv,name:q.name,scheme:q.scheme}}function K1(q){return{...Z(q),align:q.align}}function _1(q){return{...Z(q)}}function w1(q){return{...Z(q),width:q.width}}function F1(q){return{...Z(q)}}function S1(q){return{...Z(q),media:q.media,type:q.type,disabled:q.disabled}}function I1(q){return{...Z(q),text:q.text}}function O1(q){return{...Z(q),compact:q.compact,type:q.type}}function P(q){switch(q.tagName.toUpperCase()){case"A":return _q(q);case"AREA":return wq(q);case"AUDIO":return Fq(q);case"BASE":return Y1(q);case"BLOCKQUOTE":case"Q":return Tq(q);case"BODY":return Z1(q);case"BR":return J1(q);case"BUTTON":return Sq(q);case"CANVAS":return Z(q);case"CAPTION":return vq(q);case"CITE":return iq(q);case"COL":case"COLGROUP":return oq(q);case"DATA":return Iq(q);case"DETAILS":return Q1(q);case"DIALOG":return W1(q);case"DIV":return z1(q);case"DL":return $1(q);case"EMBED":return Oq(q);case"FIELDSET":return Nq(q);case"FORM":return Cq(q);case"H1":case"H2":case"H3":case"H4":case"H5":case"H6":return A1(q);case"HEAD":return X1(q);case"HR":return G1(q);case"HTML":return f1(q);case"IFRAME":return Vq(q);case"IMG":return Pq(q);case"INPUT":return Dq(q);case"LABEL":return bq(q);case"LI":return kq(q);case"LINK":return jq(q);case"MAP":return yq(q);case"MENU":return R1(q);case"META":return U1(q);case"METER":return Bq(q);case"INS":case"DEL":return gq(q);case"OBJECT":return Lq(q);case"OL":return pq(q);case"OPTGROUP":return Hq(q);case"OPTION":return uq(q);case"OUTPUT":return hq(q);case"P":return K1(q);case"PICTURE":return _1(q);case"PRE":return w1(q);case"PROGRESS":return Mq(q);case"SCRIPT":return dq(q);case"SELECT":return mq(q);case"SLOT":return Eq(q);case"SOURCE":return xq(q);case"SPAN":return F1(q);case"STYLE":return S1(q);case"TABLE":return cq(q);case"TBODY":case"THEAD":case"TFOOT":return nq(q);case"TD":case"TH":return sq(q);case"TEMPLATE":return aq(q);case"TEXTAREA":return lq(q);case"TIME":return tq(q);case"TITLE":return I1(q);case"TR":return rq(q);case"TRACK":return eq(q);case"UL":return O1(q);case"VIDEO":return q1(q);default:throw new Error(`Unexpected HTML element tag: ${q.tagName} (update .web/custom/serialize.ts)`)}}function K(q){return{target:P(q.target),bubbles:q.bubbles,cancelable:q.cancelable,default_prevented:q.defaultPrevented,event_phase:q.eventPhase,is_trusted:q.isTrusted,timestamp:q.timeStamp,type:q.type}}function y(q){return{...K(q),detail:q.detail}}function G(q){return{...y(q),alt_key:q.altKey,button:q.button,buttons:q.buttons,client_x:q.clientX,client_y:q.clientY,ctrl_key:q.ctrlKey,meta_key:q.metaKey,movement_x:q.movementX,movement_y:q.movementY,page_x:q.pageX,page_y:q.pageY,related_target:q.relatedTarget?P(q.relatedTarget):null,screen_x:q.screenX,screen_y:q.screenY,shift_key:q.shiftKey}}function T(q){return{...K(q),clipboard_data:t(q.clipboardData)}}function i(q){return{...K(q),data:q.data}}function S(q){return{...G(q),data_transfer:t(q.dataTransfer)}}function U(q){return{...G(q),pointer_id:q.pointerId,pressure:q.pressure,tangential_pressure:q.tangentialPressure,tilt_x:q.tiltX,tilt_y:q.tiltY,twist:q.twist,width:q.width,height:q.height,pointer_type:q.pointerType,is_primary:q.isPrimary}}function n(q){return{...K(q),related_target:q.relatedTarget?P(q.relatedTarget):null}}function E(q){return K(q)}function N1(q){return K(q)}function a(q){return E(q)}function d(q){return{...y(q),alt_key:q.altKey,ctrl_key:q.ctrlKey,code:q.code,key:q.key,locale:q.locale,location:q.location,meta_key:q.metaKey,repeat:q.repeat,shift_key:q.shiftKey}}function j(q){return{...y(q),alt_key:q.altKey,changed_touches:Array.from(q.changedTouches).map((J)=>({target:P(J.target),identifier:J.identifier,screen_x:J.screenX,screen_y:J.screenY,client_x:J.clientX,client_y:J.clientY,page_x:J.pageX,page_y:J.pageY})),ctrl_key:q.ctrlKey,meta_key:q.metaKey,shift_key:q.shiftKey,target_touches:Array.from(q.targetTouches).map((J)=>({target:P(J.target),identifier:J.identifier,screen_x:J.screenX,screen_y:J.screenY,client_x:J.clientX,client_y:J.clientY,page_x:J.pageX,page_y:J.pageY})),touches:Array.from(q.touches).map((J)=>({target:P(J.target),identifier:J.identifier,screen_x:J.screenX,screen_y:J.screenY,client_x:J.clientX,client_y:J.clientY,page_x:J.pageX,page_y:J.pageY}))}}function C1(q){return{...G(q),delta_mode:q.deltaMode,delta_x:q.deltaX,delta_y:q.deltaY,delta_z:q.deltaZ}}function m(q){return{...K(q),animation_name:q.animationName,elapsed_time:q.elapsedTime,pseudo_element:q.pseudoElement}}function V1(q){return{...K(q),old_state:q.oldState,new_state:q.newState}}function P1(q){return{...K(q),elapsed_time:q.elapsedTime,property_name:q.propertyName,pseudo_element:q.pseudoElement}}function t(q){if(!q)return null;let J=[];if(q.items)for(let Y=0;Y<q.items.length;Y++){let $=q.items[Y];J.push({kind:$.kind,type:$.type})}return{drop_effect:q.dropEffect,effect_allowed:q.effectAllowed,items:J,types:Array.from(q.types||[])}}var D1={pointerdown:U,pointermove:U,pointerup:U,pointercancel:U,gotpointercapture:U,lostpointercapture:U,pointerenter:U,pointerleave:U,pointerover:U,pointerout:U,click:G,contextmenu:G,dblclick:G,mousedown:G,mouseenter:G,mouseleave:G,mousemove:G,mouseout:G,mouseover:G,mouseup:G,drag:S,dragend:S,dragenter:S,dragexit:S,dragleave:S,dragover:S,dragstart:S,drop:S,keydown:d,keypress:d,keyup:d,focus:n,blur:n,change:a,input:a,invalid:N1,reset:E,submit:E,copy:T,cut:T,paste:T,compositionend:i,compositionstart:i,compositionupdate:i,touchcancel:j,touchend:j,touchmove:j,touchstart:j,scroll:y,wheel:C1,animationstart:m,animationend:m,animationiteration:m,transitionend:P1,toggle:V1};function x(q){if(q&&typeof q==="object"&&"nativeEvent"in q&&typeof q.isDefaultPrevented==="function"){let J=q;if(typeof J.type!=="string")return q;let Y=D1[J.type.toLowerCase()];if(Y)return Y(J);return console.warn(`No specific extractor for event type "${J.type}". Using synthetic.`),K(J)}return q}import{io as b1}from"socket.io-client";class B{url;frameworkNavigate;activeViews;socket=null;messageQueue;connectionListeners=new Set;serverErrors=new Map;serverErrorListeners=new Set;constructor(q,J){this.url=q;this.frameworkNavigate=J;this.socket=null,this.activeViews=new Map,this.messageQueue=[]}isConnected(){return this.socket?.connected??!1}async connect(){if(this.socket)return;return new Promise((q,J)=>{let Y=b1(this.url,{transports:["websocket"]});this.socket=Y,Y.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let[$,Q]of this.activeViews)Y.emit("message",{type:"mount",path:$,routeInfo:Q.routeInfo});for(let $ of this.messageQueue){if($.type==="mount"&&this.activeViews.has($.path))continue;if($.type==="navigate")continue;Y.emit("message",$)}this.messageQueue=[],this.notifyConnectionListeners(!0),q()}),Y.on("connect_error",($)=>{console.error("[SocketIOTransport] Connection failed:",$),this.notifyConnectionListeners(!1),J($)}),Y.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.notifyConnectionListeners(!1)}),Y.on("message",($)=>this.handleServerMessage($))})}onConnectionChange(q){return this.connectionListeners.add(q),q(this.isConnected()),()=>{this.connectionListeners.delete(q)}}notifyConnectionListeners(q){for(let J of this.connectionListeners)J(q)}onServerError(q){this.serverErrorListeners.add(q);for(let[J,Y]of this.serverErrors)q(J,Y);return()=>{this.serverErrorListeners.delete(q)}}notifyServerError(q,J){for(let Y of this.serverErrorListeners)Y(q,J)}async sendMessage(q){if(this.isConnected())this.socket.emit("message",q);else this.messageQueue.push(q)}mountView(q,J){if(this.activeViews.has(q))throw new Error(`Path ${q} is already mounted`);this.activeViews.set(q,J),this.sendMessage({type:"mount",path:q,routeInfo:J.routeInfo})}async navigate(q,J){await this.sendMessage({type:"navigate",path:q,routeInfo:J})}unmount(q){this.sendMessage({type:"unmount",path:q}),this.activeViews.delete(q)}disconnect(){this.socket?.disconnect(),this.socket=null,this.messageQueue=[],this.connectionListeners.clear(),this.activeViews.clear(),this.serverErrors.clear(),this.serverErrorListeners.clear()}handleServerMessage(q){switch(q.type){case"vdom_init":{let J=this.activeViews.get(q.path);if(J)J.vdom=q.vdom,J.listener(J.vdom);if(this.serverErrors.has(q.path))this.serverErrors.delete(q.path),this.notifyServerError(q.path,null);break}case"vdom_update":{let J=this.activeViews.get(q.path);if(!J||!J.vdom){console.error(`[PulseClient] Received VDOM update for path ${q.path} before initial tree was set.`);return}if(J.vdom=h(J.vdom,q.ops),J.listener(J.vdom),this.serverErrors.has(q.path))this.serverErrors.delete(q.path),this.notifyServerError(q.path,null);break}case"server_error":{this.serverErrors.set(q.path,q.error),this.notifyServerError(q.path,q.error);break}case"api_call":{this.performApiCall(q);break}case"navigate_to":{try{let J=q.path;if(this.frameworkNavigate)this.frameworkNavigate(J);else window.history.pushState({},"",J),window.dispatchEvent(new PopStateEvent("popstate"))}catch(J){console.error("Navigation error:",J)}break}}}async performApiCall(q){try{let J=await fetch(q.url,{method:q.method||"GET",headers:{...q.headers||{},...q.body!=null&&!("content-type"in(q.headers||{}))?{"content-type":"application/json"}:{}},body:q.body!=null?typeof q.body==="string"?q.body:JSON.stringify(q.body):void 0,credentials:q.credentials||"include"}),Y={};J.headers.forEach((A,I)=>Y[I]=A);let $=null;if((J.headers.get("content-type")||"").includes("application/json"))$=await J.json().catch(()=>null);else $=await J.text().catch(()=>null);let X={type:"api_result",id:q.id,ok:J.ok,status:J.status,headers:Y,body:$};await this.sendMessage(X)}catch(J){let Y={type:"api_result",id:q.id,ok:!1,status:0,headers:{},body:{error:String(J)}};await this.sendMessage(Y)}}async invokeCallback(q,J,Y){await this.sendMessage({type:"callback",path:q,callback:J,args:Y.map(x)})}}import{useLocation as k1,useParams as j1,useNavigate as y1}from"react-router";import{jsxDEV as R}from"react/jsx-dev-runtime";var Jq=e(null),Yq=()=>{let q=qq(Jq);if(!q)throw new Error("usePulseClient must be used within a PulseProvider");return q},Zq=e(null),M=()=>{let q=qq(Zq);if(!q)throw new Error("usePulseRenderHelpers must be used within a PulseRenderContext (provided by <PulseView>)");return q},o=typeof window!=="undefined";function B1({children:q,config:J}){let[Y,$]=v(!0),Q=y1(),X=s(()=>new B(`${J.serverAddress}`,Q),[J.serverAddress,Q]);return g(()=>X.onConnectionChange($),[X]),g(()=>{if(o)return X.connect(),()=>X.disconnect()},[X]),R(Jq.Provider,{value:X,children:[!Y&&R("div",{style:{position:"fixed",bottom:"20px",right:"20px",backgroundColor:"red",color:"white",padding:"10px",borderRadius:"5px",zIndex:1000},children:"Failed to connect to the server."},void 0,!1,void 0,this),q]},void 0,!0,void 0,this)}function g1({initialVDOM:q,externalComponents:J,path:Y}){let $=Yq(),[Q,X]=v(q),[A,I]=v(null),W=k1(),z=j1(),f=s(()=>{let{"*":_="",...D}=z,b=new URLSearchParams(W.search);return{hash:W.hash,pathname:W.pathname,query:W.search,queryParams:Object.fromEntries(b.entries()),pathParams:D,catchall:_.length>0?_.split("/"):[]}},[W.hash,W.pathname,W.search,JSON.stringify(z)]);g(()=>{if(o){$.mountView(Y,{vdom:q,listener:X,routeInfo:f});let _=$.onServerError((D,b)=>{if(D===Y)I(b)});return()=>{console.log("Unmounting",Y),_(),$.unmount(Y)}}},[$]),g(()=>{if(o)$.navigate(Y,f)},[$,Y,f]);let C=s(()=>{let _=new Map;return{getCallback:(V)=>{let O=_.get(V);if(!O)O=(...Qq)=>$.invokeCallback(Y,V,Qq),_.set(V,O);return O},getComponent:(V)=>{let O=J[V];if(!O)throw new Error(`Component with key "${V}" not found.`);return O}}},[$,J,Y]);return R(Zq.Provider,{value:C,children:A?R(p1,{error:A},void 0,!1,void 0,this):R(N,{node:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this)}function p1({error:q}){return R("div",{style:{padding:16,border:"1px solid #e00",background:"#fff5f5",color:"#900",fontFamily:'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',whiteSpace:"pre-wrap"},children:[R("div",{style:{fontWeight:700,marginBottom:8},children:["Server Error during ",q.phase]},void 0,!0,void 0,this),q.message&&R("div",{children:q.message},void 0,!1,void 0,this),q.stack&&R("details",{open:!0,style:{marginTop:8},children:[R("summary",{children:"Stack trace"},void 0,!1,void 0,this),R("pre",{style:{margin:0},children:q.stack},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}import{io as L1}from"socket.io-client";class $q{url;socket=null;listener=null;messageQueue=[];connectionListeners=new Set;constructor(q){this.url=q}connect(q){return this.listener=q,new Promise((J,Y)=>{this.socket=L1(this.url,{transports:["websocket"]}),this.socket.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let $ of this.messageQueue)this.socket?.emit("message",$);this.messageQueue=[],this.notifyConnectionListeners(!0),J()}),this.socket.on("connect_error",($)=>{console.error("[SocketIOTransport] Connection failed:",$),this.notifyConnectionListeners(!1),Y($)}),this.socket.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.notifyConnectionListeners(!1)}),this.socket.on("message",($)=>{this.listener?.($)})})}disconnect(){this.socket?.disconnect(),this.socket=null,this.listener=null,this.messageQueue=[],this.connectionListeners.clear()}async sendMessage(q){if(this.isConnected())this.socket.emit("message",q);else this.messageQueue.push(q)}isConnected(){return this.socket?.connected||!1}onConnectionChange(q){return this.connectionListeners.add(q),q(this.isConnected()),()=>{this.connectionListeners.delete(q)}}notifyConnectionListeners(q){for(let J of this.connectionListeners)J(q)}}function H1({params:q,request:J}){let{"*":Y="",...$}=q,Q=new URL(J.url);return{hash:Q.hash,pathname:Q.pathname,query:Q.search,queryParams:Object.fromEntries(Q.searchParams.entries()),pathParams:$,catchall:Y.length>1?Y.split("/"):[]}}export{M as usePulseRenderHelpers,Yq as usePulseClient,H1 as extractServerRouteInfo,x as extractEvent,Aq as createMountPoint,Xq as createFragment,zq as createElementNode,h as applyVDOMUpdates,N as VDOMRenderer,$q as SocketIOTransport,Rq as RenderLazy,g1 as PulseView,B as PulseSocketIOClient,B1 as PulseProvider};
2
2
 
3
- //# debugId=CFE783285C79634A64756E2164756E21
3
+ //# debugId=6C27788B0A510EB464756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,15 +2,15 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/pulse.tsx", "../src/renderer.tsx", "../src/vdom.ts", "../src/serialize.ts", "../src/client.tsx", "../src/transport.ts", "../src/helpers.ts"],
4
4
  "sourcesContent": [
5
- "import React, {\n useEffect,\n useState,\n useMemo,\n createContext,\n useContext,\n type ComponentType,\n} from \"react\";\nimport { VDOMRenderer } from \"./renderer\";\nimport { PulseSocketIOClient } from \"./client\";\nimport type { VDOM, ComponentRegistry } from \"./vdom\";\nimport { useLocation, useParams, useNavigate } from \"react-router\";\nimport type { ServerErrorInfo } from \"./messages\";\nimport type { RouteInfo } from \"./helpers\";\n\n// =================================================================\n// Types\n// =================================================================\n\nexport interface PulseConfig {\n serverAddress: string;\n}\n\n// =================================================================\n// Context and Hooks\n// =================================================================\n\n// Context for the client, provided by PulseProvider\nconst PulseClientContext = createContext<PulseSocketIOClient | null>(null);\n\nexport const usePulseClient = () => {\n const client = useContext(PulseClientContext);\n if (!client) {\n throw new Error(\"usePulseClient must be used within a PulseProvider\");\n }\n return client;\n};\n\n// Context for rendering helpers, provided by PulseView\ninterface PulseRenderHelpers {\n getCallback: (key: string) => (...args: any[]) => void;\n getComponent: (key: string) => ComponentType<any>;\n}\n\nconst PulseRenderContext = createContext<PulseRenderHelpers | null>(null);\n\nexport const usePulseRenderHelpers = () => {\n const context = useContext(PulseRenderContext);\n if (!context) {\n throw new Error(\n \"usePulseRenderHelpers must be used within a PulseRenderContext (provided by <PulseView>)\"\n );\n }\n return context;\n};\n\n// =================================================================\n// Provider\n// =================================================================\n\nexport interface PulseProviderProps {\n children: React.ReactNode;\n config: PulseConfig;\n}\n\nconst inBrowser = typeof window !== \"undefined\";\n\nexport function PulseProvider({ children, config }: PulseProviderProps) {\n const [connected, setConnected] = useState(true);\n const rrNavigate = useNavigate();\n\n const client = useMemo(\n () => new PulseSocketIOClient(`${config.serverAddress}`, rrNavigate),\n [config.serverAddress, rrNavigate]\n );\n\n useEffect(() => client.onConnectionChange(setConnected), [client]);\n\n useEffect(() => {\n if (inBrowser) {\n client.connect();\n return () => client.disconnect();\n }\n }, [client]);\n\n return (\n <PulseClientContext.Provider value={client}>\n {!connected && (\n <div\n style={{\n position: \"fixed\",\n bottom: \"20px\",\n right: \"20px\",\n backgroundColor: \"red\",\n color: \"white\",\n padding: \"10px\",\n borderRadius: \"5px\",\n zIndex: 1000,\n }}\n >\n Failed to connect to the server.\n </div>\n )}\n {children}\n </PulseClientContext.Provider>\n );\n}\n\n// =================================================================\n// View\n// =================================================================\n\nexport interface PulseViewProps {\n initialVDOM: VDOM;\n externalComponents: ComponentRegistry;\n path: string;\n}\n\nexport function PulseView({\n initialVDOM,\n externalComponents,\n path,\n}: PulseViewProps) {\n const client = usePulseClient();\n const [vdom, setVdom] = useState(initialVDOM);\n const [serverError, setServerError] = useState<ServerErrorInfo | null>(null);\n\n const location = useLocation();\n const params = useParams();\n\n const routeInfo = useMemo(() => {\n const { \"*\": catchall = \"\", ...pathParams } = params;\n const queryParams = new URLSearchParams(location.search);\n return {\n hash: location.hash,\n pathname: location.pathname,\n query: location.search,\n queryParams: Object.fromEntries(queryParams.entries()),\n pathParams,\n catchall: catchall.length > 0 ? catchall.split(\"/\") : [],\n } satisfies RouteInfo;\n }, [\n location.hash,\n location.pathname,\n location.search,\n JSON.stringify(params),\n ]);\n\n useEffect(() => {\n if (inBrowser) {\n client.mountView(path, {\n vdom: initialVDOM,\n listener: setVdom,\n routeInfo,\n });\n const offErr = client.onServerError((p, err) => {\n if (p === path) setServerError(err);\n });\n return () => {\n console.log(\"Unmounting\", path)\n offErr();\n client.unmount(path);\n };\n }\n // routeInfo is NOT included here on purpose\n }, [client]);\n\n useEffect(() => {\n if (inBrowser) {\n client.navigate(path, routeInfo);\n }\n }, [client, path, routeInfo]);\n\n const renderHelpers = useMemo(() => {\n const callbackCache = new Map<string, (...args: any[]) => void>();\n\n const getCallback = (key: string) => {\n let fn = callbackCache.get(key);\n if (!fn) {\n fn = (...args) => client.invokeCallback(path, key, args);\n callbackCache.set(key, fn);\n }\n return fn;\n };\n\n const getComponent = (key: string) => {\n const component = externalComponents[key];\n if (!component) {\n throw new Error(`Component with key \"${key}\" not found.`);\n }\n return component;\n };\n\n return { getCallback, getComponent };\n }, [client, externalComponents, path]);\n\n return (\n <PulseRenderContext.Provider value={renderHelpers}>\n {serverError ? (\n <ServerError error={serverError} />\n ) : (\n <VDOMRenderer node={vdom} />\n )}\n </PulseRenderContext.Provider>\n );\n}\n\nfunction ServerError({ error }: { error: ServerErrorInfo }) {\n return (\n <div\n style={{\n padding: 16,\n border: \"1px solid #e00\",\n background: \"#fff5f5\",\n color: \"#900\",\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n whiteSpace: \"pre-wrap\",\n }}\n >\n <div style={{ fontWeight: 700, marginBottom: 8 }}>\n Server Error during {error.phase}\n </div>\n {error.message && <div>{error.message}</div>}\n {error.stack && (\n <details open style={{ marginTop: 8 }}>\n <summary>Stack trace</summary>\n <pre style={{ margin: 0 }}>{error.stack}</pre>\n </details>\n )}\n </div>\n );\n}\n",
6
- "import React, { memo } from \"react\";\nimport type { VDOM, VDOMElement, VDOMNode, VDOMUpdate } from \"./vdom\";\nimport {\n isElementNode,\n isFragment,\n isMountPointNode,\n getMountPointComponentKey,\n MOUNT_POINT_PREFIX,\n FRAGMENT_TAG,\n} from \"./vdom\";\nimport { usePulseRenderHelpers } from \"./pulse\";\n\ninterface VDOMRendererProps {\n node: VDOMNode;\n}\n\n// Helper function to generate keys for React reconciliation\nfunction getNodeKey(node: VDOMNode, index: number): string | number {\n if (isElementNode(node)) {\n return node.key || index;\n }\n return index;\n}\n\nexport const VDOMRenderer = memo<VDOMRendererProps>(({ node }) => {\n const { getCallback, getComponent } = usePulseRenderHelpers();\n\n // 1. Handle non-renderable cases first\n if (node === null || typeof node === \"boolean\" || node === undefined) {\n return null;\n }\n\n // 2. Handle primitive nodes\n if (typeof node === \"string\" || typeof node === \"number\") {\n return <>{node}</>;\n }\n\n // 3. Handle element nodes\n if (isElementNode(node)) {\n if (process.env.NODE_ENV !== \"production\") {\n const hasTag = \"tag\" in node && typeof node.tag === \"string\";\n if (!hasTag) {\n console.error(\"Invalid VDOM element node received:\", node);\n return null;\n }\n }\n\n const { tag, props = {}, children = [] } = node;\n\n // Process props for callbacks\n const processedProps: Record<string, any> = {};\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === \"string\" && value.startsWith(\"$$fn:\")) {\n const callbackKey = value.substring(\"$$fn:\".length);\n processedProps[key] = getCallback(callbackKey);\n } else {\n processedProps[key] = value;\n }\n }\n\n if (isMountPointNode(node)) {\n const componentKey = getMountPointComponentKey(node);\n const Component = getComponent(componentKey);\n const renderedChildren = children.map((child, index) => (\n <VDOMRenderer key={getNodeKey(child, index)} node={child} />\n ));\n return <Component {...processedProps}>{renderedChildren}</Component>;\n }\n\n if (tag === FRAGMENT_TAG) {\n return (\n <>\n {children.map((child, index) => (\n <VDOMRenderer key={getNodeKey(child, index)} node={child} />\n ))}\n </>\n );\n }\n\n const renderedChildren = children.map((child, index) => (\n <VDOMRenderer key={getNodeKey(child, index)} node={child} />\n ));\n\n return React.createElement(tag, processedProps, ...renderedChildren);\n }\n\n // 4. Fallback for unknown node types\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Unknown VDOM node type:\", node);\n }\n return null;\n});\n\nVDOMRenderer.displayName = \"VDOMRenderer\";\n\n// =================================================================\n// Node Creation Functions\n// =================================================================\n\nexport function createElementNode(\n tag: string,\n props: Record<string, any> = {},\n children: VDOMNode[] = [],\n key?: string\n): VDOMElement {\n if (process.env.NODE_ENV !== \"production\") {\n if (tag.startsWith(MOUNT_POINT_PREFIX)) {\n console.error(\n `[Pulse] Error: The tag \"${tag}\" starts with a reserved prefix \"${MOUNT_POINT_PREFIX}\". Please use a different tag name.`\n );\n }\n }\n\n const node: VDOMElement = {\n tag,\n props,\n children,\n };\n\n if (key !== undefined) {\n node.key = key;\n }\n\n return node;\n}\n\nexport function createFragment(\n children: VDOMNode[] = [],\n key?: string\n): VDOMElement {\n const node: VDOMElement = {\n tag: FRAGMENT_TAG,\n props: {},\n children,\n };\n\n if (key !== undefined) {\n node.key = key;\n }\n\n return node;\n}\n\nexport function createMountPoint(\n componentKey: string,\n props: Record<string, any> = {},\n children: VDOMNode[] = [],\n key?: string\n): VDOMElement {\n const node: VDOMElement = {\n tag: MOUNT_POINT_PREFIX + componentKey,\n props,\n children,\n };\n\n if (key !== undefined) {\n node.key = key;\n }\n\n return node;\n}\n\n// =================================================================\n// VDOM Update Functions\n// =================================================================\n\nfunction findNodeByPath(root: VDOMNode, path: string): VDOMElement | null {\n if (path === \"\") return isElementNode(root) ? root : null;\n\n const parts = path.split(\".\").map(Number);\n let current: VDOMNode | VDOMElement = root;\n\n for (const index of parts) {\n if (!isElementNode(current)) {\n console.error(\n `[findNodeByPath] Invalid path: part of it is not an element node.`\n );\n return null;\n }\n if (!current.children || index >= current.children.length) {\n console.error(\n `[findNodeByPath] Invalid path: index ${index} out of bounds.`\n );\n return null;\n }\n current = current.children[index]!;\n }\n\n return isElementNode(current) ? current : null;\n}\n\nfunction cloneNode<T extends VDOMNode>(node: T): T {\n if (typeof node !== \"object\" || node === null) {\n return node;\n }\n // Basic deep clone for VDOM nodes\n return JSON.parse(JSON.stringify(node));\n}\n\nexport function applyVDOMUpdates(\n initialTree: VDOMNode,\n updates: VDOMUpdate[]\n): VDOMNode {\n let newTree = cloneNode(initialTree);\n\n for (const update of updates) {\n const { type, path, data } = update;\n\n // Handle root-level operations separately\n if (path === \"\") {\n switch (type) {\n case \"replace\":\n newTree = data;\n break;\n case \"update_props\":\n if (isElementNode(newTree)) {\n newTree.props = { ...(newTree.props ?? {}), ...data };\n }\n break;\n default:\n console.error(`[applyUpdates] Invalid root operation: ${type}`);\n }\n continue; // Continue to next update\n }\n\n const parentPath = path.substring(0, path.lastIndexOf(\".\"));\n const childIndex = parseInt(path.substring(path.lastIndexOf(\".\") + 1), 10);\n\n const targetParent = findNodeByPath(newTree, parentPath);\n\n if (!targetParent) {\n console.error(`[applyUpdates] Could not find parent for path: ${path}`);\n continue;\n }\n\n if (!targetParent.children) {\n targetParent.children = [];\n }\n\n switch (type) {\n case \"replace\":\n targetParent.children[childIndex] = data;\n break;\n\n case \"update_props\":\n const nodeToUpdate = targetParent.children[childIndex]!;\n if (isElementNode(nodeToUpdate)) {\n nodeToUpdate.props = { ...(nodeToUpdate.props ?? {}), ...data };\n }\n break;\n\n case \"insert\":\n targetParent.children.splice(childIndex, 0, data);\n break;\n\n case \"remove\":\n targetParent.children.splice(childIndex, 1);\n break;\n\n case \"move\": {\n const item = targetParent.children.splice(data.from_index, 1)[0]!;\n targetParent.children.splice(data.to_index, 0, item);\n break;\n }\n }\n }\n\n return newTree;\n}\n",
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\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}\n\n// Primitive nodes that can be rendered\nexport type PrimitiveNode = string | number | boolean;\n\n// VDOMNode is either a primitive (string, number, boolean) or an element node.\n// Booleans are valid children in React but do not render anything.\n// Mount points are just UIElementNodes with tags starting with $$ComponentKey\nexport type VDOMNode = PrimitiveNode | VDOMElement;\n\nexport type VDOM = VDOMNode;\n\nexport type UpdateType =\n | \"insert\"\n | \"remove\"\n | \"replace\"\n | \"update_props\"\n | \"move\";\n\nexport interface VDOMUpdateBase {\n type: UpdateType;\n path: string; // Dot-separated path to the node\n data?: any;\n}\n\nexport interface InsertUpdate extends VDOMUpdateBase {\n type: \"insert\";\n data: VDOMNode; // The node to insert\n}\n\nexport interface RemoveUpdate extends VDOMUpdateBase {\n type: \"remove\";\n}\n\nexport interface ReplaceUpdate extends VDOMUpdateBase {\n type: \"replace\";\n data: VDOMNode; // The new node\n}\n\nexport interface UpdatePropsUpdate extends VDOMUpdateBase {\n type: \"update_props\";\n data: Record<string, any>; // The new props\n}\n\nexport interface MoveUpdate extends VDOMUpdateBase {\n type: \"move\";\n data: {\n from_index: number;\n to_index: number;\n key: string;\n };\n}\n\nexport type VDOMUpdate =\n | InsertUpdate\n | RemoveUpdate\n | ReplaceUpdate\n | UpdatePropsUpdate\n | MoveUpdate;\n\n// Utility functions for working with the UI tree structure\nexport function isElementNode(node: VDOMNode): node is VDOMElement {\n // Matches all non-text nodes\n return typeof node === \"object\" && node !== null;\n}\n\nexport function isMountPointNode(node: VDOMNode): node is VDOMElement {\n return (\n typeof node === \"object\" &&\n node !== null &&\n node.tag.startsWith(MOUNT_POINT_PREFIX) &&\n node.tag !== FRAGMENT_TAG\n );\n}\n\nexport function isTextNode(node: VDOMNode): node is string {\n return typeof node === \"string\";\n}\n\nexport function isFragment(node: VDOMNode): boolean {\n return typeof node === \"object\" && node !== null && node.tag === FRAGMENT_TAG;\n}\n\nexport function getMountPointComponentKey(node: VDOMElement): string {\n if (!isMountPointNode(node)) {\n throw new Error(\"Node is not a mount point\");\n }\n return node.tag.slice(MOUNT_POINT_PREFIX.length);\n}\n",
5
+ "import React, {\n useEffect,\n useState,\n useMemo,\n createContext,\n useContext,\n type ComponentType,\n} from \"react\";\nimport { VDOMRenderer } from \"./renderer\";\nimport { PulseSocketIOClient } from \"./client\";\nimport type { VDOM, ComponentRegistry, RegistryEntry } from \"./vdom\";\nimport { useLocation, useParams, useNavigate } from \"react-router\";\nimport type { ServerErrorInfo } from \"./messages\";\nimport type { RouteInfo } from \"./helpers\";\n\n// =================================================================\n// Types\n// =================================================================\n\nexport interface PulseConfig {\n serverAddress: string;\n}\n\n// =================================================================\n// Context and Hooks\n// =================================================================\n\n// Context for the client, provided by PulseProvider\nconst PulseClientContext = createContext<PulseSocketIOClient | null>(null);\n\nexport const usePulseClient = () => {\n const client = useContext(PulseClientContext);\n if (!client) {\n throw new Error(\"usePulseClient must be used within a PulseProvider\");\n }\n return client;\n};\n\n// Context for rendering helpers, provided by PulseView\ninterface PulseRenderHelpers {\n getCallback: (key: string) => (...args: any[]) => void;\n getComponent: (key: string) => RegistryEntry;\n}\n\nconst PulseRenderContext = createContext<PulseRenderHelpers | null>(null);\n\nexport const usePulseRenderHelpers = () => {\n const context = useContext(PulseRenderContext);\n if (!context) {\n throw new Error(\n \"usePulseRenderHelpers must be used within a PulseRenderContext (provided by <PulseView>)\"\n );\n }\n return context;\n};\n\n// =================================================================\n// Provider\n// =================================================================\n\nexport interface PulseProviderProps {\n children: React.ReactNode;\n config: PulseConfig;\n}\n\nconst inBrowser = typeof window !== \"undefined\";\n\nexport function PulseProvider({ children, config }: PulseProviderProps) {\n const [connected, setConnected] = useState(true);\n const rrNavigate = useNavigate();\n\n const client = useMemo(\n () => new PulseSocketIOClient(`${config.serverAddress}`, rrNavigate),\n [config.serverAddress, rrNavigate]\n );\n\n useEffect(() => client.onConnectionChange(setConnected), [client]);\n\n useEffect(() => {\n if (inBrowser) {\n client.connect();\n return () => client.disconnect();\n }\n }, [client]);\n\n return (\n <PulseClientContext.Provider value={client}>\n {!connected && (\n <div\n style={{\n position: \"fixed\",\n bottom: \"20px\",\n right: \"20px\",\n backgroundColor: \"red\",\n color: \"white\",\n padding: \"10px\",\n borderRadius: \"5px\",\n zIndex: 1000,\n }}\n >\n Failed to connect to the server.\n </div>\n )}\n {children}\n </PulseClientContext.Provider>\n );\n}\n\n// =================================================================\n// View\n// =================================================================\n\nexport interface PulseViewProps {\n initialVDOM: VDOM;\n externalComponents: ComponentRegistry;\n path: string;\n}\n\nexport function PulseView({\n initialVDOM,\n externalComponents,\n path,\n}: PulseViewProps) {\n const client = usePulseClient();\n const [vdom, setVdom] = useState(initialVDOM);\n const [serverError, setServerError] = useState<ServerErrorInfo | null>(null);\n\n const location = useLocation();\n const params = useParams();\n\n const routeInfo = useMemo(() => {\n const { \"*\": catchall = \"\", ...pathParams } = params;\n const queryParams = new URLSearchParams(location.search);\n return {\n hash: location.hash,\n pathname: location.pathname,\n query: location.search,\n queryParams: Object.fromEntries(queryParams.entries()),\n pathParams,\n catchall: catchall.length > 0 ? catchall.split(\"/\") : [],\n } satisfies RouteInfo;\n }, [\n location.hash,\n location.pathname,\n location.search,\n JSON.stringify(params),\n ]);\n\n useEffect(() => {\n if (inBrowser) {\n client.mountView(path, {\n vdom: initialVDOM,\n listener: setVdom,\n routeInfo,\n });\n const offErr = client.onServerError((p, err) => {\n if (p === path) setServerError(err);\n });\n return () => {\n console.log(\"Unmounting\", path)\n offErr();\n client.unmount(path);\n };\n }\n // routeInfo is NOT included here on purpose\n }, [client]);\n\n useEffect(() => {\n if (inBrowser) {\n client.navigate(path, routeInfo);\n }\n }, [client, path, routeInfo]);\n\n const renderHelpers = useMemo(() => {\n const callbackCache = new Map<string, (...args: any[]) => void>();\n\n const getCallback = (key: string) => {\n let fn = callbackCache.get(key);\n if (!fn) {\n fn = (...args) => client.invokeCallback(path, key, args);\n callbackCache.set(key, fn);\n }\n return fn;\n };\n\n const getComponent = (key: string) => {\n const component = externalComponents[key];\n if (!component) {\n throw new Error(`Component with key \"${key}\" not found.`);\n }\n return component;\n };\n\n return { getCallback, getComponent };\n }, [client, externalComponents, path]);\n\n return (\n <PulseRenderContext.Provider value={renderHelpers}>\n {serverError ? (\n <ServerError error={serverError} />\n ) : (\n <VDOMRenderer node={vdom} />\n )}\n </PulseRenderContext.Provider>\n );\n}\n\nfunction ServerError({ error }: { error: ServerErrorInfo }) {\n return (\n <div\n style={{\n padding: 16,\n border: \"1px solid #e00\",\n background: \"#fff5f5\",\n color: \"#900\",\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n whiteSpace: \"pre-wrap\",\n }}\n >\n <div style={{ fontWeight: 700, marginBottom: 8 }}>\n Server Error during {error.phase}\n </div>\n {error.message && <div>{error.message}</div>}\n {error.stack && (\n <details open style={{ marginTop: 8 }}>\n <summary>Stack trace</summary>\n <pre style={{ margin: 0 }}>{error.stack}</pre>\n </details>\n )}\n </div>\n );\n}\n",
6
+ "import React, {\n memo,\n Suspense,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n} from \"react\";\nimport type {\n VDOM,\n VDOMElement,\n VDOMNode,\n VDOMUpdate,\n ComponentRegistry,\n RegistryEntry,\n} from \"./vdom\";\nimport {\n isElementNode,\n isFragment,\n isMountPointNode,\n getMountPointComponentKey,\n MOUNT_POINT_PREFIX,\n FRAGMENT_TAG,\n} from \"./vdom\";\nimport { usePulseRenderHelpers } from \"./pulse\";\n\ninterface VDOMRendererProps {\n node: VDOMNode;\n}\n\n// Helper function to generate keys for React reconciliation\nfunction getNodeKey(node: VDOMNode, index: number): string | number {\n if (isElementNode(node)) {\n return node.key || index;\n }\n return index;\n}\n\nexport const VDOMRenderer = ({ node }: VDOMRendererProps) => {\n const { getCallback, getComponent } = usePulseRenderHelpers();\n\n // 1. Handle non-renderable cases first\n if (node === null || typeof node === \"boolean\" || node === undefined) {\n return null;\n }\n\n // 2. Handle primitive nodes\n if (typeof node === \"string\" || typeof node === \"number\") {\n return <>{node}</>;\n }\n\n // 3. Handle element nodes\n if (isElementNode(node)) {\n if (process.env.NODE_ENV !== \"production\") {\n const hasTag = \"tag\" in node && typeof node.tag === \"string\";\n if (!hasTag) {\n console.error(\"Invalid VDOM element node received:\", node);\n return null;\n }\n }\n\n const { tag, props = {}, children = [] } = node;\n\n // Process props for callbacks\n const processedProps: Record<string, any> = {};\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === \"string\" && value.startsWith(\"$$fn:\")) {\n const callbackKey = value.substring(\"$$fn:\".length);\n processedProps[key] = getCallback(callbackKey);\n } else {\n processedProps[key] = value;\n }\n }\n\n if (isMountPointNode(node)) {\n const componentKey = getMountPointComponentKey(node);\n const Component = getComponent(componentKey);\n const renderedChildren = children.map((child, index) => (\n <VDOMRenderer key={getNodeKey(child, index)} node={child} />\n ));\n return <Component {...processedProps}>{renderedChildren}</Component>;\n // if (node.lazy) {\n // return <Component {...processedProps}>{renderedChildren}</Component>;\n // } else {\n // }\n }\n\n if (tag === FRAGMENT_TAG) {\n return (\n <>\n {children.map((child, index) => (\n <VDOMRenderer key={getNodeKey(child, index)} node={child} />\n ))}\n </>\n );\n }\n\n const renderedChildren = children.map((child, index) => (\n <VDOMRenderer key={getNodeKey(child, index)} node={child} />\n ));\n\n return React.createElement(tag, processedProps, ...renderedChildren);\n }\n\n // 4. Fallback for unknown node types\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Unknown VDOM node type:\", node);\n }\n return null;\n};\n\nVDOMRenderer.displayName = \"VDOMRenderer\";\n\n// =================================================================\n// Node Creation Functions\n// =================================================================\n\nexport function createElementNode(\n tag: string,\n props: Record<string, any> = {},\n children: VDOMNode[] = [],\n key?: string\n): VDOMElement {\n if (process.env.NODE_ENV !== \"production\") {\n if (tag.startsWith(MOUNT_POINT_PREFIX)) {\n console.error(\n `[Pulse] Error: The tag \"${tag}\" starts with a reserved prefix \"${MOUNT_POINT_PREFIX}\". Please use a different tag name.`\n );\n }\n }\n\n const node: VDOMElement = {\n tag,\n props,\n children,\n };\n\n if (key !== undefined) {\n node.key = key;\n }\n\n return node;\n}\n\nexport function createFragment(\n children: VDOMNode[] = [],\n key?: string\n): VDOMElement {\n const node: VDOMElement = {\n tag: FRAGMENT_TAG,\n props: {},\n children,\n };\n\n if (key !== undefined) {\n node.key = key;\n }\n\n return node;\n}\n\nexport function createMountPoint(\n componentKey: string,\n props: Record<string, any> = {},\n children: VDOMNode[] = [],\n key?: string\n): VDOMElement {\n const node: VDOMElement = {\n tag: MOUNT_POINT_PREFIX + componentKey,\n props,\n children,\n };\n\n if (key !== undefined) {\n node.key = key;\n }\n\n return node;\n}\n\n// =================================================================\n// VDOM Update Functions\n// =================================================================\n\nfunction findNodeByPath(root: VDOMNode, path: string): VDOMElement | null {\n if (path === \"\") return isElementNode(root) ? root : null;\n\n const parts = path.split(\".\").map(Number);\n let current: VDOMNode | VDOMElement = root;\n\n for (const index of parts) {\n if (!isElementNode(current)) {\n console.error(\n `[findNodeByPath] Invalid path: part of it is not an element node.`\n );\n return null;\n }\n if (!current.children || index >= current.children.length) {\n console.error(\n `[findNodeByPath] Invalid path: index ${index} out of bounds.`\n );\n return null;\n }\n current = current.children[index]!;\n }\n\n return isElementNode(current) ? current : null;\n}\n\nfunction cloneNode<T extends VDOMNode>(node: T): T {\n if (typeof node !== \"object\" || node === null) {\n return node;\n }\n // Basic deep clone for VDOM nodes\n return JSON.parse(JSON.stringify(node));\n}\n\nexport function applyVDOMUpdates(\n initialTree: VDOMNode,\n updates: VDOMUpdate[]\n): VDOMNode {\n let newTree = cloneNode(initialTree);\n\n for (const update of updates) {\n const { type, path, data } = update;\n\n // Handle root-level operations separately\n if (path === \"\") {\n switch (type) {\n case \"replace\":\n newTree = data;\n break;\n case \"update_props\":\n if (isElementNode(newTree)) {\n newTree.props = { ...(newTree.props ?? {}), ...data };\n }\n break;\n default:\n console.error(`[applyUpdates] Invalid root operation: ${type}`);\n }\n continue; // Continue to next update\n }\n\n const parentPath = path.substring(0, path.lastIndexOf(\".\"));\n const childIndex = parseInt(path.substring(path.lastIndexOf(\".\") + 1), 10);\n\n const targetParent = findNodeByPath(newTree, parentPath);\n\n if (!targetParent) {\n console.error(`[applyUpdates] Could not find parent for path: ${path}`);\n continue;\n }\n\n if (!targetParent.children) {\n targetParent.children = [];\n }\n\n switch (type) {\n case \"replace\":\n targetParent.children[childIndex] = data;\n break;\n\n case \"update_props\":\n const nodeToUpdate = targetParent.children[childIndex]!;\n if (isElementNode(nodeToUpdate)) {\n nodeToUpdate.props = { ...(nodeToUpdate.props ?? {}), ...data };\n }\n break;\n\n case \"insert\":\n targetParent.children.splice(childIndex, 0, data);\n break;\n\n case \"remove\":\n targetParent.children.splice(childIndex, 1);\n break;\n\n case \"move\": {\n const item = targetParent.children.splice(data.from_index, 1)[0]!;\n targetParent.children.splice(data.to_index, 0, item);\n break;\n }\n }\n }\n\n return newTree;\n}\n\n// The `component` prop should be something like `() =>\n// import('~/path/to/component') (we'll need to remap if we're importing a named export and not the default)\nexport function RenderLazy(\n component: () => Promise<{ default: ComponentType<any> }>,\n fallback?: React.ReactNode\n): React.FC<React.PropsWithChildren<unknown>> {\n const Component = React.lazy(component);\n return ({ children, ...props }: React.PropsWithChildren<unknown>) => {\n return (\n <Suspense fallback={fallback ?? <></>}>\n <Component {...props}>{children}</Component>\n </Suspense>\n );\n };\n}\n",
7
+ "import type { ComponentType } from \"react\";\n\n// Special prefixes for reserved node types\nexport const FRAGMENT_TAG = \"$$fragment\";\nexport const MOUNT_POINT_PREFIX = \"$$\";\n\n// export type LazyComponent = () => Promise<{ default: ComponentType<any> }>;\nexport type RegistryEntry = ComponentType<any>;\nexport type ComponentRegistry = Record<string, ComponentType<any>>;\n\nexport interface VDOMElement {\n tag: string;\n props?: Record<string, any>;\n children?: VDOMNode[];\n key?: string;\n lazy?: boolean;\n}\n\n// Primitive nodes that can be rendered\nexport type PrimitiveNode = string | number | boolean;\n\n// VDOMNode is either a primitive (string, number, boolean) or an element node.\n// Booleans are valid children in React but do not render anything.\n// Mount points are just UIElementNodes with tags starting with $$ComponentKey\nexport type VDOMNode = PrimitiveNode | VDOMElement;\n\nexport type VDOM = VDOMNode;\n\nexport type UpdateType =\n | \"insert\"\n | \"remove\"\n | \"replace\"\n | \"update_props\"\n | \"move\";\n\nexport interface VDOMUpdateBase {\n type: UpdateType;\n path: string; // Dot-separated path to the node\n data?: any;\n}\n\nexport interface InsertUpdate extends VDOMUpdateBase {\n type: \"insert\";\n data: VDOMNode; // The node to insert\n}\n\nexport interface RemoveUpdate extends VDOMUpdateBase {\n type: \"remove\";\n}\n\nexport interface ReplaceUpdate extends VDOMUpdateBase {\n type: \"replace\";\n data: VDOMNode; // The new node\n}\n\nexport interface UpdatePropsUpdate extends VDOMUpdateBase {\n type: \"update_props\";\n data: Record<string, any>; // The new props\n}\n\nexport interface MoveUpdate extends VDOMUpdateBase {\n type: \"move\";\n data: {\n from_index: number;\n to_index: number;\n key: string;\n };\n}\n\nexport type VDOMUpdate =\n | InsertUpdate\n | RemoveUpdate\n | ReplaceUpdate\n | UpdatePropsUpdate\n | MoveUpdate;\n\n// Utility functions for working with the UI tree structure\nexport function isElementNode(node: VDOMNode): node is VDOMElement {\n // Matches all non-text nodes\n return typeof node === \"object\" && node !== null;\n}\n\nexport function isMountPointNode(node: VDOMNode): node is VDOMElement {\n return (\n typeof node === \"object\" &&\n node !== null &&\n node.tag.startsWith(MOUNT_POINT_PREFIX) &&\n node.tag !== FRAGMENT_TAG\n );\n}\n\nexport function isTextNode(node: VDOMNode): node is string {\n return typeof node === \"string\";\n}\n\nexport function isFragment(node: VDOMNode): boolean {\n return typeof node === \"object\" && node !== null && node.tag === FRAGMENT_TAG;\n}\n\nexport function getMountPointComponentKey(node: VDOMElement): string {\n if (!isMountPointNode(node)) {\n throw new Error(\"Node is not a mount point\");\n }\n return node.tag.slice(MOUNT_POINT_PREFIX.length);\n}\n",
8
8
  "/* === IMPORTANT === */\n\n// used for untyped stuff, like nativeEvent\nexport function cleanForSerialization(obj: unknown): unknown {\n const result = _cleanForSerializationRecursive(obj, new WeakSet());\n return result;\n}\n\nfunction _cleanForSerializationRecursive(\n obj: unknown,\n seen: WeakSet<WeakKey>\n): unknown {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (seen.has(obj)) {\n return undefined; // handle circular refs\n }\n\n seen.add(obj);\n\n if (Array.isArray(obj)) {\n const cleanedArray = obj\n .map((item) => _cleanForSerializationRecursive(item, seen))\n .filter((item) => item !== undefined);\n\n return cleanedArray;\n }\n\n const plainObject: Record<string, any> = {};\n\n for (const key in obj) {\n if (typeof key !== \"string\") {\n continue;\n }\n const value = obj[key as keyof typeof obj];\n if (\n typeof value === \"function\" ||\n typeof value === \"symbol\" ||\n typeof value === \"undefined\"\n ) {\n continue;\n }\n\n const cleanedValue = _cleanForSerializationRecursive(value, seen);\n if (key === \"target\") {\n console.log(\"Cleaned target value:\", cleanedValue);\n }\n if (cleanedValue !== undefined) {\n plainObject[key] = cleanedValue;\n }\n }\n\n return plainObject;\n}\n\nexport function extractElement(elt: Element): object {\n return {\n id: elt.id,\n class_name: elt.className,\n tag_name: elt.tagName.toLowerCase(),\n local_name: elt.localName,\n client_height: elt.clientHeight,\n client_left: elt.clientLeft,\n client_top: elt.clientTop,\n client_width: elt.clientWidth,\n scroll_height: elt.scrollHeight,\n scroll_left: elt.scrollLeft,\n scroll_top: elt.scrollTop,\n scroll_width: elt.scrollWidth,\n slot: elt.slot,\n };\n}\n\nexport function extractHTMLOrSVGElement(elt: HTMLOrSVGElement) {\n return {\n autofocus: elt.autofocus,\n tab_index: elt.tabIndex,\n nonce: elt.nonce,\n };\n}\n\nexport function extractHTMLElementBase(elt: HTMLElement) {\n return {\n ...extractElement(elt),\n ...extractHTMLOrSVGElement(elt),\n access_key: elt.accessKey,\n access_key_label: elt.accessKeyLabel,\n autocapitalize: elt.autocapitalize,\n dir: elt.dir,\n draggable: elt.draggable,\n hidden: elt.hidden,\n inert: elt.inert,\n lang: elt.lang,\n offset_height: elt.offsetHeight,\n offset_left: elt.offsetLeft,\n offset_top: elt.offsetTop,\n offset_width: elt.offsetWidth,\n popover: elt.popover,\n spellcheck: elt.spellcheck,\n title: elt.title,\n translate: elt.translate,\n writing_suggestions: elt.writingSuggestions,\n content_editable: elt.contentEditable,\n enter_key_hint: elt.enterKeyHint,\n is_content_editable: elt.isContentEditable,\n input_mode: elt.inputMode,\n };\n}\n\nexport function extractHTMLAnchorElement(elt: HTMLAnchorElement) {\n return {\n ...extractHTMLElementBase(elt),\n hash: elt.hash,\n host: elt.host,\n hostname: elt.hostname,\n href: elt.href,\n origin: elt.origin,\n password: elt.password,\n pathname: elt.pathname,\n port: elt.port,\n protocol: elt.protocol,\n search: elt.search,\n target: elt.target,\n download: elt.download,\n rel: elt.rel,\n hreflang: elt.hreflang,\n type: elt.type,\n username: elt.username,\n ping: elt.ping,\n referrer_policy: elt.referrerPolicy,\n text: elt.text,\n };\n}\n\nexport function extractHTMLAreaElement(elt: HTMLAreaElement) {\n return {\n ...extractHTMLElementBase(elt),\n alt: elt.alt,\n coords: elt.coords,\n download: elt.download,\n hash: elt.hash,\n host: elt.host,\n hostname: elt.hostname,\n href: elt.href,\n origin: elt.origin,\n password: elt.password,\n pathname: elt.pathname,\n port: elt.port,\n protocol: elt.protocol,\n rel: elt.rel,\n search: elt.search,\n shape: elt.shape,\n target: elt.target,\n username: elt.username,\n ping: elt.ping,\n referrer_policy: elt.referrerPolicy,\n };\n}\n\nexport function extractHTMLMediaElement(elt: HTMLMediaElement) {\n return {\n ...extractHTMLElementBase(elt),\n autoplay: elt.autoplay,\n controls: elt.controls,\n cross_origin: elt.crossOrigin,\n current_src: elt.currentSrc,\n current_time: elt.currentTime,\n default_muted: elt.defaultMuted,\n default_playback_rate: elt.defaultPlaybackRate,\n duration: elt.duration,\n ended: elt.ended,\n loop: elt.loop,\n muted: elt.muted,\n network_state: elt.networkState,\n paused: elt.paused,\n playback_rate: elt.playbackRate,\n preload: elt.preload,\n ready_state: elt.readyState,\n seeking: elt.seeking,\n src: elt.src,\n volume: elt.volume,\n preserves_pitch: elt.preservesPitch,\n };\n}\n\nexport function extractHTMLAudioElement(elt: HTMLAudioElement) {\n return {\n ...extractHTMLMediaElement(elt),\n // No additional properties for audio elements\n };\n}\n\nexport function extractHTMLButtonElement(elt: HTMLButtonElement) {\n return {\n ...extractHTMLElementBase(elt),\n disabled: elt.disabled,\n name: elt.name,\n type: elt.type,\n value: elt.value,\n form_action: elt.formAction,\n form_enctype: elt.formEnctype,\n form_method: elt.formMethod,\n form_no_validate: elt.formNoValidate,\n form_target: elt.formTarget,\n popover_target_action: elt.popoverTargetAction,\n };\n}\n\nexport function extractHTMLDataElement(elt: HTMLDataElement) {\n return {\n ...extractHTMLElementBase(elt),\n value: elt.value,\n };\n}\n\nexport function extractHTMLEmbedElement(elt: HTMLEmbedElement) {\n return {\n ...extractHTMLElementBase(elt),\n height: elt.height,\n src: elt.src,\n type: elt.type,\n width: elt.width,\n align: elt.align,\n name: elt.name,\n };\n}\n\nexport function extractHTMLFieldSetElement(elt: HTMLFieldSetElement) {\n return {\n ...extractHTMLElementBase(elt),\n disabled: elt.disabled,\n name: elt.name,\n type: elt.type,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n };\n}\n\nexport function extractHTMLFormElement(elt: HTMLFormElement) {\n return {\n ...extractHTMLElementBase(elt),\n accept_charset: elt.acceptCharset,\n action: elt.action,\n autocomplete: elt.autocomplete,\n encoding: elt.encoding,\n enctype: elt.enctype,\n length: elt.length,\n method: elt.method,\n name: elt.name,\n no_validate: elt.noValidate,\n target: elt.target,\n rel: elt.rel,\n };\n}\n\nexport function extractHTMLIFrameElement(elt: HTMLIFrameElement) {\n return {\n ...extractHTMLElementBase(elt),\n allow: elt.allow,\n allow_fullscreen: elt.allowFullscreen,\n height: elt.height,\n name: elt.name,\n referrer_policy: elt.referrerPolicy,\n src: elt.src,\n srcdoc: elt.srcdoc,\n width: elt.width,\n align: elt.align,\n frame_border: elt.frameBorder,\n long_desc: elt.longDesc,\n margin_height: elt.marginHeight,\n margin_width: elt.marginWidth,\n scrolling: elt.scrolling,\n sandbox: elt.sandbox,\n };\n}\n\nexport function extractHTMLImageElement(elt: HTMLImageElement) {\n return {\n ...extractHTMLElementBase(elt),\n alt: elt.alt,\n cross_origin: elt.crossOrigin,\n decoding: elt.decoding,\n height: elt.height,\n is_map: elt.isMap,\n loading: elt.loading,\n natural_height: elt.naturalHeight,\n natural_width: elt.naturalWidth,\n referrer_policy: elt.referrerPolicy,\n sizes: elt.sizes,\n src: elt.src,\n srcset: elt.srcset,\n use_map: elt.useMap,\n width: elt.width,\n align: elt.align,\n border: elt.border,\n complete: elt.complete,\n hspace: elt.hspace,\n long_desc: elt.longDesc,\n lowsrc: elt.lowsrc,\n name: elt.name,\n vspace: elt.vspace,\n x: elt.x,\n y: elt.y,\n fetch_priority: elt.fetchPriority,\n };\n}\n\nexport function extractHTMLInputElement(elt: HTMLInputElement) {\n return {\n ...extractHTMLElementBase(elt),\n accept: elt.accept,\n alt: elt.alt,\n autocomplete: elt.autocomplete,\n checked: elt.checked,\n default_checked: elt.defaultChecked,\n default_value: elt.defaultValue,\n dir_name: elt.dirName,\n disabled: elt.disabled,\n height: elt.height,\n indeterminate: elt.indeterminate,\n max: elt.max,\n max_length: elt.maxLength,\n min: elt.min,\n min_length: elt.minLength,\n multiple: elt.multiple,\n name: elt.name,\n pattern: elt.pattern,\n placeholder: elt.placeholder,\n read_only: elt.readOnly,\n required: elt.required,\n selection_direction: elt.selectionDirection,\n selection_end: elt.selectionEnd,\n selection_start: elt.selectionStart,\n size: elt.size,\n src: elt.src,\n step: elt.step,\n type: elt.type,\n value: elt.value,\n value_as_number: elt.valueAsNumber,\n width: elt.width,\n align: elt.align,\n capture: elt.capture,\n form_action: elt.formAction,\n form_enctype: elt.formEnctype,\n form_method: elt.formMethod,\n form_no_validate: elt.formNoValidate,\n form_target: elt.formTarget,\n use_map: elt.useMap,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n popover_target_action: elt.popoverTargetAction,\n };\n}\n\nexport function extractHTMLLabelElement(elt: HTMLLabelElement) {\n return {\n ...extractHTMLElementBase(elt),\n html_for: elt.htmlFor,\n };\n}\n\nexport function extractHTMLLiElement(elt: HTMLLIElement) {\n return {\n ...extractHTMLElementBase(elt),\n value: elt.value,\n type: elt.type,\n };\n}\n\nexport function extractHTMLLinkElement(elt: HTMLLinkElement) {\n return {\n ...extractHTMLElementBase(elt),\n as: elt.as,\n cross_origin: elt.crossOrigin,\n disabled: elt.disabled,\n fetch_priority: elt.fetchPriority,\n href: elt.href,\n href_lang: elt.hreflang,\n image_sizes: elt.imageSizes,\n image_srcset: elt.imageSrcset,\n integrity: elt.integrity,\n media: elt.media,\n referrer_policy: elt.referrerPolicy,\n rel: elt.rel,\n type: elt.type,\n charset: elt.charset,\n rev: elt.rev,\n target: elt.target,\n sizes: elt.sizes,\n };\n}\n\nexport function extractHTMLMapElement(elt: HTMLMapElement) {\n return {\n ...extractHTMLElementBase(elt),\n name: elt.name,\n };\n}\n\nexport function extractHTMLMeterElement(elt: HTMLMeterElement) {\n return {\n ...extractHTMLElementBase(elt),\n high: elt.high,\n low: elt.low,\n max: elt.max,\n min: elt.min,\n optimum: elt.optimum,\n value: elt.value,\n };\n}\n\nexport function extractHTMLModElement(elt: HTMLModElement) {\n return {\n ...extractHTMLElementBase(elt),\n cite: elt.cite,\n dateTime: elt.dateTime,\n };\n}\n\nexport function extractHTMLOListElement(elt: HTMLOListElement) {\n return {\n ...extractHTMLElementBase(elt),\n reversed: elt.reversed,\n start: elt.start,\n type: elt.type,\n compact: elt.compact,\n };\n}\n\nexport function extractHTMLObjectElement(elt: HTMLObjectElement) {\n return {\n ...extractHTMLElementBase(elt),\n data: elt.data,\n // disabled: elt.disabled,\n height: elt.height,\n name: elt.name,\n type: elt.type,\n use_map: elt.useMap,\n width: elt.width,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n align: elt.align,\n archive: elt.archive,\n border: elt.border,\n code: elt.code,\n code_base: elt.codeBase,\n code_type: elt.codeType,\n declare: elt.declare,\n hspace: elt.hspace,\n standby: elt.standby,\n vspace: elt.vspace,\n };\n}\n\nexport function extractHTMLOptGroupElement(elt: HTMLOptGroupElement) {\n return {\n ...extractHTMLElementBase(elt),\n disabled: elt.disabled,\n label: elt.label,\n };\n}\n\nexport function extractHTMLOptionElement(elt: HTMLOptionElement) {\n return {\n ...extractHTMLElementBase(elt),\n default_selected: elt.defaultSelected,\n disabled: elt.disabled,\n index: elt.index,\n label: elt.label,\n selected: elt.selected,\n text: elt.text,\n value: elt.value,\n };\n}\n\nexport function extractHTMLOutputElement(elt: HTMLOutputElement) {\n return {\n ...extractHTMLElementBase(elt),\n default_value: elt.defaultValue,\n name: elt.name,\n type: elt.type,\n value: elt.value,\n html_for: elt.htmlFor,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n };\n}\n\nexport function extractHTMLProgressElement(elt: HTMLProgressElement) {\n return {\n ...extractHTMLElementBase(elt),\n max: elt.max,\n position: elt.position,\n value: elt.value,\n };\n}\n\nexport function extractHTMLQuoteElement(elt: HTMLQuoteElement) {\n return {\n ...extractHTMLElementBase(elt),\n cite: elt.cite,\n };\n}\n\nexport function extractHTMLCiteElement(elt: HTMLElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLScriptElement(elt: HTMLScriptElement) {\n return {\n ...extractHTMLElementBase(elt),\n async_: elt.async,\n cross_origin: elt.crossOrigin,\n defer: elt.defer,\n fetch_priority: elt.fetchPriority,\n integrity: elt.integrity,\n no_module: elt.noModule,\n referrer_policy: elt.referrerPolicy,\n src: elt.src,\n text: elt.text,\n type: elt.type,\n charset: elt.charset,\n event: (elt as any).event,\n html_for: (elt as any).htmlFor,\n };\n}\n\nexport function extractHTMLSelectElement(elt: HTMLSelectElement) {\n return {\n ...extractHTMLElementBase(elt),\n autocomplete: elt.autocomplete,\n disabled: elt.disabled,\n length: elt.length,\n multiple: elt.multiple,\n name: elt.name,\n required: elt.required,\n selected_index: elt.selectedIndex,\n size: elt.size,\n type: elt.type,\n value: elt.value,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n };\n}\n\nexport function extractHTMLSlotElement(elt: HTMLSlotElement) {\n return {\n ...extractHTMLElementBase(elt),\n name: elt.name,\n };\n}\n\nexport function extractHTMLSourceElement(elt: HTMLSourceElement) {\n return {\n ...extractHTMLElementBase(elt),\n height: elt.height,\n media: elt.media,\n sizes: elt.sizes,\n src: elt.src,\n srcset: elt.srcset,\n type: elt.type,\n width: elt.width,\n };\n}\n\nexport function extractHTMLTableCaptionElement(elt: HTMLTableCaptionElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n };\n}\n\nexport function extractHTMLTableCellElement(elt: HTMLTableCellElement) {\n return {\n ...extractHTMLElementBase(elt),\n abbr: elt.abbr,\n cell_index: elt.cellIndex,\n col_span: elt.colSpan,\n headers: elt.headers,\n row_span: elt.rowSpan,\n scope: elt.scope,\n align: elt.align,\n axis: elt.axis,\n bg_color: elt.bgColor,\n ch: elt.ch,\n ch_off: elt.chOff,\n height: elt.height,\n no_wrap: elt.noWrap,\n v_align: elt.vAlign,\n width: elt.width,\n };\n}\n\nexport function extractHTMLTableColElement(elt: HTMLTableColElement) {\n return {\n ...extractHTMLElementBase(elt),\n span: elt.span,\n align: elt.align,\n ch: elt.ch,\n ch_off: elt.chOff,\n v_align: elt.vAlign,\n width: elt.width,\n };\n}\n\nexport function extractHTMLTableElement(elt: HTMLTableElement) {\n return {\n ...extractHTMLElementBase(elt),\n // caption: elt.caption ? extractHTMLTableCaptionElement(elt.caption) : null,\n align: elt.align,\n bg_color: elt.bgColor,\n border: elt.border,\n cell_padding: elt.cellPadding,\n cell_spacing: elt.cellSpacing,\n frame: elt.frame,\n rules: elt.rules,\n summary: elt.summary,\n width: elt.width,\n };\n}\n\nexport function extractHTMLTableRowElement(elt: HTMLTableRowElement) {\n return {\n ...extractHTMLElementBase(elt),\n row_index: elt.rowIndex,\n section_row_index: elt.sectionRowIndex,\n align: elt.align,\n bg_color: elt.bgColor,\n ch: elt.ch,\n ch_off: elt.chOff,\n v_align: elt.vAlign,\n };\n}\n\nexport function extractHTMLTableSectionElement(elt: HTMLTableSectionElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n ch: elt.ch,\n ch_off: elt.chOff,\n v_align: elt.vAlign,\n };\n}\n\nexport function extractHTMLTemplateElement(elt: HTMLTemplateElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLTextAreaElement(elt: HTMLTextAreaElement) {\n return {\n ...extractHTMLElementBase(elt),\n autocomplete: elt.autocomplete,\n cols: elt.cols,\n default_value: elt.defaultValue,\n dir_name: elt.dirName,\n disabled: elt.disabled,\n max_length: elt.maxLength,\n min_length: elt.minLength,\n name: elt.name,\n placeholder: elt.placeholder,\n read_only: elt.readOnly,\n required: elt.required,\n rows: elt.rows,\n selection_direction: elt.selectionDirection,\n selection_end: elt.selectionEnd,\n selection_start: elt.selectionStart,\n value: elt.value,\n wrap: elt.wrap,\n text_length: elt.textLength,\n validation_message: elt.validationMessage,\n will_validate: elt.willValidate,\n };\n}\n\nexport function extractHTMLTimeElement(elt: HTMLTimeElement) {\n return {\n ...extractHTMLElementBase(elt),\n datetime: elt.dateTime,\n };\n}\n\nexport function extractHTMLTrackElement(elt: HTMLTrackElement) {\n return {\n ...extractHTMLElementBase(elt),\n default: elt.default,\n kind: elt.kind,\n label: elt.label,\n ready_state: elt.readyState,\n src: elt.src,\n srclang: elt.srclang,\n };\n}\n\nexport function extractHTMLVideoElement(elt: HTMLVideoElement) {\n return {\n ...extractHTMLMediaElement(elt),\n height: elt.height,\n poster: elt.poster,\n video_height: elt.videoHeight,\n video_width: elt.videoWidth,\n width: elt.width,\n plays_inline: elt.playsInline,\n };\n}\n\nexport function extractHTMLBRElement(elt: HTMLBRElement) {\n return {\n ...extractHTMLElementBase(elt),\n clear: elt.clear,\n };\n}\n\nexport function extractHTMLBaseElement(elt: HTMLBaseElement) {\n return {\n ...extractHTMLElementBase(elt),\n href: elt.href,\n target: elt.target,\n };\n}\n\nexport function extractHTMLBodyElement(elt: HTMLBodyElement) {\n return {\n ...extractHTMLElementBase(elt),\n a_link: elt.aLink,\n background: elt.background,\n bg_color: elt.bgColor,\n link: elt.link,\n text: elt.text,\n v_link: elt.vLink,\n };\n}\n\nexport function extractHTMLDListElement(elt: HTMLDListElement) {\n return {\n ...extractHTMLElementBase(elt),\n compact: elt.compact,\n };\n}\n\nexport function extractHTMLDetailsElement(elt: HTMLDetailsElement) {\n return {\n ...extractHTMLElementBase(elt),\n open: elt.open,\n };\n}\n\nexport function extractHTMLDialogElement(elt: HTMLDialogElement) {\n return {\n ...extractHTMLElementBase(elt),\n open: elt.open,\n return_value: elt.returnValue,\n };\n}\n\nexport function extractHTMLDivElement(elt: HTMLDivElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n };\n}\n\nexport function extractHTMLHeadElement(elt: HTMLHeadElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLHeadingElement(elt: HTMLHeadingElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n };\n}\n\nexport function extractHTMLHRElement(elt: HTMLHRElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n color: elt.color,\n no_shade: elt.noShade,\n size: elt.size,\n width: elt.width,\n };\n}\n\nexport function extractHTMLHtmlElement(elt: HTMLHtmlElement) {\n return {\n ...extractHTMLElementBase(elt),\n version: elt.version,\n };\n}\n\nexport function extractHTMLMenuElement(elt: HTMLMenuElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLMetaElement(elt: HTMLMetaElement) {\n return {\n ...extractHTMLElementBase(elt),\n content: elt.content,\n http_equiv: elt.httpEquiv,\n name: elt.name,\n scheme: elt.scheme,\n };\n}\n\nexport function extractHTMLParagraphElement(elt: HTMLParagraphElement) {\n return {\n ...extractHTMLElementBase(elt),\n align: elt.align,\n };\n}\n\nexport function extractHTMLPictureElement(elt: HTMLPictureElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLPreElement(elt: HTMLPreElement) {\n return {\n ...extractHTMLElementBase(elt),\n width: elt.width,\n };\n}\n\nexport function extractHTMLSpanElement(elt: HTMLSpanElement) {\n return {\n ...extractHTMLElementBase(elt),\n };\n}\n\nexport function extractHTMLStyleElement(elt: HTMLStyleElement) {\n return {\n ...extractHTMLElementBase(elt),\n media: elt.media,\n type: elt.type,\n disabled: elt.disabled,\n };\n}\n\nexport function extractHTMLTitleElement(elt: HTMLTitleElement) {\n return {\n ...extractHTMLElementBase(elt),\n text: elt.text,\n };\n}\n\nexport function extractHTMLUListElement(elt: HTMLUListElement) {\n return {\n ...extractHTMLElementBase(elt),\n compact: elt.compact,\n type: elt.type,\n };\n}\n\nexport function extractHTMLElement(elt: HTMLElement): object {\n const tagName = elt.tagName.toUpperCase();\n\n switch (tagName) {\n case \"A\":\n return extractHTMLAnchorElement(elt as HTMLAnchorElement);\n case \"AREA\":\n return extractHTMLAreaElement(elt as HTMLAreaElement);\n case \"AUDIO\":\n return extractHTMLAudioElement(elt as HTMLAudioElement);\n case \"BASE\":\n return extractHTMLBaseElement(elt as HTMLBaseElement);\n case \"BLOCKQUOTE\":\n case \"Q\":\n return extractHTMLQuoteElement(elt as HTMLQuoteElement);\n case \"BODY\":\n return extractHTMLBodyElement(elt as HTMLBodyElement);\n case \"BR\":\n return extractHTMLBRElement(elt as HTMLBRElement);\n case \"BUTTON\":\n return extractHTMLButtonElement(elt as HTMLButtonElement);\n case \"CANVAS\": // Placeholder - no specific function yet\n return extractHTMLElementBase(elt);\n case \"CAPTION\":\n return extractHTMLTableCaptionElement(elt as HTMLTableCaptionElement);\n case \"CITE\":\n return extractHTMLCiteElement(elt); // Uses base HTMLElement\n case \"COL\":\n case \"COLGROUP\":\n return extractHTMLTableColElement(elt as HTMLTableColElement);\n case \"DATA\":\n return extractHTMLDataElement(elt as HTMLDataElement);\n case \"DETAILS\":\n return extractHTMLDetailsElement(elt as HTMLDetailsElement);\n case \"DIALOG\":\n return extractHTMLDialogElement(elt as HTMLDialogElement);\n case \"DIV\":\n return extractHTMLDivElement(elt as HTMLDivElement);\n case \"DL\":\n return extractHTMLDListElement(elt as HTMLDListElement);\n case \"EMBED\":\n return extractHTMLEmbedElement(elt as HTMLEmbedElement);\n case \"FIELDSET\":\n return extractHTMLFieldSetElement(elt as HTMLFieldSetElement);\n case \"FORM\":\n return extractHTMLFormElement(elt as HTMLFormElement);\n case \"H1\":\n case \"H2\":\n case \"H3\":\n case \"H4\":\n case \"H5\":\n case \"H6\":\n return extractHTMLHeadingElement(elt as HTMLHeadingElement);\n case \"HEAD\":\n return extractHTMLHeadElement(elt as HTMLHeadElement);\n case \"HR\":\n return extractHTMLHRElement(elt as HTMLHRElement);\n case \"HTML\":\n return extractHTMLHtmlElement(elt as HTMLHtmlElement);\n case \"IFRAME\":\n return extractHTMLIFrameElement(elt as HTMLIFrameElement);\n case \"IMG\":\n return extractHTMLImageElement(elt as HTMLImageElement);\n case \"INPUT\":\n return extractHTMLInputElement(elt as HTMLInputElement);\n case \"LABEL\":\n return extractHTMLLabelElement(elt as HTMLLabelElement);\n case \"LI\":\n return extractHTMLLiElement(elt as HTMLLIElement);\n case \"LINK\":\n return extractHTMLLinkElement(elt as HTMLLinkElement);\n case \"MAP\":\n return extractHTMLMapElement(elt as HTMLMapElement);\n case \"MENU\":\n return extractHTMLMenuElement(elt as HTMLMenuElement);\n case \"META\":\n return extractHTMLMetaElement(elt as HTMLMetaElement);\n case \"METER\":\n return extractHTMLMeterElement(elt as HTMLMeterElement);\n case \"INS\":\n case \"DEL\":\n return extractHTMLModElement(elt as HTMLModElement);\n case \"OBJECT\":\n return extractHTMLObjectElement(elt as HTMLObjectElement);\n case \"OL\":\n return extractHTMLOListElement(elt as HTMLOListElement);\n case \"OPTGROUP\":\n return extractHTMLOptGroupElement(elt as HTMLOptGroupElement);\n case \"OPTION\":\n return extractHTMLOptionElement(elt as HTMLOptionElement);\n case \"OUTPUT\":\n return extractHTMLOutputElement(elt as HTMLOutputElement);\n case \"P\":\n return extractHTMLParagraphElement(elt as HTMLParagraphElement);\n case \"PICTURE\":\n return extractHTMLPictureElement(elt as HTMLPictureElement);\n case \"PRE\":\n return extractHTMLPreElement(elt as HTMLPreElement);\n case \"PROGRESS\":\n return extractHTMLProgressElement(elt as HTMLProgressElement);\n case \"SCRIPT\":\n return extractHTMLScriptElement(elt as HTMLScriptElement);\n case \"SELECT\":\n return extractHTMLSelectElement(elt as HTMLSelectElement);\n case \"SLOT\":\n return extractHTMLSlotElement(elt as HTMLSlotElement);\n case \"SOURCE\":\n return extractHTMLSourceElement(elt as HTMLSourceElement);\n case \"SPAN\":\n return extractHTMLSpanElement(elt as HTMLSpanElement);\n case \"STYLE\":\n return extractHTMLStyleElement(elt as HTMLStyleElement);\n case \"TABLE\":\n return extractHTMLTableElement(elt as HTMLTableElement);\n case \"TBODY\":\n case \"THEAD\":\n case \"TFOOT\":\n return extractHTMLTableSectionElement(elt as HTMLTableSectionElement);\n case \"TD\":\n case \"TH\":\n return extractHTMLTableCellElement(elt as HTMLTableCellElement);\n case \"TEMPLATE\":\n return extractHTMLTemplateElement(elt as HTMLTemplateElement);\n case \"TEXTAREA\":\n return extractHTMLTextAreaElement(elt as HTMLTextAreaElement);\n case \"TIME\":\n return extractHTMLTimeElement(elt as HTMLTimeElement);\n case \"TITLE\":\n return extractHTMLTitleElement(elt as HTMLTitleElement);\n case \"TR\":\n return extractHTMLTableRowElement(elt as HTMLTableRowElement);\n case \"TRACK\":\n return extractHTMLTrackElement(elt as HTMLTrackElement);\n case \"UL\":\n return extractHTMLUListElement(elt as HTMLUListElement);\n case \"VIDEO\":\n return extractHTMLVideoElement(elt as HTMLVideoElement);\n // Add other tag names as needed\n default:\n throw new Error(\n `Unexpected HTML element tag: ${elt.tagName} (update .web/custom/serialize.ts)`\n );\n }\n}\n\nexport function extractSyntheticEvent(evt: React.SyntheticEvent) {\n return {\n // Very slow right now, to investigate\n // nativeEvent: cleanForSerialization(evt.nativeEvent),\n // use extractHTMLElement in every place where a HTMLElement or generic TElement type is used\n target: extractHTMLElement(evt.target as HTMLElement), // I think this is true for all or purposes\n // currentTarget is often not available in Reflex event handlers\n bubbles: evt.bubbles,\n cancelable: evt.cancelable,\n default_prevented: evt.defaultPrevented,\n event_phase: evt.eventPhase,\n is_trusted: evt.isTrusted,\n timestamp: evt.timeStamp,\n type: evt.type,\n };\n}\n\nexport function extractUIEvent(evt: React.UIEvent) {\n return { ...extractSyntheticEvent(evt), detail: evt.detail };\n}\n\nexport function extractMouseEvent(evt: React.MouseEvent) {\n return {\n ...extractUIEvent(evt),\n\n alt_key: evt.altKey,\n button: evt.button,\n buttons: evt.buttons,\n client_x: evt.clientX,\n client_y: evt.clientY,\n ctrl_key: evt.ctrlKey,\n meta_key: evt.metaKey,\n movement_x: evt.movementX,\n movement_y: evt.movementY,\n page_x: evt.pageX,\n page_y: evt.pageY,\n related_target: evt.relatedTarget\n ? extractHTMLElement(evt.relatedTarget as HTMLElement)\n : null,\n screen_x: evt.screenX,\n screen_y: evt.screenY,\n shift_key: evt.shiftKey,\n };\n}\n\nexport function extractClipboardEvent(evt: React.ClipboardEvent) {\n return {\n ...extractSyntheticEvent(evt),\n clipboard_data: extractDataTransfer(evt.clipboardData),\n };\n}\n\nexport function extractCompositionEvent(evt: React.CompositionEvent) {\n return {\n ...extractSyntheticEvent(evt),\n data: evt.data,\n };\n}\n\nexport function extractDragEvent(evt: React.DragEvent) {\n return {\n ...extractMouseEvent(evt),\n data_transfer: extractDataTransfer(evt.dataTransfer),\n };\n}\n\nexport function extractPointerEvent(evt: React.PointerEvent) {\n return {\n ...extractMouseEvent(evt),\n pointer_id: evt.pointerId,\n pressure: evt.pressure,\n tangential_pressure: evt.tangentialPressure,\n tilt_x: evt.tiltX,\n tilt_y: evt.tiltY,\n twist: evt.twist,\n width: evt.width,\n height: evt.height,\n pointer_type: evt.pointerType,\n is_primary: evt.isPrimary,\n };\n}\n\nexport function extractFocusEvent(evt: React.FocusEvent) {\n return {\n ...extractSyntheticEvent(evt),\n // target: extractHTMLElement(evt.target as HTMLElement),\n related_target: evt.relatedTarget\n ? extractHTMLElement(evt.relatedTarget as HTMLElement)\n : null,\n };\n}\n\nexport function extractFormEvent(evt: React.FormEvent) {\n return extractSyntheticEvent(evt);\n}\n\nexport function extractInvalidEvent(evt: React.InvalidEvent) {\n return extractSyntheticEvent(evt);\n}\n\nexport function extractChangeEvent(evt: React.ChangeEvent) {\n return extractFormEvent(evt);\n}\n\nexport function extractKeyboardEvent(evt: React.KeyboardEvent) {\n return {\n ...extractUIEvent(evt),\n alt_key: evt.altKey,\n ctrl_key: evt.ctrlKey,\n code: evt.code,\n key: evt.key,\n locale: evt.locale,\n location: evt.location,\n meta_key: evt.metaKey,\n repeat: evt.repeat,\n shift_key: evt.shiftKey,\n };\n}\n\nexport function extractTouchEvent(evt: React.TouchEvent) {\n return {\n ...extractUIEvent(evt),\n alt_key: evt.altKey,\n changed_touches: Array.from(evt.changedTouches).map((touch) => ({\n target: extractHTMLElement(touch.target as HTMLElement),\n identifier: touch.identifier,\n screen_x: touch.screenX,\n screen_y: touch.screenY,\n client_x: touch.clientX,\n client_y: touch.clientY,\n page_x: touch.pageX,\n page_y: touch.pageY,\n })),\n ctrl_key: evt.ctrlKey,\n meta_key: evt.metaKey,\n shift_key: evt.shiftKey,\n target_touches: Array.from(evt.targetTouches).map((touch) => ({\n target: extractHTMLElement(touch.target as HTMLElement),\n identifier: touch.identifier,\n screen_x: touch.screenX,\n screen_y: touch.screenY,\n client_x: touch.clientX,\n client_y: touch.clientY,\n page_x: touch.pageX,\n page_y: touch.pageY,\n })),\n touches: Array.from(evt.touches).map((touch) => ({\n target: extractHTMLElement(touch.target as HTMLElement),\n identifier: touch.identifier,\n screen_x: touch.screenX,\n screen_y: touch.screenY,\n client_x: touch.clientX,\n client_y: touch.clientY,\n page_x: touch.pageX,\n page_y: touch.pageY,\n })),\n };\n}\n\nexport function extractWheelEvent(evt: React.WheelEvent) {\n return {\n ...extractMouseEvent(evt),\n delta_mode: evt.deltaMode,\n delta_x: evt.deltaX,\n delta_y: evt.deltaY,\n delta_z: evt.deltaZ,\n };\n}\n\nexport function extractAnimationEvent(evt: React.AnimationEvent) {\n return {\n ...extractSyntheticEvent(evt),\n animation_name: evt.animationName,\n elapsed_time: evt.elapsedTime,\n pseudo_element: evt.pseudoElement,\n };\n}\n\nexport function extractToggleEvent(evt: React.ToggleEvent) {\n return {\n ...extractSyntheticEvent(evt),\n old_state: evt.oldState,\n new_state: evt.newState,\n };\n}\n\nexport function extractTransitionEvent(evt: React.TransitionEvent) {\n return {\n ...extractSyntheticEvent(evt),\n elapsed_time: evt.elapsedTime,\n property_name: evt.propertyName,\n pseudo_element: evt.pseudoElement,\n };\n}\n\n// Helper function to extract DataTransfer properties\nfunction extractDataTransfer(dt: DataTransfer | null): object | null {\n if (!dt) {\n return null;\n }\n const items = [];\n if (dt.items) {\n for (let i = 0; i < dt.items.length; i++) {\n const item = dt.items[i]!;\n items.push({\n kind: item.kind,\n type: item.type,\n });\n }\n }\n return {\n drop_effect: dt.dropEffect,\n effect_allowed: dt.effectAllowed,\n items: items,\n types: Array.from(dt.types || []),\n };\n}\n\nconst eventExtractorMap: { [key: string]: (evt: any) => object } = {\n // Pointer Events\n pointerdown: extractPointerEvent,\n pointermove: extractPointerEvent,\n pointerup: extractPointerEvent,\n pointercancel: extractPointerEvent,\n gotpointercapture: extractPointerEvent,\n lostpointercapture: extractPointerEvent,\n pointerenter: extractPointerEvent,\n pointerleave: extractPointerEvent,\n pointerover: extractPointerEvent,\n pointerout: extractPointerEvent,\n\n // Mouse Events\n click: extractMouseEvent,\n contextmenu: extractMouseEvent,\n dblclick: extractMouseEvent,\n mousedown: extractMouseEvent,\n mouseenter: extractMouseEvent,\n mouseleave: extractMouseEvent,\n mousemove: extractMouseEvent,\n mouseout: extractMouseEvent,\n mouseover: extractMouseEvent,\n mouseup: extractMouseEvent,\n\n // Drag Events\n drag: extractDragEvent,\n dragend: extractDragEvent,\n dragenter: extractDragEvent,\n dragexit: extractDragEvent,\n dragleave: extractDragEvent,\n dragover: extractDragEvent,\n dragstart: extractDragEvent,\n drop: extractDragEvent,\n\n // Keyboard Events\n keydown: extractKeyboardEvent,\n keypress: extractKeyboardEvent,\n keyup: extractKeyboardEvent,\n\n // Focus Events\n focus: extractFocusEvent,\n blur: extractFocusEvent,\n\n // Form Events\n change: extractChangeEvent,\n input: extractChangeEvent, // often used with change\n invalid: extractInvalidEvent,\n reset: extractFormEvent,\n submit: extractFormEvent,\n\n // Clipboard Events\n copy: extractClipboardEvent,\n cut: extractClipboardEvent,\n paste: extractClipboardEvent,\n\n // Composition Events\n compositionend: extractCompositionEvent,\n compositionstart: extractCompositionEvent,\n compositionupdate: extractCompositionEvent,\n\n // Touch Events\n touchcancel: extractTouchEvent,\n touchend: extractTouchEvent,\n touchmove: extractTouchEvent,\n touchstart: extractTouchEvent,\n\n // UI Events\n scroll: extractUIEvent,\n\n // Wheel Events\n wheel: extractWheelEvent,\n\n // Animation Events\n animationstart: extractAnimationEvent,\n animationend: extractAnimationEvent,\n animationiteration: extractAnimationEvent,\n\n // Transition Events\n transitionend: extractTransitionEvent,\n\n // Toggle Events\n toggle: extractToggleEvent,\n};\n\nexport function extractEvent(value: any): any {\n // Duck-typing for React's SyntheticEvent.\n // We check for properties that are unique to synthetic events.\n if (\n value &&\n typeof value === \"object\" &&\n \"nativeEvent\" in value &&\n typeof value.isDefaultPrevented === \"function\"\n ) {\n const evt = value as React.SyntheticEvent;\n // The `type` property is crucial for the lookup.\n if (typeof evt.type !== \"string\") {\n return value;\n }\n\n const extractor = eventExtractorMap[evt.type.toLowerCase()];\n if (extractor) {\n return extractor(evt);\n }\n\n // Fallback for unknown but event-like types\n console.warn(\n `No specific extractor for event type \"${evt.type}\". Using synthetic.`\n );\n return extractSyntheticEvent(evt);\n }\n\n // If it's not a duck-typed event, return it as is.\n return value;\n}\n",
9
9
  "import type { RouteInfo } from \"./helpers\";\nimport type { ClientMountMessage } from \"./messages\";\nimport { applyVDOMUpdates } from \"./renderer\";\nimport { extractEvent } from \"./serialize\";\nimport type { VDOM, VDOMNode } from \"./vdom\";\n\nimport { io, Socket } from \"socket.io-client\";\nimport type {\n ClientApiResultMessage,\n ClientMessage,\n ServerApiCallMessage,\n ServerErrorInfo,\n ServerMessage,\n} from \"./messages\";\n\nexport interface MountedView {\n vdom: VDOM;\n listener: VDOMListener;\n routeInfo: RouteInfo;\n}\n\nexport type VDOMListener = (node: VDOMNode) => void;\nexport type ConnectionStatusListener = (connected: boolean) => void;\nexport type ServerErrorListener = (\n path: string,\n error: ServerErrorInfo | null\n) => void;\n\nexport interface PulseClient {\n // Connection management\n connect(): Promise<void>;\n disconnect(): void;\n isConnected(): boolean;\n onConnectionChange(listener: ConnectionStatusListener): () => void;\n // Messages\n navigate(path: string, routeInfo: RouteInfo): Promise<void>;\n leave(path: string): Promise<void>;\n invokeCallback(path: string, callback: string, args: any[]): Promise<void>;\n // VDOM subscription\n mountView(path: string, view: MountedView): () => void;\n}\n\nexport class PulseSocketIOClient {\n private activeViews: Map<string, MountedView>;\n private socket: Socket | null = null;\n private messageQueue: ClientMessage[];\n private connectionListeners: Set<ConnectionStatusListener> = new Set();\n private serverErrors: Map<string, ServerErrorInfo> = new Map();\n private serverErrorListeners: Set<ServerErrorListener> = new Set();\n\n constructor(\n private url: string,\n private frameworkNavigate?: (to: string) => void\n ) {\n this.socket = null;\n this.activeViews = new Map();\n this.messageQueue = [];\n }\n public isConnected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public async connect(): Promise<void> {\n if (this.socket) {\n return;\n }\n return new Promise((resolve, reject) => {\n const socket = io(this.url, {\n transports: [\"websocket\"],\n });\n this.socket = socket;\n\n socket.on(\"connect\", () => {\n console.log(\"[SocketIOTransport] Connected:\", this.socket?.id);\n // Make sure to send a navigate payload for all the routes\n for (const [path, route] of this.activeViews) {\n socket.emit(\"message\", {\n type: \"mount\",\n path: path,\n routeInfo: route.routeInfo,\n } satisfies ClientMountMessage);\n }\n\n for (const payload of this.messageQueue) {\n // Already sent above\n if (payload.type === \"mount\" && this.activeViews.has(payload.path)) {\n continue;\n }\n // We're remounting all the routes, so no need to navigate\n if (payload.type === \"navigate\") {\n continue;\n }\n socket.emit(\"message\", payload);\n }\n this.messageQueue = [];\n\n this.notifyConnectionListeners(true);\n resolve();\n });\n\n socket.on(\"connect_error\", (err) => {\n console.error(\"[SocketIOTransport] Connection failed:\", err);\n this.notifyConnectionListeners(false);\n reject(err);\n });\n\n socket.on(\"disconnect\", () => {\n console.log(\"[SocketIOTransport] Disconnected\");\n this.notifyConnectionListeners(false);\n });\n\n // Wrap in an arrow function to avoid losing the `this` reference\n socket.on(\"message\", (data) => this.handleServerMessage(data));\n });\n }\n\n onConnectionChange(listener: ConnectionStatusListener): () => void {\n this.connectionListeners.add(listener);\n listener(this.isConnected());\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n private notifyConnectionListeners(connected: boolean): void {\n for (const listener of this.connectionListeners) {\n listener(connected);\n }\n }\n\n public onServerError(listener: ServerErrorListener): () => void {\n this.serverErrorListeners.add(listener);\n // Emit current errors to new listener\n for (const [path, err] of this.serverErrors) listener(path, err);\n return () => {\n this.serverErrorListeners.delete(listener);\n };\n }\n\n private notifyServerError(path: string, error: ServerErrorInfo | null) {\n for (const listener of this.serverErrorListeners) listener(path, error);\n }\n\n private async sendMessage(payload: ClientMessage): Promise<void> {\n if (this.isConnected()) {\n // console.log(\"[SocketIOTransport] Sending:\", payload);\n this.socket!.emit(\"message\", payload);\n } else {\n // console.log(\"[SocketIOTransport] Queuing message:\", payload);\n this.messageQueue.push(payload);\n }\n }\n\n public mountView(path: string, view: MountedView) {\n if (this.activeViews.has(path)) {\n throw new Error(`Path ${path} is already mounted`);\n }\n this.activeViews.set(path, view);\n void this.sendMessage({\n type: \"mount\",\n path,\n routeInfo: view.routeInfo,\n });\n }\n\n public async navigate(path: string, routeInfo: RouteInfo) {\n await this.sendMessage({\n type: \"navigate\",\n path,\n routeInfo,\n });\n }\n\n public unmount(path: string) {\n void this.sendMessage({ type: \"unmount\", path });\n this.activeViews.delete(path);\n }\n\n public disconnect() {\n this.socket?.disconnect();\n this.socket = null;\n this.messageQueue = [];\n this.connectionListeners.clear();\n this.activeViews.clear();\n this.serverErrors.clear();\n this.serverErrorListeners.clear();\n }\n\n private handleServerMessage(message: ServerMessage) {\n // console.log(\"[PulseClient] Received message:\", message);\n switch (message.type) {\n case \"vdom_init\": {\n const route = this.activeViews.get(message.path);\n if (route) {\n route.vdom = message.vdom;\n route.listener(route.vdom);\n }\n // Clear any prior error for this path on successful init\n if (this.serverErrors.has(message.path)) {\n this.serverErrors.delete(message.path);\n this.notifyServerError(message.path, null);\n }\n break;\n }\n case \"vdom_update\": {\n const route = this.activeViews.get(message.path);\n if (!route || !route.vdom) {\n console.error(\n `[PulseClient] Received VDOM update for path ${message.path} before initial tree was set.`\n );\n return;\n }\n route.vdom = applyVDOMUpdates(route.vdom, message.ops);\n route.listener(route.vdom);\n // Clear any prior error for this path on successful update\n if (this.serverErrors.has(message.path)) {\n this.serverErrors.delete(message.path);\n this.notifyServerError(message.path, null);\n }\n break;\n }\n case \"server_error\": {\n this.serverErrors.set(message.path, message.error);\n this.notifyServerError(message.path, message.error);\n break;\n }\n case \"api_call\": {\n void this.performApiCall(message);\n break;\n }\n case \"navigate_to\": {\n try {\n const dest = (message as any).path as string;\n if (this.frameworkNavigate) {\n this.frameworkNavigate(dest);\n } else {\n window.history.pushState({}, \"\", dest);\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n } catch (e) {\n console.error(\"Navigation error:\", e);\n }\n break;\n }\n }\n }\n\n private async performApiCall(msg: ServerApiCallMessage) {\n try {\n const res = await fetch(msg.url, {\n method: msg.method || \"GET\",\n headers: {\n ...(msg.headers || {}),\n ...(msg.body != null && !(\"content-type\" in (msg.headers || {}))\n ? { \"content-type\": \"application/json\" }\n : {}),\n },\n body:\n msg.body != null\n ? typeof msg.body === \"string\"\n ? msg.body\n : JSON.stringify(msg.body)\n : undefined,\n credentials: msg.credentials || \"include\",\n });\n const headersObj: Record<string, string> = {};\n res.headers.forEach((v, k) => (headersObj[k] = v));\n let body: any = null;\n const ct = res.headers.get(\"content-type\") || \"\";\n if (ct.includes(\"application/json\")) {\n body = await res.json().catch(() => null);\n } else {\n body = await res.text().catch(() => null);\n }\n const reply: ClientApiResultMessage = {\n type: \"api_result\",\n id: msg.id,\n ok: res.ok,\n status: res.status,\n headers: headersObj,\n body,\n };\n await this.sendMessage(reply);\n } catch (err) {\n const reply: ClientApiResultMessage = {\n type: \"api_result\",\n id: msg.id,\n ok: false,\n status: 0,\n headers: {},\n body: { error: String(err) },\n };\n await this.sendMessage(reply);\n }\n }\n\n public async invokeCallback(path: string, callback: string, args: any[]) {\n await this.sendMessage({\n type: \"callback\",\n path,\n callback,\n args: args.map(extractEvent),\n });\n }\n\n // public getVDOM(path: string): VDOM | null {\n // return this.activeViews.get(path)?.vdom ?? null;\n // }\n}\n",
10
10
  "import { io, Socket } from \"socket.io-client\";\nimport type { ServerMessage, ClientMessage } from \"./messages\";\n\n// =================================================================\n// Transport Abstraction\n// =================================================================\n\nexport type MessageListener = (message: ServerMessage) => void;\nexport type ConnectionStatusListener = (connected: boolean) => void;\n\nexport interface Transport {\n connect(listener: MessageListener): Promise<void>;\n disconnect(): void;\n sendMessage(payload: ClientMessage): Promise<void>;\n isConnected(): boolean;\n onConnectionChange(listener: ConnectionStatusListener): () => void;\n}\n\n// =================================================================\n// Socket.IO Transport\n// =================================================================\n\nexport class SocketIOTransport implements Transport {\n private socket: Socket | null = null;\n private listener: MessageListener | null = null;\n private messageQueue: ClientMessage[] = [];\n private connectionListeners: Set<ConnectionStatusListener> = new Set();\n\n constructor(private url: string) {}\n\n connect(listener: MessageListener): Promise<void> {\n this.listener = listener;\n return new Promise((resolve, reject) => {\n this.socket = io(this.url, {\n transports: [\"websocket\"],\n });\n\n this.socket.on(\"connect\", () => {\n console.log(\"[SocketIOTransport] Connected:\", this.socket?.id);\n\n for (const payload of this.messageQueue) {\n // console.log(\"[SocketIOTransport] Sending queued message:\", payload);\n this.socket?.emit(\"message\", payload);\n }\n this.messageQueue = [];\n\n this.notifyConnectionListeners(true);\n resolve();\n });\n\n this.socket.on(\"connect_error\", (err) => {\n console.error(\"[SocketIOTransport] Connection failed:\", err);\n this.notifyConnectionListeners(false);\n reject(err);\n });\n\n this.socket.on(\"disconnect\", () => {\n console.log(\"[SocketIOTransport] Disconnected\");\n this.notifyConnectionListeners(false);\n });\n\n this.socket.on(\"message\", (data: ServerMessage) => {\n // console.log(\"[SocketIOTransport] Received message:\", data);\n this.listener?.(data);\n });\n });\n }\n\n disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n this.listener = null;\n this.messageQueue = [];\n this.connectionListeners.clear();\n }\n\n async sendMessage(payload: ClientMessage): Promise<void> {\n if (this.isConnected()) {\n // console.log(\"[SocketIOTransport] Sending:\", payload);\n this.socket!.emit(\"message\", payload);\n } else {\n // console.log(\"[SocketIOTransport] Queuing message:\", payload);\n this.messageQueue.push(payload);\n }\n }\n\n isConnected(): boolean {\n return this.socket?.connected || false;\n }\n\n onConnectionChange(listener: ConnectionStatusListener): () => void {\n this.connectionListeners.add(listener);\n listener(this.isConnected());\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n private notifyConnectionListeners(connected: boolean): void {\n for (const listener of this.connectionListeners) {\n listener(connected);\n }\n }\n}\n\n// =================================================================\n// In-Memory Transport (for testing)\n// =================================================================\n\nexport class InMemoryTransport implements Transport {\n private listener: MessageListener | null = null;\n private connected = false;\n private connectionListeners: Set<ConnectionStatusListener> = new Set();\n\n // Simulate server-side message dispatching\n public dispatchMessage(message: ServerMessage) {\n if (this.listener) {\n // Simulate async behavior\n setTimeout(() => this.listener?.(message), 0);\n }\n }\n\n async connect(listener: MessageListener): Promise<void> {\n this.listener = listener;\n this.connected = true;\n console.log(\"[InMemoryTransport] Connected.\");\n }\n\n disconnect(): void {\n this.listener = null;\n this.connected = false;\n console.log(\"[InMemoryTransport] Disconnected.\");\n }\n\n async sendMessage(payload: ClientMessage): Promise<void> {\n if (!this.connected) {\n throw new Error(\"[InMemoryTransport] Not connected.\");\n }\n console.log(`[InMemoryTransport] Sent message:`, payload);\n // In a real test setup, this might trigger a simulated server response\n // via `dispatchMessage`.\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n onConnectionChange(listener: ConnectionStatusListener): () => void {\n this.connectionListeners.add(listener);\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n}\n",
11
11
  "import type { LoaderFunctionArgs } from \"react-router\";\n\nexport interface RouteInfo {\n pathname: string;\n hash: string;\n query: string;\n queryParams: Record<string, string>;\n pathParams: Record<string, string | undefined>;\n catchall: string[];\n}\n\nexport function extractServerRouteInfo({\n params,\n request,\n}: LoaderFunctionArgs) {\n const { \"*\": catchall = \"\", ...pathParams } = params;\n const parsedUrl = new URL(request.url);\n\n return {\n hash: parsedUrl.hash,\n pathname: parsedUrl.pathname,\n query: parsedUrl.search,\n queryParams: Object.fromEntries(parsedUrl.searchParams.entries()),\n pathParams,\n catchall: catchall.length > 1 ? catchall.split(\"/\") : [],\n } satisfies RouteInfo;\n}"
12
12
  ],
13
- "mappings": "AAAA,oBACE,cACA,aACA,mBACA,gBACA,cCLF,mBAAgB,eCGT,IAAM,EAAe,aACf,EAAqB,KAsE3B,SAAS,CAAa,CAAC,EAAqC,CAEjE,OAAO,OAAO,IAAS,UAAY,IAAS,KAGvC,SAAS,CAAgB,CAAC,EAAqC,CACpE,OACE,OAAO,IAAS,UAChB,IAAS,MACT,EAAK,IAAI,WA/EqB,IA+EQ,GACtC,EAAK,MAjFmB,aA6FrB,SAAS,CAAyB,CAAC,EAA2B,CACnE,IAAK,EAAiB,CAAI,EACxB,MAAM,IAAI,MAAM,2BAA2B,EAE7C,OAAO,EAAK,IAAI,MAAM,CAAyB,+DDnFjD,SAAS,CAAU,CAAC,EAAgB,EAAgC,CAClE,GAAI,EAAc,CAAI,EACpB,OAAO,EAAK,KAAO,EAErB,OAAO,EAGF,IAAM,EAAe,GAAwB,EAAG,UAAW,CAChE,IAAQ,cAAa,gBAAiB,EAAsB,EAG5D,GAAI,IAAS,MAAQ,OAAO,IAAS,WAAa,IAAS,OACzD,OAAO,KAIT,GAAI,OAAO,IAAS,UAAY,OAAO,IAAS,SAC9C,OAAO,cAAG,GAAH,qBAAU,EAInB,GAAI,EAAc,CAAI,EAAG,CAGrB,MADe,QAAS,IAAQ,OAAO,EAAK,MAAQ,UAGlD,OADA,QAAQ,MAAM,sCAAuC,CAAI,EAClD,KAIX,IAAQ,MAAK,QAAQ,CAAC,EAAG,WAAW,CAAC,GAAM,EAGrC,EAAsC,CAAC,EAC7C,QAAY,EAAK,KAAU,OAAO,QAAQ,CAAK,EAC7C,GAAI,OAAO,IAAU,UAAY,EAAM,WAAW,OAAO,EAAG,CAC1D,IAAM,EAAc,EAAM,UAAU,CAAc,EAClD,EAAe,GAAO,EAAY,CAAW,EAE7C,OAAe,GAAO,EAI1B,GAAI,EAAiB,CAAI,EAAG,CAC1B,IAAM,EAAe,EAA0B,CAAI,EAC7C,EAAY,EAAa,CAAY,EACrC,EAAmB,EAAS,IAAI,CAAC,EAAO,IAC5C,EAAC,EAAD,CAA6C,KAAM,GAAhC,EAAW,EAAO,CAAK,EAA1C,cAA0D,CAC3D,EACD,OAAO,EAAmD,EAAnD,IAAe,EAAf,SAAgC,GAAhC,qBAAmD,EAG5D,GAAI,IAAQ,EACV,OACE,cACG,EAAS,IAAI,CAAC,EAAO,IACpB,EAAC,EAAD,CAA6C,KAAM,GAAhC,EAAW,EAAO,CAAK,EAA1C,cAA0D,CAC3D,GAHH,qBAIE,EAIN,IAAM,EAAmB,EAAS,IAAI,CAAC,EAAO,IAC5C,EAAC,EAAD,CAA6C,KAAM,GAAhC,EAAW,EAAO,CAAK,EAA1C,cAA0D,CAC3D,EAED,OAAO,GAAM,cAAc,EAAK,EAAgB,GAAG,CAAgB,EAOrE,OAFE,QAAQ,MAAM,0BAA2B,CAAI,EAExC,KACR,EAED,EAAa,YAAc,eAMpB,SAAS,EAAiB,CAC/B,EACA,EAA6B,CAAC,EAC9B,EAAuB,CAAC,EACxB,EACa,CAEX,GAAI,EAAI,WAAW,CAAkB,EACnC,QAAQ,MACN,2BAA2B,qCAAuC,sCACpE,EAIJ,IAAM,EAAoB,CACxB,MACA,QACA,UACF,EAEA,GAAI,IAAQ,OACV,EAAK,IAAM,EAGb,OAAO,EAGF,SAAS,EAAc,CAC5B,EAAuB,CAAC,EACxB,EACa,CACb,IAAM,EAAoB,CACxB,IAAK,EACL,MAAO,CAAC,EACR,UACF,EAEA,GAAI,IAAQ,OACV,EAAK,IAAM,EAGb,OAAO,EAGF,SAAS,EAAgB,CAC9B,EACA,EAA6B,CAAC,EAC9B,EAAuB,CAAC,EACxB,EACa,CACb,IAAM,EAAoB,CACxB,IAAK,EAAqB,EAC1B,QACA,UACF,EAEA,GAAI,IAAQ,OACV,EAAK,IAAM,EAGb,OAAO,EAOT,SAAS,EAAc,CAAC,EAAgB,EAAkC,CACxE,GAAI,IAAS,GAAI,OAAO,EAAc,CAAI,EAAI,EAAO,KAErD,IAAM,EAAQ,EAAK,MAAM,GAAG,EAAE,IAAI,MAAM,EACpC,EAAkC,EAEtC,QAAW,KAAS,EAAO,CACzB,IAAK,EAAc,CAAO,EAIxB,OAHA,QAAQ,MACN,mEACF,EACO,KAET,IAAK,EAAQ,UAAY,GAAS,EAAQ,SAAS,OAIjD,OAHA,QAAQ,MACN,wCAAwC,kBAC1C,EACO,KAET,EAAU,EAAQ,SAAS,GAG7B,OAAO,EAAc,CAAO,EAAI,EAAU,KAG5C,SAAS,EAA6B,CAAC,EAAY,CACjD,GAAI,OAAO,IAAS,UAAY,IAAS,KACvC,OAAO,EAGT,OAAO,KAAK,MAAM,KAAK,UAAU,CAAI,CAAC,EAGjC,SAAS,CAAgB,CAC9B,EACA,EACU,CACV,IAAI,EAAU,GAAU,CAAW,EAEnC,QAAW,KAAU,EAAS,CAC5B,IAAQ,OAAM,OAAM,QAAS,EAG7B,GAAI,IAAS,GAAI,CACf,OAAQ,OACD,UACH,EAAU,EACV,UACG,eACH,GAAI,EAAc,CAAO,EACvB,EAAQ,MAAQ,IAAM,EAAQ,OAAS,CAAC,KAAO,CAAK,EAEtD,cAEA,QAAQ,MAAM,0CAA0C,GAAM,EAElE,SAGF,IAAM,EAAa,EAAK,UAAU,EAAG,EAAK,YAAY,GAAG,CAAC,EACpD,EAAa,SAAS,EAAK,UAAU,EAAK,YAAY,GAAG,EAAI,CAAC,EAAG,EAAE,EAEnE,EAAe,GAAe,EAAS,CAAU,EAEvD,IAAK,EAAc,CACjB,QAAQ,MAAM,kDAAkD,GAAM,EACtE,SAGF,IAAK,EAAa,SAChB,EAAa,SAAW,CAAC,EAG3B,OAAQ,OACD,UACH,EAAa,SAAS,GAAc,EACpC,UAEG,eACH,IAAM,EAAe,EAAa,SAAS,GAC3C,GAAI,EAAc,CAAY,EAC5B,EAAa,MAAQ,IAAM,EAAa,OAAS,CAAC,KAAO,CAAK,EAEhE,UAEG,SACH,EAAa,SAAS,OAAO,EAAY,EAAG,CAAI,EAChD,UAEG,SACH,EAAa,SAAS,OAAO,EAAY,CAAC,EAC1C,UAEG,OAAQ,CACX,IAAM,EAAO,EAAa,SAAS,OAAO,EAAK,WAAY,CAAC,EAAE,GAC9D,EAAa,SAAS,OAAO,EAAK,SAAU,EAAG,CAAI,EACnD,KACF,GAIJ,OAAO,EEnNF,SAAS,EAAc,CAAC,EAAsB,CACnD,MAAO,CACL,GAAI,EAAI,GACR,WAAY,EAAI,UAChB,SAAU,EAAI,QAAQ,YAAY,EAClC,WAAY,EAAI,UAChB,cAAe,EAAI,aACnB,YAAa,EAAI,WACjB,WAAY,EAAI,UAChB,aAAc,EAAI,YAClB,cAAe,EAAI,aACnB,YAAa,EAAI,WACjB,WAAY,EAAI,UAChB,aAAc,EAAI,YAClB,KAAM,EAAI,IACZ,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,CACL,UAAW,EAAI,UACf,UAAW,EAAI,SACf,MAAO,EAAI,KACb,EAGK,SAAS,CAAsB,CAAC,EAAkB,CACvD,MAAO,IACF,GAAe,CAAG,KAClB,GAAwB,CAAG,EAC9B,WAAY,EAAI,UAChB,iBAAkB,EAAI,eACtB,eAAgB,EAAI,eACpB,IAAK,EAAI,IACT,UAAW,EAAI,UACf,OAAQ,EAAI,OACZ,MAAO,EAAI,MACX,KAAM,EAAI,KACV,cAAe,EAAI,aACnB,YAAa,EAAI,WACjB,WAAY,EAAI,UAChB,aAAc,EAAI,YAClB,QAAS,EAAI,QACb,WAAY,EAAI,WAChB,MAAO,EAAI,MACX,UAAW,EAAI,UACf,oBAAqB,EAAI,mBACzB,iBAAkB,EAAI,gBACtB,eAAgB,EAAI,aACpB,oBAAqB,EAAI,kBACzB,WAAY,EAAI,SAClB,EAGK,SAAS,EAAwB,CAAC,EAAwB,CAC/D,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,KACV,KAAM,EAAI,KACV,SAAU,EAAI,SACd,KAAM,EAAI,KACV,OAAQ,EAAI,OACZ,SAAU,EAAI,SACd,SAAU,EAAI,SACd,KAAM,EAAI,KACV,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,OAAQ,EAAI,OACZ,SAAU,EAAI,SACd,IAAK,EAAI,IACT,SAAU,EAAI,SACd,KAAM,EAAI,KACV,SAAU,EAAI,SACd,KAAM,EAAI,KACV,gBAAiB,EAAI,eACrB,KAAM,EAAI,IACZ,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,EAC7B,IAAK,EAAI,IACT,OAAQ,EAAI,OACZ,SAAU,EAAI,SACd,KAAM,EAAI,KACV,KAAM,EAAI,KACV,SAAU,EAAI,SACd,KAAM,EAAI,KACV,OAAQ,EAAI,OACZ,SAAU,EAAI,SACd,SAAU,EAAI,SACd,KAAM,EAAI,KACV,SAAU,EAAI,SACd,IAAK,EAAI,IACT,OAAQ,EAAI,OACZ,MAAO,EAAI,MACX,OAAQ,EAAI,OACZ,SAAU,EAAI,SACd,KAAM,EAAI,KACV,gBAAiB,EAAI,cACvB,EAGK,SAAS,CAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,SAAU,EAAI,SACd,SAAU,EAAI,SACd,aAAc,EAAI,YAClB,YAAa,EAAI,WACjB,aAAc,EAAI,YAClB,cAAe,EAAI,aACnB,sBAAuB,EAAI,oBAC3B,SAAU,EAAI,SACd,MAAO,EAAI,MACX,KAAM,EAAI,KACV,MAAO,EAAI,MACX,cAAe,EAAI,aACnB,OAAQ,EAAI,OACZ,cAAe,EAAI,aACnB,QAAS,EAAI,QACb,YAAa,EAAI,WACjB,QAAS,EAAI,QACb,IAAK,EAAI,IACT,OAAQ,EAAI,OACZ,gBAAiB,EAAI,cACvB,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAwB,CAAG,CAEhC,EAGK,SAAS,EAAwB,CAAC,EAAwB,CAC/D,MAAO,IACF,EAAuB,CAAG,EAC7B,SAAU,EAAI,SACd,KAAM,EAAI,KACV,KAAM,EAAI,KACV,MAAO,EAAI,MACX,YAAa,EAAI,WACjB,aAAc,EAAI,YAClB,YAAa,EAAI,WACjB,iBAAkB,EAAI,eACtB,YAAa,EAAI,WACjB,sBAAuB,EAAI,mBAC7B,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,KACb,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,OAAQ,EAAI,OACZ,IAAK,EAAI,IACT,KAAM,EAAI,KACV,MAAO,EAAI,MACX,MAAO,EAAI,MACX,KAAM,EAAI,IACZ,EAGK,SAAS,EAA0B,CAAC,EAA0B,CACnE,MAAO,IACF,EAAuB,CAAG,EAC7B,SAAU,EAAI,SACd,KAAM,EAAI,KACV,KAAM,EAAI,KACV,mBAAoB,EAAI,kBACxB,cAAe,EAAI,YACrB,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,EAC7B,eAAgB,EAAI,cACpB,OAAQ,EAAI,OACZ,aAAc,EAAI,aAClB,SAAU,EAAI,SACd,QAAS,EAAI,QACb,OAAQ,EAAI,OACZ,OAAQ,EAAI,OACZ,KAAM,EAAI,KACV,YAAa,EAAI,WACjB,OAAQ,EAAI,OACZ,IAAK,EAAI,GACX,EAGK,SAAS,EAAwB,CAAC,EAAwB,CAC/D,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,MACX,iBAAkB,EAAI,gBACtB,OAAQ,EAAI,OACZ,KAAM,EAAI,KACV,gBAAiB,EAAI,eACrB,IAAK,EAAI,IACT,OAAQ,EAAI,OACZ,MAAO,EAAI,MACX,MAAO,EAAI,MACX,aAAc,EAAI,YAClB,UAAW,EAAI,SACf,cAAe,EAAI,aACnB,aAAc,EAAI,YAClB,UAAW,EAAI,UACf,QAAS,EAAI,OACf,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,IAAK,EAAI,IACT,aAAc,EAAI,YAClB,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,OAAQ,EAAI,MACZ,QAAS,EAAI,QACb,eAAgB,EAAI,cACpB,cAAe,EAAI,aACnB,gBAAiB,EAAI,eACrB,MAAO,EAAI,MACX,IAAK,EAAI,IACT,OAAQ,EAAI,OACZ,QAAS,EAAI,OACb,MAAO,EAAI,MACX,MAAO,EAAI,MACX,OAAQ,EAAI,OACZ,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,UAAW,EAAI,SACf,OAAQ,EAAI,OACZ,KAAM,EAAI,KACV,OAAQ,EAAI,OACZ,EAAG,EAAI,EACP,EAAG,EAAI,EACP,eAAgB,EAAI,aACtB,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,OAAQ,EAAI,OACZ,IAAK,EAAI,IACT,aAAc,EAAI,aAClB,QAAS,EAAI,QACb,gBAAiB,EAAI,eACrB,cAAe,EAAI,aACnB,SAAU,EAAI,QACd,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,cAAe,EAAI,cACnB,IAAK,EAAI,IACT,WAAY,EAAI,UAChB,IAAK,EAAI,IACT,WAAY,EAAI,UAChB,SAAU,EAAI,SACd,KAAM,EAAI,KACV,QAAS,EAAI,QACb,YAAa,EAAI,YACjB,UAAW,EAAI,SACf,SAAU,EAAI,SACd,oBAAqB,EAAI,mBACzB,cAAe,EAAI,aACnB,gBAAiB,EAAI,eACrB,KAAM,EAAI,KACV,IAAK,EAAI,IACT,KAAM,EAAI,KACV,KAAM,EAAI,KACV,MAAO,EAAI,MACX,gBAAiB,EAAI,cACrB,MAAO,EAAI,MACX,MAAO,EAAI,MACX,QAAS,EAAI,QACb,YAAa,EAAI,WACjB,aAAc,EAAI,YAClB,YAAa,EAAI,WACjB,iBAAkB,EAAI,eACtB,YAAa,EAAI,WACjB,QAAS,EAAI,OACb,mBAAoB,EAAI,kBACxB,cAAe,EAAI,aACnB,sBAAuB,EAAI,mBAC7B,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,SAAU,EAAI,OAChB,EAGK,SAAS,EAAoB,CAAC,EAAoB,CACvD,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,MACX,KAAM,EAAI,IACZ,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,EAC7B,GAAI,EAAI,GACR,aAAc,EAAI,YAClB,SAAU,EAAI,SACd,eAAgB,EAAI,cACpB,KAAM,EAAI,KACV,UAAW,EAAI,SACf,YAAa,EAAI,WACjB,aAAc,EAAI,YAClB,UAAW,EAAI,UACf,MAAO,EAAI,MACX,gBAAiB,EAAI,eACrB,IAAK,EAAI,IACT,KAAM,EAAI,KACV,QAAS,EAAI,QACb,IAAK,EAAI,IACT,OAAQ,EAAI,OACZ,MAAO,EAAI,KACb,EAGK,SAAS,EAAqB,CAAC,EAAqB,CACzD,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,IACZ,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,KACV,IAAK,EAAI,IACT,IAAK,EAAI,IACT,IAAK,EAAI,IACT,QAAS,EAAI,QACb,MAAO,EAAI,KACb,EAGK,SAAS,EAAqB,CAAC,EAAqB,CACzD,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,KACV,SAAU,EAAI,QAChB,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,SAAU,EAAI,SACd,MAAO,EAAI,MACX,KAAM,EAAI,KACV,QAAS,EAAI,OACf,EAGK,SAAS,EAAwB,CAAC,EAAwB,CAC/D,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,KAEV,OAAQ,EAAI,OACZ,KAAM,EAAI,KACV,KAAM,EAAI,KACV,QAAS,EAAI,OACb,MAAO,EAAI,MACX,mBAAoB,EAAI,kBACxB,cAAe,EAAI,aACnB,MAAO,EAAI,MACX,QAAS,EAAI,QACb,OAAQ,EAAI,OACZ,KAAM,EAAI,KACV,UAAW,EAAI,SACf,UAAW,EAAI,SACf,QAAS,EAAI,QACb,OAAQ,EAAI,OACZ,QAAS,EAAI,QACb,OAAQ,EAAI,MACd,EAGK,SAAS,EAA0B,CAAC,EAA0B,CACnE,MAAO,IACF,EAAuB,CAAG,EAC7B,SAAU,EAAI,SACd,MAAO,EAAI,KACb,EAGK,SAAS,EAAwB,CAAC,EAAwB,CAC/D,MAAO,IACF,EAAuB,CAAG,EAC7B,iBAAkB,EAAI,gBACtB,SAAU,EAAI,SACd,MAAO,EAAI,MACX,MAAO,EAAI,MACX,SAAU,EAAI,SACd,KAAM,EAAI,KACV,MAAO,EAAI,KACb,EAGK,SAAS,EAAwB,CAAC,EAAwB,CAC/D,MAAO,IACF,EAAuB,CAAG,EAC7B,cAAe,EAAI,aACnB,KAAM,EAAI,KACV,KAAM,EAAI,KACV,MAAO,EAAI,MACX,SAAU,EAAI,QACd,mBAAoB,EAAI,kBACxB,cAAe,EAAI,YACrB,EAGK,SAAS,EAA0B,CAAC,EAA0B,CACnE,MAAO,IACF,EAAuB,CAAG,EAC7B,IAAK,EAAI,IACT,SAAU,EAAI,SACd,MAAO,EAAI,KACb,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,IACZ,EAGK,SAAS,EAAsB,CAAC,EAAkB,CACvD,MAAO,IACF,EAAuB,CAAG,CAC/B,EAGK,SAAS,EAAwB,CAAC,EAAwB,CAC/D,MAAO,IACF,EAAuB,CAAG,EAC7B,OAAQ,EAAI,MACZ,aAAc,EAAI,YAClB,MAAO,EAAI,MACX,eAAgB,EAAI,cACpB,UAAW,EAAI,UACf,UAAW,EAAI,SACf,gBAAiB,EAAI,eACrB,IAAK,EAAI,IACT,KAAM,EAAI,KACV,KAAM,EAAI,KACV,QAAS,EAAI,QACb,MAAQ,EAAY,MACpB,SAAW,EAAY,OACzB,EAGK,SAAS,EAAwB,CAAC,EAAwB,CAC/D,MAAO,IACF,EAAuB,CAAG,EAC7B,aAAc,EAAI,aAClB,SAAU,EAAI,SACd,OAAQ,EAAI,OACZ,SAAU,EAAI,SACd,KAAM,EAAI,KACV,SAAU,EAAI,SACd,eAAgB,EAAI,cACpB,KAAM,EAAI,KACV,KAAM,EAAI,KACV,MAAO,EAAI,MACX,mBAAoB,EAAI,kBACxB,cAAe,EAAI,YACrB,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,IACZ,EAGK,SAAS,EAAwB,CAAC,EAAwB,CAC/D,MAAO,IACF,EAAuB,CAAG,EAC7B,OAAQ,EAAI,OACZ,MAAO,EAAI,MACX,MAAO,EAAI,MACX,IAAK,EAAI,IACT,OAAQ,EAAI,OACZ,KAAM,EAAI,KACV,MAAO,EAAI,KACb,EAGK,SAAS,EAA8B,CAAC,EAA8B,CAC3E,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,KACb,EAGK,SAAS,EAA2B,CAAC,EAA2B,CACrE,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,KACV,WAAY,EAAI,UAChB,SAAU,EAAI,QACd,QAAS,EAAI,QACb,SAAU,EAAI,QACd,MAAO,EAAI,MACX,MAAO,EAAI,MACX,KAAM,EAAI,KACV,SAAU,EAAI,QACd,GAAI,EAAI,GACR,OAAQ,EAAI,MACZ,OAAQ,EAAI,OACZ,QAAS,EAAI,OACb,QAAS,EAAI,OACb,MAAO,EAAI,KACb,EAGK,SAAS,EAA0B,CAAC,EAA0B,CACnE,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,KACV,MAAO,EAAI,MACX,GAAI,EAAI,GACR,OAAQ,EAAI,MACZ,QAAS,EAAI,OACb,MAAO,EAAI,KACb,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAE7B,MAAO,EAAI,MACX,SAAU,EAAI,QACd,OAAQ,EAAI,OACZ,aAAc,EAAI,YAClB,aAAc,EAAI,YAClB,MAAO,EAAI,MACX,MAAO,EAAI,MACX,QAAS,EAAI,QACb,MAAO,EAAI,KACb,EAGK,SAAS,EAA0B,CAAC,EAA0B,CACnE,MAAO,IACF,EAAuB,CAAG,EAC7B,UAAW,EAAI,SACf,kBAAmB,EAAI,gBACvB,MAAO,EAAI,MACX,SAAU,EAAI,QACd,GAAI,EAAI,GACR,OAAQ,EAAI,MACZ,QAAS,EAAI,MACf,EAGK,SAAS,EAA8B,CAAC,EAA8B,CAC3E,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,MACX,GAAI,EAAI,GACR,OAAQ,EAAI,MACZ,QAAS,EAAI,MACf,EAGK,SAAS,EAA0B,CAAC,EAA0B,CACnE,MAAO,IACF,EAAuB,CAAG,CAC/B,EAGK,SAAS,EAA0B,CAAC,EAA0B,CACnE,MAAO,IACF,EAAuB,CAAG,EAC7B,aAAc,EAAI,aAClB,KAAM,EAAI,KACV,cAAe,EAAI,aACnB,SAAU,EAAI,QACd,SAAU,EAAI,SACd,WAAY,EAAI,UAChB,WAAY,EAAI,UAChB,KAAM,EAAI,KACV,YAAa,EAAI,YACjB,UAAW,EAAI,SACf,SAAU,EAAI,SACd,KAAM,EAAI,KACV,oBAAqB,EAAI,mBACzB,cAAe,EAAI,aACnB,gBAAiB,EAAI,eACrB,MAAO,EAAI,MACX,KAAM,EAAI,KACV,YAAa,EAAI,WACjB,mBAAoB,EAAI,kBACxB,cAAe,EAAI,YACrB,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,EAC7B,SAAU,EAAI,QAChB,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,QAAS,EAAI,QACb,KAAM,EAAI,KACV,MAAO,EAAI,MACX,YAAa,EAAI,WACjB,IAAK,EAAI,IACT,QAAS,EAAI,OACf,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAwB,CAAG,EAC9B,OAAQ,EAAI,OACZ,OAAQ,EAAI,OACZ,aAAc,EAAI,YAClB,YAAa,EAAI,WACjB,MAAO,EAAI,MACX,aAAc,EAAI,WACpB,EAGK,SAAS,EAAoB,CAAC,EAAoB,CACvD,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,KACb,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,KACV,OAAQ,EAAI,MACd,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,EAC7B,OAAQ,EAAI,MACZ,WAAY,EAAI,WAChB,SAAU,EAAI,QACd,KAAM,EAAI,KACV,KAAM,EAAI,KACV,OAAQ,EAAI,KACd,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,QAAS,EAAI,OACf,EAGK,SAAS,EAAyB,CAAC,EAAyB,CACjE,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,IACZ,EAGK,SAAS,EAAwB,CAAC,EAAwB,CAC/D,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,KACV,aAAc,EAAI,WACpB,EAGK,SAAS,EAAqB,CAAC,EAAqB,CACzD,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,KACb,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,CAC/B,EAGK,SAAS,EAAyB,CAAC,EAAyB,CACjE,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,KACb,EAGK,SAAS,EAAoB,CAAC,EAAoB,CACvD,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,MACX,MAAO,EAAI,MACX,SAAU,EAAI,QACd,KAAM,EAAI,KACV,MAAO,EAAI,KACb,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,EAC7B,QAAS,EAAI,OACf,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,CAC/B,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,EAC7B,QAAS,EAAI,QACb,WAAY,EAAI,UAChB,KAAM,EAAI,KACV,OAAQ,EAAI,MACd,EAGK,SAAS,EAA2B,CAAC,EAA2B,CACrE,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,KACb,EAGK,SAAS,EAAyB,CAAC,EAAyB,CACjE,MAAO,IACF,EAAuB,CAAG,CAC/B,EAGK,SAAS,EAAqB,CAAC,EAAqB,CACzD,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,KACb,EAGK,SAAS,EAAsB,CAAC,EAAsB,CAC3D,MAAO,IACF,EAAuB,CAAG,CAC/B,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,MAAO,EAAI,MACX,KAAM,EAAI,KACV,SAAU,EAAI,QAChB,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,KAAM,EAAI,IACZ,EAGK,SAAS,EAAuB,CAAC,EAAuB,CAC7D,MAAO,IACF,EAAuB,CAAG,EAC7B,QAAS,EAAI,QACb,KAAM,EAAI,IACZ,EAGK,SAAS,CAAkB,CAAC,EAA0B,CAG3D,OAFgB,EAAI,QAAQ,YAAY,OAGjC,IACH,OAAO,GAAyB,CAAwB,MACrD,OACH,OAAO,GAAuB,CAAsB,MACjD,QACH,OAAO,GAAwB,CAAuB,MACnD,OACH,OAAO,GAAuB,CAAsB,MACjD,iBACA,IACH,OAAO,GAAwB,CAAuB,MACnD,OACH,OAAO,GAAuB,CAAsB,MACjD,KACH,OAAO,GAAqB,CAAoB,MAC7C,SACH,OAAO,GAAyB,CAAwB,MACrD,SACH,OAAO,EAAuB,CAAG,MAC9B,UACH,OAAO,GAA+B,CAA8B,MACjE,OACH,OAAO,GAAuB,CAAG,MAC9B,UACA,WACH,OAAO,GAA2B,CAA0B,MACzD,OACH,OAAO,GAAuB,CAAsB,MACjD,UACH,OAAO,GAA0B,CAAyB,MACvD,SACH,OAAO,GAAyB,CAAwB,MACrD,MACH,OAAO,GAAsB,CAAqB,MAC/C,KACH,OAAO,GAAwB,CAAuB,MACnD,QACH,OAAO,GAAwB,CAAuB,MACnD,WACH,OAAO,GAA2B,CAA0B,MACzD,OACH,OAAO,GAAuB,CAAsB,MACjD,SACA,SACA,SACA,SACA,SACA,KACH,OAAO,GAA0B,CAAyB,MACvD,OACH,OAAO,GAAuB,CAAsB,MACjD,KACH,OAAO,GAAqB,CAAoB,MAC7C,OACH,OAAO,GAAuB,CAAsB,MACjD,SACH,OAAO,GAAyB,CAAwB,MACrD,MACH,OAAO,GAAwB,CAAuB,MACnD,QACH,OAAO,GAAwB,CAAuB,MACnD,QACH,OAAO,GAAwB,CAAuB,MACnD,KACH,OAAO,GAAqB,CAAoB,MAC7C,OACH,OAAO,GAAuB,CAAsB,MACjD,MACH,OAAO,GAAsB,CAAqB,MAC/C,OACH,OAAO,GAAuB,CAAsB,MACjD,OACH,OAAO,GAAuB,CAAsB,MACjD,QACH,OAAO,GAAwB,CAAuB,MACnD,UACA,MACH,OAAO,GAAsB,CAAqB,MAC/C,SACH,OAAO,GAAyB,CAAwB,MACrD,KACH,OAAO,GAAwB,CAAuB,MACnD,WACH,OAAO,GAA2B,CAA0B,MACzD,SACH,OAAO,GAAyB,CAAwB,MACrD,SACH,OAAO,GAAyB,CAAwB,MACrD,IACH,OAAO,GAA4B,CAA2B,MAC3D,UACH,OAAO,GAA0B,CAAyB,MACvD,MACH,OAAO,GAAsB,CAAqB,MAC/C,WACH,OAAO,GAA2B,CAA0B,MACzD,SACH,OAAO,GAAyB,CAAwB,MACrD,SACH,OAAO,GAAyB,CAAwB,MACrD,OACH,OAAO,GAAuB,CAAsB,MACjD,SACH,OAAO,GAAyB,CAAwB,MACrD,OACH,OAAO,GAAuB,CAAsB,MACjD,QACH,OAAO,GAAwB,CAAuB,MACnD,QACH,OAAO,GAAwB,CAAuB,MACnD,YACA,YACA,QACH,OAAO,GAA+B,CAA8B,MACjE,SACA,KACH,OAAO,GAA4B,CAA2B,MAC3D,WACH,OAAO,GAA2B,CAA0B,MACzD,WACH,OAAO,GAA2B,CAA0B,MACzD,OACH,OAAO,GAAuB,CAAsB,MACjD,QACH,OAAO,GAAwB,CAAuB,MACnD,KACH,OAAO,GAA2B,CAA0B,MACzD,QACH,OAAO,GAAwB,CAAuB,MACnD,KACH,OAAO,GAAwB,CAAuB,MACnD,QACH,OAAO,GAAwB,CAAuB,UAGtD,MAAM,IAAI,MACR,gCAAgC,EAAI,2CACtC,GAIC,SAAS,CAAqB,CAAC,EAA2B,CAC/D,MAAO,CAIL,OAAQ,EAAmB,EAAI,MAAqB,EAEpD,QAAS,EAAI,QACb,WAAY,EAAI,WAChB,kBAAmB,EAAI,iBACvB,YAAa,EAAI,WACjB,WAAY,EAAI,UAChB,UAAW,EAAI,UACf,KAAM,EAAI,IACZ,EAGK,SAAS,CAAc,CAAC,EAAoB,CACjD,MAAO,IAAK,EAAsB,CAAG,EAAG,OAAQ,EAAI,MAAO,EAGtD,SAAS,CAAiB,CAAC,EAAuB,CACvD,MAAO,IACF,EAAe,CAAG,EAErB,QAAS,EAAI,OACb,OAAQ,EAAI,OACZ,QAAS,EAAI,QACb,SAAU,EAAI,QACd,SAAU,EAAI,QACd,SAAU,EAAI,QACd,SAAU,EAAI,QACd,WAAY,EAAI,UAChB,WAAY,EAAI,UAChB,OAAQ,EAAI,MACZ,OAAQ,EAAI,MACZ,eAAgB,EAAI,cAChB,EAAmB,EAAI,aAA4B,EACnD,KACJ,SAAU,EAAI,QACd,SAAU,EAAI,QACd,UAAW,EAAI,QACjB,EAGK,SAAS,CAAqB,CAAC,EAA2B,CAC/D,MAAO,IACF,EAAsB,CAAG,EAC5B,eAAgB,EAAoB,EAAI,aAAa,CACvD,EAGK,SAAS,CAAuB,CAAC,EAA6B,CACnE,MAAO,IACF,EAAsB,CAAG,EAC5B,KAAM,EAAI,IACZ,EAGK,SAAS,CAAgB,CAAC,EAAsB,CACrD,MAAO,IACF,EAAkB,CAAG,EACxB,cAAe,EAAoB,EAAI,YAAY,CACrD,EAGK,SAAS,CAAmB,CAAC,EAAyB,CAC3D,MAAO,IACF,EAAkB,CAAG,EACxB,WAAY,EAAI,UAChB,SAAU,EAAI,SACd,oBAAqB,EAAI,mBACzB,OAAQ,EAAI,MACZ,OAAQ,EAAI,MACZ,MAAO,EAAI,MACX,MAAO,EAAI,MACX,OAAQ,EAAI,OACZ,aAAc,EAAI,YAClB,WAAY,EAAI,SAClB,EAGK,SAAS,CAAiB,CAAC,EAAuB,CACvD,MAAO,IACF,EAAsB,CAAG,EAE5B,eAAgB,EAAI,cAChB,EAAmB,EAAI,aAA4B,EACnD,IACN,EAGK,SAAS,CAAgB,CAAC,EAAsB,CACrD,OAAO,EAAsB,CAAG,EAG3B,SAAS,EAAmB,CAAC,EAAyB,CAC3D,OAAO,EAAsB,CAAG,EAG3B,SAAS,CAAkB,CAAC,EAAwB,CACzD,OAAO,EAAiB,CAAG,EAGtB,SAAS,CAAoB,CAAC,EAA0B,CAC7D,MAAO,IACF,EAAe,CAAG,EACrB,QAAS,EAAI,OACb,SAAU,EAAI,QACd,KAAM,EAAI,KACV,IAAK,EAAI,IACT,OAAQ,EAAI,OACZ,SAAU,EAAI,SACd,SAAU,EAAI,QACd,OAAQ,EAAI,OACZ,UAAW,EAAI,QACjB,EAGK,SAAS,CAAiB,CAAC,EAAuB,CACvD,MAAO,IACF,EAAe,CAAG,EACrB,QAAS,EAAI,OACb,gBAAiB,MAAM,KAAK,EAAI,cAAc,EAAE,IAAI,CAAC,KAAW,CAC9D,OAAQ,EAAmB,EAAM,MAAqB,EACtD,WAAY,EAAM,WAClB,SAAU,EAAM,QAChB,SAAU,EAAM,QAChB,SAAU,EAAM,QAChB,SAAU,EAAM,QAChB,OAAQ,EAAM,MACd,OAAQ,EAAM,KAChB,EAAE,EACF,SAAU,EAAI,QACd,SAAU,EAAI,QACd,UAAW,EAAI,SACf,eAAgB,MAAM,KAAK,EAAI,aAAa,EAAE,IAAI,CAAC,KAAW,CAC5D,OAAQ,EAAmB,EAAM,MAAqB,EACtD,WAAY,EAAM,WAClB,SAAU,EAAM,QAChB,SAAU,EAAM,QAChB,SAAU,EAAM,QAChB,SAAU,EAAM,QAChB,OAAQ,EAAM,MACd,OAAQ,EAAM,KAChB,EAAE,EACF,QAAS,MAAM,KAAK,EAAI,OAAO,EAAE,IAAI,CAAC,KAAW,CAC/C,OAAQ,EAAmB,EAAM,MAAqB,EACtD,WAAY,EAAM,WAClB,SAAU,EAAM,QAChB,SAAU,EAAM,QAChB,SAAU,EAAM,QAChB,SAAU,EAAM,QAChB,OAAQ,EAAM,MACd,OAAQ,EAAM,KAChB,EAAE,CACJ,EAGK,SAAS,EAAiB,CAAC,EAAuB,CACvD,MAAO,IACF,EAAkB,CAAG,EACxB,WAAY,EAAI,UAChB,QAAS,EAAI,OACb,QAAS,EAAI,OACb,QAAS,EAAI,MACf,EAGK,SAAS,CAAqB,CAAC,EAA2B,CAC/D,MAAO,IACF,EAAsB,CAAG,EAC5B,eAAgB,EAAI,cACpB,aAAc,EAAI,YAClB,eAAgB,EAAI,aACtB,EAGK,SAAS,EAAkB,CAAC,EAAwB,CACzD,MAAO,IACF,EAAsB,CAAG,EAC5B,UAAW,EAAI,SACf,UAAW,EAAI,QACjB,EAGK,SAAS,EAAsB,CAAC,EAA4B,CACjE,MAAO,IACF,EAAsB,CAAG,EAC5B,aAAc,EAAI,YAClB,cAAe,EAAI,aACnB,eAAgB,EAAI,aACtB,EAIF,SAAS,CAAmB,CAAC,EAAwC,CACnE,IAAK,EACH,OAAO,KAET,IAAM,EAAQ,CAAC,EACf,GAAI,EAAG,MACL,QAAS,EAAI,EAAG,EAAI,EAAG,MAAM,OAAQ,IAAK,CACxC,IAAM,EAAO,EAAG,MAAM,GACtB,EAAM,KAAK,CACT,KAAM,EAAK,KACX,KAAM,EAAK,IACb,CAAC,EAGL,MAAO,CACL,YAAa,EAAG,WAChB,eAAgB,EAAG,cACnB,MAAO,EACP,MAAO,MAAM,KAAK,EAAG,OAAS,CAAC,CAAC,CAClC,EAGF,IAAM,GAA6D,CAEjE,YAAa,EACb,YAAa,EACb,UAAW,EACX,cAAe,EACf,kBAAmB,EACnB,mBAAoB,EACpB,aAAc,EACd,aAAc,EACd,YAAa,EACb,WAAY,EAGZ,MAAO,EACP,YAAa,EACb,SAAU,EACV,UAAW,EACX,WAAY,EACZ,WAAY,EACZ,UAAW,EACX,SAAU,EACV,UAAW,EACX,QAAS,EAGT,KAAM,EACN,QAAS,EACT,UAAW,EACX,SAAU,EACV,UAAW,EACX,SAAU,EACV,UAAW,EACX,KAAM,EAGN,QAAS,EACT,SAAU,EACV,MAAO,EAGP,MAAO,EACP,KAAM,EAGN,OAAQ,EACR,MAAO,EACP,QAAS,GACT,MAAO,EACP,OAAQ,EAGR,KAAM,EACN,IAAK,EACL,MAAO,EAGP,eAAgB,EAChB,iBAAkB,EAClB,kBAAmB,EAGnB,YAAa,EACb,SAAU,EACV,UAAW,EACX,WAAY,EAGZ,OAAQ,EAGR,MAAO,GAGP,eAAgB,EAChB,aAAc,EACd,mBAAoB,EAGpB,cAAe,GAGf,OAAQ,EACV,EAEO,SAAS,CAAY,CAAC,EAAiB,CAG5C,GACE,GACA,OAAO,IAAU,UACjB,gBAAiB,GACjB,OAAO,EAAM,qBAAuB,WACpC,CACA,IAAM,EAAM,EAEZ,GAAI,OAAO,EAAI,OAAS,SACtB,OAAO,EAGT,IAAM,EAAY,GAAkB,EAAI,KAAK,YAAY,GACzD,GAAI,EACF,OAAO,EAAU,CAAG,EAOtB,OAHA,QAAQ,KACN,yCAAyC,EAAI,yBAC/C,EACO,EAAsB,CAAG,EAIlC,OAAO,ECrzCT,aAAS,0BAoCF,MAAM,CAAoB,CASrB,IACA,kBATF,YACA,OAAwB,KACxB,aACA,oBAAqD,IAAI,IACzD,aAA6C,IAAI,IACjD,qBAAiD,IAAI,IAE7D,WAAW,CACD,EACA,EACR,CAFQ,WACA,yBAER,KAAK,OAAS,KACd,KAAK,YAAc,IAAI,IACvB,KAAK,aAAe,CAAC,EAEhB,WAAW,EAAY,CAC5B,OAAO,KAAK,QAAQ,WAAa,QAGtB,QAAO,EAAkB,CACpC,GAAI,KAAK,OACP,OAEF,OAAO,IAAI,QAAQ,CAAC,EAAS,IAAW,CACtC,IAAM,EAAS,GAAG,KAAK,IAAK,CAC1B,WAAY,CAAC,WAAW,CAC1B,CAAC,EACD,KAAK,OAAS,EAEd,EAAO,GAAG,UAAW,IAAM,CACzB,QAAQ,IAAI,iCAAkC,KAAK,QAAQ,EAAE,EAE7D,QAAY,EAAM,KAAU,KAAK,YAC/B,EAAO,KAAK,UAAW,CACrB,KAAM,QACN,KAAM,EACN,UAAW,EAAM,SACnB,CAA8B,EAGhC,QAAW,KAAW,KAAK,aAAc,CAEvC,GAAI,EAAQ,OAAS,SAAW,KAAK,YAAY,IAAI,EAAQ,IAAI,EAC/D,SAGF,GAAI,EAAQ,OAAS,WACnB,SAEF,EAAO,KAAK,UAAW,CAAO,EAEhC,KAAK,aAAe,CAAC,EAErB,KAAK,0BAA0B,EAAI,EACnC,EAAQ,EACT,EAED,EAAO,GAAG,gBAAiB,CAAC,IAAQ,CAClC,QAAQ,MAAM,yCAA0C,CAAG,EAC3D,KAAK,0BAA0B,EAAK,EACpC,EAAO,CAAG,EACX,EAED,EAAO,GAAG,aAAc,IAAM,CAC5B,QAAQ,IAAI,kCAAkC,EAC9C,KAAK,0BAA0B,EAAK,EACrC,EAGD,EAAO,GAAG,UAAW,CAAC,IAAS,KAAK,oBAAoB,CAAI,CAAC,EAC9D,EAGH,kBAAkB,CAAC,EAAgD,CAGjE,OAFA,KAAK,oBAAoB,IAAI,CAAQ,EACrC,EAAS,KAAK,YAAY,CAAC,EACpB,IAAM,CACX,KAAK,oBAAoB,OAAO,CAAQ,GAIpC,yBAAyB,CAAC,EAA0B,CAC1D,QAAW,KAAY,KAAK,oBAC1B,EAAS,CAAS,EAIf,aAAa,CAAC,EAA2C,CAC9D,KAAK,qBAAqB,IAAI,CAAQ,EAEtC,QAAY,EAAM,KAAQ,KAAK,aAAc,EAAS,EAAM,CAAG,EAC/D,MAAO,IAAM,CACX,KAAK,qBAAqB,OAAO,CAAQ,GAIrC,iBAAiB,CAAC,EAAc,EAA+B,CACrE,QAAW,KAAY,KAAK,qBAAsB,EAAS,EAAM,CAAK,OAG1D,YAAW,CAAC,EAAuC,CAC/D,GAAI,KAAK,YAAY,EAEnB,KAAK,OAAQ,KAAK,UAAW,CAAO,EAGpC,UAAK,aAAa,KAAK,CAAO,EAI3B,SAAS,CAAC,EAAc,EAAmB,CAChD,GAAI,KAAK,YAAY,IAAI,CAAI,EAC3B,MAAM,IAAI,MAAM,QAAQ,sBAAyB,EAEnD,KAAK,YAAY,IAAI,EAAM,CAAI,EAC1B,KAAK,YAAY,CACpB,KAAM,QACN,OACA,UAAW,EAAK,SAClB,CAAC,OAGU,SAAQ,CAAC,EAAc,EAAsB,CACxD,MAAM,KAAK,YAAY,CACrB,KAAM,WACN,OACA,WACF,CAAC,EAGI,OAAO,CAAC,EAAc,CACtB,KAAK,YAAY,CAAE,KAAM,UAAW,MAAK,CAAC,EAC/C,KAAK,YAAY,OAAO,CAAI,EAGvB,UAAU,EAAG,CAClB,KAAK,QAAQ,WAAW,EACxB,KAAK,OAAS,KACd,KAAK,aAAe,CAAC,EACrB,KAAK,oBAAoB,MAAM,EAC/B,KAAK,YAAY,MAAM,EACvB,KAAK,aAAa,MAAM,EACxB,KAAK,qBAAqB,MAAM,EAG1B,mBAAmB,CAAC,EAAwB,CAElD,OAAQ,EAAQ,UACT,YAAa,CAChB,IAAM,EAAQ,KAAK,YAAY,IAAI,EAAQ,IAAI,EAC/C,GAAI,EACF,EAAM,KAAO,EAAQ,KACrB,EAAM,SAAS,EAAM,IAAI,EAG3B,GAAI,KAAK,aAAa,IAAI,EAAQ,IAAI,EACpC,KAAK,aAAa,OAAO,EAAQ,IAAI,EACrC,KAAK,kBAAkB,EAAQ,KAAM,IAAI,EAE3C,KACF,KACK,cAAe,CAClB,IAAM,EAAQ,KAAK,YAAY,IAAI,EAAQ,IAAI,EAC/C,IAAK,IAAU,EAAM,KAAM,CACzB,QAAQ,MACN,+CAA+C,EAAQ,mCACzD,EACA,OAKF,GAHA,EAAM,KAAO,EAAiB,EAAM,KAAM,EAAQ,GAAG,EACrD,EAAM,SAAS,EAAM,IAAI,EAErB,KAAK,aAAa,IAAI,EAAQ,IAAI,EACpC,KAAK,aAAa,OAAO,EAAQ,IAAI,EACrC,KAAK,kBAAkB,EAAQ,KAAM,IAAI,EAE3C,KACF,KACK,eAAgB,CACnB,KAAK,aAAa,IAAI,EAAQ,KAAM,EAAQ,KAAK,EACjD,KAAK,kBAAkB,EAAQ,KAAM,EAAQ,KAAK,EAClD,KACF,KACK,WAAY,CACV,KAAK,eAAe,CAAO,EAChC,KACF,KACK,cAAe,CAClB,GAAI,CACF,IAAM,EAAQ,EAAgB,KAC9B,GAAI,KAAK,kBACP,KAAK,kBAAkB,CAAI,EAE3B,YAAO,QAAQ,UAAU,CAAC,EAAG,GAAI,CAAI,EACrC,OAAO,cAAc,IAAI,cAAc,UAAU,CAAC,EAEpD,MAAO,EAAG,CACV,QAAQ,MAAM,oBAAqB,CAAC,EAEtC,KACF,QAIU,eAAc,CAAC,EAA2B,CACtD,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,EAAI,IAAK,CAC/B,OAAQ,EAAI,QAAU,MACtB,QAAS,IACH,EAAI,SAAW,CAAC,KAChB,EAAI,MAAQ,QAAU,iBAAmB,EAAI,SAAW,CAAC,IACzD,CAAE,eAAgB,kBAAmB,EACrC,CAAC,CACP,EACA,KACE,EAAI,MAAQ,KACR,OAAO,EAAI,OAAS,SAClB,EAAI,KACJ,KAAK,UAAU,EAAI,IAAI,EACzB,OACN,YAAa,EAAI,aAAe,SAClC,CAAC,EACK,EAAqC,CAAC,EAC5C,EAAI,QAAQ,QAAQ,CAAC,EAAG,IAAO,EAAW,GAAK,CAAE,EACjD,IAAI,EAAY,KAEhB,IADW,EAAI,QAAQ,IAAI,cAAc,GAAK,IACvC,SAAS,kBAAkB,EAChC,EAAO,MAAM,EAAI,KAAK,EAAE,MAAM,IAAM,IAAI,EAExC,OAAO,MAAM,EAAI,KAAK,EAAE,MAAM,IAAM,IAAI,EAE1C,IAAM,EAAgC,CACpC,KAAM,aACN,GAAI,EAAI,GACR,GAAI,EAAI,GACR,OAAQ,EAAI,OACZ,QAAS,EACT,MACF,EACA,MAAM,KAAK,YAAY,CAAK,EAC5B,MAAO,EAAK,CACZ,IAAM,EAAgC,CACpC,KAAM,aACN,GAAI,EAAI,GACR,GAAI,GACJ,OAAQ,EACR,QAAS,CAAC,EACV,KAAM,CAAE,MAAO,OAAO,CAAG,CAAE,CAC7B,EACA,MAAM,KAAK,YAAY,CAAK,QAInB,eAAc,CAAC,EAAc,EAAkB,EAAa,CACvE,MAAM,KAAK,YAAY,CACrB,KAAM,WACN,OACA,WACA,KAAM,EAAK,IAAI,CAAY,CAC7B,CAAC,EAML,CJzSA,sBAAS,gBAAa,kBAAW,qEAiBjC,IAAM,GAAqB,EAA0C,IAAI,EAE5D,GAAiB,IAAM,CAClC,IAAM,EAAS,EAAW,EAAkB,EAC5C,IAAK,EACH,MAAM,IAAI,MAAM,oDAAoD,EAEtE,OAAO,GASH,GAAqB,EAAyC,IAAI,EAE3D,EAAwB,IAAM,CACzC,IAAM,EAAU,EAAW,EAAkB,EAC7C,IAAK,EACH,MAAM,IAAI,MACR,0FACF,EAEF,OAAO,GAYH,EAAY,OAAO,SAAW,YAE7B,SAAS,EAAa,EAAG,WAAU,UAA8B,CACtE,IAAO,EAAW,GAAgB,EAAS,EAAI,EACzC,EAAa,GAAY,EAEzB,EAAS,EACb,IAAM,IAAI,EAAoB,GAAG,EAAO,gBAAiB,CAAU,EACnE,CAAC,EAAO,cAAe,CAAU,CACnC,EAWA,OATA,EAAU,IAAM,EAAO,mBAAmB,CAAY,EAAG,CAAC,CAAM,CAAC,EAEjE,EAAU,IAAM,CACd,GAAI,EAEF,OADA,EAAO,QAAQ,EACR,IAAM,EAAO,WAAW,GAEhC,CAAC,CAAM,CAAC,EAGT,EAkBE,GAAmB,SAlBrB,CAA6B,MAAO,EAApC,SAkBE,EAjBE,GACA,EAaE,MAbF,CACE,MAAO,CACL,SAAU,QACV,OAAQ,OACR,MAAO,OACP,gBAAiB,MACjB,MAAO,QACP,QAAS,OACT,aAAc,MACd,OAAQ,IACV,EAVF,kEAaE,EAEH,IAjBH,qBAkBE,EAcC,SAAS,EAAS,EACvB,cACA,qBACA,QACiB,CACjB,IAAM,EAAS,GAAe,GACvB,EAAM,GAAW,EAAS,CAAW,GACrC,EAAa,GAAkB,EAAiC,IAAI,EAErE,EAAW,GAAY,EACvB,EAAS,GAAU,EAEnB,EAAY,EAAQ,IAAM,CAC9B,IAAQ,IAAK,EAAW,MAAO,GAAe,EACxC,EAAc,IAAI,gBAAgB,EAAS,MAAM,EACvD,MAAO,CACL,KAAM,EAAS,KACf,SAAU,EAAS,SACnB,MAAO,EAAS,OAChB,YAAa,OAAO,YAAY,EAAY,QAAQ,CAAC,EACrD,aACA,SAAU,EAAS,OAAS,EAAI,EAAS,MAAM,GAAG,EAAI,CAAC,CACzD,GACC,CACD,EAAS,KACT,EAAS,SACT,EAAS,OACT,KAAK,UAAU,CAAM,CACvB,CAAC,EAED,EAAU,IAAM,CACd,GAAI,EAAW,CACb,EAAO,UAAU,EAAM,CACrB,KAAM,EACN,SAAU,EACV,WACF,CAAC,EACD,IAAM,EAAS,EAAO,cAAc,CAAC,EAAG,IAAQ,CAC9C,GAAI,IAAM,EAAM,EAAe,CAAG,EACnC,EACD,MAAO,IAAM,CACX,QAAQ,IAAI,aAAc,CAAI,EAC9B,EAAO,EACP,EAAO,QAAQ,CAAI,KAItB,CAAC,CAAM,CAAC,EAEX,EAAU,IAAM,CACd,GAAI,EACF,EAAO,SAAS,EAAM,CAAS,GAEhC,CAAC,EAAQ,EAAM,CAAS,CAAC,EAE5B,IAAM,EAAgB,EAAQ,IAAM,CAClC,IAAM,EAAgB,IAAI,IAmB1B,MAAO,CAAE,YAjBW,CAAC,IAAgB,CACnC,IAAI,EAAK,EAAc,IAAI,CAAG,EAC9B,IAAK,EACH,EAAK,IAAI,KAAS,EAAO,eAAe,EAAM,EAAK,EAAI,EACvD,EAAc,IAAI,EAAK,CAAE,EAE3B,OAAO,GAWa,aARD,CAAC,IAAgB,CACpC,IAAM,EAAY,EAAmB,GACrC,IAAK,EACH,MAAM,IAAI,MAAM,uBAAuB,eAAiB,EAE1D,OAAO,EAG0B,GAClC,CAAC,EAAQ,EAAoB,CAAI,CAAC,EAErC,OACE,EAME,GAAmB,SANrB,CAA6B,MAAO,EAApC,SACG,EACC,EAAC,GAAD,CAAa,MAAO,GAApB,qBAAiC,EAEjC,EAAC,EAAD,CAAc,KAAM,GAApB,qBAA0B,GAJ9B,qBAME,EAIN,SAAS,EAAW,EAAG,SAAqC,CAC1D,OACE,EAqBE,MArBF,CACE,MAAO,CACL,QAAS,GACT,OAAQ,iBACR,WAAY,UACZ,MAAO,OACP,WACE,qGACF,WAAY,UACd,EATF,SAqBE,CAVA,EAEE,MAFF,CAAK,MAAO,CAAE,WAAY,IAAK,aAAc,CAAE,EAA/C,SAEE,CAFF,uBACuB,EAAM,QAD7B,qBAEE,EACD,EAAM,SAAW,EAAsB,MAAtB,UAAM,EAAM,SAAZ,qBAAsB,EACvC,EAAM,OACL,EAGE,UAHF,CAAS,KAAI,GAAC,MAAO,CAAE,UAAW,CAAE,EAApC,SAGE,CAFA,EAAsB,UAAtB,8CAAsB,EACtB,EAA0C,MAA1C,CAAK,MAAO,CAAE,OAAQ,CAAE,EAAxB,SAA4B,EAAM,OAAlC,qBAA0C,IAF5C,qBAGE,IAnBN,qBAqBE,EKtON,aAAS,0BAsBF,MAAM,EAAuC,CAM9B,IALZ,OAAwB,KACxB,SAAmC,KACnC,aAAgC,CAAC,EACjC,oBAAqD,IAAI,IAEjE,WAAW,CAAS,EAAa,CAAb,WAEpB,OAAO,CAAC,EAA0C,CAEhD,OADA,KAAK,SAAW,EACT,IAAI,QAAQ,CAAC,EAAS,IAAW,CACtC,KAAK,OAAS,GAAG,KAAK,IAAK,CACzB,WAAY,CAAC,WAAW,CAC1B,CAAC,EAED,KAAK,OAAO,GAAG,UAAW,IAAM,CAC9B,QAAQ,IAAI,iCAAkC,KAAK,QAAQ,EAAE,EAE7D,QAAW,KAAW,KAAK,aAEzB,KAAK,QAAQ,KAAK,UAAW,CAAO,EAEtC,KAAK,aAAe,CAAC,EAErB,KAAK,0BAA0B,EAAI,EACnC,EAAQ,EACT,EAED,KAAK,OAAO,GAAG,gBAAiB,CAAC,IAAQ,CACvC,QAAQ,MAAM,yCAA0C,CAAG,EAC3D,KAAK,0BAA0B,EAAK,EACpC,EAAO,CAAG,EACX,EAED,KAAK,OAAO,GAAG,aAAc,IAAM,CACjC,QAAQ,IAAI,kCAAkC,EAC9C,KAAK,0BAA0B,EAAK,EACrC,EAED,KAAK,OAAO,GAAG,UAAW,CAAC,IAAwB,CAEjD,KAAK,WAAW,CAAI,EACrB,EACF,EAGH,UAAU,EAAS,CACjB,KAAK,QAAQ,WAAW,EACxB,KAAK,OAAS,KACd,KAAK,SAAW,KAChB,KAAK,aAAe,CAAC,EACrB,KAAK,oBAAoB,MAAM,OAG3B,YAAW,CAAC,EAAuC,CACvD,GAAI,KAAK,YAAY,EAEnB,KAAK,OAAQ,KAAK,UAAW,CAAO,EAGpC,UAAK,aAAa,KAAK,CAAO,EAIlC,WAAW,EAAY,CACrB,OAAO,KAAK,QAAQ,WAAa,GAGnC,kBAAkB,CAAC,EAAgD,CAGjE,OAFA,KAAK,oBAAoB,IAAI,CAAQ,EACrC,EAAS,KAAK,YAAY,CAAC,EACpB,IAAM,CACX,KAAK,oBAAoB,OAAO,CAAQ,GAIpC,yBAAyB,CAAC,EAA0B,CAC1D,QAAW,KAAY,KAAK,oBAC1B,EAAS,CAAS,EAGxB,CC5FO,SAAS,EAAsB,EACpC,SACA,WACqB,CACrB,IAAQ,IAAK,EAAW,MAAO,GAAe,EACxC,EAAY,IAAI,IAAI,EAAQ,GAAG,EAErC,MAAO,CACL,KAAM,EAAU,KAChB,SAAU,EAAU,SACpB,MAAO,EAAU,OACjB,YAAa,OAAO,YAAY,EAAU,aAAa,QAAQ,CAAC,EAChE,aACA,SAAU,EAAS,OAAS,EAAI,EAAS,MAAM,GAAG,EAAI,CAAC,CACzD",
14
- "debugId": "CFE783285C79634A64756E2164756E21",
13
+ "mappings": "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",
14
+ "debugId": "6C27788B0A510EB464756E2164756E21",
15
15
  "names": []
16
16
  }
package/dist/pulse.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import React, { type ComponentType } from "react";
1
+ import React from "react";
2
2
  import { PulseSocketIOClient } from "./client";
3
- import type { VDOM, ComponentRegistry } from "./vdom";
3
+ import type { VDOM, ComponentRegistry, RegistryEntry } from "./vdom";
4
4
  export interface PulseConfig {
5
5
  serverAddress: string;
6
6
  }
7
7
  export declare const usePulseClient: () => PulseSocketIOClient;
8
8
  interface PulseRenderHelpers {
9
9
  getCallback: (key: string) => (...args: any[]) => void;
10
- getComponent: (key: string) => ComponentType<any>;
10
+ getComponent: (key: string) => RegistryEntry;
11
11
  }
12
12
  export declare const usePulseRenderHelpers: () => PulseRenderHelpers;
13
13
  export interface PulseProviderProps {
@@ -1,11 +1,17 @@
1
- import React from "react";
1
+ import React, { type ComponentType } from "react";
2
2
  import type { VDOMElement, VDOMNode, VDOMUpdate } from "./vdom";
3
3
  interface VDOMRendererProps {
4
4
  node: VDOMNode;
5
5
  }
6
- export declare const VDOMRenderer: React.NamedExoticComponent<VDOMRendererProps>;
6
+ export declare const VDOMRenderer: {
7
+ ({ node }: VDOMRendererProps): import("react/jsx-runtime").JSX.Element | null;
8
+ displayName: string;
9
+ };
7
10
  export declare function createElementNode(tag: string, props?: Record<string, any>, children?: VDOMNode[], key?: string): VDOMElement;
8
11
  export declare function createFragment(children?: VDOMNode[], key?: string): VDOMElement;
9
12
  export declare function createMountPoint(componentKey: string, props?: Record<string, any>, children?: VDOMNode[], key?: string): VDOMElement;
10
13
  export declare function applyVDOMUpdates(initialTree: VDOMNode, updates: VDOMUpdate[]): VDOMNode;
14
+ export declare function RenderLazy(component: () => Promise<{
15
+ default: ComponentType<any>;
16
+ }>, fallback?: React.ReactNode): React.FC<React.PropsWithChildren<unknown>>;
11
17
  export {};
package/dist/vdom.d.ts CHANGED
@@ -1,12 +1,14 @@
1
1
  import type { ComponentType } from "react";
2
2
  export declare const FRAGMENT_TAG = "$$fragment";
3
3
  export declare const MOUNT_POINT_PREFIX = "$$";
4
+ export type RegistryEntry = ComponentType<any>;
4
5
  export type ComponentRegistry = Record<string, ComponentType<any>>;
5
6
  export interface VDOMElement {
6
7
  tag: string;
7
8
  props?: Record<string, any>;
8
9
  children?: VDOMNode[];
9
10
  key?: string;
11
+ lazy?: boolean;
10
12
  }
11
13
  export type PrimitiveNode = string | number | boolean;
12
14
  export type VDOMNode = PrimitiveNode | VDOMElement;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pulse-ui-client",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "sideEffects": false,