@live-react-islands/core 0.1.0 → 0.1.1
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/LICENSE +1 -1
- package/README.md +455 -0
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +9 -3
- package/src/createHooks.ts +1 -1
package/LICENSE
CHANGED
package/README.md
ADDED
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
# Live React Islands
|
|
2
|
+
|
|
3
|
+
**React-powered interactive islands** inside Phoenix LiveView. Harness the NPM ecosystem with server-driven state, real-time streams and zero-lag forms + SSR.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Why Live React Islands?
|
|
8
|
+
|
|
9
|
+
**The best of both worlds!** ✨
|
|
10
|
+
|
|
11
|
+
Phoenix LiveView is excellent for server-driven UIs, but sometimes you need the rich interactivity of React for specific components. Live React Islands lets you:
|
|
12
|
+
|
|
13
|
+
- Use React components as "islands" within your LiveView templates
|
|
14
|
+
- Maintain server-side state in Elixir while rendering in React
|
|
15
|
+
- Send events from React to Elixir and push props back
|
|
16
|
+
- Use forms and streams in React with dedicated hooks
|
|
17
|
+
- Share global state across multiple islands
|
|
18
|
+
- Optionally server-side render for faster loads, SEO and no flicker
|
|
19
|
+
|
|
20
|
+
## Comparison
|
|
21
|
+
|
|
22
|
+
Choose Live React Islands when you need rich, interactive React components without giving up LiveView’s server-driven simplicity.
|
|
23
|
+
|
|
24
|
+
| Feature | LiveView Only | LiveView + Alpine | Live React Islands (this) | Pure SPA (Next.js/Vite) |
|
|
25
|
+
| :--------------------- | :----------------------------------------- | :------------------- | :------------------------------------- | :---------------------- |
|
|
26
|
+
| **UI Ecosystem** | Limited (HEEX/Custom) | Small (Alpine kits) | **Infinite (NPM/React)** | **Infinite (NPM)** |
|
|
27
|
+
| **Interactivity** | Server-Roundtrip (JS hooks for edge cases) | Simple Client-side | **High-Fidelity / Fluid** | High-Fidelity / Fluid |
|
|
28
|
+
| **State Management** | Single (Server) | Fragmented | **Single (Server-Led)** | Dual (API + Client) |
|
|
29
|
+
| **Initial Load / SEO** | Instant | Instant | **Instant (SSR-enabled)** | Slow / Complex SSR |
|
|
30
|
+
| **JS Bundle Size** | ~0kb (Core only) | Small (+15kb) | **Large (React: ~100–150 kB gzipped)** | Large |
|
|
31
|
+
| **Developer Speed** | Very High | High (until complex) | **High (Asset Reuse)** | Low (API Plumbing) |
|
|
32
|
+
| **Component Logic** | Elixir Only | Mixed (Strings) | **JSX (Encapsulated)** | JSX |
|
|
33
|
+
| **Complexity Ceiling** | Struggles with app-like complexity | Hits wall on "State" | **High** | Very High |
|
|
34
|
+
|
|
35
|
+
## When NOT to Use Live React Islands
|
|
36
|
+
|
|
37
|
+
- If your UI is mostly static or CRUD-heavy, plain LiveView is simpler and faster.
|
|
38
|
+
- If you only need light client-side behavior (toggles, dropdowns), LiveView + Alpine may be sufficient.
|
|
39
|
+
- If your application requires full offline support or heavy client-side state, a traditional SPA may be a better fit.
|
|
40
|
+
|
|
41
|
+
## Installation
|
|
42
|
+
|
|
43
|
+
### Elixir
|
|
44
|
+
|
|
45
|
+
Add to your `mix.exs`:
|
|
46
|
+
|
|
47
|
+
```elixir
|
|
48
|
+
def deps do
|
|
49
|
+
[
|
|
50
|
+
{:live_react_islands, "~> 0.1.0"},
|
|
51
|
+
# For development SSR (optional):
|
|
52
|
+
{:live_react_islands_ssr_vite, "~> 0.1.0", only: :dev},
|
|
53
|
+
# For production SSR (optional):
|
|
54
|
+
{:live_react_islands_ssr_deno, "~> 0.1.0", only: :prod}
|
|
55
|
+
]
|
|
56
|
+
end
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### JavaScript
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npm install @live-react-islands/core
|
|
63
|
+
# For development SSR (optional):
|
|
64
|
+
npm install --save-dev @live-react-islands/vite-plugin-ssr
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Quick Start
|
|
68
|
+
|
|
69
|
+
### 1. Create a React Component
|
|
70
|
+
|
|
71
|
+
```jsx
|
|
72
|
+
// src/islands/Counter.jsx
|
|
73
|
+
const Counter = ({ count, title, pushEvent }) => {
|
|
74
|
+
return (
|
|
75
|
+
<div>
|
|
76
|
+
<h2>{title}</h2>
|
|
77
|
+
<p>Count: {count}</p>
|
|
78
|
+
<button onClick={() => pushEvent("increment", {})}>+1</button>
|
|
79
|
+
</div>
|
|
80
|
+
);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export default Counter;
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 2. Set Up the LiveView Hooks
|
|
87
|
+
|
|
88
|
+
```jsx
|
|
89
|
+
// src/islands/index.js
|
|
90
|
+
export default { Counter: () => import("./Counter") };
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Islands can be lazy loaded to only load the JS used on the page.
|
|
94
|
+
|
|
95
|
+
```jsx
|
|
96
|
+
// src/main.jsx
|
|
97
|
+
import { createHooks } from "@live-react-islands/core";
|
|
98
|
+
import islands from "./islands";
|
|
99
|
+
|
|
100
|
+
const islandHooks = createHooks({ islands });
|
|
101
|
+
|
|
102
|
+
// Add to your LiveSocket
|
|
103
|
+
let liveSocket = new LiveSocket("/live", Socket, {
|
|
104
|
+
hooks: { ...islandHooks },
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 3. Create an Elixir Component
|
|
109
|
+
|
|
110
|
+
```elixir
|
|
111
|
+
defmodule MyAppWeb.Components.CounterIsland do
|
|
112
|
+
use LiveReactIslands.Component,
|
|
113
|
+
component: "Counter",
|
|
114
|
+
props: %{count: 0, title: "My Counter"}
|
|
115
|
+
|
|
116
|
+
def handle_event("increment", _params, socket) do
|
|
117
|
+
new_count = socket.assigns.count + 1
|
|
118
|
+
{:noreply, update_prop(socket, :count, new_count)}
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 4. Use in Your LiveView
|
|
124
|
+
|
|
125
|
+
```elixir
|
|
126
|
+
defmodule MyAppWeb.CounterLive do
|
|
127
|
+
use MyAppWeb, :live_view
|
|
128
|
+
use LiveReactIslands.LiveView
|
|
129
|
+
|
|
130
|
+
def render(assigns) do
|
|
131
|
+
~H"""
|
|
132
|
+
<.live_component module={MyAppWeb.Components.CounterIsland} id="counter-1" />
|
|
133
|
+
"""
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## How It Works
|
|
139
|
+
|
|
140
|
+
**React components receive these props automatically:**
|
|
141
|
+
|
|
142
|
+
| Prop | Description |
|
|
143
|
+
| -------------------- | --------------------------------- |
|
|
144
|
+
| `id` | The island's unique identifier |
|
|
145
|
+
| `pushEvent` | Function to send events to Elixir |
|
|
146
|
+
| All defined props | Current values from Elixir |
|
|
147
|
+
| All consumed globals | Current global state values |
|
|
148
|
+
|
|
149
|
+
## Features
|
|
150
|
+
|
|
151
|
+
### Props
|
|
152
|
+
|
|
153
|
+
Define props with default values. Props can be set from the template or updated from event handlers:
|
|
154
|
+
|
|
155
|
+
```elixir
|
|
156
|
+
use LiveReactIslands.Component,
|
|
157
|
+
component: "Counter",
|
|
158
|
+
props: %{count: 0, title: "Default Title"}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**Elixir components can override `init/2` for dynamic initialization:**
|
|
162
|
+
|
|
163
|
+
```elixir
|
|
164
|
+
def init(assigns, socket) do
|
|
165
|
+
# Called once on mount, before SSR and first render
|
|
166
|
+
socket
|
|
167
|
+
|> update_prop(:computed, compute_value(assigns))
|
|
168
|
+
end
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Updating props from Elixir:**
|
|
172
|
+
|
|
173
|
+
```elixir
|
|
174
|
+
def handle_event("increment", _, socket) do
|
|
175
|
+
{:noreply, update_prop(socket, :count, socket.assigns.count + 1)}
|
|
176
|
+
end
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Passing props from templates:**
|
|
180
|
+
|
|
181
|
+
```heex
|
|
182
|
+
<.live_component module={CounterIsland} id="counter-1" title="Custom Title" />
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Once a prop is set from outside the component any `update_prop` call on it will raise an error to prevent a nasty set of bugs. To just initialize the component use `init_[prop]` to set the value once and then the component takes over.
|
|
186
|
+
|
|
187
|
+
```heex
|
|
188
|
+
<.live_component module={CounterIsland} id="counter-1" init_count={5} />
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Events
|
|
192
|
+
|
|
193
|
+
Send events from React to Elixir using `pushEvent`:
|
|
194
|
+
|
|
195
|
+
```jsx
|
|
196
|
+
// React
|
|
197
|
+
<button onClick={() => pushEvent("save", { data: formData })}>Save</button>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
```elixir
|
|
201
|
+
# Elixir
|
|
202
|
+
def handle_event("save", %{"data" => data}, socket) do
|
|
203
|
+
# Handle the event
|
|
204
|
+
{:noreply, socket}
|
|
205
|
+
end
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Global State
|
|
209
|
+
|
|
210
|
+
Share state across multiple islands. When a global changes, all islands that use it automatically rerender.
|
|
211
|
+
|
|
212
|
+
**Set up in your LiveView:**
|
|
213
|
+
|
|
214
|
+
```elixir
|
|
215
|
+
defmodule MyAppWeb.DashboardLive do
|
|
216
|
+
use MyAppWeb, :live_view
|
|
217
|
+
use LiveReactIslands.LiveView, expose_globals: [:user, :theme]
|
|
218
|
+
|
|
219
|
+
def mount(_params, session, socket) do
|
|
220
|
+
{:ok, assign(socket, user: get_user(session), theme: "light")}
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Consume in your island:**
|
|
226
|
+
|
|
227
|
+
```elixir
|
|
228
|
+
use LiveReactIslands.Component,
|
|
229
|
+
component: "Header",
|
|
230
|
+
props: %{},
|
|
231
|
+
globals: [:user, :theme]
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Optional globals** (won't error if not set):
|
|
235
|
+
|
|
236
|
+
```elixir
|
|
237
|
+
globals: [:user?] # The ? suffix makes it optional
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
The globals are passed as props to your React component:
|
|
241
|
+
|
|
242
|
+
```jsx
|
|
243
|
+
const Header = ({ user, theme }) => (
|
|
244
|
+
<header className={theme}>Welcome, {user.name}</header>
|
|
245
|
+
);
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Forms with Server Validation
|
|
249
|
+
|
|
250
|
+
Build forms with React UI and Elixir/Ecto validation. Input is collected client side with zero typing latency and send to Elixir for validation. Errors from the changeset get pushed back to React.
|
|
251
|
+
|
|
252
|
+
The `useForm` hook implements a "Validation Lock" pattern: Updates are versioned and `isValid` will only be true until the server confirms the current form state is valid.
|
|
253
|
+
|
|
254
|
+
**Elixir component:**
|
|
255
|
+
|
|
256
|
+
```elixir
|
|
257
|
+
defmodule MyAppWeb.Components.ContactFormIsland do
|
|
258
|
+
use LiveReactIslands.Component,
|
|
259
|
+
component: "ContactForm",
|
|
260
|
+
props: %{form: %{}}
|
|
261
|
+
|
|
262
|
+
alias MyApp.Contact
|
|
263
|
+
|
|
264
|
+
def init(_assigns, socket) do
|
|
265
|
+
changeset = Contact.changeset(%Contact{}, %{})
|
|
266
|
+
socket |> init_form(:form, changeset)
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def handle_form(:validate, :form, attrs, socket) do
|
|
270
|
+
changeset = Contact.changeset(%Contact{}, attrs)
|
|
271
|
+
{:noreply, update_form(socket, :form, changeset)}
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def handle_form(:submit, :form, attrs, socket) do
|
|
275
|
+
case Contact.create(attrs) do
|
|
276
|
+
{:ok, _contact} ->
|
|
277
|
+
{:noreply, init_form(socket, :form, Contact.changeset(%Contact{}, %{}))}
|
|
278
|
+
{:error, changeset} ->
|
|
279
|
+
{:noreply, update_form(socket, :form, changeset)}
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**React component:**
|
|
286
|
+
|
|
287
|
+
```jsx
|
|
288
|
+
import { useForm } from "@live-react-islands/core";
|
|
289
|
+
|
|
290
|
+
const ContactForm = ({ form, pushEvent }) => {
|
|
291
|
+
const {
|
|
292
|
+
getFieldProps,
|
|
293
|
+
getError,
|
|
294
|
+
isRequired,
|
|
295
|
+
isTouched,
|
|
296
|
+
handleSubmit,
|
|
297
|
+
isValid,
|
|
298
|
+
} = useForm(form, pushEvent);
|
|
299
|
+
|
|
300
|
+
return (
|
|
301
|
+
<form onSubmit={handleSubmit}>
|
|
302
|
+
<input {...getFieldProps("name")} />
|
|
303
|
+
{isTouched("name") && getError("name") && (
|
|
304
|
+
<span className="error">{getError("name")}</span>
|
|
305
|
+
)}
|
|
306
|
+
|
|
307
|
+
<input {...getFieldProps("email")} type="email" />
|
|
308
|
+
{isTouched("email") && getError("email") && (
|
|
309
|
+
<span className="error">{getError("email")}</span>
|
|
310
|
+
)}
|
|
311
|
+
|
|
312
|
+
<button type="submit" disabled={!isValid}>
|
|
313
|
+
Submit
|
|
314
|
+
</button>
|
|
315
|
+
</form>
|
|
316
|
+
);
|
|
317
|
+
};
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**`useForm` returns:**
|
|
321
|
+
|
|
322
|
+
| Property | Description |
|
|
323
|
+
| ----------------------- | ----------------------------------------------------- |
|
|
324
|
+
| `values` | Current form values |
|
|
325
|
+
| `errors` | Validation errors by field |
|
|
326
|
+
| `touched` | Fields the user has interacted with |
|
|
327
|
+
| `getFieldProps(name)` | Props to spread on inputs (`value`, `onChange`, etc.) |
|
|
328
|
+
| `getError(name)` | First error message for a field |
|
|
329
|
+
| `isRequired(name)` | Whether a field is required |
|
|
330
|
+
| `isTouched(name)` | Whether user has modified this field |
|
|
331
|
+
| `setField(name, value)` | Programmatically set a field value |
|
|
332
|
+
| `handleSubmit` | Form submit handler |
|
|
333
|
+
| `reset()` | Reset form to server values |
|
|
334
|
+
| `isSyncing` | True while waiting for server validation |
|
|
335
|
+
| `isValid` | True only when synced AND server says valid |
|
|
336
|
+
|
|
337
|
+
### Streams
|
|
338
|
+
|
|
339
|
+
Stream data to React components for real-time updates like feeds, chat, or infinite scrolling:
|
|
340
|
+
|
|
341
|
+
**Define a stream prop:**
|
|
342
|
+
|
|
343
|
+
```elixir
|
|
344
|
+
use LiveReactIslands.Component,
|
|
345
|
+
component: "MessageList",
|
|
346
|
+
props: %{
|
|
347
|
+
messages: {:stream, default: []}
|
|
348
|
+
}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**Push stream events from Elixir:**
|
|
352
|
+
|
|
353
|
+
```elixir
|
|
354
|
+
# Insert new item (prepends by default)
|
|
355
|
+
socket |> stream_insert(:messages, %{id: 1, text: "Hello"})
|
|
356
|
+
|
|
357
|
+
# Update existing item
|
|
358
|
+
socket |> stream_update(:messages, %{id: 1, text: "Hello, edited"})
|
|
359
|
+
|
|
360
|
+
# Delete an item
|
|
361
|
+
socket |> stream_delete(:messages, 1)
|
|
362
|
+
|
|
363
|
+
# Reset the entire stream
|
|
364
|
+
socket |> stream_reset(:messages)
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
**Consume in React:**
|
|
368
|
+
|
|
369
|
+
```jsx
|
|
370
|
+
import { useStream } from "@live-react-islands/core";
|
|
371
|
+
|
|
372
|
+
const MessageList = ({ messages: messagesHandle }) => {
|
|
373
|
+
const messages = useStream(messagesHandle, { limit: 100 });
|
|
374
|
+
|
|
375
|
+
return (
|
|
376
|
+
<ul>
|
|
377
|
+
{messages.map((msg) => (
|
|
378
|
+
<li key={msg.id}>{msg.text}</li>
|
|
379
|
+
))}
|
|
380
|
+
</ul>
|
|
381
|
+
);
|
|
382
|
+
};
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
### Shared Context
|
|
386
|
+
|
|
387
|
+
Islands using `:none` (default) or `:overwrite` SSR strategies render into a shared React root via portals. This enables powerful patterns like drag-and-drop between islands, shared state managers, or animation libraries that need to coordinate across components.
|
|
388
|
+
|
|
389
|
+
**Wrap all islands in a shared context:**
|
|
390
|
+
|
|
391
|
+
```jsx
|
|
392
|
+
// src/main.jsx
|
|
393
|
+
import { createHooks } from "@live-react-islands/core";
|
|
394
|
+
import { DndProvider } from "react-beautiful-dnd";
|
|
395
|
+
import islands from "./islands";
|
|
396
|
+
|
|
397
|
+
const SharedContextProvider = ({ children }) => (
|
|
398
|
+
<DndProvider backend={HTML5Backend}>{children}</DndProvider>
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
const islandHooks = createHooks({
|
|
402
|
+
islands,
|
|
403
|
+
SharedContextProvider,
|
|
404
|
+
});
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
Now all your islands can participate in drag-and-drop with each other, even though they're scattered across your LiveView template.
|
|
408
|
+
|
|
409
|
+
> **Note:** Islands using `:hydrate_root` SSR strategy have their own isolated React root and do not participate in the shared context. Use `:overwrite` or `:none` if you need context sharing between islands.
|
|
410
|
+
|
|
411
|
+
### Server-Side Rendering (SSR)
|
|
412
|
+
|
|
413
|
+
SSR improves initial page load performance by rendering React components on the server.
|
|
414
|
+
|
|
415
|
+
```elixir
|
|
416
|
+
use LiveReactIslands.Component,
|
|
417
|
+
component: "Counter",
|
|
418
|
+
props: %{count: 0},
|
|
419
|
+
ssr_strategy: :overwrite # or :hydrate_root or :none (default)
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
| Strategy | Shared Root | Best For |
|
|
423
|
+
| --------------- | ----------- | ----------------------------------------------------------------------- |
|
|
424
|
+
| `:none` | Yes | Interactive components where initial render doesn't matter |
|
|
425
|
+
| `:overwrite` | Yes | Most islands, especially when you need cross-island context (e.g., DnD) |
|
|
426
|
+
| `:hydrate_root` | No | Large islands where you want to avoid the overwrite flash |
|
|
427
|
+
|
|
428
|
+
> ⚠️ SSR is optional. Many islands work perfectly without it. Enable SSR when initial paint, SEO, or perceived performance matter.
|
|
429
|
+
|
|
430
|
+
See the **[SSR Guide](https://github.com/dcza/live-react-islands/blob/main/docs/SSR.md)** for complete setup instructions, caching strategies, and custom renderer implementation.
|
|
431
|
+
|
|
432
|
+
## Requirements
|
|
433
|
+
|
|
434
|
+
- Elixir >= 1.14
|
|
435
|
+
- Phoenix LiveView >= 1.0
|
|
436
|
+
- React 18 or 19
|
|
437
|
+
- Any JavaScript bundler (built-in SSR plugin for Vite)
|
|
438
|
+
|
|
439
|
+
### Running Examples
|
|
440
|
+
|
|
441
|
+
```bash
|
|
442
|
+
cd examples/vite-example
|
|
443
|
+
mix deps.get
|
|
444
|
+
yarn install
|
|
445
|
+
yarn dev
|
|
446
|
+
mix phx.server # in another terminal
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
## Contributing
|
|
450
|
+
|
|
451
|
+
See [CONTRIBUTING.md](https://github.com/dcza/live-react-islands/blob/main/CONTRIBUTING.md) for development setup and guidelines.
|
|
452
|
+
|
|
453
|
+
## License
|
|
454
|
+
|
|
455
|
+
MIT License - see [LICENSE](https://github.com/dcza/live-react-islands/blob/main/LICENSE) for details.
|
package/dist/index.esm.js
CHANGED
|
@@ -469,7 +469,7 @@ function createHooks({ islands: islandsMap = {}, SharedContextProvider = NullCon
|
|
|
469
469
|
const el = this.el;
|
|
470
470
|
pendingMounts.add(elId);
|
|
471
471
|
(async () => {
|
|
472
|
-
const islandConfig = await resolveIslandConfig(islandsMap, componentName,
|
|
472
|
+
const islandConfig = await resolveIslandConfig(islandsMap, componentName, NullContextProvider$1);
|
|
473
473
|
if (!pendingMounts.has(elId))
|
|
474
474
|
return;
|
|
475
475
|
pendingMounts.delete(elId);
|
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 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","IslandsManager"],"mappings":"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"}
|
|
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":"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"}
|
package/dist/index.js
CHANGED
|
@@ -471,7 +471,7 @@ function createHooks({ islands: islandsMap = {}, SharedContextProvider = NullCon
|
|
|
471
471
|
const el = this.el;
|
|
472
472
|
pendingMounts.add(elId);
|
|
473
473
|
(async () => {
|
|
474
|
-
const islandConfig = await resolveIslandConfig(islandsMap, componentName,
|
|
474
|
+
const islandConfig = await resolveIslandConfig(islandsMap, componentName, NullContextProvider$1);
|
|
475
475
|
if (!pendingMounts.has(elId))
|
|
476
476
|
return;
|
|
477
477
|
pendingMounts.delete(elId);
|
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 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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"}
|
|
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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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@live-react-islands/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Core React integration for LiveReactIslands - Phoenix LiveView hook and utilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"module": "dist/index.esm.js",
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
10
11
|
"import": "./dist/index.esm.js",
|
|
11
12
|
"require": "./dist/index.js"
|
|
12
13
|
},
|
|
13
14
|
"./ssr": {
|
|
15
|
+
"types": "./dist/ssr.d.ts",
|
|
14
16
|
"import": "./dist/ssr.esm.js",
|
|
15
17
|
"require": "./dist/ssr.js"
|
|
16
18
|
}
|
|
@@ -24,7 +26,8 @@
|
|
|
24
26
|
"build": "rollup -c",
|
|
25
27
|
"dev": "rollup -c -w",
|
|
26
28
|
"test": "jest",
|
|
27
|
-
"clean": "rm -rf dist"
|
|
29
|
+
"clean": "rm -rf dist",
|
|
30
|
+
"prepublishOnly": "cp ../../../README.md ./"
|
|
28
31
|
},
|
|
29
32
|
"keywords": [
|
|
30
33
|
"phoenix",
|
|
@@ -51,13 +54,16 @@
|
|
|
51
54
|
"@rollup/plugin-commonjs": "^25.0.7",
|
|
52
55
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
53
56
|
"@rollup/plugin-typescript": "^11.1.6",
|
|
57
|
+
"@testing-library/dom": "^10.4.1",
|
|
54
58
|
"@testing-library/jest-dom": "^6.1.5",
|
|
55
|
-
"@testing-library/react": "^
|
|
59
|
+
"@testing-library/react": "^16.3.2",
|
|
56
60
|
"@types/jest": "^29.5.12",
|
|
57
61
|
"@types/react": "^18.3.12",
|
|
58
62
|
"@types/react-dom": "^18.3.1",
|
|
59
63
|
"jest": "^29.7.0",
|
|
60
64
|
"jest-environment-jsdom": "^29.7.0",
|
|
65
|
+
"react": "19.2.1",
|
|
66
|
+
"react-dom": "19.2.1",
|
|
61
67
|
"rollup": "^4.24.0",
|
|
62
68
|
"ts-jest": "^29.1.2",
|
|
63
69
|
"tslib": "^2.8.1",
|
package/src/createHooks.ts
CHANGED