pulse-ui-client 0.1.31 → 0.1.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,15 +1,352 @@
1
- export type { ChannelBridge } from "./channel";
2
- export { PulseChannelResetError } from "./channel";
3
- export type { ConnectionStatusListener, MountedView, PulseClient, ServerErrorListener, } from "./client";
4
- export type { PulseFormProps } from "./form";
5
- export { PulseForm, submitForm } from "./form";
6
- export type { RouteInfo } from "./helpers";
7
- export { extractServerRouteInfo } from "./helpers";
8
- export type { ClientApiResultMessage, ClientCallbackMessage, ClientChannelMessage, ClientChannelRequestMessage, ClientChannelResponseMessage, ClientMessage, ClientMountMessage, ClientNavigateMessage, ClientUnmountMessage, ServerApiCallMessage, ServerChannelMessage, ServerChannelRequestMessage, ServerChannelResponseMessage, ServerErrorInfo, ServerErrorMessage, ServerInitMessage, ServerMessage, ServerNavigateToMessage, ServerUpdateMessage, } from "./messages";
9
- export type { PulseConfig, PulsePrerender, PulseProviderProps } from "./pulse";
10
- export { PulseProvider, PulseView, usePulseClient } from "./pulse";
11
- export { RenderLazy } from "./renderer";
12
- export { deserialize, serialize, } from "./serialize/serializer";
13
- export type { MessageListener, Transport } from "./transport";
14
- export { usePulseChannel } from "./usePulseChannel";
15
- export type { ComponentRegistry, VDOM, VDOMElement, VDOMNode, VDOMUpdate, } from "./vdom";
1
+ import * as react0 from "react";
2
+ import React, { ComponentType, FC, PropsWithChildren, ReactNode } from "react";
3
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
4
+ import { LoaderFunctionArgs, NavigateFunction } from "react-router";
5
+
6
+ //#region src/helpers.d.ts
7
+ interface RouteInfo {
8
+ pathname: string;
9
+ hash: string;
10
+ query: string;
11
+ queryParams: Record<string, string>;
12
+ pathParams: Record<string, string | undefined>;
13
+ catchall: string[];
14
+ }
15
+ declare function extractServerRouteInfo({
16
+ params,
17
+ request
18
+ }: LoaderFunctionArgs): {
19
+ hash: string;
20
+ pathname: string;
21
+ query: string;
22
+ queryParams: {
23
+ [k: string]: string;
24
+ };
25
+ pathParams: {
26
+ readonly [x: string]: string | undefined;
27
+ };
28
+ catchall: string[];
29
+ };
30
+ //#endregion
31
+ //#region src/vdom.d.ts
32
+ type ComponentRegistry = Record<string, ComponentType<any>>;
33
+ interface VDOMElement {
34
+ tag: string;
35
+ props?: Record<string, any>;
36
+ children?: VDOMNode[];
37
+ key?: string;
38
+ lazy?: boolean;
39
+ }
40
+ type PrimitiveNode = string | number | boolean;
41
+ type VDOMNode = PrimitiveNode | VDOMElement;
42
+ type VDOM = VDOMNode;
43
+ interface VDOMUpdateBase {
44
+ type: string;
45
+ path: string;
46
+ }
47
+ interface ReplaceUpdate extends VDOMUpdateBase {
48
+ type: "replace";
49
+ data: VDOMNode;
50
+ }
51
+ interface UpdatePropsUpdate extends VDOMUpdateBase {
52
+ type: "update_props";
53
+ data: {
54
+ set?: Record<string, any>;
55
+ remove?: string[];
56
+ };
57
+ }
58
+ interface ReconciliationUpdate {
59
+ type: "reconciliation";
60
+ path: string;
61
+ N: number;
62
+ new: [number[], VDOM[]];
63
+ reuse: [number[], number[]];
64
+ }
65
+ interface PathDelta {
66
+ add?: string[];
67
+ remove?: string[];
68
+ }
69
+ interface UpdateCallbacksUpdate extends VDOMUpdateBase {
70
+ type: "update_callbacks";
71
+ data: PathDelta;
72
+ }
73
+ interface UpdateRenderPropsUpdate extends VDOMUpdateBase {
74
+ type: "update_render_props";
75
+ data: PathDelta;
76
+ }
77
+ interface UpdateCssRefsUpdate extends VDOMUpdateBase {
78
+ type: "update_css_refs";
79
+ data: PathDelta;
80
+ }
81
+ type VDOMUpdate = ReplaceUpdate | UpdatePropsUpdate | ReconciliationUpdate | UpdateCallbacksUpdate | UpdateRenderPropsUpdate | UpdateCssRefsUpdate;
82
+ //#endregion
83
+ //#region src/messages.d.ts
84
+ interface ServerInitMessage {
85
+ type: "vdom_init";
86
+ path: string;
87
+ vdom: VDOM;
88
+ callbacks: string[];
89
+ render_props: string[];
90
+ css_refs: string[];
91
+ }
92
+ interface ServerUpdateMessage {
93
+ type: "vdom_update";
94
+ path: string;
95
+ ops: VDOMUpdate[];
96
+ }
97
+ interface ServerErrorInfo {
98
+ message: string;
99
+ stack?: string;
100
+ phase: "render" | "callback" | "mount" | "unmount" | "navigate" | "server";
101
+ details?: Record<string, any>;
102
+ }
103
+ interface ServerErrorMessage {
104
+ type: "server_error";
105
+ path: string;
106
+ error: ServerErrorInfo;
107
+ }
108
+ interface ServerApiCallMessage {
109
+ type: "api_call";
110
+ id: string;
111
+ url: string;
112
+ method: string;
113
+ headers: Record<string, string>;
114
+ body: any | null;
115
+ credentials: "include" | "omit";
116
+ }
117
+ interface ServerChannelRequestMessage {
118
+ type: "channel_message";
119
+ channel: string;
120
+ event: string;
121
+ payload?: any;
122
+ requestId?: string;
123
+ responseTo?: never;
124
+ error?: any;
125
+ }
126
+ interface ServerChannelResponseMessage {
127
+ type: "channel_message";
128
+ channel: string;
129
+ event?: undefined;
130
+ responseTo: string;
131
+ payload?: any;
132
+ error?: any;
133
+ requestId?: never;
134
+ }
135
+ type ServerChannelMessage = ServerChannelRequestMessage | ServerChannelResponseMessage;
136
+ interface ServerNavigateToMessage {
137
+ type: "navigate_to";
138
+ path: string;
139
+ replace: boolean;
140
+ }
141
+ type ServerMessage = ServerInitMessage | ServerUpdateMessage | ServerErrorMessage | ServerApiCallMessage | ServerNavigateToMessage | ServerChannelRequestMessage | ServerChannelResponseMessage;
142
+ interface ClientCallbackMessage {
143
+ type: "callback";
144
+ path: string;
145
+ callback: string;
146
+ args: any[];
147
+ }
148
+ interface ClientMountMessage {
149
+ type: "mount";
150
+ path: string;
151
+ routeInfo: RouteInfo;
152
+ }
153
+ interface ClientNavigateMessage {
154
+ type: "navigate";
155
+ path: string;
156
+ routeInfo: RouteInfo;
157
+ }
158
+ interface ClientUnmountMessage {
159
+ type: "unmount";
160
+ path: string;
161
+ }
162
+ interface ClientApiResultMessage {
163
+ type: "api_result";
164
+ id: string;
165
+ ok: boolean;
166
+ status: number;
167
+ headers: Record<string, string>;
168
+ body: any | null;
169
+ }
170
+ interface ClientChannelRequestMessage {
171
+ type: "channel_message";
172
+ channel: string;
173
+ event: string;
174
+ payload?: any;
175
+ requestId?: string;
176
+ responseTo?: never;
177
+ error?: any;
178
+ }
179
+ interface ClientChannelResponseMessage {
180
+ type: "channel_message";
181
+ channel: string;
182
+ event?: undefined;
183
+ responseTo: string;
184
+ payload?: any;
185
+ error?: any;
186
+ requestId?: never;
187
+ }
188
+ type ClientChannelMessage = ClientChannelRequestMessage | ClientChannelResponseMessage;
189
+ type ClientMessage = ClientMountMessage | ClientCallbackMessage | ClientNavigateMessage | ClientUnmountMessage | ClientApiResultMessage | ClientChannelRequestMessage | ClientChannelResponseMessage;
190
+ //#endregion
191
+ //#region src/client.d.ts
192
+ interface MountedView {
193
+ routeInfo: RouteInfo;
194
+ onInit: (vdom: VDOM, callbacks: string[], renderProps: string[], cssRefs: string[]) => void;
195
+ onUpdate: (ops: VDOMUpdate[]) => void;
196
+ }
197
+ type ConnectionStatusListener = (connected: boolean) => void;
198
+ type ServerErrorListener = (path: string, error: ServerErrorInfo | null) => void;
199
+ interface PulseClient {
200
+ connect(): Promise<void>;
201
+ disconnect(): void;
202
+ isConnected(): boolean;
203
+ onConnectionChange(listener: ConnectionStatusListener): () => void;
204
+ navigate(path: string, routeInfo: RouteInfo): Promise<void>;
205
+ leave(path: string): Promise<void>;
206
+ invokeCallback(path: string, callback: string, args: any[]): Promise<void>;
207
+ mountView(path: string, view: MountedView): () => void;
208
+ }
209
+ declare class PulseSocketIOClient {
210
+ #private;
211
+ constructor(url: string, renderId: string, frameworkNavigate: NavigateFunction);
212
+ isConnected(): boolean;
213
+ connect(): Promise<void>;
214
+ onConnectionChange(listener: ConnectionStatusListener): () => void;
215
+ private notifyConnectionListeners;
216
+ onServerError(listener: ServerErrorListener): () => void;
217
+ private notifyServerError;
218
+ sendMessage(payload: ClientMessage): void;
219
+ mountView(path: string, view: MountedView): void;
220
+ navigate(path: string, routeInfo: RouteInfo): Promise<void>;
221
+ unmount(path: string): void;
222
+ disconnect(): void;
223
+ invokeCallback(path: string, callback: string, args: any[]): void;
224
+ acquireChannel(id: string): ChannelBridge;
225
+ releaseChannel(id: string): void;
226
+ }
227
+ //#endregion
228
+ //#region src/channel.d.ts
229
+ declare class PulseChannelResetError extends Error {
230
+ constructor(message: string);
231
+ }
232
+ type ChannelEventHandler = (payload: any) => any | Promise<any>;
233
+ declare class ChannelBridge {
234
+ private client;
235
+ readonly id: string;
236
+ private handlers;
237
+ private pending;
238
+ private backlog;
239
+ private closed;
240
+ constructor(client: PulseSocketIOClient, id: string);
241
+ emit(event: string, payload?: any): void;
242
+ request(event: string, payload?: any): Promise<any>;
243
+ on(event: string, handler: ChannelEventHandler): () => void;
244
+ handleServerMessage(message: ServerChannelMessage): boolean;
245
+ handleDisconnect(reason: PulseChannelResetError): void;
246
+ dispose(reason: PulseChannelResetError): void;
247
+ private ensureOpen;
248
+ private flushBacklog;
249
+ private dispatchEvent;
250
+ private dispatchRequest;
251
+ private resolvePending;
252
+ private close;
253
+ }
254
+ //#endregion
255
+ //#region src/form.d.ts
256
+ type PulseFormProps = React.ComponentPropsWithoutRef<"form"> & {
257
+ action: string;
258
+ };
259
+ /**
260
+ * PulseForm intercepts native form submissions and sends them through fetch so the
261
+ * surrounding Pulse view stays mounted. Server-side handlers are still invoked via
262
+ * the form action endpoint and reactive updates propagate over the socket.
263
+ */
264
+ declare const PulseForm: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>, "ref"> & {
265
+ action: string;
266
+ } & React.RefAttributes<HTMLFormElement>>;
267
+ interface SubmitForm {
268
+ event: React.FormEvent<HTMLFormElement>;
269
+ action: string;
270
+ onSubmit?: PulseFormProps["onSubmit"];
271
+ formData?: FormData;
272
+ force?: boolean;
273
+ }
274
+ declare function submitForm({
275
+ event,
276
+ action,
277
+ onSubmit,
278
+ formData,
279
+ force
280
+ }: SubmitForm): Promise<void>;
281
+ //#endregion
282
+ //#region src/pulse.d.ts
283
+ interface PulseConfig {
284
+ serverAddress: string;
285
+ }
286
+ type PulsePrerenderView = {
287
+ vdom: VDOM;
288
+ callbacks: string[];
289
+ render_props: string[];
290
+ css_refs: string[];
291
+ };
292
+ type PulsePrerender = {
293
+ renderId: string;
294
+ views: Record<string, PulsePrerenderView>;
295
+ };
296
+ declare const usePulseClient: () => PulseSocketIOClient;
297
+ interface PulseProviderProps {
298
+ children: ReactNode;
299
+ config: PulseConfig;
300
+ prerender: PulsePrerender;
301
+ }
302
+ declare function PulseProvider({
303
+ children,
304
+ config,
305
+ prerender
306
+ }: PulseProviderProps): react_jsx_runtime0.JSX.Element;
307
+ interface PulseViewProps {
308
+ externalComponents: ComponentRegistry;
309
+ path: string;
310
+ cssModules: Record<string, Record<string, string>>;
311
+ }
312
+ declare function PulseView({
313
+ externalComponents,
314
+ path,
315
+ cssModules
316
+ }: PulseViewProps): string | number | bigint | boolean | react_jsx_runtime0.JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react0.ReactPortal | react0.ReactElement<unknown, string | react0.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
317
+ //#endregion
318
+ //#region src/renderer.d.ts
319
+ declare function RenderLazy(component: () => Promise<{
320
+ default: ComponentType<any>;
321
+ }>, fallback?: ReactNode): FC<PropsWithChildren<unknown>>;
322
+ //#endregion
323
+ //#region src/serialize/serializer.d.ts
324
+ type Primitive = number | string | boolean | null | undefined;
325
+ type JSON<T> = T | Array<JSON<T>> | {
326
+ [K: string]: JSON<T>;
327
+ };
328
+ type PlainJSON = JSON<Primitive>;
329
+ type Serializable = any;
330
+ type Serialized = [[number[], number[], number[], number[]], PlainJSON];
331
+ declare function serialize(data: Serializable): Serialized;
332
+ interface DeserializationOptions {
333
+ coerceNullsToUndefined?: boolean;
334
+ }
335
+ declare function deserialize<Data extends Serializable = Serializable>(payload: Serialized, options?: DeserializationOptions): Data;
336
+ //#endregion
337
+ //#region src/transport.d.ts
338
+ type MessageListener = (message: ServerMessage) => void;
339
+ type ConnectionStatusListener$1 = (connected: boolean) => void;
340
+ interface Transport {
341
+ connect(listener: MessageListener): Promise<void>;
342
+ disconnect(): void;
343
+ sendMessage(payload: ClientMessage): Promise<void>;
344
+ isConnected(): boolean;
345
+ onConnectionChange(listener: ConnectionStatusListener$1): () => void;
346
+ }
347
+ //#endregion
348
+ //#region src/usePulseChannel.d.ts
349
+ declare function usePulseChannel(channelId: string): ChannelBridge;
350
+ //#endregion
351
+ export { type ChannelBridge, type ClientApiResultMessage, type ClientCallbackMessage, type ClientChannelMessage, type ClientChannelRequestMessage, type ClientChannelResponseMessage, type ClientMessage, type ClientMountMessage, type ClientNavigateMessage, type ClientUnmountMessage, type ComponentRegistry, type ConnectionStatusListener, type MessageListener, type MountedView, PulseChannelResetError, type PulseClient, type PulseConfig, PulseForm, type PulseFormProps, type PulsePrerender, PulseProvider, type PulseProviderProps, PulseView, RenderLazy, type RouteInfo, type ServerApiCallMessage, type ServerChannelMessage, type ServerChannelRequestMessage, type ServerChannelResponseMessage, type ServerErrorInfo, type ServerErrorListener, type ServerErrorMessage, type ServerInitMessage, type ServerMessage, type ServerNavigateToMessage, type ServerUpdateMessage, type Transport, type VDOM, type VDOMElement, type VDOMNode, type VDOMUpdate, deserialize, extractServerRouteInfo, serialize, submitForm, usePulseChannel, usePulseClient };
352
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,3 +1,2 @@
1
- class b extends Error{constructor(W){super(W);this.name="PulseChannelResetError"}}function N1(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID().replace(/-/g,"");return Math.random().toString(16).slice(2)+Math.random().toString(16).slice(2)}function f1(W){if(W instanceof Error)return W.message;if(typeof W==="string")return W;try{return JSON.stringify(W)}catch{return String(W)}}function B1(W){return typeof W.responseTo==="string"}function C1(W){return typeof W.event==="string"}class t{client;id;handlers=new Map;pending=new Map;backlog=[];closed=!1;constructor(W,Z){this.client=W;this.id=Z}emit(W,Z){this.ensureOpen(),this.client.sendMessage({type:"channel_message",channel:this.id,event:W,payload:Z})}request(W,Z){this.ensureOpen();let $=N1();return new Promise((J,q)=>{this.pending.set($,{resolve:J,reject:q}),this.client.sendMessage({type:"channel_message",channel:this.id,event:W,payload:Z,requestId:$})})}on(W,Z){this.ensureOpen();let $=this.handlers.get(W);if(!$)$=new Set,this.handlers.set(W,$);return $.add(Z),this.flushBacklog(W),()=>{let J=this.handlers.get(W);if(!J)return;if(J.delete(Z),J.size===0)this.handlers.delete(W)}}handleServerMessage(W){if(B1(W))return this.resolvePending(W),this.closed;if(this.closed)return!0;if(!C1(W))return this.closed;if(W.event==="__close__")return this.close(new b("Channel closed by server")),!0;if(W.requestId)this.dispatchRequest(W);else this.dispatchEvent(W);return this.closed}handleDisconnect(W){this.close(W)}dispose(W){this.close(W)}ensureOpen(){if(this.closed)throw new b("Channel is closed")}flushBacklog(W){if(this.backlog.length===0)return;let Z=[];for(let $ of this.backlog)if($.event===W)this.dispatchEvent($);else Z.push($);this.backlog=Z}dispatchEvent(W){let Z=this.handlers.get(W.event);if(!Z||Z.size===0){this.backlog.push(W);return}for(let $ of Z)try{let J=$(W.payload);if(J&&typeof J.then==="function")J.catch((q)=>{console.error("Pulse channel handler error",q)})}catch(J){console.error("Pulse channel handler error",J)}}async dispatchRequest(W){let Z=this.handlers.get(W.event),$,J;if(Z&&Z.size>0)for(let q of Z)try{let G=q(W.payload);if($=await Promise.resolve(G),$!==void 0)break}catch(G){J=G;break}if(J){this.client.sendMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,error:f1(J)});return}this.client.sendMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,payload:$})}resolvePending(W){let Z=W.responseTo?this.pending.get(W.responseTo):void 0;if(!Z)return;if(this.pending.delete(W.responseTo),W.error!==void 0&&W.error!==null)Z.reject(new b(String(W.error)));else Z.resolve(W.payload)}close(W){if(this.closed)return;this.closed=!0;for(let Z of this.pending.values())Z.reject(W);this.pending.clear(),this.handlers.clear(),this.backlog=[]}}function e(W,Z){return new t(W,Z)}import{forwardRef as K1,useCallback as H1}from"react";import{jsx as P1}from"react/jsx-runtime";var I1=K1(function({onSubmit:Z,action:$,...J},q){return P1("form",{...J,action:$,ref:q,onSubmit:H1((G)=>W1({event:G,action:$,onSubmit:Z}),[$,Z])})});async function W1({event:W,action:Z,onSubmit:$,formData:J,force:q}){if($?.(W),!q&&W.defaultPrevented)return;let G=W.currentTarget;W.preventDefault();let U=W.nativeEvent;if(!J)J=new FormData(G,U.submitter);let F=new URL(Z,window.location.href);try{await fetch(F,{method:"POST",credentials:"include",body:J})}catch(O){throw O}}function b1({params:W,request:Z}){let{"*":$="",...J}=W,q=new URL(Z.url);return{hash:q.hash,pathname:q.pathname,query:q.search,queryParams:Object.fromEntries(q.searchParams.entries()),pathParams:J,catchall:$.length>1?$.split("/"):[]}}import{createContext as j1,useContext as A1,useEffect as m,useMemo as o,useState as s}from"react";import{useLocation as Q0,useNavigate as G0,useParams as z0}from"react-router";import{io as Z0}from"socket.io-client";function Y(){function W(Z,$){return(J)=>{let q={};for(let G of Z)q[G]=J[G];if($)for(let G in $){let U=$[G];q[G]=U(J)}return q}}return W}var Y1=(W)=>W.tagName.toLowerCase(),y1=["id","className","tagName","localName","clientHeight","clientLeft","clientTop","clientWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth","slot"],w1=["autofocus","tabIndex","nonce"],L1=["accessKey","accessKeyLabel","autocapitalize","dir","draggable","hidden","inert","lang","offsetHeight","offsetLeft","offsetTop","offsetWidth","popover","spellcheck","title","translate","writingSuggestions","contentEditable","enterKeyHint","isContentEditable","inputMode"],M1=Y()(y1,{tagName:Y1}),S1=Y()(w1),k1=Y()(L1);function y(W){return{...M1(W),...S1(W),...k1(W)}}function X(W,Z){let $=Y()(W,Z);return(J)=>({...y(J),...$(J)})}var _1=["hash","host","hostname","href","origin","password","pathname","port","protocol","search","target","download","rel","hreflang","type","username","ping","referrerPolicy","text"],T1=X(_1),g1=["alt","coords","download","hash","host","hostname","href","origin","password","pathname","port","protocol","rel","search","shape","target","username","ping","referrerPolicy"],v1=X(g1),x1=["autoplay","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","loop","muted","networkState","paused","playbackRate","preload","readyState","seeking","src","volume","preservesPitch"],X1=X(x1),u1=(W)=>X1(W),m1=["disabled","name","type","value","formAction","formEnctype","formMethod","formNoValidate","formTarget","popoverTargetAction"],h1=X(m1),E1=["value"],p1=X(E1),d1=["height","src","type","width","align","name"],i1=X(d1),c1=["disabled","name","type","validationMessage","willValidate"],n1=X(c1),l1=["acceptCharset","action","autocomplete","encoding","enctype","length","method","name","noValidate","target","rel"],o1=X(l1),s1=["allow","allowFullscreen","height","name","referrerPolicy","src","srcdoc","width","align","frameBorder","longDesc","marginHeight","marginWidth","scrolling","sandbox"],r1=X(s1),a1=["alt","crossOrigin","decoding","height","isMap","loading","naturalHeight","naturalWidth","referrerPolicy","sizes","src","srcset","useMap","width","align","border","complete","hspace","longDesc","lowsrc","name","vspace","x","y","fetchPriority"],t1=X(a1),e1=["accept","alt","autocomplete","checked","defaultChecked","defaultValue","dirName","disabled","height","indeterminate","max","maxLength","min","minLength","multiple","name","pattern","placeholder","readOnly","required","selectionDirection","selectionEnd","selectionStart","size","src","step","type","value","valueAsNumber","width","align","capture","formAction","formEnctype","formMethod","formNoValidate","formTarget","useMap","validationMessage","willValidate","popoverTargetAction"],WW=X(e1),ZW=["htmlFor"],$W=X(ZW),JW=["value","type"],qW=X(JW),XW=["as","crossOrigin","disabled","fetchPriority","href","hreflang","imageSizes","imageSrcset","integrity","media","referrerPolicy","rel","type","charset","rev","target","sizes"],FW=X(XW),QW=["name"],GW=X(QW),zW=["high","low","max","min","optimum","value"],UW=X(zW),DW=["cite","dateTime"],Z1=X(DW),VW=["reversed","start","type","compact"],jW=X(VW),AW=["data","height","name","type","useMap","width","validationMessage","willValidate","align","archive","border","code","codeBase","codeType","declare","hspace","standby","vspace"],OW=X(AW),RW=["disabled","label"],NW=X(RW),fW=["defaultSelected","disabled","index","label","selected","text","value"],BW=X(fW),CW=["defaultValue","name","type","value","htmlFor","validationMessage","willValidate"],KW=X(CW),HW=["max","position","value"],IW=X(HW),PW=["cite"],$1=X(PW),bW=(W)=>y(W),YW=["async","crossOrigin","defer","fetchPriority","integrity","noModule","referrerPolicy","src","text","type","charset"],yW=Y()(YW,{event:(W)=>W.event,htmlFor:(W)=>W.htmlFor}),wW=(W)=>({...y(W),...yW(W)}),LW=["autocomplete","disabled","length","multiple","name","required","selectedIndex","size","type","value","validationMessage","willValidate"],MW=X(LW),SW=["name"],kW=X(SW),_W=["height","media","sizes","src","srcset","type","width"],TW=X(_W),gW=["align"],vW=X(gW),xW=["abbr","cellIndex","colSpan","headers","rowSpan","scope","align","axis","bgColor","ch","chOff","height","noWrap","vAlign","width"],J1=X(xW),uW=["span","align","ch","chOff","vAlign","width"],q1=X(uW),mW=["align","bgColor","border","cellPadding","cellSpacing","frame","rules","summary","width"],hW=X(mW),EW=["rowIndex","sectionRowIndex","align","bgColor","ch","chOff","vAlign"],pW=X(EW),dW=["align","ch","chOff","vAlign"],p=X(dW),iW=(W)=>y(W),cW=["autocomplete","cols","defaultValue","dirName","disabled","maxLength","minLength","name","placeholder","readOnly","required","rows","selectionDirection","selectionEnd","selectionStart","value","wrap","textLength","validationMessage","willValidate"],nW=X(cW),lW=["dateTime"],oW=X(lW),sW=["default","kind","label","readyState","src","srclang"],rW=X(sW),aW=["height","poster","videoHeight","videoWidth","width","playsInline"],tW=Y()(aW),eW=(W)=>({...X1(W),...tW(W)}),WZ=["clear"],ZZ=X(WZ),$Z=["href","target"],JZ=X($Z),qZ=["aLink","background","bgColor","link","text","vLink"],XZ=X(qZ),FZ=["compact"],QZ=X(FZ),GZ=["open"],zZ=X(GZ),UZ=["open","returnValue"],DZ=X(UZ),VZ=["align"],jZ=X(VZ),AZ=(W)=>y(W),OZ=["align"],L=X(OZ),RZ=["align","color","noShade","size","width"],NZ=X(RZ),fZ=["version"],BZ=X(fZ),CZ=(W)=>y(W),KZ=["content","httpEquiv","name","scheme"],HZ=X(KZ),IZ=["align"],PZ=X(IZ),bZ=(W)=>y(W),YZ=["width"],yZ=X(YZ),wZ=(W)=>y(W),LZ=["media","type","disabled"],MZ=X(LZ),SZ=["text"],kZ=X(SZ),_Z=["compact","type"],TZ=X(_Z),gZ={A:T1,AREA:v1,AUDIO:u1,BASE:JZ,BLOCKQUOTE:$1,Q:$1,BODY:XZ,BR:ZZ,BUTTON:h1,CANVAS:y,CAPTION:vW,CITE:bW,COL:q1,COLGROUP:q1,DATA:p1,DETAILS:zZ,DIALOG:DZ,DIV:jZ,DL:QZ,EMBED:i1,FIELDSET:n1,FORM:o1,H1:L,H2:L,H3:L,H4:L,H5:L,H6:L,HEAD:AZ,HR:NZ,HTML:BZ,IFRAME:r1,IMG:t1,INPUT:WW,LABEL:$W,LI:qW,LINK:FW,MAP:GW,MENU:CZ,META:HZ,METER:UW,INS:Z1,DEL:Z1,OBJECT:OW,OL:jW,OPTGROUP:NW,OPTION:BW,OUTPUT:KW,P:PZ,PICTURE:bZ,PRE:yZ,PROGRESS:IW,SCRIPT:wW,SELECT:MW,SLOT:kW,SOURCE:TW,SPAN:wZ,STYLE:MZ,TABLE:hW,TBODY:p,THEAD:p,TFOOT:p,TD:J1,TH:J1,TEMPLATE:iW,TEXTAREA:nW,TIME:oW,TITLE:kZ,TR:pW,TRACK:rW,UL:TZ,VIDEO:eW};function g(W){let Z=W.tagName.toUpperCase(),$=gZ[Z];if($)return $(W);throw Error(`Unexpected HTML element tag: ${W.tagName} (update .web/custom/serialize.ts)`)}var vZ=(W)=>g(W.target),k=(W)=>W.relatedTarget?g(W.relatedTarget):null;function B(W,Z){return Y()(W,{target:vZ,...Z||{}})}var P=["target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","timeStamp","type"],v=[...P,"detail"],x=[...v,"altKey","button","buttons","clientX","clientY","ctrlKey","metaKey","movementX","movementY","pageX","pageY","screenX","screenY","shiftKey"],xZ=[...x,"pointerId","pressure","tangentialPressure","tiltX","tiltY","twist","width","height","pointerType","isPrimary"],uZ=B(P),mZ=B(v),hZ=B(x,{relatedTarget:k}),EZ=B(P,{clipboardData:(W)=>F1(W.clipboardData)}),pZ=B([...P,"data"]),dZ=B(x,{relatedTarget:k,dataTransfer:(W)=>F1(W.dataTransfer)}),iZ=B(xZ,{relatedTarget:k}),cZ=B(P,{relatedTarget:k}),nZ=B(P),lZ=B(P),oZ=B(P),sZ=B([...v,"altKey","ctrlKey","code","key","locale","location","metaKey","repeat","shiftKey"]),rZ=B([...v,"altKey","ctrlKey","metaKey","shiftKey","changedTouches","targetTouches","touches"],{changedTouches:(W)=>d(W.changedTouches),targetTouches:(W)=>d(W.targetTouches),touches:(W)=>d(W.touches)}),aZ=B([...x,"deltaMode","deltaX","deltaY","deltaZ"],{relatedTarget:k}),tZ=B([...P,"animationName","elapsedTime","pseudoElement"]),eZ=B([...P,"oldState","newState"]),W0=B([...P,"elapsedTime","propertyName","pseudoElement"]);function d(W){return Array.from(W).map((Z)=>({target:g(Z.target),identifier:Z.identifier,screenX:Z.screenX,screenY:Z.screenY,clientX:Z.clientX,clientY:Z.clientY,pageX:Z.pageX,pageY:Z.pageY}))}function F1(W){if(!W)return null;let Z=[];if(W.items)for(let $=0;$<W.items.length;$++){let J=W.items[$];Z.push({kind:J.kind,type:J.type})}return{drop_effect:W.dropEffect,effect_allowed:W.effectAllowed,items:Z,types:Array.from(W.types||[])}}var C={};function H(W,Z,$){for(let J of Z)W[J]=$}H(C,["pointerdown","pointermove","pointerup","pointercancel","gotpointercapture","lostpointercapture","pointerenter","pointerleave","pointerover","pointerout"],iZ);H(C,["click","contextmenu","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],hZ);H(C,["drag","dragend","dragenter","dragexit","dragleave","dragover","dragstart","drop"],dZ);H(C,["keydown","keypress","keyup"],sZ);H(C,["focus","blur"],cZ);H(C,["change","input"],oZ);H(C,["invalid"],lZ);H(C,["reset","submit"],nZ);H(C,["copy","cut","paste"],EZ);H(C,["compositionend","compositionstart","compositionupdate"],pZ);H(C,["touchcancel","touchend","touchmove","touchstart"],rZ);H(C,["scroll"],mZ);H(C,["wheel"],aZ);H(C,["animationstart","animationend","animationiteration"],tZ);H(C,["transitionend"],W0);H(C,["toggle"],eZ);function Q1(W){if(W&&typeof W==="object"&&"nativeEvent"in W&&typeof W.isDefaultPrevented==="function"){let Z=W;if(typeof Z.type!=="string")return W;let $=C[Z.type.toLowerCase()];if($)return $(Z);return uZ(Z)}return W}function _(W){let Z=new Map,$=[],J=[],q=[],G=[],U=0;function F(z){if(z==null||typeof z==="number"||typeof z==="string"||typeof z==="boolean")return z;let f=U++,V=Z.get(z);if(V!==void 0)return $.push(f),V;if(Z.set(z,f),z instanceof Date)return J.push(f),z.getTime();if(Array.isArray(z)){let j=z.length,Q=Array(j);for(let D=0;D<j;D++)Q[D]=F(z[D]);return Q}if(z instanceof Map){G.push(f);let j={};for(let[Q,D]of z.entries())j[String(Q)]=F(D);return j}if(z instanceof Set){q.push(f);let j=z.size,Q=Array(j),D=0;for(let A of z)Q[D]=F(A),D+=1;return Q}if(typeof z==="object"){let j={},Q=Object.keys(z);for(let D=0;D<Q.length;D++){let A=Q[D];j[A]=F(z[A])}return j}throw Error(`Unsupported value in serialization: ${z}`)}let O=F(W);return[[$,J,q,G],O]}function i(W,Z){let[[$,J,q,G],U]=W,F=new Set($),O=new Set(J),z=new Set(q),f=new Set(G),V=[];function j(Q){let D=V.length;if(F.has(D))return V.push(null),V[Q];if(O.has(D)){let A=new Date(Q);return V.push(A),A}if(Q==null||typeof Q==="number"||typeof Q==="string"||typeof Q==="boolean"){if(Z?.coerceNullsToUndefined)return Q??void 0;return Q}if(Array.isArray(Q)){if(z.has(D)){let R=new Set;V.push(R);for(let K=0;K<Q.length;K++)R.add(j(Q[K]));return R}let A=Q.length,N=Array(A);V.push(N);for(let R=0;R<A;R++)N[R]=j(Q[R]);return N}if(typeof Q==="object"){if(f.has(D)){let R=new Map;V.push(R);let K=Object.keys(Q);for(let w=0;w<K.length;w++){let I=K[w];R.set(I,j(Q[I]))}return R}let A={};V.push(A);let N=Object.keys(Q);for(let R=0;R<N.length;R++){let K=N[R];A[K]=j(Q[K])}return A}throw Error(`Unsupported value in deserialization: ${Q}`)}return j(U)}class c{#W;#Z=null;#J;#X=new Set;#$=new Map;#F=new Set;#q=new Map;#U;#D;#Q;constructor(W,Z,$){this.#U=W,this.#D=Z,this.#Q=$,this.#Z=null,this.#W=new Map,this.#J=[]}isConnected(){return this.#Z?.connected??!1}async connect(){if(this.#Z)return;return new Promise((W,Z)=>{let $=Z0(this.#U,{transports:["websocket","webtransport"],auth:{renderId:this.#D}});this.#Z=$,$.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.#Z?.id);for(let[J,q]of this.#W)$.emit("message",_({type:"mount",path:J,routeInfo:q.routeInfo}));for(let J of this.#J){if(J.type==="mount"&&this.#W.has(J.path))continue;if(J.type==="navigate")continue;$.emit("message",_(J))}this.#J=[],this.notifyConnectionListeners(!0),W()}),$.on("connect_error",(J)=>{console.error("[SocketIOTransport] Connection failed:",J),this.notifyConnectionListeners(!1),Z(J)}),$.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.#A(),this.notifyConnectionListeners(!1)}),$.on("message",(J)=>this.#j(i(J,{coerceNullsToUndefined:!0})))})}onConnectionChange(W){return this.#X.add(W),W(this.isConnected()),()=>{this.#X.delete(W)}}notifyConnectionListeners(W){for(let Z of this.#X)Z(W)}onServerError(W){this.#F.add(W);for(let[Z,$]of this.#$)W(Z,$);return()=>{this.#F.delete(W)}}notifyServerError(W,Z){for(let $ of this.#F)$(W,Z)}sendMessage(W){if(this.isConnected())this.#Z.emit("message",_(W));else this.#J.push(W)}mountView(W,Z){if(this.#W.has(W))throw Error(`Path ${W} is already mounted`);this.#W.set(W,Z),this.sendMessage({type:"mount",path:W,routeInfo:Z.routeInfo})}async navigate(W,Z){await this.sendMessage({type:"navigate",path:W,routeInfo:Z})}unmount(W){this.sendMessage({type:"unmount",path:W}),this.#W.delete(W)}disconnect(){this.#Z?.disconnect(),this.#Z=null,this.#J=[],this.#X.clear(),this.#W.clear(),this.#$.clear(),this.#F.clear();for(let{bridge:W}of this.#q.values())W.dispose(new b("Client disconnected"));this.#q.clear()}#j(W){switch(W.type){case"vdom_init":{let Z=this.#W.get(W.path);if(!Z)return;if(Z)Z.onInit(W.vdom,W.callbacks,W.render_props,W.css_refs);if(this.#$.has(W.path))this.#$.delete(W.path),this.notifyServerError(W.path,null);break}case"vdom_update":{let Z=this.#W.get(W.path);if(!Z)return;if(Z.onUpdate(W.ops),this.#$.has(W.path))this.#$.delete(W.path),this.notifyServerError(W.path,null);break}case"server_error":{if(!this.#W.has(W.path))return;this.#$.set(W.path,W.error),this.notifyServerError(W.path,W.error);break}case"api_call":{this.#G(W);break}case"navigate_to":{let Z=!!W.replace,$=W.path||"";if($.startsWith("//"))$=`${window.location.protocol}${$}`;if(/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test($))if($.startsWith("http://")||$.startsWith("https://"))try{let q=new URL($);if(q.origin===window.location.origin){let G=`${q.pathname}${q.search}${q.hash}`;this.#Q(G,{replace:Z})}else if(Z)window.location.replace($);else window.location.assign($)}catch{if(Z)window.location.replace($);else window.location.assign($)}else if(Z)window.location.replace($);else window.location.assign($);else this.#Q($,{replace:Z});break}case"channel_message":{this.#V(W);break}default:console.error("Unexpected message:",W)}}async#G(W){try{let Z=await fetch(W.url,{method:W.method||"GET",headers:{...W.headers||{},...W.body!=null&&!("content-type"in(W.headers||{}))?{"content-type":"application/json"}:{}},body:W.body!=null?typeof W.body==="string"?W.body:JSON.stringify(W.body):void 0,credentials:W.credentials||"include"}),$={};Z.headers.forEach((U,F)=>{$[F]=U});let J=null;if((Z.headers.get("content-type")||"").includes("application/json"))J=await Z.json().catch(()=>null);else J=await Z.text().catch(()=>null);let G={type:"api_result",id:W.id,ok:Z.ok,status:Z.status,headers:$,body:J};this.sendMessage(G)}catch(Z){let $={type:"api_result",id:W.id,ok:!1,status:0,headers:{},body:{error:String(Z)}};this.sendMessage($)}}invokeCallback(W,Z,$){this.sendMessage({type:"callback",path:W,callback:Z,args:$.map(Q1)})}acquireChannel(W){let Z=this.#z(W);return Z.refCount+=1,Z.bridge}releaseChannel(W){let Z=this.#q.get(W);if(!Z)return;if(Z.refCount=Math.max(0,Z.refCount-1),Z.refCount===0)Z.bridge.dispose(new b("Channel released")),this.#q.delete(W)}#z(W){let Z=this.#q.get(W);if(!Z)Z={bridge:e(this,W),refCount:0},this.#q.set(W,Z);return Z}#V(W){let Z=this.#z(W.channel);if(Z.bridge.handleServerMessage(W)&&Z.refCount===0)this.#q.delete(W.channel)}#A(){for(let W of this.#q.values())W.bridge.handleDisconnect(new b("Connection lost"))}}import{cloneElement as T,createElement as n,Fragment as $0,isValidElement as J0,lazy as q0,Suspense as X0}from"react";var G1="$$fragment",z1="$$";function U1(W){return typeof W==="object"&&W!==null}function D1(W){return typeof W==="object"&&W!==null&&W.tag.startsWith("$$")&&W.tag!=="$$fragment"}import{jsx as V1}from"react/jsx-runtime";class l{#W;#Z;#J;#X;#$;#F;#q;#U;#D;constructor(W,Z,$,J,q=[],G=[],U=[]){this.#F=W,this.#q=Z,this.#U=$,this.#D=J,this.#W=new Set(q),this.#Z=new Map,this.#J=new Set(G),this.#X=new Set(U),this.#$=[...this.#W].sort()}hasCallbackPath(W){return this.#W.has(W)}hasRenderPropPath(W){return this.#J.has(W)}hasAnyCallbackUnder(W){if(W==="")return this.#$.length>0;let Z=this.#A(this.#$,W);return Z<this.#$.length&&this.#$[Z].startsWith(W)}applyCallbackDelta(W){if(W.remove)for(let Z of W.remove)this.#W.delete(Z),this.#Z.delete(Z);if(W.add)for(let Z of W.add)this.#W.add(Z);this.#$=[...this.#W].sort()}applyRenderPropsDelta(W){if(W.remove)for(let Z of W.remove)this.#J.delete(Z);if(W.add)for(let Z of W.add)this.#J.add(Z)}applyCssRefsDelta(W){if(W.remove)for(let Z of W.remove)this.#X.delete(Z);if(W.add)for(let Z of W.add)this.#X.add(Z)}getCallback(W,Z){let $=this.#Q(W,Z),J=this.#Z.get($);if(!J)J=(...q)=>this.#F.invokeCallback(this.#q,$,q),this.#Z.set($,J);return J}renderNode(W,Z=""){if(W==null||typeof W==="boolean"||typeof W==="number"||typeof W==="string")return W;if(U1(W)){let{tag:$,props:J={},children:q=[]}=W,G={};for(let[F,O]of Object.entries(J))G[F]=this.transformValue(Z,F,O);if(W.key)G.key=W.key;let U=[];for(let F=0;F<q.length;F+=1){let O=q[F],z=Z?`${Z}.${F}`:String(F);U.push(this.renderNode(O,z))}if(D1(W)){let F=W.tag.slice(z1.length),O=this.#U[F];if(!O)throw Error(`Could not find component ${F}. This is a Pulse internal error.`);return n(O,G,...U)}return n($===G1?$0:$,G,...U)}return null}#Q(W,Z){return W?`${W}.${Z}`:Z}transformValue(W,Z,$){let J=this.#Q(W,Z);if(this.#W.has(J))return this.getCallback(W,Z);if(this.#J.has(J))return this.renderNode($,J);if(this.#X.has(J))return this.#j($);return $}#j(W){let Z=W.indexOf(":");if(Z===-1)return W;let $=W.slice(0,Z),J=W.slice(Z+1);if(!$||!J)return W;let q=this.#D[$];if(!q)throw Error(`Received CSS reference for unknown module '${$}'`);let G=q[J];if(typeof G!=="string")throw Error(`Received CSS reference for missing class '${J}' in module '${$}'`);return G}init(W,Z,$,J){this.#W=new Set(Z);for(let q of Array.from(this.#Z.keys()))if(!this.#W.has(q))this.#Z.delete(q);return this.#$=[...this.#W].sort(),this.#J=new Set($),this.#X=new Set(J),this.renderNode(W)}#G(W){let Z=W.props?.children;if(Z==null)return[];return Array.isArray(Z)?Z.slice():[Z]}applyUpdates(W,Z){let $=W;for(let J of Z){if(J.type==="update_callbacks"){this.applyCallbackDelta(J.data);continue}if(J.type==="update_css_refs"){this.applyCssRefsDelta(J.data);continue}if(J.type==="update_render_props"){this.applyRenderPropsDelta(J.data);continue}let q=J.path.split(".").filter((U)=>U.length>0),G=(U,F,O)=>{if(F<q.length){this.#z(U,q,F);let z=U,f=q[F],V=+f,j=O?`${O}.${f}`:f;if(!Number.isNaN(V)){let Q=this.#G(z),D=Q[V];return Q[V]=G(D,F+1,j),T(z,void 0,...Q)}else{let Q=z.props??{},D=Q[f],A={...Q,[f]:G(D,F+1,j)};return T(z,A)}}switch(J.type){case"replace":return this.renderNode(J.data,J.path);case"update_props":{this.#z(U,q,F);let z=U,V={...z.props??{}},j=J.data;if(j.remove&&j.remove.length>0){for(let D of j.remove)if(D in V)delete V[D]}if(j.set)for(let[D,A]of Object.entries(j.set))V[D]=this.transformValue(O,D,A);if((j.remove?.length??0)>0)return V.key=z.key,V.ref=z.ref,n(z.type,V,...this.#G(z));else return T(z,V)}case"reconciliation":{this.#z(U,q,F);let z=U,f=this.#G(z),V=[],[j,Q]=J.new,[D,A]=J.reuse,N=-1,R=-1,K=-1,w=-1;if(j.length>0)N=j[0],K=0;if(D.length>0)R=D[0],w=0;for(let I=0;I<J.N;++I)if(I===N){let E=Q[K],S=O?`${O}.${I}`:String(I);V.push(this.renderNode(E,S)),N=K<j.length-1?j[++K]:-1}else if(I===R){let E=A[w],S=f[E],a=O?`${O}.${I}`:String(I);if(this.hasAnyCallbackUnder(a))S=this.#V(S,a);V.push(S),R=w<D.length-1?D[++w]:-1}else V.push(f[I]);return T(z,null,...V)}default:throw Error(`[Pulse renderer] Unknown update type: ${J?.type}`)}};$=G($,0,"")}return $}#z(W,Z,$){return!0}#V(W,Z){if(!J0(W))return W;let $=W,J=$.props??{},q={...J};for(let U of Object.keys(J)){let F=Z?`${Z}.${U}`:U;if(this.hasCallbackPath(F))q[U]=this.getCallback(Z,U);if(this.hasRenderPropPath(F)&&this.hasAnyCallbackUnder(F))q[U]=this.#V(J[U],F)}let G=this.#G($).map((U,F)=>{let O=Z?`${Z}.${F}`:String(F);if(this.hasAnyCallbackUnder(O))return this.#V(U,O);else return U});return T($,q,...G)}#A(W,Z){let $=0,J=W.length;while($<J){let q=$+J>>>1;if(W[q]<Z)$=q+1;else J=q}return $}}function F0(W,Z){let $=q0(W);return({children:J,...q})=>{return V1(X0,{fallback:Z,children:V1($,{...q,children:J})})}}import{jsx as M,jsxs as u}from"react/jsx-runtime";var O1=j1(null),R1=j1(null),h=()=>{let W=A1(O1);if(!W)throw Error("usePulseClient must be used within a PulseProvider");return W},U0=(W)=>{let Z=A1(R1);if(!Z)throw Error("usePulsePrerender must be used within a PulseProvider");let $=Z.views[W];if(!$)throw Error(`No prerender found for '${W}'`);return $},r=typeof window<"u";function D0({children:W,config:Z,prerender:$}){let[J,q]=s(!0),G=G0(),{renderId:U}=$,F=o(()=>new c(Z.serverAddress,U,G),[Z.serverAddress,G,U]);return m(()=>F.onConnectionChange(q),[F]),m(()=>{if(r)return F.connect(),()=>F.disconnect()},[F]),M(O1.Provider,{value:F,children:u(R1.Provider,{value:$,children:[!J&&M("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."}),W]})})}function V0({externalComponents:W,path:Z,cssModules:$}){let J=h(),q=U0(Z),G=q.vdom,U=o(()=>new l(J,Z,W,$,q.callbacks,q.render_props,q.css_refs),[J,Z,W,$,q]),[F,O]=s(()=>U.init(G,q.callbacks,q.render_props,q.css_refs)),[z,f]=s(null),V=Q0(),j=z0(),Q=o(()=>{let{"*":D="",...A}=j,N=new URLSearchParams(V.search);return{hash:V.hash,pathname:V.pathname,query:V.search,queryParams:Object.fromEntries(N.entries()),pathParams:A,catchall:D.length>0?D.split("/"):[]}},[V.hash,V.pathname,V.search,JSON.stringify(j)]);if(m(()=>{if(r){J.mountView(Z,{routeInfo:Q,onInit:(A,N,R,K)=>{O(U.init(A,N,R,K))},onUpdate:(A)=>{O((N)=>N==null?N:U.applyUpdates(N,A))}});let D=J.onServerError((A,N)=>{if(A===Z)f(N)});return()=>{D(),J.unmount(Z)}}},[J,U,Z,Q]),m(()=>{if(r)J.navigate(Z,Q)},[J,Z,Q]),z)return M(j0,{error:z});return F}function j0({error:W}){return u("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:[u("div",{style:{fontWeight:700,marginBottom:8},children:["Server Error during ",W.phase]}),W.message&&M("div",{children:W.message}),W.stack&&u("details",{open:!0,style:{marginTop:8},children:[M("summary",{children:"Stack trace"}),M("pre",{style:{margin:0},children:W.stack})]})]})}import{useEffect as A0,useMemo as O0}from"react";function R0(W){let Z=h(),$=O0(()=>{if(!W)throw Error("usePulseChannel requires a non-empty channelId");return Z.acquireChannel(W)},[Z,W]);return A0(()=>{return()=>{Z.releaseChannel(W)}},[Z,W]),$}export{h as usePulseClient,R0 as usePulseChannel,W1 as submitForm,_ as serialize,b1 as extractServerRouteInfo,i as deserialize,F0 as RenderLazy,V0 as PulseView,D0 as PulseProvider,I1 as PulseForm,b as PulseChannelResetError};
2
-
3
- //# debugId=7B651FB8E7CF7FED64756E2164756E21
1
+ import e,{Fragment as t,Suspense as n,cloneElement as r,createContext as i,createElement as a,forwardRef as o,isValidElement as s,lazy as c,useCallback as l,useContext as u,useEffect as d,useMemo as f,useState as p}from"react";import{jsx as m,jsxs as h}from"react/jsx-runtime";import{useLocation as g,useNavigate as _,useParams as ee}from"react-router";import{io as v}from"socket.io-client";var y=class extends Error{constructor(e){super(e),this.name=`PulseChannelResetError`}};function te(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID().replace(/-/g,``):Math.random().toString(16).slice(2)+Math.random().toString(16).slice(2)}function ne(e){if(e instanceof Error)return e.message;if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}function re(e){return typeof e.responseTo==`string`}function ie(e){return typeof e.event==`string`}var ae=class{handlers=new Map;pending=new Map;backlog=[];closed=!1;constructor(e,t){this.client=e,this.id=t}emit(e,t){this.ensureOpen(),this.client.sendMessage({type:`channel_message`,channel:this.id,event:e,payload:t})}request(e,t){this.ensureOpen();let n=te();return new Promise((r,i)=>{this.pending.set(n,{resolve:r,reject:i}),this.client.sendMessage({type:`channel_message`,channel:this.id,event:e,payload:t,requestId:n})})}on(e,t){this.ensureOpen();let n=this.handlers.get(e);return n||(n=new Set,this.handlers.set(e,n)),n.add(t),this.flushBacklog(e),()=>{let n=this.handlers.get(e);n&&(n.delete(t),n.size===0&&this.handlers.delete(e))}}handleServerMessage(e){return re(e)?(this.resolvePending(e),this.closed):this.closed?!0:ie(e)?e.event===`__close__`?(this.close(new y(`Channel closed by server`)),!0):(e.requestId?this.dispatchRequest(e):this.dispatchEvent(e),this.closed):this.closed}handleDisconnect(e){this.close(e)}dispose(e){this.close(e)}ensureOpen(){if(this.closed)throw new y(`Channel is closed`)}flushBacklog(e){if(this.backlog.length===0)return;let t=[];for(let n of this.backlog)n.event===e?this.dispatchEvent(n):t.push(n);this.backlog=t}dispatchEvent(e){let t=this.handlers.get(e.event);if(!t||t.size===0){this.backlog.push(e);return}for(let n of t)try{let t=n(e.payload);t&&typeof t.then==`function`&&t.catch(e=>{console.error(`Pulse channel handler error`,e)})}catch(e){console.error(`Pulse channel handler error`,e)}}async dispatchRequest(e){let t=this.handlers.get(e.event),n,r;if(t&&t.size>0)for(let i of t)try{let t=i(e.payload);if(n=await Promise.resolve(t),n!==void 0)break}catch(e){r=e;break}if(r){this.client.sendMessage({type:`channel_message`,channel:this.id,event:void 0,responseTo:e.requestId,error:ne(r)});return}this.client.sendMessage({type:`channel_message`,channel:this.id,event:void 0,responseTo:e.requestId,payload:n})}resolvePending(e){let t=e.responseTo?this.pending.get(e.responseTo):void 0;t&&(this.pending.delete(e.responseTo),e.error!==void 0&&e.error!==null?t.reject(new y(String(e.error))):t.resolve(e.payload))}close(e){if(!this.closed){this.closed=!0;for(let t of this.pending.values())t.reject(e);this.pending.clear(),this.handlers.clear(),this.backlog=[]}}};function oe(e,t){return new ae(e,t)}const se=o(function({onSubmit:e,action:t,...n},r){return m(`form`,{...n,action:t,ref:r,onSubmit:l(n=>b({event:n,action:t,onSubmit:e}),[t,e])})});async function b({event:e,action:t,onSubmit:n,formData:r,force:i}){if(n?.(e),!i&&e.defaultPrevented)return;let a=e.currentTarget;e.preventDefault();let o=e.nativeEvent;r||=new FormData(a,o.submitter);let s=new URL(t,window.location.href);try{await fetch(s,{method:`POST`,credentials:`include`,body:r})}catch(e){if(process.env.NODE_ENV!==`production`)console.error(`[Pulse] Form submission failed`,e);else throw e}}function ce({params:e,request:t}){let{"*":n=``,...r}=e,i=new URL(t.url);return{hash:i.hash,pathname:i.pathname,query:i.search,queryParams:Object.fromEntries(i.searchParams.entries()),pathParams:r,catchall:n.length>1?n.split(`/`):[]}}function x(){function e(e,t){return n=>{let r={};for(let t of e)r[t]=n[t];if(t)for(let e in t){let i=t[e];r[e]=i(n)}return r}}return e}const le=e=>e.tagName.toLowerCase(),ue=[`id`,`className`,`tagName`,`localName`,`clientHeight`,`clientLeft`,`clientTop`,`clientWidth`,`scrollHeight`,`scrollLeft`,`scrollTop`,`scrollWidth`,`slot`],de=[`autofocus`,`tabIndex`,`nonce`],fe=[`accessKey`,`accessKeyLabel`,`autocapitalize`,`dir`,`draggable`,`hidden`,`inert`,`lang`,`offsetHeight`,`offsetLeft`,`offsetTop`,`offsetWidth`,`popover`,`spellcheck`,`title`,`translate`,`writingSuggestions`,`contentEditable`,`enterKeyHint`,`isContentEditable`,`inputMode`],pe=x()(ue,{tagName:le}),me=x()(de),he=x()(fe);function S(e){return{...pe(e),...me(e),...he(e)}}function C(e,t){let n=x()(e,t);return e=>({...S(e),...n(e)})}const ge=C([`hash`,`host`,`hostname`,`href`,`origin`,`password`,`pathname`,`port`,`protocol`,`search`,`target`,`download`,`rel`,`hreflang`,`type`,`username`,`ping`,`referrerPolicy`,`text`]),_e=C([`alt`,`coords`,`download`,`hash`,`host`,`hostname`,`href`,`origin`,`password`,`pathname`,`port`,`protocol`,`rel`,`search`,`shape`,`target`,`username`,`ping`,`referrerPolicy`]),w=C([`autoplay`,`controls`,`crossOrigin`,`currentSrc`,`currentTime`,`defaultMuted`,`defaultPlaybackRate`,`duration`,`ended`,`loop`,`muted`,`networkState`,`paused`,`playbackRate`,`preload`,`readyState`,`seeking`,`src`,`volume`,`preservesPitch`]),ve=e=>w(e),ye=C([`disabled`,`name`,`type`,`value`,`formAction`,`formEnctype`,`formMethod`,`formNoValidate`,`formTarget`,`popoverTargetAction`]),be=C([`value`]),xe=C([`height`,`src`,`type`,`width`,`align`,`name`]),Se=C([`disabled`,`name`,`type`,`validationMessage`,`willValidate`]),Ce=C([`acceptCharset`,`action`,`autocomplete`,`encoding`,`enctype`,`length`,`method`,`name`,`noValidate`,`target`,`rel`]),we=C([`allow`,`allowFullscreen`,`height`,`name`,`referrerPolicy`,`src`,`srcdoc`,`width`,`align`,`frameBorder`,`longDesc`,`marginHeight`,`marginWidth`,`scrolling`,`sandbox`]),T=C([`alt`,`crossOrigin`,`decoding`,`height`,`isMap`,`loading`,`naturalHeight`,`naturalWidth`,`referrerPolicy`,`sizes`,`src`,`srcset`,`useMap`,`width`,`align`,`border`,`complete`,`hspace`,`longDesc`,`lowsrc`,`name`,`vspace`,`x`,`y`,`fetchPriority`]),E=C(`accept.alt.autocomplete.checked.defaultChecked.defaultValue.dirName.disabled.height.indeterminate.max.maxLength.min.minLength.multiple.name.pattern.placeholder.readOnly.required.selectionDirection.selectionEnd.selectionStart.size.src.step.type.value.valueAsNumber.width.align.capture.formAction.formEnctype.formMethod.formNoValidate.formTarget.useMap.validationMessage.willValidate.popoverTargetAction`.split(`.`)),D=C([`htmlFor`]),O=C([`value`,`type`]),k=C([`as`,`crossOrigin`,`disabled`,`fetchPriority`,`href`,`hreflang`,`imageSizes`,`imageSrcset`,`integrity`,`media`,`referrerPolicy`,`rel`,`type`,`charset`,`rev`,`target`,`sizes`]),Te=C([`name`]),Ee=C([`high`,`low`,`max`,`min`,`optimum`,`value`]),A=C([`cite`,`dateTime`]),De=C([`reversed`,`start`,`type`,`compact`]),Oe=C([`data`,`height`,`name`,`type`,`useMap`,`width`,`validationMessage`,`willValidate`,`align`,`archive`,`border`,`code`,`codeBase`,`codeType`,`declare`,`hspace`,`standby`,`vspace`]),ke=C([`disabled`,`label`]),Ae=C([`defaultSelected`,`disabled`,`index`,`label`,`selected`,`text`,`value`]),je=C([`defaultValue`,`name`,`type`,`value`,`htmlFor`,`validationMessage`,`willValidate`]),Me=C([`max`,`position`,`value`]),j=C([`cite`]),Ne=e=>S(e),Pe=x()([`async`,`crossOrigin`,`defer`,`fetchPriority`,`integrity`,`noModule`,`referrerPolicy`,`src`,`text`,`type`,`charset`],{event:e=>e.event,htmlFor:e=>e.htmlFor}),Fe=e=>({...S(e),...Pe(e)}),Ie=C([`autocomplete`,`disabled`,`length`,`multiple`,`name`,`required`,`selectedIndex`,`size`,`type`,`value`,`validationMessage`,`willValidate`]),Le=C([`name`]),Re=C([`height`,`media`,`sizes`,`src`,`srcset`,`type`,`width`]),ze=C([`align`]),M=C([`abbr`,`cellIndex`,`colSpan`,`headers`,`rowSpan`,`scope`,`align`,`axis`,`bgColor`,`ch`,`chOff`,`height`,`noWrap`,`vAlign`,`width`]),N=C([`span`,`align`,`ch`,`chOff`,`vAlign`,`width`]),Be=C([`align`,`bgColor`,`border`,`cellPadding`,`cellSpacing`,`frame`,`rules`,`summary`,`width`]),Ve=C([`rowIndex`,`sectionRowIndex`,`align`,`bgColor`,`ch`,`chOff`,`vAlign`]),P=C([`align`,`ch`,`chOff`,`vAlign`]),He=e=>S(e),Ue=C([`autocomplete`,`cols`,`defaultValue`,`dirName`,`disabled`,`maxLength`,`minLength`,`name`,`placeholder`,`readOnly`,`required`,`rows`,`selectionDirection`,`selectionEnd`,`selectionStart`,`value`,`wrap`,`textLength`,`validationMessage`,`willValidate`]),We=C([`dateTime`]),Ge=C([`default`,`kind`,`label`,`readyState`,`src`,`srclang`]),Ke=x()([`height`,`poster`,`videoHeight`,`videoWidth`,`width`,`playsInline`]),qe=e=>({...w(e),...Ke(e)}),Je=C([`clear`]),Ye=C([`href`,`target`]),Xe=C([`aLink`,`background`,`bgColor`,`link`,`text`,`vLink`]),Ze=C([`compact`]),Qe=C([`open`]),$e=C([`open`,`returnValue`]),et=C([`align`]),F=e=>S(e),I=C([`align`]),tt={A:ge,AREA:_e,AUDIO:ve,BASE:Ye,BLOCKQUOTE:j,Q:j,BODY:Xe,BR:Je,BUTTON:ye,CANVAS:S,CAPTION:ze,CITE:Ne,COL:N,COLGROUP:N,DATA:be,DETAILS:Qe,DIALOG:$e,DIV:et,DL:Ze,EMBED:xe,FIELDSET:Se,FORM:Ce,H1:I,H2:I,H3:I,H4:I,H5:I,H6:I,HEAD:F,HR:C([`align`,`color`,`noShade`,`size`,`width`]),HTML:C([`version`]),IFRAME:we,IMG:T,INPUT:E,LABEL:D,LI:O,LINK:k,MAP:Te,MENU:e=>S(e),META:C([`content`,`httpEquiv`,`name`,`scheme`]),METER:Ee,INS:A,DEL:A,OBJECT:Oe,OL:De,OPTGROUP:ke,OPTION:Ae,OUTPUT:je,P:C([`align`]),PICTURE:e=>S(e),PRE:C([`width`]),PROGRESS:Me,SCRIPT:Fe,SELECT:Ie,SLOT:Le,SOURCE:Re,SPAN:e=>S(e),STYLE:C([`media`,`type`,`disabled`]),TABLE:Be,TBODY:P,THEAD:P,TFOOT:P,TD:M,TH:M,TEMPLATE:He,TEXTAREA:Ue,TIME:We,TITLE:C([`text`]),TR:Ve,TRACK:Ge,UL:C([`compact`,`type`]),VIDEO:qe};function L(e){let t=tt[e.tagName.toUpperCase()];if(t)return t(e);throw Error(`Unexpected HTML element tag: ${e.tagName} (update .web/custom/serialize.ts)`)}const nt=e=>L(e.target),R=e=>e.relatedTarget?L(e.relatedTarget):null;function z(e,t){return x()(e,{target:nt,...t||{}})}const B=[`target`,`bubbles`,`cancelable`,`defaultPrevented`,`eventPhase`,`isTrusted`,`timeStamp`,`type`],V=[...B,`detail`],H=[...V,`altKey`,`button`,`buttons`,`clientX`,`clientY`,`ctrlKey`,`metaKey`,`movementX`,`movementY`,`pageX`,`pageY`,`screenX`,`screenY`,`shiftKey`],rt=[...H,`pointerId`,`pressure`,`tangentialPressure`,`tiltX`,`tiltY`,`twist`,`width`,`height`,`pointerType`,`isPrimary`],it=z(B),at=z(V),ot=z(H,{relatedTarget:R}),st=z(B,{clipboardData:e=>W(e.clipboardData)}),ct=z([...B,`data`]),lt=z(H,{relatedTarget:R,dataTransfer:e=>W(e.dataTransfer)}),ut=z(rt,{relatedTarget:R}),dt=z(B,{relatedTarget:R}),ft=z(B),pt=z(B),mt=z(B),ht=z([...V,`altKey`,`ctrlKey`,`code`,`key`,`locale`,`location`,`metaKey`,`repeat`,`shiftKey`]),gt=z([...V,`altKey`,`ctrlKey`,`metaKey`,`shiftKey`,`changedTouches`,`targetTouches`,`touches`],{changedTouches:e=>U(e.changedTouches),targetTouches:e=>U(e.targetTouches),touches:e=>U(e.touches)}),_t=z([...H,`deltaMode`,`deltaX`,`deltaY`,`deltaZ`],{relatedTarget:R}),vt=z([...B,`animationName`,`elapsedTime`,`pseudoElement`]),yt=z([...B,`oldState`,`newState`]),bt=z([...B,`elapsedTime`,`propertyName`,`pseudoElement`]);function U(e){return Array.from(e).map(e=>({target:L(e.target),identifier:e.identifier,screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY,pageX:e.pageX,pageY:e.pageY}))}function W(e){if(!e)return null;let t=[];if(e.items)for(let n=0;n<e.items.length;n++){let r=e.items[n];t.push({kind:r.kind,type:r.type})}return{drop_effect:e.dropEffect,effect_allowed:e.effectAllowed,items:t,types:Array.from(e.types||[])}}const G={};function K(e,t,n){for(let r of t)e[r]=n}K(G,[`pointerdown`,`pointermove`,`pointerup`,`pointercancel`,`gotpointercapture`,`lostpointercapture`,`pointerenter`,`pointerleave`,`pointerover`,`pointerout`],ut),K(G,[`click`,`contextmenu`,`dblclick`,`mousedown`,`mouseenter`,`mouseleave`,`mousemove`,`mouseout`,`mouseover`,`mouseup`],ot),K(G,[`drag`,`dragend`,`dragenter`,`dragexit`,`dragleave`,`dragover`,`dragstart`,`drop`],lt),K(G,[`keydown`,`keypress`,`keyup`],ht),K(G,[`focus`,`blur`],dt),K(G,[`change`,`input`],mt),K(G,[`invalid`],pt),K(G,[`reset`,`submit`],ft),K(G,[`copy`,`cut`,`paste`],st),K(G,[`compositionend`,`compositionstart`,`compositionupdate`],ct),K(G,[`touchcancel`,`touchend`,`touchmove`,`touchstart`],gt),K(G,[`scroll`],at),K(G,[`wheel`],_t),K(G,[`animationstart`,`animationend`,`animationiteration`],vt),K(G,[`transitionend`],bt),K(G,[`toggle`],yt);function xt(e){if(e&&typeof e==`object`&&`nativeEvent`in e&&typeof e.isDefaultPrevented==`function`){let t=e;if(typeof t.type!=`string`)return e;let n=G[t.type.toLowerCase()];return n?n(t):it(t)}return e}function q(e){let t=new Map,n=[],r=[],i=[],a=[],o=0;function s(e){if(e==null||typeof e==`number`||typeof e==`string`||typeof e==`boolean`)return e;let c=o++,l=t.get(e);if(l!==void 0)return n.push(c),l;if(t.set(e,c),e instanceof Date)return r.push(c),e.getTime();if(Array.isArray(e)){let t=e.length,n=Array(t);for(let r=0;r<t;r++)n[r]=s(e[r]);return n}if(e instanceof Map){a.push(c);let t={};for(let[n,r]of e.entries())t[String(n)]=s(r);return t}if(e instanceof Set){i.push(c);let t=e.size,n=Array(t),r=0;for(let t of e)n[r]=s(t),r+=1;return n}if(typeof e==`object`){let t={},n=Object.keys(e);for(let r=0;r<n.length;r++){let i=n[r];t[i]=s(e[i])}return t}throw Error(`Unsupported value in serialization: ${e}`)}let c=s(e);return[[n,r,i,a],c]}function J(e,t){let[[n,r,i,a],o]=e,s=new Set(n),c=new Set(r),l=new Set(i),u=new Set(a),d=[];function f(e){let n=d.length;if(s.has(n))return d.push(null),d[e];if(c.has(n)){let t=new Date(e);return d.push(t),t}if(e==null||typeof e==`number`||typeof e==`string`||typeof e==`boolean`)return t?.coerceNullsToUndefined?e??void 0:e;if(Array.isArray(e)){if(l.has(n)){let t=new Set;d.push(t);for(let n=0;n<e.length;n++)t.add(f(e[n]));return t}let t=e.length,r=Array(t);d.push(r);for(let n=0;n<t;n++)r[n]=f(e[n]);return r}if(typeof e==`object`){if(u.has(n)){let t=new Map;d.push(t);let n=Object.keys(e);for(let r=0;r<n.length;r++){let i=n[r];t.set(i,f(e[i]))}return t}let t={};d.push(t);let r=Object.keys(e);for(let n=0;n<r.length;n++){let i=r[n];t[i]=f(e[i])}return t}throw Error(`Unsupported value in deserialization: ${e}`)}return f(o)}var St=class{#activeViews;#socket=null;#messageQueue;#connectionListeners=new Set;#serverErrors=new Map;#serverErrorListeners=new Set;#channels=new Map;#url;#renderId;#frameworkNavigate;constructor(e,t,n){this.#url=e,this.#renderId=t,this.#frameworkNavigate=n,this.#socket=null,this.#activeViews=new Map,this.#messageQueue=[]}isConnected(){return this.#socket?.connected??!1}async connect(){if(!this.#socket)return new Promise((e,t)=>{let n=v(this.#url,{transports:[`websocket`,`webtransport`],auth:{renderId:this.#renderId}});this.#socket=n,n.on(`connect`,()=>{console.log(`[SocketIOTransport] Connected:`,this.#socket?.id);for(let[e,t]of this.#activeViews)n.emit(`message`,q({type:`mount`,path:e,routeInfo:t.routeInfo}));for(let e of this.#messageQueue)e.type===`mount`&&this.#activeViews.has(e.path)||e.type!==`navigate`&&n.emit(`message`,q(e));this.#messageQueue=[],this.notifyConnectionListeners(!0),e()}),n.on(`connect_error`,e=>{console.error(`[SocketIOTransport] Connection failed:`,e),this.notifyConnectionListeners(!1),t(e)}),n.on(`disconnect`,()=>{console.log(`[SocketIOTransport] Disconnected`),this.#handleTransportDisconnect(),this.notifyConnectionListeners(!1)}),n.on(`message`,e=>this.#handleServerMessage(J(e,{coerceNullsToUndefined:!0})))})}onConnectionChange(e){return this.#connectionListeners.add(e),e(this.isConnected()),()=>{this.#connectionListeners.delete(e)}}notifyConnectionListeners(e){for(let t of this.#connectionListeners)t(e)}onServerError(e){this.#serverErrorListeners.add(e);for(let[t,n]of this.#serverErrors)e(t,n);return()=>{this.#serverErrorListeners.delete(e)}}notifyServerError(e,t){for(let n of this.#serverErrorListeners)n(e,t)}sendMessage(e){this.isConnected()?this.#socket.emit(`message`,q(e)):this.#messageQueue.push(e)}mountView(e,t){if(this.#activeViews.has(e))throw Error(`Path ${e} is already mounted`);this.#activeViews.set(e,t),this.sendMessage({type:`mount`,path:e,routeInfo:t.routeInfo})}async navigate(e,t){await this.sendMessage({type:`navigate`,path:e,routeInfo:t})}unmount(e){this.sendMessage({type:`unmount`,path:e}),this.#activeViews.delete(e)}disconnect(){this.#socket?.disconnect(),this.#socket=null,this.#messageQueue=[],this.#connectionListeners.clear(),this.#activeViews.clear(),this.#serverErrors.clear(),this.#serverErrorListeners.clear();for(let{bridge:e}of this.#channels.values())e.dispose(new y(`Client disconnected`));this.#channels.clear()}#handleServerMessage(e){switch(e.type){case`vdom_init`:{let t=this.#activeViews.get(e.path);if(!t)return;t&&t.onInit(e.vdom,e.callbacks,e.render_props,e.css_refs),this.#serverErrors.has(e.path)&&(this.#serverErrors.delete(e.path),this.notifyServerError(e.path,null));break}case`vdom_update`:{let t=this.#activeViews.get(e.path);if(!t)return;t.onUpdate(e.ops),this.#serverErrors.has(e.path)&&(this.#serverErrors.delete(e.path),this.notifyServerError(e.path,null));break}case`server_error`:if(!this.#activeViews.has(e.path))return;this.#serverErrors.set(e.path,e.error),this.notifyServerError(e.path,e.error);break;case`api_call`:this.#performApiCall(e);break;case`navigate_to`:{let t=!!e.replace,n=e.path||``;if(n.startsWith(`//`)&&(n=`${window.location.protocol}${n}`),/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(n))if(n.startsWith(`http://`)||n.startsWith(`https://`))try{let e=new URL(n);if(e.origin===window.location.origin){let n=`${e.pathname}${e.search}${e.hash}`;this.#frameworkNavigate(n,{replace:t})}else t?window.location.replace(n):window.location.assign(n)}catch{t?window.location.replace(n):window.location.assign(n)}else t?window.location.replace(n):window.location.assign(n);else this.#frameworkNavigate(n,{replace:t});break}case`channel_message`:this.#routeChannelMessage(e);break;default:console.error(`Unexpected message:`,e)}}async#performApiCall(e){try{let t=await fetch(e.url,{method:e.method||`GET`,headers:{...e.headers||{},...e.body!=null&&!(`content-type`in(e.headers||{}))?{"content-type":`application/json`}:{}},body:e.body==null?void 0:typeof e.body==`string`?e.body:JSON.stringify(e.body),credentials:e.credentials||`include`}),n={};t.headers.forEach((e,t)=>{n[t]=e});let r=null;r=(t.headers.get(`content-type`)||``).includes(`application/json`)?await t.json().catch(()=>null):await t.text().catch(()=>null);let i={type:`api_result`,id:e.id,ok:t.ok,status:t.status,headers:n,body:r};this.sendMessage(i)}catch(t){let n={type:`api_result`,id:e.id,ok:!1,status:0,headers:{},body:{error:String(t)}};this.sendMessage(n)}}invokeCallback(e,t,n){this.sendMessage({type:`callback`,path:e,callback:t,args:n.map(xt)})}acquireChannel(e){let t=this.#ensureChannelEntry(e);return t.refCount+=1,t.bridge}releaseChannel(e){let t=this.#channels.get(e);t&&(t.refCount=Math.max(0,t.refCount-1),t.refCount===0&&(t.bridge.dispose(new y(`Channel released`)),this.sendMessage({type:`channel_message`,channel:e,event:`__close__`,payload:{reason:`refcount_zero`}}),this.#channels.delete(e)))}#ensureChannelEntry(e){let t=this.#channels.get(e);return t||(t={bridge:oe(this,e),refCount:0},this.#channels.set(e,t)),t}#routeChannelMessage(e){let t=this.#ensureChannelEntry(e.channel);t.bridge.handleServerMessage(e)&&t.refCount===0&&this.#channels.delete(e.channel)}#handleTransportDisconnect(){for(let e of this.#channels.values())e.bridge.handleDisconnect(new y(`Connection lost`))}};const Y=`$$fragment`;function Ct(e){return typeof e==`object`&&!!e}function wt(e){return typeof e==`object`&&!!e&&e.tag.startsWith(`$$`)&&e.tag!==Y}var Tt=class{#callbacks;#callbackCache;#renderPropKeys;#cssProps;#callbackList;#client;#path;#components;#cssModules;constructor(e,t,n,r,i=[],a=[],o=[]){this.#client=e,this.#path=t,this.#components=n,this.#cssModules=r,this.#callbacks=new Set(i),this.#callbackCache=new Map,this.#renderPropKeys=new Set(a),this.#cssProps=new Set(o),this.#callbackList=[...this.#callbacks].sort()}hasCallbackPath(e){return this.#callbacks.has(e)}hasRenderPropPath(e){return this.#renderPropKeys.has(e)}hasAnyCallbackUnder(e){if(e===``)return this.#callbackList.length>0;let t=this.#lowerBound(this.#callbackList,e);return t<this.#callbackList.length&&this.#callbackList[t].startsWith(e)}applyCallbackDelta(e){if(e.remove)for(let t of e.remove)this.#callbacks.delete(t),this.#callbackCache.delete(t);if(e.add)for(let t of e.add)this.#callbacks.add(t);this.#callbackList=[...this.#callbacks].sort()}applyRenderPropsDelta(e){if(e.remove)for(let t of e.remove)this.#renderPropKeys.delete(t);if(e.add)for(let t of e.add)this.#renderPropKeys.add(t)}applyCssRefsDelta(e){if(e.remove)for(let t of e.remove)this.#cssProps.delete(t);if(e.add)for(let t of e.add)this.#cssProps.add(t)}getCallback(e,t){let n=this.#propPath(e,t),r=this.#callbackCache.get(n);return r||(r=(...e)=>this.#client.invokeCallback(this.#path,n,e),this.#callbackCache.set(n,r)),r}renderNode(e,n=``){if(e==null||typeof e==`boolean`||typeof e==`number`||typeof e==`string`)return e;if(Ct(e)){let{tag:r,props:i={},children:o=[]}=e,s={};for(let[e,t]of Object.entries(i))s[e]=this.transformValue(n,e,t);e.key&&(s.key=e.key);let c=[];for(let e=0;e<o.length;e+=1){let t=o[e],r=n?`${n}.${e}`:String(e);c.push(this.renderNode(t,r))}if(wt(e)){let t=e.tag.slice(2),n=this.#components[t];if(!n)throw Error(`Could not find component ${t}. This is a Pulse internal error.`);return a(n,s,...c)}return a(r===Y?t:r,s,...c)}return process.env.NODE_ENV!==`production`&&console.error(`Unknown VDOM node type:`,e),null}#propPath(e,t){return e?`${e}.${t}`:t}transformValue(e,t,n){let r=this.#propPath(e,t);return this.#callbacks.has(r)?this.getCallback(e,t):this.#renderPropKeys.has(r)?this.renderNode(n,r):this.#cssProps.has(r)?this.#resolveCssToken(n):n}#resolveCssToken(e){let t=e.indexOf(`:`);if(t===-1)return e;let n=e.slice(0,t),r=e.slice(t+1);if(!n||!r)return e;let i=this.#cssModules[n];if(!i)throw Error(`Received CSS reference for unknown module '${n}'`);let a=i[r];if(typeof a!=`string`)throw Error(`Received CSS reference for missing class '${r}' in module '${n}'`);return a}init(e,t,n,r){this.#callbacks=new Set(t);for(let e of Array.from(this.#callbackCache.keys()))this.#callbacks.has(e)||this.#callbackCache.delete(e);return this.#callbackList=[...this.#callbacks].sort(),this.#renderPropKeys=new Set(n),this.#cssProps=new Set(r),this.renderNode(e)}#ensureChildrenArray(e){let t=e.props?.children;return t==null?[]:Array.isArray(t)?t.slice():[t]}applyUpdates(e,t){let n=e;for(let e of t){if(e.type===`update_callbacks`){this.applyCallbackDelta(e.data);continue}if(e.type===`update_css_refs`){this.applyCssRefsDelta(e.data);continue}if(e.type===`update_render_props`){this.applyRenderPropsDelta(e.data);continue}let t=e.path.split(`.`).filter(e=>e.length>0),i=(n,o,s)=>{if(o<t.length){this.#assertIsElement(n,t,o);let e=n,a=t[o],c=+a,l=s?`${s}.${a}`:a;if(Number.isNaN(c)){let t=e.props??{},n=t[a];return r(e,{...t,[a]:i(n,o+1,l)})}else{let t=this.#ensureChildrenArray(e),n=t[c];return t[c]=i(n,o+1,l),r(e,void 0,...t)}}switch(e.type){case`replace`:return this.renderNode(e.data,e.path);case`update_props`:{this.#assertIsElement(n,t,o);let i=n,c={...i.props??{}},l=e.data;if(l.remove&&l.remove.length>0)for(let e of l.remove)e in c&&delete c[e];if(l.set)for(let[e,t]of Object.entries(l.set))c[e]=this.transformValue(s,e,t);return(l.remove?.length??0)>0?(c.key=i.key,c.ref=i.ref,a(i.type,c,...this.#ensureChildrenArray(i))):r(i,c)}case`reconciliation`:{this.#assertIsElement(n,t,o);let i=n,a=this.#ensureChildrenArray(i),c=[],[l,u]=e.new,[d,f]=e.reuse,p=-1,m=-1,h=-1,g=-1;l.length>0&&(p=l[0],h=0),d.length>0&&(m=d[0],g=0);for(let t=0;t<e.N;++t)if(t===p){let e=u[h],n=s?`${s}.${t}`:String(t);c.push(this.renderNode(e,n)),p=h<l.length-1?l[++h]:-1}else if(t===m){let e=a[f[g]],n=s?`${s}.${t}`:String(t);this.hasAnyCallbackUnder(n)&&(e=this.#rebindCallbacksInSubtree(e,n)),c.push(e),m=g<d.length-1?d[++g]:-1}else c.push(a[t]);return r(i,null,...c)}default:throw Error(`[Pulse renderer] Unknown update type: ${e?.type}`)}};n=i(n,0,``)}return n}#assertIsElement(e,t,n){if(process.env.NODE_ENV!==`production`&&!s(e))throw console.error(`Invalid node:`,e),Error(`Invalid node at path ${t.slice(0,n).join(`.`)}`);return!0}#rebindCallbacksInSubtree(e,t){if(!s(e))return e;let n=e,i=n.props??{},a={...i};for(let e of Object.keys(i)){let n=t?`${t}.${e}`:e;this.hasCallbackPath(n)&&(a[e]=this.getCallback(t,e)),this.hasRenderPropPath(n)&&this.hasAnyCallbackUnder(n)&&(a[e]=this.#rebindCallbacksInSubtree(i[e],n))}return r(n,a,...this.#ensureChildrenArray(n).map((e,n)=>{let r=t?`${t}.${n}`:String(n);return this.hasAnyCallbackUnder(r)?this.#rebindCallbacksInSubtree(e,r):e}))}#lowerBound(e,t){let n=0,r=e.length;for(;n<r;){let i=n+r>>>1;e[i]<t?n=i+1:r=i}return n}};function Et(e,t){let r=c(e);return({children:e,...i})=>m(n,{fallback:t,children:m(r,{...i,children:e})})}const X=i(null),Z=i(null),Q=()=>{let e=u(X);if(!e)throw Error(`usePulseClient must be used within a PulseProvider`);return e},Dt=e=>{let t=u(Z);if(!t)throw Error(`usePulsePrerender must be used within a PulseProvider`);let n=t.views[e];if(!n)throw Error(`No prerender found for '${e}'`);return n},$=typeof window<`u`;function Ot({children:e,config:t,prerender:n}){let[r,i]=p(!0),a=_(),{renderId:o}=n,s=f(()=>new St(t.serverAddress,o,a),[t.serverAddress,a,o]);return d(()=>s.onConnectionChange(i),[s]),d(()=>{if($)return s.connect(),()=>s.disconnect()},[s]),m(X.Provider,{value:s,children:h(Z.Provider,{value:n,children:[!r&&m(`div`,{style:{position:`fixed`,bottom:`20px`,right:`20px`,backgroundColor:`red`,color:`white`,padding:`10px`,borderRadius:`5px`,zIndex:1e3},children:`Failed to connect to the server.`}),e]})})}function kt({externalComponents:e,path:t,cssModules:n}){let r=Q(),i=Dt(t),a=i.vdom,o=f(()=>new Tt(r,t,e,n,i.callbacks,i.render_props,i.css_refs),[r,t,e,n,i]),[s,c]=p(()=>o.init(a,i.callbacks,i.render_props,i.css_refs)),[l,u]=p(null),h=g(),_=ee(),v=f(()=>{let{"*":e=``,...t}=_,n=new URLSearchParams(h.search);return{hash:h.hash,pathname:h.pathname,query:h.search,queryParams:Object.fromEntries(n.entries()),pathParams:t,catchall:e.length>0?e.split(`/`):[]}},[h.hash,h.pathname,h.search,JSON.stringify(_)]);return d(()=>{if($){r.mountView(t,{routeInfo:v,onInit:(e,t,n,r)=>{c(o.init(e,t,n,r))},onUpdate:e=>{c(t=>t==null?t:o.applyUpdates(t,e))}});let e=r.onServerError((e,n)=>{e===t&&u(n)});return()=>{e(),r.unmount(t)}}},[r,o,t,v]),d(()=>{$&&r.navigate(t,v)},[r,t,v]),l?m(At,{error:l}):s}function At({error:e}){return h(`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:[h(`div`,{style:{fontWeight:700,marginBottom:8},children:[`Server Error during `,e.phase]}),e.message&&m(`div`,{children:e.message}),e.stack&&h(`details`,{open:!0,style:{marginTop:8},children:[m(`summary`,{children:`Stack trace`}),m(`pre`,{style:{margin:0},children:e.stack})]})]})}function jt(e){let t=Q(),n=f(()=>{if(!e)throw Error(`usePulseChannel requires a non-empty channelId`);return console.log(`Acquiring channel ${e}`),t.acquireChannel(e)},[t,e]);return d(()=>()=>{console.log(`Releasing channel ${e}`),t.releaseChannel(e)},[t,e]),n}export{y as PulseChannelResetError,se as PulseForm,Ot as PulseProvider,kt as PulseView,Et as RenderLazy,J as deserialize,ce as extractServerRouteInfo,q as serialize,b as submitForm,jt as usePulseChannel,Q as usePulseClient};
2
+ //# sourceMappingURL=index.js.map