@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,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Renderer Class
|
|
3
|
+
* Provides common functionality shared across all Coherent.js renderers
|
|
4
|
+
* Reduces code duplication and ensures consistent behavior
|
|
5
|
+
*/
|
|
6
|
+
import { validateComponent, isCoherentObject, extractProps, hasChildren, normalizeChildren, } from '../core/object-utils.js';
|
|
7
|
+
import { performanceMonitor } from '../performance/monitor.js';
|
|
8
|
+
/**
|
|
9
|
+
* Unified configuration for all Coherent.js renderers
|
|
10
|
+
* Includes options for HTML, Streaming, and DOM renderers
|
|
11
|
+
*/
|
|
12
|
+
export const DEFAULT_RENDERER_CONFIG = {
|
|
13
|
+
// Core rendering options
|
|
14
|
+
maxDepth: 100,
|
|
15
|
+
enableValidation: true,
|
|
16
|
+
enableMonitoring: false,
|
|
17
|
+
validateInput: true,
|
|
18
|
+
// HTML Renderer specific options
|
|
19
|
+
enableCache: true,
|
|
20
|
+
minify: false,
|
|
21
|
+
cacheSize: 1000,
|
|
22
|
+
cacheTTL: 300000, // 5 minutes
|
|
23
|
+
// Streaming Renderer specific options
|
|
24
|
+
chunkSize: 1024, // Size of each chunk in bytes
|
|
25
|
+
bufferSize: 4096, // Internal buffer size
|
|
26
|
+
enableMetrics: false, // Track streaming metrics
|
|
27
|
+
yieldThreshold: 100, // Yield control after N elements
|
|
28
|
+
encoding: 'utf8', // Output encoding
|
|
29
|
+
// DOM Renderer specific options
|
|
30
|
+
enableHydration: true, // Enable hydration support
|
|
31
|
+
namespace: null, // SVG namespace support
|
|
32
|
+
// Performance options
|
|
33
|
+
enablePerformanceTracking: false,
|
|
34
|
+
performanceThreshold: 10, // ms threshold for slow renders
|
|
35
|
+
// Development options
|
|
36
|
+
enableDevWarnings: typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development',
|
|
37
|
+
enableDebugLogging: false,
|
|
38
|
+
// Error handling options
|
|
39
|
+
errorFallback: '', // Fallback content on errors
|
|
40
|
+
throwOnError: true, // Whether to throw or return fallback
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Base renderer class with common functionality
|
|
44
|
+
*/
|
|
45
|
+
export class BaseRenderer {
|
|
46
|
+
constructor(options = {}) {
|
|
47
|
+
this.config = this.validateAndMergeConfig(options);
|
|
48
|
+
this.metrics = {
|
|
49
|
+
startTime: null,
|
|
50
|
+
endTime: null,
|
|
51
|
+
elementsProcessed: 0
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Validate and merge configuration options
|
|
56
|
+
*/
|
|
57
|
+
validateAndMergeConfig(options) {
|
|
58
|
+
const _config = { ...DEFAULT_RENDERER_CONFIG, ...options };
|
|
59
|
+
// Validate critical options
|
|
60
|
+
if (typeof config.maxDepth !== 'number') {
|
|
61
|
+
throw new Error('maxDepth must be a number');
|
|
62
|
+
}
|
|
63
|
+
if (config.maxDepth <= 0) {
|
|
64
|
+
throw new Error('maxDepth must be a positive number');
|
|
65
|
+
}
|
|
66
|
+
if (typeof config.chunkSize !== 'number') {
|
|
67
|
+
throw new Error('chunkSize must be a number');
|
|
68
|
+
}
|
|
69
|
+
if (config.chunkSize <= 0) {
|
|
70
|
+
throw new Error('chunkSize must be a positive number');
|
|
71
|
+
}
|
|
72
|
+
if (typeof config.yieldThreshold !== 'number') {
|
|
73
|
+
throw new Error('yieldThreshold must be a number');
|
|
74
|
+
}
|
|
75
|
+
if (config.yieldThreshold <= 0) {
|
|
76
|
+
throw new Error('yieldThreshold must be a positive number');
|
|
77
|
+
}
|
|
78
|
+
// Warn about potentially problematic configurations
|
|
79
|
+
if (config.enableDevWarnings) {
|
|
80
|
+
if (config.maxDepth > 1000) {
|
|
81
|
+
console.warn('Coherent.js: maxDepth > 1000 may cause performance issues');
|
|
82
|
+
}
|
|
83
|
+
if (config.chunkSize > 16384) {
|
|
84
|
+
console.warn('Coherent.js: Large chunkSize may increase memory usage');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return config;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get configuration for specific renderer type
|
|
91
|
+
*/
|
|
92
|
+
getRendererConfig(rendererType) {
|
|
93
|
+
const baseConfig = { ...this.config };
|
|
94
|
+
switch (rendererType) {
|
|
95
|
+
case 'html':
|
|
96
|
+
return {
|
|
97
|
+
...baseConfig,
|
|
98
|
+
// HTML-specific defaults
|
|
99
|
+
enableCache: baseConfig.enableCache !== false,
|
|
100
|
+
enableMonitoring: baseConfig.enableMonitoring !== false
|
|
101
|
+
};
|
|
102
|
+
case 'streaming':
|
|
103
|
+
return {
|
|
104
|
+
...baseConfig,
|
|
105
|
+
// Streaming-specific defaults
|
|
106
|
+
enableMetrics: baseConfig.enableMetrics ?? false,
|
|
107
|
+
maxDepth: baseConfig.maxDepth ?? 1000 // Higher default for streaming
|
|
108
|
+
};
|
|
109
|
+
case 'dom':
|
|
110
|
+
return {
|
|
111
|
+
...baseConfig,
|
|
112
|
+
// DOM-specific defaults
|
|
113
|
+
enableHydration: baseConfig.enableHydration !== false
|
|
114
|
+
};
|
|
115
|
+
default:
|
|
116
|
+
return baseConfig;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Validate component structure
|
|
121
|
+
*/
|
|
122
|
+
validateComponent(component) {
|
|
123
|
+
if (this.config.validateInput !== false) {
|
|
124
|
+
return validateComponent(component);
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Check if component is valid for rendering
|
|
130
|
+
*/
|
|
131
|
+
isValidComponent(component) {
|
|
132
|
+
if (component === null || component === undefined)
|
|
133
|
+
return true;
|
|
134
|
+
if (typeof component === 'string' || typeof component === 'number')
|
|
135
|
+
return true;
|
|
136
|
+
if (typeof component === 'function')
|
|
137
|
+
return true;
|
|
138
|
+
if (Array.isArray(component))
|
|
139
|
+
return component.every(child => this.isValidComponent(child));
|
|
140
|
+
if (isCoherentObject(component))
|
|
141
|
+
return true;
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Validate rendering depth to prevent stack overflow
|
|
146
|
+
*/
|
|
147
|
+
validateDepth(depth) {
|
|
148
|
+
if (depth > this.config.maxDepth) {
|
|
149
|
+
throw new Error(`Maximum render depth (${this.config.maxDepth}) exceeded`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Handle different component types with consistent logic
|
|
154
|
+
*/
|
|
155
|
+
processComponentType(component) {
|
|
156
|
+
// Null/undefined
|
|
157
|
+
if (component === null || component === undefined) {
|
|
158
|
+
return { type: 'empty', value: '' };
|
|
159
|
+
}
|
|
160
|
+
// String
|
|
161
|
+
if (typeof component === 'string') {
|
|
162
|
+
return { type: 'text', value: component };
|
|
163
|
+
}
|
|
164
|
+
// Number/Boolean
|
|
165
|
+
if (typeof component === 'number' || typeof component === 'boolean') {
|
|
166
|
+
return { type: 'text', value: String(component) };
|
|
167
|
+
}
|
|
168
|
+
// Function
|
|
169
|
+
if (typeof component === 'function') {
|
|
170
|
+
return { type: 'function', value: component };
|
|
171
|
+
}
|
|
172
|
+
// Array
|
|
173
|
+
if (Array.isArray(component)) {
|
|
174
|
+
return { type: 'array', value: component };
|
|
175
|
+
}
|
|
176
|
+
// Object (Coherent element)
|
|
177
|
+
if (isCoherentObject(component)) {
|
|
178
|
+
return { type: 'element', value: component };
|
|
179
|
+
}
|
|
180
|
+
// Unknown type
|
|
181
|
+
return { type: 'unknown', value: component };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Execute function components with error handling
|
|
185
|
+
*/
|
|
186
|
+
executeFunctionComponent(func, depth = 0) {
|
|
187
|
+
try {
|
|
188
|
+
// Check if this is a context provider by checking function arity or a marker
|
|
189
|
+
const isContextProvider = func.length > 0 || func.isContextProvider;
|
|
190
|
+
let result;
|
|
191
|
+
if (isContextProvider) {
|
|
192
|
+
// Call with render function for context providers
|
|
193
|
+
result = func((children) => {
|
|
194
|
+
return this.renderComponent(children, this.config, depth + 1);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
// Regular function component
|
|
199
|
+
result = func();
|
|
200
|
+
}
|
|
201
|
+
// Handle case where function returns another function
|
|
202
|
+
if (typeof result === 'function') {
|
|
203
|
+
return this.executeFunctionComponent(result, depth);
|
|
204
|
+
}
|
|
205
|
+
return result;
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
if (this.config.enableMonitoring) {
|
|
209
|
+
performanceMonitor.recordError('functionComponent', error);
|
|
210
|
+
}
|
|
211
|
+
// In development, provide detailed error info
|
|
212
|
+
if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development') {
|
|
213
|
+
console.warn('Coherent.js Function Component Error:', error.message);
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Process element children consistently
|
|
220
|
+
*/
|
|
221
|
+
processChildren(children, options, depth) {
|
|
222
|
+
if (!hasChildren({ children })) {
|
|
223
|
+
return [];
|
|
224
|
+
}
|
|
225
|
+
const normalizedChildren = normalizeChildren(children);
|
|
226
|
+
return normalizedChildren.map(child => this.renderComponent(child, options, depth + 1));
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Extract and process element attributes
|
|
230
|
+
*/
|
|
231
|
+
extractElementAttributes(_props) {
|
|
232
|
+
if (!props || typeof props !== 'object')
|
|
233
|
+
return {};
|
|
234
|
+
const attributes = { ...props };
|
|
235
|
+
delete attributes.children;
|
|
236
|
+
delete attributes.text;
|
|
237
|
+
return attributes;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Record performance metrics
|
|
241
|
+
*/
|
|
242
|
+
recordPerformance(operation, startTime, fromCache = false, metadata = {}) {
|
|
243
|
+
if (this.config.enableMonitoring) {
|
|
244
|
+
performanceMonitor.recordRender(operation, this.getCurrentTime() - startTime, fromCache, metadata);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Record error for monitoring
|
|
249
|
+
*/
|
|
250
|
+
recordError(operation, error, metadata = {}) {
|
|
251
|
+
if (this.config.enableMonitoring) {
|
|
252
|
+
performanceMonitor.recordError(operation, error, metadata);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Get current timestamp with fallback
|
|
257
|
+
*/
|
|
258
|
+
getCurrentTime() {
|
|
259
|
+
if (typeof performance !== 'undefined' && performance.now) {
|
|
260
|
+
return performance.now();
|
|
261
|
+
}
|
|
262
|
+
return Date.now();
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Start performance timing
|
|
266
|
+
*/
|
|
267
|
+
startTiming() {
|
|
268
|
+
this.metrics.startTime = this.getCurrentTime();
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* End performance timing
|
|
272
|
+
*/
|
|
273
|
+
endTiming() {
|
|
274
|
+
this.metrics.endTime = this.getCurrentTime();
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Get performance metrics
|
|
278
|
+
*/
|
|
279
|
+
getMetrics() {
|
|
280
|
+
const duration = this.metrics.endTime ?
|
|
281
|
+
this.metrics.endTime - this.metrics.startTime :
|
|
282
|
+
this.getCurrentTime() - this.metrics.startTime;
|
|
283
|
+
return {
|
|
284
|
+
...this.metrics,
|
|
285
|
+
duration,
|
|
286
|
+
elementsPerSecond: this.metrics.elementsProcessed / (duration / 1000)
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Reset metrics for new render
|
|
291
|
+
*/
|
|
292
|
+
resetMetrics() {
|
|
293
|
+
this.metrics = {
|
|
294
|
+
startTime: null,
|
|
295
|
+
endTime: null,
|
|
296
|
+
elementsProcessed: 0
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Abstract method - must be implemented by subclasses
|
|
301
|
+
*/
|
|
302
|
+
renderComponent() {
|
|
303
|
+
throw new Error('renderComponent must be implemented by subclass');
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Abstract method - must be implemented by subclasses
|
|
307
|
+
*/
|
|
308
|
+
render() {
|
|
309
|
+
throw new Error('render must be implemented by subclass');
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Utility functions for renderer implementations
|
|
314
|
+
*/
|
|
315
|
+
export const RendererUtils = {
|
|
316
|
+
/**
|
|
317
|
+
* Check if element is static (no functions)
|
|
318
|
+
*/
|
|
319
|
+
isStaticElement(element) {
|
|
320
|
+
if (!element || typeof element !== 'object') {
|
|
321
|
+
return typeof element === 'string' || typeof element === 'number';
|
|
322
|
+
}
|
|
323
|
+
// Check if element has any dynamic content
|
|
324
|
+
for (const [key, value] of Object.entries(element)) {
|
|
325
|
+
if (typeof value === 'function')
|
|
326
|
+
return false;
|
|
327
|
+
if (key === 'children' && Array.isArray(value)) {
|
|
328
|
+
// Recursively check children for dynamic content
|
|
329
|
+
return value.every(child => RendererUtils.isStaticElement(child));
|
|
330
|
+
}
|
|
331
|
+
if (key === 'children' && typeof value === 'object' && value !== null) {
|
|
332
|
+
return RendererUtils.isStaticElement(value);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return true;
|
|
336
|
+
},
|
|
337
|
+
/**
|
|
338
|
+
* Check if object has functions (for caching decisions)
|
|
339
|
+
*/
|
|
340
|
+
hasFunctions(obj, visited = new WeakSet()) {
|
|
341
|
+
if (visited.has(obj))
|
|
342
|
+
return false;
|
|
343
|
+
visited.add(obj);
|
|
344
|
+
for (const value of Object.values(obj)) {
|
|
345
|
+
if (typeof value === 'function')
|
|
346
|
+
return true;
|
|
347
|
+
if (typeof value === 'object' && value !== null && RendererUtils.hasFunctions(value, visited)) {
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return false;
|
|
352
|
+
},
|
|
353
|
+
/**
|
|
354
|
+
* Get element complexity score
|
|
355
|
+
*/
|
|
356
|
+
getElementComplexity(element) {
|
|
357
|
+
if (!element || typeof element !== 'object')
|
|
358
|
+
return 1;
|
|
359
|
+
let complexity = Object.keys(element).length;
|
|
360
|
+
if (element.children && Array.isArray(element.children)) {
|
|
361
|
+
complexity += element.children.reduce((sum, child) => sum + RendererUtils.getElementComplexity(child), 0);
|
|
362
|
+
}
|
|
363
|
+
return complexity;
|
|
364
|
+
},
|
|
365
|
+
/**
|
|
366
|
+
* Generate cache key for element
|
|
367
|
+
*/
|
|
368
|
+
generateCacheKey(tagName, element) {
|
|
369
|
+
try {
|
|
370
|
+
// Create a stable cache key for the element
|
|
371
|
+
const keyData = {
|
|
372
|
+
tag: tagName,
|
|
373
|
+
props: extractProps(element),
|
|
374
|
+
hasChildren: hasChildren(element),
|
|
375
|
+
childrenType: Array.isArray(element.children) ? 'array' : typeof element.children
|
|
376
|
+
};
|
|
377
|
+
return `element:${JSON.stringify(keyData)}`;
|
|
378
|
+
}
|
|
379
|
+
catch (error) {
|
|
380
|
+
// Log error in development mode
|
|
381
|
+
if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development') {
|
|
382
|
+
console.warn('Failed to generate cache key:', error);
|
|
383
|
+
}
|
|
384
|
+
// Return null to indicate uncacheable element
|
|
385
|
+
return null;
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
/**
|
|
389
|
+
* Check if element is cacheable
|
|
390
|
+
*/
|
|
391
|
+
isCacheable(element, options) {
|
|
392
|
+
// Don't cache if caching is disabled
|
|
393
|
+
if (!options.enableCache)
|
|
394
|
+
return false;
|
|
395
|
+
// Don't cache elements with functions (dynamic content)
|
|
396
|
+
if (RendererUtils.hasFunctions(element))
|
|
397
|
+
return false;
|
|
398
|
+
// Don't cache very large elements (memory consideration)
|
|
399
|
+
if (RendererUtils.getElementComplexity(element) > 1000)
|
|
400
|
+
return false;
|
|
401
|
+
// Don't cache if we can't generate a stable cache key
|
|
402
|
+
const cacheKey = RendererUtils.generateCacheKey(element.tagName || 'unknown', element);
|
|
403
|
+
if (!cacheKey)
|
|
404
|
+
return false;
|
|
405
|
+
return true;
|
|
406
|
+
}
|
|
407
|
+
};
|
|
408
|
+
export default BaseRenderer;
|
|
409
|
+
//# sourceMappingURL=base-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-renderer.js","sourceRoot":"","sources":["../../../../src/rendering/base-renderer.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a new CSS Manager instance
|
|
3
|
+
*/
|
|
4
|
+
export function createCSSManager(options?: {}): CSSManager;
|
|
5
|
+
/**
|
|
6
|
+
* CSS Manager Class
|
|
7
|
+
* Handles CSS file loading, processing, and injection
|
|
8
|
+
*/
|
|
9
|
+
export class CSSManager {
|
|
10
|
+
constructor(options?: {});
|
|
11
|
+
options: {
|
|
12
|
+
basePath: string;
|
|
13
|
+
minify: boolean;
|
|
14
|
+
cache: boolean;
|
|
15
|
+
autoprefixer: boolean;
|
|
16
|
+
};
|
|
17
|
+
cache: Map<any, any>;
|
|
18
|
+
loadedFiles: Set<any>;
|
|
19
|
+
/**
|
|
20
|
+
* Load CSS file content
|
|
21
|
+
*/
|
|
22
|
+
loadCSSFile(filePath: any): Promise<any>;
|
|
23
|
+
/**
|
|
24
|
+
* Load multiple CSS files
|
|
25
|
+
*/
|
|
26
|
+
loadCSSFiles(filePaths: any): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Generate CSS link tags for external files
|
|
29
|
+
*/
|
|
30
|
+
generateCSSLinks(filePaths: any, baseUrl?: string): any;
|
|
31
|
+
/**
|
|
32
|
+
* Generate inline style tag with CSS content
|
|
33
|
+
*/
|
|
34
|
+
generateInlineStyles(cssContent: any): string;
|
|
35
|
+
/**
|
|
36
|
+
* Basic CSS minification
|
|
37
|
+
*/
|
|
38
|
+
minifyCSS(css: any): any;
|
|
39
|
+
/**
|
|
40
|
+
* Escape HTML entities
|
|
41
|
+
*/
|
|
42
|
+
escapeHtml(text: any): any;
|
|
43
|
+
/**
|
|
44
|
+
* Clear cache
|
|
45
|
+
*/
|
|
46
|
+
clearCache(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Get loaded file list
|
|
49
|
+
*/
|
|
50
|
+
getLoadedFiles(): any[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Default CSS Manager instance
|
|
54
|
+
*/
|
|
55
|
+
export const defaultCSSManager: CSSManager;
|
|
56
|
+
export namespace cssUtils {
|
|
57
|
+
/**
|
|
58
|
+
* Process CSS options from render options
|
|
59
|
+
*/
|
|
60
|
+
function processCSSOptions(options?: {}): {
|
|
61
|
+
files: any[];
|
|
62
|
+
inline: any;
|
|
63
|
+
links: any[];
|
|
64
|
+
basePath: any;
|
|
65
|
+
minify: any;
|
|
66
|
+
loadInline: boolean;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Generate complete CSS HTML for head section
|
|
70
|
+
*/
|
|
71
|
+
function generateCSSHtml(cssOptions: any, cssManager?: CSSManager): Promise<string>;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=css-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-manager.d.ts","sourceRoot":"","sources":["../../../../src/rendering/css-manager.js"],"names":[],"mappings":"AA6MA;;GAEG;AACH,2DAEC;AA1MD;;;GAGG;AACH;IACI,0BAWC;IAVG;;;;;MAMC;IAED,qBAAsB;IACtB,sBAA4B;IAGhC;;OAEG;IACH,yCA4BC;IAED;;OAEG;IACH,8CAUC;IAED;;OAEG;IACH,wDAcC;IAED;;OAEG;IACH,8CAIC;IAED;;OAEG;IACH,yBAQC;IAED;;OAEG;IACH,2BAGC;IAED;;OAEG;IACH,mBAGC;IAED;;OAEG;IACH,wBAEC;CACJ;AAED;;GAEG;AACH,2CAAkD;;IAM9C;;OAEG;IACH;;;;;;;MAkBC;IAED;;OAEG;IACH,oFA4BC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS Management System for Coherent.js
|
|
3
|
+
* Handles CSS file inclusion, inline styles, and optimization
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'node:fs/promises';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* CSS Manager Class
|
|
9
|
+
* Handles CSS file loading, processing, and injection
|
|
10
|
+
*/
|
|
11
|
+
export class CSSManager {
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
this.options = {
|
|
14
|
+
basePath: process.cwd(),
|
|
15
|
+
minify: false,
|
|
16
|
+
cache: true,
|
|
17
|
+
autoprefixer: false,
|
|
18
|
+
...options
|
|
19
|
+
};
|
|
20
|
+
this.cache = new Map();
|
|
21
|
+
this.loadedFiles = new Set();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load CSS file content
|
|
25
|
+
*/
|
|
26
|
+
async loadCSSFile(filePath) {
|
|
27
|
+
const fullPath = path.resolve(this.options.basePath, filePath);
|
|
28
|
+
const cacheKey = fullPath;
|
|
29
|
+
// Return cached content if available
|
|
30
|
+
if (this.options.cache && this.cache.has(cacheKey)) {
|
|
31
|
+
return this.cache.get(cacheKey);
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
let content = await fs.readFile(fullPath, 'utf8');
|
|
35
|
+
// Basic minification if enabled
|
|
36
|
+
if (this.options.minify) {
|
|
37
|
+
content = this.minifyCSS(content);
|
|
38
|
+
}
|
|
39
|
+
// Cache the content
|
|
40
|
+
if (this.options.cache) {
|
|
41
|
+
this.cache.set(cacheKey, content);
|
|
42
|
+
}
|
|
43
|
+
this.loadedFiles.add(filePath);
|
|
44
|
+
return content;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.warn(`Failed to load CSS file: ${filePath}`, error.message);
|
|
48
|
+
return '';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Load multiple CSS files
|
|
53
|
+
*/
|
|
54
|
+
async loadCSSFiles(filePaths) {
|
|
55
|
+
if (!Array.isArray(filePaths)) {
|
|
56
|
+
filePaths = [filePaths];
|
|
57
|
+
}
|
|
58
|
+
const cssContents = await Promise.all(filePaths.map(filePath => this.loadCSSFile(filePath)));
|
|
59
|
+
return cssContents.join('\n');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Generate CSS link tags for external files
|
|
63
|
+
*/
|
|
64
|
+
generateCSSLinks(filePaths, baseUrl = '/') {
|
|
65
|
+
if (!Array.isArray(filePaths)) {
|
|
66
|
+
filePaths = [filePaths];
|
|
67
|
+
}
|
|
68
|
+
return filePaths
|
|
69
|
+
.map(filePath => {
|
|
70
|
+
const href = filePath.startsWith('http')
|
|
71
|
+
? filePath
|
|
72
|
+
: `${baseUrl}${filePath}`.replace(/\/+/g, '/');
|
|
73
|
+
return `<link rel="stylesheet" href="${this.escapeHtml(href)}" />`;
|
|
74
|
+
})
|
|
75
|
+
.join('\n');
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Generate inline style tag with CSS content
|
|
79
|
+
*/
|
|
80
|
+
generateInlineStyles(cssContent) {
|
|
81
|
+
if (!cssContent)
|
|
82
|
+
return '';
|
|
83
|
+
return `<style type="text/css">\n${cssContent}\n</style>`;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Basic CSS minification
|
|
87
|
+
*/
|
|
88
|
+
minifyCSS(css) {
|
|
89
|
+
return css
|
|
90
|
+
.replace(/\/\*[\s\S]*?\*\//g, '') // Remove comments
|
|
91
|
+
.replace(/\s+/g, ' ') // Collapse whitespace
|
|
92
|
+
.replace(/;\s*}/g, '}') // Remove last semicolon in blocks
|
|
93
|
+
.replace(/{\s+/g, '{') // Remove space after opening brace
|
|
94
|
+
.replace(/;\s+/g, ';') // Remove space after semicolons
|
|
95
|
+
.trim();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Escape HTML entities
|
|
99
|
+
*/
|
|
100
|
+
escapeHtml(text) {
|
|
101
|
+
const div = { textContent: text };
|
|
102
|
+
return div.innerHTML || text;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Clear cache
|
|
106
|
+
*/
|
|
107
|
+
clearCache() {
|
|
108
|
+
this.cache.clear();
|
|
109
|
+
this.loadedFiles.clear();
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get loaded file list
|
|
113
|
+
*/
|
|
114
|
+
getLoadedFiles() {
|
|
115
|
+
return Array.from(this.loadedFiles);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Default CSS Manager instance
|
|
120
|
+
*/
|
|
121
|
+
export const defaultCSSManager = new CSSManager();
|
|
122
|
+
/**
|
|
123
|
+
* CSS processing utilities
|
|
124
|
+
*/
|
|
125
|
+
export const cssUtils = {
|
|
126
|
+
/**
|
|
127
|
+
* Process CSS options from render options
|
|
128
|
+
*/
|
|
129
|
+
processCSSOptions(options = {}) {
|
|
130
|
+
const { css = {}, cssFiles = [], inlineCSS = '', cssLinks = [], cssBasePath = process.cwd(), cssMinify = false } = options;
|
|
131
|
+
return {
|
|
132
|
+
files: Array.isArray(cssFiles) ? cssFiles : [cssFiles].filter(Boolean),
|
|
133
|
+
inline: inlineCSS || css.inline || '',
|
|
134
|
+
links: Array.isArray(cssLinks) ? cssLinks : [cssLinks].filter(Boolean),
|
|
135
|
+
basePath: css.basePath || cssBasePath,
|
|
136
|
+
minify: css.minify || cssMinify,
|
|
137
|
+
loadInline: css.loadInline !== false // default true
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
/**
|
|
141
|
+
* Generate complete CSS HTML for head section
|
|
142
|
+
*/
|
|
143
|
+
async generateCSSHtml(cssOptions, cssManager = defaultCSSManager) {
|
|
144
|
+
const cssHtmlParts = [];
|
|
145
|
+
// Process external CSS links
|
|
146
|
+
if (cssOptions.links.length > 0) {
|
|
147
|
+
cssHtmlParts.push(cssManager.generateCSSLinks(cssOptions.links));
|
|
148
|
+
}
|
|
149
|
+
// Process CSS files (inline or as links)
|
|
150
|
+
if (cssOptions.files.length > 0) {
|
|
151
|
+
if (cssOptions.loadInline) {
|
|
152
|
+
// Load and inline CSS files
|
|
153
|
+
const cssContent = await cssManager.loadCSSFiles(cssOptions.files);
|
|
154
|
+
if (cssContent) {
|
|
155
|
+
cssHtmlParts.push(cssManager.generateInlineStyles(cssContent));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Generate link tags for CSS files
|
|
160
|
+
cssHtmlParts.push(cssManager.generateCSSLinks(cssOptions.files));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Process inline CSS
|
|
164
|
+
if (cssOptions.inline) {
|
|
165
|
+
cssHtmlParts.push(cssManager.generateInlineStyles(cssOptions.inline));
|
|
166
|
+
}
|
|
167
|
+
return cssHtmlParts.join('\n');
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Create a new CSS Manager instance
|
|
172
|
+
*/
|
|
173
|
+
export function createCSSManager(options = {}) {
|
|
174
|
+
return new CSSManager(options);
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=css-manager.js.map
|