@live-react-islands/core 0.1.0

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.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/dist/IndividualIslandRenderer.d.ts +4 -0
  3. package/dist/IndividualIslandRenderer.d.ts.map +1 -0
  4. package/dist/IslandRenderer.d.ts +11 -0
  5. package/dist/IslandRenderer.d.ts.map +1 -0
  6. package/dist/PortalIslandsRenderer.d.ts +4 -0
  7. package/dist/PortalIslandsRenderer.d.ts.map +1 -0
  8. package/dist/PortalIslandsRenderer.test.d.ts +2 -0
  9. package/dist/PortalIslandsRenderer.test.d.ts.map +1 -0
  10. package/dist/client/IndividualIslandRenderer.d.ts +14 -0
  11. package/dist/client/IndividualIslandRenderer.d.ts.map +1 -0
  12. package/dist/client/PortalIslandsRenderer.d.ts +4 -0
  13. package/dist/client/PortalIslandsRenderer.d.ts.map +1 -0
  14. package/dist/client/islandsManager.d.ts +23 -0
  15. package/dist/client/islandsManager.d.ts.map +1 -0
  16. package/dist/client.d.ts +23 -0
  17. package/dist/client.d.ts.map +1 -0
  18. package/dist/context.d.ts +7 -0
  19. package/dist/context.d.ts.map +1 -0
  20. package/dist/createHooks.d.ts +25 -0
  21. package/dist/createHooks.d.ts.map +1 -0
  22. package/dist/index.d.ts +5 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.esm.js +680 -0
  25. package/dist/index.esm.js.map +1 -0
  26. package/dist/index.js +684 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/island-manager.d.ts +59 -0
  29. package/dist/island-manager.d.ts.map +1 -0
  30. package/dist/islandsManager.d.ts +32 -0
  31. package/dist/islandsManager.d.ts.map +1 -0
  32. package/dist/islandsManager.test.d.ts +2 -0
  33. package/dist/islandsManager.test.d.ts.map +1 -0
  34. package/dist/server.d.ts +18 -0
  35. package/dist/server.d.ts.map +1 -0
  36. package/dist/setupTests.d.ts +2 -0
  37. package/dist/setupTests.d.ts.map +1 -0
  38. package/dist/ssr.d.ts +15 -0
  39. package/dist/ssr.d.ts.map +1 -0
  40. package/dist/ssr.esm.js +92 -0
  41. package/dist/ssr.esm.js.map +1 -0
  42. package/dist/ssr.js +94 -0
  43. package/dist/ssr.js.map +1 -0
  44. package/dist/types.d.ts +65 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/useForm.d.ts +60 -0
  47. package/dist/useForm.d.ts.map +1 -0
  48. package/dist/useIslandStream.d.ts +15 -0
  49. package/dist/useIslandStream.d.ts.map +1 -0
  50. package/dist/useStream.d.ts +9 -0
  51. package/dist/useStream.d.ts.map +1 -0
  52. package/package.json +66 -0
  53. package/src/IndividualIslandRenderer.tsx +80 -0
  54. package/src/PortalIslandsRenderer.test.tsx +304 -0
  55. package/src/PortalIslandsRenderer.tsx +118 -0
  56. package/src/context.ts +9 -0
  57. package/src/createHooks.ts +341 -0
  58. package/src/index.ts +4 -0
  59. package/src/islandsManager.test.ts +454 -0
  60. package/src/islandsManager.ts +356 -0
  61. package/src/setupTests.ts +1 -0
  62. package/src/ssr.ts +118 -0
  63. package/src/types.ts +91 -0
  64. package/src/useForm.ts +253 -0
  65. package/src/useStream.ts +36 -0
@@ -0,0 +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 SharedContextProvider\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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"}
@@ -0,0 +1,59 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"island-manager.d.ts","sourceRoot":"","sources":["../src/island-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+ import { ContextProviderComponent, IslandData, SharedIslandsRendererComponent, IndividualIslandsRendererComponent, IslandStoreAccess, StreamAction, StreamConfig } from "./types";
3
+ export declare const SHARED_ROOT_ID = "__live_react_islands_shared_root__";
4
+ interface ManagerState {
5
+ propsStore: Map<string, Record<string, any>>;
6
+ propsListeners: Set<() => void>;
7
+ globalsRef: React.MutableRefObject<Record<string, any> | null>;
8
+ globalsListeners: Set<() => void>;
9
+ sharedIslandsRef: React.MutableRefObject<Record<string, IslandData>>;
10
+ sharedIslandsListeners: Set<() => void>;
11
+ streamsStore: Map<string, any[]>;
12
+ streamsListeners: Map<string, Set<() => void>>;
13
+ streamConfigs: Map<string, StreamConfig>;
14
+ roots: Record<string, any>;
15
+ storeAccess: IslandStoreAccess;
16
+ }
17
+ export interface Manager {
18
+ initialize: (params: {
19
+ SharedContextProvider?: ContextProviderComponent;
20
+ SharedIslandsRenderer?: SharedIslandsRendererComponent;
21
+ }) => ManagerState;
22
+ mountIsland: (state: ManagerState, data: IslandData, IslandRenderer?: IndividualIslandsRendererComponent) => ManagerState;
23
+ unmountIsland: (state: ManagerState, id: string) => ManagerState;
24
+ updateIslandProps: (state: ManagerState, islandId: string, props: Record<string, any>) => ManagerState;
25
+ updateGlobals: (state: ManagerState, globals: Record<string, any>) => ManagerState;
26
+ resetGlobals: (state: ManagerState) => ManagerState;
27
+ initializeStream: (state: ManagerState, islandId: string, streamName: string, initialItems: any[]) => ManagerState;
28
+ updateStream: (state: ManagerState, islandId: string, streamName: string, action: StreamAction, data: any) => ManagerState;
29
+ }
30
+ declare const ManagerObj: Manager;
31
+ export default ManagerObj;
32
+ //# sourceMappingURL=islandsManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"islandsManager.d.ts","sourceRoot":"","sources":["../src/islandsManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,8BAA8B,EAC9B,kCAAkC,EAClC,iBAAiB,EAEjB,YAAY,EACZ,YAAY,EACb,MAAM,SAAS,CAAC;AAKjB,eAAO,MAAM,cAAc,uCAAuC,CAAC;AAMnE,UAAU,YAAY;IACpB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,cAAc,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAChC,UAAU,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,gBAAgB,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACrE,sBAAsB,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IACxC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC/C,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,WAAW,EAAE,iBAAiB,CAAC;CAChC;AAED,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,CAAC,MAAM,EAAE;QACnB,qBAAqB,CAAC,EAAE,wBAAwB,CAAC;QACjD,qBAAqB,CAAC,EAAE,8BAA8B,CAAC;KACxD,KAAK,YAAY,CAAC;IACnB,WAAW,EAAE,CACX,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,UAAU,EAChB,cAAc,CAAC,EAAE,kCAAkC,KAChD,YAAY,CAAC;IAClB,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,KAAK,YAAY,CAAC;IACjE,iBAAiB,EAAE,CACjB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACvB,YAAY,CAAC;IAClB,aAAa,EAAE,CACb,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACzB,YAAY,CAAC;IAClB,YAAY,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,YAAY,CAAC;IACpD,gBAAgB,EAAE,CAChB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,GAAG,EAAE,KAChB,YAAY,CAAC;IAClB,YAAY,EAAE,CACZ,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,GAAG,KACN,YAAY,CAAC;CACnB;AAyFD,QAAA,MAAM,UAAU,EAAE,OAkMjB,CAAC;AACF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=islandsManager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"islandsManager.test.d.ts","sourceRoot":"","sources":["../src/islandsManager.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ import "@testing-library/jest-dom";
2
+ //# sourceMappingURL=setupTests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupTests.d.ts","sourceRoot":"","sources":["../src/setupTests.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
package/dist/ssr.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { type IslandsMap, type ContextProviderComponent } from "./types";
2
+ export interface ExposeSSROptions {
3
+ islands: IslandsMap;
4
+ SharedContextProvider?: ContextProviderComponent;
5
+ }
6
+ /**
7
+ * Server-side rendering function for React islands.
8
+ *
9
+ * This function creates SSR renderers for your island components.
10
+ * It works in any JavaScript runtime: Deno, Node, Bun, etc.
11
+ *
12
+ * Supports lazy-loaded islands: () => import("./Component")
13
+ */
14
+ export declare function exposeSSR({ islands, SharedContextProvider, }: ExposeSSROptions): Promise<void>;
15
+ //# sourceMappingURL=ssr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssr.d.ts","sourceRoot":"","sources":["../src/ssr.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,wBAAwB,EAG9B,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,UAAU,CAAC;IACpB,qBAAqB,CAAC,EAAE,wBAAwB,CAAC;CAClD;AASD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,EAC9B,OAAO,EACP,qBAA2C,GAC5C,EAAE,gBAAgB,iBAoFlB"}
@@ -0,0 +1,92 @@
1
+ import React from 'react';
2
+ import { renderToStaticMarkup, renderToString } from 'react-dom/server';
3
+
4
+ var StreamAction;
5
+ (function (StreamAction) {
6
+ StreamAction["Insert"] = "i";
7
+ StreamAction["Update"] = "u";
8
+ StreamAction["Delete"] = "d";
9
+ StreamAction["Reset"] = "r";
10
+ })(StreamAction || (StreamAction = {}));
11
+ const NullContextProvider = ({ children, }) => children;
12
+
13
+ const isLazyFactory = (value) => {
14
+ if (typeof value !== "function")
15
+ return false;
16
+ if (value.prototype?.isReactComponent)
17
+ return false;
18
+ if (value.Component)
19
+ return false;
20
+ return value.length === 0;
21
+ };
22
+ /**
23
+ * Server-side rendering function for React islands.
24
+ *
25
+ * This function creates SSR renderers for your island components.
26
+ * It works in any JavaScript runtime: Deno, Node, Bun, etc.
27
+ *
28
+ * Supports lazy-loaded islands: () => import("./Component")
29
+ */
30
+ async function exposeSSR({ islands, SharedContextProvider = NullContextProvider, }) {
31
+ // Resolve all lazy imports first
32
+ const resolvedIslands = {};
33
+ for (const [name, config] of Object.entries(islands)) {
34
+ if (isLazyFactory(config)) {
35
+ const mod = await config();
36
+ resolvedIslands[name] = mod.default;
37
+ }
38
+ else if (typeof config === "function") {
39
+ resolvedIslands[name] = config;
40
+ }
41
+ else {
42
+ resolvedIslands[name] = config.Component;
43
+ }
44
+ }
45
+ const makeRenderer = (renderFn) => (IslandComponent) => (id, props = {}, globals = {}) => {
46
+ return renderFn(React.createElement(SharedContextProvider, null, React.createElement(IslandComponent, {
47
+ ...globals,
48
+ ...props,
49
+ id,
50
+ pushEvent: () => { },
51
+ })));
52
+ };
53
+ // Create renderers for both strategies using pre-resolved components
54
+ // - renderToString: For hydrate_root (includes React markers for hydration)
55
+ // - renderToStaticMarkup: For overwrite (clean HTML, smaller size)
56
+ const hydrateRenderers = Object.fromEntries(Object.entries(resolvedIslands).map(([key, Component]) => [
57
+ key,
58
+ makeRenderer(renderToString)(Component),
59
+ ]));
60
+ const overwriteRenderers = Object.fromEntries(Object.entries(resolvedIslands).map(([key, Component]) => [
61
+ key,
62
+ makeRenderer(renderToStaticMarkup)(Component),
63
+ ]));
64
+ // Main render function that chooses renderer based on strategy
65
+ const renderSSRIsland = (key, id, props = {}, globalState = {}, strategy = "overwrite") => {
66
+ const renderers = strategy === "hydrate_root" ? hydrateRenderers : overwriteRenderers;
67
+ if (!renderers[key]) {
68
+ throw new Error(`No SSR renderer found for Component "${key}"`);
69
+ }
70
+ return renderers[key](id, props, globalState);
71
+ };
72
+ const getGlobal = () => {
73
+ if (typeof globalThis !== "undefined")
74
+ return globalThis;
75
+ // @ts-ignore
76
+ if (typeof global !== "undefined")
77
+ return global;
78
+ if (typeof window !== "undefined")
79
+ return window;
80
+ return {};
81
+ };
82
+ const universalGlobal = getGlobal();
83
+ //@ts-ignore
84
+ universalGlobal.SSR_MODULE = {
85
+ renderSSRIsland,
86
+ hydrateRenderers,
87
+ overwriteRenderers,
88
+ };
89
+ }
90
+
91
+ export { exposeSSR };
92
+ //# sourceMappingURL=ssr.esm.js.map
@@ -0,0 +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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"}
package/dist/ssr.js ADDED
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var server = require('react-dom/server');
5
+
6
+ var StreamAction;
7
+ (function (StreamAction) {
8
+ StreamAction["Insert"] = "i";
9
+ StreamAction["Update"] = "u";
10
+ StreamAction["Delete"] = "d";
11
+ StreamAction["Reset"] = "r";
12
+ })(StreamAction || (StreamAction = {}));
13
+ const NullContextProvider = ({ children, }) => children;
14
+
15
+ const isLazyFactory = (value) => {
16
+ if (typeof value !== "function")
17
+ return false;
18
+ if (value.prototype?.isReactComponent)
19
+ return false;
20
+ if (value.Component)
21
+ return false;
22
+ return value.length === 0;
23
+ };
24
+ /**
25
+ * Server-side rendering function for React islands.
26
+ *
27
+ * This function creates SSR renderers for your island components.
28
+ * It works in any JavaScript runtime: Deno, Node, Bun, etc.
29
+ *
30
+ * Supports lazy-loaded islands: () => import("./Component")
31
+ */
32
+ async function exposeSSR({ islands, SharedContextProvider = NullContextProvider, }) {
33
+ // Resolve all lazy imports first
34
+ const resolvedIslands = {};
35
+ for (const [name, config] of Object.entries(islands)) {
36
+ if (isLazyFactory(config)) {
37
+ const mod = await config();
38
+ resolvedIslands[name] = mod.default;
39
+ }
40
+ else if (typeof config === "function") {
41
+ resolvedIslands[name] = config;
42
+ }
43
+ else {
44
+ resolvedIslands[name] = config.Component;
45
+ }
46
+ }
47
+ const makeRenderer = (renderFn) => (IslandComponent) => (id, props = {}, globals = {}) => {
48
+ return renderFn(React.createElement(SharedContextProvider, null, React.createElement(IslandComponent, {
49
+ ...globals,
50
+ ...props,
51
+ id,
52
+ pushEvent: () => { },
53
+ })));
54
+ };
55
+ // Create renderers for both strategies using pre-resolved components
56
+ // - renderToString: For hydrate_root (includes React markers for hydration)
57
+ // - renderToStaticMarkup: For overwrite (clean HTML, smaller size)
58
+ const hydrateRenderers = Object.fromEntries(Object.entries(resolvedIslands).map(([key, Component]) => [
59
+ key,
60
+ makeRenderer(server.renderToString)(Component),
61
+ ]));
62
+ const overwriteRenderers = Object.fromEntries(Object.entries(resolvedIslands).map(([key, Component]) => [
63
+ key,
64
+ makeRenderer(server.renderToStaticMarkup)(Component),
65
+ ]));
66
+ // Main render function that chooses renderer based on strategy
67
+ const renderSSRIsland = (key, id, props = {}, globalState = {}, strategy = "overwrite") => {
68
+ const renderers = strategy === "hydrate_root" ? hydrateRenderers : overwriteRenderers;
69
+ if (!renderers[key]) {
70
+ throw new Error(`No SSR renderer found for Component "${key}"`);
71
+ }
72
+ return renderers[key](id, props, globalState);
73
+ };
74
+ const getGlobal = () => {
75
+ if (typeof globalThis !== "undefined")
76
+ return globalThis;
77
+ // @ts-ignore
78
+ if (typeof global !== "undefined")
79
+ return global;
80
+ if (typeof window !== "undefined")
81
+ return window;
82
+ return {};
83
+ };
84
+ const universalGlobal = getGlobal();
85
+ //@ts-ignore
86
+ universalGlobal.SSR_MODULE = {
87
+ renderSSRIsland,
88
+ hydrateRenderers,
89
+ overwriteRenderers,
90
+ };
91
+ }
92
+
93
+ exports.exposeSSR = exposeSSR;
94
+ //# sourceMappingURL=ssr.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,65 @@
1
+ import { ComponentType } from "react";
2
+ export type IslandComponent = ComponentType<any>;
3
+ export type LazyIslandFactory = () => Promise<{
4
+ default: IslandComponent;
5
+ }>;
6
+ export type IslandsMap = Record<string, IslandComponent | IslandConfig | LazyIslandFactory>;
7
+ export type ContextProviderComponent = ComponentType<{
8
+ children: React.ReactNode;
9
+ }>;
10
+ export interface IslandConfig {
11
+ Component: IslandComponent;
12
+ ContextProvider?: ContextProviderComponent;
13
+ }
14
+ export type SSRStrategy = "none" | "overwrite" | "hydrate_root";
15
+ export type PushEventFn = (eventName: string, payload: any) => void;
16
+ export interface StreamConfig {
17
+ limit?: number;
18
+ capper?: (items: any[]) => any[];
19
+ }
20
+ export interface IslandStoreAccess {
21
+ getProps: (islandId: string) => Record<string, any> | null;
22
+ subscribeToProps: (callback: () => void) => () => void;
23
+ getGlobals: () => Record<string, any> | null;
24
+ subscribeToGlobals: (callback: () => void) => () => void;
25
+ getSharedIslands: () => Record<string, IslandData>;
26
+ subscribeToSharedIslands: (callback: () => void) => () => void;
27
+ getStreamItems: (islandId: string, streamName: string) => any[];
28
+ subscribeToStream: (islandId: string, streamName: string, callback: () => void, config?: StreamConfig) => () => void;
29
+ }
30
+ export declare enum StreamAction {
31
+ Insert = "i",
32
+ Update = "u",
33
+ Delete = "d",
34
+ Reset = "r"
35
+ }
36
+ export interface StreamHandle {
37
+ name: string;
38
+ initial: any[];
39
+ }
40
+ export interface IslandData {
41
+ id: string;
42
+ el: HTMLElement;
43
+ ssrStrategy: SSRStrategy;
44
+ Component: IslandComponent;
45
+ ContextProvider?: ContextProviderComponent;
46
+ hydrationData: {
47
+ props: Record<string, any>;
48
+ globals: Record<string, any>;
49
+ } | null;
50
+ pushEvent: PushEventFn;
51
+ globalKeys: string[];
52
+ }
53
+ export interface SharedIslandsRendererProps {
54
+ storeAccess: IslandStoreAccess;
55
+ }
56
+ export type SharedIslandsRendererComponent = React.FC<SharedIslandsRendererProps>;
57
+ export interface IndividualIslandsRendererProps {
58
+ data: IslandData;
59
+ storeAccess: IslandStoreAccess;
60
+ }
61
+ export type IndividualIslandsRendererComponent = React.FC<IndividualIslandsRendererProps>;
62
+ export declare const NullContextProvider: React.FC<{
63
+ children: React.ReactNode;
64
+ }>;
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}