@coherent.js/core 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +130 -0
- package/dist/coherent.d.ts +472 -0
- package/dist/coherent.d.ts.map +1 -0
- package/dist/coherent.js +590 -0
- package/dist/coherent.js.map +1 -0
- package/dist/components/component-system.d.ts +1138 -0
- package/dist/components/component-system.d.ts.map +1 -0
- package/dist/components/component-system.js +2220 -0
- package/dist/components/component-system.js.map +1 -0
- package/dist/components/lifecycle.d.ts +212 -0
- package/dist/components/lifecycle.d.ts.map +1 -0
- package/dist/components/lifecycle.js +525 -0
- package/dist/components/lifecycle.js.map +1 -0
- package/dist/core/html-utils.d.ts +14 -0
- package/dist/core/html-utils.d.ts.map +1 -0
- package/dist/core/html-utils.js +166 -0
- package/dist/core/html-utils.js.map +1 -0
- package/dist/core/object-factory.d.ts +38 -0
- package/dist/core/object-factory.d.ts.map +1 -0
- package/dist/core/object-factory.js +63 -0
- package/dist/core/object-factory.js.map +1 -0
- package/dist/core/object-utils.d.ts +77 -0
- package/dist/core/object-utils.d.ts.map +1 -0
- package/dist/core/object-utils.js +502 -0
- package/dist/core/object-utils.js.map +1 -0
- package/dist/dev/dev-tools.d.ts +194 -0
- package/dist/dev/dev-tools.d.ts.map +1 -0
- package/dist/dev/dev-tools.js +846 -0
- package/dist/dev/dev-tools.js.map +1 -0
- package/dist/forms/validation.d.ts +271 -0
- package/dist/forms/validation.d.ts.map +1 -0
- package/dist/forms/validation.js +573 -0
- package/dist/forms/validation.js.map +1 -0
- package/dist/index.cjs +5281 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.js +5204 -0
- package/dist/index.js.map +7 -0
- package/dist/performance/bundle-optimizer.d.ts +95 -0
- package/dist/performance/bundle-optimizer.d.ts.map +1 -0
- package/dist/performance/bundle-optimizer.js +192 -0
- package/dist/performance/bundle-optimizer.js.map +1 -0
- package/dist/performance/cache-manager.d.ts +107 -0
- package/dist/performance/cache-manager.d.ts.map +1 -0
- package/dist/performance/cache-manager.js +314 -0
- package/dist/performance/cache-manager.js.map +1 -0
- package/dist/performance/component-cache.d.ts +120 -0
- package/dist/performance/component-cache.d.ts.map +1 -0
- package/dist/performance/component-cache.js +364 -0
- package/dist/performance/component-cache.js.map +1 -0
- package/dist/performance/monitor.d.ts +189 -0
- package/dist/performance/monitor.d.ts.map +1 -0
- package/dist/performance/monitor.js +347 -0
- package/dist/performance/monitor.js.map +1 -0
- package/dist/rendering/base-renderer.d.ts +140 -0
- package/dist/rendering/base-renderer.d.ts.map +1 -0
- package/dist/rendering/base-renderer.js +409 -0
- package/dist/rendering/base-renderer.js.map +1 -0
- package/dist/rendering/css-manager.d.ts +73 -0
- package/dist/rendering/css-manager.d.ts.map +1 -0
- package/dist/rendering/css-manager.js +176 -0
- package/dist/rendering/css-manager.js.map +1 -0
- package/dist/rendering/dom-renderer.d.ts +62 -0
- package/dist/rendering/dom-renderer.d.ts.map +1 -0
- package/dist/rendering/dom-renderer.js +252 -0
- package/dist/rendering/dom-renderer.js.map +1 -0
- package/dist/rendering/html-renderer.d.ts +67 -0
- package/dist/rendering/html-renderer.d.ts.map +1 -0
- package/dist/rendering/html-renderer.js +444 -0
- package/dist/rendering/html-renderer.js.map +1 -0
- package/dist/rendering/renderer-config.d.ts +282 -0
- package/dist/rendering/renderer-config.d.ts.map +1 -0
- package/dist/rendering/renderer-config.js +144 -0
- package/dist/rendering/renderer-config.js.map +1 -0
- package/dist/rendering/streaming-renderer.d.ts +117 -0
- package/dist/rendering/streaming-renderer.d.ts.map +1 -0
- package/dist/rendering/streaming-renderer.js +326 -0
- package/dist/rendering/streaming-renderer.js.map +1 -0
- package/dist/rendering/vdom-diff.d.ts +47 -0
- package/dist/rendering/vdom-diff.d.ts.map +1 -0
- package/dist/rendering/vdom-diff.js +416 -0
- package/dist/rendering/vdom-diff.js.map +1 -0
- package/dist/routing/router.d.ts +241 -0
- package/dist/routing/router.d.ts.map +1 -0
- package/dist/routing/router.js +648 -0
- package/dist/routing/router.js.map +1 -0
- package/dist/state/reactive-state.d.ts +166 -0
- package/dist/state/reactive-state.d.ts.map +1 -0
- package/dist/state/reactive-state.js +546 -0
- package/dist/state/reactive-state.js.map +1 -0
- package/dist/state/state-manager.d.ts +45 -0
- package/dist/state/state-manager.d.ts.map +1 -0
- package/dist/state/state-manager.js +151 -0
- package/dist/state/state-manager.js.map +1 -0
- package/dist/types/constants.d.ts +8 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/constants.js +36 -0
- package/dist/types/constants.js.map +1 -0
- package/dist/utils/dependency-utils.d.ts +43 -0
- package/dist/utils/dependency-utils.d.ts.map +1 -0
- package/dist/utils/dependency-utils.js +105 -0
- package/dist/utils/dependency-utils.js.map +1 -0
- package/dist/utils/error-handler.d.ts +148 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +468 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/normalization.d.ts +3 -0
- package/dist/utils/normalization.d.ts.map +1 -0
- package/dist/utils/normalization.js +24 -0
- package/dist/utils/normalization.js.map +1 -0
- package/dist/utils/validation.d.ts +10 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +32 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +44 -0
- package/types/index.d.ts +734 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming HTML Renderer
|
|
3
|
+
* Provides memory-efficient streaming capabilities for large component trees
|
|
4
|
+
* Ideal for server-side rendering of large pages or data-heavy components
|
|
5
|
+
*/
|
|
6
|
+
import { validateComponent, isCoherentObject, hasChildren, normalizeChildren } from '../core/object-utils.js';
|
|
7
|
+
import { escapeHtml, isVoidElement, } from '../core/html-utils.js';
|
|
8
|
+
import { performanceMonitor } from '../performance/monitor.js';
|
|
9
|
+
// Import BaseRenderer for inheritance
|
|
10
|
+
import { BaseRenderer } from './base-renderer.js';
|
|
11
|
+
/**
|
|
12
|
+
* Streaming renderer class - extends BaseRenderer for shared functionality
|
|
13
|
+
*/
|
|
14
|
+
export class StreamingRenderer extends BaseRenderer {
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
// Call parent constructor with streaming-specific defaults
|
|
17
|
+
super({
|
|
18
|
+
maxDepth: 1000,
|
|
19
|
+
enableMetrics: false,
|
|
20
|
+
...options
|
|
21
|
+
});
|
|
22
|
+
// Streaming-specific properties
|
|
23
|
+
this.buffer = '';
|
|
24
|
+
this.elementCount = 0;
|
|
25
|
+
// Override metrics with streaming-specific fields
|
|
26
|
+
this.metrics = {
|
|
27
|
+
...this.metrics,
|
|
28
|
+
chunksGenerated: 0,
|
|
29
|
+
totalBytes: 0
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Main streaming render method
|
|
34
|
+
*/
|
|
35
|
+
async *render(component, options = {}) {
|
|
36
|
+
const _config = { ...this.config, ...options };
|
|
37
|
+
this.metrics.startTime = performance.now();
|
|
38
|
+
try {
|
|
39
|
+
// Validate input if requested
|
|
40
|
+
if (config.validateInput !== false) {
|
|
41
|
+
validateComponent(component);
|
|
42
|
+
}
|
|
43
|
+
// Start streaming the component
|
|
44
|
+
yield* this.streamComponent(component, config, 0);
|
|
45
|
+
// Flush any remaining buffer
|
|
46
|
+
if (this.buffer.length > 0) {
|
|
47
|
+
yield this.createChunk(this.buffer, { final: true });
|
|
48
|
+
this.buffer = '';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
// Stream error information
|
|
53
|
+
yield this.createErrorChunk(error);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
this.metrics.endTime = performance.now();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Stream a single component
|
|
61
|
+
*/
|
|
62
|
+
async *streamComponent(component, config, depth) {
|
|
63
|
+
if (depth > config.maxDepth) {
|
|
64
|
+
throw new Error(`Maximum nesting depth exceeded: ${config.maxDepth}`);
|
|
65
|
+
}
|
|
66
|
+
// Handle different component types
|
|
67
|
+
if (typeof component === 'string') {
|
|
68
|
+
yield* this.streamText(escapeHtml(component));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (typeof component === 'function') {
|
|
72
|
+
const evaluated = component();
|
|
73
|
+
yield* this.streamComponent(evaluated, config, depth);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (Array.isArray(component)) {
|
|
77
|
+
for (const child of component) {
|
|
78
|
+
yield* this.streamComponent(child, config, depth);
|
|
79
|
+
// Yield control periodically for large arrays
|
|
80
|
+
if (this.elementCount++ % config.yieldThreshold === 0) {
|
|
81
|
+
await this.yieldControl();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (!isCoherentObject(component)) {
|
|
87
|
+
return; // Skip invalid objects
|
|
88
|
+
}
|
|
89
|
+
// Process object-based component
|
|
90
|
+
for (const [tagName, props] of Object.entries(component)) {
|
|
91
|
+
yield* this.streamElement(tagName, props, config, depth + 1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Stream a single HTML element
|
|
96
|
+
*/
|
|
97
|
+
async *streamElement(tagName, props, config, depth) {
|
|
98
|
+
const isVoid = isVoidElement(tagName);
|
|
99
|
+
// Opening tag
|
|
100
|
+
let openTag = `<${tagName}`;
|
|
101
|
+
// Add attributes
|
|
102
|
+
const attributes = this.utils.extractAttributes(_props);
|
|
103
|
+
if (attributes) {
|
|
104
|
+
openTag += ` ${attributes}`;
|
|
105
|
+
}
|
|
106
|
+
openTag += isVoid ? '/>' : '>';
|
|
107
|
+
yield* this.streamText(openTag);
|
|
108
|
+
// Content for non-void elements
|
|
109
|
+
if (!isVoid) {
|
|
110
|
+
// Handle text content
|
|
111
|
+
if (props.text !== undefined) {
|
|
112
|
+
const text = typeof props.text === 'function' ? props.text() : props.text;
|
|
113
|
+
yield* this.streamText(escapeHtml(String(text)));
|
|
114
|
+
}
|
|
115
|
+
// Handle children
|
|
116
|
+
if (hasChildren(_props)) {
|
|
117
|
+
const children = normalizeChildren(props.children);
|
|
118
|
+
for (const child of children) {
|
|
119
|
+
yield* this.streamComponent(child, config, depth);
|
|
120
|
+
// Periodic yielding
|
|
121
|
+
if (this.elementCount++ % config.yieldThreshold === 0) {
|
|
122
|
+
await this.yieldControl();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Closing tag
|
|
127
|
+
yield* this.streamText(`</${tagName}>`);
|
|
128
|
+
}
|
|
129
|
+
this.metrics.elementsProcessed++;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Stream text content with buffering
|
|
133
|
+
*/
|
|
134
|
+
async *streamText(text) {
|
|
135
|
+
this.buffer += text;
|
|
136
|
+
// Flush buffer when it reaches chunk size
|
|
137
|
+
if (this.buffer.length >= this.config.chunkSize) {
|
|
138
|
+
const chunk = this.buffer.substring(0, this.config.chunkSize);
|
|
139
|
+
this.buffer = this.buffer.substring(this.config.chunkSize);
|
|
140
|
+
yield this.createChunk(chunk);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Create a chunk object with metadata
|
|
145
|
+
*/
|
|
146
|
+
createChunk(content, metadata = {}) {
|
|
147
|
+
const chunk = {
|
|
148
|
+
chunk: content,
|
|
149
|
+
size: Buffer.byteLength(content, this.config.encoding),
|
|
150
|
+
index: this.metrics.totalChunks++,
|
|
151
|
+
timestamp: performance.now(),
|
|
152
|
+
...metadata
|
|
153
|
+
};
|
|
154
|
+
this.metrics.totalBytes += chunk.size;
|
|
155
|
+
if (this.config.enableMetrics) {
|
|
156
|
+
chunk.metrics = { ...this.metrics };
|
|
157
|
+
}
|
|
158
|
+
return chunk;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Create an error chunk
|
|
162
|
+
*/
|
|
163
|
+
createErrorChunk(error) {
|
|
164
|
+
return this.createChunk(`<!-- Streaming Error: ${error.message} -->`, {
|
|
165
|
+
error: true,
|
|
166
|
+
errorMessage: error.message,
|
|
167
|
+
errorStack: error.stack
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Yield control to the event loop
|
|
172
|
+
*/
|
|
173
|
+
async yieldControl() {
|
|
174
|
+
return new Promise(resolve => setImmediate(resolve));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get streaming metrics
|
|
178
|
+
*/
|
|
179
|
+
getMetrics() {
|
|
180
|
+
const duration = this.metrics.endTime ?
|
|
181
|
+
this.metrics.endTime - this.metrics.startTime :
|
|
182
|
+
performance.now() - this.metrics.startTime;
|
|
183
|
+
return {
|
|
184
|
+
...this.metrics,
|
|
185
|
+
duration,
|
|
186
|
+
throughput: this.metrics.totalBytes / (duration / 1000), // bytes per second
|
|
187
|
+
elementsPerSecond: this.metrics.elementsProcessed / (duration / 1000)
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Reset metrics for new render
|
|
192
|
+
*/
|
|
193
|
+
reset() {
|
|
194
|
+
this.metrics = {
|
|
195
|
+
totalChunks: 0,
|
|
196
|
+
totalBytes: 0,
|
|
197
|
+
elementsProcessed: 0,
|
|
198
|
+
startTime: null,
|
|
199
|
+
endTime: null
|
|
200
|
+
};
|
|
201
|
+
this.buffer = '';
|
|
202
|
+
this.elementCount = 0;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Convenience function to create streaming renderer
|
|
207
|
+
*/
|
|
208
|
+
export function createStreamingRenderer(options = {}) {
|
|
209
|
+
return new StreamingRenderer(options);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Simple streaming render function
|
|
213
|
+
*/
|
|
214
|
+
export async function* renderToStream(component, options = {}) {
|
|
215
|
+
const renderer = new StreamingRenderer(options);
|
|
216
|
+
yield* renderer.render(component, options);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Streaming utilities
|
|
220
|
+
*/
|
|
221
|
+
export const streamingUtils = {
|
|
222
|
+
/**
|
|
223
|
+
* Collect all chunks into a single string
|
|
224
|
+
*/
|
|
225
|
+
async collectChunks(chunkGenerator) {
|
|
226
|
+
let html = '';
|
|
227
|
+
for await (const chunk of chunkGenerator) {
|
|
228
|
+
html += chunk.chunk;
|
|
229
|
+
}
|
|
230
|
+
return html;
|
|
231
|
+
},
|
|
232
|
+
/**
|
|
233
|
+
* Write chunks directly to a Node.js response
|
|
234
|
+
*/
|
|
235
|
+
async streamToResponse(chunkGenerator, response) {
|
|
236
|
+
let totalBytes = 0;
|
|
237
|
+
for await (const chunk of chunkGenerator) {
|
|
238
|
+
response.write(chunk.chunk);
|
|
239
|
+
totalBytes += chunk.size;
|
|
240
|
+
}
|
|
241
|
+
response.end();
|
|
242
|
+
return totalBytes;
|
|
243
|
+
},
|
|
244
|
+
/**
|
|
245
|
+
* Stream with backpressure handling
|
|
246
|
+
*/
|
|
247
|
+
async streamWithBackpressure(chunkGenerator, writeFunction, highWaterMark = 16384) {
|
|
248
|
+
let bufferedBytes = 0;
|
|
249
|
+
for await (const chunk of chunkGenerator) {
|
|
250
|
+
bufferedBytes += chunk.size;
|
|
251
|
+
const success = writeFunction(chunk.chunk);
|
|
252
|
+
if (!success && bufferedBytes > highWaterMark) {
|
|
253
|
+
// Wait for drain event or timeout
|
|
254
|
+
await new Promise((resolve) => {
|
|
255
|
+
const timeout = setTimeout(resolve, 100);
|
|
256
|
+
writeFunction.once?.('drain', () => {
|
|
257
|
+
clearTimeout(timeout);
|
|
258
|
+
resolve();
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
bufferedBytes = 0;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
/**
|
|
266
|
+
* Transform chunks (e.g., compression, encoding)
|
|
267
|
+
*/
|
|
268
|
+
async *transformChunks(chunkGenerator, transformer) {
|
|
269
|
+
for await (const chunk of chunkGenerator) {
|
|
270
|
+
const transformed = await transformer(chunk);
|
|
271
|
+
if (transformed) {
|
|
272
|
+
yield transformed;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
/**
|
|
277
|
+
* Merge small chunks for efficiency
|
|
278
|
+
*/
|
|
279
|
+
async *mergeSmallChunks(chunkGenerator, minSize = 1024) {
|
|
280
|
+
let buffer = '';
|
|
281
|
+
for await (const chunk of chunkGenerator) {
|
|
282
|
+
buffer += chunk.chunk;
|
|
283
|
+
if (buffer.length >= minSize || chunk.final) {
|
|
284
|
+
yield {
|
|
285
|
+
chunk: buffer,
|
|
286
|
+
size: Buffer.byteLength(buffer),
|
|
287
|
+
merged: true
|
|
288
|
+
};
|
|
289
|
+
buffer = '';
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (buffer.length > 0) {
|
|
293
|
+
yield {
|
|
294
|
+
chunk: buffer,
|
|
295
|
+
size: Buffer.byteLength(buffer),
|
|
296
|
+
merged: true,
|
|
297
|
+
final: true
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
/**
|
|
303
|
+
* Performance monitoring integration
|
|
304
|
+
*/
|
|
305
|
+
if (performanceMonitor) {
|
|
306
|
+
const originalRender = StreamingRenderer.prototype.render;
|
|
307
|
+
StreamingRenderer.prototype.render = async function* (...args) {
|
|
308
|
+
const startTime = performance.now();
|
|
309
|
+
let chunkCount = 0;
|
|
310
|
+
try {
|
|
311
|
+
for await (const chunk of originalRender.apply(this, args)) {
|
|
312
|
+
chunkCount++;
|
|
313
|
+
yield chunk;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
finally {
|
|
317
|
+
const duration = performance.now() - startTime;
|
|
318
|
+
performanceMonitor.recordRender('streaming', duration, {
|
|
319
|
+
chunks: chunkCount,
|
|
320
|
+
bytes: this.metrics.totalBytes
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
export default StreamingRenderer;
|
|
326
|
+
//# sourceMappingURL=streaming-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-renderer.js","sourceRoot":"","sources":["../../../../src/rendering/streaming-renderer.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Virtual DOM node structure
|
|
3
|
+
*/
|
|
4
|
+
export function createVNode(type: any, props?: {}, children?: any[]): {
|
|
5
|
+
type: any;
|
|
6
|
+
props: {};
|
|
7
|
+
children: any[];
|
|
8
|
+
key: any;
|
|
9
|
+
_coherent: boolean;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Convert Coherent object to virtual DOM node
|
|
13
|
+
*/
|
|
14
|
+
export function objectToVNode(component: any, depth?: number): any;
|
|
15
|
+
/**
|
|
16
|
+
* Compare two virtual DOM nodes and generate patch operations
|
|
17
|
+
*/
|
|
18
|
+
export function diff(oldVNode: any, newVNode: any, patches?: any[], path?: any[]): any[];
|
|
19
|
+
/**
|
|
20
|
+
* Apply patches to a DOM element
|
|
21
|
+
*/
|
|
22
|
+
export function patch(element: any, patches: any): any;
|
|
23
|
+
export namespace VDOM_OPERATIONS {
|
|
24
|
+
let CREATE: string;
|
|
25
|
+
let UPDATE: string;
|
|
26
|
+
let REMOVE: string;
|
|
27
|
+
let REPLACE: string;
|
|
28
|
+
let MOVE: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create a virtual DOM differ for component updates
|
|
32
|
+
*/
|
|
33
|
+
export class VDOMDiffer {
|
|
34
|
+
cache: Map<any, any>;
|
|
35
|
+
/**
|
|
36
|
+
* Perform efficient diff and patch
|
|
37
|
+
*/
|
|
38
|
+
update(element: any, oldComponent: any, newComponent: any): number;
|
|
39
|
+
/**
|
|
40
|
+
* Cache virtual nodes for performance
|
|
41
|
+
*/
|
|
42
|
+
cacheVNode(key: any, vnode: any): void;
|
|
43
|
+
getCachedVNode(key: any): any;
|
|
44
|
+
clearCache(): void;
|
|
45
|
+
}
|
|
46
|
+
export default VDOMDiffer;
|
|
47
|
+
//# sourceMappingURL=vdom-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vdom-diff.d.ts","sourceRoot":"","sources":["../../../../src/rendering/vdom-diff.js"],"names":[],"mappings":"AAgBA;;GAEG;AACH;;;;;;EAQC;AAED;;GAEG;AACH,mEA6DC;AAED;;GAEG;AACH,yFA0DC;AAqGD;;GAEG;AACH,uDAiBC;;;;;;;;AA2JD;;GAEG;AACH;IAEQ,qBAAsB;IAG1B;;OAEG;IACH,mEAWC;IAED;;OAEG;IACH,uCAEC;IAED,8BAEC;IAED,mBAEC;CACJ"}
|