@avento-space/ts-ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +9 -0
- package/README.md +277 -0
- package/dist/adapters/dom/hydration.d.ts +4 -0
- package/dist/adapters/dom/hydration.d.ts.map +1 -0
- package/dist/adapters/dom/hydration.js +366 -0
- package/dist/adapters/dom/hydration.js.map +1 -0
- package/dist/adapters/dom/index.d.ts +3 -0
- package/dist/adapters/dom/index.d.ts.map +1 -0
- package/dist/adapters/dom/index.js +3 -0
- package/dist/adapters/dom/index.js.map +1 -0
- package/dist/adapters/dom/node-metadata.d.ts +18 -0
- package/dist/adapters/dom/node-metadata.d.ts.map +1 -0
- package/dist/adapters/dom/node-metadata.js +146 -0
- package/dist/adapters/dom/node-metadata.js.map +1 -0
- package/dist/adapters/dom/renderer.d.ts +6 -0
- package/dist/adapters/dom/renderer.d.ts.map +1 -0
- package/dist/adapters/dom/renderer.js +748 -0
- package/dist/adapters/dom/renderer.js.map +1 -0
- package/dist/adapters/ssr/index.d.ts +3 -0
- package/dist/adapters/ssr/index.d.ts.map +1 -0
- package/dist/adapters/ssr/index.js +2 -0
- package/dist/adapters/ssr/index.js.map +1 -0
- package/dist/adapters/ssr/renderer.d.ts +9 -0
- package/dist/adapters/ssr/renderer.d.ts.map +1 -0
- package/dist/adapters/ssr/renderer.js +294 -0
- package/dist/adapters/ssr/renderer.js.map +1 -0
- package/dist/compiler/index.d.ts +2 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +2 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/jsx.d.ts +10 -0
- package/dist/compiler/jsx.d.ts.map +1 -0
- package/dist/compiler/jsx.js +48 -0
- package/dist/compiler/jsx.js.map +1 -0
- package/dist/components/button.d.ts +12 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +11 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +5 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/input.d.ts +22 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +44 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/list.d.ts +18 -0
- package/dist/components/list.d.ts.map +1 -0
- package/dist/components/list.js +46 -0
- package/dist/components/list.js.map +1 -0
- package/dist/components/portal.d.ts +7 -0
- package/dist/components/portal.d.ts.map +1 -0
- package/dist/components/portal.js +30 -0
- package/dist/components/portal.js.map +1 -0
- package/dist/core/context.d.ts +13 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +46 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/h.d.ts +4 -0
- package/dist/core/h.d.ts.map +1 -0
- package/dist/core/h.js +23 -0
- package/dist/core/h.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lifecycle.d.ts +11 -0
- package/dist/core/lifecycle.d.ts.map +1 -0
- package/dist/core/lifecycle.js +62 -0
- package/dist/core/lifecycle.js.map +1 -0
- package/dist/core/plugin.d.ts +17 -0
- package/dist/core/plugin.d.ts.map +1 -0
- package/dist/core/plugin.js +117 -0
- package/dist/core/plugin.js.map +1 -0
- package/dist/core/reactive-context.d.ts +20 -0
- package/dist/core/reactive-context.d.ts.map +1 -0
- package/dist/core/reactive-context.js +42 -0
- package/dist/core/reactive-context.js.map +1 -0
- package/dist/core/scheduler.d.ts +13 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +80 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/signal.d.ts +14 -0
- package/dist/core/signal.d.ts.map +1 -0
- package/dist/core/signal.js +397 -0
- package/dist/core/signal.js.map +1 -0
- package/dist/core/store.d.ts +6 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +35 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/types.d.ts +52 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +8 -0
- package/dist/core/types.js.map +1 -0
- package/dist/devtools/index.d.ts +5 -0
- package/dist/devtools/index.d.ts.map +1 -0
- package/dist/devtools/index.js +3 -0
- package/dist/devtools/index.js.map +1 -0
- package/dist/devtools/inspector.d.ts +14 -0
- package/dist/devtools/inspector.d.ts.map +1 -0
- package/dist/devtools/inspector.js +83 -0
- package/dist/devtools/inspector.js.map +1 -0
- package/dist/devtools/logger.d.ts +17 -0
- package/dist/devtools/logger.d.ts.map +1 -0
- package/dist/devtools/logger.js +44 -0
- package/dist/devtools/logger.js.map +1 -0
- package/dist/examples/counter.d.ts +4 -0
- package/dist/examples/counter.d.ts.map +1 -0
- package/dist/examples/counter.js +21 -0
- package/dist/examples/counter.js.map +1 -0
- package/dist/examples/ssr.d.ts +2 -0
- package/dist/examples/ssr.d.ts.map +1 -0
- package/dist/examples/ssr.js +43 -0
- package/dist/examples/ssr.js.map +1 -0
- package/dist/examples/todo.d.ts +4 -0
- package/dist/examples/todo.d.ts.map +1 -0
- package/dist/examples/todo.js +76 -0
- package/dist/examples/todo.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/index.d.ts +3 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +2 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/router.d.ts +4 -0
- package/dist/plugins/router.d.ts.map +1 -0
- package/dist/plugins/router.js +90 -0
- package/dist/plugins/router.js.map +1 -0
- package/dist/plugins/types.d.ts +17 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/render/reconciler.d.ts +6 -0
- package/dist/render/reconciler.d.ts.map +1 -0
- package/dist/render/reconciler.js +80 -0
- package/dist/render/reconciler.js.map +1 -0
- package/dist/render/types.d.ts +17 -0
- package/dist/render/types.d.ts.map +1 -0
- package/dist/render/types.js +2 -0
- package/dist/render/types.js.map +1 -0
- package/package.json +99 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
PROPRIETARY & PRIVATE LICENSE
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Qumora / Avento Space. All rights reserved.
|
|
4
|
+
|
|
5
|
+
This software and all associated documentation files (the "Software") are proprietary and confidential. Unauthorized copying, modification, distribution, public display, transmission, or sublicensing of this Software, via any medium, is strictly prohibited.
|
|
6
|
+
|
|
7
|
+
No permission, license, or rights of any kind are granted to any individual, group, or entity to use, modify, compile, decompile, disassemble, reverse engineer, merge, publish, distribute, sublicense, and/or sell copies of the Software, except as explicitly authorized in writing by the copyright holders.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# Avento TS UI
|
|
2
|
+
|
|
3
|
+
**Framework-agnostic, signal-driven UI library for TypeScript.**
|
|
4
|
+
|
|
5
|
+
Build reactive user interfaces once and render them anywhere — DOM, SSR, or custom targets — without coupling your components to any specific framework, browser API, or runtime environment.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Philosophy
|
|
10
|
+
|
|
11
|
+
Avento TS UI is built on a strict separation of concerns:
|
|
12
|
+
|
|
13
|
+
- **Core** — abstract UI model (VNodes), reactive primitives (signals/computed/effects), context, store, lifecycle, and plugin system. Zero platform dependencies.
|
|
14
|
+
- **Render** — generic `Renderer<T, THost>` interface that decouples UI definition from output strategy.
|
|
15
|
+
- **Adapters** — platform-specific renderers (DOM with reconciliation and hydration, SSR with streaming).
|
|
16
|
+
- **Components** — pure functional components consuming `(props, children?) => VNode`, fully portable across all adapters.
|
|
17
|
+
|
|
18
|
+
No layer depends on the internals of another. The same component function works unchanged in the browser and on the server.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Features
|
|
23
|
+
|
|
24
|
+
- **Signal-based reactivity** — fine-grained, dependency-tracked, auto-batched updates
|
|
25
|
+
- **Computed values** — lazy, cached, dependency-aware derived state
|
|
26
|
+
- **Pure functional components** — no classes, no `this`, no hidden state
|
|
27
|
+
- **Pluggable renderers** — DOM (with reconciliation + hydration), SSR (string + streaming)
|
|
28
|
+
- **Context system** — typed provider chain for dependency injection
|
|
29
|
+
- **Immutable store** — subscription-based state management built on signals
|
|
30
|
+
- **Lifecycle hooks** — `onMount`, `onUnmount`, `onUpdate` (enabled by renderer)
|
|
31
|
+
- **Plugin architecture** — named hooks for extensibility (router, devtools, etc.)
|
|
32
|
+
- **Fragment support** — group children without extra DOM nodes
|
|
33
|
+
- **JSX transform** — `jsx`/`jsxs`/`jsxDEV` functions for compiler integration
|
|
34
|
+
- **Strong TypeScript** — full type inference for signals, components, and renderers
|
|
35
|
+
- **Zero runtime dependencies** — only TypeScript
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Quick Start
|
|
39
|
+
|
|
40
|
+
### Install
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm install @avento/ts-ui
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### DOM Rendering
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
import { h, signal, computed, effect, mount } from '@avento/ts-ui';
|
|
50
|
+
|
|
51
|
+
const count = signal(0);
|
|
52
|
+
const doubled = computed(() => count.get() * 2);
|
|
53
|
+
|
|
54
|
+
function App() {
|
|
55
|
+
return h('div', { class: 'app' }, [
|
|
56
|
+
h('h1', null, ['Avento Counter']),
|
|
57
|
+
h('p', null, [`Count: `, count]),
|
|
58
|
+
h('p', null, [`Doubled: `, doubled]),
|
|
59
|
+
h('button', { onClick: () => count.set(count.get() + 1) }, ['+']),
|
|
60
|
+
h('button', { onClick: () => count.set(count.get() - 1) }, ['-']),
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const renderer = mount(h(App), document.getElementById('root')!);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Signal values passed directly in `children` or `props` are automatically bound — the DOM updates reactively without re-rendering the entire tree.
|
|
68
|
+
|
|
69
|
+
### SSR Rendering
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
import { h, renderToString } from '@avento/ts-ui';
|
|
73
|
+
|
|
74
|
+
function Page() {
|
|
75
|
+
return h('div', { class: 'page' }, [
|
|
76
|
+
h('h1', null, ['Hello from SSR']),
|
|
77
|
+
h('p', null, ['This was rendered on the server.']),
|
|
78
|
+
]);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const html = renderToString(h(Page));
|
|
82
|
+
console.log(html);
|
|
83
|
+
// <div class="page"><h1>Hello from SSR</h1><p>This was rendered on the server.</p></div>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Architecture
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
src/
|
|
92
|
+
├── core/ # VNode, Signal, Component, Context, Store, Lifecycle, Plugin
|
|
93
|
+
├── render/ # Renderer<TOutput,THost> interface + VNode resolver
|
|
94
|
+
├── adapters/ # Platform renderers
|
|
95
|
+
├── adapters/ # Platform renderers
|
|
96
|
+
│ ├── dom/ # mount(), hydrate(), signal DOM bindings
|
|
97
|
+
│ └── ssr/ # renderToString(), renderToStream()
|
|
98
|
+
├── components/ # Reusable components (Button, Input, List, Portal)
|
|
99
|
+
├── plugins/ # Router plugin + plugin types
|
|
100
|
+
├── compiler/ # JSX transform (jsx/jsxs/jsxDEV)
|
|
101
|
+
└── devtools/ # VNode inspector, state logger
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Dependency Flow
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
Components ──► Core ◄── Plugins
|
|
108
|
+
│
|
|
109
|
+
Render Interface
|
|
110
|
+
│
|
|
111
|
+
┌──────────┼──────────┐
|
|
112
|
+
│ │ │
|
|
113
|
+
DOM SSR Custom Adapter
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Core never imports from adapters. Adapters import Core. Components import only Core types and the `h` factory.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Core Concepts
|
|
121
|
+
|
|
122
|
+
### VNode
|
|
123
|
+
|
|
124
|
+
The universal UI representation:
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
interface VNode {
|
|
128
|
+
type: string | Component | typeof Fragment;
|
|
129
|
+
props: Record<string, any> | null;
|
|
130
|
+
children: VNodeChild[];
|
|
131
|
+
key?: string | number;
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### `h()` — Hyperscript
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
h('div', { class: 'container' }, [
|
|
139
|
+
h('h1', null, ['Title']),
|
|
140
|
+
h('p', null, ['Paragraph with ', signalValue]),
|
|
141
|
+
]);
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
- `type` — element tag name, component function, or `Fragment`
|
|
145
|
+
- `props` — attributes, properties, event listeners (`onClick`, etc.), signals
|
|
146
|
+
- `children` — VNodes, strings, numbers, booleans, `null`, or signals
|
|
147
|
+
|
|
148
|
+
### Signals
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
import { signal, computed, effect, batch, untrack } from '@avento/ts-ui';
|
|
152
|
+
|
|
153
|
+
const name = signal('World');
|
|
154
|
+
const greeting = computed(() => `Hello, ${name.get()}!`);
|
|
155
|
+
|
|
156
|
+
effect(() => {
|
|
157
|
+
console.log(greeting.get()); // logs whenever name changes
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
batch(() => {
|
|
161
|
+
name.set('Agnostic');
|
|
162
|
+
name.set('UI'); // only one notification after batch
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Context
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
import { createContext, useContext, h, mount } from '@avento/ts-ui';
|
|
170
|
+
|
|
171
|
+
const Theme = createContext('light');
|
|
172
|
+
|
|
173
|
+
function Panel() {
|
|
174
|
+
const theme = useContext(Theme);
|
|
175
|
+
return h('div', { class: `theme-${theme}` }, ['Themed content']);
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Browser DOM
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
import { mount } from '@avento/ts-ui';
|
|
185
|
+
|
|
186
|
+
const instance = mount(h(App), document.getElementById('root')!);
|
|
187
|
+
// instance.render(newVNode) — re-render
|
|
188
|
+
// instance.hydrate(vnode) — attach to existing DOM
|
|
189
|
+
// instance.destroy() — unmount and clean up
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Signal values in props or children create direct DOM bindings — only the affected nodes update when the signal changes.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Server-Side Rendering
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
import { renderToString, renderToStream } from '@avento/ts-ui';
|
|
200
|
+
|
|
201
|
+
// Full document
|
|
202
|
+
const html = renderToString(h(Page));
|
|
203
|
+
|
|
204
|
+
// Streaming
|
|
205
|
+
for await (const chunk of renderToStream(h(Page))) {
|
|
206
|
+
res.write(chunk);
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Signals are resolved at render time via `untrack()`. Event handlers and other DOM-only props are omitted from the HTML output.
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Built-in Components
|
|
215
|
+
|
|
216
|
+
Avento TS UI provides a set of highly optimized, platform-agnostic UI components:
|
|
217
|
+
|
|
218
|
+
- **Button**: Custom styled interactive button.
|
|
219
|
+
- **Input**: Reactive text input control with controlled states.
|
|
220
|
+
- **List**: Keyed child element list wrapper.
|
|
221
|
+
- **VirtualList**: Zero-overhead windowed list virtualization (scrolling requires external scroll bindings).
|
|
222
|
+
- **Portal**: Renders children outside the standard DOM hierarchy.
|
|
223
|
+
|
|
224
|
+
For complete API details and scroll state implementation examples, see the [Components Documentation](docs/components.md).
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Plugins
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
import { registerPlugin, createRouter } from '@avento/ts-ui';
|
|
232
|
+
|
|
233
|
+
const router = createRouter({ mode: 'history' });
|
|
234
|
+
registerPlugin(router);
|
|
235
|
+
|
|
236
|
+
router.navigate('/dashboard');
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
The plugin system uses named hooks. Custom plugins receive a `PluginAPI` to register and invoke hooks.
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## JSX Support
|
|
244
|
+
|
|
245
|
+
Configure your TypeScript `tsconfig.json`:
|
|
246
|
+
|
|
247
|
+
```json
|
|
248
|
+
{
|
|
249
|
+
"compilerOptions": {
|
|
250
|
+
"jsx": "react-jsx",
|
|
251
|
+
"jsxImportSource": "@avento/ts-ui"
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
The compiler module exports `jsx`, `jsxs`, and `jsxDEV` for the automatic JSX runtime.
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Project Structure
|
|
261
|
+
|
|
262
|
+
| Layer | Directory | Responsibility |
|
|
263
|
+
|-------|-----------|----------------|
|
|
264
|
+
| Core | `src/core/` | VNode, signals, context, store, lifecycle, plugins |
|
|
265
|
+
| Render | `src/render/` | Renderer interface, VNode resolver |
|
|
266
|
+
| DOM Adapter | `src/adapters/dom/` | mount(), hydrate(), signal bindings |
|
|
267
|
+
| SSR Adapter | `src/adapters/ssr/` | renderToString(), renderToStream() |
|
|
268
|
+
| Components | `src/components/` | Button, Input, List, Portal |
|
|
269
|
+
| Plugins | `src/plugins/` | Router plugin |
|
|
270
|
+
| Compiler | `src/compiler/` | JSX transform functions |
|
|
271
|
+
| DevTools | `src/devtools/` | Inspector, state logger |
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## License
|
|
276
|
+
|
|
277
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydration.d.ts","sourceRoot":"","sources":["../../../src/adapters/dom/hydration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM,qBAAqB,CAAC;AAS7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA6B7D,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,OAAO,EAClB,SAAS,GAAE,eAAe,EAAE,GAAG,IAAW,GACzC,IAAI,CAGN"}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { Fragment } from '../../core/types.js';
|
|
2
|
+
import { isSignal, effect } from '../../core/signal.js';
|
|
3
|
+
import { createLifecycleContext, setCurrentLifecycle, } from '../../core/lifecycle.js';
|
|
4
|
+
import { setContextProviders, } from '../../core/context.js';
|
|
5
|
+
import { resolveVNode } from '../../render/reconciler.js';
|
|
6
|
+
import { createDOMNode } from './renderer.js';
|
|
7
|
+
import { trackEffect, disposeNodeEffects, pushNodeLifecycle, runNodeUnmountLifecycles, trackPropEffect as trackHydrationPropDispose, setNodeKey, getNodeKey, } from './node-metadata.js';
|
|
8
|
+
function buildKeyMap(parent) {
|
|
9
|
+
const map = new Map();
|
|
10
|
+
for (let i = 0; i < parent.childNodes.length; i++) {
|
|
11
|
+
const child = parent.childNodes[i];
|
|
12
|
+
let key = getNodeKey(child);
|
|
13
|
+
if (key == null && child.getAttribute) {
|
|
14
|
+
const dataKey = child.getAttribute('data-key');
|
|
15
|
+
if (dataKey != null) {
|
|
16
|
+
key = dataKey;
|
|
17
|
+
setNodeKey(child, key);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (key != null) {
|
|
21
|
+
map.set(key, child);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return map;
|
|
25
|
+
}
|
|
26
|
+
export function hydrateVNode(vnode, container, providers = null) {
|
|
27
|
+
const resolved = resolveVNode(vnode);
|
|
28
|
+
attachTree(resolved, container, 0, providers);
|
|
29
|
+
}
|
|
30
|
+
function countVNodePositions(vnode) {
|
|
31
|
+
if (vnode.type === Fragment) {
|
|
32
|
+
let count = 0;
|
|
33
|
+
for (const child of vnode.children) {
|
|
34
|
+
if (child == null || child === false)
|
|
35
|
+
continue;
|
|
36
|
+
if (typeof child === 'string' || typeof child === 'number' || typeof child === 'boolean') {
|
|
37
|
+
count++;
|
|
38
|
+
}
|
|
39
|
+
else if (isSignal(child)) {
|
|
40
|
+
count++;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
count += countVNodePositions(child);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return count;
|
|
47
|
+
}
|
|
48
|
+
return 1;
|
|
49
|
+
}
|
|
50
|
+
function attachTree(vnode, parent, index, providers) {
|
|
51
|
+
if (vnode.type === Fragment) {
|
|
52
|
+
let childIdx = 0;
|
|
53
|
+
for (const child of vnode.children) {
|
|
54
|
+
if (child == null || child === false)
|
|
55
|
+
continue;
|
|
56
|
+
if (typeof child === 'string' || typeof child === 'number' || typeof child === 'boolean') {
|
|
57
|
+
const existing = parent.childNodes[index + childIdx];
|
|
58
|
+
if (existing) {
|
|
59
|
+
existing.textContent = String(child);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
parent.appendChild(document.createTextNode(String(child)));
|
|
63
|
+
}
|
|
64
|
+
childIdx++;
|
|
65
|
+
}
|
|
66
|
+
else if (isSignal(child)) {
|
|
67
|
+
const existing = parent.childNodes[index + childIdx];
|
|
68
|
+
if (existing) {
|
|
69
|
+
const dispose = effect(() => {
|
|
70
|
+
existing.textContent = String(child.get() ?? '');
|
|
71
|
+
});
|
|
72
|
+
trackEffect(existing, dispose);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const text = document.createTextNode(String(child.get() ?? ''));
|
|
76
|
+
const dispose = effect(() => {
|
|
77
|
+
text.textContent = String(child.get() ?? '');
|
|
78
|
+
});
|
|
79
|
+
trackEffect(text, dispose);
|
|
80
|
+
parent.insertBefore(text, parent.childNodes[index + childIdx] ?? null);
|
|
81
|
+
}
|
|
82
|
+
childIdx++;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const vn = child;
|
|
86
|
+
const existing = parent.childNodes[index + childIdx];
|
|
87
|
+
if (existing) {
|
|
88
|
+
const attached = attachTree(vn, parent, index + childIdx, providers);
|
|
89
|
+
if (attached)
|
|
90
|
+
childIdx++;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const nodes = createDOMNode(vn, providers);
|
|
94
|
+
if (Array.isArray(nodes)) {
|
|
95
|
+
for (const n of nodes) {
|
|
96
|
+
parent.insertBefore(n, parent.childNodes[index + childIdx] ?? null);
|
|
97
|
+
childIdx++;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
parent.insertBefore(nodes, parent.childNodes[index + childIdx] ?? null);
|
|
102
|
+
childIdx++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
let existing = parent.childNodes[index];
|
|
110
|
+
if (vnode.key != null) {
|
|
111
|
+
const keyStr = String(vnode.key);
|
|
112
|
+
for (let ci = 0; ci < parent.childNodes.length; ci++) {
|
|
113
|
+
const child = parent.childNodes[ci];
|
|
114
|
+
const childKey = getNodeKey(child) ?? (child.getAttribute?.('data-key'));
|
|
115
|
+
if (childKey != null && String(childKey) === keyStr) {
|
|
116
|
+
existing = child;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (!existing) {
|
|
122
|
+
const created = createDOMNode(vnode, providers);
|
|
123
|
+
if (Array.isArray(created)) {
|
|
124
|
+
const frag = document.createDocumentFragment();
|
|
125
|
+
for (const n of created)
|
|
126
|
+
frag.appendChild(n);
|
|
127
|
+
parent.insertBefore(frag, parent.childNodes[index] ?? null);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
parent.insertBefore(created, parent.childNodes[index] ?? null);
|
|
131
|
+
}
|
|
132
|
+
return created instanceof Node ? created : (created[0] ?? null);
|
|
133
|
+
}
|
|
134
|
+
if (typeof vnode.type === 'function') {
|
|
135
|
+
const comp = vnode.type;
|
|
136
|
+
if (comp.__isPortal) {
|
|
137
|
+
const target = comp.__portalTarget;
|
|
138
|
+
if (!target)
|
|
139
|
+
return null;
|
|
140
|
+
const lifecycle = createLifecycleContext();
|
|
141
|
+
const prevLifecycle = setCurrentLifecycle(lifecycle);
|
|
142
|
+
const prevProviders = setContextProviders(providers);
|
|
143
|
+
try {
|
|
144
|
+
const anchor = document.createComment('portal');
|
|
145
|
+
let childIdx = 0;
|
|
146
|
+
for (const child of vnode.children) {
|
|
147
|
+
if (child == null || child === false)
|
|
148
|
+
continue;
|
|
149
|
+
if (typeof child === 'string' || typeof child === 'number' || typeof child === 'boolean') {
|
|
150
|
+
target.appendChild(document.createTextNode(String(child)));
|
|
151
|
+
childIdx++;
|
|
152
|
+
}
|
|
153
|
+
else if (isSignal(child)) {
|
|
154
|
+
const text = document.createTextNode(String(child.get() ?? ''));
|
|
155
|
+
const dispose = effect(() => {
|
|
156
|
+
text.textContent = String(child.get() ?? '');
|
|
157
|
+
});
|
|
158
|
+
trackEffect(text, dispose);
|
|
159
|
+
target.appendChild(text);
|
|
160
|
+
childIdx++;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
const vn = child;
|
|
164
|
+
const nodes = createDOMNode(vn, providers);
|
|
165
|
+
if (Array.isArray(nodes)) {
|
|
166
|
+
for (const n of nodes)
|
|
167
|
+
target.appendChild(n);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
target.appendChild(nodes);
|
|
171
|
+
}
|
|
172
|
+
childIdx++;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
lifecycle.runHook('mount');
|
|
176
|
+
pushNodeLifecycle(anchor, lifecycle);
|
|
177
|
+
return anchor;
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
setCurrentLifecycle(prevLifecycle);
|
|
181
|
+
setContextProviders(prevProviders);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const lifecycle = createLifecycleContext();
|
|
185
|
+
const prevLifecycle = setCurrentLifecycle(lifecycle);
|
|
186
|
+
const prevProviders = setContextProviders(providers);
|
|
187
|
+
try {
|
|
188
|
+
const resolved = resolveVNode(vnode);
|
|
189
|
+
if (resolved.type === Fragment) {
|
|
190
|
+
const posBefore = countVNodePositions(resolved);
|
|
191
|
+
attachTree(resolved, parent, index, providers);
|
|
192
|
+
lifecycle.runHook('mount');
|
|
193
|
+
for (let i = 0; i < posBefore; i++) {
|
|
194
|
+
const child = parent.childNodes[index + i];
|
|
195
|
+
if (child)
|
|
196
|
+
pushNodeLifecycle(child, lifecycle);
|
|
197
|
+
}
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
const result = attachTree(resolved, parent, index, providers);
|
|
201
|
+
lifecycle.runHook('mount');
|
|
202
|
+
if (result)
|
|
203
|
+
pushNodeLifecycle(result, lifecycle);
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
setCurrentLifecycle(prevLifecycle);
|
|
208
|
+
setContextProviders(prevProviders);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const el = existing;
|
|
212
|
+
if (vnode.props) {
|
|
213
|
+
for (const [key, value] of Object.entries(vnode.props)) {
|
|
214
|
+
if (key === 'key') {
|
|
215
|
+
if (value != null) {
|
|
216
|
+
setNodeKey(el, value);
|
|
217
|
+
}
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (key === 'children')
|
|
221
|
+
continue;
|
|
222
|
+
if (isSignal(value)) {
|
|
223
|
+
let prevHandler = null;
|
|
224
|
+
const apply = () => {
|
|
225
|
+
const val = value.get();
|
|
226
|
+
if (key.startsWith('on') && typeof val === 'function') {
|
|
227
|
+
const event = key.slice(2).toLowerCase();
|
|
228
|
+
if (prevHandler) {
|
|
229
|
+
el.removeEventListener(event, prevHandler);
|
|
230
|
+
}
|
|
231
|
+
prevHandler = val;
|
|
232
|
+
el.addEventListener(event, prevHandler);
|
|
233
|
+
}
|
|
234
|
+
else if (key === 'className' || key === 'class') {
|
|
235
|
+
el.setAttribute('class', String(val ?? ''));
|
|
236
|
+
}
|
|
237
|
+
else if (val != null && val !== false) {
|
|
238
|
+
el.setAttribute(key, String(val));
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
el.removeAttribute(key);
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
const dispose = effect(apply);
|
|
245
|
+
trackEffect(el, dispose);
|
|
246
|
+
trackHydrationPropDispose(el, key, () => {
|
|
247
|
+
if (prevHandler && key.startsWith('on')) {
|
|
248
|
+
const event = key.slice(2).toLowerCase();
|
|
249
|
+
el.removeEventListener(event, prevHandler);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
else if (key.startsWith('on') && typeof value === 'function') {
|
|
254
|
+
const event = key.slice(2).toLowerCase();
|
|
255
|
+
const handler = value;
|
|
256
|
+
el.addEventListener(event, handler);
|
|
257
|
+
trackHydrationPropDispose(el, key, () => {
|
|
258
|
+
el.removeEventListener(event, handler);
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
let childIdx = 0;
|
|
264
|
+
const keyMap = buildKeyMap(el);
|
|
265
|
+
const usedIndices = new Set();
|
|
266
|
+
for (let i = 0; i < vnode.children.length; i++) {
|
|
267
|
+
const child = vnode.children[i];
|
|
268
|
+
if (child == null || child === false)
|
|
269
|
+
continue;
|
|
270
|
+
if (typeof child === 'string' || typeof child === 'number' || typeof child === 'boolean') {
|
|
271
|
+
const target = el.childNodes[childIdx];
|
|
272
|
+
if (target) {
|
|
273
|
+
if (target.textContent !== String(child)) {
|
|
274
|
+
target.textContent = String(child);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
el.appendChild(document.createTextNode(String(child)));
|
|
279
|
+
}
|
|
280
|
+
childIdx++;
|
|
281
|
+
}
|
|
282
|
+
else if (isSignal(child)) {
|
|
283
|
+
const target = el.childNodes[childIdx];
|
|
284
|
+
if (target) {
|
|
285
|
+
const dispose = effect(() => {
|
|
286
|
+
target.textContent = String(child.get() ?? '');
|
|
287
|
+
});
|
|
288
|
+
trackEffect(target, dispose);
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
const text = document.createTextNode(String(child.get() ?? ''));
|
|
292
|
+
const dispose = effect(() => {
|
|
293
|
+
text.textContent = String(child.get() ?? '');
|
|
294
|
+
});
|
|
295
|
+
trackEffect(text, dispose);
|
|
296
|
+
el.appendChild(text);
|
|
297
|
+
}
|
|
298
|
+
childIdx++;
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
const vn = child;
|
|
302
|
+
const vnKey = vn.key != null ? vn.key : undefined;
|
|
303
|
+
if (vnKey != null && keyMap.has(vnKey)) {
|
|
304
|
+
const keyedNode = keyMap.get(vnKey);
|
|
305
|
+
const currentAtIdx = el.childNodes[childIdx];
|
|
306
|
+
if (keyedNode !== currentAtIdx) {
|
|
307
|
+
el.insertBefore(keyedNode, currentAtIdx ?? null);
|
|
308
|
+
}
|
|
309
|
+
const childNodes = el.childNodes;
|
|
310
|
+
for (let j = 0; j < childNodes.length; j++) {
|
|
311
|
+
if (childNodes[j] === keyedNode) {
|
|
312
|
+
usedIndices.add(j);
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
attachTree(vn, el, childIdx, providers);
|
|
317
|
+
childIdx++;
|
|
318
|
+
}
|
|
319
|
+
else if (childIdx < el.childNodes.length) {
|
|
320
|
+
const existingNode = el.childNodes[childIdx];
|
|
321
|
+
const existingKey = getNodeKey(existingNode);
|
|
322
|
+
if (existingKey == null && vnKey == null) {
|
|
323
|
+
usedIndices.add(childIdx);
|
|
324
|
+
attachTree(vn, el, childIdx, providers);
|
|
325
|
+
childIdx++;
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
const nodes = createDOMNode(vn, providers);
|
|
329
|
+
if (Array.isArray(nodes)) {
|
|
330
|
+
for (const n of nodes) {
|
|
331
|
+
el.insertBefore(n, existingNode ?? null);
|
|
332
|
+
childIdx++;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
el.insertBefore(nodes, existingNode ?? null);
|
|
337
|
+
childIdx++;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
const nodes = createDOMNode(vn, providers);
|
|
343
|
+
if (Array.isArray(nodes)) {
|
|
344
|
+
for (const n of nodes) {
|
|
345
|
+
el.appendChild(n);
|
|
346
|
+
childIdx++;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
el.appendChild(nodes);
|
|
351
|
+
childIdx++;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
while (el.childNodes.length > childIdx) {
|
|
357
|
+
const extra = el.childNodes[childIdx];
|
|
358
|
+
if (extra) {
|
|
359
|
+
disposeNodeEffects(extra);
|
|
360
|
+
runNodeUnmountLifecycles(extra);
|
|
361
|
+
el.removeChild(extra);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return el;
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=hydration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydration.js","sourceRoot":"","sources":["../../../src/adapters/dom/hydration.ts"],"names":[],"mappings":"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"}
|