@live-react-islands/core 0.1.1 → 0.1.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 +2 -3
- package/dist/createHooks.d.ts +3 -1
- package/dist/createHooks.d.ts.map +1 -1
- package/dist/index.esm.js +8 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/ssr.esm.js.map +1 -1
- package/dist/ssr.js.map +1 -1
- package/package.json +16 -16
- package/src/createHooks.ts +11 -2
- package/dist/IslandRenderer.d.ts +0 -11
- package/dist/IslandRenderer.d.ts.map +0 -1
- package/dist/client/IndividualIslandRenderer.d.ts +0 -14
- package/dist/client/IndividualIslandRenderer.d.ts.map +0 -1
- package/dist/client/PortalIslandsRenderer.d.ts +0 -4
- package/dist/client/PortalIslandsRenderer.d.ts.map +0 -1
- package/dist/client/islandsManager.d.ts +0 -23
- package/dist/client/islandsManager.d.ts.map +0 -1
- package/dist/client.d.ts +0 -23
- package/dist/client.d.ts.map +0 -1
- package/dist/island-manager.d.ts +0 -59
- package/dist/island-manager.d.ts.map +0 -1
- package/dist/server.d.ts +0 -18
- package/dist/server.d.ts.map +0 -1
- package/dist/useIslandStream.d.ts +0 -15
- package/dist/useIslandStream.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -441,9 +441,8 @@ See the **[SSR Guide](https://github.com/dcza/live-react-islands/blob/main/docs/
|
|
|
441
441
|
```bash
|
|
442
442
|
cd examples/vite-example
|
|
443
443
|
mix deps.get
|
|
444
|
-
yarn install
|
|
445
|
-
|
|
446
|
-
mix phx.server # in another terminal
|
|
444
|
+
cd assets && yarn install && yarn dev # in one terminal
|
|
445
|
+
cd .. && mix phx.server # in another terminal
|
|
447
446
|
```
|
|
448
447
|
|
|
449
448
|
## Contributing
|
package/dist/createHooks.d.ts
CHANGED
|
@@ -3,7 +3,9 @@ import { type IslandsMap, type ContextProviderComponent } from "./types";
|
|
|
3
3
|
interface LiveViewHook {
|
|
4
4
|
el: HTMLElement;
|
|
5
5
|
liveSocket: {
|
|
6
|
-
on: (event: string, callback: (e:
|
|
6
|
+
on: (event: string, callback: (e: CustomEvent<{
|
|
7
|
+
kind: string;
|
|
8
|
+
}>) => void) => void;
|
|
7
9
|
};
|
|
8
10
|
pushEvent: (event: string, payload: any, callback?: (reply: any, ref: any) => void) => void;
|
|
9
11
|
pushEventTo: (target: string, event: string, payload: any) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createHooks.d.ts","sourceRoot":"","sources":["../src/createHooks.ts"],"names":[],"mappings":"AAAA,OAAuB,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACL,KAAK,UAAU,EAGf,KAAK,wBAAwB,EAM9B,MAAM,SAAS,CAAC;AAMjB,UAAU,YAAY;IACpB,EAAE,EAAE,WAAW,CAAC;IAChB,UAAU,EAAE;QACV,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"createHooks.d.ts","sourceRoot":"","sources":["../src/createHooks.ts"],"names":[],"mappings":"AAAA,OAAuB,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACL,KAAK,UAAU,EAGf,KAAK,wBAAwB,EAM9B,MAAM,SAAS,CAAC;AAMjB,UAAU,YAAY;IACpB,EAAE,EAAE,WAAW,CAAC;IAChB,UAAU,EAAE;QACV,EAAE,EAAE,CACF,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,KAAK,IAAI,KACjD,IAAI,CAAC;KACX,CAAC;IACF,SAAS,EAAE,CACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,GAAG,EACZ,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,KACtC,IAAI,CAAC;IACV,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACnE,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;CACrE;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,UAAU,CAAC;IACpB,qBAAqB,CAAC,EAAE,wBAAwB,CAAC;IACjD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAwED,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EAAE,UAAe,EACxB,qBAA2C,EAC3C,OAAwB,GACzB,EAAE,kBAAkB;;iBASR,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI;kBAC3B,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI;mBAC3B,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI;;EAgO1C"}
|
package/dist/index.esm.js
CHANGED
|
@@ -380,7 +380,14 @@ function createHooks({ islands: islandsMap = {}, SharedContextProvider = NullCon
|
|
|
380
380
|
}
|
|
381
381
|
if (!navigationListenerAttached) {
|
|
382
382
|
navigationListenerAttached = true;
|
|
383
|
-
this.liveSocket.on("phx:page-loading-start", () => {
|
|
383
|
+
this.liveSocket.on("phx:page-loading-start", (e) => {
|
|
384
|
+
// Patches (e.g. push_patch tab switches) stay within the same
|
|
385
|
+
// LiveView mount and globals version counter, so islands that
|
|
386
|
+
// remain mounted through the patch must keep their cached
|
|
387
|
+
// globals. Only a real navigation (new mount, version resets
|
|
388
|
+
// to 0 server-side) needs the stale client-side version cleared.
|
|
389
|
+
if (e.detail?.kind === "patch")
|
|
390
|
+
return;
|
|
384
391
|
globalsRequested = false;
|
|
385
392
|
managerState = manager.resetGlobals(managerState);
|
|
386
393
|
});
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/types.ts","../src/context.ts","../src/PortalIslandsRenderer.tsx","../src/IndividualIslandRenderer.tsx","../src/islandsManager.ts","../src/createHooks.ts","../src/useStream.ts","../src/useForm.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import { createContext } from \"react\";\nimport type { IslandStoreAccess } from \"./types\";\n\nexport interface IslandContext {\n id: string;\n storeAccess: IslandStoreAccess;\n}\n\nexport const IslandContextProvider = createContext<IslandContext | null>(null);\n","import React, { useRef, memo, useSyncExternalStore, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type {\n IslandData,\n SharedIslandsRendererProps,\n IslandStoreAccess,\n} from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nconst PortalIsland = memo(\n ({\n data,\n storeAccess,\n }: {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n }) => {\n const {\n Component,\n ContextProvider,\n id,\n pushEvent,\n ssrStrategy,\n el,\n globalKeys,\n } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n const contextValue = useMemo(\n () => ({ id, storeAccess }),\n [id, storeAccess]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => null\n );\n\n const allGlobals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n () => null\n );\n\n const didClearRef = useRef(false);\n if (ssrStrategy === \"overwrite\" && !didClearRef.current) {\n el.innerHTML = \"\";\n didClearRef.current = true;\n }\n\n if (!allGlobals) {\n console.log(\"[PortalIsland] Waiting for globals\", id);\n return null;\n }\n\n console.log(\"[PortalIsland] Rendering\", { id, allGlobals });\n\n const relevantGlobals: Record<string, any> = {};\n if (allGlobals) {\n globalKeys.forEach((key) => {\n if (key in allGlobals) {\n relevantGlobals[key] = allGlobals[key];\n }\n });\n }\n\n const mergedProps = { ...relevantGlobals, ...currentProps };\n\n const islandNode = (\n <MemoizedComponent {...mergedProps} id={id} pushEvent={pushEvent} />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n const content = MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n\n return createPortal(content, el);\n }\n);\nPortalIsland.displayName = \"[ReactLiveIslands]PortalIsland\";\n\nexport const PortalIslandsRenderer: React.FC<SharedIslandsRendererProps> = ({\n storeAccess,\n}) => {\n const sharedIslandsObj = useSyncExternalStore(\n storeAccess.subscribeToSharedIslands,\n storeAccess.getSharedIslands\n );\n\n const islands = Object.values(sharedIslandsObj);\n\n console.log(\n \"[PortalIslandsRenderer] Rendering islands:\",\n islands.map((d) => d.id)\n );\n\n return (\n <>\n {islands.map((data) => (\n <PortalIsland key={data.id} data={data} storeAccess={storeAccess} />\n ))}\n </>\n );\n};\nPortalIslandsRenderer.displayName = \"[ReactLiveIslands]PortalIslandsRenderer\";\n","import React, { useSyncExternalStore, memo, useMemo } from \"react\";\nimport type { IndividualIslandsRendererProps } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport const IndividualIslandRenderer: React.FC<\n IndividualIslandsRendererProps\n> = ({ data, storeAccess }) => {\n const { Component, ContextProvider, id, pushEvent, globalKeys } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => data.hydrationData?.props\n );\n\n // Check once if hydration globals version matches store version\n const serverGlobalsSnapshot = useMemo(() => {\n const hydrationGlobals = data.hydrationData?.globals;\n if (!hydrationGlobals) return () => hydrationGlobals;\n let comparedVersions = false;\n let useStoreReference = false;\n return () => {\n if (!comparedVersions) {\n comparedVersions = true;\n const storeGlobals = storeAccess.getGlobals();\n const hydrationVersion = hydrationGlobals.__version ?? -1;\n const storeVersion = storeGlobals?.__version ?? -1;\n useStoreReference = storeVersion === hydrationVersion;\n }\n return useStoreReference ? storeAccess.getGlobals() : hydrationGlobals;\n };\n }, [data.hydrationData?.globals, storeAccess]);\n\n const globals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n serverGlobalsSnapshot\n );\n\n const filteredGlobals: Record<string, any> = {};\n if (globals) {\n globalKeys.forEach((key) => {\n if (key in globals) {\n filteredGlobals[key] = globals[key];\n }\n });\n }\n\n const contextValue = useMemo(() => ({ id, storeAccess }), [id, storeAccess]);\n\n const islandNode = (\n <MemoizedComponent\n {...filteredGlobals}\n {...currentProps}\n id={id}\n pushEvent={pushEvent}\n />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n return MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n};\n\nIndividualIslandRenderer.displayName =\n \"[ReactLiveIslands] IndividualIslandRenderer\";\n","import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\n\nimport {\n ContextProviderComponent,\n IslandData,\n SharedIslandsRendererComponent,\n IndividualIslandsRendererComponent,\n IslandStoreAccess,\n IndividualIslandsRendererProps,\n StreamAction,\n StreamConfig,\n} from \"./types\";\nimport { PortalIslandsRenderer } from \"./PortalIslandsRenderer\";\nimport { IndividualIslandRenderer } from \"./IndividualIslandRenderer\";\n\n// Constant root ID - one shared root per application\nexport const SHARED_ROOT_ID = \"__live_react_islands_shared_root__\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ManagerState {\n propsStore: Map<string, Record<string, any>>;\n propsListeners: Set<() => void>;\n globalsRef: React.MutableRefObject<Record<string, any> | null>;\n globalsListeners: Set<() => void>;\n sharedIslandsRef: React.MutableRefObject<Record<string, IslandData>>;\n sharedIslandsListeners: Set<() => void>;\n streamsStore: Map<string, any[]>;\n streamsListeners: Map<string, Set<() => void>>;\n streamConfigs: Map<string, StreamConfig>;\n roots: Record<string, any>;\n storeAccess: IslandStoreAccess;\n}\n\nexport interface Manager {\n initialize: (params: {\n SharedContextProvider?: ContextProviderComponent;\n SharedIslandsRenderer?: SharedIslandsRendererComponent;\n }) => ManagerState;\n mountIsland: (\n state: ManagerState,\n data: IslandData,\n IslandRenderer?: IndividualIslandsRendererComponent\n ) => ManagerState;\n unmountIsland: (state: ManagerState, id: string) => ManagerState;\n updateIslandProps: (\n state: ManagerState,\n islandId: string,\n props: Record<string, any>\n ) => ManagerState;\n updateGlobals: (\n state: ManagerState,\n globals: Record<string, any>\n ) => ManagerState;\n resetGlobals: (state: ManagerState) => ManagerState;\n initializeStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n initialItems: any[]\n ) => ManagerState;\n updateStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n action: StreamAction,\n data: any\n ) => ManagerState;\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n\nconst withSharedRootName = (\n ContextProvider: ContextProviderComponent\n): ContextProviderComponent => {\n const originalName =\n ContextProvider.displayName || ContextProvider.name || \"ContextProvider\";\n\n function NamedWrapper({ children }: { children: React.ReactNode }) {\n return React.createElement(ContextProvider, null, children);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] SharedRoot(${originalName})`;\n return NamedWrapper;\n};\n\nconst withIndividualRootName = (\n islandId: string,\n IslandRenderer: IndividualIslandsRendererComponent\n): IndividualIslandsRendererComponent => {\n const originalName = IslandRenderer.displayName;\n\n function NamedWrapper(props: IndividualIslandsRendererProps) {\n return React.createElement(IslandRenderer, props);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] HydratedRoot#${islandId}`;\n return NamedWrapper;\n};\n\nconst getOrCreateSharedRootElement = (): HTMLElement => {\n let rootElement = document.getElementById(SHARED_ROOT_ID);\n if (!rootElement) {\n rootElement = document.createElement(\"div\");\n rootElement.id = SHARED_ROOT_ID;\n rootElement.style.display = \"none\";\n document.body.appendChild(rootElement);\n }\n return rootElement;\n};\n\nconst mountSharedIsland = (\n state: ManagerState,\n data: IslandData\n): ManagerState => {\n state.sharedIslandsRef.current = {\n ...state.sharedIslandsRef.current,\n [data.id]: data,\n };\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n};\n\nconst mountIndividualIsland = (\n state: ManagerState,\n data: IslandData,\n IslandRenderer: IndividualIslandsRendererComponent\n): ManagerState => {\n const NamedIslandRenderer = withIndividualRootName(data.id, IslandRenderer);\n const root = ReactDOM.hydrateRoot(\n data.el,\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(NamedIslandRenderer, {\n data,\n storeAccess: state.storeAccess,\n })\n )\n );\n\n return {\n ...state,\n roots: { ...state.roots, [data.id]: root },\n };\n};\n\n// ============================================================================\n// Island Manager (Bridge between LiveView hook lifecycles and React rendering)\n// ============================================================================\n\nconst ManagerObj: Manager = {\n initialize: ({\n SharedContextProvider = NullContextProvider,\n SharedIslandsRenderer = PortalIslandsRenderer,\n }) => {\n const rootElement = getOrCreateSharedRootElement();\n const root = ReactDOM.createRoot(rootElement);\n\n const propsStore = new Map<string, Record<string, any>>();\n const propsListeners = new Set<() => void>();\n const globalsRef = { current: null as Record<string, any> | null };\n const globalsListeners = new Set<() => void>();\n const sharedIslandsRef = { current: {} as Record<string, IslandData> };\n const sharedIslandsListeners = new Set<() => void>();\n const streamsStore = new Map<string, any[]>();\n const streamsListeners = new Map<string, Set<() => void>>();\n const streamConfigs = new Map<string, StreamConfig>();\n\n const getStreamKey = (islandId: string, streamName: string) =>\n `${islandId}:${streamName}`;\n\n const storeAccess: IslandStoreAccess = {\n getProps: (islandId: string) => propsStore.get(islandId) || null,\n subscribeToProps: (cb: () => void) => {\n propsListeners.add(cb);\n return () => propsListeners.delete(cb);\n },\n getGlobals: () => globalsRef.current,\n subscribeToGlobals: (cb: () => void) => {\n globalsListeners.add(cb);\n return () => globalsListeners.delete(cb);\n },\n getSharedIslands: () => sharedIslandsRef.current,\n subscribeToSharedIslands: (cb: () => void) => {\n sharedIslandsListeners.add(cb);\n return () => sharedIslandsListeners.delete(cb);\n },\n getStreamItems: (islandId: string, streamName: string) => {\n const key = getStreamKey(islandId, streamName);\n return streamsStore.get(key) || [];\n },\n subscribeToStream: (\n islandId: string,\n streamName: string,\n cb: () => void,\n config?: StreamConfig\n ) => {\n const key = getStreamKey(islandId, streamName);\n if (config) {\n streamConfigs.set(key, config);\n }\n if (!streamsListeners.has(key)) {\n streamsListeners.set(key, new Set());\n }\n streamsListeners.get(key)!.add(cb);\n return () => {\n streamsListeners.get(key)?.delete(cb);\n if (streamsListeners.get(key)?.size === 0) {\n streamConfigs.delete(key);\n }\n };\n },\n };\n\n const state: ManagerState = {\n propsStore,\n globalsRef,\n propsListeners,\n globalsListeners,\n sharedIslandsRef,\n sharedIslandsListeners,\n streamsStore,\n streamsListeners,\n streamConfigs,\n roots: { [SHARED_ROOT_ID]: root },\n storeAccess,\n };\n\n const NamedSharedContextProvider = withSharedRootName(\n SharedContextProvider\n );\n\n root.render(\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(\n NamedSharedContextProvider,\n null,\n React.createElement(SharedIslandsRenderer, {\n storeAccess: state.storeAccess,\n })\n )\n )\n );\n\n return state;\n },\n mountIsland: (state, data, IslandRenderer = IndividualIslandRenderer) => {\n switch (data.ssrStrategy) {\n case \"hydrate_root\":\n return mountIndividualIsland(state, data, IslandRenderer);\n default:\n return mountSharedIsland(state, data);\n }\n },\n unmountIsland: (state, id) => {\n state.propsStore.delete(id);\n\n const streamPrefix = `${id}:`;\n for (const key of state.streamsStore.keys()) {\n if (key.startsWith(streamPrefix)) {\n state.streamsStore.delete(key);\n state.streamsListeners.delete(key);\n state.streamConfigs.delete(key);\n }\n }\n\n if (state.roots[id]) {\n state.roots[id].unmount();\n const { [id]: removedRoot, ...remainingRoots } = state.roots;\n return {\n ...state,\n roots: remainingRoots,\n };\n } else {\n const { [id]: removed, ...remaining } = state.sharedIslandsRef.current;\n state.sharedIslandsRef.current = remaining;\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n }\n },\n updateIslandProps: (state, islandId, props) => {\n const existing = state.propsStore.get(islandId) || {};\n state.propsStore.set(islandId, { ...existing, ...props });\n state.propsListeners.forEach((cb) => cb());\n return state;\n },\n updateGlobals: (state, globals) => {\n const incomingVersion = globals.__version ?? -1;\n const storeVersion = state.globalsRef.current?.__version ?? -1;\n if (incomingVersion > storeVersion) {\n state.globalsRef.current = {\n ...(state.globalsRef.current || {}),\n ...globals,\n };\n state.globalsListeners.forEach((cb) => cb());\n }\n\n return state;\n },\n resetGlobals: (state) => {\n state.globalsRef.current = null;\n return state;\n },\n initializeStream: (state, islandId, streamName, initialItems) => {\n const key = `${islandId}:${streamName}`;\n state.streamsStore.set(key, [...initialItems]);\n return state;\n },\n updateStream: (state, islandId, streamName, action, data) => {\n const key = `${islandId}:${streamName}`;\n let items = state.streamsStore.get(key) || [];\n const config = state.streamConfigs.get(key);\n\n switch (action) {\n case StreamAction.Insert:\n items = [data, ...items];\n break;\n case StreamAction.Update:\n const idx = items.findIndex((item) => item.id === data.id);\n if (idx !== -1) {\n items = [...items];\n items[idx] = { ...items[idx], ...data };\n }\n break;\n case StreamAction.Delete:\n items = items.filter((item) => item.id !== data);\n break;\n case StreamAction.Reset:\n items = [];\n break;\n }\n\n if (config?.capper) {\n items = config.capper(items);\n } else if (config?.limit !== undefined && items.length > config.limit) {\n items = items.slice(0, config.limit);\n }\n\n state.streamsStore.set(key, items);\n state.streamsListeners.get(key)?.forEach((cb) => cb());\n return state;\n },\n};\nexport default ManagerObj;\n","import IslandsManager, { Manager } from \"./islandsManager\";\nimport {\n type IslandsMap,\n type SSRStrategy,\n type PushEventFn,\n type ContextProviderComponent,\n type IslandComponent,\n type LazyIslandFactory,\n type StreamHandle,\n NullContextProvider,\n StreamAction,\n} from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface LiveViewHook {\n el: HTMLElement;\n liveSocket: {\n on: (event: string, callback: (e: Event) => void) => void;\n };\n pushEvent: (\n event: string,\n payload: any,\n callback?: (reply: any, ref: any) => void\n ) => void;\n pushEventTo: (target: string, event: string, payload: any) => void;\n handleEvent: (event: string, callback: (data: any) => void) => void;\n}\n\nexport interface CreateHooksOptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n manager?: Manager;\n}\n\n// ============================================================================\n// Event Handler Adapter\n// ============================================================================\n\nfunction createPushEventFn(hook: LiveViewHook): PushEventFn {\n return (eventName: string, payload: any) => {\n hook.pushEventTo(`#${hook.el.id}`, eventName, payload);\n };\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst resolvedComponentsCache = new Map<string, IslandComponent>();\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n // Check if it's a React component (has prototype.isReactComponent for class components)\n if ((value as any).prototype?.isReactComponent) return false;\n // Check if it's a config object getter (would have Component property)\n if ((value as any).Component) return false;\n // Assume zero-arg functions that aren't class components are lazy factories\n return value.length === 0;\n};\n\nconst resolveIslandConfig = async (\n islandsMap: IslandsMap,\n componentName: string,\n defaultContextProvider: ContextProviderComponent\n): Promise<{\n Component: IslandComponent;\n ContextProvider: ContextProviderComponent;\n} | null> => {\n const config = islandsMap[componentName];\n\n if (!config) {\n return null;\n }\n\n // Check cache first for lazy-loaded components\n const cached = resolvedComponentsCache.get(componentName);\n if (cached) {\n return { Component: cached, ContextProvider: defaultContextProvider };\n }\n\n // Handle lazy factory: () => import(\"./Component\")\n if (isLazyFactory(config)) {\n const mod = await config();\n const Component = mod.default;\n resolvedComponentsCache.set(componentName, Component);\n return { Component, ContextProvider: defaultContextProvider };\n }\n\n // Handle direct component\n if (typeof config === \"function\") {\n return { Component: config, ContextProvider: defaultContextProvider };\n }\n\n // Handle config object\n return {\n Component: config.Component,\n ContextProvider: config.ContextProvider || defaultContextProvider,\n };\n};\n\n// ============================================================================\n// Main Hook Factory (LiveView Adapter Layer)\n// ============================================================================\n\nexport function createHooks({\n islands: islandsMap = {},\n SharedContextProvider = NullContextProvider,\n manager = IslandsManager,\n}: CreateHooksOptions) {\n console.log(`[LiveReactIslands] Creating hooks`);\n let managerState = manager.initialize({ SharedContextProvider });\n\n let globalsRequested = false;\n const pendingMounts = new Set<string>();\n let navigationListenerAttached = false;\n\n const Hook: Partial<LiveViewHook> & {\n mounted: (this: LiveViewHook) => void;\n updated?: (this: LiveViewHook) => void;\n destroyed: (this: LiveViewHook) => void;\n } = {\n mounted(this: LiveViewHook) {\n console.log(\"[Hook] Mount:\", this.el.id);\n if (!this.el.id) {\n console.error(`[LiveReactIslands] Island element missing unique id`);\n return;\n }\n\n if (!navigationListenerAttached) {\n navigationListenerAttached = true;\n this.liveSocket.on(\"phx:page-loading-start\", () => {\n globalsRequested = false;\n managerState = manager.resetGlobals(managerState);\n });\n }\n\n // Pull globals once on first island mount\n if (!globalsRequested) {\n globalsRequested = true;\n this.handleEvent(\"lri-g\", (data) => {\n managerState = manager.updateGlobals(managerState, data);\n });\n this.pushEvent(\"lri-g\", {}, (reply) => {\n managerState = manager.updateGlobals(managerState, reply);\n });\n }\n\n const {\n comp: componentName,\n ssr: ssrData,\n props: propsData,\n schema: schemaData,\n globals: globalsData,\n globalsVersion: globalsVersionData,\n } = this.el.dataset;\n if (!componentName) {\n console.error(\n `[LiveReactIslands] Element '${this.el.id}' missing data-comp attribute`\n );\n return;\n }\n\n let schema: { p: string[]; g: string[]; i: number } = {\n p: [],\n g: [],\n i: 0,\n };\n if (schemaData) {\n try {\n schema = JSON.parse(schemaData);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-schema:`,\n e\n );\n }\n }\n\n let initialProps: Record<string, any> = {};\n if (propsData) {\n try {\n const propsArray = JSON.parse(propsData);\n schema.p.forEach((propName, idx) => {\n const value = propsArray[idx];\n if (value?.__s !== undefined) {\n const streamName = schema.p[value.__s];\n managerState = manager.initializeStream(\n managerState,\n this.el.id,\n streamName,\n value.i\n );\n const handle: StreamHandle = {\n name: streamName,\n initial: value.i,\n };\n initialProps[propName] = handle;\n } else {\n initialProps[propName] = value;\n }\n });\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-props:`,\n e\n );\n }\n }\n\n // Only for hydrate_root strategy\n let initialGlobals: Record<string, any> = {};\n if (globalsData) {\n try {\n const globalsArray = JSON.parse(globalsData);\n schema.g.forEach((globalName, idx) => {\n initialGlobals[globalName] = globalsArray[idx];\n });\n if (!globalsVersionData)\n throw \"Missing data-globals-version attribute\";\n initialGlobals.__version = parseInt(globalsVersionData, 10);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-globals:`,\n e\n );\n }\n }\n\n let ssrStrategy: SSRStrategy;\n switch (ssrData) {\n case \"overwrite\":\n ssrStrategy = \"overwrite\";\n break;\n case \"hydrate_root\":\n ssrStrategy = \"hydrate_root\";\n break;\n default:\n ssrStrategy = \"none\";\n }\n\n const pushEvent = createPushEventFn(this);\n const elId = this.el.id;\n const el = this.el;\n\n pendingMounts.add(elId);\n\n (async () => {\n const islandConfig = await resolveIslandConfig(\n islandsMap,\n componentName,\n NullContextProvider\n );\n\n if (!pendingMounts.has(elId)) return;\n pendingMounts.delete(elId);\n\n if (!islandConfig) {\n console.error(\n `[LiveReactIslands] React island '${componentName}' not found`\n );\n return;\n }\n\n managerState = manager.updateIslandProps(\n managerState,\n elId,\n initialProps\n );\n\n managerState = manager.mountIsland(managerState, {\n id: elId,\n el,\n Component: islandConfig.Component,\n ContextProvider: islandConfig.ContextProvider,\n ssrStrategy,\n pushEvent,\n hydrationData:\n ssrStrategy === \"hydrate_root\"\n ? { props: initialProps, globals: initialGlobals }\n : null,\n globalKeys: schema.g,\n });\n })();\n\n this.handleEvent(\n \"lri-p\",\n (payload: { i: number; [key: number]: any }) => {\n if (payload.i !== schema.i) return;\n\n const props: Record<string, any> = {};\n Object.entries(payload).forEach(([key, value]) => {\n if (key === \"i\") return;\n const idx = parseInt(key, 10);\n if (!isNaN(idx) && schema.p[idx]) {\n props[schema.p[idx]] = value;\n }\n });\n\n managerState = manager.updateIslandProps(\n managerState,\n this.el.id,\n props\n );\n }\n );\n\n this.handleEvent(\n \"lri-s\",\n (payload: { s: number; a: StreamAction; d: any; i: number }) => {\n if (payload.i !== schema.i) return;\n\n const streamName = schema.p[payload.s];\n if (!streamName) return;\n\n managerState = manager.updateStream(\n managerState,\n this.el.id,\n streamName,\n payload.a,\n payload.d\n );\n }\n );\n },\n\n updated(this: LiveViewHook) {\n console.log(\"[Hook] Updated:\", this.el.id);\n },\n\n destroyed(this: LiveViewHook) {\n console.log(\"[Hook] Destroyed:\", this.el.id);\n pendingMounts.delete(this.el.id);\n managerState = manager.unmountIsland(managerState, this.el.id);\n },\n };\n\n return { LiveReactIslands: Hook };\n}\n","import { useContext, useSyncExternalStore, useMemo } from \"react\";\nimport type { StreamHandle } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport interface UseStreamOptions<T> {\n limit?: number;\n capper?: (items: T[]) => T[];\n}\n\nexport function useStream<T extends { id: string | number }>(\n handle: StreamHandle,\n options?: UseStreamOptions<T>\n): T[] {\n const context = useContext(IslandContextProvider);\n if (!context) {\n throw new Error(\"useStream must be used within an Island component\");\n }\n\n const { id: islandId, storeAccess } = context;\n\n const subscribe = useMemo(\n () => (cb: () => void) =>\n storeAccess.subscribeToStream(islandId, handle.name, cb, {\n limit: options?.limit,\n capper: options?.capper as ((items: any[]) => any[]) | undefined,\n }),\n [storeAccess, islandId, handle.name, options?.limit, options?.capper]\n );\n\n const getSnapshot = useMemo(\n () => () => storeAccess.getStreamItems(islandId, handle.name) as T[],\n [storeAccess, islandId, handle.name]\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, () => handle.initial as T[]);\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\n\nexport interface FormProps {\n /** Internal: prop name for event routing (set by server) */\n __prop?: string;\n types?: Record<string, string>;\n required?: string[];\n values: Record<string, any>;\n errors: Record<string, string[]>;\n isValid?: boolean;\n version?: number;\n}\n\nexport type PushEventFn = (event: string, payload: Record<string, any>) => void;\n\nexport interface FieldProps {\n name: string;\n value: any;\n checked?: boolean;\n onChange: (\n e: React.ChangeEvent<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >\n ) => void;\n}\n\nexport interface UseFormReturn {\n /** Current form field values */\n values: Record<string, any>;\n /** Current form errors by field name */\n errors: Record<string, string[]>;\n /** Field types from schema */\n types: Record<string, string>;\n /** Required field names */\n required: string[];\n /** Field names that have been modified by the user */\n touched: string[];\n /** Get props to spread on an input element */\n getFieldProps: (name: string) => FieldProps;\n /** Get the first error message for a field */\n getError: (name: string) => string | undefined;\n /** Check if a field is required */\n isRequired: (name: string) => boolean;\n /** Check if a field has been modified by the user */\n isTouched: (name: string) => boolean;\n /** Set a field value programmatically */\n setField: (name: string, value: any) => void;\n /** Handle form submission */\n handleSubmit: (e?: React.FormEvent) => void;\n /** Reset form to server values */\n reset: () => void;\n /**\n * True when the server hasn't acknowledged the latest client changes.\n * Use this to show a syncing indicator (e.g., spinner, \"Validating...\").\n */\n isSyncing: boolean;\n /**\n * True only when form is valid AND fully synced with server.\n * Use this to enable/disable the submit button.\n * This is the \"Validation Lock\" - users cannot submit until server confirms validity.\n */\n isValid: boolean;\n /** Current local version counter */\n localVersion: number;\n /** Last acknowledged server version */\n serverVersion: number;\n}\n\nexport function useForm(\n form: FormProps,\n pushEvent?: PushEventFn\n): UseFormReturn {\n // 1. Version Tracking\n // Local version increments on each field change\n // Server version comes from form.version prop\n const localVersionRef = useRef(form.version ?? 0);\n const lastSentVersionRef = useRef(0); // Prevents duplicate sends in StrictMode\n const [localVersion, setLocalVersion] = useState(form.version ?? 0);\n const serverVersion = form.version ?? 0;\n\n // Prop name comes from server (embedded in form data)\n const propName = form.__prop;\n\n // Reset local version when server sends a reset (version 0 with new schema)\n useEffect(() => {\n if (form.version === 0 && form.types) {\n localVersionRef.current = 0;\n setLocalVersion(0);\n }\n }, [form.version, form.types]);\n\n // 3. Persistent Schema\n // We only update these when the server explicitly sends them (usually on init)\n const [schema, setSchema] = useState({\n types: form.types ?? {},\n required: form.required ?? [],\n });\n\n if (form.types && form.types !== schema.types) {\n setSchema((prev) => ({ ...prev, types: form.types! }));\n }\n if (form.required && form.required !== schema.required) {\n setSchema((prev) => ({ ...prev, required: form.required! }));\n }\n\n // 4. Values Management\n const [localValues, setLocalValues] = useState<Record<string, any>>(\n form.values ?? {}\n );\n\n // 5. Touched Tracking (client-side only)\n const [touched, setTouched] = useState<string[]>([]);\n\n // Sync from server: Update local values when server sends updates\n useEffect(() => {\n setLocalValues((prev) => ({ ...prev, ...form.values }));\n }, [form.values]);\n\n // 6. Versioned Change Handler\n const setField = useCallback((name: string, value: any) => {\n // Mark field as touched\n setTouched((prev) => (prev.includes(name) ? prev : [...prev, name]));\n\n // Increment version BEFORE state update to avoid StrictMode double-increment\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n\n setLocalValues((prev) => {\n const next = { ...prev, [name]: value };\n\n // Update version state (will be batched with values update)\n setLocalVersion(newVersion);\n\n // Only send event once per version (prevents duplicate sends in StrictMode)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"validate\",\n prop: propName,\n attrs: next,\n _v: newVersion,\n });\n }\n\n return next;\n });\n }, [propName]);\n\n // 6. Identity-Stable Field Props\n const getFieldProps = useCallback(\n (name: string): FieldProps => {\n const type = schema.types[name];\n const value = localValues[name];\n\n const base = { name };\n\n if (type === \"boolean\" || type === \"bool\") {\n return {\n ...base,\n checked: !!value,\n value: undefined as any,\n onChange: (e) =>\n setField(name, (e.target as HTMLInputElement).checked),\n };\n }\n\n return {\n ...base,\n value: value ?? \"\",\n onChange: (e) => setField(name, e.target.value),\n };\n },\n [localValues, schema.types, setField]\n );\n\n const getError = useCallback(\n (name: string) => form.errors?.[name]?.[0],\n [form.errors]\n );\n\n const isRequired = useCallback(\n (name: string) => schema.required.includes(name),\n [schema.required]\n );\n\n const isTouched = useCallback(\n (name: string) => touched.includes(name),\n [touched]\n );\n\n // 7. Versioned Submit Handler\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n\n // Increment version for submit as well\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n setLocalVersion(newVersion);\n\n // Only send once (prevents duplicate sends if called twice)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"submit\",\n prop: propName,\n attrs: localValues,\n _v: newVersion,\n });\n }\n },\n [localValues, propName]\n );\n\n const reset = useCallback(() => {\n setLocalValues(form.values ?? {});\n setTouched([]);\n // Reset local version to match server\n localVersionRef.current = form.version ?? 0;\n setLocalVersion(form.version ?? 0);\n }, [form.values, form.version]);\n\n // 8. Derived States - The \"Validation Lock\"\n // isSyncing: True when client has sent changes that server hasn't acknowledged\n const isSyncing = localVersion > serverVersion;\n\n // isValid: True only when:\n // 1. Form is in sync (server has seen all changes)\n // 2. Server says the form is valid\n // This ensures users cannot submit until server validates the latest data\n const isValid = !isSyncing && (form.isValid ?? false);\n\n return {\n values: localValues,\n errors: form.errors ?? {},\n types: schema.types,\n required: schema.required,\n touched,\n getFieldProps,\n getError,\n isRequired,\n isTouched,\n setField,\n handleSubmit,\n reset,\n isSyncing,\n isValid,\n localVersion,\n serverVersion,\n };\n}\n"],"names":["NullContextProvider","IslandsManager"],"mappings":";;;;AAiDA,IAAY,YAKX;AALD,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,GAAW;AACb,CAAC,EALW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;AAuCjB,MAAMA,qBAAmB,GAA4C,CAAC,EAC3E,QAAQ,GACT,KAAK,QAAQ;;AClFP,MAAM,qBAAqB,GAAG,aAAa,CAAuB,IAAI,CAAC;;ACC9E,MAAM,YAAY,GAAG,IAAI,CACvB,CAAC,EACC,IAAI,EACJ,WAAW,GAIZ,KAAI;AACH,IAAA,MAAM,EACJ,SAAS,EACT,eAAe,EACf,EAAE,EACF,SAAS,EACT,WAAW,EACX,EAAE,EACF,UAAU,GACX,GAAG,IAAI;AAER,IAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,uBAAuB,GAAG,OAAO,CACrC,OAAO,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,EACtD,CAAC,eAAe,CAAC,CAClB;IACD,MAAM,YAAY,GAAG,OAAO,CAC1B,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAC3B,CAAC,EAAE,EAAE,WAAW,CAAC,CAClB;IAED,MAAM,YAAY,GAAG,oBAAoB,CACvC,WAAW,CAAC,gBAAgB,EAC5B,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAC9B,MAAM,IAAI,CACX;AAED,IAAA,MAAM,UAAU,GAAG,oBAAoB,CACrC,WAAW,CAAC,kBAAkB,EAC9B,WAAW,CAAC,UAAU,EACtB,MAAM,IAAI,CACX;AAED,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IACjC,IAAI,WAAW,KAAK,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AACvD,QAAA,EAAE,CAAC,SAAS,GAAG,EAAE;AACjB,QAAA,WAAW,CAAC,OAAO,GAAG,IAAI;IAC5B;IAEA,IAAI,CAAC,UAAU,EAAE;AACf,QAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,EAAE,CAAC;AACrD,QAAA,OAAO,IAAI;IACb;IAEA,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;IAE3D,MAAM,eAAe,GAAwB,EAAE;IAC/C,IAAI,UAAU,EAAE;AACd,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACzB,YAAA,IAAI,GAAG,IAAI,UAAU,EAAE;gBACrB,eAAe,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC;YACxC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,WAAW,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,YAAY,EAAE;AAE3D,IAAA,MAAM,UAAU,IACd,KAAA,CAAA,aAAA,CAAC,iBAAiB,OAAK,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAA,CAAI,CACrE;AAED,IAAA,MAAM,WAAW,IACf,KAAA,CAAA,aAAA,CAAC,qBAAqB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,EAChD,UAAU,CACoB,CAClC;AAED,IAAA,MAAM,OAAO,GAAG,uBAAuB,IACrC,KAAA,CAAA,aAAA,CAAC,uBAAuB,QAAE,WAAW,CAA2B,KAEhE,WAAW,CACZ;AAED,IAAA,OAAO,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;AAClC,CAAC,CACF;AACD,YAAY,CAAC,WAAW,GAAG,gCAAgC;AAEpD,MAAM,qBAAqB,GAAyC,CAAC,EAC1E,WAAW,GACZ,KAAI;AACH,IAAA,MAAM,gBAAgB,GAAG,oBAAoB,CAC3C,WAAW,CAAC,wBAAwB,EACpC,WAAW,CAAC,gBAAgB,CAC7B;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;AAE/C,IAAA,OAAO,CAAC,GAAG,CACT,4CAA4C,EAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CACzB;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,MAChB,KAAA,CAAA,aAAA,CAAC,YAAY,EAAA,EAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAA,CAAI,CACrE,CAAC,CACD;AAEP,CAAC;AACD,qBAAqB,CAAC,WAAW,GAAG,yCAAyC;;ACjHtE,MAAM,wBAAwB,GAEjC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAI;AAC5B,IAAA,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI;AAEtE,IAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,uBAAuB,GAAG,OAAO,CACrC,OAAO,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,EACtD,CAAC,eAAe,CAAC,CAClB;IAED,MAAM,YAAY,GAAG,oBAAoB,CACvC,WAAW,CAAC,gBAAgB,EAC5B,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAC9B,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,CAChC;;AAGD,IAAA,MAAM,qBAAqB,GAAG,OAAO,CAAC,MAAK;AACzC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO;AACpD,QAAA,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,MAAM,gBAAgB;QACpD,IAAI,gBAAgB,GAAG,KAAK;QAC5B,IAAI,iBAAiB,GAAG,KAAK;AAC7B,QAAA,OAAO,MAAK;YACV,IAAI,CAAC,gBAAgB,EAAE;gBACrB,gBAAgB,GAAG,IAAI;AACvB,gBAAA,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,EAAE;gBAC7C,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,SAAS,IAAI,EAAE;gBACzD,MAAM,YAAY,GAAG,YAAY,EAAE,SAAS,IAAI,EAAE;AAClD,gBAAA,iBAAiB,GAAG,YAAY,KAAK,gBAAgB;YACvD;AACA,YAAA,OAAO,iBAAiB,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,gBAAgB;AACxE,QAAA,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAE9C,IAAA,MAAM,OAAO,GAAG,oBAAoB,CAClC,WAAW,CAAC,kBAAkB,EAC9B,WAAW,CAAC,UAAU,EACtB,qBAAqB,CACtB;IAED,MAAM,eAAe,GAAwB,EAAE;IAC/C,IAAI,OAAO,EAAE;AACX,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACzB,YAAA,IAAI,GAAG,IAAI,OAAO,EAAE;gBAClB,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;YACrC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;AAE5E,IAAA,MAAM,UAAU,IACd,oBAAC,iBAAiB,EAAA,EAAA,GACZ,eAAe,EAAA,GACf,YAAY,EAChB,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,SAAS,EAAA,CACpB,CACH;AAED,IAAA,MAAM,WAAW,IACf,KAAA,CAAA,aAAA,CAAC,qBAAqB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,EAChD,UAAU,CACoB,CAClC;AAED,IAAA,OAAO,uBAAuB,IAC5B,oBAAC,uBAAuB,EAAA,IAAA,EAAE,WAAW,CAA2B,KAEhE,WAAW,CACZ;AACH,CAAC;AAED,wBAAwB,CAAC,WAAW;AAClC,IAAA,6CAA6C;;AC/D/C;AACO,MAAM,cAAc,GAAG,oCAAoC;AAwDlE;AACA;AACA;AAEA,MAAM,mBAAmB,GAA4C,CAAC,EACpE,QAAQ,GACT,KAAK,QAAQ;AAEd,MAAM,kBAAkB,GAAG,CACzB,eAAyC,KACb;IAC5B,MAAM,YAAY,GAChB,eAAe,CAAC,WAAW,IAAI,eAAe,CAAC,IAAI,IAAI,iBAAiB;AAE1E,IAAA,SAAS,YAAY,CAAC,EAAE,QAAQ,EAAiC,EAAA;QAC/D,OAAO,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,CAAC;IAC7D;AAEA,IAAA,YAAY,CAAC,WAAW,GAAG,CAAA,8BAAA,EAAiC,YAAY,GAAG;AAC3E,IAAA,OAAO,YAAY;AACrB,CAAC;AAED,MAAM,sBAAsB,GAAG,CAC7B,QAAgB,EAChB,cAAkD,KACZ;AACtC,IAAqB,cAAc,CAAC;IAEpC,SAAS,YAAY,CAAC,KAAqC,EAAA;QACzD,OAAO,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,KAAK,CAAC;IACnD;AAEA,IAAA,YAAY,CAAC,WAAW,GAAG,CAAA,gCAAA,EAAmC,QAAQ,EAAE;AACxE,IAAA,OAAO,YAAY;AACrB,CAAC;AAED,MAAM,4BAA4B,GAAG,MAAkB;IACrD,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;IACzD,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,QAAA,WAAW,CAAC,EAAE,GAAG,cAAc;AAC/B,QAAA,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAClC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;IACxC;AACA,IAAA,OAAO,WAAW;AACpB,CAAC;AAED,MAAM,iBAAiB,GAAG,CACxB,KAAmB,EACnB,IAAgB,KACA;AAChB,IAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG;AAC/B,QAAA,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO;AACjC,QAAA,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI;KAChB;AACD,IAAA,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAClD,IAAA,OAAO,KAAK;AACd,CAAC;AAED,MAAM,qBAAqB,GAAG,CAC5B,KAAmB,EACnB,IAAgB,EAChB,cAAkD,KAClC;IAChB,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC;IAC3E,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAC/B,IAAI,CAAC,EAAE,EACP,KAAK,CAAC,aAAa,CACjB,KAAK,CAAC,UAAU,EAChB,IAAI,EACJ,KAAK,CAAC,aAAa,CAAC,mBAAmB,EAAE;QACvC,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC,CACH,CACF;IAED,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE;KAC3C;AACH,CAAC;AAED;AACA;AACA;AAEA,MAAM,UAAU,GAAY;AAC1B,IAAA,UAAU,EAAE,CAAC,EACX,qBAAqB,GAAG,mBAAmB,EAC3C,qBAAqB,GAAG,qBAAqB,GAC9C,KAAI;AACH,QAAA,MAAM,WAAW,GAAG,4BAA4B,EAAE;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;AAE7C,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B;AACzD,QAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAc;AAC5C,QAAA,MAAM,UAAU,GAAG,EAAE,OAAO,EAAE,IAAkC,EAAE;AAClE,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAc;AAC9C,QAAA,MAAM,gBAAgB,GAAG,EAAE,OAAO,EAAE,EAAgC,EAAE;AACtE,QAAA,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAc;AACpD,QAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiB;AAC7C,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA2B;AAC3D,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB;AAErD,QAAA,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,UAAkB,KACxD,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AAE7B,QAAA,MAAM,WAAW,GAAsB;AACrC,YAAA,QAAQ,EAAE,CAAC,QAAgB,KAAK,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI;AAChE,YAAA,gBAAgB,EAAE,CAAC,EAAc,KAAI;AACnC,gBAAA,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,MAAM,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,CAAC;AACD,YAAA,UAAU,EAAE,MAAM,UAAU,CAAC,OAAO;AACpC,YAAA,kBAAkB,EAAE,CAAC,EAAc,KAAI;AACrC,gBAAA,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,MAAM,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,CAAC;AACD,YAAA,gBAAgB,EAAE,MAAM,gBAAgB,CAAC,OAAO;AAChD,YAAA,wBAAwB,EAAE,CAAC,EAAc,KAAI;AAC3C,gBAAA,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,MAAM,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,CAAC;AACD,YAAA,cAAc,EAAE,CAAC,QAAgB,EAAE,UAAkB,KAAI;gBACvD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAC9C,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;YACpC,CAAC;YACD,iBAAiB,EAAE,CACjB,QAAgB,EAChB,UAAkB,EAClB,EAAc,EACd,MAAqB,KACnB;gBACF,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAC9C,IAAI,MAAM,EAAE;AACV,oBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;gBAChC;gBACA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBAC9B,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC;gBACtC;gBACA,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,gBAAA,OAAO,MAAK;oBACV,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;oBACrC,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE;AACzC,wBAAA,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;oBAC3B;AACF,gBAAA,CAAC;YACH,CAAC;SACF;AAED,QAAA,MAAM,KAAK,GAAiB;YAC1B,UAAU;YACV,UAAU;YACV,cAAc;YACd,gBAAgB;YAChB,gBAAgB;YAChB,sBAAsB;YACtB,YAAY;YACZ,gBAAgB;YAChB,aAAa;AACb,YAAA,KAAK,EAAE,EAAE,CAAC,cAAc,GAAG,IAAI,EAAE;YACjC,WAAW;SACZ;AAED,QAAA,MAAM,0BAA0B,GAAG,kBAAkB,CACnD,qBAAqB,CACtB;QAED,IAAI,CAAC,MAAM,CACT,KAAK,CAAC,aAAa,CACjB,KAAK,CAAC,UAAU,EAChB,IAAI,EACJ,KAAK,CAAC,aAAa,CACjB,0BAA0B,EAC1B,IAAI,EACJ,KAAK,CAAC,aAAa,CAAC,qBAAqB,EAAE;YACzC,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CACH,CACF,CACF;AAED,QAAA,OAAO,KAAK;IACd,CAAC;IACD,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,wBAAwB,KAAI;AACtE,QAAA,QAAQ,IAAI,CAAC,WAAW;AACtB,YAAA,KAAK,cAAc;gBACjB,OAAO,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC;AAC3D,YAAA;AACE,gBAAA,OAAO,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC;;IAE3C,CAAC;AACD,IAAA,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,KAAI;AAC3B,QAAA,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;AAE3B,QAAA,MAAM,YAAY,GAAG,CAAA,EAAG,EAAE,GAAG;QAC7B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE;AAC3C,YAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;AAChC,gBAAA,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC;AAC9B,gBAAA,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC;AAClC,gBAAA,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;YACjC;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YACnB,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;AACzB,YAAA,MAAM,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,cAAc,EAAE,GAAG,KAAK,CAAC,KAAK;YAC5D,OAAO;AACL,gBAAA,GAAG,KAAK;AACR,gBAAA,KAAK,EAAE,cAAc;aACtB;QACH;aAAO;AACL,YAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO;AACtE,YAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG,SAAS;AAC1C,YAAA,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAClD,YAAA,OAAO,KAAK;QACd;IACF,CAAC;IACD,iBAAiB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAI;AAC5C,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;AACrD,QAAA,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;AACzD,QAAA,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAC1C,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAI;QAChC,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE;AAC/C,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE;AAC9D,QAAA,IAAI,eAAe,GAAG,YAAY,EAAE;AAClC,YAAA,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG;gBACzB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;AACnC,gBAAA,GAAG,OAAO;aACX;AACD,YAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C;AAEA,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,YAAY,EAAE,CAAC,KAAK,KAAI;AACtB,QAAA,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI;AAC/B,QAAA,OAAO,KAAK;IACd,CAAC;IACD,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,KAAI;AAC9D,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AACvC,QAAA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC;AAC9C,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,YAAY,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,KAAI;AAC1D,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AACvC,QAAA,IAAI,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;QAE3C,QAAQ,MAAM;YACZ,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;gBACxB;YACF,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAC1D,gBAAA,IAAI,GAAG,KAAK,EAAE,EAAE;AACd,oBAAA,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;AAClB,oBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE;gBACzC;gBACA;YACF,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;gBAChD;YACF,KAAK,YAAY,CAAC,KAAK;gBACrB,KAAK,GAAG,EAAE;gBACV;;AAGJ,QAAA,IAAI,MAAM,EAAE,MAAM,EAAE;AAClB,YAAA,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9B;AAAO,aAAA,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE;YACrE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;QACtC;QAEA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AAClC,QAAA,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AACtD,QAAA,OAAO,KAAK;IACd,CAAC;CACF;;AC7TD;AACA;AACA;AAEA,SAAS,iBAAiB,CAAC,IAAkB,EAAA;AAC3C,IAAA,OAAO,CAAC,SAAiB,EAAE,OAAY,KAAI;AACzC,QAAA,IAAI,CAAC,WAAW,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC;AACxD,IAAA,CAAC;AACH;AAEA;AACA;AACA;AAEA,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAA2B;AAElE,MAAM,aAAa,GAAG,CAAC,KAAc,KAAgC;IACnE,IAAI,OAAO,KAAK,KAAK,UAAU;AAAE,QAAA,OAAO,KAAK;;AAE7C,IAAA,IAAK,KAAa,CAAC,SAAS,EAAE,gBAAgB;AAAE,QAAA,OAAO,KAAK;;IAE5D,IAAK,KAAa,CAAC,SAAS;AAAE,QAAA,OAAO,KAAK;;AAE1C,IAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,mBAAmB,GAAG,OAC1B,UAAsB,EACtB,aAAqB,EACrB,sBAAgD,KAItC;AACV,IAAA,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC;IAExC,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,IAAI;IACb;;IAGA,MAAM,MAAM,GAAG,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAAC;IACzD,IAAI,MAAM,EAAE;QACV,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,sBAAsB,EAAE;IACvE;;AAGA,IAAA,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE;AACzB,QAAA,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE;AAC1B,QAAA,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO;AAC7B,QAAA,uBAAuB,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC;AACrD,QAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,sBAAsB,EAAE;IAC/D;;AAGA,IAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;QAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,sBAAsB,EAAE;IACvE;;IAGA,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,SAAS;AAC3B,QAAA,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,sBAAsB;KAClE;AACH,CAAC;AAED;AACA;AACA;SAEgB,WAAW,CAAC,EAC1B,OAAO,EAAE,UAAU,GAAG,EAAE,EACxB,qBAAqB,GAAGA,qBAAmB,EAC3C,OAAO,GAAGC,UAAc,GACL,EAAA;AACnB,IAAA,OAAO,CAAC,GAAG,CAAC,CAAA,iCAAA,CAAmC,CAAC;IAChD,IAAI,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAEhE,IAAI,gBAAgB,GAAG,KAAK;AAC5B,IAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU;IACvC,IAAI,0BAA0B,GAAG,KAAK;AAEtC,IAAA,MAAM,IAAI,GAIN;QACF,OAAO,GAAA;YACL,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACxC,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,mDAAA,CAAqD,CAAC;gBACpE;YACF;YAEA,IAAI,CAAC,0BAA0B,EAAE;gBAC/B,0BAA0B,GAAG,IAAI;gBACjC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,wBAAwB,EAAE,MAAK;oBAChD,gBAAgB,GAAG,KAAK;AACxB,oBAAA,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC;AACnD,gBAAA,CAAC,CAAC;YACJ;;YAGA,IAAI,CAAC,gBAAgB,EAAE;gBACrB,gBAAgB,GAAG,IAAI;gBACvB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,IAAI,KAAI;oBACjC,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC;AAC1D,gBAAA,CAAC,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,KAAK,KAAI;oBACpC,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC;AAC3D,gBAAA,CAAC,CAAC;YACJ;AAEA,YAAA,MAAM,EACJ,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,WAAW,EACpB,cAAc,EAAE,kBAAkB,GACnC,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO;YACnB,IAAI,CAAC,aAAa,EAAE;gBAClB,OAAO,CAAC,KAAK,CACX,CAAA,4BAAA,EAA+B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,6BAAA,CAA+B,CACzE;gBACD;YACF;AAEA,YAAA,IAAI,MAAM,GAA4C;AACpD,gBAAA,CAAC,EAAE,EAAE;AACL,gBAAA,CAAC,EAAE,EAAE;AACL,gBAAA,CAAC,EAAE,CAAC;aACL;YACD,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI;AACF,oBAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBACjC;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,+BAAA,CAAiC,EACtD,CAAC,CACF;gBACH;YACF;YAEA,IAAI,YAAY,GAAwB,EAAE;YAC1C,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI;oBACF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;oBACxC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAI;AACjC,wBAAA,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC;AAC7B,wBAAA,IAAI,KAAK,EAAE,GAAG,KAAK,SAAS,EAAE;4BAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACtC,4BAAA,YAAY,GAAG,OAAO,CAAC,gBAAgB,CACrC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,UAAU,EACV,KAAK,CAAC,CAAC,CACR;AACD,4BAAA,MAAM,MAAM,GAAiB;AAC3B,gCAAA,IAAI,EAAE,UAAU;gCAChB,OAAO,EAAE,KAAK,CAAC,CAAC;6BACjB;AACD,4BAAA,YAAY,CAAC,QAAQ,CAAC,GAAG,MAAM;wBACjC;6BAAO;AACL,4BAAA,YAAY,CAAC,QAAQ,CAAC,GAAG,KAAK;wBAChC;AACF,oBAAA,CAAC,CAAC;gBACJ;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,8BAAA,CAAgC,EACrD,CAAC,CACF;gBACH;YACF;;YAGA,IAAI,cAAc,GAAwB,EAAE;YAC5C,IAAI,WAAW,EAAE;AACf,gBAAA,IAAI;oBACF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;oBAC5C,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,GAAG,KAAI;wBACnC,cAAc,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC;AAChD,oBAAA,CAAC,CAAC;AACF,oBAAA,IAAI,CAAC,kBAAkB;AACrB,wBAAA,MAAM,wCAAwC;oBAChD,cAAc,CAAC,SAAS,GAAG,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC;gBAC7D;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,gCAAA,CAAkC,EACvD,CAAC,CACF;gBACH;YACF;AAEA,YAAA,IAAI,WAAwB;YAC5B,QAAQ,OAAO;AACb,gBAAA,KAAK,WAAW;oBACd,WAAW,GAAG,WAAW;oBACzB;AACF,gBAAA,KAAK,cAAc;oBACjB,WAAW,GAAG,cAAc;oBAC5B;AACF,gBAAA;oBACE,WAAW,GAAG,MAAM;;AAGxB,YAAA,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC;AACzC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;AACvB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE;AAElB,YAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAEvB,CAAC,YAAW;gBACV,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC5C,UAAU,EACV,aAAa,EACbD,qBAAmB,CACpB;AAED,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE;AAC9B,gBAAA,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;gBAE1B,IAAI,CAAC,YAAY,EAAE;AACjB,oBAAA,OAAO,CAAC,KAAK,CACX,oCAAoC,aAAa,CAAA,WAAA,CAAa,CAC/D;oBACD;gBACF;gBAEA,YAAY,GAAG,OAAO,CAAC,iBAAiB,CACtC,YAAY,EACZ,IAAI,EACJ,YAAY,CACb;AAED,gBAAA,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE;AAC/C,oBAAA,EAAE,EAAE,IAAI;oBACR,EAAE;oBACF,SAAS,EAAE,YAAY,CAAC,SAAS;oBACjC,eAAe,EAAE,YAAY,CAAC,eAAe;oBAC7C,WAAW;oBACX,SAAS;oBACT,aAAa,EACX,WAAW,KAAK;0BACZ,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc;AAChD,0BAAE,IAAI;oBACV,UAAU,EAAE,MAAM,CAAC,CAAC;AACrB,iBAAA,CAAC;YACJ,CAAC,GAAG;YAEJ,IAAI,CAAC,WAAW,CACd,OAAO,EACP,CAAC,OAA0C,KAAI;AAC7C,gBAAA,IAAI,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;oBAAE;gBAE5B,MAAM,KAAK,GAAwB,EAAE;AACrC,gBAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;oBAC/C,IAAI,GAAG,KAAK,GAAG;wBAAE;oBACjB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC;AAC7B,oBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;wBAChC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;oBAC9B;AACF,gBAAA,CAAC,CAAC;AAEF,gBAAA,YAAY,GAAG,OAAO,CAAC,iBAAiB,CACtC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,KAAK,CACN;AACH,YAAA,CAAC,CACF;YAED,IAAI,CAAC,WAAW,CACd,OAAO,EACP,CAAC,OAA0D,KAAI;AAC7D,gBAAA,IAAI,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;oBAAE;gBAE5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,gBAAA,IAAI,CAAC,UAAU;oBAAE;gBAEjB,YAAY,GAAG,OAAO,CAAC,YAAY,CACjC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,UAAU,EACV,OAAO,CAAC,CAAC,EACT,OAAO,CAAC,CAAC,CACV;AACH,YAAA,CAAC,CACF;QACH,CAAC;QAED,OAAO,GAAA;YACL,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5C,CAAC;QAED,SAAS,GAAA;YACP,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5C,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAChC,YAAA,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;KACF;AAED,IAAA,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE;AACnC;;AC3UM,SAAU,SAAS,CACvB,MAAoB,EACpB,OAA6B,EAAA;AAE7B,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,qBAAqB,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;IACtE;IAEA,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO;IAE7C,MAAM,SAAS,GAAG,OAAO,CACvB,MAAM,CAAC,EAAc,KACnB,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE;QACvD,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,MAAM,EAAE,OAAO,EAAE,MAA+C;AACjE,KAAA,CAAC,EACJ,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CACtE;AAED,IAAA,MAAM,WAAW,GAAG,OAAO,CACzB,MAAM,MAAM,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAQ,EACpE,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CACrC;AAED,IAAA,OAAO,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC,OAAc,CAAC;AAClF;;ACiCM,SAAU,OAAO,CACrB,IAAe,EACf,SAAuB,EAAA;;;;IAKvB,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACjD,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACrC,IAAA,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;AACnE,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC;;AAGvC,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM;;IAG5B,SAAS,CAAC,MAAK;QACb,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;AACpC,YAAA,eAAe,CAAC,OAAO,GAAG,CAAC;YAC3B,eAAe,CAAC,CAAC,CAAC;QACpB;IACF,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;;;AAI9B,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC;AACnC,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;AACvB,QAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;AAC9B,KAAA,CAAC;AAEF,IAAA,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE;AAC7C,QAAA,SAAS,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,EAAE,CAAC,CAAC;IACxD;AACA,IAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE;AACtD,QAAA,SAAS,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAS,EAAE,CAAC,CAAC;IAC9D;;AAGA,IAAA,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAC5C,IAAI,CAAC,MAAM,IAAI,EAAE,CAClB;;IAGD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC;;IAGpD,SAAS,CAAC,MAAK;AACb,QAAA,cAAc,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACzD,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;IAGjB,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,IAAY,EAAE,KAAU,KAAI;;AAExD,QAAA,UAAU,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;;AAGpE,QAAA,eAAe,CAAC,OAAO,IAAI,CAAC;AAC5B,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO;AAE1C,QAAA,cAAc,CAAC,CAAC,IAAI,KAAI;AACtB,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,GAAG,KAAK,EAAE;;YAGvC,eAAe,CAAC,UAAU,CAAC;;AAG3B,YAAA,IAAI,kBAAkB,CAAC,OAAO,GAAG,UAAU,EAAE;AAC3C,gBAAA,kBAAkB,CAAC,OAAO,GAAG,UAAU;gBAEvC,SAAS,GAAG,UAAU,EAAE;AACtB,oBAAA,KAAK,EAAE,UAAU;AACjB,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,EAAE,EAAE,UAAU;AACf,iBAAA,CAAC;YACJ;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;;AAGd,IAAA,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,IAAY,KAAgB;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAC/B,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC;AAE/B,QAAA,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE;QAErB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,EAAE;YACzC,OAAO;AACL,gBAAA,GAAG,IAAI;gBACP,OAAO,EAAE,CAAC,CAAC,KAAK;AAChB,gBAAA,KAAK,EAAE,SAAgB;AACvB,gBAAA,QAAQ,EAAE,CAAC,CAAC,KACV,QAAQ,CAAC,IAAI,EAAG,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC;aACzD;QACH;QAEA,OAAO;AACL,YAAA,GAAG,IAAI;YACP,KAAK,EAAE,KAAK,IAAI,EAAE;AAClB,YAAA,QAAQ,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChD;IACH,CAAC,EACD,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CACtC;IAED,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,IAAY,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAC1C,CAAC,IAAI,CAAC,MAAM,CAAC,CACd;IAED,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,IAAY,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAChD,CAAC,MAAM,CAAC,QAAQ,CAAC,CAClB;IAED,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,IAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EACxC,CAAC,OAAO,CAAC,CACV;;AAGD,IAAA,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,CAAmB,KAAI;QACtB,CAAC,EAAE,cAAc,EAAE;;AAGnB,QAAA,eAAe,CAAC,OAAO,IAAI,CAAC;AAC5B,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO;QAC1C,eAAe,CAAC,UAAU,CAAC;;AAG3B,QAAA,IAAI,kBAAkB,CAAC,OAAO,GAAG,UAAU,EAAE;AAC3C,YAAA,kBAAkB,CAAC,OAAO,GAAG,UAAU;YAEvC,SAAS,GAAG,UAAU,EAAE;AACtB,gBAAA,KAAK,EAAE,QAAQ;AACf,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,EAAE,EAAE,UAAU;AACf,aAAA,CAAC;QACJ;AACF,IAAA,CAAC,EACD,CAAC,WAAW,EAAE,QAAQ,CAAC,CACxB;AAED,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,MAAK;AAC7B,QAAA,cAAc,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACjC,UAAU,CAAC,EAAE,CAAC;;QAEd,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC;AAC3C,QAAA,eAAe,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;;;AAI/B,IAAA,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa;;;;;AAM9C,IAAA,MAAM,OAAO,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IAErD,OAAO;AACL,QAAA,MAAM,EAAE,WAAW;AACnB,QAAA,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO;QACP,aAAa;QACb,QAAQ;QACR,UAAU;QACV,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,KAAK;QACL,SAAS;QACT,OAAO;QACP,YAAY;QACZ,aAAa;KACd;AACH;;;;"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/types.ts","../src/context.ts","../src/PortalIslandsRenderer.tsx","../src/IndividualIslandRenderer.tsx","../src/islandsManager.ts","../src/createHooks.ts","../src/useStream.ts","../src/useForm.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import { createContext } from \"react\";\nimport type { IslandStoreAccess } from \"./types\";\n\nexport interface IslandContext {\n id: string;\n storeAccess: IslandStoreAccess;\n}\n\nexport const IslandContextProvider = createContext<IslandContext | null>(null);\n","import React, { useRef, memo, useSyncExternalStore, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type {\n IslandData,\n SharedIslandsRendererProps,\n IslandStoreAccess,\n} from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nconst PortalIsland = memo(\n ({\n data,\n storeAccess,\n }: {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n }) => {\n const {\n Component,\n ContextProvider,\n id,\n pushEvent,\n ssrStrategy,\n el,\n globalKeys,\n } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n const contextValue = useMemo(\n () => ({ id, storeAccess }),\n [id, storeAccess]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => null\n );\n\n const allGlobals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n () => null\n );\n\n const didClearRef = useRef(false);\n if (ssrStrategy === \"overwrite\" && !didClearRef.current) {\n el.innerHTML = \"\";\n didClearRef.current = true;\n }\n\n if (!allGlobals) {\n console.log(\"[PortalIsland] Waiting for globals\", id);\n return null;\n }\n\n console.log(\"[PortalIsland] Rendering\", { id, allGlobals });\n\n const relevantGlobals: Record<string, any> = {};\n if (allGlobals) {\n globalKeys.forEach((key) => {\n if (key in allGlobals) {\n relevantGlobals[key] = allGlobals[key];\n }\n });\n }\n\n const mergedProps = { ...relevantGlobals, ...currentProps };\n\n const islandNode = (\n <MemoizedComponent {...mergedProps} id={id} pushEvent={pushEvent} />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n const content = MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n\n return createPortal(content, el);\n }\n);\nPortalIsland.displayName = \"[ReactLiveIslands]PortalIsland\";\n\nexport const PortalIslandsRenderer: React.FC<SharedIslandsRendererProps> = ({\n storeAccess,\n}) => {\n const sharedIslandsObj = useSyncExternalStore(\n storeAccess.subscribeToSharedIslands,\n storeAccess.getSharedIslands\n );\n\n const islands = Object.values(sharedIslandsObj);\n\n console.log(\n \"[PortalIslandsRenderer] Rendering islands:\",\n islands.map((d) => d.id)\n );\n\n return (\n <>\n {islands.map((data) => (\n <PortalIsland key={data.id} data={data} storeAccess={storeAccess} />\n ))}\n </>\n );\n};\nPortalIslandsRenderer.displayName = \"[ReactLiveIslands]PortalIslandsRenderer\";\n","import React, { useSyncExternalStore, memo, useMemo } from \"react\";\nimport type { IndividualIslandsRendererProps } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport const IndividualIslandRenderer: React.FC<\n IndividualIslandsRendererProps\n> = ({ data, storeAccess }) => {\n const { Component, ContextProvider, id, pushEvent, globalKeys } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => data.hydrationData?.props\n );\n\n // Check once if hydration globals version matches store version\n const serverGlobalsSnapshot = useMemo(() => {\n const hydrationGlobals = data.hydrationData?.globals;\n if (!hydrationGlobals) return () => hydrationGlobals;\n let comparedVersions = false;\n let useStoreReference = false;\n return () => {\n if (!comparedVersions) {\n comparedVersions = true;\n const storeGlobals = storeAccess.getGlobals();\n const hydrationVersion = hydrationGlobals.__version ?? -1;\n const storeVersion = storeGlobals?.__version ?? -1;\n useStoreReference = storeVersion === hydrationVersion;\n }\n return useStoreReference ? storeAccess.getGlobals() : hydrationGlobals;\n };\n }, [data.hydrationData?.globals, storeAccess]);\n\n const globals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n serverGlobalsSnapshot\n );\n\n const filteredGlobals: Record<string, any> = {};\n if (globals) {\n globalKeys.forEach((key) => {\n if (key in globals) {\n filteredGlobals[key] = globals[key];\n }\n });\n }\n\n const contextValue = useMemo(() => ({ id, storeAccess }), [id, storeAccess]);\n\n const islandNode = (\n <MemoizedComponent\n {...filteredGlobals}\n {...currentProps}\n id={id}\n pushEvent={pushEvent}\n />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n return MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n};\n\nIndividualIslandRenderer.displayName =\n \"[ReactLiveIslands] IndividualIslandRenderer\";\n","import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\n\nimport {\n ContextProviderComponent,\n IslandData,\n SharedIslandsRendererComponent,\n IndividualIslandsRendererComponent,\n IslandStoreAccess,\n IndividualIslandsRendererProps,\n StreamAction,\n StreamConfig,\n} from \"./types\";\nimport { PortalIslandsRenderer } from \"./PortalIslandsRenderer\";\nimport { IndividualIslandRenderer } from \"./IndividualIslandRenderer\";\n\n// Constant root ID - one shared root per application\nexport const SHARED_ROOT_ID = \"__live_react_islands_shared_root__\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ManagerState {\n propsStore: Map<string, Record<string, any>>;\n propsListeners: Set<() => void>;\n globalsRef: React.MutableRefObject<Record<string, any> | null>;\n globalsListeners: Set<() => void>;\n sharedIslandsRef: React.MutableRefObject<Record<string, IslandData>>;\n sharedIslandsListeners: Set<() => void>;\n streamsStore: Map<string, any[]>;\n streamsListeners: Map<string, Set<() => void>>;\n streamConfigs: Map<string, StreamConfig>;\n roots: Record<string, any>;\n storeAccess: IslandStoreAccess;\n}\n\nexport interface Manager {\n initialize: (params: {\n SharedContextProvider?: ContextProviderComponent;\n SharedIslandsRenderer?: SharedIslandsRendererComponent;\n }) => ManagerState;\n mountIsland: (\n state: ManagerState,\n data: IslandData,\n IslandRenderer?: IndividualIslandsRendererComponent\n ) => ManagerState;\n unmountIsland: (state: ManagerState, id: string) => ManagerState;\n updateIslandProps: (\n state: ManagerState,\n islandId: string,\n props: Record<string, any>\n ) => ManagerState;\n updateGlobals: (\n state: ManagerState,\n globals: Record<string, any>\n ) => ManagerState;\n resetGlobals: (state: ManagerState) => ManagerState;\n initializeStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n initialItems: any[]\n ) => ManagerState;\n updateStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n action: StreamAction,\n data: any\n ) => ManagerState;\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n\nconst withSharedRootName = (\n ContextProvider: ContextProviderComponent\n): ContextProviderComponent => {\n const originalName =\n ContextProvider.displayName || ContextProvider.name || \"ContextProvider\";\n\n function NamedWrapper({ children }: { children: React.ReactNode }) {\n return React.createElement(ContextProvider, null, children);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] SharedRoot(${originalName})`;\n return NamedWrapper;\n};\n\nconst withIndividualRootName = (\n islandId: string,\n IslandRenderer: IndividualIslandsRendererComponent\n): IndividualIslandsRendererComponent => {\n const originalName = IslandRenderer.displayName;\n\n function NamedWrapper(props: IndividualIslandsRendererProps) {\n return React.createElement(IslandRenderer, props);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] HydratedRoot#${islandId}`;\n return NamedWrapper;\n};\n\nconst getOrCreateSharedRootElement = (): HTMLElement => {\n let rootElement = document.getElementById(SHARED_ROOT_ID);\n if (!rootElement) {\n rootElement = document.createElement(\"div\");\n rootElement.id = SHARED_ROOT_ID;\n rootElement.style.display = \"none\";\n document.body.appendChild(rootElement);\n }\n return rootElement;\n};\n\nconst mountSharedIsland = (\n state: ManagerState,\n data: IslandData\n): ManagerState => {\n state.sharedIslandsRef.current = {\n ...state.sharedIslandsRef.current,\n [data.id]: data,\n };\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n};\n\nconst mountIndividualIsland = (\n state: ManagerState,\n data: IslandData,\n IslandRenderer: IndividualIslandsRendererComponent\n): ManagerState => {\n const NamedIslandRenderer = withIndividualRootName(data.id, IslandRenderer);\n const root = ReactDOM.hydrateRoot(\n data.el,\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(NamedIslandRenderer, {\n data,\n storeAccess: state.storeAccess,\n })\n )\n );\n\n return {\n ...state,\n roots: { ...state.roots, [data.id]: root },\n };\n};\n\n// ============================================================================\n// Island Manager (Bridge between LiveView hook lifecycles and React rendering)\n// ============================================================================\n\nconst ManagerObj: Manager = {\n initialize: ({\n SharedContextProvider = NullContextProvider,\n SharedIslandsRenderer = PortalIslandsRenderer,\n }) => {\n const rootElement = getOrCreateSharedRootElement();\n const root = ReactDOM.createRoot(rootElement);\n\n const propsStore = new Map<string, Record<string, any>>();\n const propsListeners = new Set<() => void>();\n const globalsRef = { current: null as Record<string, any> | null };\n const globalsListeners = new Set<() => void>();\n const sharedIslandsRef = { current: {} as Record<string, IslandData> };\n const sharedIslandsListeners = new Set<() => void>();\n const streamsStore = new Map<string, any[]>();\n const streamsListeners = new Map<string, Set<() => void>>();\n const streamConfigs = new Map<string, StreamConfig>();\n\n const getStreamKey = (islandId: string, streamName: string) =>\n `${islandId}:${streamName}`;\n\n const storeAccess: IslandStoreAccess = {\n getProps: (islandId: string) => propsStore.get(islandId) || null,\n subscribeToProps: (cb: () => void) => {\n propsListeners.add(cb);\n return () => propsListeners.delete(cb);\n },\n getGlobals: () => globalsRef.current,\n subscribeToGlobals: (cb: () => void) => {\n globalsListeners.add(cb);\n return () => globalsListeners.delete(cb);\n },\n getSharedIslands: () => sharedIslandsRef.current,\n subscribeToSharedIslands: (cb: () => void) => {\n sharedIslandsListeners.add(cb);\n return () => sharedIslandsListeners.delete(cb);\n },\n getStreamItems: (islandId: string, streamName: string) => {\n const key = getStreamKey(islandId, streamName);\n return streamsStore.get(key) || [];\n },\n subscribeToStream: (\n islandId: string,\n streamName: string,\n cb: () => void,\n config?: StreamConfig\n ) => {\n const key = getStreamKey(islandId, streamName);\n if (config) {\n streamConfigs.set(key, config);\n }\n if (!streamsListeners.has(key)) {\n streamsListeners.set(key, new Set());\n }\n streamsListeners.get(key)!.add(cb);\n return () => {\n streamsListeners.get(key)?.delete(cb);\n if (streamsListeners.get(key)?.size === 0) {\n streamConfigs.delete(key);\n }\n };\n },\n };\n\n const state: ManagerState = {\n propsStore,\n globalsRef,\n propsListeners,\n globalsListeners,\n sharedIslandsRef,\n sharedIslandsListeners,\n streamsStore,\n streamsListeners,\n streamConfigs,\n roots: { [SHARED_ROOT_ID]: root },\n storeAccess,\n };\n\n const NamedSharedContextProvider = withSharedRootName(\n SharedContextProvider\n );\n\n root.render(\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(\n NamedSharedContextProvider,\n null,\n React.createElement(SharedIslandsRenderer, {\n storeAccess: state.storeAccess,\n })\n )\n )\n );\n\n return state;\n },\n mountIsland: (state, data, IslandRenderer = IndividualIslandRenderer) => {\n switch (data.ssrStrategy) {\n case \"hydrate_root\":\n return mountIndividualIsland(state, data, IslandRenderer);\n default:\n return mountSharedIsland(state, data);\n }\n },\n unmountIsland: (state, id) => {\n state.propsStore.delete(id);\n\n const streamPrefix = `${id}:`;\n for (const key of state.streamsStore.keys()) {\n if (key.startsWith(streamPrefix)) {\n state.streamsStore.delete(key);\n state.streamsListeners.delete(key);\n state.streamConfigs.delete(key);\n }\n }\n\n if (state.roots[id]) {\n state.roots[id].unmount();\n const { [id]: removedRoot, ...remainingRoots } = state.roots;\n return {\n ...state,\n roots: remainingRoots,\n };\n } else {\n const { [id]: removed, ...remaining } = state.sharedIslandsRef.current;\n state.sharedIslandsRef.current = remaining;\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n }\n },\n updateIslandProps: (state, islandId, props) => {\n const existing = state.propsStore.get(islandId) || {};\n state.propsStore.set(islandId, { ...existing, ...props });\n state.propsListeners.forEach((cb) => cb());\n return state;\n },\n updateGlobals: (state, globals) => {\n const incomingVersion = globals.__version ?? -1;\n const storeVersion = state.globalsRef.current?.__version ?? -1;\n if (incomingVersion > storeVersion) {\n state.globalsRef.current = {\n ...(state.globalsRef.current || {}),\n ...globals,\n };\n state.globalsListeners.forEach((cb) => cb());\n }\n\n return state;\n },\n resetGlobals: (state) => {\n state.globalsRef.current = null;\n return state;\n },\n initializeStream: (state, islandId, streamName, initialItems) => {\n const key = `${islandId}:${streamName}`;\n state.streamsStore.set(key, [...initialItems]);\n return state;\n },\n updateStream: (state, islandId, streamName, action, data) => {\n const key = `${islandId}:${streamName}`;\n let items = state.streamsStore.get(key) || [];\n const config = state.streamConfigs.get(key);\n\n switch (action) {\n case StreamAction.Insert:\n items = [data, ...items];\n break;\n case StreamAction.Update:\n const idx = items.findIndex((item) => item.id === data.id);\n if (idx !== -1) {\n items = [...items];\n items[idx] = { ...items[idx], ...data };\n }\n break;\n case StreamAction.Delete:\n items = items.filter((item) => item.id !== data);\n break;\n case StreamAction.Reset:\n items = [];\n break;\n }\n\n if (config?.capper) {\n items = config.capper(items);\n } else if (config?.limit !== undefined && items.length > config.limit) {\n items = items.slice(0, config.limit);\n }\n\n state.streamsStore.set(key, items);\n state.streamsListeners.get(key)?.forEach((cb) => cb());\n return state;\n },\n};\nexport default ManagerObj;\n","import IslandsManager, { Manager } from \"./islandsManager\";\nimport {\n type IslandsMap,\n type SSRStrategy,\n type PushEventFn,\n type ContextProviderComponent,\n type IslandComponent,\n type LazyIslandFactory,\n type StreamHandle,\n NullContextProvider,\n StreamAction,\n} from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface LiveViewHook {\n el: HTMLElement;\n liveSocket: {\n on: (\n event: string,\n callback: (e: CustomEvent<{ kind: string }>) => void\n ) => void;\n };\n pushEvent: (\n event: string,\n payload: any,\n callback?: (reply: any, ref: any) => void\n ) => void;\n pushEventTo: (target: string, event: string, payload: any) => void;\n handleEvent: (event: string, callback: (data: any) => void) => void;\n}\n\nexport interface CreateHooksOptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n manager?: Manager;\n}\n\n// ============================================================================\n// Event Handler Adapter\n// ============================================================================\n\nfunction createPushEventFn(hook: LiveViewHook): PushEventFn {\n return (eventName: string, payload: any) => {\n hook.pushEventTo(`#${hook.el.id}`, eventName, payload);\n };\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst resolvedComponentsCache = new Map<string, IslandComponent>();\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n // Check if it's a React component (has prototype.isReactComponent for class components)\n if ((value as any).prototype?.isReactComponent) return false;\n // Check if it's a config object getter (would have Component property)\n if ((value as any).Component) return false;\n // Assume zero-arg functions that aren't class components are lazy factories\n return value.length === 0;\n};\n\nconst resolveIslandConfig = async (\n islandsMap: IslandsMap,\n componentName: string,\n defaultContextProvider: ContextProviderComponent\n): Promise<{\n Component: IslandComponent;\n ContextProvider: ContextProviderComponent;\n} | null> => {\n const config = islandsMap[componentName];\n\n if (!config) {\n return null;\n }\n\n // Check cache first for lazy-loaded components\n const cached = resolvedComponentsCache.get(componentName);\n if (cached) {\n return { Component: cached, ContextProvider: defaultContextProvider };\n }\n\n // Handle lazy factory: () => import(\"./Component\")\n if (isLazyFactory(config)) {\n const mod = await config();\n const Component = mod.default;\n resolvedComponentsCache.set(componentName, Component);\n return { Component, ContextProvider: defaultContextProvider };\n }\n\n // Handle direct component\n if (typeof config === \"function\") {\n return { Component: config, ContextProvider: defaultContextProvider };\n }\n\n // Handle config object\n return {\n Component: config.Component,\n ContextProvider: config.ContextProvider || defaultContextProvider,\n };\n};\n\n// ============================================================================\n// Main Hook Factory (LiveView Adapter Layer)\n// ============================================================================\n\nexport function createHooks({\n islands: islandsMap = {},\n SharedContextProvider = NullContextProvider,\n manager = IslandsManager,\n}: CreateHooksOptions) {\n console.log(`[LiveReactIslands] Creating hooks`);\n let managerState = manager.initialize({ SharedContextProvider });\n\n let globalsRequested = false;\n const pendingMounts = new Set<string>();\n let navigationListenerAttached = false;\n\n const Hook: Partial<LiveViewHook> & {\n mounted: (this: LiveViewHook) => void;\n updated?: (this: LiveViewHook) => void;\n destroyed: (this: LiveViewHook) => void;\n } = {\n mounted(this: LiveViewHook) {\n console.log(\"[Hook] Mount:\", this.el.id);\n if (!this.el.id) {\n console.error(`[LiveReactIslands] Island element missing unique id`);\n return;\n }\n\n if (!navigationListenerAttached) {\n navigationListenerAttached = true;\n this.liveSocket.on(\"phx:page-loading-start\", (e) => {\n // Patches (e.g. push_patch tab switches) stay within the same\n // LiveView mount and globals version counter, so islands that\n // remain mounted through the patch must keep their cached\n // globals. Only a real navigation (new mount, version resets\n // to 0 server-side) needs the stale client-side version cleared.\n if (e.detail?.kind === \"patch\") return;\n globalsRequested = false;\n managerState = manager.resetGlobals(managerState);\n });\n }\n\n // Pull globals once on first island mount\n if (!globalsRequested) {\n globalsRequested = true;\n this.handleEvent(\"lri-g\", (data) => {\n managerState = manager.updateGlobals(managerState, data);\n });\n this.pushEvent(\"lri-g\", {}, (reply) => {\n managerState = manager.updateGlobals(managerState, reply);\n });\n }\n\n const {\n comp: componentName,\n ssr: ssrData,\n props: propsData,\n schema: schemaData,\n globals: globalsData,\n globalsVersion: globalsVersionData,\n } = this.el.dataset;\n if (!componentName) {\n console.error(\n `[LiveReactIslands] Element '${this.el.id}' missing data-comp attribute`\n );\n return;\n }\n\n let schema: { p: string[]; g: string[]; i: number } = {\n p: [],\n g: [],\n i: 0,\n };\n if (schemaData) {\n try {\n schema = JSON.parse(schemaData);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-schema:`,\n e\n );\n }\n }\n\n let initialProps: Record<string, any> = {};\n if (propsData) {\n try {\n const propsArray = JSON.parse(propsData);\n schema.p.forEach((propName, idx) => {\n const value = propsArray[idx];\n if (value?.__s !== undefined) {\n const streamName = schema.p[value.__s];\n managerState = manager.initializeStream(\n managerState,\n this.el.id,\n streamName,\n value.i\n );\n const handle: StreamHandle = {\n name: streamName,\n initial: value.i,\n };\n initialProps[propName] = handle;\n } else {\n initialProps[propName] = value;\n }\n });\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-props:`,\n e\n );\n }\n }\n\n // Only for hydrate_root strategy\n let initialGlobals: Record<string, any> = {};\n if (globalsData) {\n try {\n const globalsArray = JSON.parse(globalsData);\n schema.g.forEach((globalName, idx) => {\n initialGlobals[globalName] = globalsArray[idx];\n });\n if (!globalsVersionData)\n throw \"Missing data-globals-version attribute\";\n initialGlobals.__version = parseInt(globalsVersionData, 10);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-globals:`,\n e\n );\n }\n }\n\n let ssrStrategy: SSRStrategy;\n switch (ssrData) {\n case \"overwrite\":\n ssrStrategy = \"overwrite\";\n break;\n case \"hydrate_root\":\n ssrStrategy = \"hydrate_root\";\n break;\n default:\n ssrStrategy = \"none\";\n }\n\n const pushEvent = createPushEventFn(this);\n const elId = this.el.id;\n const el = this.el;\n\n pendingMounts.add(elId);\n\n (async () => {\n const islandConfig = await resolveIslandConfig(\n islandsMap,\n componentName,\n NullContextProvider\n );\n\n if (!pendingMounts.has(elId)) return;\n pendingMounts.delete(elId);\n\n if (!islandConfig) {\n console.error(\n `[LiveReactIslands] React island '${componentName}' not found`\n );\n return;\n }\n\n managerState = manager.updateIslandProps(\n managerState,\n elId,\n initialProps\n );\n\n managerState = manager.mountIsland(managerState, {\n id: elId,\n el,\n Component: islandConfig.Component,\n ContextProvider: islandConfig.ContextProvider,\n ssrStrategy,\n pushEvent,\n hydrationData:\n ssrStrategy === \"hydrate_root\"\n ? { props: initialProps, globals: initialGlobals }\n : null,\n globalKeys: schema.g,\n });\n })();\n\n this.handleEvent(\n \"lri-p\",\n (payload: { i: number; [key: number]: any }) => {\n if (payload.i !== schema.i) return;\n\n const props: Record<string, any> = {};\n Object.entries(payload).forEach(([key, value]) => {\n if (key === \"i\") return;\n const idx = parseInt(key, 10);\n if (!isNaN(idx) && schema.p[idx]) {\n props[schema.p[idx]] = value;\n }\n });\n\n managerState = manager.updateIslandProps(\n managerState,\n this.el.id,\n props\n );\n }\n );\n\n this.handleEvent(\n \"lri-s\",\n (payload: { s: number; a: StreamAction; d: any; i: number }) => {\n if (payload.i !== schema.i) return;\n\n const streamName = schema.p[payload.s];\n if (!streamName) return;\n\n managerState = manager.updateStream(\n managerState,\n this.el.id,\n streamName,\n payload.a,\n payload.d\n );\n }\n );\n },\n\n updated(this: LiveViewHook) {\n console.log(\"[Hook] Updated:\", this.el.id);\n },\n\n destroyed(this: LiveViewHook) {\n console.log(\"[Hook] Destroyed:\", this.el.id);\n pendingMounts.delete(this.el.id);\n managerState = manager.unmountIsland(managerState, this.el.id);\n },\n };\n\n return { LiveReactIslands: Hook };\n}\n","import { useContext, useSyncExternalStore, useMemo } from \"react\";\nimport type { StreamHandle } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport interface UseStreamOptions<T> {\n limit?: number;\n capper?: (items: T[]) => T[];\n}\n\nexport function useStream<T extends { id: string | number }>(\n handle: StreamHandle,\n options?: UseStreamOptions<T>\n): T[] {\n const context = useContext(IslandContextProvider);\n if (!context) {\n throw new Error(\"useStream must be used within an Island component\");\n }\n\n const { id: islandId, storeAccess } = context;\n\n const subscribe = useMemo(\n () => (cb: () => void) =>\n storeAccess.subscribeToStream(islandId, handle.name, cb, {\n limit: options?.limit,\n capper: options?.capper as ((items: any[]) => any[]) | undefined,\n }),\n [storeAccess, islandId, handle.name, options?.limit, options?.capper]\n );\n\n const getSnapshot = useMemo(\n () => () => storeAccess.getStreamItems(islandId, handle.name) as T[],\n [storeAccess, islandId, handle.name]\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, () => handle.initial as T[]);\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\n\nexport interface FormProps {\n /** Internal: prop name for event routing (set by server) */\n __prop?: string;\n types?: Record<string, string>;\n required?: string[];\n values: Record<string, any>;\n errors: Record<string, string[]>;\n isValid?: boolean;\n version?: number;\n}\n\nexport type PushEventFn = (event: string, payload: Record<string, any>) => void;\n\nexport interface FieldProps {\n name: string;\n value: any;\n checked?: boolean;\n onChange: (\n e: React.ChangeEvent<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >\n ) => void;\n}\n\nexport interface UseFormReturn {\n /** Current form field values */\n values: Record<string, any>;\n /** Current form errors by field name */\n errors: Record<string, string[]>;\n /** Field types from schema */\n types: Record<string, string>;\n /** Required field names */\n required: string[];\n /** Field names that have been modified by the user */\n touched: string[];\n /** Get props to spread on an input element */\n getFieldProps: (name: string) => FieldProps;\n /** Get the first error message for a field */\n getError: (name: string) => string | undefined;\n /** Check if a field is required */\n isRequired: (name: string) => boolean;\n /** Check if a field has been modified by the user */\n isTouched: (name: string) => boolean;\n /** Set a field value programmatically */\n setField: (name: string, value: any) => void;\n /** Handle form submission */\n handleSubmit: (e?: React.FormEvent) => void;\n /** Reset form to server values */\n reset: () => void;\n /**\n * True when the server hasn't acknowledged the latest client changes.\n * Use this to show a syncing indicator (e.g., spinner, \"Validating...\").\n */\n isSyncing: boolean;\n /**\n * True only when form is valid AND fully synced with server.\n * Use this to enable/disable the submit button.\n * This is the \"Validation Lock\" - users cannot submit until server confirms validity.\n */\n isValid: boolean;\n /** Current local version counter */\n localVersion: number;\n /** Last acknowledged server version */\n serverVersion: number;\n}\n\nexport function useForm(\n form: FormProps,\n pushEvent?: PushEventFn\n): UseFormReturn {\n // 1. Version Tracking\n // Local version increments on each field change\n // Server version comes from form.version prop\n const localVersionRef = useRef(form.version ?? 0);\n const lastSentVersionRef = useRef(0); // Prevents duplicate sends in StrictMode\n const [localVersion, setLocalVersion] = useState(form.version ?? 0);\n const serverVersion = form.version ?? 0;\n\n // Prop name comes from server (embedded in form data)\n const propName = form.__prop;\n\n // Reset local version when server sends a reset (version 0 with new schema)\n useEffect(() => {\n if (form.version === 0 && form.types) {\n localVersionRef.current = 0;\n setLocalVersion(0);\n }\n }, [form.version, form.types]);\n\n // 3. Persistent Schema\n // We only update these when the server explicitly sends them (usually on init)\n const [schema, setSchema] = useState({\n types: form.types ?? {},\n required: form.required ?? [],\n });\n\n if (form.types && form.types !== schema.types) {\n setSchema((prev) => ({ ...prev, types: form.types! }));\n }\n if (form.required && form.required !== schema.required) {\n setSchema((prev) => ({ ...prev, required: form.required! }));\n }\n\n // 4. Values Management\n const [localValues, setLocalValues] = useState<Record<string, any>>(\n form.values ?? {}\n );\n\n // 5. Touched Tracking (client-side only)\n const [touched, setTouched] = useState<string[]>([]);\n\n // Sync from server: Update local values when server sends updates\n useEffect(() => {\n setLocalValues((prev) => ({ ...prev, ...form.values }));\n }, [form.values]);\n\n // 6. Versioned Change Handler\n const setField = useCallback((name: string, value: any) => {\n // Mark field as touched\n setTouched((prev) => (prev.includes(name) ? prev : [...prev, name]));\n\n // Increment version BEFORE state update to avoid StrictMode double-increment\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n\n setLocalValues((prev) => {\n const next = { ...prev, [name]: value };\n\n // Update version state (will be batched with values update)\n setLocalVersion(newVersion);\n\n // Only send event once per version (prevents duplicate sends in StrictMode)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"validate\",\n prop: propName,\n attrs: next,\n _v: newVersion,\n });\n }\n\n return next;\n });\n }, [propName]);\n\n // 6. Identity-Stable Field Props\n const getFieldProps = useCallback(\n (name: string): FieldProps => {\n const type = schema.types[name];\n const value = localValues[name];\n\n const base = { name };\n\n if (type === \"boolean\" || type === \"bool\") {\n return {\n ...base,\n checked: !!value,\n value: undefined as any,\n onChange: (e) =>\n setField(name, (e.target as HTMLInputElement).checked),\n };\n }\n\n return {\n ...base,\n value: value ?? \"\",\n onChange: (e) => setField(name, e.target.value),\n };\n },\n [localValues, schema.types, setField]\n );\n\n const getError = useCallback(\n (name: string) => form.errors?.[name]?.[0],\n [form.errors]\n );\n\n const isRequired = useCallback(\n (name: string) => schema.required.includes(name),\n [schema.required]\n );\n\n const isTouched = useCallback(\n (name: string) => touched.includes(name),\n [touched]\n );\n\n // 7. Versioned Submit Handler\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n\n // Increment version for submit as well\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n setLocalVersion(newVersion);\n\n // Only send once (prevents duplicate sends if called twice)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"submit\",\n prop: propName,\n attrs: localValues,\n _v: newVersion,\n });\n }\n },\n [localValues, propName]\n );\n\n const reset = useCallback(() => {\n setLocalValues(form.values ?? {});\n setTouched([]);\n // Reset local version to match server\n localVersionRef.current = form.version ?? 0;\n setLocalVersion(form.version ?? 0);\n }, [form.values, form.version]);\n\n // 8. Derived States - The \"Validation Lock\"\n // isSyncing: True when client has sent changes that server hasn't acknowledged\n const isSyncing = localVersion > serverVersion;\n\n // isValid: True only when:\n // 1. Form is in sync (server has seen all changes)\n // 2. Server says the form is valid\n // This ensures users cannot submit until server validates the latest data\n const isValid = !isSyncing && (form.isValid ?? false);\n\n return {\n values: localValues,\n errors: form.errors ?? {},\n types: schema.types,\n required: schema.required,\n touched,\n getFieldProps,\n getError,\n isRequired,\n isTouched,\n setField,\n handleSubmit,\n reset,\n isSyncing,\n isValid,\n localVersion,\n serverVersion,\n };\n}\n"],"names":["NullContextProvider","IslandsManager"],"mappings":";;;;AAiDA,IAAY,YAKX;AALD,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,GAAW;AACb,CAAC,EALW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;AAuCjB,MAAMA,qBAAmB,GAA4C,CAAC,EAC3E,QAAQ,GACT,KAAK,QAAQ;;AClFP,MAAM,qBAAqB,GAAG,aAAa,CAAuB,IAAI,CAAC;;ACC9E,MAAM,YAAY,GAAG,IAAI,CACvB,CAAC,EACC,IAAI,EACJ,WAAW,GAIZ,KAAI;AACH,IAAA,MAAM,EACJ,SAAS,EACT,eAAe,EACf,EAAE,EACF,SAAS,EACT,WAAW,EACX,EAAE,EACF,UAAU,GACX,GAAG,IAAI;AAER,IAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,uBAAuB,GAAG,OAAO,CACrC,OAAO,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,EACtD,CAAC,eAAe,CAAC,CAClB;IACD,MAAM,YAAY,GAAG,OAAO,CAC1B,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAC3B,CAAC,EAAE,EAAE,WAAW,CAAC,CAClB;IAED,MAAM,YAAY,GAAG,oBAAoB,CACvC,WAAW,CAAC,gBAAgB,EAC5B,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAC9B,MAAM,IAAI,CACX;AAED,IAAA,MAAM,UAAU,GAAG,oBAAoB,CACrC,WAAW,CAAC,kBAAkB,EAC9B,WAAW,CAAC,UAAU,EACtB,MAAM,IAAI,CACX;AAED,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IACjC,IAAI,WAAW,KAAK,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AACvD,QAAA,EAAE,CAAC,SAAS,GAAG,EAAE;AACjB,QAAA,WAAW,CAAC,OAAO,GAAG,IAAI;IAC5B;IAEA,IAAI,CAAC,UAAU,EAAE;AACf,QAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,EAAE,CAAC;AACrD,QAAA,OAAO,IAAI;IACb;IAEA,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;IAE3D,MAAM,eAAe,GAAwB,EAAE;IAC/C,IAAI,UAAU,EAAE;AACd,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACzB,YAAA,IAAI,GAAG,IAAI,UAAU,EAAE;gBACrB,eAAe,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC;YACxC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,WAAW,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,YAAY,EAAE;AAE3D,IAAA,MAAM,UAAU,IACd,KAAA,CAAA,aAAA,CAAC,iBAAiB,OAAK,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAA,CAAI,CACrE;AAED,IAAA,MAAM,WAAW,IACf,KAAA,CAAA,aAAA,CAAC,qBAAqB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,EAChD,UAAU,CACoB,CAClC;AAED,IAAA,MAAM,OAAO,GAAG,uBAAuB,IACrC,KAAA,CAAA,aAAA,CAAC,uBAAuB,QAAE,WAAW,CAA2B,KAEhE,WAAW,CACZ;AAED,IAAA,OAAO,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;AAClC,CAAC,CACF;AACD,YAAY,CAAC,WAAW,GAAG,gCAAgC;AAEpD,MAAM,qBAAqB,GAAyC,CAAC,EAC1E,WAAW,GACZ,KAAI;AACH,IAAA,MAAM,gBAAgB,GAAG,oBAAoB,CAC3C,WAAW,CAAC,wBAAwB,EACpC,WAAW,CAAC,gBAAgB,CAC7B;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;AAE/C,IAAA,OAAO,CAAC,GAAG,CACT,4CAA4C,EAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CACzB;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,MAChB,KAAA,CAAA,aAAA,CAAC,YAAY,EAAA,EAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAA,CAAI,CACrE,CAAC,CACD;AAEP,CAAC;AACD,qBAAqB,CAAC,WAAW,GAAG,yCAAyC;;ACjHtE,MAAM,wBAAwB,GAEjC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAI;AAC5B,IAAA,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI;AAEtE,IAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,uBAAuB,GAAG,OAAO,CACrC,OAAO,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,EACtD,CAAC,eAAe,CAAC,CAClB;IAED,MAAM,YAAY,GAAG,oBAAoB,CACvC,WAAW,CAAC,gBAAgB,EAC5B,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAC9B,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,CAChC;;AAGD,IAAA,MAAM,qBAAqB,GAAG,OAAO,CAAC,MAAK;AACzC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO;AACpD,QAAA,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,MAAM,gBAAgB;QACpD,IAAI,gBAAgB,GAAG,KAAK;QAC5B,IAAI,iBAAiB,GAAG,KAAK;AAC7B,QAAA,OAAO,MAAK;YACV,IAAI,CAAC,gBAAgB,EAAE;gBACrB,gBAAgB,GAAG,IAAI;AACvB,gBAAA,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,EAAE;gBAC7C,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,SAAS,IAAI,EAAE;gBACzD,MAAM,YAAY,GAAG,YAAY,EAAE,SAAS,IAAI,EAAE;AAClD,gBAAA,iBAAiB,GAAG,YAAY,KAAK,gBAAgB;YACvD;AACA,YAAA,OAAO,iBAAiB,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,gBAAgB;AACxE,QAAA,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAE9C,IAAA,MAAM,OAAO,GAAG,oBAAoB,CAClC,WAAW,CAAC,kBAAkB,EAC9B,WAAW,CAAC,UAAU,EACtB,qBAAqB,CACtB;IAED,MAAM,eAAe,GAAwB,EAAE;IAC/C,IAAI,OAAO,EAAE;AACX,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACzB,YAAA,IAAI,GAAG,IAAI,OAAO,EAAE;gBAClB,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;YACrC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;AAE5E,IAAA,MAAM,UAAU,IACd,oBAAC,iBAAiB,EAAA,EAAA,GACZ,eAAe,EAAA,GACf,YAAY,EAChB,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,SAAS,EAAA,CACpB,CACH;AAED,IAAA,MAAM,WAAW,IACf,KAAA,CAAA,aAAA,CAAC,qBAAqB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,EAChD,UAAU,CACoB,CAClC;AAED,IAAA,OAAO,uBAAuB,IAC5B,oBAAC,uBAAuB,EAAA,IAAA,EAAE,WAAW,CAA2B,KAEhE,WAAW,CACZ;AACH,CAAC;AAED,wBAAwB,CAAC,WAAW;AAClC,IAAA,6CAA6C;;AC/D/C;AACO,MAAM,cAAc,GAAG,oCAAoC;AAwDlE;AACA;AACA;AAEA,MAAM,mBAAmB,GAA4C,CAAC,EACpE,QAAQ,GACT,KAAK,QAAQ;AAEd,MAAM,kBAAkB,GAAG,CACzB,eAAyC,KACb;IAC5B,MAAM,YAAY,GAChB,eAAe,CAAC,WAAW,IAAI,eAAe,CAAC,IAAI,IAAI,iBAAiB;AAE1E,IAAA,SAAS,YAAY,CAAC,EAAE,QAAQ,EAAiC,EAAA;QAC/D,OAAO,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,CAAC;IAC7D;AAEA,IAAA,YAAY,CAAC,WAAW,GAAG,CAAA,8BAAA,EAAiC,YAAY,GAAG;AAC3E,IAAA,OAAO,YAAY;AACrB,CAAC;AAED,MAAM,sBAAsB,GAAG,CAC7B,QAAgB,EAChB,cAAkD,KACZ;AACtC,IAAqB,cAAc,CAAC;IAEpC,SAAS,YAAY,CAAC,KAAqC,EAAA;QACzD,OAAO,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,KAAK,CAAC;IACnD;AAEA,IAAA,YAAY,CAAC,WAAW,GAAG,CAAA,gCAAA,EAAmC,QAAQ,EAAE;AACxE,IAAA,OAAO,YAAY;AACrB,CAAC;AAED,MAAM,4BAA4B,GAAG,MAAkB;IACrD,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;IACzD,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,QAAA,WAAW,CAAC,EAAE,GAAG,cAAc;AAC/B,QAAA,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAClC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;IACxC;AACA,IAAA,OAAO,WAAW;AACpB,CAAC;AAED,MAAM,iBAAiB,GAAG,CACxB,KAAmB,EACnB,IAAgB,KACA;AAChB,IAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG;AAC/B,QAAA,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO;AACjC,QAAA,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI;KAChB;AACD,IAAA,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAClD,IAAA,OAAO,KAAK;AACd,CAAC;AAED,MAAM,qBAAqB,GAAG,CAC5B,KAAmB,EACnB,IAAgB,EAChB,cAAkD,KAClC;IAChB,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC;IAC3E,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAC/B,IAAI,CAAC,EAAE,EACP,KAAK,CAAC,aAAa,CACjB,KAAK,CAAC,UAAU,EAChB,IAAI,EACJ,KAAK,CAAC,aAAa,CAAC,mBAAmB,EAAE;QACvC,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC,CACH,CACF;IAED,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE;KAC3C;AACH,CAAC;AAED;AACA;AACA;AAEA,MAAM,UAAU,GAAY;AAC1B,IAAA,UAAU,EAAE,CAAC,EACX,qBAAqB,GAAG,mBAAmB,EAC3C,qBAAqB,GAAG,qBAAqB,GAC9C,KAAI;AACH,QAAA,MAAM,WAAW,GAAG,4BAA4B,EAAE;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;AAE7C,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B;AACzD,QAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAc;AAC5C,QAAA,MAAM,UAAU,GAAG,EAAE,OAAO,EAAE,IAAkC,EAAE;AAClE,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAc;AAC9C,QAAA,MAAM,gBAAgB,GAAG,EAAE,OAAO,EAAE,EAAgC,EAAE;AACtE,QAAA,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAc;AACpD,QAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiB;AAC7C,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA2B;AAC3D,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB;AAErD,QAAA,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,UAAkB,KACxD,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AAE7B,QAAA,MAAM,WAAW,GAAsB;AACrC,YAAA,QAAQ,EAAE,CAAC,QAAgB,KAAK,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI;AAChE,YAAA,gBAAgB,EAAE,CAAC,EAAc,KAAI;AACnC,gBAAA,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,MAAM,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,CAAC;AACD,YAAA,UAAU,EAAE,MAAM,UAAU,CAAC,OAAO;AACpC,YAAA,kBAAkB,EAAE,CAAC,EAAc,KAAI;AACrC,gBAAA,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,MAAM,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,CAAC;AACD,YAAA,gBAAgB,EAAE,MAAM,gBAAgB,CAAC,OAAO;AAChD,YAAA,wBAAwB,EAAE,CAAC,EAAc,KAAI;AAC3C,gBAAA,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,MAAM,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,CAAC;AACD,YAAA,cAAc,EAAE,CAAC,QAAgB,EAAE,UAAkB,KAAI;gBACvD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAC9C,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;YACpC,CAAC;YACD,iBAAiB,EAAE,CACjB,QAAgB,EAChB,UAAkB,EAClB,EAAc,EACd,MAAqB,KACnB;gBACF,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAC9C,IAAI,MAAM,EAAE;AACV,oBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;gBAChC;gBACA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBAC9B,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC;gBACtC;gBACA,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,gBAAA,OAAO,MAAK;oBACV,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;oBACrC,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE;AACzC,wBAAA,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;oBAC3B;AACF,gBAAA,CAAC;YACH,CAAC;SACF;AAED,QAAA,MAAM,KAAK,GAAiB;YAC1B,UAAU;YACV,UAAU;YACV,cAAc;YACd,gBAAgB;YAChB,gBAAgB;YAChB,sBAAsB;YACtB,YAAY;YACZ,gBAAgB;YAChB,aAAa;AACb,YAAA,KAAK,EAAE,EAAE,CAAC,cAAc,GAAG,IAAI,EAAE;YACjC,WAAW;SACZ;AAED,QAAA,MAAM,0BAA0B,GAAG,kBAAkB,CACnD,qBAAqB,CACtB;QAED,IAAI,CAAC,MAAM,CACT,KAAK,CAAC,aAAa,CACjB,KAAK,CAAC,UAAU,EAChB,IAAI,EACJ,KAAK,CAAC,aAAa,CACjB,0BAA0B,EAC1B,IAAI,EACJ,KAAK,CAAC,aAAa,CAAC,qBAAqB,EAAE;YACzC,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CACH,CACF,CACF;AAED,QAAA,OAAO,KAAK;IACd,CAAC;IACD,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,wBAAwB,KAAI;AACtE,QAAA,QAAQ,IAAI,CAAC,WAAW;AACtB,YAAA,KAAK,cAAc;gBACjB,OAAO,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC;AAC3D,YAAA;AACE,gBAAA,OAAO,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC;;IAE3C,CAAC;AACD,IAAA,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,KAAI;AAC3B,QAAA,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;AAE3B,QAAA,MAAM,YAAY,GAAG,CAAA,EAAG,EAAE,GAAG;QAC7B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE;AAC3C,YAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;AAChC,gBAAA,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC;AAC9B,gBAAA,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC;AAClC,gBAAA,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;YACjC;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YACnB,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;AACzB,YAAA,MAAM,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,cAAc,EAAE,GAAG,KAAK,CAAC,KAAK;YAC5D,OAAO;AACL,gBAAA,GAAG,KAAK;AACR,gBAAA,KAAK,EAAE,cAAc;aACtB;QACH;aAAO;AACL,YAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO;AACtE,YAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG,SAAS;AAC1C,YAAA,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAClD,YAAA,OAAO,KAAK;QACd;IACF,CAAC;IACD,iBAAiB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAI;AAC5C,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;AACrD,QAAA,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;AACzD,QAAA,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAC1C,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAI;QAChC,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE;AAC/C,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE;AAC9D,QAAA,IAAI,eAAe,GAAG,YAAY,EAAE;AAClC,YAAA,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG;gBACzB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;AACnC,gBAAA,GAAG,OAAO;aACX;AACD,YAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C;AAEA,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,YAAY,EAAE,CAAC,KAAK,KAAI;AACtB,QAAA,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI;AAC/B,QAAA,OAAO,KAAK;IACd,CAAC;IACD,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,KAAI;AAC9D,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AACvC,QAAA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC;AAC9C,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,YAAY,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,KAAI;AAC1D,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AACvC,QAAA,IAAI,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;QAE3C,QAAQ,MAAM;YACZ,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;gBACxB;YACF,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAC1D,gBAAA,IAAI,GAAG,KAAK,EAAE,EAAE;AACd,oBAAA,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;AAClB,oBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE;gBACzC;gBACA;YACF,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;gBAChD;YACF,KAAK,YAAY,CAAC,KAAK;gBACrB,KAAK,GAAG,EAAE;gBACV;;AAGJ,QAAA,IAAI,MAAM,EAAE,MAAM,EAAE;AAClB,YAAA,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9B;AAAO,aAAA,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE;YACrE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;QACtC;QAEA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AAClC,QAAA,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AACtD,QAAA,OAAO,KAAK;IACd,CAAC;CACF;;AC1TD;AACA;AACA;AAEA,SAAS,iBAAiB,CAAC,IAAkB,EAAA;AAC3C,IAAA,OAAO,CAAC,SAAiB,EAAE,OAAY,KAAI;AACzC,QAAA,IAAI,CAAC,WAAW,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC;AACxD,IAAA,CAAC;AACH;AAEA;AACA;AACA;AAEA,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAA2B;AAElE,MAAM,aAAa,GAAG,CAAC,KAAc,KAAgC;IACnE,IAAI,OAAO,KAAK,KAAK,UAAU;AAAE,QAAA,OAAO,KAAK;;AAE7C,IAAA,IAAK,KAAa,CAAC,SAAS,EAAE,gBAAgB;AAAE,QAAA,OAAO,KAAK;;IAE5D,IAAK,KAAa,CAAC,SAAS;AAAE,QAAA,OAAO,KAAK;;AAE1C,IAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,mBAAmB,GAAG,OAC1B,UAAsB,EACtB,aAAqB,EACrB,sBAAgD,KAItC;AACV,IAAA,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC;IAExC,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,IAAI;IACb;;IAGA,MAAM,MAAM,GAAG,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAAC;IACzD,IAAI,MAAM,EAAE;QACV,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,sBAAsB,EAAE;IACvE;;AAGA,IAAA,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE;AACzB,QAAA,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE;AAC1B,QAAA,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO;AAC7B,QAAA,uBAAuB,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC;AACrD,QAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,sBAAsB,EAAE;IAC/D;;AAGA,IAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;QAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,sBAAsB,EAAE;IACvE;;IAGA,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,SAAS;AAC3B,QAAA,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,sBAAsB;KAClE;AACH,CAAC;AAED;AACA;AACA;SAEgB,WAAW,CAAC,EAC1B,OAAO,EAAE,UAAU,GAAG,EAAE,EACxB,qBAAqB,GAAGA,qBAAmB,EAC3C,OAAO,GAAGC,UAAc,GACL,EAAA;AACnB,IAAA,OAAO,CAAC,GAAG,CAAC,CAAA,iCAAA,CAAmC,CAAC;IAChD,IAAI,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAEhE,IAAI,gBAAgB,GAAG,KAAK;AAC5B,IAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU;IACvC,IAAI,0BAA0B,GAAG,KAAK;AAEtC,IAAA,MAAM,IAAI,GAIN;QACF,OAAO,GAAA;YACL,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACxC,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,mDAAA,CAAqD,CAAC;gBACpE;YACF;YAEA,IAAI,CAAC,0BAA0B,EAAE;gBAC/B,0BAA0B,GAAG,IAAI;gBACjC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,wBAAwB,EAAE,CAAC,CAAC,KAAI;;;;;;AAMjD,oBAAA,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,OAAO;wBAAE;oBAChC,gBAAgB,GAAG,KAAK;AACxB,oBAAA,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC;AACnD,gBAAA,CAAC,CAAC;YACJ;;YAGA,IAAI,CAAC,gBAAgB,EAAE;gBACrB,gBAAgB,GAAG,IAAI;gBACvB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,IAAI,KAAI;oBACjC,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC;AAC1D,gBAAA,CAAC,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,KAAK,KAAI;oBACpC,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC;AAC3D,gBAAA,CAAC,CAAC;YACJ;AAEA,YAAA,MAAM,EACJ,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,WAAW,EACpB,cAAc,EAAE,kBAAkB,GACnC,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO;YACnB,IAAI,CAAC,aAAa,EAAE;gBAClB,OAAO,CAAC,KAAK,CACX,CAAA,4BAAA,EAA+B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,6BAAA,CAA+B,CACzE;gBACD;YACF;AAEA,YAAA,IAAI,MAAM,GAA4C;AACpD,gBAAA,CAAC,EAAE,EAAE;AACL,gBAAA,CAAC,EAAE,EAAE;AACL,gBAAA,CAAC,EAAE,CAAC;aACL;YACD,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI;AACF,oBAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBACjC;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,+BAAA,CAAiC,EACtD,CAAC,CACF;gBACH;YACF;YAEA,IAAI,YAAY,GAAwB,EAAE;YAC1C,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI;oBACF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;oBACxC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAI;AACjC,wBAAA,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC;AAC7B,wBAAA,IAAI,KAAK,EAAE,GAAG,KAAK,SAAS,EAAE;4BAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACtC,4BAAA,YAAY,GAAG,OAAO,CAAC,gBAAgB,CACrC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,UAAU,EACV,KAAK,CAAC,CAAC,CACR;AACD,4BAAA,MAAM,MAAM,GAAiB;AAC3B,gCAAA,IAAI,EAAE,UAAU;gCAChB,OAAO,EAAE,KAAK,CAAC,CAAC;6BACjB;AACD,4BAAA,YAAY,CAAC,QAAQ,CAAC,GAAG,MAAM;wBACjC;6BAAO;AACL,4BAAA,YAAY,CAAC,QAAQ,CAAC,GAAG,KAAK;wBAChC;AACF,oBAAA,CAAC,CAAC;gBACJ;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,8BAAA,CAAgC,EACrD,CAAC,CACF;gBACH;YACF;;YAGA,IAAI,cAAc,GAAwB,EAAE;YAC5C,IAAI,WAAW,EAAE;AACf,gBAAA,IAAI;oBACF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;oBAC5C,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,GAAG,KAAI;wBACnC,cAAc,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC;AAChD,oBAAA,CAAC,CAAC;AACF,oBAAA,IAAI,CAAC,kBAAkB;AACrB,wBAAA,MAAM,wCAAwC;oBAChD,cAAc,CAAC,SAAS,GAAG,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC;gBAC7D;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,gCAAA,CAAkC,EACvD,CAAC,CACF;gBACH;YACF;AAEA,YAAA,IAAI,WAAwB;YAC5B,QAAQ,OAAO;AACb,gBAAA,KAAK,WAAW;oBACd,WAAW,GAAG,WAAW;oBACzB;AACF,gBAAA,KAAK,cAAc;oBACjB,WAAW,GAAG,cAAc;oBAC5B;AACF,gBAAA;oBACE,WAAW,GAAG,MAAM;;AAGxB,YAAA,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC;AACzC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;AACvB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE;AAElB,YAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAEvB,CAAC,YAAW;gBACV,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC5C,UAAU,EACV,aAAa,EACbD,qBAAmB,CACpB;AAED,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE;AAC9B,gBAAA,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;gBAE1B,IAAI,CAAC,YAAY,EAAE;AACjB,oBAAA,OAAO,CAAC,KAAK,CACX,oCAAoC,aAAa,CAAA,WAAA,CAAa,CAC/D;oBACD;gBACF;gBAEA,YAAY,GAAG,OAAO,CAAC,iBAAiB,CACtC,YAAY,EACZ,IAAI,EACJ,YAAY,CACb;AAED,gBAAA,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE;AAC/C,oBAAA,EAAE,EAAE,IAAI;oBACR,EAAE;oBACF,SAAS,EAAE,YAAY,CAAC,SAAS;oBACjC,eAAe,EAAE,YAAY,CAAC,eAAe;oBAC7C,WAAW;oBACX,SAAS;oBACT,aAAa,EACX,WAAW,KAAK;0BACZ,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc;AAChD,0BAAE,IAAI;oBACV,UAAU,EAAE,MAAM,CAAC,CAAC;AACrB,iBAAA,CAAC;YACJ,CAAC,GAAG;YAEJ,IAAI,CAAC,WAAW,CACd,OAAO,EACP,CAAC,OAA0C,KAAI;AAC7C,gBAAA,IAAI,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;oBAAE;gBAE5B,MAAM,KAAK,GAAwB,EAAE;AACrC,gBAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;oBAC/C,IAAI,GAAG,KAAK,GAAG;wBAAE;oBACjB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC;AAC7B,oBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;wBAChC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;oBAC9B;AACF,gBAAA,CAAC,CAAC;AAEF,gBAAA,YAAY,GAAG,OAAO,CAAC,iBAAiB,CACtC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,KAAK,CACN;AACH,YAAA,CAAC,CACF;YAED,IAAI,CAAC,WAAW,CACd,OAAO,EACP,CAAC,OAA0D,KAAI;AAC7D,gBAAA,IAAI,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;oBAAE;gBAE5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,gBAAA,IAAI,CAAC,UAAU;oBAAE;gBAEjB,YAAY,GAAG,OAAO,CAAC,YAAY,CACjC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,UAAU,EACV,OAAO,CAAC,CAAC,EACT,OAAO,CAAC,CAAC,CACV;AACH,YAAA,CAAC,CACF;QACH,CAAC;QAED,OAAO,GAAA;YACL,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5C,CAAC;QAED,SAAS,GAAA;YACP,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5C,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAChC,YAAA,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;KACF;AAED,IAAA,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE;AACnC;;ACpVM,SAAU,SAAS,CACvB,MAAoB,EACpB,OAA6B,EAAA;AAE7B,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,qBAAqB,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;IACtE;IAEA,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO;IAE7C,MAAM,SAAS,GAAG,OAAO,CACvB,MAAM,CAAC,EAAc,KACnB,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE;QACvD,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,MAAM,EAAE,OAAO,EAAE,MAA+C;AACjE,KAAA,CAAC,EACJ,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CACtE;AAED,IAAA,MAAM,WAAW,GAAG,OAAO,CACzB,MAAM,MAAM,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAQ,EACpE,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CACrC;AAED,IAAA,OAAO,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC,OAAc,CAAC;AAClF;;ACiCM,SAAU,OAAO,CACrB,IAAe,EACf,SAAuB,EAAA;;;;IAKvB,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACjD,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACrC,IAAA,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;AACnE,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC;;AAGvC,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM;;IAG5B,SAAS,CAAC,MAAK;QACb,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;AACpC,YAAA,eAAe,CAAC,OAAO,GAAG,CAAC;YAC3B,eAAe,CAAC,CAAC,CAAC;QACpB;IACF,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;;;AAI9B,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC;AACnC,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;AACvB,QAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;AAC9B,KAAA,CAAC;AAEF,IAAA,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE;AAC7C,QAAA,SAAS,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,EAAE,CAAC,CAAC;IACxD;AACA,IAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE;AACtD,QAAA,SAAS,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAS,EAAE,CAAC,CAAC;IAC9D;;AAGA,IAAA,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAC5C,IAAI,CAAC,MAAM,IAAI,EAAE,CAClB;;IAGD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC;;IAGpD,SAAS,CAAC,MAAK;AACb,QAAA,cAAc,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACzD,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;IAGjB,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,IAAY,EAAE,KAAU,KAAI;;AAExD,QAAA,UAAU,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;;AAGpE,QAAA,eAAe,CAAC,OAAO,IAAI,CAAC;AAC5B,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO;AAE1C,QAAA,cAAc,CAAC,CAAC,IAAI,KAAI;AACtB,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,GAAG,KAAK,EAAE;;YAGvC,eAAe,CAAC,UAAU,CAAC;;AAG3B,YAAA,IAAI,kBAAkB,CAAC,OAAO,GAAG,UAAU,EAAE;AAC3C,gBAAA,kBAAkB,CAAC,OAAO,GAAG,UAAU;gBAEvC,SAAS,GAAG,UAAU,EAAE;AACtB,oBAAA,KAAK,EAAE,UAAU;AACjB,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,EAAE,EAAE,UAAU;AACf,iBAAA,CAAC;YACJ;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;;AAGd,IAAA,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,IAAY,KAAgB;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAC/B,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC;AAE/B,QAAA,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE;QAErB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,EAAE;YACzC,OAAO;AACL,gBAAA,GAAG,IAAI;gBACP,OAAO,EAAE,CAAC,CAAC,KAAK;AAChB,gBAAA,KAAK,EAAE,SAAgB;AACvB,gBAAA,QAAQ,EAAE,CAAC,CAAC,KACV,QAAQ,CAAC,IAAI,EAAG,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC;aACzD;QACH;QAEA,OAAO;AACL,YAAA,GAAG,IAAI;YACP,KAAK,EAAE,KAAK,IAAI,EAAE;AAClB,YAAA,QAAQ,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChD;IACH,CAAC,EACD,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CACtC;IAED,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,IAAY,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAC1C,CAAC,IAAI,CAAC,MAAM,CAAC,CACd;IAED,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,IAAY,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAChD,CAAC,MAAM,CAAC,QAAQ,CAAC,CAClB;IAED,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,IAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EACxC,CAAC,OAAO,CAAC,CACV;;AAGD,IAAA,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,CAAmB,KAAI;QACtB,CAAC,EAAE,cAAc,EAAE;;AAGnB,QAAA,eAAe,CAAC,OAAO,IAAI,CAAC;AAC5B,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO;QAC1C,eAAe,CAAC,UAAU,CAAC;;AAG3B,QAAA,IAAI,kBAAkB,CAAC,OAAO,GAAG,UAAU,EAAE;AAC3C,YAAA,kBAAkB,CAAC,OAAO,GAAG,UAAU;YAEvC,SAAS,GAAG,UAAU,EAAE;AACtB,gBAAA,KAAK,EAAE,QAAQ;AACf,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,EAAE,EAAE,UAAU;AACf,aAAA,CAAC;QACJ;AACF,IAAA,CAAC,EACD,CAAC,WAAW,EAAE,QAAQ,CAAC,CACxB;AAED,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,MAAK;AAC7B,QAAA,cAAc,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACjC,UAAU,CAAC,EAAE,CAAC;;QAEd,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC;AAC3C,QAAA,eAAe,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;;;AAI/B,IAAA,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa;;;;;AAM9C,IAAA,MAAM,OAAO,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IAErD,OAAO;AACL,QAAA,MAAM,EAAE,WAAW;AACnB,QAAA,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO;QACP,aAAa;QACb,QAAQ;QACR,UAAU;QACV,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,KAAK;QACL,SAAS;QACT,OAAO;QACP,YAAY;QACZ,aAAa;KACd;AACH;;"}
|
package/dist/index.js
CHANGED
|
@@ -382,7 +382,14 @@ function createHooks({ islands: islandsMap = {}, SharedContextProvider = NullCon
|
|
|
382
382
|
}
|
|
383
383
|
if (!navigationListenerAttached) {
|
|
384
384
|
navigationListenerAttached = true;
|
|
385
|
-
this.liveSocket.on("phx:page-loading-start", () => {
|
|
385
|
+
this.liveSocket.on("phx:page-loading-start", (e) => {
|
|
386
|
+
// Patches (e.g. push_patch tab switches) stay within the same
|
|
387
|
+
// LiveView mount and globals version counter, so islands that
|
|
388
|
+
// remain mounted through the patch must keep their cached
|
|
389
|
+
// globals. Only a real navigation (new mount, version resets
|
|
390
|
+
// to 0 server-side) needs the stale client-side version cleared.
|
|
391
|
+
if (e.detail?.kind === "patch")
|
|
392
|
+
return;
|
|
386
393
|
globalsRequested = false;
|
|
387
394
|
managerState = manager.resetGlobals(managerState);
|
|
388
395
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/types.ts","../src/context.ts","../src/PortalIslandsRenderer.tsx","../src/IndividualIslandRenderer.tsx","../src/islandsManager.ts","../src/createHooks.ts","../src/useStream.ts","../src/useForm.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import { createContext } from \"react\";\nimport type { IslandStoreAccess } from \"./types\";\n\nexport interface IslandContext {\n id: string;\n storeAccess: IslandStoreAccess;\n}\n\nexport const IslandContextProvider = createContext<IslandContext | null>(null);\n","import React, { useRef, memo, useSyncExternalStore, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type {\n IslandData,\n SharedIslandsRendererProps,\n IslandStoreAccess,\n} from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nconst PortalIsland = memo(\n ({\n data,\n storeAccess,\n }: {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n }) => {\n const {\n Component,\n ContextProvider,\n id,\n pushEvent,\n ssrStrategy,\n el,\n globalKeys,\n } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n const contextValue = useMemo(\n () => ({ id, storeAccess }),\n [id, storeAccess]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => null\n );\n\n const allGlobals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n () => null\n );\n\n const didClearRef = useRef(false);\n if (ssrStrategy === \"overwrite\" && !didClearRef.current) {\n el.innerHTML = \"\";\n didClearRef.current = true;\n }\n\n if (!allGlobals) {\n console.log(\"[PortalIsland] Waiting for globals\", id);\n return null;\n }\n\n console.log(\"[PortalIsland] Rendering\", { id, allGlobals });\n\n const relevantGlobals: Record<string, any> = {};\n if (allGlobals) {\n globalKeys.forEach((key) => {\n if (key in allGlobals) {\n relevantGlobals[key] = allGlobals[key];\n }\n });\n }\n\n const mergedProps = { ...relevantGlobals, ...currentProps };\n\n const islandNode = (\n <MemoizedComponent {...mergedProps} id={id} pushEvent={pushEvent} />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n const content = MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n\n return createPortal(content, el);\n }\n);\nPortalIsland.displayName = \"[ReactLiveIslands]PortalIsland\";\n\nexport const PortalIslandsRenderer: React.FC<SharedIslandsRendererProps> = ({\n storeAccess,\n}) => {\n const sharedIslandsObj = useSyncExternalStore(\n storeAccess.subscribeToSharedIslands,\n storeAccess.getSharedIslands\n );\n\n const islands = Object.values(sharedIslandsObj);\n\n console.log(\n \"[PortalIslandsRenderer] Rendering islands:\",\n islands.map((d) => d.id)\n );\n\n return (\n <>\n {islands.map((data) => (\n <PortalIsland key={data.id} data={data} storeAccess={storeAccess} />\n ))}\n </>\n );\n};\nPortalIslandsRenderer.displayName = \"[ReactLiveIslands]PortalIslandsRenderer\";\n","import React, { useSyncExternalStore, memo, useMemo } from \"react\";\nimport type { IndividualIslandsRendererProps } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport const IndividualIslandRenderer: React.FC<\n IndividualIslandsRendererProps\n> = ({ data, storeAccess }) => {\n const { Component, ContextProvider, id, pushEvent, globalKeys } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => data.hydrationData?.props\n );\n\n // Check once if hydration globals version matches store version\n const serverGlobalsSnapshot = useMemo(() => {\n const hydrationGlobals = data.hydrationData?.globals;\n if (!hydrationGlobals) return () => hydrationGlobals;\n let comparedVersions = false;\n let useStoreReference = false;\n return () => {\n if (!comparedVersions) {\n comparedVersions = true;\n const storeGlobals = storeAccess.getGlobals();\n const hydrationVersion = hydrationGlobals.__version ?? -1;\n const storeVersion = storeGlobals?.__version ?? -1;\n useStoreReference = storeVersion === hydrationVersion;\n }\n return useStoreReference ? storeAccess.getGlobals() : hydrationGlobals;\n };\n }, [data.hydrationData?.globals, storeAccess]);\n\n const globals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n serverGlobalsSnapshot\n );\n\n const filteredGlobals: Record<string, any> = {};\n if (globals) {\n globalKeys.forEach((key) => {\n if (key in globals) {\n filteredGlobals[key] = globals[key];\n }\n });\n }\n\n const contextValue = useMemo(() => ({ id, storeAccess }), [id, storeAccess]);\n\n const islandNode = (\n <MemoizedComponent\n {...filteredGlobals}\n {...currentProps}\n id={id}\n pushEvent={pushEvent}\n />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n return MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n};\n\nIndividualIslandRenderer.displayName =\n \"[ReactLiveIslands] IndividualIslandRenderer\";\n","import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\n\nimport {\n ContextProviderComponent,\n IslandData,\n SharedIslandsRendererComponent,\n IndividualIslandsRendererComponent,\n IslandStoreAccess,\n IndividualIslandsRendererProps,\n StreamAction,\n StreamConfig,\n} from \"./types\";\nimport { PortalIslandsRenderer } from \"./PortalIslandsRenderer\";\nimport { IndividualIslandRenderer } from \"./IndividualIslandRenderer\";\n\n// Constant root ID - one shared root per application\nexport const SHARED_ROOT_ID = \"__live_react_islands_shared_root__\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ManagerState {\n propsStore: Map<string, Record<string, any>>;\n propsListeners: Set<() => void>;\n globalsRef: React.MutableRefObject<Record<string, any> | null>;\n globalsListeners: Set<() => void>;\n sharedIslandsRef: React.MutableRefObject<Record<string, IslandData>>;\n sharedIslandsListeners: Set<() => void>;\n streamsStore: Map<string, any[]>;\n streamsListeners: Map<string, Set<() => void>>;\n streamConfigs: Map<string, StreamConfig>;\n roots: Record<string, any>;\n storeAccess: IslandStoreAccess;\n}\n\nexport interface Manager {\n initialize: (params: {\n SharedContextProvider?: ContextProviderComponent;\n SharedIslandsRenderer?: SharedIslandsRendererComponent;\n }) => ManagerState;\n mountIsland: (\n state: ManagerState,\n data: IslandData,\n IslandRenderer?: IndividualIslandsRendererComponent\n ) => ManagerState;\n unmountIsland: (state: ManagerState, id: string) => ManagerState;\n updateIslandProps: (\n state: ManagerState,\n islandId: string,\n props: Record<string, any>\n ) => ManagerState;\n updateGlobals: (\n state: ManagerState,\n globals: Record<string, any>\n ) => ManagerState;\n resetGlobals: (state: ManagerState) => ManagerState;\n initializeStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n initialItems: any[]\n ) => ManagerState;\n updateStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n action: StreamAction,\n data: any\n ) => ManagerState;\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n\nconst withSharedRootName = (\n ContextProvider: ContextProviderComponent\n): ContextProviderComponent => {\n const originalName =\n ContextProvider.displayName || ContextProvider.name || \"ContextProvider\";\n\n function NamedWrapper({ children }: { children: React.ReactNode }) {\n return React.createElement(ContextProvider, null, children);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] SharedRoot(${originalName})`;\n return NamedWrapper;\n};\n\nconst withIndividualRootName = (\n islandId: string,\n IslandRenderer: IndividualIslandsRendererComponent\n): IndividualIslandsRendererComponent => {\n const originalName = IslandRenderer.displayName;\n\n function NamedWrapper(props: IndividualIslandsRendererProps) {\n return React.createElement(IslandRenderer, props);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] HydratedRoot#${islandId}`;\n return NamedWrapper;\n};\n\nconst getOrCreateSharedRootElement = (): HTMLElement => {\n let rootElement = document.getElementById(SHARED_ROOT_ID);\n if (!rootElement) {\n rootElement = document.createElement(\"div\");\n rootElement.id = SHARED_ROOT_ID;\n rootElement.style.display = \"none\";\n document.body.appendChild(rootElement);\n }\n return rootElement;\n};\n\nconst mountSharedIsland = (\n state: ManagerState,\n data: IslandData\n): ManagerState => {\n state.sharedIslandsRef.current = {\n ...state.sharedIslandsRef.current,\n [data.id]: data,\n };\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n};\n\nconst mountIndividualIsland = (\n state: ManagerState,\n data: IslandData,\n IslandRenderer: IndividualIslandsRendererComponent\n): ManagerState => {\n const NamedIslandRenderer = withIndividualRootName(data.id, IslandRenderer);\n const root = ReactDOM.hydrateRoot(\n data.el,\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(NamedIslandRenderer, {\n data,\n storeAccess: state.storeAccess,\n })\n )\n );\n\n return {\n ...state,\n roots: { ...state.roots, [data.id]: root },\n };\n};\n\n// ============================================================================\n// Island Manager (Bridge between LiveView hook lifecycles and React rendering)\n// ============================================================================\n\nconst ManagerObj: Manager = {\n initialize: ({\n SharedContextProvider = NullContextProvider,\n SharedIslandsRenderer = PortalIslandsRenderer,\n }) => {\n const rootElement = getOrCreateSharedRootElement();\n const root = ReactDOM.createRoot(rootElement);\n\n const propsStore = new Map<string, Record<string, any>>();\n const propsListeners = new Set<() => void>();\n const globalsRef = { current: null as Record<string, any> | null };\n const globalsListeners = new Set<() => void>();\n const sharedIslandsRef = { current: {} as Record<string, IslandData> };\n const sharedIslandsListeners = new Set<() => void>();\n const streamsStore = new Map<string, any[]>();\n const streamsListeners = new Map<string, Set<() => void>>();\n const streamConfigs = new Map<string, StreamConfig>();\n\n const getStreamKey = (islandId: string, streamName: string) =>\n `${islandId}:${streamName}`;\n\n const storeAccess: IslandStoreAccess = {\n getProps: (islandId: string) => propsStore.get(islandId) || null,\n subscribeToProps: (cb: () => void) => {\n propsListeners.add(cb);\n return () => propsListeners.delete(cb);\n },\n getGlobals: () => globalsRef.current,\n subscribeToGlobals: (cb: () => void) => {\n globalsListeners.add(cb);\n return () => globalsListeners.delete(cb);\n },\n getSharedIslands: () => sharedIslandsRef.current,\n subscribeToSharedIslands: (cb: () => void) => {\n sharedIslandsListeners.add(cb);\n return () => sharedIslandsListeners.delete(cb);\n },\n getStreamItems: (islandId: string, streamName: string) => {\n const key = getStreamKey(islandId, streamName);\n return streamsStore.get(key) || [];\n },\n subscribeToStream: (\n islandId: string,\n streamName: string,\n cb: () => void,\n config?: StreamConfig\n ) => {\n const key = getStreamKey(islandId, streamName);\n if (config) {\n streamConfigs.set(key, config);\n }\n if (!streamsListeners.has(key)) {\n streamsListeners.set(key, new Set());\n }\n streamsListeners.get(key)!.add(cb);\n return () => {\n streamsListeners.get(key)?.delete(cb);\n if (streamsListeners.get(key)?.size === 0) {\n streamConfigs.delete(key);\n }\n };\n },\n };\n\n const state: ManagerState = {\n propsStore,\n globalsRef,\n propsListeners,\n globalsListeners,\n sharedIslandsRef,\n sharedIslandsListeners,\n streamsStore,\n streamsListeners,\n streamConfigs,\n roots: { [SHARED_ROOT_ID]: root },\n storeAccess,\n };\n\n const NamedSharedContextProvider = withSharedRootName(\n SharedContextProvider\n );\n\n root.render(\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(\n NamedSharedContextProvider,\n null,\n React.createElement(SharedIslandsRenderer, {\n storeAccess: state.storeAccess,\n })\n )\n )\n );\n\n return state;\n },\n mountIsland: (state, data, IslandRenderer = IndividualIslandRenderer) => {\n switch (data.ssrStrategy) {\n case \"hydrate_root\":\n return mountIndividualIsland(state, data, IslandRenderer);\n default:\n return mountSharedIsland(state, data);\n }\n },\n unmountIsland: (state, id) => {\n state.propsStore.delete(id);\n\n const streamPrefix = `${id}:`;\n for (const key of state.streamsStore.keys()) {\n if (key.startsWith(streamPrefix)) {\n state.streamsStore.delete(key);\n state.streamsListeners.delete(key);\n state.streamConfigs.delete(key);\n }\n }\n\n if (state.roots[id]) {\n state.roots[id].unmount();\n const { [id]: removedRoot, ...remainingRoots } = state.roots;\n return {\n ...state,\n roots: remainingRoots,\n };\n } else {\n const { [id]: removed, ...remaining } = state.sharedIslandsRef.current;\n state.sharedIslandsRef.current = remaining;\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n }\n },\n updateIslandProps: (state, islandId, props) => {\n const existing = state.propsStore.get(islandId) || {};\n state.propsStore.set(islandId, { ...existing, ...props });\n state.propsListeners.forEach((cb) => cb());\n return state;\n },\n updateGlobals: (state, globals) => {\n const incomingVersion = globals.__version ?? -1;\n const storeVersion = state.globalsRef.current?.__version ?? -1;\n if (incomingVersion > storeVersion) {\n state.globalsRef.current = {\n ...(state.globalsRef.current || {}),\n ...globals,\n };\n state.globalsListeners.forEach((cb) => cb());\n }\n\n return state;\n },\n resetGlobals: (state) => {\n state.globalsRef.current = null;\n return state;\n },\n initializeStream: (state, islandId, streamName, initialItems) => {\n const key = `${islandId}:${streamName}`;\n state.streamsStore.set(key, [...initialItems]);\n return state;\n },\n updateStream: (state, islandId, streamName, action, data) => {\n const key = `${islandId}:${streamName}`;\n let items = state.streamsStore.get(key) || [];\n const config = state.streamConfigs.get(key);\n\n switch (action) {\n case StreamAction.Insert:\n items = [data, ...items];\n break;\n case StreamAction.Update:\n const idx = items.findIndex((item) => item.id === data.id);\n if (idx !== -1) {\n items = [...items];\n items[idx] = { ...items[idx], ...data };\n }\n break;\n case StreamAction.Delete:\n items = items.filter((item) => item.id !== data);\n break;\n case StreamAction.Reset:\n items = [];\n break;\n }\n\n if (config?.capper) {\n items = config.capper(items);\n } else if (config?.limit !== undefined && items.length > config.limit) {\n items = items.slice(0, config.limit);\n }\n\n state.streamsStore.set(key, items);\n state.streamsListeners.get(key)?.forEach((cb) => cb());\n return state;\n },\n};\nexport default ManagerObj;\n","import IslandsManager, { Manager } from \"./islandsManager\";\nimport {\n type IslandsMap,\n type SSRStrategy,\n type PushEventFn,\n type ContextProviderComponent,\n type IslandComponent,\n type LazyIslandFactory,\n type StreamHandle,\n NullContextProvider,\n StreamAction,\n} from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface LiveViewHook {\n el: HTMLElement;\n liveSocket: {\n on: (event: string, callback: (e: Event) => void) => void;\n };\n pushEvent: (\n event: string,\n payload: any,\n callback?: (reply: any, ref: any) => void\n ) => void;\n pushEventTo: (target: string, event: string, payload: any) => void;\n handleEvent: (event: string, callback: (data: any) => void) => void;\n}\n\nexport interface CreateHooksOptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n manager?: Manager;\n}\n\n// ============================================================================\n// Event Handler Adapter\n// ============================================================================\n\nfunction createPushEventFn(hook: LiveViewHook): PushEventFn {\n return (eventName: string, payload: any) => {\n hook.pushEventTo(`#${hook.el.id}`, eventName, payload);\n };\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst resolvedComponentsCache = new Map<string, IslandComponent>();\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n // Check if it's a React component (has prototype.isReactComponent for class components)\n if ((value as any).prototype?.isReactComponent) return false;\n // Check if it's a config object getter (would have Component property)\n if ((value as any).Component) return false;\n // Assume zero-arg functions that aren't class components are lazy factories\n return value.length === 0;\n};\n\nconst resolveIslandConfig = async (\n islandsMap: IslandsMap,\n componentName: string,\n defaultContextProvider: ContextProviderComponent\n): Promise<{\n Component: IslandComponent;\n ContextProvider: ContextProviderComponent;\n} | null> => {\n const config = islandsMap[componentName];\n\n if (!config) {\n return null;\n }\n\n // Check cache first for lazy-loaded components\n const cached = resolvedComponentsCache.get(componentName);\n if (cached) {\n return { Component: cached, ContextProvider: defaultContextProvider };\n }\n\n // Handle lazy factory: () => import(\"./Component\")\n if (isLazyFactory(config)) {\n const mod = await config();\n const Component = mod.default;\n resolvedComponentsCache.set(componentName, Component);\n return { Component, ContextProvider: defaultContextProvider };\n }\n\n // Handle direct component\n if (typeof config === \"function\") {\n return { Component: config, ContextProvider: defaultContextProvider };\n }\n\n // Handle config object\n return {\n Component: config.Component,\n ContextProvider: config.ContextProvider || defaultContextProvider,\n };\n};\n\n// ============================================================================\n// Main Hook Factory (LiveView Adapter Layer)\n// ============================================================================\n\nexport function createHooks({\n islands: islandsMap = {},\n SharedContextProvider = NullContextProvider,\n manager = IslandsManager,\n}: CreateHooksOptions) {\n console.log(`[LiveReactIslands] Creating hooks`);\n let managerState = manager.initialize({ SharedContextProvider });\n\n let globalsRequested = false;\n const pendingMounts = new Set<string>();\n let navigationListenerAttached = false;\n\n const Hook: Partial<LiveViewHook> & {\n mounted: (this: LiveViewHook) => void;\n updated?: (this: LiveViewHook) => void;\n destroyed: (this: LiveViewHook) => void;\n } = {\n mounted(this: LiveViewHook) {\n console.log(\"[Hook] Mount:\", this.el.id);\n if (!this.el.id) {\n console.error(`[LiveReactIslands] Island element missing unique id`);\n return;\n }\n\n if (!navigationListenerAttached) {\n navigationListenerAttached = true;\n this.liveSocket.on(\"phx:page-loading-start\", () => {\n globalsRequested = false;\n managerState = manager.resetGlobals(managerState);\n });\n }\n\n // Pull globals once on first island mount\n if (!globalsRequested) {\n globalsRequested = true;\n this.handleEvent(\"lri-g\", (data) => {\n managerState = manager.updateGlobals(managerState, data);\n });\n this.pushEvent(\"lri-g\", {}, (reply) => {\n managerState = manager.updateGlobals(managerState, reply);\n });\n }\n\n const {\n comp: componentName,\n ssr: ssrData,\n props: propsData,\n schema: schemaData,\n globals: globalsData,\n globalsVersion: globalsVersionData,\n } = this.el.dataset;\n if (!componentName) {\n console.error(\n `[LiveReactIslands] Element '${this.el.id}' missing data-comp attribute`\n );\n return;\n }\n\n let schema: { p: string[]; g: string[]; i: number } = {\n p: [],\n g: [],\n i: 0,\n };\n if (schemaData) {\n try {\n schema = JSON.parse(schemaData);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-schema:`,\n e\n );\n }\n }\n\n let initialProps: Record<string, any> = {};\n if (propsData) {\n try {\n const propsArray = JSON.parse(propsData);\n schema.p.forEach((propName, idx) => {\n const value = propsArray[idx];\n if (value?.__s !== undefined) {\n const streamName = schema.p[value.__s];\n managerState = manager.initializeStream(\n managerState,\n this.el.id,\n streamName,\n value.i\n );\n const handle: StreamHandle = {\n name: streamName,\n initial: value.i,\n };\n initialProps[propName] = handle;\n } else {\n initialProps[propName] = value;\n }\n });\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-props:`,\n e\n );\n }\n }\n\n // Only for hydrate_root strategy\n let initialGlobals: Record<string, any> = {};\n if (globalsData) {\n try {\n const globalsArray = JSON.parse(globalsData);\n schema.g.forEach((globalName, idx) => {\n initialGlobals[globalName] = globalsArray[idx];\n });\n if (!globalsVersionData)\n throw \"Missing data-globals-version attribute\";\n initialGlobals.__version = parseInt(globalsVersionData, 10);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-globals:`,\n e\n );\n }\n }\n\n let ssrStrategy: SSRStrategy;\n switch (ssrData) {\n case \"overwrite\":\n ssrStrategy = \"overwrite\";\n break;\n case \"hydrate_root\":\n ssrStrategy = \"hydrate_root\";\n break;\n default:\n ssrStrategy = \"none\";\n }\n\n const pushEvent = createPushEventFn(this);\n const elId = this.el.id;\n const el = this.el;\n\n pendingMounts.add(elId);\n\n (async () => {\n const islandConfig = await resolveIslandConfig(\n islandsMap,\n componentName,\n NullContextProvider\n );\n\n if (!pendingMounts.has(elId)) return;\n pendingMounts.delete(elId);\n\n if (!islandConfig) {\n console.error(\n `[LiveReactIslands] React island '${componentName}' not found`\n );\n return;\n }\n\n managerState = manager.updateIslandProps(\n managerState,\n elId,\n initialProps\n );\n\n managerState = manager.mountIsland(managerState, {\n id: elId,\n el,\n Component: islandConfig.Component,\n ContextProvider: islandConfig.ContextProvider,\n ssrStrategy,\n pushEvent,\n hydrationData:\n ssrStrategy === \"hydrate_root\"\n ? { props: initialProps, globals: initialGlobals }\n : null,\n globalKeys: schema.g,\n });\n })();\n\n this.handleEvent(\n \"lri-p\",\n (payload: { i: number; [key: number]: any }) => {\n if (payload.i !== schema.i) return;\n\n const props: Record<string, any> = {};\n Object.entries(payload).forEach(([key, value]) => {\n if (key === \"i\") return;\n const idx = parseInt(key, 10);\n if (!isNaN(idx) && schema.p[idx]) {\n props[schema.p[idx]] = value;\n }\n });\n\n managerState = manager.updateIslandProps(\n managerState,\n this.el.id,\n props\n );\n }\n );\n\n this.handleEvent(\n \"lri-s\",\n (payload: { s: number; a: StreamAction; d: any; i: number }) => {\n if (payload.i !== schema.i) return;\n\n const streamName = schema.p[payload.s];\n if (!streamName) return;\n\n managerState = manager.updateStream(\n managerState,\n this.el.id,\n streamName,\n payload.a,\n payload.d\n );\n }\n );\n },\n\n updated(this: LiveViewHook) {\n console.log(\"[Hook] Updated:\", this.el.id);\n },\n\n destroyed(this: LiveViewHook) {\n console.log(\"[Hook] Destroyed:\", this.el.id);\n pendingMounts.delete(this.el.id);\n managerState = manager.unmountIsland(managerState, this.el.id);\n },\n };\n\n return { LiveReactIslands: Hook };\n}\n","import { useContext, useSyncExternalStore, useMemo } from \"react\";\nimport type { StreamHandle } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport interface UseStreamOptions<T> {\n limit?: number;\n capper?: (items: T[]) => T[];\n}\n\nexport function useStream<T extends { id: string | number }>(\n handle: StreamHandle,\n options?: UseStreamOptions<T>\n): T[] {\n const context = useContext(IslandContextProvider);\n if (!context) {\n throw new Error(\"useStream must be used within an Island component\");\n }\n\n const { id: islandId, storeAccess } = context;\n\n const subscribe = useMemo(\n () => (cb: () => void) =>\n storeAccess.subscribeToStream(islandId, handle.name, cb, {\n limit: options?.limit,\n capper: options?.capper as ((items: any[]) => any[]) | undefined,\n }),\n [storeAccess, islandId, handle.name, options?.limit, options?.capper]\n );\n\n const getSnapshot = useMemo(\n () => () => storeAccess.getStreamItems(islandId, handle.name) as T[],\n [storeAccess, islandId, handle.name]\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, () => handle.initial as T[]);\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\n\nexport interface FormProps {\n /** Internal: prop name for event routing (set by server) */\n __prop?: string;\n types?: Record<string, string>;\n required?: string[];\n values: Record<string, any>;\n errors: Record<string, string[]>;\n isValid?: boolean;\n version?: number;\n}\n\nexport type PushEventFn = (event: string, payload: Record<string, any>) => void;\n\nexport interface FieldProps {\n name: string;\n value: any;\n checked?: boolean;\n onChange: (\n e: React.ChangeEvent<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >\n ) => void;\n}\n\nexport interface UseFormReturn {\n /** Current form field values */\n values: Record<string, any>;\n /** Current form errors by field name */\n errors: Record<string, string[]>;\n /** Field types from schema */\n types: Record<string, string>;\n /** Required field names */\n required: string[];\n /** Field names that have been modified by the user */\n touched: string[];\n /** Get props to spread on an input element */\n getFieldProps: (name: string) => FieldProps;\n /** Get the first error message for a field */\n getError: (name: string) => string | undefined;\n /** Check if a field is required */\n isRequired: (name: string) => boolean;\n /** Check if a field has been modified by the user */\n isTouched: (name: string) => boolean;\n /** Set a field value programmatically */\n setField: (name: string, value: any) => void;\n /** Handle form submission */\n handleSubmit: (e?: React.FormEvent) => void;\n /** Reset form to server values */\n reset: () => void;\n /**\n * True when the server hasn't acknowledged the latest client changes.\n * Use this to show a syncing indicator (e.g., spinner, \"Validating...\").\n */\n isSyncing: boolean;\n /**\n * True only when form is valid AND fully synced with server.\n * Use this to enable/disable the submit button.\n * This is the \"Validation Lock\" - users cannot submit until server confirms validity.\n */\n isValid: boolean;\n /** Current local version counter */\n localVersion: number;\n /** Last acknowledged server version */\n serverVersion: number;\n}\n\nexport function useForm(\n form: FormProps,\n pushEvent?: PushEventFn\n): UseFormReturn {\n // 1. Version Tracking\n // Local version increments on each field change\n // Server version comes from form.version prop\n const localVersionRef = useRef(form.version ?? 0);\n const lastSentVersionRef = useRef(0); // Prevents duplicate sends in StrictMode\n const [localVersion, setLocalVersion] = useState(form.version ?? 0);\n const serverVersion = form.version ?? 0;\n\n // Prop name comes from server (embedded in form data)\n const propName = form.__prop;\n\n // Reset local version when server sends a reset (version 0 with new schema)\n useEffect(() => {\n if (form.version === 0 && form.types) {\n localVersionRef.current = 0;\n setLocalVersion(0);\n }\n }, [form.version, form.types]);\n\n // 3. Persistent Schema\n // We only update these when the server explicitly sends them (usually on init)\n const [schema, setSchema] = useState({\n types: form.types ?? {},\n required: form.required ?? [],\n });\n\n if (form.types && form.types !== schema.types) {\n setSchema((prev) => ({ ...prev, types: form.types! }));\n }\n if (form.required && form.required !== schema.required) {\n setSchema((prev) => ({ ...prev, required: form.required! }));\n }\n\n // 4. Values Management\n const [localValues, setLocalValues] = useState<Record<string, any>>(\n form.values ?? {}\n );\n\n // 5. Touched Tracking (client-side only)\n const [touched, setTouched] = useState<string[]>([]);\n\n // Sync from server: Update local values when server sends updates\n useEffect(() => {\n setLocalValues((prev) => ({ ...prev, ...form.values }));\n }, [form.values]);\n\n // 6. Versioned Change Handler\n const setField = useCallback((name: string, value: any) => {\n // Mark field as touched\n setTouched((prev) => (prev.includes(name) ? prev : [...prev, name]));\n\n // Increment version BEFORE state update to avoid StrictMode double-increment\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n\n setLocalValues((prev) => {\n const next = { ...prev, [name]: value };\n\n // Update version state (will be batched with values update)\n setLocalVersion(newVersion);\n\n // Only send event once per version (prevents duplicate sends in StrictMode)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"validate\",\n prop: propName,\n attrs: next,\n _v: newVersion,\n });\n }\n\n return next;\n });\n }, [propName]);\n\n // 6. Identity-Stable Field Props\n const getFieldProps = useCallback(\n (name: string): FieldProps => {\n const type = schema.types[name];\n const value = localValues[name];\n\n const base = { name };\n\n if (type === \"boolean\" || type === \"bool\") {\n return {\n ...base,\n checked: !!value,\n value: undefined as any,\n onChange: (e) =>\n setField(name, (e.target as HTMLInputElement).checked),\n };\n }\n\n return {\n ...base,\n value: value ?? \"\",\n onChange: (e) => setField(name, e.target.value),\n };\n },\n [localValues, schema.types, setField]\n );\n\n const getError = useCallback(\n (name: string) => form.errors?.[name]?.[0],\n [form.errors]\n );\n\n const isRequired = useCallback(\n (name: string) => schema.required.includes(name),\n [schema.required]\n );\n\n const isTouched = useCallback(\n (name: string) => touched.includes(name),\n [touched]\n );\n\n // 7. Versioned Submit Handler\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n\n // Increment version for submit as well\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n setLocalVersion(newVersion);\n\n // Only send once (prevents duplicate sends if called twice)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"submit\",\n prop: propName,\n attrs: localValues,\n _v: newVersion,\n });\n }\n },\n [localValues, propName]\n );\n\n const reset = useCallback(() => {\n setLocalValues(form.values ?? {});\n setTouched([]);\n // Reset local version to match server\n localVersionRef.current = form.version ?? 0;\n setLocalVersion(form.version ?? 0);\n }, [form.values, form.version]);\n\n // 8. Derived States - The \"Validation Lock\"\n // isSyncing: True when client has sent changes that server hasn't acknowledged\n const isSyncing = localVersion > serverVersion;\n\n // isValid: True only when:\n // 1. Form is in sync (server has seen all changes)\n // 2. Server says the form is valid\n // This ensures users cannot submit until server validates the latest data\n const isValid = !isSyncing && (form.isValid ?? false);\n\n return {\n values: localValues,\n errors: form.errors ?? {},\n types: schema.types,\n required: schema.required,\n touched,\n getFieldProps,\n getError,\n isRequired,\n isTouched,\n setField,\n handleSubmit,\n reset,\n isSyncing,\n isValid,\n localVersion,\n serverVersion,\n };\n}\n"],"names":["NullContextProvider","createContext","memo","useMemo","useSyncExternalStore","useRef","createPortal","IslandsManager","useContext","useState","useEffect","useCallback"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/types.ts","../src/context.ts","../src/PortalIslandsRenderer.tsx","../src/IndividualIslandRenderer.tsx","../src/islandsManager.ts","../src/createHooks.ts","../src/useStream.ts","../src/useForm.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import { createContext } from \"react\";\nimport type { IslandStoreAccess } from \"./types\";\n\nexport interface IslandContext {\n id: string;\n storeAccess: IslandStoreAccess;\n}\n\nexport const IslandContextProvider = createContext<IslandContext | null>(null);\n","import React, { useRef, memo, useSyncExternalStore, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type {\n IslandData,\n SharedIslandsRendererProps,\n IslandStoreAccess,\n} from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nconst PortalIsland = memo(\n ({\n data,\n storeAccess,\n }: {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n }) => {\n const {\n Component,\n ContextProvider,\n id,\n pushEvent,\n ssrStrategy,\n el,\n globalKeys,\n } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n const contextValue = useMemo(\n () => ({ id, storeAccess }),\n [id, storeAccess]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => null\n );\n\n const allGlobals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n () => null\n );\n\n const didClearRef = useRef(false);\n if (ssrStrategy === \"overwrite\" && !didClearRef.current) {\n el.innerHTML = \"\";\n didClearRef.current = true;\n }\n\n if (!allGlobals) {\n console.log(\"[PortalIsland] Waiting for globals\", id);\n return null;\n }\n\n console.log(\"[PortalIsland] Rendering\", { id, allGlobals });\n\n const relevantGlobals: Record<string, any> = {};\n if (allGlobals) {\n globalKeys.forEach((key) => {\n if (key in allGlobals) {\n relevantGlobals[key] = allGlobals[key];\n }\n });\n }\n\n const mergedProps = { ...relevantGlobals, ...currentProps };\n\n const islandNode = (\n <MemoizedComponent {...mergedProps} id={id} pushEvent={pushEvent} />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n const content = MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n\n return createPortal(content, el);\n }\n);\nPortalIsland.displayName = \"[ReactLiveIslands]PortalIsland\";\n\nexport const PortalIslandsRenderer: React.FC<SharedIslandsRendererProps> = ({\n storeAccess,\n}) => {\n const sharedIslandsObj = useSyncExternalStore(\n storeAccess.subscribeToSharedIslands,\n storeAccess.getSharedIslands\n );\n\n const islands = Object.values(sharedIslandsObj);\n\n console.log(\n \"[PortalIslandsRenderer] Rendering islands:\",\n islands.map((d) => d.id)\n );\n\n return (\n <>\n {islands.map((data) => (\n <PortalIsland key={data.id} data={data} storeAccess={storeAccess} />\n ))}\n </>\n );\n};\nPortalIslandsRenderer.displayName = \"[ReactLiveIslands]PortalIslandsRenderer\";\n","import React, { useSyncExternalStore, memo, useMemo } from \"react\";\nimport type { IndividualIslandsRendererProps } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport const IndividualIslandRenderer: React.FC<\n IndividualIslandsRendererProps\n> = ({ data, storeAccess }) => {\n const { Component, ContextProvider, id, pushEvent, globalKeys } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => data.hydrationData?.props\n );\n\n // Check once if hydration globals version matches store version\n const serverGlobalsSnapshot = useMemo(() => {\n const hydrationGlobals = data.hydrationData?.globals;\n if (!hydrationGlobals) return () => hydrationGlobals;\n let comparedVersions = false;\n let useStoreReference = false;\n return () => {\n if (!comparedVersions) {\n comparedVersions = true;\n const storeGlobals = storeAccess.getGlobals();\n const hydrationVersion = hydrationGlobals.__version ?? -1;\n const storeVersion = storeGlobals?.__version ?? -1;\n useStoreReference = storeVersion === hydrationVersion;\n }\n return useStoreReference ? storeAccess.getGlobals() : hydrationGlobals;\n };\n }, [data.hydrationData?.globals, storeAccess]);\n\n const globals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n serverGlobalsSnapshot\n );\n\n const filteredGlobals: Record<string, any> = {};\n if (globals) {\n globalKeys.forEach((key) => {\n if (key in globals) {\n filteredGlobals[key] = globals[key];\n }\n });\n }\n\n const contextValue = useMemo(() => ({ id, storeAccess }), [id, storeAccess]);\n\n const islandNode = (\n <MemoizedComponent\n {...filteredGlobals}\n {...currentProps}\n id={id}\n pushEvent={pushEvent}\n />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n return MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n};\n\nIndividualIslandRenderer.displayName =\n \"[ReactLiveIslands] IndividualIslandRenderer\";\n","import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\n\nimport {\n ContextProviderComponent,\n IslandData,\n SharedIslandsRendererComponent,\n IndividualIslandsRendererComponent,\n IslandStoreAccess,\n IndividualIslandsRendererProps,\n StreamAction,\n StreamConfig,\n} from \"./types\";\nimport { PortalIslandsRenderer } from \"./PortalIslandsRenderer\";\nimport { IndividualIslandRenderer } from \"./IndividualIslandRenderer\";\n\n// Constant root ID - one shared root per application\nexport const SHARED_ROOT_ID = \"__live_react_islands_shared_root__\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ManagerState {\n propsStore: Map<string, Record<string, any>>;\n propsListeners: Set<() => void>;\n globalsRef: React.MutableRefObject<Record<string, any> | null>;\n globalsListeners: Set<() => void>;\n sharedIslandsRef: React.MutableRefObject<Record<string, IslandData>>;\n sharedIslandsListeners: Set<() => void>;\n streamsStore: Map<string, any[]>;\n streamsListeners: Map<string, Set<() => void>>;\n streamConfigs: Map<string, StreamConfig>;\n roots: Record<string, any>;\n storeAccess: IslandStoreAccess;\n}\n\nexport interface Manager {\n initialize: (params: {\n SharedContextProvider?: ContextProviderComponent;\n SharedIslandsRenderer?: SharedIslandsRendererComponent;\n }) => ManagerState;\n mountIsland: (\n state: ManagerState,\n data: IslandData,\n IslandRenderer?: IndividualIslandsRendererComponent\n ) => ManagerState;\n unmountIsland: (state: ManagerState, id: string) => ManagerState;\n updateIslandProps: (\n state: ManagerState,\n islandId: string,\n props: Record<string, any>\n ) => ManagerState;\n updateGlobals: (\n state: ManagerState,\n globals: Record<string, any>\n ) => ManagerState;\n resetGlobals: (state: ManagerState) => ManagerState;\n initializeStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n initialItems: any[]\n ) => ManagerState;\n updateStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n action: StreamAction,\n data: any\n ) => ManagerState;\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n\nconst withSharedRootName = (\n ContextProvider: ContextProviderComponent\n): ContextProviderComponent => {\n const originalName =\n ContextProvider.displayName || ContextProvider.name || \"ContextProvider\";\n\n function NamedWrapper({ children }: { children: React.ReactNode }) {\n return React.createElement(ContextProvider, null, children);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] SharedRoot(${originalName})`;\n return NamedWrapper;\n};\n\nconst withIndividualRootName = (\n islandId: string,\n IslandRenderer: IndividualIslandsRendererComponent\n): IndividualIslandsRendererComponent => {\n const originalName = IslandRenderer.displayName;\n\n function NamedWrapper(props: IndividualIslandsRendererProps) {\n return React.createElement(IslandRenderer, props);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] HydratedRoot#${islandId}`;\n return NamedWrapper;\n};\n\nconst getOrCreateSharedRootElement = (): HTMLElement => {\n let rootElement = document.getElementById(SHARED_ROOT_ID);\n if (!rootElement) {\n rootElement = document.createElement(\"div\");\n rootElement.id = SHARED_ROOT_ID;\n rootElement.style.display = \"none\";\n document.body.appendChild(rootElement);\n }\n return rootElement;\n};\n\nconst mountSharedIsland = (\n state: ManagerState,\n data: IslandData\n): ManagerState => {\n state.sharedIslandsRef.current = {\n ...state.sharedIslandsRef.current,\n [data.id]: data,\n };\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n};\n\nconst mountIndividualIsland = (\n state: ManagerState,\n data: IslandData,\n IslandRenderer: IndividualIslandsRendererComponent\n): ManagerState => {\n const NamedIslandRenderer = withIndividualRootName(data.id, IslandRenderer);\n const root = ReactDOM.hydrateRoot(\n data.el,\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(NamedIslandRenderer, {\n data,\n storeAccess: state.storeAccess,\n })\n )\n );\n\n return {\n ...state,\n roots: { ...state.roots, [data.id]: root },\n };\n};\n\n// ============================================================================\n// Island Manager (Bridge between LiveView hook lifecycles and React rendering)\n// ============================================================================\n\nconst ManagerObj: Manager = {\n initialize: ({\n SharedContextProvider = NullContextProvider,\n SharedIslandsRenderer = PortalIslandsRenderer,\n }) => {\n const rootElement = getOrCreateSharedRootElement();\n const root = ReactDOM.createRoot(rootElement);\n\n const propsStore = new Map<string, Record<string, any>>();\n const propsListeners = new Set<() => void>();\n const globalsRef = { current: null as Record<string, any> | null };\n const globalsListeners = new Set<() => void>();\n const sharedIslandsRef = { current: {} as Record<string, IslandData> };\n const sharedIslandsListeners = new Set<() => void>();\n const streamsStore = new Map<string, any[]>();\n const streamsListeners = new Map<string, Set<() => void>>();\n const streamConfigs = new Map<string, StreamConfig>();\n\n const getStreamKey = (islandId: string, streamName: string) =>\n `${islandId}:${streamName}`;\n\n const storeAccess: IslandStoreAccess = {\n getProps: (islandId: string) => propsStore.get(islandId) || null,\n subscribeToProps: (cb: () => void) => {\n propsListeners.add(cb);\n return () => propsListeners.delete(cb);\n },\n getGlobals: () => globalsRef.current,\n subscribeToGlobals: (cb: () => void) => {\n globalsListeners.add(cb);\n return () => globalsListeners.delete(cb);\n },\n getSharedIslands: () => sharedIslandsRef.current,\n subscribeToSharedIslands: (cb: () => void) => {\n sharedIslandsListeners.add(cb);\n return () => sharedIslandsListeners.delete(cb);\n },\n getStreamItems: (islandId: string, streamName: string) => {\n const key = getStreamKey(islandId, streamName);\n return streamsStore.get(key) || [];\n },\n subscribeToStream: (\n islandId: string,\n streamName: string,\n cb: () => void,\n config?: StreamConfig\n ) => {\n const key = getStreamKey(islandId, streamName);\n if (config) {\n streamConfigs.set(key, config);\n }\n if (!streamsListeners.has(key)) {\n streamsListeners.set(key, new Set());\n }\n streamsListeners.get(key)!.add(cb);\n return () => {\n streamsListeners.get(key)?.delete(cb);\n if (streamsListeners.get(key)?.size === 0) {\n streamConfigs.delete(key);\n }\n };\n },\n };\n\n const state: ManagerState = {\n propsStore,\n globalsRef,\n propsListeners,\n globalsListeners,\n sharedIslandsRef,\n sharedIslandsListeners,\n streamsStore,\n streamsListeners,\n streamConfigs,\n roots: { [SHARED_ROOT_ID]: root },\n storeAccess,\n };\n\n const NamedSharedContextProvider = withSharedRootName(\n SharedContextProvider\n );\n\n root.render(\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(\n NamedSharedContextProvider,\n null,\n React.createElement(SharedIslandsRenderer, {\n storeAccess: state.storeAccess,\n })\n )\n )\n );\n\n return state;\n },\n mountIsland: (state, data, IslandRenderer = IndividualIslandRenderer) => {\n switch (data.ssrStrategy) {\n case \"hydrate_root\":\n return mountIndividualIsland(state, data, IslandRenderer);\n default:\n return mountSharedIsland(state, data);\n }\n },\n unmountIsland: (state, id) => {\n state.propsStore.delete(id);\n\n const streamPrefix = `${id}:`;\n for (const key of state.streamsStore.keys()) {\n if (key.startsWith(streamPrefix)) {\n state.streamsStore.delete(key);\n state.streamsListeners.delete(key);\n state.streamConfigs.delete(key);\n }\n }\n\n if (state.roots[id]) {\n state.roots[id].unmount();\n const { [id]: removedRoot, ...remainingRoots } = state.roots;\n return {\n ...state,\n roots: remainingRoots,\n };\n } else {\n const { [id]: removed, ...remaining } = state.sharedIslandsRef.current;\n state.sharedIslandsRef.current = remaining;\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n }\n },\n updateIslandProps: (state, islandId, props) => {\n const existing = state.propsStore.get(islandId) || {};\n state.propsStore.set(islandId, { ...existing, ...props });\n state.propsListeners.forEach((cb) => cb());\n return state;\n },\n updateGlobals: (state, globals) => {\n const incomingVersion = globals.__version ?? -1;\n const storeVersion = state.globalsRef.current?.__version ?? -1;\n if (incomingVersion > storeVersion) {\n state.globalsRef.current = {\n ...(state.globalsRef.current || {}),\n ...globals,\n };\n state.globalsListeners.forEach((cb) => cb());\n }\n\n return state;\n },\n resetGlobals: (state) => {\n state.globalsRef.current = null;\n return state;\n },\n initializeStream: (state, islandId, streamName, initialItems) => {\n const key = `${islandId}:${streamName}`;\n state.streamsStore.set(key, [...initialItems]);\n return state;\n },\n updateStream: (state, islandId, streamName, action, data) => {\n const key = `${islandId}:${streamName}`;\n let items = state.streamsStore.get(key) || [];\n const config = state.streamConfigs.get(key);\n\n switch (action) {\n case StreamAction.Insert:\n items = [data, ...items];\n break;\n case StreamAction.Update:\n const idx = items.findIndex((item) => item.id === data.id);\n if (idx !== -1) {\n items = [...items];\n items[idx] = { ...items[idx], ...data };\n }\n break;\n case StreamAction.Delete:\n items = items.filter((item) => item.id !== data);\n break;\n case StreamAction.Reset:\n items = [];\n break;\n }\n\n if (config?.capper) {\n items = config.capper(items);\n } else if (config?.limit !== undefined && items.length > config.limit) {\n items = items.slice(0, config.limit);\n }\n\n state.streamsStore.set(key, items);\n state.streamsListeners.get(key)?.forEach((cb) => cb());\n return state;\n },\n};\nexport default ManagerObj;\n","import IslandsManager, { Manager } from \"./islandsManager\";\nimport {\n type IslandsMap,\n type SSRStrategy,\n type PushEventFn,\n type ContextProviderComponent,\n type IslandComponent,\n type LazyIslandFactory,\n type StreamHandle,\n NullContextProvider,\n StreamAction,\n} from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface LiveViewHook {\n el: HTMLElement;\n liveSocket: {\n on: (\n event: string,\n callback: (e: CustomEvent<{ kind: string }>) => void\n ) => void;\n };\n pushEvent: (\n event: string,\n payload: any,\n callback?: (reply: any, ref: any) => void\n ) => void;\n pushEventTo: (target: string, event: string, payload: any) => void;\n handleEvent: (event: string, callback: (data: any) => void) => void;\n}\n\nexport interface CreateHooksOptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n manager?: Manager;\n}\n\n// ============================================================================\n// Event Handler Adapter\n// ============================================================================\n\nfunction createPushEventFn(hook: LiveViewHook): PushEventFn {\n return (eventName: string, payload: any) => {\n hook.pushEventTo(`#${hook.el.id}`, eventName, payload);\n };\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst resolvedComponentsCache = new Map<string, IslandComponent>();\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n // Check if it's a React component (has prototype.isReactComponent for class components)\n if ((value as any).prototype?.isReactComponent) return false;\n // Check if it's a config object getter (would have Component property)\n if ((value as any).Component) return false;\n // Assume zero-arg functions that aren't class components are lazy factories\n return value.length === 0;\n};\n\nconst resolveIslandConfig = async (\n islandsMap: IslandsMap,\n componentName: string,\n defaultContextProvider: ContextProviderComponent\n): Promise<{\n Component: IslandComponent;\n ContextProvider: ContextProviderComponent;\n} | null> => {\n const config = islandsMap[componentName];\n\n if (!config) {\n return null;\n }\n\n // Check cache first for lazy-loaded components\n const cached = resolvedComponentsCache.get(componentName);\n if (cached) {\n return { Component: cached, ContextProvider: defaultContextProvider };\n }\n\n // Handle lazy factory: () => import(\"./Component\")\n if (isLazyFactory(config)) {\n const mod = await config();\n const Component = mod.default;\n resolvedComponentsCache.set(componentName, Component);\n return { Component, ContextProvider: defaultContextProvider };\n }\n\n // Handle direct component\n if (typeof config === \"function\") {\n return { Component: config, ContextProvider: defaultContextProvider };\n }\n\n // Handle config object\n return {\n Component: config.Component,\n ContextProvider: config.ContextProvider || defaultContextProvider,\n };\n};\n\n// ============================================================================\n// Main Hook Factory (LiveView Adapter Layer)\n// ============================================================================\n\nexport function createHooks({\n islands: islandsMap = {},\n SharedContextProvider = NullContextProvider,\n manager = IslandsManager,\n}: CreateHooksOptions) {\n console.log(`[LiveReactIslands] Creating hooks`);\n let managerState = manager.initialize({ SharedContextProvider });\n\n let globalsRequested = false;\n const pendingMounts = new Set<string>();\n let navigationListenerAttached = false;\n\n const Hook: Partial<LiveViewHook> & {\n mounted: (this: LiveViewHook) => void;\n updated?: (this: LiveViewHook) => void;\n destroyed: (this: LiveViewHook) => void;\n } = {\n mounted(this: LiveViewHook) {\n console.log(\"[Hook] Mount:\", this.el.id);\n if (!this.el.id) {\n console.error(`[LiveReactIslands] Island element missing unique id`);\n return;\n }\n\n if (!navigationListenerAttached) {\n navigationListenerAttached = true;\n this.liveSocket.on(\"phx:page-loading-start\", (e) => {\n // Patches (e.g. push_patch tab switches) stay within the same\n // LiveView mount and globals version counter, so islands that\n // remain mounted through the patch must keep their cached\n // globals. Only a real navigation (new mount, version resets\n // to 0 server-side) needs the stale client-side version cleared.\n if (e.detail?.kind === \"patch\") return;\n globalsRequested = false;\n managerState = manager.resetGlobals(managerState);\n });\n }\n\n // Pull globals once on first island mount\n if (!globalsRequested) {\n globalsRequested = true;\n this.handleEvent(\"lri-g\", (data) => {\n managerState = manager.updateGlobals(managerState, data);\n });\n this.pushEvent(\"lri-g\", {}, (reply) => {\n managerState = manager.updateGlobals(managerState, reply);\n });\n }\n\n const {\n comp: componentName,\n ssr: ssrData,\n props: propsData,\n schema: schemaData,\n globals: globalsData,\n globalsVersion: globalsVersionData,\n } = this.el.dataset;\n if (!componentName) {\n console.error(\n `[LiveReactIslands] Element '${this.el.id}' missing data-comp attribute`\n );\n return;\n }\n\n let schema: { p: string[]; g: string[]; i: number } = {\n p: [],\n g: [],\n i: 0,\n };\n if (schemaData) {\n try {\n schema = JSON.parse(schemaData);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-schema:`,\n e\n );\n }\n }\n\n let initialProps: Record<string, any> = {};\n if (propsData) {\n try {\n const propsArray = JSON.parse(propsData);\n schema.p.forEach((propName, idx) => {\n const value = propsArray[idx];\n if (value?.__s !== undefined) {\n const streamName = schema.p[value.__s];\n managerState = manager.initializeStream(\n managerState,\n this.el.id,\n streamName,\n value.i\n );\n const handle: StreamHandle = {\n name: streamName,\n initial: value.i,\n };\n initialProps[propName] = handle;\n } else {\n initialProps[propName] = value;\n }\n });\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-props:`,\n e\n );\n }\n }\n\n // Only for hydrate_root strategy\n let initialGlobals: Record<string, any> = {};\n if (globalsData) {\n try {\n const globalsArray = JSON.parse(globalsData);\n schema.g.forEach((globalName, idx) => {\n initialGlobals[globalName] = globalsArray[idx];\n });\n if (!globalsVersionData)\n throw \"Missing data-globals-version attribute\";\n initialGlobals.__version = parseInt(globalsVersionData, 10);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-globals:`,\n e\n );\n }\n }\n\n let ssrStrategy: SSRStrategy;\n switch (ssrData) {\n case \"overwrite\":\n ssrStrategy = \"overwrite\";\n break;\n case \"hydrate_root\":\n ssrStrategy = \"hydrate_root\";\n break;\n default:\n ssrStrategy = \"none\";\n }\n\n const pushEvent = createPushEventFn(this);\n const elId = this.el.id;\n const el = this.el;\n\n pendingMounts.add(elId);\n\n (async () => {\n const islandConfig = await resolveIslandConfig(\n islandsMap,\n componentName,\n NullContextProvider\n );\n\n if (!pendingMounts.has(elId)) return;\n pendingMounts.delete(elId);\n\n if (!islandConfig) {\n console.error(\n `[LiveReactIslands] React island '${componentName}' not found`\n );\n return;\n }\n\n managerState = manager.updateIslandProps(\n managerState,\n elId,\n initialProps\n );\n\n managerState = manager.mountIsland(managerState, {\n id: elId,\n el,\n Component: islandConfig.Component,\n ContextProvider: islandConfig.ContextProvider,\n ssrStrategy,\n pushEvent,\n hydrationData:\n ssrStrategy === \"hydrate_root\"\n ? { props: initialProps, globals: initialGlobals }\n : null,\n globalKeys: schema.g,\n });\n })();\n\n this.handleEvent(\n \"lri-p\",\n (payload: { i: number; [key: number]: any }) => {\n if (payload.i !== schema.i) return;\n\n const props: Record<string, any> = {};\n Object.entries(payload).forEach(([key, value]) => {\n if (key === \"i\") return;\n const idx = parseInt(key, 10);\n if (!isNaN(idx) && schema.p[idx]) {\n props[schema.p[idx]] = value;\n }\n });\n\n managerState = manager.updateIslandProps(\n managerState,\n this.el.id,\n props\n );\n }\n );\n\n this.handleEvent(\n \"lri-s\",\n (payload: { s: number; a: StreamAction; d: any; i: number }) => {\n if (payload.i !== schema.i) return;\n\n const streamName = schema.p[payload.s];\n if (!streamName) return;\n\n managerState = manager.updateStream(\n managerState,\n this.el.id,\n streamName,\n payload.a,\n payload.d\n );\n }\n );\n },\n\n updated(this: LiveViewHook) {\n console.log(\"[Hook] Updated:\", this.el.id);\n },\n\n destroyed(this: LiveViewHook) {\n console.log(\"[Hook] Destroyed:\", this.el.id);\n pendingMounts.delete(this.el.id);\n managerState = manager.unmountIsland(managerState, this.el.id);\n },\n };\n\n return { LiveReactIslands: Hook };\n}\n","import { useContext, useSyncExternalStore, useMemo } from \"react\";\nimport type { StreamHandle } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport interface UseStreamOptions<T> {\n limit?: number;\n capper?: (items: T[]) => T[];\n}\n\nexport function useStream<T extends { id: string | number }>(\n handle: StreamHandle,\n options?: UseStreamOptions<T>\n): T[] {\n const context = useContext(IslandContextProvider);\n if (!context) {\n throw new Error(\"useStream must be used within an Island component\");\n }\n\n const { id: islandId, storeAccess } = context;\n\n const subscribe = useMemo(\n () => (cb: () => void) =>\n storeAccess.subscribeToStream(islandId, handle.name, cb, {\n limit: options?.limit,\n capper: options?.capper as ((items: any[]) => any[]) | undefined,\n }),\n [storeAccess, islandId, handle.name, options?.limit, options?.capper]\n );\n\n const getSnapshot = useMemo(\n () => () => storeAccess.getStreamItems(islandId, handle.name) as T[],\n [storeAccess, islandId, handle.name]\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, () => handle.initial as T[]);\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\n\nexport interface FormProps {\n /** Internal: prop name for event routing (set by server) */\n __prop?: string;\n types?: Record<string, string>;\n required?: string[];\n values: Record<string, any>;\n errors: Record<string, string[]>;\n isValid?: boolean;\n version?: number;\n}\n\nexport type PushEventFn = (event: string, payload: Record<string, any>) => void;\n\nexport interface FieldProps {\n name: string;\n value: any;\n checked?: boolean;\n onChange: (\n e: React.ChangeEvent<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >\n ) => void;\n}\n\nexport interface UseFormReturn {\n /** Current form field values */\n values: Record<string, any>;\n /** Current form errors by field name */\n errors: Record<string, string[]>;\n /** Field types from schema */\n types: Record<string, string>;\n /** Required field names */\n required: string[];\n /** Field names that have been modified by the user */\n touched: string[];\n /** Get props to spread on an input element */\n getFieldProps: (name: string) => FieldProps;\n /** Get the first error message for a field */\n getError: (name: string) => string | undefined;\n /** Check if a field is required */\n isRequired: (name: string) => boolean;\n /** Check if a field has been modified by the user */\n isTouched: (name: string) => boolean;\n /** Set a field value programmatically */\n setField: (name: string, value: any) => void;\n /** Handle form submission */\n handleSubmit: (e?: React.FormEvent) => void;\n /** Reset form to server values */\n reset: () => void;\n /**\n * True when the server hasn't acknowledged the latest client changes.\n * Use this to show a syncing indicator (e.g., spinner, \"Validating...\").\n */\n isSyncing: boolean;\n /**\n * True only when form is valid AND fully synced with server.\n * Use this to enable/disable the submit button.\n * This is the \"Validation Lock\" - users cannot submit until server confirms validity.\n */\n isValid: boolean;\n /** Current local version counter */\n localVersion: number;\n /** Last acknowledged server version */\n serverVersion: number;\n}\n\nexport function useForm(\n form: FormProps,\n pushEvent?: PushEventFn\n): UseFormReturn {\n // 1. Version Tracking\n // Local version increments on each field change\n // Server version comes from form.version prop\n const localVersionRef = useRef(form.version ?? 0);\n const lastSentVersionRef = useRef(0); // Prevents duplicate sends in StrictMode\n const [localVersion, setLocalVersion] = useState(form.version ?? 0);\n const serverVersion = form.version ?? 0;\n\n // Prop name comes from server (embedded in form data)\n const propName = form.__prop;\n\n // Reset local version when server sends a reset (version 0 with new schema)\n useEffect(() => {\n if (form.version === 0 && form.types) {\n localVersionRef.current = 0;\n setLocalVersion(0);\n }\n }, [form.version, form.types]);\n\n // 3. Persistent Schema\n // We only update these when the server explicitly sends them (usually on init)\n const [schema, setSchema] = useState({\n types: form.types ?? {},\n required: form.required ?? [],\n });\n\n if (form.types && form.types !== schema.types) {\n setSchema((prev) => ({ ...prev, types: form.types! }));\n }\n if (form.required && form.required !== schema.required) {\n setSchema((prev) => ({ ...prev, required: form.required! }));\n }\n\n // 4. Values Management\n const [localValues, setLocalValues] = useState<Record<string, any>>(\n form.values ?? {}\n );\n\n // 5. Touched Tracking (client-side only)\n const [touched, setTouched] = useState<string[]>([]);\n\n // Sync from server: Update local values when server sends updates\n useEffect(() => {\n setLocalValues((prev) => ({ ...prev, ...form.values }));\n }, [form.values]);\n\n // 6. Versioned Change Handler\n const setField = useCallback((name: string, value: any) => {\n // Mark field as touched\n setTouched((prev) => (prev.includes(name) ? prev : [...prev, name]));\n\n // Increment version BEFORE state update to avoid StrictMode double-increment\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n\n setLocalValues((prev) => {\n const next = { ...prev, [name]: value };\n\n // Update version state (will be batched with values update)\n setLocalVersion(newVersion);\n\n // Only send event once per version (prevents duplicate sends in StrictMode)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"validate\",\n prop: propName,\n attrs: next,\n _v: newVersion,\n });\n }\n\n return next;\n });\n }, [propName]);\n\n // 6. Identity-Stable Field Props\n const getFieldProps = useCallback(\n (name: string): FieldProps => {\n const type = schema.types[name];\n const value = localValues[name];\n\n const base = { name };\n\n if (type === \"boolean\" || type === \"bool\") {\n return {\n ...base,\n checked: !!value,\n value: undefined as any,\n onChange: (e) =>\n setField(name, (e.target as HTMLInputElement).checked),\n };\n }\n\n return {\n ...base,\n value: value ?? \"\",\n onChange: (e) => setField(name, e.target.value),\n };\n },\n [localValues, schema.types, setField]\n );\n\n const getError = useCallback(\n (name: string) => form.errors?.[name]?.[0],\n [form.errors]\n );\n\n const isRequired = useCallback(\n (name: string) => schema.required.includes(name),\n [schema.required]\n );\n\n const isTouched = useCallback(\n (name: string) => touched.includes(name),\n [touched]\n );\n\n // 7. Versioned Submit Handler\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n\n // Increment version for submit as well\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n setLocalVersion(newVersion);\n\n // Only send once (prevents duplicate sends if called twice)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"submit\",\n prop: propName,\n attrs: localValues,\n _v: newVersion,\n });\n }\n },\n [localValues, propName]\n );\n\n const reset = useCallback(() => {\n setLocalValues(form.values ?? {});\n setTouched([]);\n // Reset local version to match server\n localVersionRef.current = form.version ?? 0;\n setLocalVersion(form.version ?? 0);\n }, [form.values, form.version]);\n\n // 8. Derived States - The \"Validation Lock\"\n // isSyncing: True when client has sent changes that server hasn't acknowledged\n const isSyncing = localVersion > serverVersion;\n\n // isValid: True only when:\n // 1. Form is in sync (server has seen all changes)\n // 2. Server says the form is valid\n // This ensures users cannot submit until server validates the latest data\n const isValid = !isSyncing && (form.isValid ?? false);\n\n return {\n values: localValues,\n errors: form.errors ?? {},\n types: schema.types,\n required: schema.required,\n touched,\n getFieldProps,\n getError,\n isRequired,\n isTouched,\n setField,\n handleSubmit,\n reset,\n isSyncing,\n isValid,\n localVersion,\n serverVersion,\n };\n}\n"],"names":["NullContextProvider","createContext","memo","useMemo","useSyncExternalStore","useRef","createPortal","IslandsManager","useContext","useState","useEffect","useCallback"],"mappings":"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"}
|
package/dist/ssr.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr.esm.js","sources":["../src/types.ts","../src/ssr.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import React from \"react\";\nimport { renderToString, renderToStaticMarkup } from \"react-dom/server\";\nimport {\n type IslandsMap,\n type IslandComponent,\n type ContextProviderComponent,\n type LazyIslandFactory,\n NullContextProvider,\n} from \"./types\";\n\nexport interface ExposeSSROptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n}\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n if ((value as any).prototype?.isReactComponent) return false;\n if ((value as any).Component) return false;\n return value.length === 0;\n};\n\n/**\n * Server-side rendering function for React islands.\n *\n * This function creates SSR renderers for your island components.\n * It works in any JavaScript runtime: Deno, Node, Bun, etc.\n *\n * Supports lazy-loaded islands: () => import(\"./Component\")\n */\nexport async function exposeSSR({\n islands,\n SharedContextProvider = NullContextProvider,\n}: ExposeSSROptions) {\n // Resolve all lazy imports first\n const resolvedIslands: Record<string, IslandComponent> = {};\n\n for (const [name, config] of Object.entries(islands)) {\n if (isLazyFactory(config)) {\n const mod = await config();\n resolvedIslands[name] = mod.default;\n } else if (typeof config === \"function\") {\n resolvedIslands[name] = config;\n } else {\n resolvedIslands[name] = config.Component;\n }\n }\n const makeRenderer =\n (renderFn: typeof renderToString | typeof renderToStaticMarkup) =>\n (IslandComponent: any) =>\n (\n id: string,\n props: Record<string, any> = {},\n globals: Record<string, any> = {}\n ) => {\n return renderFn(\n React.createElement(\n SharedContextProvider,\n null,\n React.createElement(IslandComponent, {\n ...globals,\n ...props,\n id,\n pushEvent: () => {},\n })\n )\n );\n };\n\n // Create renderers for both strategies using pre-resolved components\n // - renderToString: For hydrate_root (includes React markers for hydration)\n // - renderToStaticMarkup: For overwrite (clean HTML, smaller size)\n const hydrateRenderers = Object.fromEntries(\n Object.entries(resolvedIslands).map(([key, Component]) => [\n key,\n makeRenderer(renderToString)(Component),\n ])\n );\n\n const overwriteRenderers = Object.fromEntries(\n Object.entries(resolvedIslands).map(([key, Component]) => [\n key,\n makeRenderer(renderToStaticMarkup)(Component),\n ])\n );\n\n // Main render function that chooses renderer based on strategy\n const renderSSRIsland = (\n key: string,\n id: string,\n props: Record<string, any> = {},\n globalState: any = {},\n strategy: \"hydrate_root\" | \"overwrite\" = \"overwrite\"\n ): string => {\n const renderers =\n strategy === \"hydrate_root\" ? hydrateRenderers : overwriteRenderers;\n if (!renderers[key]) {\n throw new Error(`No SSR renderer found for Component \"${key}\"`);\n }\n return renderers[key](id, props, globalState);\n };\n\n const getGlobal = () => {\n if (typeof globalThis !== \"undefined\") return globalThis;\n // @ts-ignore\n if (typeof global !== \"undefined\") return global;\n if (typeof window !== \"undefined\") return window;\n return {};\n };\n\n const universalGlobal = getGlobal();\n //@ts-ignore\n universalGlobal.SSR_MODULE = {\n renderSSRIsland,\n hydrateRenderers,\n overwriteRenderers,\n };\n}\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ssr.esm.js","sources":["../src/types.ts","../src/ssr.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import React from \"react\";\nimport { renderToString, renderToStaticMarkup } from \"react-dom/server\";\nimport {\n type IslandsMap,\n type IslandComponent,\n type ContextProviderComponent,\n type LazyIslandFactory,\n NullContextProvider,\n} from \"./types\";\n\nexport interface ExposeSSROptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n}\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n if ((value as any).prototype?.isReactComponent) return false;\n if ((value as any).Component) return false;\n return value.length === 0;\n};\n\n/**\n * Server-side rendering function for React islands.\n *\n * This function creates SSR renderers for your island components.\n * It works in any JavaScript runtime: Deno, Node, Bun, etc.\n *\n * Supports lazy-loaded islands: () => import(\"./Component\")\n */\nexport async function exposeSSR({\n islands,\n SharedContextProvider = NullContextProvider,\n}: ExposeSSROptions) {\n // Resolve all lazy imports first\n const resolvedIslands: Record<string, IslandComponent> = {};\n\n for (const [name, config] of Object.entries(islands)) {\n if (isLazyFactory(config)) {\n const mod = await config();\n resolvedIslands[name] = mod.default;\n } else if (typeof config === \"function\") {\n resolvedIslands[name] = config;\n } else {\n resolvedIslands[name] = config.Component;\n }\n }\n const makeRenderer =\n (renderFn: typeof renderToString | typeof renderToStaticMarkup) =>\n (IslandComponent: any) =>\n (\n id: string,\n props: Record<string, any> = {},\n globals: Record<string, any> = {}\n ) => {\n return renderFn(\n React.createElement(\n SharedContextProvider,\n null,\n React.createElement(IslandComponent, {\n ...globals,\n ...props,\n id,\n pushEvent: () => {},\n })\n )\n );\n };\n\n // Create renderers for both strategies using pre-resolved components\n // - renderToString: For hydrate_root (includes React markers for hydration)\n // - renderToStaticMarkup: For overwrite (clean HTML, smaller size)\n const hydrateRenderers = Object.fromEntries(\n Object.entries(resolvedIslands).map(([key, Component]) => [\n key,\n makeRenderer(renderToString)(Component),\n ])\n );\n\n const overwriteRenderers = Object.fromEntries(\n Object.entries(resolvedIslands).map(([key, Component]) => [\n key,\n makeRenderer(renderToStaticMarkup)(Component),\n ])\n );\n\n // Main render function that chooses renderer based on strategy\n const renderSSRIsland = (\n key: string,\n id: string,\n props: Record<string, any> = {},\n globalState: any = {},\n strategy: \"hydrate_root\" | \"overwrite\" = \"overwrite\"\n ): string => {\n const renderers =\n strategy === \"hydrate_root\" ? hydrateRenderers : overwriteRenderers;\n if (!renderers[key]) {\n throw new Error(`No SSR renderer found for Component \"${key}\"`);\n }\n return renderers[key](id, props, globalState);\n };\n\n const getGlobal = () => {\n if (typeof globalThis !== \"undefined\") return globalThis;\n // @ts-ignore\n if (typeof global !== \"undefined\") return global;\n if (typeof window !== \"undefined\") return window;\n return {};\n };\n\n const universalGlobal = getGlobal();\n //@ts-ignore\n universalGlobal.SSR_MODULE = {\n renderSSRIsland,\n hydrateRenderers,\n overwriteRenderers,\n };\n}\n"],"names":[],"mappings":"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"}
|
package/dist/ssr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr.js","sources":["../src/types.ts","../src/ssr.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import React from \"react\";\nimport { renderToString, renderToStaticMarkup } from \"react-dom/server\";\nimport {\n type IslandsMap,\n type IslandComponent,\n type ContextProviderComponent,\n type LazyIslandFactory,\n NullContextProvider,\n} from \"./types\";\n\nexport interface ExposeSSROptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n}\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n if ((value as any).prototype?.isReactComponent) return false;\n if ((value as any).Component) return false;\n return value.length === 0;\n};\n\n/**\n * Server-side rendering function for React islands.\n *\n * This function creates SSR renderers for your island components.\n * It works in any JavaScript runtime: Deno, Node, Bun, etc.\n *\n * Supports lazy-loaded islands: () => import(\"./Component\")\n */\nexport async function exposeSSR({\n islands,\n SharedContextProvider = NullContextProvider,\n}: ExposeSSROptions) {\n // Resolve all lazy imports first\n const resolvedIslands: Record<string, IslandComponent> = {};\n\n for (const [name, config] of Object.entries(islands)) {\n if (isLazyFactory(config)) {\n const mod = await config();\n resolvedIslands[name] = mod.default;\n } else if (typeof config === \"function\") {\n resolvedIslands[name] = config;\n } else {\n resolvedIslands[name] = config.Component;\n }\n }\n const makeRenderer =\n (renderFn: typeof renderToString | typeof renderToStaticMarkup) =>\n (IslandComponent: any) =>\n (\n id: string,\n props: Record<string, any> = {},\n globals: Record<string, any> = {}\n ) => {\n return renderFn(\n React.createElement(\n SharedContextProvider,\n null,\n React.createElement(IslandComponent, {\n ...globals,\n ...props,\n id,\n pushEvent: () => {},\n })\n )\n );\n };\n\n // Create renderers for both strategies using pre-resolved components\n // - renderToString: For hydrate_root (includes React markers for hydration)\n // - renderToStaticMarkup: For overwrite (clean HTML, smaller size)\n const hydrateRenderers = Object.fromEntries(\n Object.entries(resolvedIslands).map(([key, Component]) => [\n key,\n makeRenderer(renderToString)(Component),\n ])\n );\n\n const overwriteRenderers = Object.fromEntries(\n Object.entries(resolvedIslands).map(([key, Component]) => [\n key,\n makeRenderer(renderToStaticMarkup)(Component),\n ])\n );\n\n // Main render function that chooses renderer based on strategy\n const renderSSRIsland = (\n key: string,\n id: string,\n props: Record<string, any> = {},\n globalState: any = {},\n strategy: \"hydrate_root\" | \"overwrite\" = \"overwrite\"\n ): string => {\n const renderers =\n strategy === \"hydrate_root\" ? hydrateRenderers : overwriteRenderers;\n if (!renderers[key]) {\n throw new Error(`No SSR renderer found for Component \"${key}\"`);\n }\n return renderers[key](id, props, globalState);\n };\n\n const getGlobal = () => {\n if (typeof globalThis !== \"undefined\") return globalThis;\n // @ts-ignore\n if (typeof global !== \"undefined\") return global;\n if (typeof window !== \"undefined\") return window;\n return {};\n };\n\n const universalGlobal = getGlobal();\n //@ts-ignore\n universalGlobal.SSR_MODULE = {\n renderSSRIsland,\n hydrateRenderers,\n overwriteRenderers,\n };\n}\n"],"names":["renderToString","renderToStaticMarkup"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ssr.js","sources":["../src/types.ts","../src/ssr.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import React from \"react\";\nimport { renderToString, renderToStaticMarkup } from \"react-dom/server\";\nimport {\n type IslandsMap,\n type IslandComponent,\n type ContextProviderComponent,\n type LazyIslandFactory,\n NullContextProvider,\n} from \"./types\";\n\nexport interface ExposeSSROptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n}\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n if ((value as any).prototype?.isReactComponent) return false;\n if ((value as any).Component) return false;\n return value.length === 0;\n};\n\n/**\n * Server-side rendering function for React islands.\n *\n * This function creates SSR renderers for your island components.\n * It works in any JavaScript runtime: Deno, Node, Bun, etc.\n *\n * Supports lazy-loaded islands: () => import(\"./Component\")\n */\nexport async function exposeSSR({\n islands,\n SharedContextProvider = NullContextProvider,\n}: ExposeSSROptions) {\n // Resolve all lazy imports first\n const resolvedIslands: Record<string, IslandComponent> = {};\n\n for (const [name, config] of Object.entries(islands)) {\n if (isLazyFactory(config)) {\n const mod = await config();\n resolvedIslands[name] = mod.default;\n } else if (typeof config === \"function\") {\n resolvedIslands[name] = config;\n } else {\n resolvedIslands[name] = config.Component;\n }\n }\n const makeRenderer =\n (renderFn: typeof renderToString | typeof renderToStaticMarkup) =>\n (IslandComponent: any) =>\n (\n id: string,\n props: Record<string, any> = {},\n globals: Record<string, any> = {}\n ) => {\n return renderFn(\n React.createElement(\n SharedContextProvider,\n null,\n React.createElement(IslandComponent, {\n ...globals,\n ...props,\n id,\n pushEvent: () => {},\n })\n )\n );\n };\n\n // Create renderers for both strategies using pre-resolved components\n // - renderToString: For hydrate_root (includes React markers for hydration)\n // - renderToStaticMarkup: For overwrite (clean HTML, smaller size)\n const hydrateRenderers = Object.fromEntries(\n Object.entries(resolvedIslands).map(([key, Component]) => [\n key,\n makeRenderer(renderToString)(Component),\n ])\n );\n\n const overwriteRenderers = Object.fromEntries(\n Object.entries(resolvedIslands).map(([key, Component]) => [\n key,\n makeRenderer(renderToStaticMarkup)(Component),\n ])\n );\n\n // Main render function that chooses renderer based on strategy\n const renderSSRIsland = (\n key: string,\n id: string,\n props: Record<string, any> = {},\n globalState: any = {},\n strategy: \"hydrate_root\" | \"overwrite\" = \"overwrite\"\n ): string => {\n const renderers =\n strategy === \"hydrate_root\" ? hydrateRenderers : overwriteRenderers;\n if (!renderers[key]) {\n throw new Error(`No SSR renderer found for Component \"${key}\"`);\n }\n return renderers[key](id, props, globalState);\n };\n\n const getGlobal = () => {\n if (typeof globalThis !== \"undefined\") return globalThis;\n // @ts-ignore\n if (typeof global !== \"undefined\") return global;\n if (typeof window !== \"undefined\") return window;\n return {};\n };\n\n const universalGlobal = getGlobal();\n //@ts-ignore\n universalGlobal.SSR_MODULE = {\n renderSSRIsland,\n hydrateRenderers,\n overwriteRenderers,\n };\n}\n"],"names":["renderToString","renderToStaticMarkup"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@live-react-islands/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Core React integration for LiveReactIslands - Phoenix LiveView hook and utilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -51,22 +51,22 @@
|
|
|
51
51
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@rollup/plugin-commonjs": "^
|
|
55
|
-
"@rollup/plugin-node-resolve": "^
|
|
56
|
-
"@rollup/plugin-typescript": "^
|
|
54
|
+
"@rollup/plugin-commonjs": "^29.0.3",
|
|
55
|
+
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
56
|
+
"@rollup/plugin-typescript": "^12.3.0",
|
|
57
57
|
"@testing-library/dom": "^10.4.1",
|
|
58
|
-
"@testing-library/jest-dom": "^
|
|
59
|
-
"@testing-library/react": "^16.3.
|
|
60
|
-
"@types/jest": "^
|
|
61
|
-
"@types/react": "^
|
|
62
|
-
"@types/react-dom": "^
|
|
63
|
-
"jest": "^
|
|
64
|
-
"jest-environment-jsdom": "^
|
|
65
|
-
"react": "19.2.
|
|
66
|
-
"react-dom": "19.2.
|
|
67
|
-
"rollup": "^4.
|
|
68
|
-
"ts-jest": "^29.
|
|
58
|
+
"@testing-library/jest-dom": "^7.0.1",
|
|
59
|
+
"@testing-library/react": "^16.3.3",
|
|
60
|
+
"@types/jest": "^30.0.0",
|
|
61
|
+
"@types/react": "^19.2.18",
|
|
62
|
+
"@types/react-dom": "^19.2.7",
|
|
63
|
+
"jest": "^30.5.1",
|
|
64
|
+
"jest-environment-jsdom": "^30.5.1",
|
|
65
|
+
"react": "19.2.8",
|
|
66
|
+
"react-dom": "19.2.8",
|
|
67
|
+
"rollup": "^4.63.1",
|
|
68
|
+
"ts-jest": "^29.4.12",
|
|
69
69
|
"tslib": "^2.8.1",
|
|
70
|
-
"typescript": "^5.
|
|
70
|
+
"typescript": "^5.9.3"
|
|
71
71
|
}
|
|
72
72
|
}
|
package/src/createHooks.ts
CHANGED
|
@@ -18,7 +18,10 @@ import {
|
|
|
18
18
|
interface LiveViewHook {
|
|
19
19
|
el: HTMLElement;
|
|
20
20
|
liveSocket: {
|
|
21
|
-
on: (
|
|
21
|
+
on: (
|
|
22
|
+
event: string,
|
|
23
|
+
callback: (e: CustomEvent<{ kind: string }>) => void
|
|
24
|
+
) => void;
|
|
22
25
|
};
|
|
23
26
|
pushEvent: (
|
|
24
27
|
event: string,
|
|
@@ -131,7 +134,13 @@ export function createHooks({
|
|
|
131
134
|
|
|
132
135
|
if (!navigationListenerAttached) {
|
|
133
136
|
navigationListenerAttached = true;
|
|
134
|
-
this.liveSocket.on("phx:page-loading-start", () => {
|
|
137
|
+
this.liveSocket.on("phx:page-loading-start", (e) => {
|
|
138
|
+
// Patches (e.g. push_patch tab switches) stay within the same
|
|
139
|
+
// LiveView mount and globals version counter, so islands that
|
|
140
|
+
// remain mounted through the patch must keep their cached
|
|
141
|
+
// globals. Only a real navigation (new mount, version resets
|
|
142
|
+
// to 0 server-side) needs the stale client-side version cleared.
|
|
143
|
+
if (e.detail?.kind === "patch") return;
|
|
135
144
|
globalsRequested = false;
|
|
136
145
|
managerState = manager.resetGlobals(managerState);
|
|
137
146
|
});
|
package/dist/IslandRenderer.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import type { IslandComponent, PushEventFn } from "./types";
|
|
3
|
-
interface IslandRendererProps {
|
|
4
|
-
Component: IslandComponent;
|
|
5
|
-
props: Record<string, any>;
|
|
6
|
-
id: string;
|
|
7
|
-
pushEvent: PushEventFn;
|
|
8
|
-
}
|
|
9
|
-
export declare const IslandRenderer: React.FC<IslandRendererProps>;
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=IslandRenderer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IslandRenderer.d.ts","sourceRoot":"","sources":["../src/IslandRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAM5D,UAAU,mBAAmB;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,WAAW,CAAC;CACxB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAOxD,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import React, { ComponentType } from "react";
|
|
2
|
-
import type { IslandComponent, PushEventFn } from "../types";
|
|
3
|
-
interface IndividualIslandRendererProps {
|
|
4
|
-
Component: IslandComponent;
|
|
5
|
-
props: Record<string, any>;
|
|
6
|
-
id: string;
|
|
7
|
-
pushEvent: PushEventFn;
|
|
8
|
-
ContextProvider: ComponentType<{
|
|
9
|
-
children: React.ReactNode;
|
|
10
|
-
}>;
|
|
11
|
-
}
|
|
12
|
-
export declare const IndividualIslandRenderer: React.FC<IndividualIslandRendererProps>;
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=IndividualIslandRenderer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IndividualIslandRenderer.d.ts","sourceRoot":"","sources":["../../src/client/IndividualIslandRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM7D,UAAU,6BAA6B;IACrC,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,WAAW,CAAC;IACvB,eAAe,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAC7C,6BAA6B,CAO9B,CAAC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import type { SharedIslandsRendererHandle, SharedIslandsRendererProps } from "../types";
|
|
3
|
-
export declare const PortalIslandsRenderer: React.ForwardRefExoticComponent<SharedIslandsRendererProps & React.RefAttributes<SharedIslandsRendererHandle>>;
|
|
4
|
-
//# sourceMappingURL=PortalIslandsRenderer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PortalIslandsRenderer.d.ts","sourceRoot":"","sources":["../../src/client/PortalIslandsRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAGV,2BAA2B,EAC3B,0BAA0B,EAC3B,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,qBAAqB,gHAgFhC,CAAC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import type { ContextProviderComponent, IslandData, SharedIslandsRendererComponent, SharedIslandsRendererHandle } from "../types";
|
|
3
|
-
export declare const SHARED_ROOT_ID = "__live_react_islands_shared_root__";
|
|
4
|
-
interface ManagerState {
|
|
5
|
-
renderingEnabled: boolean;
|
|
6
|
-
roots: Record<string, any>;
|
|
7
|
-
individualRendererRefs: Record<string, any>;
|
|
8
|
-
sharedRendererRef: React.RefObject<SharedIslandsRendererHandle>;
|
|
9
|
-
pendingSharedIslands: IslandData[];
|
|
10
|
-
}
|
|
11
|
-
export interface Manager {
|
|
12
|
-
initialize: (params: {
|
|
13
|
-
SharedContextProvider: ContextProviderComponent;
|
|
14
|
-
SharedIslandsRenderer?: SharedIslandsRendererComponent;
|
|
15
|
-
}) => ManagerState;
|
|
16
|
-
mountIsland: (state: ManagerState, data: IslandData) => ManagerState;
|
|
17
|
-
unmountIsland: (state: ManagerState, id: string) => ManagerState;
|
|
18
|
-
updateIslandProps: (state: ManagerState, id: string, props: Record<string, any>) => void;
|
|
19
|
-
enableRendering: (state: ManagerState) => ManagerState;
|
|
20
|
-
}
|
|
21
|
-
declare const ManagerObj: Manager;
|
|
22
|
-
export default ManagerObj;
|
|
23
|
-
//# sourceMappingURL=islandsManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"islandsManager.d.ts","sourceRoot":"","sources":["../../src/client/islandsManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EACV,wBAAwB,EACxB,UAAU,EACV,8BAA8B,EAC9B,2BAA2B,EAC5B,MAAM,UAAU,CAAC;AAIlB,eAAO,MAAM,cAAc,uCAAuC,CAAC;AAMnE,UAAU,YAAY;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5C,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;IAChE,oBAAoB,EAAE,UAAU,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,CAAC,MAAM,EAAE;QACnB,qBAAqB,EAAE,wBAAwB,CAAC;QAChD,qBAAqB,CAAC,EAAE,8BAA8B,CAAC;KACxD,KAAK,YAAY,CAAC;IACnB,WAAW,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,CAAC;IACrE,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,KAAK,YAAY,CAAC;IACjE,iBAAiB,EAAE,CACjB,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACvB,IAAI,CAAC;IACV,eAAe,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,YAAY,CAAC;CACxD;AAwCD,QAAA,MAAM,UAAU,EAAE,OAmEjB,CAAC;AACF,eAAe,UAAU,CAAC"}
|
package/dist/client.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Manager } from "./client/islandsManager";
|
|
2
|
-
import type { IslandsMap, ContextProviderComponent } from "./types";
|
|
3
|
-
interface LiveViewHook {
|
|
4
|
-
el: HTMLElement;
|
|
5
|
-
pushEvent: (event: string, payload: any, callback?: (reply: any, ref: any) => void) => void;
|
|
6
|
-
pushEventTo: (target: string, event: string, payload: any) => void;
|
|
7
|
-
handleEvent: (event: string, callback: (data: any) => void) => void;
|
|
8
|
-
}
|
|
9
|
-
export interface CreateHooksOptions {
|
|
10
|
-
islands: IslandsMap;
|
|
11
|
-
SharedContextProvider?: ContextProviderComponent;
|
|
12
|
-
globalStoreHandler?: ((data: any) => void) | null;
|
|
13
|
-
manager?: Manager;
|
|
14
|
-
}
|
|
15
|
-
export declare function createHooks({ islands: islandsMap, SharedContextProvider, globalStoreHandler, manager, }: CreateHooksOptions): {
|
|
16
|
-
LiveReactIslands: Partial<LiveViewHook> & {
|
|
17
|
-
mounted: (this: LiveViewHook) => void;
|
|
18
|
-
updated?: (this: LiveViewHook) => void;
|
|
19
|
-
destroyed: (this: LiveViewHook) => void;
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
export {};
|
|
23
|
-
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAuB,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EACV,UAAU,EAGV,wBAAwB,EAEzB,MAAM,SAAS,CAAC;AAMjB,UAAU,YAAY;IACpB,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,CACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,GAAG,EACZ,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,KACtC,IAAI,CAAC;IACV,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACnE,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;CACrE;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,UAAU,CAAC;IACpB,qBAAqB,CAAC,EAAE,wBAAwB,CAAC;IACjD,kBAAkB,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiDD,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EAAE,UAAe,EACxB,qBAA2C,EAC3C,kBAAyB,EACzB,OAAwB,GACzB,EAAE,kBAAkB;;iBAOR,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI;kBAC3B,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI;mBAC3B,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI;;EA0F1C"}
|
package/dist/island-manager.d.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import React, { ComponentType } from "react";
|
|
2
|
-
import ReactDOM from "react-dom/client";
|
|
3
|
-
export * from "./types";
|
|
4
|
-
import type { IslandsMap, IslandComponent, State, MountIslandParams, PushEventFn, UnmountIslandParams } from "./types";
|
|
5
|
-
export interface MountResult {
|
|
6
|
-
rootType: "shared" | "individual";
|
|
7
|
-
root?: ReactDOM.Root;
|
|
8
|
-
}
|
|
9
|
-
export declare const SHARED_ROOT_ID = "__live_react_islands_root__";
|
|
10
|
-
export declare const needsHydration: (element: HTMLElement) => boolean;
|
|
11
|
-
export declare const extractIslandConfig: (islandComponents: IslandsMap, componentName: string) => {
|
|
12
|
-
Component: IslandComponent;
|
|
13
|
-
ContextProvider?: ComponentType<{
|
|
14
|
-
children: React.ReactNode;
|
|
15
|
-
}>;
|
|
16
|
-
} | null;
|
|
17
|
-
export declare const createSharedRootWithPortals: (ContextProvider: ComponentType<{
|
|
18
|
-
children: React.ReactNode;
|
|
19
|
-
}>, globalState: State, IslandsRootComponent: ComponentType<any>, registryRef: React.RefObject<any>) => ReactDOM.Root;
|
|
20
|
-
export declare const getOrCreateSharedRoot: (ContextProvider: ComponentType<{
|
|
21
|
-
children: React.ReactNode;
|
|
22
|
-
}>, globalState: State, IslandsRootComponent: ComponentType<any>, registryRef: React.RefObject<any>) => ReactDOM.Root;
|
|
23
|
-
export declare const createIndividualRoot: (element: HTMLElement, IndividualRendererComponent: ComponentType<any>, rendererProps: any) => ReactDOM.Root;
|
|
24
|
-
export declare const enableRendering: (state: State) => void;
|
|
25
|
-
export declare const mountSharedIsland: (element: HTMLElement, Component: IslandComponent, props: Record<string, any>, pushEvent: PushEventFn, state: State) => void;
|
|
26
|
-
export declare const mountIndividualIsland: (element: HTMLElement, Component: IslandComponent, props: Record<string, any>, ContextProvider: ComponentType<{
|
|
27
|
-
children: React.ReactNode;
|
|
28
|
-
}>, pushEvent: PushEventFn, IndividualRendererComponent: ComponentType<any>) => ReactDOM.Root;
|
|
29
|
-
export declare const mountIsland: (params: MountIslandParams) => MountResult | null;
|
|
30
|
-
export declare const unmountIsland: (params: UnmountIslandParams) => void;
|
|
31
|
-
export declare const updateSharedIslandProps: (elementId: string, props: Record<string, any>, state: State) => void;
|
|
32
|
-
export declare const cleanupAllRoots: (state: State) => void;
|
|
33
|
-
export declare const handleNavigation: (currentNavigationCounter: number, globalState: State) => boolean;
|
|
34
|
-
export declare const createState: () => State;
|
|
35
|
-
export declare const initializeSharedRoot: (ContextProvider: ComponentType<{
|
|
36
|
-
children: React.ReactNode;
|
|
37
|
-
}>, globalState: State, IslandsRootComponent: ComponentType<any>, registryRef: React.RefObject<any>) => void;
|
|
38
|
-
export interface HookMountParams {
|
|
39
|
-
element: HTMLElement;
|
|
40
|
-
componentName: string;
|
|
41
|
-
islandComponents: IslandsMap;
|
|
42
|
-
defaultContextProvider: ComponentType<{
|
|
43
|
-
children: React.ReactNode;
|
|
44
|
-
}>;
|
|
45
|
-
pushEvent: PushEventFn;
|
|
46
|
-
globalState: State;
|
|
47
|
-
navigationCounter: number;
|
|
48
|
-
globalsRequested: boolean;
|
|
49
|
-
globalStoreHandler: ((data: any) => void) | null;
|
|
50
|
-
onGlobalsRequest: (handler: (data: any) => void, onUpdate: (data: any) => void) => void;
|
|
51
|
-
}
|
|
52
|
-
export interface HookMountResult {
|
|
53
|
-
mountResult: MountResult | null;
|
|
54
|
-
navigationDetected: boolean;
|
|
55
|
-
globalsNowRequested: boolean;
|
|
56
|
-
}
|
|
57
|
-
export declare const mountIslandAndHandleNavigation: (params: HookMountParams) => HookMountResult;
|
|
58
|
-
export declare const updateIslandProps: (elementId: string, props: Record<string, any>, rootType: "shared" | "individual", globalState: State) => void;
|
|
59
|
-
//# sourceMappingURL=island-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"island-manager.d.ts","sourceRoot":"","sources":["../src/island-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { IslandsMap, ContextProviderComponent } from "./types";
|
|
2
|
-
/**
|
|
3
|
-
* Server-side rendering function for React islands.
|
|
4
|
-
*
|
|
5
|
-
* This function creates SSR renderers for your island components.
|
|
6
|
-
* It works in any JavaScript runtime: Deno, Node, Bun, etc.
|
|
7
|
-
*
|
|
8
|
-
* @param islands - Map of island components and optional dedicated conext providers
|
|
9
|
-
* @param SharedContextProvider - Optional React context provider to wrap components
|
|
10
|
-
* @param onHydrateLiveStore - Optional callback for handling global state during SSR
|
|
11
|
-
*/
|
|
12
|
-
export declare function exposeSSR(islands: IslandsMap, SharedContextProvider?: ContextProviderComponent, onHydrateLiveStore?: (data: any) => void): Promise<{
|
|
13
|
-
renderSSRIslandStatic: (key: string, id: string, props?: Record<string, any>, globalState?: any) => string;
|
|
14
|
-
renderers: {
|
|
15
|
-
[k: string]: (id: string, props?: Record<string, any>, globalState?: any) => string;
|
|
16
|
-
};
|
|
17
|
-
}>;
|
|
18
|
-
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAEpE;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,UAAU,EACnB,qBAAqB,GAAE,wBAAqD,EAC5E,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI;iCA2CjC,MAAM,MACP,MAAM,UACH,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gBACb,GAAG,KACf,MAAM;;0BAzCF,MAAM,UAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gBAAoB,GAAG;;GAiDjE"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { IslandStoreAccess, StreamHandle } from "./types";
|
|
2
|
-
interface IslandContext {
|
|
3
|
-
id: string;
|
|
4
|
-
storeAccess: IslandStoreAccess;
|
|
5
|
-
}
|
|
6
|
-
export declare const IslandContextProvider: import("react").Context<IslandContext | null>;
|
|
7
|
-
export interface UseIslandStreamOptions<T> {
|
|
8
|
-
limit?: number;
|
|
9
|
-
sort?: (a: T, b: T) => number;
|
|
10
|
-
}
|
|
11
|
-
export declare function useIslandStream<T extends {
|
|
12
|
-
id: string | number;
|
|
13
|
-
}>(handle: StreamHandle, options?: UseIslandStreamOptions<T>): T[];
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=useIslandStream.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useIslandStream.d.ts","sourceRoot":"","sources":["../src/useIslandStream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE/D,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,iBAAiB,CAAC;CAChC;AAED,eAAO,MAAM,qBAAqB,+CAA4C,CAAC;AAE/E,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC;CAC/B;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAC/D,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAClC,CAAC,EAAE,CA2BL"}
|