@lytjs/renderer 5.0.0 → 6.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.
Files changed (88) hide show
  1. package/README.md +371 -204
  2. package/dist/dom.cjs +12 -1
  3. package/dist/dom.cjs.map +1 -0
  4. package/dist/dom.d.cts +1 -0
  5. package/dist/dom.d.ts +1 -0
  6. package/dist/dom.mjs +3 -1
  7. package/dist/dom.mjs.map +1 -0
  8. package/dist/index.cjs +3312 -1
  9. package/dist/index.cjs.map +1 -0
  10. package/dist/index.d.cts +1004 -0
  11. package/dist/index.d.ts +1004 -0
  12. package/dist/index.mjs +3190 -1
  13. package/dist/index.mjs.map +1 -0
  14. package/dist/ssr.cjs +310 -1
  15. package/dist/ssr.cjs.map +1 -0
  16. package/dist/ssr.d.cts +21 -0
  17. package/dist/ssr.d.ts +21 -0
  18. package/dist/ssr.mjs +308 -1
  19. package/dist/ssr.mjs.map +1 -0
  20. package/package.json +35 -58
  21. package/dist/miniapp.cjs +0 -21
  22. package/dist/miniapp.mjs +0 -21
  23. package/dist/native.cjs +0 -1
  24. package/dist/native.mjs +0 -1
  25. package/dist/types/create-renderer.d.ts +0 -20
  26. package/dist/types/create-renderer.d.ts.map +0 -1
  27. package/dist/types/dom/dom-ops.d.ts +0 -74
  28. package/dist/types/dom/dom-ops.d.ts.map +0 -1
  29. package/dist/types/dom/dom-renderer.d.ts +0 -243
  30. package/dist/types/dom/dom-renderer.d.ts.map +0 -1
  31. package/dist/types/dom/index.d.ts +0 -17
  32. package/dist/types/dom/index.d.ts.map +0 -1
  33. package/dist/types/dom/patch-events.d.ts +0 -123
  34. package/dist/types/dom/patch-events.d.ts.map +0 -1
  35. package/dist/types/dom/patch-props.d.ts +0 -118
  36. package/dist/types/dom/patch-props.d.ts.map +0 -1
  37. package/dist/types/index.d.ts +0 -36
  38. package/dist/types/index.d.ts.map +0 -1
  39. package/dist/types/miniapp/index.d.ts +0 -21
  40. package/dist/types/miniapp/index.d.ts.map +0 -1
  41. package/dist/types/miniapp/miniapp-compiler.d.ts +0 -269
  42. package/dist/types/miniapp/miniapp-compiler.d.ts.map +0 -1
  43. package/dist/types/miniapp/miniapp-event-bridge.d.ts +0 -255
  44. package/dist/types/miniapp/miniapp-event-bridge.d.ts.map +0 -1
  45. package/dist/types/miniapp/miniapp-lifecycle.d.ts +0 -224
  46. package/dist/types/miniapp/miniapp-lifecycle.d.ts.map +0 -1
  47. package/dist/types/miniapp/miniapp-renderer.d.ts +0 -269
  48. package/dist/types/miniapp/miniapp-renderer.d.ts.map +0 -1
  49. package/dist/types/miniapp/miniapp-utils.d.ts +0 -168
  50. package/dist/types/miniapp/miniapp-utils.d.ts.map +0 -1
  51. package/dist/types/miniapp/shared-constants.d.ts +0 -28
  52. package/dist/types/miniapp/shared-constants.d.ts.map +0 -1
  53. package/dist/types/mount.d.ts +0 -32
  54. package/dist/types/mount.d.ts.map +0 -1
  55. package/dist/types/native/index.d.ts +0 -13
  56. package/dist/types/native/index.d.ts.map +0 -1
  57. package/dist/types/native/native-renderer.d.ts +0 -249
  58. package/dist/types/native/native-renderer.d.ts.map +0 -1
  59. package/dist/types/patch.d.ts +0 -23
  60. package/dist/types/patch.d.ts.map +0 -1
  61. package/dist/types/props.d.ts +0 -19
  62. package/dist/types/props.d.ts.map +0 -1
  63. package/dist/types/renderer-interfaces.d.ts +0 -157
  64. package/dist/types/renderer-interfaces.d.ts.map +0 -1
  65. package/dist/types/shared/abstract-renderer.d.ts +0 -74
  66. package/dist/types/shared/abstract-renderer.d.ts.map +0 -1
  67. package/dist/types/ssr/hydration.d.ts +0 -267
  68. package/dist/types/ssr/hydration.d.ts.map +0 -1
  69. package/dist/types/ssr/index.d.ts +0 -15
  70. package/dist/types/ssr/index.d.ts.map +0 -1
  71. package/dist/types/ssr/ssr-renderer.d.ts +0 -277
  72. package/dist/types/ssr/ssr-renderer.d.ts.map +0 -1
  73. package/dist/types/unmount.d.ts +0 -16
  74. package/dist/types/unmount.d.ts.map +0 -1
  75. package/dist/types/vapor/index.d.ts +0 -18
  76. package/dist/types/vapor/index.d.ts.map +0 -1
  77. package/dist/types/vapor/vapor-compiler.d.ts +0 -76
  78. package/dist/types/vapor/vapor-compiler.d.ts.map +0 -1
  79. package/dist/types/vapor/vapor-component.d.ts +0 -55
  80. package/dist/types/vapor/vapor-component.d.ts.map +0 -1
  81. package/dist/types/vapor/vapor-reactive.d.ts +0 -133
  82. package/dist/types/vapor/vapor-reactive.d.ts.map +0 -1
  83. package/dist/types/vapor/vapor-renderer.d.ts +0 -135
  84. package/dist/types/vapor/vapor-renderer.d.ts.map +0 -1
  85. package/dist/types/vnode.d.ts +0 -203
  86. package/dist/types/vnode.d.ts.map +0 -1
  87. package/dist/vapor.cjs +0 -1
  88. package/dist/vapor.mjs +0 -1
package/README.md CHANGED
@@ -1,204 +1,371 @@
1
- # @lytjs/renderer
2
-
3
- Lyt.js 渲染器 - 提供 DOM、SSR、Vapor 等多种渲染模式。
4
-
5
- ## 安装
6
-
7
- ```bash
8
- npm install @lytjs/renderer
9
-
10
- # 或使用 pnpm
11
- pnpm add @lytjs/renderer
12
- ```
13
-
14
- ## 特性
15
-
16
- - 🌐 DOM 渲染器
17
- - 🚀 SSR 渲染器
18
- - Vapor 无虚拟 DOM 渲染器
19
- - 🔌 可扩展的渲染器架构
20
- - 🎯 零运行时依赖
21
-
22
- ## 快速开始
23
-
24
- ### DOM 渲染
25
-
26
- ```javascript
27
- import { createApp, defineComponent } from '@lytjs/core';
28
- import { render } from '@lytjs/renderer';
29
-
30
- const App = defineComponent({
31
- setup() {
32
- return { count: 0 };
33
- },
34
- template: `
35
- <div>
36
- <h1>{{ count }}</h1>
37
- <button @click="count++">Increment</button>
38
- </div>
39
- `
40
- });
41
-
42
- const app = createApp(App);
43
- app.mount('#app');
44
- ```
45
-
46
- ### SSR 渲染
47
-
48
- ```javascript
49
- import { createSSRApp, defineComponent } from '@lytjs/core';
50
- import { renderToString } from '@lytjs/renderer/ssr';
51
-
52
- const App = defineComponent({
53
- template: '<div>Hello SSR!</div>'
54
- });
55
-
56
- const app = createSSRApp(App);
57
- const html = await renderToString(app);
58
- console.log(html);
59
- ```
60
-
61
- ### Vapor 模式
62
-
63
- Vapor 是无虚拟 DOM 的编译优化模式,性能更优:
64
-
65
- ```javascript
66
- import { defineVaporComponent } from '@lytjs/renderer/vapor';
67
-
68
- const App = defineVaporComponent({
69
- setup() {
70
- const count = signal(0);
71
- return { count };
72
- },
73
- template: `
74
- <div>
75
- <h1><span bind:text="count"></span></h1>
76
- <button bind:onclick="() => count.set(count() + 1)">
77
- Increment
78
- </button>
79
- </div>
80
- `
81
- });
82
- ```
83
-
84
- ## API 参考
85
-
86
- ### DOM 渲染器
87
-
88
- | API | 说明 |
89
- |------|------|
90
- | `render(vnode, container)` | 渲染 VNode 到容器 |
91
- | `hydrate(vnode, container)` | 激活 SSR 渲染的内容 |
92
- | `createRenderer(options)` | 创建自定义渲染器 |
93
-
94
- ### SSR 渲染器
95
-
96
- | API | 说明 |
97
- |------|------|
98
- | `renderToString(app)` | 渲染应用到字符串 |
99
- | `renderToNodeStream(app)` | 渲染到 Node.js 流 |
100
- | `renderToWebStream(app)` | 渲染到 Web Stream |
101
-
102
- ### Vapor 渲染器
103
-
104
- | API | 说明 |
105
- |------|------|
106
- | `defineVaporComponent(options)` | 定义 Vapor 组件 |
107
- | `createVaporApp(rootComponent)` | 创建 Vapor 应用 |
108
-
109
- ## 渲染器架构
110
-
111
- ### 自定义渲染器
112
-
113
- ```javascript
114
- import { createRenderer } from '@lytjs/renderer';
115
-
116
- const { render, createApp } = createRenderer({
117
- // 节点操作
118
- insert: (child, parent, anchor) => { /* 自定义 */ },
119
- remove: (child) => { /* 自定义 */ },
120
- createElement: (tag) => { /* 自定义 */ },
121
- createText: (text) => { /* 自定义 */ },
122
- setElementText: (el, text) => { /* 自定义 */ },
123
- patchProp: (el, key, prevValue, nextValue) => { /* 自定义 */ },
124
- // ...其他钩子
125
- });
126
- ```
127
-
128
- ## Vapor 模式
129
-
130
- Vapor 模式通过编译时分析直接生成 DOM 操作代码,绕过虚拟 DOM:
131
-
132
- ```javascript
133
- // Vapor 编译输出示例
134
- function render() {
135
- const el1 = document.createElement('div');
136
- const el2 = document.createElement('h1');
137
- const textNode = document.createTextNode(count());
138
- el2.appendChild(textNode);
139
- el1.appendChild(el2);
140
-
141
- // 响应式更新
142
- effect(() => {
143
- textNode.data = count();
144
- });
145
-
146
- return el1;
147
- }
148
- ```
149
-
150
- ## 示例
151
-
152
- ### 自定义渲染器
153
-
154
- ```javascript
155
- import { createRenderer } from '@lytjs/renderer';
156
-
157
- // Canvas 渲染器示例
158
- const canvasRenderer = createRenderer({
159
- createElement(tag) {
160
- return { type: tag };
161
- },
162
- insert(child, parent) {
163
- parent.children = parent.children || [];
164
- parent.children.push(child);
165
- }
166
- // ...其他实现
167
- });
168
- ```
169
-
170
- ### 流式 SSR
171
-
172
- ```javascript
173
- import { createSSRApp } from '@lytjs/core';
174
- import { renderToNodeStream } from '@lytjs/renderer/ssr';
175
- import { createServer } from 'http';
176
-
177
- const App = defineComponent({ /* ... */ });
178
-
179
- createServer(async (req, res) => {
180
- const app = createSSRApp(App);
181
- const stream = renderToNodeStream(app);
182
- res.setHeader('Content-Type', 'text/html');
183
- stream.pipe(res);
184
- }).listen(3000);
185
- ```
186
-
187
- ## 性能
188
-
189
- - 体积:5.00 KB (ESM gzip)
190
- - 零运行时依赖
191
- - Vapor 模式性能接近原生 JS
192
- - SSR 支持流式渲染
193
-
194
- ## 兼容性
195
-
196
- - Node.js >= 18.0.0
197
- - Chrome 64+
198
- - Firefox 63+
199
- - Safari 12+
200
- - Edge 79+
201
-
202
- ## License
203
-
204
- MIT
1
+ # @lytjs/renderer
2
+
3
+ > LytJS 渲染后端,提供 DOM 渲染、SSR 渲染、Signal 渲染、Hydration 和 Island Architecture 支持
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @lytjs/renderer
9
+ ```
10
+
11
+ ## 渲染器类型
12
+
13
+ ### DOM 渲染器
14
+
15
+ 用于浏览器端的 DOM 渲染
16
+
17
+ ```typescript
18
+ import { createDOMRenderer } from '@lytjs/renderer';
19
+
20
+ const renderer = createDOMRenderer();
21
+ renderer.render(vnode, document.getElementById('app'));
22
+ ```
23
+
24
+ ### Signal 渲染器
25
+
26
+ 用于细粒度响应式更新(Vapor 模式)
27
+
28
+ ```typescript
29
+ import { createSignalRenderer, createVaporRenderer } from '@lytjs/renderer';
30
+
31
+ // Signal 渲染器
32
+ const signalRenderer = await createSignalRenderer();
33
+
34
+ // Vapor 渲染器(Signal 渲染器的别名)
35
+ const vaporRenderer = await createVaporRenderer();
36
+ ```
37
+
38
+ ### SSR 渲染器
39
+
40
+ 用于服务端渲染
41
+
42
+ ```typescript
43
+ import { renderToString, renderToStream } from '@lytjs/renderer';
44
+
45
+ // 渲染为字符串
46
+ const html = await renderToString(vnode);
47
+
48
+ // 流式渲染
49
+ const stream = await renderToStream(vnode, {
50
+ onChunk: (chunk) => res.write(chunk),
51
+ });
52
+ ```
53
+
54
+ ## 核心 API
55
+
56
+ ### createRenderer
57
+
58
+ 创建自定义渲染器实例
59
+
60
+ ```typescript
61
+ import { createRenderer, type RendererOptions } from '@lytjs/renderer';
62
+
63
+ const options: RendererOptions = {
64
+ createElement: (tag) => document.createElement(tag),
65
+ insert: (el, parent, anchor) => parent.insertBefore(el, anchor),
66
+ // ...
67
+ };
68
+
69
+ const renderer = createRenderer(options);
70
+ ```
71
+
72
+ ### createDOMRenderer
73
+
74
+ 创建 DOM 渲染器实例
75
+
76
+ ```typescript
77
+ import { createDOMRenderer } from '@lytjs/renderer';
78
+
79
+ const renderer = createDOMRenderer();
80
+ ```
81
+
82
+ ### patchProp / patchClass / patchStyle / patchEvent / patchAttr
83
+
84
+ DOM 属性更新工具函数
85
+
86
+ ```typescript
87
+ import {
88
+ patchProp,
89
+ patchClass,
90
+ patchStyle,
91
+ patchEvent,
92
+ patchAttr,
93
+ normalizeEventName,
94
+ getEventKey,
95
+ parseEventModifier,
96
+ createInvoker,
97
+ } from '@lytjs/renderer';
98
+
99
+ // 更新属性
100
+ patchProp(el, 'class', prevValue, nextValue);
101
+
102
+ // 更新 class
103
+ patchClass(el, 'active visible');
104
+
105
+ // 更新 style
106
+ patchStyle(el, { color: 'red', fontSize: '14px' });
107
+
108
+ // 更新事件
109
+ patchEvent(el, 'onClick', prevHandler, nextHandler);
110
+ ```
111
+
112
+ ## Hydration
113
+
114
+ ### createHydrationFunctions
115
+
116
+ 创建服务端渲染 Hydration 函数
117
+
118
+ ```typescript
119
+ import { createHydrationFunctions } from '@lytjs/renderer';
120
+
121
+ const { hydrate, hydrateNode } = createHydrationFunctions(options);
122
+ ```
123
+
124
+ ## Island Architecture
125
+
126
+ Island Architecture 用于在 SSR 页面中实现部分区域的客户端交互
127
+
128
+ ### hydrateIsland
129
+
130
+ 水合单个 Island 组件
131
+
132
+ ```typescript
133
+ import { hydrateIsland, registerIslandComponent } from '@lytjs/renderer';
134
+
135
+ // 注册 Island 组件
136
+ await registerIslandComponent('Counter', CounterComponent);
137
+
138
+ // 水合 Island
139
+ const islandEl = document.querySelector('[data-island="Counter"]');
140
+ await hydrateIsland(islandEl, CounterComponent, { initialCount: 0 });
141
+ ```
142
+
143
+ ### registerIslandComponent
144
+
145
+ 注册 Island 组件供后续水合使用
146
+
147
+ ```typescript
148
+ import { registerIslandComponent } from '@lytjs/renderer';
149
+
150
+ await registerIslandComponent('MyComponent', MyComponent);
151
+ ```
152
+
153
+ ### createIslandSSRContent
154
+
155
+ 创建 Island SSR 内容
156
+
157
+ ```typescript
158
+ import { createIslandSSRContent } from '@lytjs/renderer';
159
+
160
+ const html = await createIslandSSRContent(vnode, {
161
+ islandId: 'Counter',
162
+ });
163
+ ```
164
+
165
+ ## 懒加载
166
+
167
+ 渲染器支持懒加载大型模块,减少初始包体积:
168
+
169
+ ```typescript
170
+ // SSR 相关函数使用动态导入
171
+ import { renderToString, renderToStream } from '@lytjs/renderer';
172
+
173
+ // 这些函数会按需加载 SSR 模块
174
+ const html = await renderToString(vnode);
175
+
176
+ // Signal/Vapor 渲染器也是懒加载的
177
+ const signalRenderer = await createSignalRenderer();
178
+ ```
179
+
180
+ ## 渲染器插件系统
181
+
182
+ ### use
183
+
184
+ 安装渲染器插件
185
+
186
+ ```typescript
187
+ import { use, type RendererPlugin } from '@lytjs/renderer';
188
+
189
+ const myPlugin: RendererPlugin = {
190
+ name: 'MyPlugin',
191
+ install(context) {
192
+ context.on('beforeMount', (vnode) => {
193
+ console.log('Before mount:', vnode);
194
+ });
195
+ },
196
+ beforeMount(vnode) {
197
+ console.log('Will mount:', vnode);
198
+ },
199
+ };
200
+
201
+ use(myPlugin);
202
+ ```
203
+
204
+ ### 插件生命周期钩子
205
+
206
+ ```typescript
207
+ interface RendererPlugin {
208
+ name: string;
209
+ install: (context: PluginContext) => void;
210
+ beforeMount?: (vnode: VNode) => void;
211
+ afterMount?: (vnode: VNode, container: unknown) => void;
212
+ beforePatch?: (oldVNode: VNode, newVNode: VNode) => void;
213
+ afterPatch?: (vnode: VNode) => void;
214
+ beforeUnmount?: (vnode: VNode) => void;
215
+ afterUnmount?: (vnode: VNode) => void;
216
+ }
217
+ ```
218
+
219
+ ### 插件管理
220
+
221
+ ```typescript
222
+ import { use, getInstalledPlugins, isPluginInstalled, removePlugin } from '@lytjs/renderer';
223
+
224
+ // 安装插件
225
+ use(myPlugin);
226
+
227
+ // 检查插件是否已安装
228
+ if (isPluginInstalled('MyPlugin')) {
229
+ console.log('Plugin is installed');
230
+ }
231
+
232
+ // 获取所有已安装插件
233
+ const plugins = getInstalledPlugins();
234
+
235
+ // 移除插件
236
+ removePlugin('MyPlugin');
237
+ ```
238
+
239
+ ## Vapor 模式
240
+
241
+ Vapor 模式提供无虚拟 DOM 的细粒度响应式渲染
242
+
243
+ ### createVaporApp
244
+
245
+ 创建 Vapor 应用
246
+
247
+ ```typescript
248
+ import { createVaporApp, defineVaporComponent } from '@lytjs/renderer';
249
+
250
+ const MyComponent = await defineVaporComponent({
251
+ setup() {
252
+ const count = signal(0);
253
+ return () => html`<div>${count()}</div>`;
254
+ },
255
+ });
256
+
257
+ const app = await createVaporApp(MyComponent);
258
+ app.mount('#app');
259
+ ```
260
+
261
+ ### defineVaporComponent
262
+
263
+ 定义 Vapor 组件
264
+
265
+ ```typescript
266
+ import { defineVaporComponent } from '@lytjs/renderer';
267
+
268
+ const Counter = await defineVaporComponent({
269
+ props: {
270
+ initialCount: { type: Number, default: 0 },
271
+ },
272
+ setup(props) {
273
+ // 组件逻辑
274
+ },
275
+ });
276
+ ```
277
+
278
+ ## 组件资源清理
279
+
280
+ ```typescript
281
+ import {
282
+ registerComponentEventListener,
283
+ registerComponentEffectSubscription,
284
+ registerComponentCleanup,
285
+ cleanupComponentResources,
286
+ } from '@lytjs/renderer';
287
+
288
+ // 注册事件监听器(卸载时自动清理)
289
+ registerComponentEventListener(instance, target, 'click', handler);
290
+
291
+ // 注册 effect 订阅(卸载时自动清理)
292
+ registerComponentEffectSubscription(instance, subscription);
293
+
294
+ // 注册自定义清理函数
295
+ registerComponentCleanup(instance, () => {
296
+ // 清理逻辑
297
+ });
298
+
299
+ // 手动清理所有资源
300
+ cleanupComponentResources(instance);
301
+ ```
302
+
303
+ ## 首次渲染优化
304
+
305
+ ```typescript
306
+ import {
307
+ withFirstRenderOptimization,
308
+ shouldSkipTracking,
309
+ getSkippedTrackingCount,
310
+ resetSkippedTrackingCount,
311
+ } from '@lytjs/renderer';
312
+
313
+ // 使用首次渲染优化
314
+ withFirstRenderOptimization(() => {
315
+ // 首次渲染时跳过不必要的追踪
316
+ });
317
+
318
+ // 检查是否跳过追踪
319
+ if (shouldSkipTracking()) {
320
+ console.log('Tracking is skipped');
321
+ }
322
+ ```
323
+
324
+ ## 工具函数
325
+
326
+ ```typescript
327
+ import { escapeHtml, isBooleanAttr, isVoidElement } from '@lytjs/renderer';
328
+
329
+ // HTML 转义
330
+ const safe = escapeHtml('<script>alert("xss")</script>');
331
+
332
+ // 检查布尔属性
333
+ if (isBooleanAttr('disabled')) {
334
+ // 处理布尔属性
335
+ }
336
+
337
+ // 检查自闭合标签
338
+ if (isVoidElement('img')) {
339
+ // 自闭合标签处理
340
+ }
341
+ ```
342
+
343
+ ## 类型定义
344
+
345
+ ```typescript
346
+ import type {
347
+ VNode,
348
+ RendererOptions,
349
+ RendererPlugin,
350
+ PluginContext,
351
+ LifecycleEvent,
352
+ DOMRenderer,
353
+ SignalRenderer,
354
+ VaporRenderer,
355
+ VaporApp,
356
+ VaporComponentOptions,
357
+ HydrationRenderer,
358
+ RendererHost,
359
+ HostRect,
360
+ HostStyleDeclaration,
361
+ HostEvent,
362
+ HostEventHandler,
363
+ } from '@lytjs/renderer';
364
+ ```
365
+
366
+ ## 相关包
367
+
368
+ - [@lytjs/vdom](../vdom) - 虚拟 DOM 实现,渲染器的基础
369
+ - [@lytjs/core](../core) - 框架核心入口,整合所有子包
370
+ - [@lytjs/adapter-web](../adapter-web) - Web 平台适配器
371
+ - [@lytjs/host-contract](../host-contract) - 渲染器宿主抽象
package/dist/dom.cjs CHANGED
@@ -1 +1,12 @@
1
- "use strict";var P=Object.defineProperty;var pe=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames;var ye=Object.prototype.hasOwnProperty;var me=(n,e)=>{for(var t in e)P(n,t,{get:e[t],enumerable:!0})},ve=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ue(e))!ye.call(n,r)&&r!==t&&P(n,r,{get:()=>e[r],enumerable:!(o=pe(e,r))||o.enumerable});return n};var he=n=>ve(P({},"__esModule",{value:!0}),n);var we={};me(we,{Comment:()=>W,DOMRenderer:()=>T,Fragment:()=>D,PatchFlags:()=>R,PatchPropFlags:()=>u.PatchFlags,ShapeFlags:()=>m,Text:()=>M,createInvoker:()=>Y,createRenderer:()=>ee,domRenderer:()=>de,getEventInvokers:()=>se,getEventKey:()=>B,getSVGPropName:()=>ie,isSVGElement:()=>w,normalizeEventName:()=>_,parseEventModifier:()=>G,patchAllProps:()=>C,patchClass:()=>L,patchDOMProp:()=>z,patchDOMProps:()=>re,patchElementProps:()=>fe,patchEvent:()=>g,patchEventOnElement:()=>le,patchProp:()=>y,patchStyle:()=>x,removeAllEventListeners:()=>I,removeDOMProp:()=>N,setDOMProp:()=>h});module.exports=he(we);var Z=require("@lytjs/vdom");var m=(s=>(s[s.ELEMENT=1]="ELEMENT",s[s.FUNCTIONAL_COMPONENT=2]="FUNCTIONAL_COMPONENT",s[s.STATEFUL_COMPONENT=4]="STATEFUL_COMPONENT",s[s.TEXT_CHILDREN=8]="TEXT_CHILDREN",s[s.ARRAY_CHILDREN=16]="ARRAY_CHILDREN",s[s.SLOTS_CHILDREN=32]="SLOTS_CHILDREN",s))(m||{}),R=(l=>(l[l.TEXT=1]="TEXT",l[l.CLASS=2]="CLASS",l[l.STYLE=4]="STYLE",l[l.PROPS=8]="PROPS",l[l.FULL_PROPS=16]="FULL_PROPS",l[l.STABLE_FRAGMENT=32]="STABLE_FRAGMENT",l[l.KEYED_FRAGMENT=64]="KEYED_FRAGMENT",l[l.UNKEYED_FRAGMENT=128]="UNKEYED_FRAGMENT",l[l.NEED_PATCH=256]="NEED_PATCH",l[l.DYNAMIC_SLOTS=512]="DYNAMIC_SLOTS",l[l.HOISTED=-1]="HOISTED",l[l.BAIL=-2]="BAIL",l))(R||{}),D=Symbol("Fragment"),M=Symbol("Text"),W=Symbol("Comment");function v(n){return n.type===D}function V(n){return n.type===M}function b(n){return n.type===W}function q(n,e){return n.type===e.type&&n.key===e.key}function K(n){return Array.isArray(n.dynamicChildren)}function $(n,e,t,o){if(t==="class")n.setClass(e,o);else if(t==="style")n.setStyle(e,o);else if(t.startsWith("on")||t.startsWith("@")){let r=t.startsWith("@")?t.slice(1).toLowerCase():t.slice(2).toLowerCase();n.addEventListener(e,r,o)}else t==="key"||t==="ref"||n.setAttribute(e,t,o)}function j(n,e,t,o,r){if(t==="class")n.setClass(e,o);else if(t==="style")n.setStyle(e,o||{});else if(t.startsWith("on")||t.startsWith("@")){let i=t.startsWith("@")?t.slice(1).toLowerCase():t.slice(2).toLowerCase();r&&n.removeEventListener(e,i,r),o&&n.addEventListener(e,i,o)}else n.setAttribute(e,t,o)}function H(n,e,t,o){for(let r in o){if(r==="key"||r==="ref")continue;let i=t[r],s=o[r];s!==i&&j(n,e,r,s,i)}for(let r in t)if(!(r==="key"||r==="ref")&&!(r in o))if(r==="class")n.setClass(e,"");else if(r==="style")n.setStyle(e,{});else if(r.startsWith("on")||r.startsWith("@")){let i=r.startsWith("@")?r.slice(1).toLowerCase():r.slice(2).toLowerCase();n.removeEventListener(e,i,t[r])}else n.removeAttribute(e,r)}function F(n,e,t,o,r,i){let{shapeFlag:s}=t;if(v(t)){Ee(n,e,t,o,r,i);return}if(V(t)){let a=n.createText(t.children);t.el=a,n.insert(o,a,r);return}if(b(t)){let a=n.createComment(t.children);t.el=a,n.insert(o,a,r);return}if(s&1){Ne(n,e,t,o,r,i);return}if(s&6){ge(e,t,o,r,i);return}}function Ne(n,e,t,o,r,i){let s=t.type,a=n.createElement(s);if(t.el=a,t.props)for(let d in t.props){let p=t.props[d];$(n,a,d,p)}let{shapeFlag:c,children:f}=t;c&8?a.textContent=f:c&16&&A(e,f,a,null,i),n.insert(o,a,r)}function A(n,e,t,o,r){for(let i=0;i<e.length;i++)n(null,e[i],t,o,r)}function Ee(n,e,t,o,r,i){let{children:s}=t,a=n.createComment("");n.insert(o,a,r),Array.isArray(s)&&s.length>0&&A(e,s,o,a,i),t.el=a,t.anchor=a}function ge(n,e,t,o,r){let i=e.component;i&&i.update&&i.update(),i&&i.subTree&&(n(null,i.subTree,t,o,i),e.el=i.subTree.el)}function J(n,e,t,o){let{shapeFlag:r,children:i}=t;if(v(t)){if(Array.isArray(i))for(let s=0;s<i.length;s++)e(i[s],o);t.anchor&&t.anchor.parentNode&&n.remove(t.anchor);return}if(r&6){t.component&&t.component.subTree&&e(t.component.subTree,o);return}t.el&&n.remove(t.el)}function O(n,e){for(let t=0;t<e.length;t++)n(e[t])}var k=require("@lytjs/vdom");function S(n,e,t,o,r,i=null,s=null){if(o==null){t&&e(t,r);return}if(t===null){F(n,U(n,e),o,r,i,s);return}if(K(o)&&K(t)){Te(n,e,t,o,r,s);return}if(!q(t,o)){e(t,r),F(n,U(n,e),o,r,i,s);return}o.el=t.el,o.anchor=t.anchor;let{shapeFlag:a}=o;if(v(o)){xe(n,e,t,o,r,i,s);return}if(V(o)){o.children!==t.children&&(o.el.nodeValue=o.children);return}if(b(o)){o.children!==t.children&&(o.el.nodeValue=o.children);return}if(a&1){Ce(n,e,t,o,s);return}if(a&6){Re(t,o,s);return}}function U(n,e){return(t,o,r,i,s)=>{S(n,e,t,o,r,i,s)}}function Ce(n,e,t,o,r=null){let i=o.el=t.el,s=t.props||{},a=o.props||{},{patchFlag:c,dynamicProps:f}=o;if(c&&c>0){if(c&1&&t.children!==o.children&&(i.textContent=o.children),c&2&&s.class!==a.class&&n.setClass(i,a.class),c&4&&s.style!==a.style&&n.setStyle(i,a.style||{}),c&8&&f)for(let d=0;d<f.length;d++){let p=f[d],l=s[p],X=a[p];X!==l&&j(n,i,p,X,l)}c&16&&H(n,i,s,a)}else H(n,i,s,a);(!c||!(c&1))&&Q(n,e,t,o,i,null,r)}function Q(n,e,t,o,r,i,s){let a=t.shapeFlag,c=o.shapeFlag,f=t.children,d=o.children;if(c&8){a&16&&O(e,f),f!==d&&(r.textContent=d);return}if(c&16){a&16?Le(n,e,f,d,r,i,s):(a&8&&(r.textContent=""),A(U(n,e),d,r,i,s));return}d==null&&(a&8?r.textContent="":a&16&&O(e,f))}function Le(n,e,t,o,r,i,s){o.every(c=>c.key!==null&&c.key!==void 0)&&t.every(c=>c.key!==null&&c.key!==void 0)?(0,k.patchKeyedChildren)(t,o,r,i,s,null,!1):(0,k.patchUnkeyedChildren)(t,o,r,i,s,null,!1)}function xe(n,e,t,o,r,i,s){let a=t.children,c=o.children;Array.isArray(c)&&c.length>0?(Q(n,e,t,o,r,i,s),o.el=c[0].el,o.anchor=c[c.length-1].el?n.nextSibling(c[c.length-1].el):i):Array.isArray(a)&&a.length>0&&c===null?(O(e,a),o.el=t.el,o.anchor=t.anchor):(o.el=t.el,o.anchor=t.anchor)}function Te(n,e,t,o,r,i){let s=t.dynamicChildren,a=o.dynamicChildren;for(let c=0;c<a.length;c++)S(n,e,s[c],a[c],r,null,i)}function Re(n,e,t){e.component=n.component,e.el=n.el,e.component&&e.component.update&&e.component.update()}function ee(n){function e(r,i){J(n,e,r,i)}(0,Z.registerDOMOperations)({insert(r,i,s){n.insert(i,r,s)},createElement(r){return n.createElement(r)},createText(r){return n.createText(r)},setText(r,i){r.nodeValue=i},setElementText(r,i){r.textContent=i},remove(r){n.remove(r)},createComment(r){return n.createComment(r)},mount(r,i,s,a,c,f,d){o(null,r,i,s,a)},patch(r,i,s,a,c,f,d,p){o(r,i,s,a,c)},unmount(r,i,s,a){e(r)},move(r,i,s){n.insert(i,r.el,s)}});function o(r,i,s,a,c){S(n,e,r,i,s,a,c)}return{mount(r,i){i.nodeType===1&&(i.textContent=""),o(null,r,i,null,null)},patch(r,i,s){var a;o(r,i,s||((a=r.el)==null?void 0:a.parentNode),null,null)},unmount(r,i){e(r,i)}}}var ne={acceptCharset:"acceptCharset",accessKey:"accessKey",className:"className",htmlFor:"htmlFor",httpEquiv:"httpEquiv",tabIndex:"tabIndex"},oe={allowfullscreen:!0,async:!0,autofocus:!0,autoplay:!0,checked:!0,controls:!0,default:!0,defer:!0,disabled:!0,formnovalidate:!0,hidden:!0,inert:!0,ismap:!0,itemscope:!0,loop:!0,multiple:!0,muted:!0,nomodule:!0,novalidate:!0,open:!0,playsinline:!0,readonly:!0,required:!0,reversed:!0,selected:!0},Ve={"accent-height":"accentHeight","alignment-baseline":"alignmentBaseline","baseline-shift":"baselineShift","clip-path":"clipPath","clip-rule":"clipRule","color-interpolation":"colorInterpolation","color-interpolation-filters":"colorInterpolationFilters","dominant-baseline":"dominantBaseline","enable-background":"enableBackground","fill-opacity":"fillOpacity","fill-rule":"fillRule","flood-color":"floodColor","flood-opacity":"floodOpacity","glyph-orientation-horizontal":"glyphOrientationHorizontal","glyph-orientation-vertical":"glyphOrientationVertical","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-variant":"fontVariant","font-weight":"fontWeight","image-rendering":"imageRendering","letter-spacing":"letterSpacing","lighting-color":"lightingColor","marker-end":"markerEnd","marker-mid":"markerMid","marker-start":"markerStart","paint-order":"paintOrder","pointer-events":"pointerEvents","shape-rendering":"shapeRendering","stop-color":"stopColor","stop-opacity":"stopOpacity","stroke-dasharray":"strokeDasharray","stroke-dashoffset":"strokeDashoffset","stroke-linecap":"strokeLinecap","stroke-linejoin":"strokeLinejoin","stroke-miterlimit":"strokeMiterlimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-anchor":"textAnchor","text-decoration":"textDecoration","text-rendering":"textRendering","transform-origin":"transformOrigin","word-spacing":"wordSpacing","writing-mode":"writingMode","xlink:href":"xlinkHref","xlink:title":"xlinkTitle","xml:lang":"xmlLang","xml:space":"xmlSpace"};function h(n,e,t){if(e==="class"){n.className=t==null?"":String(t);return}if(e==="style"){if(typeof t=="string")n.style.cssText=t;else if(t!=null&&typeof t=="object")for(let r in t)n.style[r]=t[r];else n.style.cssText="";return}if(e.startsWith("on")||e.startsWith("@")){let r=e.startsWith("@")?e.slice(1).toLowerCase():e.slice(2).toLowerCase();typeof t=="function"&&n.addEventListener(r,t);return}if(e in oe){t?(n.setAttribute(e,""),e in n&&(n[e]=!0)):(n.removeAttribute(e),e in n&&(n[e]=!1));return}let o=ne[e]||e;if(o in n){try{n[o]=t==null?"":t}catch(r){n.setAttribute(e,t==null?"":String(t))}return}t==null||t===!1?n.removeAttribute(e):n.setAttribute(e,String(t))}function N(n,e){if(e==="class"){n.className="";return}if(e==="style"){n.style.cssText="";return}if(e.startsWith("on")||e.startsWith("@")){let o=e.startsWith("@")?e.slice(1).toLowerCase():e.slice(2).toLowerCase(),r=n._vei;if(r){let i="on"+o.charAt(0).toUpperCase()+o.slice(1),s=r[i];s&&(n.removeEventListener(o,s),r[i]=void 0)}return}if(e in oe){n.removeAttribute(e),e in n&&(n[e]=!1);return}let t=ne[e]||e;if(t in n){try{n[t]=""}catch(o){n.removeAttribute(e)}return}n.removeAttribute(e)}function te(n){return n.startsWith("on")||n.startsWith("@")}function re(n,e,t){let o=e?Object.keys(e):[],r=t?Object.keys(t):[];for(let i=0;i<r.length;i++){let s=r[i],a=t[s],c=e?e[s]:void 0;s==="key"||s==="ref"||a!==c&&(s==="class"?n.className=a==null?"":String(a):s==="style"?be(n,a,c):te(s)||h(n,s,a))}for(let i=0;i<o.length;i++){let s=o[i];s==="key"||s==="ref"||(!t||!(s in t))&&(s==="class"?n.className="":s==="style"?n.style.cssText="":te(s)||N(n,s))}}function be(n,e,t){if(!e||typeof e=="string"&&!e.trim()){n.style.cssText="";return}if(typeof e=="string"){n.style.cssText=e;return}if(typeof t=="object"&&t!==null)for(let o in t)o in e||(n.style[o]="");for(let o in e)n.style[o]=e[o]}function w(n){return n==="svg"||n==="path"||n==="circle"||n==="rect"||n==="line"||n==="polyline"||n==="polygon"||n==="ellipse"||n==="g"||n==="defs"||n==="use"||n==="text"||n==="tspan"||n==="clipPath"||n==="mask"||n==="filter"||n==="linearGradient"||n==="radialGradient"||n==="stop"||n==="pattern"||n==="symbol"||n==="image"||n==="foreignObject"||n==="animate"||n==="animateTransform"||n==="animateMotion"}function ie(n){return Ve[n]||n}var Ae=/^(?:@|on)/;function _(n){return n.replace(Ae,"").toLowerCase()}function B(n){let e=_(n);return"on"+e.charAt(0).toUpperCase()+e.slice(1)}var Oe={stop:"stop",prevent:"prevent",capture:"capture",once:"once",self:"self",passive:"passive"};function G(n){let e=n.split("."),o={name:e[0],stop:!1,prevent:!1,capture:!1,once:!1,self:!1,passive:!1};for(let r=1;r<e.length;r++){let i=e[r],s=Oe[i];s&&(o[s]=!0)}return o}function Y(n){let e=(t=>{e.value&&e.value(t)});return e.value=n,e}var E="_vei";function se(n){return n[E]||null}function g(n,e,t,o,r){let i=B(e),s=G(_(e)),a=s.name,c=n[E];c||(c=n[E]={});let f=c[i];if(t&&f)f.value=t;else if(t&&!f){let d=Y(t);c[i]=d;let p={};s.capture&&(p.capture=!0),s.once&&(p.once=!0),s.passive&&(p.passive=!0),n.addEventListener(a,d,p)}else!t&&f&&(n.removeEventListener(a,f),c[i]=void 0)}function I(n){let e=n[E];if(e){for(let t in e){let o=e[t];if(o){let r=t.charAt(2).toLowerCase()+t.slice(3);n.removeEventListener(r,o)}}n[E]={}}}var u=require("@lytjs/vdom");function L(n,e,t){let o=ce(e);o!==t&&(n.className=o)}function ce(n){if(n==null)return"";if(typeof n=="string")return n;if(typeof n=="object"){if(Array.isArray(n)){let t="";for(let o=0;o<n.length;o++){let r=ce(n[o]);r&&(t+=(t?" ":"")+r)}return t}let e="";for(let t in n)n[t]&&(e+=(e?" ":"")+t);return e}return String(n)}function x(n,e,t){if(!e){n.style.cssText="";return}if(!t){typeof e=="string"?n.style.cssText=e:typeof e=="object"&&ae(n,e);return}if(typeof e!=typeof t){n.style.cssText="",typeof e=="string"?n.style.cssText=e:typeof e=="object"&&ae(n,e);return}if(typeof e=="string"){e!==t&&(n.style.cssText=e);return}if(typeof e=="object"&&typeof t=="object"){for(let o in t)o in e||(n.style[o]="");for(let o in e){let r=e[o],i=t[o];r!==i&&(n.style[o]=r==null?"":r)}}}function ae(n,e){for(let t in e)n.style[t]=e[t]===null||e[t]===void 0?"":e[t]}function le(n,e,t,o){g(n,"",e,t,o)}var ke=new Set(["class","style","key","ref"]);function Se(n){return n.length>2&&(n[0]==="o"||n[0]==="O"||n[0]==="@")&&(n[1]==="n"||n[1]==="N")}function z(n,e,t,o,r){if(!ke.has(e)){if(Se(e)){g(n,e,t,o,r);return}if(t===!1||t===null||t===void 0){n.removeAttribute(e);return}if(e in n)try{n[e]=t}catch(i){n.setAttribute(e,String(t))}else n.setAttribute(e,String(t))}}function y(n,e,t,o,r){z(n,e,t,o,r)}function C(n,e,t,o){if(t)for(let r in t){if(r==="key"||r==="ref")continue;let i=t[r],s=e?e[r]:void 0;i!==s&&y(n,r,i,s,o)}if(e)for(let r in e)r==="key"||r==="ref"||(!t||!(r in t))&&y(n,r,null,e[r],o)}function fe(n,e,t,o){let r=e.props||{},i=t.props||{},{patchFlag:s,dynamicProps:a}=t;if(!s||s===u.PatchFlags.HOISTED){C(n,r,i,o);return}if(s===u.PatchFlags.BAIL){C(n,r,i,o);return}if(s&u.PatchFlags.TEXT&&e.children!==t.children&&(n.textContent=t.children),s&u.PatchFlags.CLASS&&r.class!==i.class&&L(n,i.class,r.class),s&u.PatchFlags.STYLE&&r.style!==i.style&&x(n,i.style,r.style),s&u.PatchFlags.PROPS&&a)for(let c=0;c<a.length;c++){let f=a[c],d=r[f],p=i[f];p!==d&&y(n,f,p,d,o)}s&u.PatchFlags.FULL_PROPS&&C(n,r,i,o)}var T=class{createElement(e){return w(e)?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}createText(e){return document.createTextNode(e)}createComment(e){return document.createComment(e)}setAttribute(e,t,o){h(e,t,o)}removeAttribute(e,t){N(e,t)}setStyle(e,t){if(typeof t=="string")e.style.cssText=t;else if(t&&typeof t=="object")for(let o in t)e.style[o]=t[o]}setClass(e,t){if(typeof t=="string")e.className=t;else if(t&&typeof t=="object"){let o="";for(let r in t)t[r]&&(o+=(o?" ":"")+r);e.className=o}else e.className=""}insert(e,t,o){o!=null?e.insertBefore(t,o):e.appendChild(t)}remove(e){e.parentNode&&e.parentNode.removeChild(e)}replace(e,t,o){e.replaceChild(o,t)}addEventListener(e,t,o,r){e.addEventListener(t,o,r)}removeEventListener(e,t,o){e.removeEventListener(t,o)}nextTick(e){Promise.resolve().then(e)}parentNode(e){return e.parentNode}nextSibling(e){return e.nextSibling}querySelector(e){return document.querySelector(e)}setClassWithOld(e,t,o){L(e,t,o)}setStyleWithOld(e,t,o){x(e,t,o)}setAttributeWithOld(e,t,o,r){y(e,t,o,r)}setElementText(e,t){e.textContent=t}setText(e,t){e.nodeValue=t}insertBefore(e,t,o){o!=null?e.insertBefore(t,o):e.appendChild(t)}removeChild(e,t){e.removeChild(t)}setAnchor(e,t){e.anchor=t}getNextSibling(e){return e.nextSibling}cleanupEvents(e){I(e)}},de=new T;
1
+ 'use strict';
2
+
3
+ var adapterWeb = require('@lytjs/adapter-web');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "createDOMRenderer", {
8
+ enumerable: true,
9
+ get: function () { return adapterWeb.createDOMRenderer; }
10
+ });
11
+ //# sourceMappingURL=dom.cjs.map
12
+ //# sourceMappingURL=dom.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"dom.cjs","sourcesContent":[]}
package/dist/dom.d.cts ADDED
@@ -0,0 +1 @@
1
+ export { DOMRenderer, createDOMRenderer } from '@lytjs/adapter-web';
package/dist/dom.d.ts ADDED
@@ -0,0 +1 @@
1
+ export { DOMRenderer, createDOMRenderer } from '@lytjs/adapter-web';