@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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +130 -0
  3. package/dist/coherent.d.ts +472 -0
  4. package/dist/coherent.d.ts.map +1 -0
  5. package/dist/coherent.js +590 -0
  6. package/dist/coherent.js.map +1 -0
  7. package/dist/components/component-system.d.ts +1138 -0
  8. package/dist/components/component-system.d.ts.map +1 -0
  9. package/dist/components/component-system.js +2220 -0
  10. package/dist/components/component-system.js.map +1 -0
  11. package/dist/components/lifecycle.d.ts +212 -0
  12. package/dist/components/lifecycle.d.ts.map +1 -0
  13. package/dist/components/lifecycle.js +525 -0
  14. package/dist/components/lifecycle.js.map +1 -0
  15. package/dist/core/html-utils.d.ts +14 -0
  16. package/dist/core/html-utils.d.ts.map +1 -0
  17. package/dist/core/html-utils.js +166 -0
  18. package/dist/core/html-utils.js.map +1 -0
  19. package/dist/core/object-factory.d.ts +38 -0
  20. package/dist/core/object-factory.d.ts.map +1 -0
  21. package/dist/core/object-factory.js +63 -0
  22. package/dist/core/object-factory.js.map +1 -0
  23. package/dist/core/object-utils.d.ts +77 -0
  24. package/dist/core/object-utils.d.ts.map +1 -0
  25. package/dist/core/object-utils.js +502 -0
  26. package/dist/core/object-utils.js.map +1 -0
  27. package/dist/dev/dev-tools.d.ts +194 -0
  28. package/dist/dev/dev-tools.d.ts.map +1 -0
  29. package/dist/dev/dev-tools.js +846 -0
  30. package/dist/dev/dev-tools.js.map +1 -0
  31. package/dist/forms/validation.d.ts +271 -0
  32. package/dist/forms/validation.d.ts.map +1 -0
  33. package/dist/forms/validation.js +573 -0
  34. package/dist/forms/validation.js.map +1 -0
  35. package/dist/index.cjs +5281 -0
  36. package/dist/index.cjs.map +7 -0
  37. package/dist/index.js +5204 -0
  38. package/dist/index.js.map +7 -0
  39. package/dist/performance/bundle-optimizer.d.ts +95 -0
  40. package/dist/performance/bundle-optimizer.d.ts.map +1 -0
  41. package/dist/performance/bundle-optimizer.js +192 -0
  42. package/dist/performance/bundle-optimizer.js.map +1 -0
  43. package/dist/performance/cache-manager.d.ts +107 -0
  44. package/dist/performance/cache-manager.d.ts.map +1 -0
  45. package/dist/performance/cache-manager.js +314 -0
  46. package/dist/performance/cache-manager.js.map +1 -0
  47. package/dist/performance/component-cache.d.ts +120 -0
  48. package/dist/performance/component-cache.d.ts.map +1 -0
  49. package/dist/performance/component-cache.js +364 -0
  50. package/dist/performance/component-cache.js.map +1 -0
  51. package/dist/performance/monitor.d.ts +189 -0
  52. package/dist/performance/monitor.d.ts.map +1 -0
  53. package/dist/performance/monitor.js +347 -0
  54. package/dist/performance/monitor.js.map +1 -0
  55. package/dist/rendering/base-renderer.d.ts +140 -0
  56. package/dist/rendering/base-renderer.d.ts.map +1 -0
  57. package/dist/rendering/base-renderer.js +409 -0
  58. package/dist/rendering/base-renderer.js.map +1 -0
  59. package/dist/rendering/css-manager.d.ts +73 -0
  60. package/dist/rendering/css-manager.d.ts.map +1 -0
  61. package/dist/rendering/css-manager.js +176 -0
  62. package/dist/rendering/css-manager.js.map +1 -0
  63. package/dist/rendering/dom-renderer.d.ts +62 -0
  64. package/dist/rendering/dom-renderer.d.ts.map +1 -0
  65. package/dist/rendering/dom-renderer.js +252 -0
  66. package/dist/rendering/dom-renderer.js.map +1 -0
  67. package/dist/rendering/html-renderer.d.ts +67 -0
  68. package/dist/rendering/html-renderer.d.ts.map +1 -0
  69. package/dist/rendering/html-renderer.js +444 -0
  70. package/dist/rendering/html-renderer.js.map +1 -0
  71. package/dist/rendering/renderer-config.d.ts +282 -0
  72. package/dist/rendering/renderer-config.d.ts.map +1 -0
  73. package/dist/rendering/renderer-config.js +144 -0
  74. package/dist/rendering/renderer-config.js.map +1 -0
  75. package/dist/rendering/streaming-renderer.d.ts +117 -0
  76. package/dist/rendering/streaming-renderer.d.ts.map +1 -0
  77. package/dist/rendering/streaming-renderer.js +326 -0
  78. package/dist/rendering/streaming-renderer.js.map +1 -0
  79. package/dist/rendering/vdom-diff.d.ts +47 -0
  80. package/dist/rendering/vdom-diff.d.ts.map +1 -0
  81. package/dist/rendering/vdom-diff.js +416 -0
  82. package/dist/rendering/vdom-diff.js.map +1 -0
  83. package/dist/routing/router.d.ts +241 -0
  84. package/dist/routing/router.d.ts.map +1 -0
  85. package/dist/routing/router.js +648 -0
  86. package/dist/routing/router.js.map +1 -0
  87. package/dist/state/reactive-state.d.ts +166 -0
  88. package/dist/state/reactive-state.d.ts.map +1 -0
  89. package/dist/state/reactive-state.js +546 -0
  90. package/dist/state/reactive-state.js.map +1 -0
  91. package/dist/state/state-manager.d.ts +45 -0
  92. package/dist/state/state-manager.d.ts.map +1 -0
  93. package/dist/state/state-manager.js +151 -0
  94. package/dist/state/state-manager.js.map +1 -0
  95. package/dist/types/constants.d.ts +8 -0
  96. package/dist/types/constants.d.ts.map +1 -0
  97. package/dist/types/constants.js +36 -0
  98. package/dist/types/constants.js.map +1 -0
  99. package/dist/utils/dependency-utils.d.ts +43 -0
  100. package/dist/utils/dependency-utils.d.ts.map +1 -0
  101. package/dist/utils/dependency-utils.js +105 -0
  102. package/dist/utils/dependency-utils.js.map +1 -0
  103. package/dist/utils/error-handler.d.ts +148 -0
  104. package/dist/utils/error-handler.d.ts.map +1 -0
  105. package/dist/utils/error-handler.js +468 -0
  106. package/dist/utils/error-handler.js.map +1 -0
  107. package/dist/utils/normalization.d.ts +3 -0
  108. package/dist/utils/normalization.d.ts.map +1 -0
  109. package/dist/utils/normalization.js +24 -0
  110. package/dist/utils/normalization.js.map +1 -0
  111. package/dist/utils/validation.d.ts +10 -0
  112. package/dist/utils/validation.d.ts.map +1 -0
  113. package/dist/utils/validation.js +32 -0
  114. package/dist/utils/validation.js.map +1 -0
  115. package/package.json +44 -0
  116. 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":"AAAA;;;;GAIG;AAEH,OAAO,EACH,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,iBAAiB,GACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACnC,yBAAyB;IACzB,QAAQ,EAAE,GAAG;IACb,gBAAgB,EAAE,IAAI;IACtB,gBAAgB,EAAE,KAAK;IACvB,aAAa,EAAE,IAAI;IAEnB,iCAAiC;IACjC,WAAW,EAAE,IAAI;IACjB,MAAM,EAAE,KAAK;IACb,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,MAAM,EAAE,YAAY;IAE9B,sCAAsC;IACtC,SAAS,EAAE,IAAI,EAAY,8BAA8B;IACzD,UAAU,EAAE,IAAI,EAAW,uBAAuB;IAClD,aAAa,EAAE,KAAK,EAAO,0BAA0B;IACrD,cAAc,EAAE,GAAG,EAAQ,iCAAiC;IAC5D,QAAQ,EAAE,MAAM,EAAW,kBAAkB;IAE7C,gCAAgC;IAChC,eAAe,EAAE,IAAI,EAAM,2BAA2B;IACtD,SAAS,EAAE,IAAI,EAAY,wBAAwB;IAEnD,sBAAsB;IACtB,yBAAyB,EAAE,KAAK;IAChC,oBAAoB,EAAE,EAAE,EAAG,gCAAgC;IAE3D,sBAAsB;IACtB,iBAAiB,EAAE,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa;IAC1G,kBAAkB,EAAE,KAAK;IAEzB,yBAAyB;IACzB,aAAa,EAAE,EAAE,EAAU,6BAA6B;IACxD,YAAY,EAAE,IAAI,EAAS,sCAAsC;CACpE,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,YAAY;IACrB,YAAY,OAAO,GAAG,EAAE;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,GAAG;YACX,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,CAAC;SACvB,CAAC;IACN,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,OAAO;QAC1B,MAAM,MAAM,GAAG,EAAE,GAAG,uBAAuB,EAAE,GAAG,OAAO,EAAE,CAAC;QAE1D,4BAA4B;QAC5B,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,MAAM,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAChE,CAAC;QAED,oDAAoD;QACpD,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,MAAM,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YAC9E,CAAC;YAED,IAAI,MAAM,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YAC3E,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,YAAY;QAC1B,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAEtC,QAAQ,YAAY,EAAE,CAAC;YACnB,KAAK,MAAM;gBACP,OAAO;oBACH,GAAG,UAAU;oBACb,yBAAyB;oBACzB,WAAW,EAAE,UAAU,CAAC,WAAW,KAAK,KAAK;oBAC7C,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,KAAK,KAAK;iBAC1D,CAAC;YAEN,KAAK,WAAW;gBACZ,OAAO;oBACH,GAAG,UAAU;oBACb,8BAA8B;oBAC9B,aAAa,EAAE,UAAU,CAAC,aAAa,IAAI,KAAK;oBAChD,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC,+BAA+B;iBACxE,CAAC;YAEN,KAAK,KAAK;gBACN,OAAO;oBACH,GAAG,UAAU;oBACb,wBAAwB;oBACxB,eAAe,EAAE,UAAU,CAAC,eAAe,KAAK,KAAK;iBACxD,CAAC;YAEN;gBACI,OAAO,UAAU,CAAC;QAC1B,CAAC;IACL,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,SAAS;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;YACtC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,SAAS;QACtB,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAC/D,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAChF,IAAI,OAAO,SAAS,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QACjD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5F,IAAI,gBAAgB,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,KAAK;QACf,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,MAAM,CAAC,QAAQ,YAAY,CAAC,CAAC;QAC/E,CAAC;IACL,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,SAAS;QAC1B,iBAAiB;QACjB,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAChD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACxC,CAAC;QAED,SAAS;QACT,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC9C,CAAC;QAED,iBAAiB;QACjB,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,SAAS,EAAE,CAAC;YAClE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtD,CAAC;QAED,WAAW;QACX,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;YAClC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAClD,CAAC;QAED,QAAQ;QACR,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC/C,CAAC;QAED,4BAA4B;QAC5B,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QACjD,CAAC;QAED,eAAe;QACf,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC;QACpC,IAAI,CAAC;YACD,6EAA6E;YAC7E,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC;YAEpE,IAAI,MAAM,CAAC;YACX,IAAI,iBAAiB,EAAE,CAAC;gBACpB,kDAAkD;gBAClD,MAAM,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACvB,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,6BAA6B;gBAC7B,MAAM,GAAG,IAAI,EAAE,CAAC;YACpB,CAAC;YAED,sDAAsD;YACtD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACxD,CAAC;YAED,OAAO,MAAM,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC/B,kBAAkB,CAAC,WAAW,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC/D,CAAC;YAED,8CAA8C;YAC9C,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC1F,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACzE,CAAC;YAED,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK;QACpC,IAAI,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACvD,OAAO,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAClC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAClD,CAAC;IACN,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,KAAK;QAC1B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAEnD,MAAM,UAAU,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QAChC,OAAO,UAAU,CAAC,QAAQ,CAAC;QAC3B,OAAO,UAAU,CAAC,IAAI,CAAC;QACvB,OAAO,UAAU,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,KAAK,EAAE,QAAQ,GAAG,EAAE;QACpE,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC/B,kBAAkB,CAAC,YAAY,CAC3B,SAAS,EACT,IAAI,CAAC,cAAc,EAAE,GAAG,SAAS,EACjC,SAAS,EACT,QAAQ,CACX,CAAC;QACN,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,EAAE;QACvC,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC/B,kBAAkB,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAED;;OAEG;IACH,cAAc;QACV,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC;YACxD,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,WAAW;QACP,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,SAAS;QACL,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,UAAU;QACN,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAEnD,OAAO;YACH,GAAG,IAAI,CAAC,OAAO;YACf,QAAQ;YACR,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;SACxE,CAAC;IACN,CAAC;IAED;;OAEG;IACH,YAAY;QACR,IAAI,CAAC,OAAO,GAAG;YACX,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,CAAC;SACvB,CAAC;IACN,CAAC;IAED;;OAEG;IACH,eAAe;QACX,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,MAAM;QACF,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC9D,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB;;OAEG;IACH,eAAe,CAAC,OAAO;QACnB,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC;QACtE,CAAC;QAED,2CAA2C;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,IAAI,OAAO,KAAK,KAAK,UAAU;gBAAE,OAAO,KAAK,CAAC;YAE9C,IAAI,GAAG,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7C,iDAAiD;gBACjD,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,IAAI,GAAG,KAAK,UAAU,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACpE,OAAO,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAChD,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,OAAO,EAAE;QACrC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEjB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,OAAO,KAAK,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC5F,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,OAAO;QACxB,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QAEtD,IAAI,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAE7C,IAAI,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtD,UAAU,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CACjC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,aAAa,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAC/D,CAAC,CACJ,CAAC;QACN,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,OAAO;QAC7B,IAAI,CAAC;YACD,4CAA4C;YAC5C,MAAM,OAAO,GAAG;gBACZ,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC;gBAC5B,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC;gBACjC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,QAAQ;aACpF,CAAC;YAEF,OAAO,WAAW,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,gCAAgC;YAChC,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC1F,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACzD,CAAC;YACD,8CAA8C;YAC9C,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO;QACxB,qCAAqC;QACrC,IAAI,CAAC,OAAO,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QAEvC,wDAAwD;QACxD,IAAI,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAEtD,yDAAyD;QACzD,IAAI,aAAa,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,IAAI;YAAE,OAAO,KAAK,CAAC;QAErE,sDAAsD;QACtD,MAAM,QAAQ,GAAG,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,IAAI,SAAS,EAAE,OAAO,CAAC,CAAC;QACvF,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5B,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -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