@coherent.js/koa 1.0.0-beta.3 → 1.0.0-beta.5
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/README.md +421 -0
- package/dist/index.cjs +10 -120
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +10 -110
- package/dist/index.js.map +4 -4
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../core/src/utils/dependency-utils.js", "../../core/src/core/object-utils.js", "../../core/src/performance/monitor.js", "../../core/src/rendering/base-renderer.js", "../../core/src/core/html-utils.js", "../../core/src/performance/cache-manager.js", "../../core/src/rendering/
|
|
4
|
-
"sourcesContent": ["/**\n * Utility functions for handling optional peer dependencies\n */\n\n/**\n * Check if a peer dependency is available\n * @param {string} packageName - Name of the package to check\n * @returns {boolean} - Whether the package is available\n */\nexport function isPeerDependencyAvailable(packageName) {\n try {\n // Try to import the package synchronously using require.resolve\n // This is more compatible with code analysis tools\n if (typeof require !== 'undefined' && require.resolve) {\n require.resolve(packageName);\n return true;\n }\n // Fallback: assume available if require is not available (browser context)\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Dynamically import a peer dependency with _error handling\n * @param {string} packageName - Name of the package to import\n * @param {string} integrationName - Human-readable name of the integration\n * @returns {Promise<any>} - The imported module\n * @throws {Error} - If the dependency is not available\n */\nexport async function importPeerDependency(packageName, integrationName) {\n try {\n return await import(packageName);\n } catch {\n throw new Error(\n `${integrationName} integration requires the '${packageName}' package to be installed.\\n` +\n `Please install it with: npm install ${packageName}\\n` +\n `Or with pnpm: pnpm add ${packageName}\\n` +\n `Or with yarn: yarn add ${packageName}`\n );\n }\n}\n\n/**\n * Create a lazy-loaded integration that only imports dependencies when needed\n * @param {string} packageName - Name of the package to import\n * @param {string} integrationName - Human-readable name of the integration\n * @param {Function} createIntegration - Function that creates the integration using the imported package\n * @returns {Function} - Lazy-loaded integration function\n */\nexport function createLazyIntegration(packageName, integrationName, createIntegration) {\n let cachedIntegration = null;\n let importPromise = null;\n\n return async function(...args) {\n // Return cached integration if available\n if (cachedIntegration) {\n return cachedIntegration(...args);\n }\n\n // Avoid multiple concurrent imports\n if (!importPromise) {\n importPromise = importPeerDependency(packageName, integrationName)\n .then(module => {\n cachedIntegration = createIntegration(module);\n return cachedIntegration;\n });\n }\n\n const integration = await importPromise;\n return integration(...args);\n };\n}\n\n/**\n * Check multiple peer dependencies and provide helpful _error messages\n * @param {Array<{package: string, integration: string}>} dependencies - List of dependencies to check\n * @returns {Object} - Object with availability status for each dependency\n */\nexport function checkPeerDependencies(dependencies) {\n const results = {};\n const missing = [];\n\n for (const { package: packageName, integration } of dependencies) {\n const available = isPeerDependencyAvailable(packageName);\n results[packageName] = available;\n \n if (!available) {\n missing.push({ package: packageName, integration });\n }\n }\n\n if (missing.length > 0) {\n const installCommands = missing.map(({ package: pkg }) => pkg).join(' ');\n const integrationsList = missing.map(({ integration }) => integration).join(', ');\n \n console.warn(\n `Optional dependencies missing for ${integrationsList} integration(s).\\n` +\n `To use these integrations, install: npm install ${installCommands}\\n` +\n `Or with pnpm: pnpm add ${installCommands}\\n` +\n `Or with yarn: yarn add ${installCommands}`\n );\n }\n\n return results;\n}\n\n/**\n * Create a function that checks for a dependency before executing\n * @param {string} packageName - Name of the package required\n * @param {string} integrationName - Human-readable name of the integration\n * @param {Function} fn - Function to execute if dependency is available\n * @returns {Function} - Wrapped function with dependency check\n */\nexport function requirePeerDependency(packageName, integrationName, fn) {\n return function(...args) {\n if (!isPeerDependencyAvailable(packageName)) {\n throw new Error(\n `${integrationName} integration requires the '${packageName}' package to be installed.\\n` +\n `Please install it with: npm install ${packageName}`\n );\n }\n return fn.apply(this, args);\n };\n}\n", "/**\n * Core Object Utilities for Coherent.js\n * Handles object validation, manipulation, and analysis\n */\n\n/**\n * Deep clone an object with optimizations for common patterns\n * Handles circular references, functions, dates, regex, and more\n */\nexport function deepClone(obj, seen = new WeakMap()) {\n // Handle primitives\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // Handle circular references\n if (seen.has(obj)) {\n return seen.get(obj);\n }\n\n // Handle Date objects\n if (obj instanceof Date) {\n return new Date(obj.getTime());\n }\n\n // Handle RegExp objects\n if (obj instanceof RegExp) {\n return new RegExp(obj.source, obj.flags);\n }\n\n // Handle Array objects\n if (Array.isArray(obj)) {\n const clonedArray = [];\n seen.set(obj, clonedArray);\n\n for (let i = 0; i < obj.length; i++) {\n clonedArray[i] = deepClone(obj[i], seen);\n }\n\n return clonedArray;\n }\n\n // Handle Function objects (preserve reference for performance)\n if (typeof obj === 'function') {\n // For Coherent components, we typically want to preserve function references\n // rather than cloning them, as they represent behavior\n return obj;\n }\n\n // Handle Map objects\n if (obj instanceof Map) {\n const clonedMap = new Map();\n seen.set(obj, clonedMap);\n\n for (const [key, value] of obj) {\n clonedMap.set(deepClone(key, seen), deepClone(value, seen));\n }\n\n return clonedMap;\n }\n\n // Handle Set objects\n if (obj instanceof Set) {\n const clonedSet = new Set();\n seen.set(obj, clonedSet);\n\n for (const value of obj) {\n clonedSet.add(deepClone(value, seen));\n }\n\n return clonedSet;\n }\n\n // Handle WeakMap and WeakSet (cannot be cloned, return new empty instance)\n if (obj instanceof WeakMap) {\n return new WeakMap();\n }\n\n if (obj instanceof WeakSet) {\n return new WeakSet();\n }\n\n // Handle plain objects and other object types\n const clonedObj = {};\n seen.set(obj, clonedObj);\n\n // Handle objects with custom prototypes\n if (obj.constructor && obj.constructor !== Object) {\n try {\n // Attempt to create instance with same constructor\n clonedObj.__proto__ = obj.__proto__;\n } catch {\n // Fallback to Object.create if direct prototype assignment fails\n Object.setPrototypeOf(clonedObj, Object.getPrototypeOf(obj));\n }\n }\n\n // Clone all enumerable properties\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n clonedObj[key] = deepClone(obj[key], seen);\n }\n }\n\n // Clone non-enumerable properties (important for some objects)\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n for (const key of Object.keys(descriptors)) {\n if (!descriptors[key].enumerable && descriptors[key].configurable) {\n try {\n Object.defineProperty(clonedObj, key, {\n ...descriptors[key],\n value: deepClone(descriptors[key].value, seen)\n });\n } catch {\n // Skip properties that can't be cloned\n }\n }\n }\n\n return clonedObj;\n}\n\n/**\n * Shallow clone optimized for Coherent objects\n * Much faster than deep clone when you only need one level\n */\nexport function shallowClone(obj) {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return [...obj];\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime());\n }\n\n if (obj instanceof RegExp) {\n return new RegExp(obj.source, obj.flags);\n }\n\n // For objects, spread operator is fastest for shallow clone\n return { ...obj };\n}\n\n/**\n * Smart clone that chooses between shallow and deep based on structure\n * Optimized for Coherent component patterns\n */\nexport function smartClone(obj, maxDepth = 10, currentDepth = 0) {\n // Prevent infinite recursion\n if (currentDepth >= maxDepth) {\n return shallowClone(obj);\n }\n\n // Use shallow clone for simple structures\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n // For arrays, check if elements need deep cloning\n if (Array.isArray(obj)) {\n const needsDeepClone = obj.some(item =>\n typeof item === 'object' && item !== null && !isSimpleObject(item)\n );\n\n if (!needsDeepClone && currentDepth < 3) {\n return obj.map(item => smartClone(item, maxDepth, currentDepth + 1));\n } else {\n return obj.map(item => shallowClone(item));\n }\n }\n\n // For Coherent objects, intelligently clone based on content\n if (isCoherentObject(obj)) {\n const cloned = {};\n\n for (const [tag, props] of Object.entries(obj)) {\n if (props && typeof props === 'object') {\n // Deep clone children, shallow clone other props\n if (props.children) {\n cloned[tag] = {\n ...props,\n children: smartClone(props.children, maxDepth, currentDepth + 1)\n };\n } else {\n cloned[tag] = shallowClone(props);\n }\n } else {\n cloned[tag] = props;\n }\n }\n\n return cloned;\n }\n\n // Fallback to shallow clone for other objects\n return shallowClone(obj);\n}\n\n/**\n * Check if object is a simple structure (no nested objects/arrays)\n */\nfunction isSimpleObject(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return true;\n }\n\n if (Array.isArray(obj)) {\n return obj.every(item => typeof item !== 'object' || item === null);\n }\n\n return Object.values(obj).every(value =>\n typeof value !== 'object' || value === null || value instanceof Date || value instanceof RegExp\n );\n}\n\n/**\n * Clone with performance monitoring\n * Useful for debugging clone performance in development\n */\nexport function monitoredClone(obj, options = {}) {\n const {\n method = 'deep',\n logTiming = false,\n maxDepth = 10\n } = options;\n\n const start = performance.now();\n let result;\n\n switch (method) {\n case 'shallow':\n result = shallowClone(obj);\n break;\n case 'smart':\n result = smartClone(obj, maxDepth);\n break;\n case 'deep':\n default:\n result = deepClone(obj);\n break;\n }\n\n const end = performance.now();\n\n if (logTiming) {\n console.log(`\uD83D\uDD04 ${method} clone took ${(end - start).toFixed(2)}ms`);\n }\n\n return result;\n}\n\n// Rest of your existing object-utils.js code...\n\n/**\n * Validate that a component structure is valid for rendering\n */\nexport function validateComponent(component, path = 'root') {\n if (component === null || component === undefined) {\n throw new Error(`Invalid component at ${path}: null or undefined`);\n }\n\n // Allow strings, numbers, booleans as text content\n if (['string', 'number', 'boolean'].includes(typeof component)) {\n return true;\n }\n\n // Allow functions (will be evaluated during render)\n if (typeof component === 'function') {\n return true;\n }\n\n // Handle arrays\n if (Array.isArray(component)) {\n component.forEach((child, index) => {\n validateComponent(child, `${path}[${index}]`);\n });\n return true;\n }\n\n // Handle objects\n if (typeof component === 'object') {\n const keys = Object.keys(component);\n\n if (keys.length === 0) {\n throw new Error(`Empty object at ${path}`);\n }\n\n keys.forEach(key => {\n const value = component[key];\n\n // Validate HTML tag names (basic validation)\n if (!/^[a-zA-Z][a-zA-Z0-9-]*$/.test(key) && key !== 'text') {\n console.warn(`Potentially invalid tag name at ${path}: ${key}`);\n }\n\n // If value is an object, it should be props\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Validate children if present\n if (value.children) {\n validateComponent(value.children, `${path}.${key}.children`);\n }\n } else if (value && typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'function') {\n throw new Error(`Invalid value type at ${path}.${key}: ${typeof value}`);\n }\n });\n\n return true;\n }\n\n throw new Error(`Invalid component type at ${path}: ${typeof component}`);\n}\n\n/**\n * Check if an object follows Coherent.js object syntax\n */\nexport function isCoherentObject(obj) {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return false;\n }\n\n const keys = Object.keys(obj);\n\n // Empty objects are not coherent objects\n if (keys.length === 0) {\n return false;\n }\n\n // Check if all keys look like HTML tags or 'text'\n return keys.every(key => {\n // Allow 'text' as a special key\n if (key === 'text') return true;\n\n // Basic HTML tag validation\n return /^[a-zA-Z][a-zA-Z0-9-]*$/.test(key);\n });\n}\n\n/**\n * Extract props from a Coherent object\n */\nexport function extractProps(coherentObj) {\n if (!isCoherentObject(coherentObj)) {\n return {};\n }\n\n const props = {};\n const keys = Object.keys(coherentObj);\n\n keys.forEach(tag => {\n const value = coherentObj[tag];\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n props[tag] = { ...value };\n } else {\n props[tag] = { text: value };\n }\n });\n\n return props;\n}\n\n/**\n * Check if a component has children\n */\nexport function hasChildren(component) {\n if (Array.isArray(component)) {\n return component.length > 0;\n }\n\n if (isCoherentObject(component)) {\n // First check if the component itself has a children property\n if (component.children !== undefined && component.children !== null) {\n return Array.isArray(component.children) ? component.children.length > 0 : true;\n }\n \n // Then check if any of its properties have children\n const keys = Object.keys(component);\n return keys.some(key => {\n const value = component[key];\n return value && typeof value === 'object' && value.children;\n });\n }\n\n return false;\n}\n\n/**\n * Normalize children to a consistent array format\n */\nexport function normalizeChildren(children) {\n if (children === null || children === undefined) {\n return [];\n }\n\n if (Array.isArray(children)) {\n return children.flat().filter(child => child !== null && child !== undefined);\n }\n\n return [children];\n}\n\n/**\n * Get children from a component's props\n */\nexport function getChildren(props) {\n if (!props || typeof props !== 'object') {\n return [];\n }\n\n if (props.children === undefined) {\n return [];\n }\n\n return normalizeChildren(props.children);\n}\n\n/**\n * Merge props objects with conflict resolution\n */\nexport function mergeProps(base = {}, override = {}) {\n const merged = { ...base };\n\n Object.keys(override).forEach(key => {\n if (key === 'children') {\n // Merge children arrays\n const baseChildren = normalizeChildren(base.children);\n const overrideChildren = normalizeChildren(override.children);\n merged.children = [...baseChildren, ...overrideChildren];\n } else if (key === 'className' && base.className) {\n // Merge class names\n merged.className = `${base.className} ${override.className}`;\n } else if (key === 'style' && base.style && typeof base.style === 'object') {\n // Merge style objects\n merged.style = { ...base.style, ...override.style };\n } else {\n // Override other properties\n merged[key] = override[key];\n }\n });\n\n return merged;\n}\n\n/**\n * Get nested value from object using dot notation\n */\nexport function getNestedValue(obj, path) {\n if (!obj || typeof path !== 'string') {\n return undefined;\n }\n\n return path.split('.').reduce((current, key) => {\n return current && current[key] !== undefined ? current[key] : undefined;\n }, obj);\n}\n\n/**\n * Set nested value in object using dot notation\n */\nexport function setNestedValue(obj, path, value) {\n if (!obj || typeof path !== 'string') {\n return obj;\n }\n\n const keys = path.split('.');\n const lastKey = keys.pop();\n\n const target = keys.reduce((current, key) => {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n return current[key];\n }, obj);\n\n target[lastKey] = value;\n return obj;\n}\n\n/**\n * Compare two components for equality (useful for optimization)\n */\nexport function isEqual(a, b, maxDepth = 5, currentDepth = 0) {\n // Prevent deep comparisons that are too expensive\n if (currentDepth > maxDepth) {\n return a === b;\n }\n\n if (a === b) return true;\n if (a === null || b === null || a === undefined || b === undefined) return false;\n if (typeof a !== typeof b) return false;\n\n if (typeof a === 'function') {\n // Functions are compared by reference\n return a === b;\n }\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n return a.every((item, i) => isEqual(item, b[i], maxDepth, currentDepth + 1));\n }\n\n if (typeof a === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every(key =>\n keysB.includes(key) &&\n isEqual(a[key], b[key], maxDepth, currentDepth + 1)\n );\n }\n\n return false;\n}\n\n/**\n * Create a frozen (immutable) version of a component\n */\nexport function freeze(obj) {\n if (obj && typeof obj === 'object') {\n Object.freeze(obj);\n\n // Recursively freeze nested objects\n Object.values(obj).forEach(value => {\n if (value && typeof value === 'object') {\n freeze(value);\n }\n });\n }\n\n return obj;\n}\n\n/**\n * Check if component tree contains circular references\n */\nexport function hasCircularReferences(obj, seen = new WeakSet()) {\n if (obj && typeof obj === 'object') {\n if (seen.has(obj)) {\n return true;\n }\n\n seen.add(obj);\n\n for (const value of Object.values(obj)) {\n if (hasCircularReferences(value, seen)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Get memory footprint estimate of a component tree\n */\nexport function getMemoryFootprint(obj, visited = new WeakSet()) {\n if (obj === null || obj === undefined) return 0;\n if (visited.has(obj)) return 0;\n\n let size = 0;\n\n if (typeof obj === 'string') {\n size = obj.length * 2; // Rough estimate: 2 bytes per character\n } else if (typeof obj === 'number') {\n size = 8; // 64-bit number\n } else if (typeof obj === 'boolean') {\n size = 4; // Boolean\n } else if (typeof obj === 'object') {\n visited.add(obj);\n size = 48; // Base object overhead\n\n if (Array.isArray(obj)) {\n size += obj.length * 8; // Array overhead\n obj.forEach(item => {\n size += getMemoryFootprint(item, visited);\n });\n } else {\n Object.keys(obj).forEach(key => {\n size += key.length * 2; // Key string\n size += getMemoryFootprint(obj[key], visited);\n });\n }\n }\n\n return size;\n}\n", "/**\n * Enhanced Performance Monitoring System\n *\n * Provides comprehensive performance monitoring with:\n * - Custom metrics\n * - Sampling strategies\n * - Automated reporting\n * - Alert rules\n * - Resource monitoring\n * - Performance budgets\n */\n\n/**\n * Create an enhanced performance monitor\n *\n * @param {Object} options - Configuration options\n * @param {boolean} [options.enabled=true] - Enable monitoring\n * @param {Object} [options.metrics] - Custom metrics configuration\n * @param {Object} [options.sampling] - Sampling strategy configuration\n * @param {Object} [options.reporting] - Automated reporting configuration\n * @param {Object} [options.alerts] - Alert rules configuration\n * @param {Object} [options.resources] - Resource monitoring configuration\n * @param {Object} [options.profiling] - Profiling configuration\n * @returns {Object} Enhanced performance monitor instance\n */\nexport function createPerformanceMonitor(options = {}) {\n const opts = {\n enabled: true,\n metrics: {\n custom: {}\n },\n sampling: {\n enabled: false,\n rate: 1.0,\n strategy: 'random'\n },\n reporting: {\n enabled: false,\n interval: 60000,\n format: 'json',\n batch: {\n enabled: false,\n maxSize: 100,\n flushInterval: 5000\n },\n onReport: null\n },\n alerts: {\n enabled: true,\n rules: []\n },\n resources: {\n enabled: false,\n track: ['memory'],\n interval: 1000\n },\n profiling: {\n enabled: false,\n mode: 'production',\n flamegraph: false,\n tracing: {\n enabled: false,\n sampleRate: 0.01\n }\n },\n ...options\n };\n\n // Ensure nested defaults are preserved\n opts.reporting.batch = {\n enabled: false,\n maxSize: 100,\n flushInterval: 5000,\n ...(options.reporting?.batch || {})\n };\n\n // Metrics storage\n const metrics = {\n builtin: {\n renderTime: { type: 'histogram', unit: 'ms', values: [] },\n componentCount: { type: 'counter', unit: 'renders', value: 0 },\n errorCount: { type: 'counter', unit: 'errors', value: 0 },\n memoryUsage: { type: 'gauge', unit: 'MB', values: [] }\n },\n custom: {}\n };\n\n // Initialize custom metrics\n Object.entries(opts.metrics.custom).forEach(([name, config]) => {\n metrics.custom[name] = {\n type: config.type || 'counter',\n unit: config.unit || '',\n threshold: config.threshold,\n values: config.type === 'histogram' ? [] : undefined,\n value: config.type === 'counter' || config.type === 'gauge' ? 0 : undefined\n };\n });\n\n // Sampling state\n const samplingState = {\n count: 0,\n sampled: 0,\n adaptiveRate: opts.sampling.rate\n };\n\n // Reporting state\n const reportingState = {\n batch: [],\n lastReport: Date.now(),\n reportTimer: null,\n flushTimer: null\n };\n\n // Alert state\n const alertState = {\n triggered: new Map(),\n history: []\n };\n\n // Resource monitoring state\n const resourceState = {\n samples: [],\n timer: null\n };\n\n // Profiling state\n const profilingState = {\n traces: [],\n flamegraphData: []\n };\n\n // Statistics\n const stats = {\n metricsRecorded: 0,\n sampleRate: opts.sampling.rate,\n reportsGenerated: 0,\n alertsTriggered: 0\n };\n\n /**\n * Check if event should be sampled\n */\n function shouldSample() {\n if (!opts.sampling.enabled) return true;\n\n samplingState.count++;\n\n if (opts.sampling.strategy === 'random') {\n return Math.random() < samplingState.adaptiveRate;\n } else if (opts.sampling.strategy === 'deterministic') {\n return samplingState.count % Math.ceil(1 / samplingState.adaptiveRate) === 0;\n } else if (opts.sampling.strategy === 'adaptive') {\n // Adaptive sampling based on recent metric values\n const recentRenderTimes = metrics.builtin.renderTime.values.slice(-10);\n if (recentRenderTimes.length > 0) {\n const avgTime = recentRenderTimes.reduce((a, b) => a + b, 0) / recentRenderTimes.length;\n // Sample more when performance is poor\n samplingState.adaptiveRate = avgTime > 16 ? Math.min(1.0, opts.sampling.rate * 2) : opts.sampling.rate;\n }\n return Math.random() < samplingState.adaptiveRate;\n }\n\n return true;\n }\n\n /**\n * Record a metric value\n */\n function recordMetric(name, value, metadata = {}) {\n if (!opts.enabled) return;\n if (!shouldSample()) return;\n\n stats.metricsRecorded++;\n\n // Check if it's a built-in metric\n const builtinMetric = metrics.builtin[name];\n if (builtinMetric) {\n if (builtinMetric.type === 'histogram') {\n builtinMetric.values.push(value);\n if (builtinMetric.values.length > 1000) {\n builtinMetric.values = builtinMetric.values.slice(-1000);\n }\n } else if (builtinMetric.type === 'counter') {\n builtinMetric.value += value;\n } else if (builtinMetric.type === 'gauge') {\n builtinMetric.values.push(value);\n if (builtinMetric.values.length > 100) {\n builtinMetric.values = builtinMetric.values.slice(-100);\n }\n }\n }\n\n // Check if it's a custom metric\n const customMetric = metrics.custom[name];\n if (customMetric) {\n if (customMetric.type === 'histogram') {\n customMetric.values = customMetric.values || [];\n customMetric.values.push(value);\n if (customMetric.values.length > 1000) {\n customMetric.values = customMetric.values.slice(-1000);\n }\n } else if (customMetric.type === 'counter') {\n customMetric.value = (customMetric.value || 0) + value;\n } else if (customMetric.type === 'gauge') {\n customMetric.values = customMetric.values || [];\n customMetric.values.push(value);\n if (customMetric.values.length > 100) {\n customMetric.values = customMetric.values.slice(-100);\n }\n }\n\n // Check threshold\n if (customMetric.threshold) {\n const currentValue = customMetric.type === 'histogram' || customMetric.type === 'gauge'\n ? customMetric.values[customMetric.values.length - 1]\n : customMetric.value;\n\n if (currentValue > customMetric.threshold) {\n checkAlerts(name, currentValue);\n }\n }\n }\n\n // Add to batch if enabled\n if (opts.reporting.enabled && opts.reporting.batch.enabled) {\n reportingState.batch.push({\n metric: name,\n value,\n metadata,\n timestamp: Date.now()\n });\n\n if (reportingState.batch.length >= opts.reporting.batch.maxSize) {\n flushBatch();\n }\n }\n\n // Check alerts\n checkAlerts(name, value);\n }\n\n /**\n * Check alert rules\n */\n function checkAlerts(metric, value) {\n if (!opts.alerts.enabled) return;\n\n opts.alerts.rules.forEach(rule => {\n if (rule.metric !== metric) return;\n\n let triggered = false;\n\n if (rule.condition === 'exceeds' && value > rule.threshold) {\n triggered = true;\n } else if (rule.condition === 'below' && value < rule.threshold) {\n triggered = true;\n } else if (rule.condition === 'equals' && value === rule.threshold) {\n triggered = true;\n }\n\n if (triggered) {\n const alertKey = `${rule.metric}-${rule.condition}-${rule.threshold}`;\n const lastTriggered = alertState.triggered.get(alertKey);\n const now = Date.now();\n\n // Debounce alerts (don't trigger same alert within 5 seconds)\n if (!lastTriggered || now - lastTriggered > 5000) {\n alertState.triggered.set(alertKey, now);\n alertState.history.push({\n rule,\n value,\n timestamp: now\n });\n stats.alertsTriggered++;\n\n if (rule.action) {\n rule.action(value, rule);\n }\n }\n }\n });\n }\n\n /**\n * Flush batch of metrics\n */\n function flushBatch() {\n if (reportingState.batch.length === 0) return;\n\n const batch = [...reportingState.batch];\n reportingState.batch = [];\n\n if (opts.reporting.onReport) {\n opts.reporting.onReport({ type: 'batch', data: batch });\n }\n }\n\n /**\n * Generate a performance report\n */\n function generateReport() {\n const report = {\n timestamp: Date.now(),\n statistics: { ...stats },\n metrics: {}\n };\n\n // Built-in metrics\n Object.entries(metrics.builtin).forEach(([name, metric]) => {\n if (metric.type === 'histogram') {\n report.metrics[name] = {\n type: 'histogram',\n unit: metric.unit,\n count: metric.values.length,\n min: metric.values.length > 0 ? Math.min(...metric.values) : 0,\n max: metric.values.length > 0 ? Math.max(...metric.values) : 0,\n avg: metric.values.length > 0\n ? metric.values.reduce((a, b) => a + b, 0) / metric.values.length\n : 0,\n p50: percentile(metric.values, 0.5),\n p95: percentile(metric.values, 0.95),\n p99: percentile(metric.values, 0.99)\n };\n } else if (metric.type === 'counter') {\n report.metrics[name] = {\n type: 'counter',\n unit: metric.unit,\n value: metric.value\n };\n } else if (metric.type === 'gauge') {\n report.metrics[name] = {\n type: 'gauge',\n unit: metric.unit,\n current: metric.values.length > 0 ? metric.values[metric.values.length - 1] : 0,\n avg: metric.values.length > 0\n ? metric.values.reduce((a, b) => a + b, 0) / metric.values.length\n : 0\n };\n }\n });\n\n // Custom metrics\n Object.entries(metrics.custom).forEach(([name, metric]) => {\n if (metric.type === 'histogram') {\n report.metrics[name] = {\n type: 'histogram',\n unit: metric.unit,\n count: metric.values?.length || 0,\n min: metric.values?.length > 0 ? Math.min(...metric.values) : 0,\n max: metric.values?.length > 0 ? Math.max(...metric.values) : 0,\n avg: metric.values?.length > 0\n ? metric.values.reduce((a, b) => a + b, 0) / metric.values.length\n : 0,\n p95: percentile(metric.values || [], 0.95),\n p99: percentile(metric.values || [], 0.99)\n };\n } else if (metric.type === 'counter') {\n report.metrics[name] = {\n type: 'counter',\n unit: metric.unit,\n value: metric.value || 0\n };\n } else if (metric.type === 'gauge') {\n report.metrics[name] = {\n type: 'gauge',\n unit: metric.unit,\n current: metric.values?.length > 0 ? metric.values[metric.values.length - 1] : 0,\n avg: metric.values?.length > 0\n ? metric.values.reduce((a, b) => a + b, 0) / metric.values.length\n : 0\n };\n }\n });\n\n // Alerts\n report.alerts = {\n total: alertState.history.length,\n recent: alertState.history.slice(-10)\n };\n\n // Resources\n if (opts.resources.enabled) {\n report.resources = {\n samples: resourceState.samples.slice(-20)\n };\n }\n\n stats.reportsGenerated++;\n\n if (opts.reporting.onReport) {\n opts.reporting.onReport({ type: 'report', data: report });\n }\n\n return report;\n }\n\n /**\n * Calculate percentile\n */\n function percentile(values, p) {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.ceil(sorted.length * p) - 1;\n return sorted[Math.max(0, index)];\n }\n\n /**\n * Start resource monitoring\n */\n function startResourceMonitoring() {\n if (!opts.resources.enabled) return;\n\n const collectResources = () => {\n const sample = {\n timestamp: Date.now()\n };\n\n if (opts.resources.track.includes('memory')) {\n if (typeof process !== 'undefined' && process.memoryUsage) {\n const mem = process.memoryUsage();\n sample.memory = {\n heapUsed: mem.heapUsed / 1024 / 1024,\n heapTotal: mem.heapTotal / 1024 / 1024,\n external: mem.external / 1024 / 1024,\n rss: mem.rss / 1024 / 1024\n };\n } else if (typeof performance !== 'undefined' && performance.memory) {\n sample.memory = {\n heapUsed: performance.memory.usedJSHeapSize / 1024 / 1024,\n heapTotal: performance.memory.totalJSHeapSize / 1024 / 1024\n };\n }\n }\n\n resourceState.samples.push(sample);\n if (resourceState.samples.length > 100) {\n resourceState.samples = resourceState.samples.slice(-100);\n }\n\n resourceState.timer = setTimeout(collectResources, opts.resources.interval);\n };\n\n collectResources();\n }\n\n /**\n * Stop resource monitoring\n */\n function stopResourceMonitoring() {\n if (resourceState.timer) {\n clearTimeout(resourceState.timer);\n resourceState.timer = null;\n }\n }\n\n /**\n * Start automated reporting\n */\n function startReporting() {\n if (!opts.reporting.enabled) return;\n\n reportingState.reportTimer = setInterval(() => {\n generateReport();\n }, opts.reporting.interval);\n\n if (opts.reporting.batch.enabled) {\n reportingState.flushTimer = setInterval(() => {\n flushBatch();\n }, opts.reporting.batch.flushInterval);\n }\n }\n\n /**\n * Stop automated reporting\n */\n function stopReporting() {\n if (reportingState.reportTimer) {\n clearInterval(reportingState.reportTimer);\n reportingState.reportTimer = null;\n }\n if (reportingState.flushTimer) {\n clearInterval(reportingState.flushTimer);\n reportingState.flushTimer = null;\n }\n flushBatch(); // Flush remaining batch\n }\n\n /**\n * Start profiling\n */\n function startProfiling() {\n if (!opts.profiling.enabled) return;\n // Profiling implementation would hook into render pipeline\n }\n\n /**\n * Record a trace\n */\n function recordTrace(name, duration, metadata = {}) {\n if (!opts.profiling.enabled || !opts.profiling.tracing.enabled) return;\n\n if (Math.random() < opts.profiling.tracing.sampleRate) {\n profilingState.traces.push({\n name,\n duration,\n metadata,\n timestamp: Date.now()\n });\n\n if (profilingState.traces.length > 1000) {\n profilingState.traces = profilingState.traces.slice(-1000);\n }\n }\n }\n\n /**\n * Measure execution time\n */\n function measure(name, fn, metadata = {}) {\n if (!opts.enabled) return fn();\n\n const start = performance.now();\n try {\n const result = fn();\n const duration = performance.now() - start;\n\n recordMetric('renderTime', duration, { name, ...metadata });\n recordTrace(name, duration, metadata);\n\n return result;\n } catch (error) {\n recordMetric('errorCount', 1, { name, error: error.message });\n throw error;\n }\n }\n\n /**\n * Measure async execution time\n */\n async function measureAsync(name, fn, metadata = {}) {\n if (!opts.enabled) return fn();\n\n const start = performance.now();\n try {\n const result = await fn();\n const duration = performance.now() - start;\n\n recordMetric('renderTime', duration, { name, ...metadata });\n recordTrace(name, duration, metadata);\n\n return result;\n } catch (error) {\n recordMetric('errorCount', 1, { name, error: error.message });\n throw error;\n }\n }\n\n /**\n * Add a custom metric\n */\n function addMetric(name, config) {\n metrics.custom[name] = {\n type: config.type || 'counter',\n unit: config.unit || '',\n threshold: config.threshold,\n values: config.type === 'histogram' ? [] : undefined,\n value: config.type === 'counter' || config.type === 'gauge' ? 0 : undefined\n };\n }\n\n /**\n * Add an alert rule\n */\n function addAlertRule(rule) {\n opts.alerts.rules.push(rule);\n }\n\n /**\n * Get current statistics\n */\n function getStats() {\n return {\n ...stats,\n sampleRate: samplingState.adaptiveRate,\n batchSize: reportingState.batch.length,\n resourceSamples: resourceState.samples.length,\n traces: profilingState.traces.length,\n alerts: {\n total: alertState.history.length,\n unique: alertState.triggered.size\n }\n };\n }\n\n /**\n * Reset all metrics\n */\n function reset() {\n // Reset built-in metrics\n Object.values(metrics.builtin).forEach(metric => {\n if (metric.type === 'histogram' || metric.type === 'gauge') {\n metric.values = [];\n } else if (metric.type === 'counter') {\n metric.value = 0;\n }\n });\n\n // Reset custom metrics\n Object.values(metrics.custom).forEach(metric => {\n if (metric.type === 'histogram' || metric.type === 'gauge') {\n metric.values = [];\n } else if (metric.type === 'counter') {\n metric.value = 0;\n }\n });\n\n // Reset state\n samplingState.count = 0;\n samplingState.sampled = 0;\n reportingState.batch = [];\n alertState.history = [];\n alertState.triggered.clear();\n resourceState.samples = [];\n profilingState.traces = [];\n\n // Reset stats\n stats.metricsRecorded = 0;\n stats.reportsGenerated = 0;\n stats.alertsTriggered = 0;\n }\n\n // Start monitoring\n if (opts.enabled) {\n startResourceMonitoring();\n startReporting();\n startProfiling();\n }\n\n return {\n recordMetric,\n measure,\n measureAsync,\n addMetric,\n addAlertRule,\n generateReport,\n getStats,\n reset,\n start() {\n opts.enabled = true;\n startResourceMonitoring();\n startReporting();\n startProfiling();\n },\n stop() {\n opts.enabled = false;\n stopResourceMonitoring();\n stopReporting();\n return generateReport();\n }\n };\n}\n\n// Export default instance\nexport const performanceMonitor = createPerformanceMonitor();\n", "/**\n * Base Renderer Class\n * Provides common functionality shared across all Coherent.js renderers\n * Reduces code duplication and ensures consistent behavior\n */\n\nimport {\n validateComponent,\n isCoherentObject,\n extractProps,\n hasChildren,\n normalizeChildren,\n} from '../core/object-utils.js';\n\nimport { performanceMonitor } from '../performance/monitor.js';\n\n/**\n * Unified configuration for all Coherent.js renderers\n * Includes options for HTML, Streaming, and DOM renderers\n */\nexport const DEFAULT_RENDERER_CONFIG = {\n // Core rendering options\n maxDepth: 100,\n enableValidation: true,\n enableMonitoring: false,\n validateInput: true,\n\n // HTML Renderer specific options\n enableCache: true,\n minify: false,\n cacheSize: 1000,\n cacheTTL: 300000, // 5 minutes\n\n // Streaming Renderer specific options\n chunkSize: 1024, // Size of each chunk in bytes\n bufferSize: 4096, // Internal buffer size\n enableMetrics: false, // Track streaming metrics\n yieldThreshold: 100, // Yield control after N elements\n encoding: 'utf8', // Output encoding\n\n // DOM Renderer specific options\n enableHydration: true, // Enable hydration support\n namespace: null, // SVG namespace support\n\n // Performance options\n enablePerformanceTracking: false,\n performanceThreshold: 10, // ms threshold for slow renders\n\n // Development options\n enableDevWarnings: typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development',\n enableDebugLogging: false,\n\n // Error handling options\n errorFallback: '', // Fallback content on errors\n throwOnError: true, // Whether to throw or return fallback\n};\n\n/**\n * Base renderer class with common functionality\n */\nexport class BaseRenderer {\n constructor(options = {}) {\n this.config = this.validateAndMergeConfig(options);\n this.metrics = {\n startTime: null,\n endTime: null,\n elementsProcessed: 0\n };\n }\n\n /**\n * Validate and merge configuration options\n */\n validateAndMergeConfig(options) {\n const config = { ...DEFAULT_RENDERER_CONFIG, ...options };\n \n // Validate critical options\n if (typeof config.maxDepth !== 'number') {\n throw new Error('maxDepth must be a number');\n }\n if (config.maxDepth <= 0) {\n throw new Error('maxDepth must be a positive number');\n }\n \n if (typeof config.chunkSize !== 'number') {\n throw new Error('chunkSize must be a number');\n }\n if (config.chunkSize <= 0) {\n throw new Error('chunkSize must be a positive number');\n }\n \n if (typeof config.yieldThreshold !== 'number') {\n throw new Error('yieldThreshold must be a number');\n }\n if (config.yieldThreshold <= 0) {\n throw new Error('yieldThreshold must be a positive number');\n }\n \n // Warn about potentially problematic configurations\n if (config.enableDevWarnings) {\n if (config.maxDepth > 1000) {\n console.warn('Coherent.js: maxDepth > 1000 may cause performance issues');\n }\n \n if (config.chunkSize > 16384) {\n console.warn('Coherent.js: Large chunkSize may increase memory usage');\n }\n }\n \n return config;\n }\n\n /**\n * Get configuration for specific renderer type\n */\n getRendererConfig(rendererType) {\n const baseConfig = { ...this.config };\n \n switch (rendererType) {\n case 'html':\n return {\n ...baseConfig,\n // HTML-specific defaults\n enableCache: baseConfig.enableCache !== false,\n enableMonitoring: baseConfig.enableMonitoring !== false\n };\n \n case 'streaming':\n return {\n ...baseConfig,\n // Streaming-specific defaults\n enableMetrics: baseConfig.enableMetrics ?? false,\n maxDepth: baseConfig.maxDepth ?? 1000 // Higher default for streaming\n };\n \n case 'dom':\n return {\n ...baseConfig,\n // DOM-specific defaults\n enableHydration: baseConfig.enableHydration !== false\n };\n \n default:\n return baseConfig;\n }\n }\n\n /**\n * Validate component structure\n */\n validateComponent(component) {\n if (this.config.validateInput !== false) {\n return validateComponent(component);\n }\n return true;\n }\n\n /**\n * Check if component is valid for rendering\n */\n isValidComponent(component) {\n if (component === null || component === undefined) return true;\n if (typeof component === 'string' || typeof component === 'number') return true;\n if (typeof component === 'function') return true;\n if (Array.isArray(component)) return component.every(child => this.isValidComponent(child));\n if (isCoherentObject(component)) return true;\n return false;\n }\n\n /**\n * Validate rendering depth to prevent stack overflow\n */\n validateDepth(depth) {\n if (depth > this.config.maxDepth) {\n throw new Error(`Maximum render depth (${this.config.maxDepth}) exceeded`);\n }\n }\n\n /**\n * Handle different component types with consistent logic\n */\n processComponentType(component) {\n // Null/undefined\n if (component === null || component === undefined) {\n return { type: 'empty', value: '' };\n }\n\n // String\n if (typeof component === 'string') {\n return { type: 'text', value: component };\n }\n\n // Number/Boolean\n if (typeof component === 'number' || typeof component === 'boolean') {\n return { type: 'text', value: String(component) };\n }\n\n // Function\n if (typeof component === 'function') {\n return { type: 'function', value: component };\n }\n\n // Array\n if (Array.isArray(component)) {\n return { type: 'array', value: component };\n }\n\n // Object (Coherent element)\n if (isCoherentObject(component)) {\n return { type: 'element', value: component };\n }\n\n // Unknown type\n return { type: 'unknown', value: component };\n }\n\n /**\n * Execute function components with _error handling\n */\n executeFunctionComponent(func, depth = 0) {\n try {\n // Check if this is a context provider by checking function arity or a marker\n const isContextProvider = func.length > 0 || func.isContextProvider;\n \n let result;\n if (isContextProvider) {\n // Call with render function for context providers\n result = func((children) => {\n return this.renderComponent(children, this.config, depth + 1);\n });\n } else {\n // Regular function component\n result = func();\n }\n \n // Handle case where function returns another function\n if (typeof result === 'function') {\n return this.executeFunctionComponent(result, depth);\n }\n \n return result;\n } catch (_error) {\n if (this.config.enableMonitoring) {\n performanceMonitor.recordError('functionComponent', _error);\n }\n \n // In development, provide detailed _error info\n if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development') {\n console.warn('Coherent.js Function Component Error:', _error.message);\n }\n \n return null;\n }\n }\n\n /**\n * Process element children consistently\n */\n processChildren(children, options, depth) {\n if (!hasChildren({ children })) {\n return [];\n }\n\n const normalizedChildren = normalizeChildren(children);\n return normalizedChildren.map(child => \n this.renderComponent(child, options, depth + 1)\n );\n }\n\n /**\n * Extract and process element attributes\n */\n extractElementAttributes(props) {\n if (!props || typeof props !== 'object') return {};\n\n const attributes = { ...props };\n delete attributes.children;\n delete attributes.text;\n return attributes;\n }\n\n /**\n * Record performance metrics\n */\n recordPerformance(operation, startTime, fromCache = false, metadata = {}) {\n if (this.config.enableMonitoring) {\n performanceMonitor.recordRender(\n operation,\n this.getCurrentTime() - startTime,\n fromCache,\n metadata\n );\n }\n }\n\n /**\n * Record _error for monitoring\n */\n recordError(operation, _error, metadata = {}) {\n if (this.config.enableMonitoring) {\n performanceMonitor.recordError(operation, _error, metadata);\n }\n }\n\n /**\n * Get current timestamp with fallback\n */\n getCurrentTime() {\n if (typeof performance !== 'undefined' && performance.now) {\n return performance.now();\n }\n return Date.now();\n }\n\n /**\n * Start performance timing\n */\n startTiming() {\n this.metrics.startTime = this.getCurrentTime();\n }\n\n /**\n * End performance timing\n */\n endTiming() {\n this.metrics.endTime = this.getCurrentTime();\n }\n\n /**\n * Get performance metrics\n */\n getMetrics() {\n const duration = this.metrics.endTime ? \n this.metrics.endTime - this.metrics.startTime :\n this.getCurrentTime() - this.metrics.startTime;\n\n return {\n ...this.metrics,\n duration,\n elementsPerSecond: this.metrics.elementsProcessed / (duration / 1000)\n };\n }\n\n /**\n * Reset metrics for new render\n */\n resetMetrics() {\n this.metrics = {\n startTime: null,\n endTime: null,\n elementsProcessed: 0\n };\n }\n\n /**\n * Abstract method - must be implemented by subclasses\n */\n renderComponent() {\n throw new Error('renderComponent must be implemented by subclass');\n }\n\n /**\n * Abstract method - must be implemented by subclasses\n */\n render() {\n throw new Error('render must be implemented by subclass');\n }\n}\n\n/**\n * Utility functions for renderer implementations\n */\nexport const RendererUtils = {\n /**\n * Check if element is static (no functions)\n */\n isStaticElement(element) {\n if (!element || typeof element !== 'object') {\n return typeof element === 'string' || typeof element === 'number';\n }\n\n // Check if element has any dynamic content\n for (const [key, value] of Object.entries(element)) {\n if (typeof value === 'function') return false;\n\n if (key === 'children' && Array.isArray(value)) {\n // Recursively check children for dynamic content\n return value.every(child => RendererUtils.isStaticElement(child));\n }\n\n if (key === 'children' && typeof value === 'object' && value !== null) {\n return RendererUtils.isStaticElement(value);\n }\n }\n\n return true;\n },\n\n /**\n * Check if object has functions (for caching decisions)\n */\n hasFunctions(obj, visited = new WeakSet()) {\n if (visited.has(obj)) return false;\n visited.add(obj);\n\n for (const value of Object.values(obj)) {\n if (typeof value === 'function') return true;\n if (typeof value === 'object' && value !== null && RendererUtils.hasFunctions(value, visited)) {\n return true;\n }\n }\n return false;\n },\n\n /**\n * Get element complexity score\n */\n getElementComplexity(element) {\n if (!element || typeof element !== 'object') return 1;\n\n let complexity = Object.keys(element).length;\n\n if (element.children && Array.isArray(element.children)) {\n complexity += element.children.reduce(\n (sum, child) => sum + RendererUtils.getElementComplexity(child),\n 0\n );\n }\n\n return complexity;\n },\n\n /**\n * Generate cache key for element\n */\n generateCacheKey(tagName, element) {\n try {\n // Create a stable cache key for the element\n const keyData = {\n tag: tagName,\n props: extractProps(element),\n hasChildren: hasChildren(element),\n childrenType: Array.isArray(element.children) ? 'array' : typeof element.children\n };\n\n return `element:${JSON.stringify(keyData)}`;\n } catch (_error) {\n // Log _error in development mode\n if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development') {\n console.warn('Failed to generate cache key:', _error);\n }\n // Return null to indicate uncacheable element\n return null;\n }\n },\n\n /**\n * Check if element is cacheable\n */\n isCacheable(element, options) {\n // Don't cache if caching is disabled\n if (!options.enableCache) return false;\n\n // Don't cache elements with functions (dynamic content)\n if (RendererUtils.hasFunctions(element)) return false;\n\n // Don't cache very large elements (memory consideration)\n if (RendererUtils.getElementComplexity(element) > 1000) return false;\n\n // Don't cache if we can't generate a stable cache key\n const cacheKey = RendererUtils.generateCacheKey(element.tagName || 'unknown', element);\n if (!cacheKey) return false;\n\n return true;\n }\n};\n\nexport default BaseRenderer;\n", "/**\n * HTML-specific utility functions\n */\n\nexport function escapeHtml(text) {\n if (typeof text !== 'string') return text;\n\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport function unescapeHtml(text) {\n if (typeof text !== 'string') return text;\n\n return text\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/>/g, '>')\n .replace(/</g, '<')\n .replace(/&/g, '&');\n}\n\nexport function isVoidElement(tagName) {\n // Ensure tagName is a string before processing\n if (typeof tagName !== 'string') {\n return false;\n }\n\n const voidElements = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n ]);\n return voidElements.has(tagName.toLowerCase());\n}\n\nexport function formatAttributes(props) {\n let formatted = '';\n for (const key in props) {\n if (props.hasOwnProperty(key)) {\n let value = props[key];\n\n // Convert className to class for HTML output\n const attributeName = key === 'className' ? 'class' : key;\n\n // Handle function values - for event handlers, use data-action attributes\n if (typeof value === 'function') {\n // Check if this is an event handler (starts with 'on')\n if (attributeName.startsWith('on')) {\n // For event handlers, create a unique action identifier\n const actionId = `__coherent_action_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const DEBUG = (typeof process !== 'undefined' && process && process.env && (process.env.COHERENT_DEBUG === '1' || process.env.NODE_ENV === 'development'))\n || (typeof window !== 'undefined' && window && window.COHERENT_DEBUG === true);\n \n // Store the function in a global registry that will be available during hydration\n // Check if we're in Node.js or browser environment\n if (typeof global !== 'undefined') {\n // Server-side, store in global for hydration\n if (!global.__coherentActionRegistry) {\n global.__coherentActionRegistry = {};\n if (DEBUG) console.log('Initialized global action registry');\n }\n global.__coherentActionRegistry[actionId] = value;\n if (DEBUG) console.log(`Added action ${actionId} to global registry, total: ${Object.keys(global.__coherentActionRegistry).length}`);\n if (DEBUG) console.log(`Global registry keys: ${Object.keys(global.__coherentActionRegistry).join(', ')}`);\n \n // Log the global object to see if it's being reset\n if (DEBUG) {\n if (typeof global.__coherentActionRegistryLog === 'undefined') {\n global.__coherentActionRegistryLog = [];\n }\n global.__coherentActionRegistryLog.push({\n action: 'add',\n actionId: actionId,\n timestamp: Date.now(),\n registrySize: Object.keys(global.__coherentActionRegistry).length\n });\n }\n } else if (typeof window !== 'undefined') {\n // Browser-side, store in window\n if (!window.__coherentActionRegistry) {\n window.__coherentActionRegistry = {};\n if (DEBUG) console.log('Initialized window action registry');\n }\n window.__coherentActionRegistry[actionId] = value;\n if (DEBUG) console.log(`Added action ${actionId} to window registry, total: ${Object.keys(window.__coherentActionRegistry).length}`);\n if (DEBUG) console.log(`Window registry keys: ${Object.keys(window.__coherentActionRegistry).join(', ')}`);\n }\n \n // Use data-action and data-event attributes instead of inline JS\n const eventType = attributeName.substring(2); // Remove 'on' prefix\n formatted += ` data-action=\"${actionId}\" data-event=\"${eventType}\"`;\n continue; // Skip normal processing\n } else {\n // For other function attributes, call them to get the value\n try {\n value = value();\n } catch (_error) {\n console.warn(`Error executing function for attribute '${key}':`, {\n _error: _error.message,\n stack: _error.stack,\n attributeKey: key,\n });\n // Consider different fallback strategies based on attribute type\n value = '';\n }\n }\n }\n\n if (value === true) {\n formatted += ` ${attributeName}`;\n } else if (value !== false && value !== null && value !== undefined) {\n formatted += ` ${attributeName}=\"${escapeHtml(String(value))}\"`;\n }\n }\n }\n return formatted.trim();\n}\n\nexport function minifyHtml(html, options = {}) {\n if (!options.minify) return html;\n\n return (\n html\n // Remove comments\n .replace(/<!--[\\s\\S]*?-->/g, '')\n // Remove extra whitespace\n .replace(/\\s+/g, ' ')\n // Remove whitespace around tags\n .replace(/>\\s+</g, '><')\n // Remove leading/trailing whitespace\n .trim()\n );\n}\n\n/**\n * HTML Void Elements - elements that cannot have children\n * These elements are self-closing and don't need closing tags\n */\nexport const voidElements = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n", "/**\n * Advanced caching system with memory management and smart invalidation for Coherent.js\n * \n * @module @coherent/performance/cache-manager\n * @license MIT\n */\n\n/**\n * @typedef {Object} CacheEntry\n * @property {any} value - The cached value\n * @property {number} timestamp - When the entry was created\n * @property {number} lastAccess - Last access time\n * @property {number} size - Approximate size in bytes\n * @property {Object} metadata - Additional metadata\n * @property {number} accessCount - Number of times accessed\n */\n\n/**\n * @typedef {Object} CacheStats\n * @property {number} hits - Number of cache hits\n * @property {number} misses - Number of cache misses\n * @property {number} size - Current cache size in bytes\n * @property {number} entries - Number of cache entries\n * @property {Record<string, number>} hitRate - Hit rate by cache type\n */\n\n/**\n * @typedef {Object} CacheOptions\n * @property {number} [maxCacheSize=1000] - Maximum number of entries per cache type\n * @property {number} [maxMemoryMB=100] - Maximum memory usage in MB\n * @property {number} [ttlMs=300000] - Default time-to-live in milliseconds (5 minutes)\n * @property {boolean} [enableStatistics=true] - Whether to collect usage statistics\n */\n\n/**\n * Creates a new CacheManager instance\n * @param {CacheOptions} [options] - Configuration options\n * @returns {Object} Cache manager instance\n */\nexport function createCacheManager(options = {}) {\n const {\n maxCacheSize = 1000,\n maxMemoryMB = 100,\n ttlMs = 1000 * 60 * 5, // 5 minutes\n enableStatistics = true\n } = options;\n\n // Internal state\n const caches = {\n static: new Map(), // Never-changing components\n component: new Map(), // Component results with deps\n template: new Map(), // Template strings\n data: new Map() // General purpose data\n };\n\n let memoryUsage = 0;\n const stats = {\n hits: 0,\n misses: 0,\n hitRate: {\n static: 0,\n component: 0,\n template: 0,\n data: 0\n },\n accessCount: {\n static: 0,\n component: 0,\n template: 0,\n data: 0\n }\n };\n\n // Cleanup interval (doesn't keep Node.js process alive)\n let cleanupInterval;\n if (typeof setInterval === 'function') {\n cleanupInterval = setInterval(() => cleanup(), 30000);\n if (cleanupInterval.unref) {\n cleanupInterval.unref();\n }\n }\n\n /**\n * Generate a cache key from component and props\n * @param {any} component - Component or component name\n * @param {Object} [props={}] - Component props\n * @param {Object} [context={}] - Additional context\n * @returns {string} Cache key\n */\n function generateCacheKey(component, props = {}, context = {}) {\n const componentStr = typeof component === 'function'\n ? component.name || component.toString()\n : JSON.stringify(component);\n\n const propsStr = JSON.stringify(props, Object.keys(props).sort());\n const contextStr = JSON.stringify(context);\n const hash = simpleHash(componentStr + propsStr + contextStr);\n \n return `${extractComponentName(component)}_${hash}`;\n }\n\n /**\n * Get a value from the cache\n * @param {string} key - Cache key\n * @param {string} [type='component'] - Cache type\n * @returns {any|null} Cached value or null if not found\n */\n function get(key, type = 'component') {\n const cache = caches[type] || caches.component;\n const entry = cache.get(key);\n\n if (!entry) {\n stats.misses++;\n if (enableStatistics) stats.accessCount[type]++;\n return null;\n }\n\n // Check TTL\n if (Date.now() - entry.timestamp > ttlMs) {\n cache.delete(key);\n updateMemoryUsage(-entry.size);\n stats.misses++;\n if (enableStatistics) stats.accessCount[type]++;\n return null;\n }\n\n // Update access time and stats\n entry.lastAccess = Date.now();\n entry.accessCount++;\n stats.hits++;\n if (enableStatistics) {\n stats.accessCount[type]++;\n stats.hitRate[type] = (stats.hits / (stats.hits + stats.misses)) * 100;\n }\n\n return entry.value;\n }\n\n /**\n * Store a value in the cache\n * @param {string} key - Cache key\n * @param {any} value - Value to cache\n * @param {string} [type='component'] - Cache type\n * @param {Object} [metadata={}] - Additional metadata\n */\n function set(key, value, type = 'component', metadata = {}) {\n const cache = caches[type] || caches.component;\n const size = calculateSize(value);\n\n // Check memory limits\n if (memoryUsage + size > maxMemoryMB * 1024 * 1024) {\n optimize(type, size);\n }\n\n const entry = {\n value,\n timestamp: Date.now(),\n lastAccess: Date.now(),\n size,\n metadata,\n accessCount: 0\n };\n\n // Remove existing entry if it exists\n const existing = cache.get(key);\n if (existing) {\n updateMemoryUsage(-existing.size);\n }\n\n cache.set(key, entry);\n updateMemoryUsage(size);\n\n // Enforce cache size limits\n if (cache.size > maxCacheSize) {\n optimize(type);\n }\n }\n\n /**\n * Remove an entry from the cache\n * @param {string} key - Cache key\n * @param {string} [type] - Cache type (optional, checks all caches if not provided)\n * @returns {boolean} True if an entry was removed\n */\n function remove(key, type) {\n if (type) {\n const cache = caches[type];\n if (!cache) return false;\n \n const entry = cache.get(key);\n if (entry) {\n updateMemoryUsage(-entry.size);\n return cache.delete(key);\n }\n return false;\n }\n\n // Check all caches if no type specified\n for (const [, cache] of Object.entries(caches)) {\n const entry = cache.get(key);\n if (entry) {\n updateMemoryUsage(-entry.size);\n return cache.delete(key);\n }\n }\n return false;\n }\n\n /**\n * Clear all caches or a specific cache type\n * @param {string} [type] - Cache type to clear (optional, clears all if not provided)\n */\n function clear(type) {\n if (type) {\n const cache = caches[type];\n if (cache) {\n cache.clear();\n }\n } else {\n Object.values(caches).forEach(cache => cache.clear());\n }\n memoryUsage = 0;\n }\n\n /**\n * Get cache statistics\n * @returns {CacheStats} Cache statistics\n */\n function getStats() {\n const entries = Object.values(caches).reduce((sum, cache) => sum + cache.size, 0);\n \n return {\n hits: stats.hits,\n misses: stats.misses,\n size: memoryUsage,\n entries,\n hitRate: stats.hitRate,\n accessCount: stats.accessCount\n };\n }\n\n /**\n * Clean up expired entries\n */\n function cleanup() {\n const now = Date.now();\n let freed = 0;\n\n for (const [, cache] of Object.entries(caches)) {\n for (const [key, entry] of cache.entries()) {\n if (now - entry.timestamp > ttlMs) {\n cache.delete(key);\n updateMemoryUsage(-entry.size);\n freed++;\n }\n }\n }\n\n return { freed };\n }\n\n // Internal helper functions\n function calculateSize(value) {\n if (value === null || value === undefined) return 0;\n if (typeof value === 'string') return value.length * 2; // UTF-16\n if (typeof value === 'number') return 8; // 64-bit float\n if (typeof value === 'boolean') return 4;\n if (Array.isArray(value)) {\n return value.reduce((sum, item) => sum + calculateSize(item), 0);\n }\n if (typeof value === 'object') {\n return Object.values(value).reduce((sum, val) => sum + calculateSize(val), 0);\n }\n return 0;\n }\n\n function updateMemoryUsage(delta) {\n memoryUsage = Math.max(0, memoryUsage + delta);\n }\n\n function optimize(type, requiredSpace = 0) {\n const cache = caches[type] || caches.component;\n const entries = Array.from(cache.entries())\n .sort(([, a], [, b]) => a.lastAccess - b.lastAccess);\n\n let freed = 0;\n for (const [key, entry] of entries) {\n if (freed >= requiredSpace) break;\n \n cache.delete(key);\n updateMemoryUsage(-entry.size);\n freed += entry.size;\n }\n\n return { freed };\n }\n\n function simpleHash(str) {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(36);\n }\n\n function extractComponentName(component) {\n if (typeof component === 'function') {\n return component.name || 'AnonymousComponent';\n }\n if (component && typeof component === 'object') {\n const keys = Object.keys(component);\n return keys.length > 0 ? keys[0] : 'ObjectComponent';\n }\n return 'UnknownComponent';\n }\n\n // Clean up on destroy\n function destroy() {\n if (cleanupInterval) {\n clearInterval(cleanupInterval);\n }\n clear();\n }\n\n // Public API\n return {\n get,\n set,\n remove,\n clear,\n getStats,\n cleanup,\n destroy,\n generateCacheKey,\n get memoryUsage() {\n return memoryUsage;\n },\n get maxMemory() {\n return maxMemoryMB * 1024 * 1024;\n }\n };\n}\n\n// Create a default instance for convenience\nexport const cacheManager = createCacheManager();\n", "/**\n * CSS Management System for Coherent.js\n * Handles CSS file inclusion, inline styles, and optimization\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\n/**\n * CSS Manager Class\n * Handles CSS file loading, processing, and injection\n */\nexport class CSSManager {\n constructor(options = {}) {\n this.options = {\n basePath: process.cwd(),\n minify: false,\n cache: true,\n autoprefixer: false,\n ...options\n };\n \n this.cache = new Map();\n this.loadedFiles = new Set();\n }\n \n /**\n * Load CSS file content\n */\n async loadCSSFile(filePath) {\n const fullPath = path.resolve(this.options.basePath, filePath);\n const cacheKey = fullPath;\n \n // Return cached content if available\n if (this.options.cache && this.cache.has(cacheKey)) {\n return this.cache.get(cacheKey);\n }\n \n try {\n let content = await fs.readFile(fullPath, 'utf8');\n \n // Basic minification if enabled\n if (this.options.minify) {\n content = this.minifyCSS(content);\n }\n \n // Cache the content\n if (this.options.cache) {\n this.cache.set(cacheKey, content);\n }\n \n this.loadedFiles.add(filePath);\n return content;\n } catch (_error) {\n console.warn(`Failed to load CSS file: ${filePath}`, _error.message);\n return '';\n }\n }\n \n /**\n * Load multiple CSS files\n */\n async loadCSSFiles(filePaths) {\n if (!Array.isArray(filePaths)) {\n filePaths = [filePaths];\n }\n \n const cssContents = await Promise.all(\n filePaths.map(filePath => this.loadCSSFile(filePath))\n );\n \n return cssContents.join('\\n');\n }\n \n /**\n * Generate CSS link tags for external files\n */\n generateCSSLinks(filePaths, baseUrl = '/') {\n if (!Array.isArray(filePaths)) {\n filePaths = [filePaths];\n }\n \n return filePaths\n .map(filePath => {\n const href = filePath.startsWith('http') \n ? filePath \n : `${baseUrl}${filePath}`.replace(/\\/+/g, '/');\n \n return `<link rel=\"stylesheet\" href=\"${this.escapeHtml(href)}\" />`;\n })\n .join('\\n');\n }\n \n /**\n * Generate inline style tag with CSS content\n */\n generateInlineStyles(cssContent) {\n if (!cssContent) return '';\n \n return `<style type=\"text/css\">\\n${cssContent}\\n</style>`;\n }\n \n /**\n * Basic CSS minification\n */\n minifyCSS(css) {\n return css\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // Remove comments\n .replace(/\\s+/g, ' ') // Collapse whitespace\n .replace(/;\\s*}/g, '}') // Remove last semicolon in blocks\n .replace(/{\\s+/g, '{') // Remove space after opening brace\n .replace(/;\\s+/g, ';') // Remove space after semicolons\n .trim();\n }\n \n /**\n * Escape HTML entities\n */\n escapeHtml(text) {\n const div = { textContent: text };\n return div.innerHTML || text;\n }\n \n /**\n * Clear cache\n */\n clearCache() {\n this.cache.clear();\n this.loadedFiles.clear();\n }\n \n /**\n * Get loaded file list\n */\n getLoadedFiles() {\n return Array.from(this.loadedFiles);\n }\n}\n\n/**\n * Default CSS Manager instance\n */\nexport const defaultCSSManager = new CSSManager();\n\n/**\n * CSS processing utilities\n */\nexport const cssUtils = {\n /**\n * Process CSS options from render options\n */\n processCSSOptions(options = {}) {\n const {\n css = {},\n cssFiles = [],\n inlineCSS = '',\n cssLinks = [],\n cssBasePath = process.cwd(),\n cssMinify = false\n } = options;\n \n return {\n files: Array.isArray(cssFiles) ? cssFiles : [cssFiles].filter(Boolean),\n inline: inlineCSS || css.inline || '',\n links: Array.isArray(cssLinks) ? cssLinks : [cssLinks].filter(Boolean),\n basePath: css.basePath || cssBasePath,\n minify: css.minify || cssMinify,\n loadInline: css.loadInline !== false // default true\n };\n },\n \n /**\n * Generate complete CSS HTML for head section\n */\n async generateCSSHtml(cssOptions, cssManager = defaultCSSManager) {\n const cssHtmlParts = [];\n \n // Process external CSS links\n if (cssOptions.links.length > 0) {\n cssHtmlParts.push(cssManager.generateCSSLinks(cssOptions.links));\n }\n \n // Process CSS files (inline or as links)\n if (cssOptions.files.length > 0) {\n if (cssOptions.loadInline) {\n // Load and inline CSS files\n const cssContent = await cssManager.loadCSSFiles(cssOptions.files);\n if (cssContent) {\n cssHtmlParts.push(cssManager.generateInlineStyles(cssContent));\n }\n } else {\n // Generate link tags for CSS files\n cssHtmlParts.push(cssManager.generateCSSLinks(cssOptions.files));\n }\n }\n \n // Process inline CSS\n if (cssOptions.inline) {\n cssHtmlParts.push(cssManager.generateInlineStyles(cssOptions.inline));\n }\n \n return cssHtmlParts.join('\\n');\n }\n};\n\n/**\n * Create a new CSS Manager instance\n */\nexport function createCSSManager(options = {}) {\n return new CSSManager(options);\n}", "/**\n * High-performance HTML renderer with caching, monitoring, and streaming support\n * Converts object-based components to HTML strings with advanced optimizations\n */\n\nimport { BaseRenderer, RendererUtils } from './base-renderer.js';\nimport {\n hasChildren,\n normalizeChildren,\n} from '../core/object-utils.js';\n\nimport {\n escapeHtml,\n isVoidElement,\n formatAttributes,\n minifyHtml\n} from '../core/html-utils.js';\n\nimport { performanceMonitor } from '../performance/monitor.js';\nimport { createCacheManager } from '../performance/cache-manager.js';\nimport { cssUtils, defaultCSSManager } from './css-manager.js';\n\n// Create a global cache instance for the renderer\nconst rendererCache = createCacheManager({\n maxSize: 1000,\n ttlMs: 300000 // 5 minutes\n});\n\n/**\n * HTML Renderer Class extending BaseRenderer\n * \n * @class HTMLRenderer\n * @extends BaseRenderer\n * @description High-performance HTML renderer with caching, monitoring, and streaming support.\n * Converts object-based components to HTML strings with advanced optimizations.\n * \n * @param {Object} [options={}] - Renderer configuration options\n * @param {boolean} [options.enableCache=true] - Enable component caching\n * @param {boolean} [options.enableMonitoring=true] - Enable performance monitoring\n * @param {boolean} [options.minify=false] - Enable HTML minification\n * @param {boolean} [options.streaming=false] - Enable streaming mode\n * @param {number} [options.maxDepth=100] - Maximum rendering depth\n * @param {number} [options.cacheSize=1000] - Cache size limit\n * @param {number} [options.cacheTTL=300000] - Cache TTL in milliseconds\n * \n * @example\n * const renderer = new HTMLRenderer({\n * enableCache: true,\n * enableMonitoring: true,\n * minify: true\n * });\n * \n * const html = renderer.render({ div: { text: 'Hello World' } });\n */\nclass HTMLRenderer extends BaseRenderer {\n constructor(options = {}) {\n super({\n enableCache: options.enableCache !== false,\n enableMonitoring: options.enableMonitoring !== false,\n minify: options.minify || false,\n streaming: options.streaming || false,\n maxDepth: options.maxDepth || 100,\n ...options\n });\n \n // Initialize cache if enabled\n if (this.config.enableCache && !this.cache) {\n this.cache = rendererCache;\n }\n }\n\n /**\n * Main render method - converts components to HTML string\n * \n * @param {Object|Array|string|Function} component - Component to render\n * @param {Object} [options={}] - Rendering options\n * @param {Object} [options.context] - Rendering context\n * @param {boolean} [options.enableCache] - Override cache setting\n * @param {number} [options.depth=0] - Current rendering depth\n * @returns {string} Rendered HTML string\n * \n * @example\n * const html = renderer.render({\n * div: {\n * className: 'container',\n * children: [\n * { h1: { text: 'Title' } },\n * { p: { text: 'Content' } }\n * ]\n * }\n * });\n */\n render(component, options = {}) {\n const config = { ...this.config, ...options };\n this.startTiming();\n\n try {\n // Input validation\n if (config.validateInput && !this.isValidComponent(component)) {\n throw new Error('Invalid component structure');\n }\n\n // Main rendering logic\n const html = this.renderComponent(component, config, 0);\n const finalHtml = config.minify ? minifyHtml(html, config) : html;\n\n // Performance monitoring\n this.endTiming();\n this.recordPerformance('render', this.metrics.startTime, false, {\n cacheEnabled: config.enableCache \n });\n\n return finalHtml;\n\n } catch (_error) {\n this.recordError('render', _error);\n throw _error;\n }\n }\n\n /**\n * Render a single component with full optimization pipeline\n */\n renderComponent(component, options, depth = 0) {\n // Use base class depth validation\n this.validateDepth(depth);\n \n // Use base class component type processing\n const { type, value } = this.processComponentType(component);\n \n switch (type) {\n case 'empty':\n return '';\n case 'text':\n return escapeHtml(value);\n case 'function':\n const result = this.executeFunctionComponent(value, depth);\n return this.renderComponent(result, options, depth + 1);\n case 'array':\n return value.map(child => this.renderComponent(child, options, depth + 1)).join('');\n case 'element':\n // Process object-based component\n const tagName = Object.keys(value)[0];\n const elementContent = value[tagName];\n return this.renderElement(tagName, elementContent, options, depth);\n default:\n this.recordError('renderComponent', new Error(`Unknown component type: ${type}`));\n return '';\n }\n }\n\n /**\n * Render an HTML element with advanced caching and optimization\n */\n renderElement(tagName, element, options, depth = 0) {\n const startTime = performance.now();\n\n // Track element usage for performance analysis (via stats in the new cache manager)\n if (options.enableMonitoring && this.cache) {\n // The new cache manager tracks usage automatically via get/set operations\n }\n\n // Check cache first for static elements\n if (options.enableCache && this.cache && RendererUtils.isStaticElement(element)) {\n const cacheKey = `static:${tagName}:${JSON.stringify(element)}`;\n const cached = this.cache.get('static', cacheKey);\n if (cached) {\n this.recordPerformance(tagName, startTime, true);\n return cached.value; // Return the cached HTML\n }\n }\n\n // Handle text-only elements including booleans\n if (typeof element === 'string' || typeof element === 'number' || typeof element === 'boolean') {\n const html = isVoidElement(tagName)\n ? `<${tagName}>`\n : `<${tagName}>${escapeHtml(String(element))}</${tagName}>`;\n\n this.cacheIfStatic(tagName, element, html, options);\n this.recordPerformance(tagName, startTime, false);\n return html;\n }\n\n // Handle function elements\n if (typeof element === 'function') {\n const result = this.executeFunctionComponent(element, depth);\n return this.renderElement(tagName, result, options, depth);\n }\n\n // Handle object elements (complex elements with props and children)\n if (element && typeof element === 'object') {\n return this.renderObjectElement(tagName, element, options, depth);\n }\n\n // Handle null and undefined by returning empty tags\n if (element === null || element === undefined) {\n const html = isVoidElement(tagName)\n ? `<${tagName}>`\n : `<${tagName}></${tagName}>`;\n this.recordPerformance(tagName, startTime, false);\n return html;\n }\n\n // Fallback for any other types\n const html = `<${tagName}>${escapeHtml(String(element))}</${tagName}>`;\n this.recordPerformance(tagName, startTime, false);\n return html;\n }\n\n /**\n * Cache element if it's static\n */\n cacheIfStatic(tagName, element, html) {\n if (this.config.enableCache && this.cache && RendererUtils.isStaticElement(element)) {\n const cacheKey = `static:${tagName}:${JSON.stringify(element)}`;\n this.cache.set('static', cacheKey, html, {\n ttlMs: this.config.cacheTTL || 5 * 60 * 1000, // 5 minutes default\n size: html.length // Approximate size\n });\n }\n }\n\n /**\n * Render complex object elements with attributes and children\n */\n renderObjectElement(tagName, element, options, depth = 0) {\n const startTime = performance.now();\n\n // Check component-level cache\n if (options.enableCache && this.cache) {\n const cacheKey = RendererUtils.generateCacheKey(tagName, element);\n if (cacheKey) {\n const cached = this.cache.get(cacheKey);\n if (cached) {\n this.recordPerformance(tagName, startTime, true);\n return cached;\n }\n }\n }\n\n // Extract props and children directly from element content\n const { children, text, ...attributes } = element || {};\n\n // Build opening tag with attributes\n const attributeString = formatAttributes(attributes);\n const openingTag = attributeString\n ? `<${tagName} ${attributeString}>`\n : `<${tagName}>`;\n\n // Handle text content\n let textContent = '';\n if (text !== undefined) {\n const isScript = tagName === 'script';\n const isStyle = tagName === 'style';\n const isRawTag = isScript || isStyle;\n const raw = typeof text === 'function' ? String(text()) : String(text);\n if (isRawTag) {\n // Prevent </script> or </style> early-terminating the tag\n const safe = raw\n .replace(/<\\/(script)/gi, '<\\\\/$1')\n .replace(/<\\/(style)/gi, '<\\\\/$1')\n // Escape problematic Unicode line separators in JS\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n textContent = safe;\n } else {\n textContent = escapeHtml(raw);\n }\n }\n\n // Handle children\n let childrenHtml = '';\n if (hasChildren(element)) {\n const normalizedChildren = normalizeChildren(children);\n childrenHtml = normalizedChildren\n .map(child => this.renderComponent(child, options, depth + 1))\n .join('');\n }\n\n // Build complete HTML\n const html = `${openingTag}${textContent}${childrenHtml}</${tagName}>`;\n\n // Cache the result if appropriate\n if (options.enableCache && this.cache && RendererUtils.isCacheable(element, options)) {\n const cacheKey = RendererUtils.generateCacheKey(tagName, element);\n if (cacheKey) {\n this.cache.set(cacheKey, html);\n }\n }\n\n this.recordPerformance(tagName, startTime, false);\n return html;\n }\n}\n\n// Note: globalCache is now imported from cache-manager.js\n\n/**\n * Main render function - converts object components to HTML\n */\nexport function render(component, options = {}) {\n // Merge default options with provided options\n const mergedOptions = {\n enableCache: true,\n enableMonitoring: false,\n ...options\n };\n \n const renderer = new HTMLRenderer(mergedOptions);\n return renderer.render(component, mergedOptions);\n}\n\n/**\n * Renders component to complete HTML document with DOCTYPE\n * Better alternative to manual DOCTYPE concatenation\n * Supports CSS file inclusion and inline styles\n */\nexport async function renderHTML(component, options = {}) {\n const htmlContent = render(component, options);\n \n // Process CSS options\n const cssOptions = cssUtils.processCSSOptions(options);\n \n // Generate CSS HTML if any CSS is specified\n let cssHtml = '';\n if (cssOptions.files.length > 0 || cssOptions.links.length > 0 || cssOptions.inline) {\n cssHtml = await cssUtils.generateCSSHtml(cssOptions, defaultCSSManager);\n }\n \n // If the component includes a head tag, inject CSS into it\n if (cssHtml && htmlContent.includes('<head>')) {\n const htmlWithCSS = htmlContent.replace(\n '</head>', \n `${cssHtml}\\n</head>`\n );\n return `<!DOCTYPE html>\\n${htmlWithCSS}`;\n }\n \n // If there's CSS but no head tag, wrap the component with a basic HTML structure\n if (cssHtml) {\n return `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n${cssHtml}\n</head>\n<body>\n${htmlContent}\n</body>\n</html>`;\n }\n \n return `<!DOCTYPE html>\\n${htmlContent}`;\n}\n\n/**\n * Synchronous version of render for cases without CSS files\n * Falls back to async if CSS files are detected\n */\nexport function renderHTMLSync(component, options = {}) {\n const cssOptions = cssUtils.processCSSOptions(options);\n \n // If CSS files are specified, return a promise\n if (cssOptions.files.length > 0) {\n console.warn('CSS files detected, use render() (async) instead of renderSync()');\n return render(component, options);\n }\n \n const htmlContent = render(component, options);\n \n // Handle inline CSS and external links only\n let cssHtml = '';\n if (cssOptions.links.length > 0) {\n cssHtml += defaultCSSManager.generateCSSLinks(cssOptions.links);\n }\n if (cssOptions.inline) {\n cssHtml += `\\n${ defaultCSSManager.generateInlineStyles(cssOptions.inline)}`;\n }\n \n if (cssHtml && htmlContent.includes('<head>')) {\n const htmlWithCSS = htmlContent.replace(\n '</head>', \n `${cssHtml}\\n</head>`\n );\n return `<!DOCTYPE html>\\n${htmlWithCSS}`;\n }\n \n if (cssHtml) {\n return `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n${cssHtml}\n</head>\n<body>\n${htmlContent}\n</body>\n</html>`;\n }\n \n return `<!DOCTYPE html>\\n${htmlContent}`;\n}\n\n\n// Old functions removed - now part of HTMLRenderer class\n\n// Old helper functions removed - now available in RendererUtils from BaseRenderer\n\n/**\n * Batch rendering for multiple components\n */\nexport function renderBatch(components, options = {}) {\n if (!Array.isArray(components)) {\n throw new Error('renderBatch expects an array of components');\n }\n\n // Merge default options with provided options\n const mergedOptions = {\n enableCache: true,\n enableMonitoring: false,\n ...options\n };\n\n const renderer = new HTMLRenderer(mergedOptions);\n return components.map(component => renderer.render(component, mergedOptions));\n}\n\n/**\n * Real streaming render - yields chunks progressively as HTML is generated\n * Ideal for large component trees or memory-constrained environments\n */\nexport async function* renderToStream(component, options = {}) {\n const config = {\n chunkSize: 8192, // 8KB default chunk size\n maxDepth: 1000,\n yieldThreshold: 100, // Yield control every 100 elements\n encoding: 'utf8',\n ...options\n };\n\n let buffer = '';\n let elementCount = 0;\n\n // Helper to flush buffer when it reaches chunk size\n async function* flushBuffer(force = false) {\n if (force || buffer.length >= config.chunkSize) {\n if (buffer.length > 0) {\n yield buffer;\n buffer = '';\n }\n }\n }\n\n // Helper to add to buffer\n async function* write(text) {\n buffer += text;\n yield* flushBuffer();\n }\n\n // Recursive streaming component renderer\n async function* streamComponent(comp, depth = 0) {\n if (depth > config.maxDepth) {\n throw new Error(`Maximum nesting depth exceeded: ${config.maxDepth}`);\n }\n\n // Handle null/undefined\n if (comp === null || comp === undefined) return;\n\n // Handle primitives\n if (typeof comp === 'string' || typeof comp === 'number') {\n yield* write(escapeHtml(String(comp)));\n return;\n }\n\n // Handle arrays\n if (Array.isArray(comp)) {\n for (const child of comp) {\n yield* streamComponent(child, depth);\n\n // Yield control periodically\n if (elementCount++ % config.yieldThreshold === 0) {\n await new Promise(resolve => setImmediate(resolve));\n }\n }\n return;\n }\n\n // Handle functions\n if (typeof comp === 'function') {\n const result = comp();\n yield* streamComponent(result, depth);\n return;\n }\n\n // Handle objects (HTML elements)\n if (typeof comp === 'object') {\n for (const [tagName, props] of Object.entries(comp)) {\n if (typeof props === 'object' && props !== null) {\n const { children, text, ...attributes } = props;\n const attrsStr = formatAttributes(attributes);\n const openTag = attrsStr ? `<${tagName} ${attrsStr}>` : `<${tagName}>`;\n\n if (isVoidElement(tagName)) {\n yield* write(openTag.replace('>', ' />'));\n elementCount++;\n return;\n }\n\n yield* write(openTag);\n\n if (text !== undefined) {\n yield* write(escapeHtml(String(text)));\n } else if (children) {\n yield* streamComponent(children, depth + 1);\n }\n\n yield* write(`</${tagName}>`);\n elementCount++;\n } else if (typeof props === 'string') {\n const content = escapeHtml(props);\n if (isVoidElement(tagName)) {\n yield* write(`<${tagName} />`);\n } else {\n yield* write(`<${tagName}>${content}</${tagName}>`);\n }\n elementCount++;\n }\n }\n }\n }\n\n // Start streaming\n try {\n yield* streamComponent(component);\n yield* flushBuffer(true); // Force flush remaining buffer\n } catch (error) {\n // Stream error as HTML comment\n yield `<!-- Streaming Error: ${error.message} -->`;\n }\n}\n\n/**\n * Streaming utilities for common use cases\n */\nexport const streamingUtils = {\n /**\n * Collect all chunks into a single string\n */\n async collectChunks(chunkGenerator) {\n let html = '';\n for await (const chunk of chunkGenerator) {\n html += chunk;\n }\n return html;\n },\n\n /**\n * Stream directly to a Node.js response\n */\n async streamToResponse(chunkGenerator, response) {\n let totalBytes = 0;\n response.setHeader('Content-Type', 'text/html; charset=utf-8');\n response.setHeader('Transfer-Encoding', 'chunked');\n\n for await (const chunk of chunkGenerator) {\n response.write(chunk);\n totalBytes += Buffer.byteLength(chunk);\n }\n\n response.end();\n return totalBytes;\n },\n\n /**\n * Stream with progress callback\n */\n async* streamWithProgress(chunkGenerator, onProgress) {\n let totalBytes = 0;\n let chunkCount = 0;\n\n for await (const chunk of chunkGenerator) {\n totalBytes += Buffer.byteLength(chunk);\n chunkCount++;\n\n if (onProgress) {\n onProgress({ chunkCount, totalBytes, chunk });\n }\n\n yield chunk;\n }\n }\n};\n\n/**\n * Render to chunks (legacy - kept for backward compatibility)\n * For true streaming, use renderToStream() instead\n */\nexport function* renderToChunks(component, options = {}) {\n const mergedOptions = {\n enableCache: true,\n enableMonitoring: false,\n ...options,\n chunkSize: options.chunkSize || 1024 // Default 1KB chunks\n };\n\n const html = render(component, mergedOptions);\n\n for (let i = 0; i < html.length; i += mergedOptions.chunkSize) {\n yield html.slice(i, i + mergedOptions.chunkSize);\n }\n}\n\n/**\n * Get global cache instance for external access\n */\nexport function getCache() {\n return rendererCache;\n}\n\n/**\n * Reset cache (useful for testing)\n */\nexport function resetCache() {\n if (rendererCache) {\n rendererCache.clear();\n }\n}\n\n/**\n * Get rendering statistics\n */\nexport function getRenderingStats() {\n return {\n cache: rendererCache ? rendererCache.getStats() : null,\n performance: performanceMonitor.getStats()\n };\n}\n\n/**\n * Precompile static components for maximum performance\n */\nexport function precompileComponent(component, options = {}) {\n if (!isStaticElement(component)) {\n throw new Error('Can only precompile static components');\n }\n\n const html = render(component, { ...options, enableCache: false });\n\n return {\n html,\n isPrecompiled: true,\n render: () => html\n };\n}\n\n/**\n * Development helper - render with detailed timing\n */\nexport function renderWithTiming(component, options = {}) {\n const start = performance.now();\n const html = render(component, { ...options, enableMonitoring: true });\n const end = performance.now();\n\n return {\n html,\n timing: {\n total: end - start,\n breakdown: performanceMonitor.getStats()\n }\n };\n}\n", "/**\n * Shared rendering utilities for framework integrations\n * Eliminates code duplication across Express, Fastify, Koa, Next.js integrations\n */\n\nimport { render } from '../rendering/html-renderer.js';\nimport { performanceMonitor } from '../performance/monitor.js';\n\n/**\n * Render a component with optional performance monitoring\n * This is the canonical rendering function used by all framework integrations\n * \n * @param {Object} component - Coherent.js component to render\n * @param {Object} options - Rendering options\n * @param {boolean} options.enablePerformanceMonitoring - Enable performance tracking\n * @param {string} options.template - HTML template with {{content}} placeholder\n * @returns {string} Rendered HTML\n */\nexport function renderWithMonitoring(component, options = {}) {\n const {\n enablePerformanceMonitoring = false\n } = options;\n\n let html;\n\n if (enablePerformanceMonitoring) {\n const renderId = performanceMonitor.startRender();\n html = render(component);\n performanceMonitor.endRender(renderId);\n } else {\n html = render(component);\n }\n\n return html;\n}\n\n/**\n * Render a component and apply an HTML template\n * \n * @param {Object} component - Coherent.js component to render\n * @param {Object} options - Rendering options\n * @param {boolean} options.enablePerformanceMonitoring - Enable performance tracking\n * @param {string} options.template - HTML template with {{content}} placeholder\n * @returns {string} Final HTML with template applied\n */\nexport function renderWithTemplate(component, options = {}) {\n const {\n template = '<!DOCTYPE html>\\n{{content}}'\n } = options;\n\n const html = renderWithMonitoring(component, options);\n return template.replace('{{content}}', html);\n}\n\n/**\n * Create a component factory handler for framework integrations\n * Handles component creation, rendering, and error handling\n * \n * @param {Function} componentFactory - Function that creates a component\n * @param {Object} factoryArgs - Arguments to pass to the component factory\n * @param {Object} options - Rendering options\n * @returns {Promise<string>} Rendered HTML\n * @throws {Error} If component factory returns null/undefined or rendering fails\n */\nexport async function renderComponentFactory(componentFactory, factoryArgs, options = {}) {\n // Create component with provided arguments\n const component = await Promise.resolve(\n componentFactory(...factoryArgs)\n );\n\n if (!component) {\n throw new Error('Component factory returned null/undefined');\n }\n\n // Render with template\n return renderWithTemplate(component, options);\n}\n\n/**\n * Check if an object is a Coherent.js component\n * A Coherent.js component is a plain object with a single key representing an HTML tag\n * \n * @param {any} obj - Object to check\n * @returns {boolean} True if object is a Coherent.js component\n */\nexport function isCoherentComponent(obj) {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return false;\n }\n\n const keys = Object.keys(obj);\n return keys.length === 1;\n}\n\n/**\n * Create a standardized error response for framework integrations\n * \n * @param {Error} error - The error that occurred\n * @param {string} context - Context where the error occurred\n * @returns {Object} Error response object\n */\nexport function createErrorResponse(error, context = 'rendering') {\n return {\n error: 'Internal Server Error',\n message: error.message,\n context,\n timestamp: new Date().toISOString()\n };\n}\n", "/**\n * Koa.js integration for Coherent.js\n * Provides middleware and utilities for using Coherent.js with Koa\n */\n\nimport { importPeerDependency } from '../../core/src/utils/dependency-utils.js';\nimport { \n renderWithTemplate, \n renderComponentFactory,\n isCoherentComponent \n} from '../../core/src/utils/render-utils.js';\n\n/**\n * Coherent.js Koa middleware\n * Automatically renders Coherent.js components and handles errors\n * \n * @param {Object} options - Configuration options\n * @param {boolean} options.enablePerformanceMonitoring - Enable performance monitoring\n * @param {string} options.template - HTML template with {{content}} placeholder\n * @returns {Function} Koa middleware function\n */\nexport function coherentKoaMiddleware(options = {}) {\n const {\n enablePerformanceMonitoring = false,\n template = '<!DOCTYPE html>\\n{{content}}'\n } = options;\n \n return async (ctx, next) => {\n await next();\n \n // If response body is a Coherent.js object, render it\n if (isCoherentComponent(ctx.body)) {\n try {\n // Use shared rendering utility\n const finalHtml = renderWithTemplate(ctx.body, { enablePerformanceMonitoring, template });\n \n // Set content type and body\n ctx.type = 'text/html';\n ctx.body = finalHtml;\n } catch (_error) {\n console.error('Coherent.js rendering _error:', _error);\n throw _error;\n }\n }\n };\n}\n\n/**\n * Create a Koa route handler for Coherent.js components\n * \n * @param {Function} componentFactory - Function that returns a Coherent.js component\n * @param {Object} options - Handler options\n * @returns {Function} Koa route handler\n */\nexport function createHandler(componentFactory, options = {}) {\n return async (ctx, next) => {\n try {\n // Use shared rendering utility\n const finalHtml = await renderComponentFactory(\n componentFactory,\n [ctx, next],\n options\n );\n \n // Set response\n ctx.type = 'text/html';\n ctx.body = finalHtml;\n } catch (_error) {\n console.error('Coherent.js handler _error:', _error);\n throw _error;\n }\n };\n}\n\n/**\n * Setup Coherent.js with Koa app\n * \n * @param {Object} app - Koa app instance\n * @param {Object} options - Setup options\n */\nexport function setupCoherent(app, options = {}) {\n const {\n useMiddleware = true,\n enablePerformanceMonitoring = false\n } = options;\n \n // Use middleware for automatic rendering\n if (useMiddleware) {\n app.use(coherentKoaMiddleware({ enablePerformanceMonitoring }));\n }\n}\n\n/**\n * Create Koa integration with dependency checking\n * This function ensures Koa is available before setting up the integration\n * \n * @param {Object} options - Setup options\n * @returns {Promise<Function>} - Function to setup Koa integration\n */\nexport async function createKoaIntegration(options = {}) {\n try {\n // Verify Koa is available\n await importPeerDependency('koa', 'Koa.js');\n \n return function(app) {\n if (!app || typeof app.use !== 'function') {\n throw new Error('Invalid Koa app instance provided');\n }\n \n setupCoherent(app, options);\n return app;\n };\n } catch (_error) {\n throw _error;\n }\n}\n\n// Export all utilities\nexport default {\n coherentKoaMiddleware,\n createHandler,\n setupCoherent,\n createKoaIntegration\n};\n"],
|
|
5
|
-
"mappings": ";AA+BA,eAAsB,qBAAqB,aAAa,iBAAiB;AACvE,MAAI;AACF,WAAO,MAAM,OAAO;AAAA,EACtB,QAAQ;AACN,UAAM,IAAI;AAAA,MACR,GAAG,eAAe,8BAA8B,WAAW;AAAA,sCACpB,WAAW;AAAA,yBACxB,WAAW;AAAA,yBACX,WAAW;AAAA,IACvC;AAAA,EACF;AACF;;;AC0NO,SAAS,kBAAkB,WAAWA,QAAO,QAAQ;AACxD,MAAI,cAAc,QAAQ,cAAc,QAAW;AAC/C,UAAM,IAAI,MAAM,wBAAwBA,KAAI,qBAAqB;AAAA,EACrE;AAGA,MAAI,CAAC,UAAU,UAAU,SAAS,EAAE,SAAS,OAAO,SAAS,GAAG;AAC5D,WAAO;AAAA,EACX;AAGA,MAAI,OAAO,cAAc,YAAY;AACjC,WAAO;AAAA,EACX;AAGA,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC1B,cAAU,QAAQ,CAAC,OAAO,UAAU;AAChC,wBAAkB,OAAO,GAAGA,KAAI,IAAI,KAAK,GAAG;AAAA,IAChD,CAAC;AACD,WAAO;AAAA,EACX;AAGA,MAAI,OAAO,cAAc,UAAU;AAC/B,UAAM,OAAO,OAAO,KAAK,SAAS;AAElC,QAAI,KAAK,WAAW,GAAG;AACnB,YAAM,IAAI,MAAM,mBAAmBA,KAAI,EAAE;AAAA,IAC7C;AAEA,SAAK,QAAQ,SAAO;AAChB,YAAM,QAAQ,UAAU,GAAG;AAG3B,UAAI,CAAC,0BAA0B,KAAK,GAAG,KAAK,QAAQ,QAAQ;AACxD,gBAAQ,KAAK,mCAAmCA,KAAI,KAAK,GAAG,EAAE;AAAA,MAClE;AAGA,UAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAE7D,YAAI,MAAM,UAAU;AAChB,4BAAkB,MAAM,UAAU,GAAGA,KAAI,IAAI,GAAG,WAAW;AAAA,QAC/D;AAAA,MACJ,WAAW,SAAS,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY;AACvG,cAAM,IAAI,MAAM,yBAAyBA,KAAI,IAAI,GAAG,KAAK,OAAO,KAAK,EAAE;AAAA,MAC3E;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX;AAEA,QAAM,IAAI,MAAM,6BAA6BA,KAAI,KAAK,OAAO,SAAS,EAAE;AAC5E;AAKO,SAAS,iBAAiB,KAAK;AAClC,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG;AACvD,WAAO;AAAA,EACX;AAEA,QAAM,OAAO,OAAO,KAAK,GAAG;AAG5B,MAAI,KAAK,WAAW,GAAG;AACnB,WAAO;AAAA,EACX;AAGA,SAAO,KAAK,MAAM,SAAO;AAErB,QAAI,QAAQ,OAAQ,QAAO;AAG3B,WAAO,0BAA0B,KAAK,GAAG;AAAA,EAC7C,CAAC;AACL;AAKO,SAAS,aAAa,aAAa;AACtC,MAAI,CAAC,iBAAiB,WAAW,GAAG;AAChC,WAAO,CAAC;AAAA,EACZ;AAEA,QAAM,QAAQ,CAAC;AACf,QAAM,OAAO,OAAO,KAAK,WAAW;AAEpC,OAAK,QAAQ,SAAO;AAChB,UAAM,QAAQ,YAAY,GAAG;AAC7B,QAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC7D,YAAM,GAAG,IAAI,EAAE,GAAG,MAAM;AAAA,IAC5B,OAAO;AACH,YAAM,GAAG,IAAI,EAAE,MAAM,MAAM;AAAA,IAC/B;AAAA,EACJ,CAAC;AAED,SAAO;AACX;AAKO,SAAS,YAAY,WAAW;AACnC,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC1B,WAAO,UAAU,SAAS;AAAA,EAC9B;AAEA,MAAI,iBAAiB,SAAS,GAAG;AAE7B,QAAI,UAAU,aAAa,UAAa,UAAU,aAAa,MAAM;AACjE,aAAO,MAAM,QAAQ,UAAU,QAAQ,IAAI,UAAU,SAAS,SAAS,IAAI;AAAA,IAC/E;AAGA,UAAM,OAAO,OAAO,KAAK,SAAS;AAClC,WAAO,KAAK,KAAK,SAAO;AACpB,YAAM,QAAQ,UAAU,GAAG;AAC3B,aAAO,SAAS,OAAO,UAAU,YAAY,MAAM;AAAA,IACvD,CAAC;AAAA,EACL;AAEA,SAAO;AACX;AAKO,SAAS,kBAAkB,UAAU;AACxC,MAAI,aAAa,QAAQ,aAAa,QAAW;AAC7C,WAAO,CAAC;AAAA,EACZ;AAEA,MAAI,MAAM,QAAQ,QAAQ,GAAG;AACzB,WAAO,SAAS,KAAK,EAAE,OAAO,WAAS,UAAU,QAAQ,UAAU,MAAS;AAAA,EAChF;AAEA,SAAO,CAAC,QAAQ;AACpB;;;ACzXO,SAAS,yBAAyB,UAAU,CAAC,GAAG;AACrD,QAAM,OAAO;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,MACP,QAAQ,CAAC;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,eAAe;AAAA,MACjB;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,OAAO,CAAC;AAAA,IACV;AAAA,IACA,WAAW;AAAA,MACT,SAAS;AAAA,MACT,OAAO,CAAC,QAAQ;AAAA,MAChB,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,SAAS;AAAA,MACT,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,SAAS;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,GAAG;AAAA,EACL;AAGA,OAAK,UAAU,QAAQ;AAAA,IACrB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,eAAe;AAAA,IACf,GAAI,QAAQ,WAAW,SAAS,CAAC;AAAA,EACnC;AAGA,QAAM,UAAU;AAAA,IACd,SAAS;AAAA,MACP,YAAY,EAAE,MAAM,aAAa,MAAM,MAAM,QAAQ,CAAC,EAAE;AAAA,MACxD,gBAAgB,EAAE,MAAM,WAAW,MAAM,WAAW,OAAO,EAAE;AAAA,MAC7D,YAAY,EAAE,MAAM,WAAW,MAAM,UAAU,OAAO,EAAE;AAAA,MACxD,aAAa,EAAE,MAAM,SAAS,MAAM,MAAM,QAAQ,CAAC,EAAE;AAAA,IACvD;AAAA,IACA,QAAQ,CAAC;AAAA,EACX;AAGA,SAAO,QAAQ,KAAK,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,MAAM,MAAM;AAC9D,YAAQ,OAAO,IAAI,IAAI;AAAA,MACrB,MAAM,OAAO,QAAQ;AAAA,MACrB,MAAM,OAAO,QAAQ;AAAA,MACrB,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO,SAAS,cAAc,CAAC,IAAI;AAAA,MAC3C,OAAO,OAAO,SAAS,aAAa,OAAO,SAAS,UAAU,IAAI;AAAA,IACpE;AAAA,EACF,CAAC;AAGD,QAAM,gBAAgB;AAAA,IACpB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAc,KAAK,SAAS;AAAA,EAC9B;AAGA,QAAM,iBAAiB;AAAA,IACrB,OAAO,CAAC;AAAA,IACR,YAAY,KAAK,IAAI;AAAA,IACrB,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAGA,QAAM,aAAa;AAAA,IACjB,WAAW,oBAAI,IAAI;AAAA,IACnB,SAAS,CAAC;AAAA,EACZ;AAGA,QAAM,gBAAgB;AAAA,IACpB,SAAS,CAAC;AAAA,IACV,OAAO;AAAA,EACT;AAGA,QAAM,iBAAiB;AAAA,IACrB,QAAQ,CAAC;AAAA,IACT,gBAAgB,CAAC;AAAA,EACnB;AAGA,QAAM,QAAQ;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY,KAAK,SAAS;AAAA,IAC1B,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,EACnB;AAKA,WAAS,eAAe;AACtB,QAAI,CAAC,KAAK,SAAS,QAAS,QAAO;AAEnC,kBAAc;AAEd,QAAI,KAAK,SAAS,aAAa,UAAU;AACvC,aAAO,KAAK,OAAO,IAAI,cAAc;AAAA,IACvC,WAAW,KAAK,SAAS,aAAa,iBAAiB;AACrD,aAAO,cAAc,QAAQ,KAAK,KAAK,IAAI,cAAc,YAAY,MAAM;AAAA,IAC7E,WAAW,KAAK,SAAS,aAAa,YAAY;AAEhD,YAAM,oBAAoB,QAAQ,QAAQ,WAAW,OAAO,MAAM,GAAG;AACrE,UAAI,kBAAkB,SAAS,GAAG;AAChC,cAAM,UAAU,kBAAkB,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,kBAAkB;AAEjF,sBAAc,eAAe,UAAU,KAAK,KAAK,IAAI,GAAK,KAAK,SAAS,OAAO,CAAC,IAAI,KAAK,SAAS;AAAA,MACpG;AACA,aAAO,KAAK,OAAO,IAAI,cAAc;AAAA,IACvC;AAEA,WAAO;AAAA,EACT;AAKA,WAAS,aAAa,MAAM,OAAO,WAAW,CAAC,GAAG;AAChD,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,CAAC,aAAa,EAAG;AAErB,UAAM;AAGN,UAAM,gBAAgB,QAAQ,QAAQ,IAAI;AAC1C,QAAI,eAAe;AACjB,UAAI,cAAc,SAAS,aAAa;AACtC,sBAAc,OAAO,KAAK,KAAK;AAC/B,YAAI,cAAc,OAAO,SAAS,KAAM;AACtC,wBAAc,SAAS,cAAc,OAAO,MAAM,IAAK;AAAA,QACzD;AAAA,MACF,WAAW,cAAc,SAAS,WAAW;AAC3C,sBAAc,SAAS;AAAA,MACzB,WAAW,cAAc,SAAS,SAAS;AACzC,sBAAc,OAAO,KAAK,KAAK;AAC/B,YAAI,cAAc,OAAO,SAAS,KAAK;AACrC,wBAAc,SAAS,cAAc,OAAO,MAAM,IAAI;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe,QAAQ,OAAO,IAAI;AACxC,QAAI,cAAc;AAChB,UAAI,aAAa,SAAS,aAAa;AACrC,qBAAa,SAAS,aAAa,UAAU,CAAC;AAC9C,qBAAa,OAAO,KAAK,KAAK;AAC9B,YAAI,aAAa,OAAO,SAAS,KAAM;AACrC,uBAAa,SAAS,aAAa,OAAO,MAAM,IAAK;AAAA,QACvD;AAAA,MACF,WAAW,aAAa,SAAS,WAAW;AAC1C,qBAAa,SAAS,aAAa,SAAS,KAAK;AAAA,MACnD,WAAW,aAAa,SAAS,SAAS;AACxC,qBAAa,SAAS,aAAa,UAAU,CAAC;AAC9C,qBAAa,OAAO,KAAK,KAAK;AAC9B,YAAI,aAAa,OAAO,SAAS,KAAK;AACpC,uBAAa,SAAS,aAAa,OAAO,MAAM,IAAI;AAAA,QACtD;AAAA,MACF;AAGA,UAAI,aAAa,WAAW;AAC1B,cAAM,eAAe,aAAa,SAAS,eAAe,aAAa,SAAS,UAC5E,aAAa,OAAO,aAAa,OAAO,SAAS,CAAC,IAClD,aAAa;AAEjB,YAAI,eAAe,aAAa,WAAW;AACzC,sBAAY,MAAM,YAAY;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,UAAU,WAAW,KAAK,UAAU,MAAM,SAAS;AAC1D,qBAAe,MAAM,KAAK;AAAA,QACxB,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAED,UAAI,eAAe,MAAM,UAAU,KAAK,UAAU,MAAM,SAAS;AAC/D,mBAAW;AAAA,MACb;AAAA,IACF;AAGA,gBAAY,MAAM,KAAK;AAAA,EACzB;AAKA,WAAS,YAAY,QAAQ,OAAO;AAClC,QAAI,CAAC,KAAK,OAAO,QAAS;AAE1B,SAAK,OAAO,MAAM,QAAQ,UAAQ;AAChC,UAAI,KAAK,WAAW,OAAQ;AAE5B,UAAI,YAAY;AAEhB,UAAI,KAAK,cAAc,aAAa,QAAQ,KAAK,WAAW;AAC1D,oBAAY;AAAA,MACd,WAAW,KAAK,cAAc,WAAW,QAAQ,KAAK,WAAW;AAC/D,oBAAY;AAAA,MACd,WAAW,KAAK,cAAc,YAAY,UAAU,KAAK,WAAW;AAClE,oBAAY;AAAA,MACd;AAEA,UAAI,WAAW;AACb,cAAM,WAAW,GAAG,KAAK,MAAM,IAAI,KAAK,SAAS,IAAI,KAAK,SAAS;AACnE,cAAM,gBAAgB,WAAW,UAAU,IAAI,QAAQ;AACvD,cAAM,MAAM,KAAK,IAAI;AAGrB,YAAI,CAAC,iBAAiB,MAAM,gBAAgB,KAAM;AAChD,qBAAW,UAAU,IAAI,UAAU,GAAG;AACtC,qBAAW,QAAQ,KAAK;AAAA,YACtB;AAAA,YACA;AAAA,YACA,WAAW;AAAA,UACb,CAAC;AACD,gBAAM;AAEN,cAAI,KAAK,QAAQ;AACf,iBAAK,OAAO,OAAO,IAAI;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAKA,WAAS,aAAa;AACpB,QAAI,eAAe,MAAM,WAAW,EAAG;AAEvC,UAAM,QAAQ,CAAC,GAAG,eAAe,KAAK;AACtC,mBAAe,QAAQ,CAAC;AAExB,QAAI,KAAK,UAAU,UAAU;AAC3B,WAAK,UAAU,SAAS,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC;AAAA,IACxD;AAAA,EACF;AAKA,WAAS,iBAAiB;AACxB,UAAM,SAAS;AAAA,MACb,WAAW,KAAK,IAAI;AAAA,MACpB,YAAY,EAAE,GAAG,MAAM;AAAA,MACvB,SAAS,CAAC;AAAA,IACZ;AAGA,WAAO,QAAQ,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,MAAM,MAAM,MAAM;AAC1D,UAAI,OAAO,SAAS,aAAa;AAC/B,eAAO,QAAQ,IAAI,IAAI;AAAA,UACrB,MAAM;AAAA,UACN,MAAM,OAAO;AAAA,UACb,OAAO,OAAO,OAAO;AAAA,UACrB,KAAK,OAAO,OAAO,SAAS,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,IAAI;AAAA,UAC7D,KAAK,OAAO,OAAO,SAAS,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,IAAI;AAAA,UAC7D,KAAK,OAAO,OAAO,SAAS,IACxB,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO,OAAO,SACzD;AAAA,UACJ,KAAK,WAAW,OAAO,QAAQ,GAAG;AAAA,UAClC,KAAK,WAAW,OAAO,QAAQ,IAAI;AAAA,UACnC,KAAK,WAAW,OAAO,QAAQ,IAAI;AAAA,QACrC;AAAA,MACF,WAAW,OAAO,SAAS,WAAW;AACpC,eAAO,QAAQ,IAAI,IAAI;AAAA,UACrB,MAAM;AAAA,UACN,MAAM,OAAO;AAAA,UACb,OAAO,OAAO;AAAA,QAChB;AAAA,MACF,WAAW,OAAO,SAAS,SAAS;AAClC,eAAO,QAAQ,IAAI,IAAI;AAAA,UACrB,MAAM;AAAA,UACN,MAAM,OAAO;AAAA,UACb,SAAS,OAAO,OAAO,SAAS,IAAI,OAAO,OAAO,OAAO,OAAO,SAAS,CAAC,IAAI;AAAA,UAC9E,KAAK,OAAO,OAAO,SAAS,IACxB,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO,OAAO,SACzD;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAGD,WAAO,QAAQ,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,MAAM,MAAM;AACzD,UAAI,OAAO,SAAS,aAAa;AAC/B,eAAO,QAAQ,IAAI,IAAI;AAAA,UACrB,MAAM;AAAA,UACN,MAAM,OAAO;AAAA,UACb,OAAO,OAAO,QAAQ,UAAU;AAAA,UAChC,KAAK,OAAO,QAAQ,SAAS,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,IAAI;AAAA,UAC9D,KAAK,OAAO,QAAQ,SAAS,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,IAAI;AAAA,UAC9D,KAAK,OAAO,QAAQ,SAAS,IACzB,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO,OAAO,SACzD;AAAA,UACJ,KAAK,WAAW,OAAO,UAAU,CAAC,GAAG,IAAI;AAAA,UACzC,KAAK,WAAW,OAAO,UAAU,CAAC,GAAG,IAAI;AAAA,QAC3C;AAAA,MACF,WAAW,OAAO,SAAS,WAAW;AACpC,eAAO,QAAQ,IAAI,IAAI;AAAA,UACrB,MAAM;AAAA,UACN,MAAM,OAAO;AAAA,UACb,OAAO,OAAO,SAAS;AAAA,QACzB;AAAA,MACF,WAAW,OAAO,SAAS,SAAS;AAClC,eAAO,QAAQ,IAAI,IAAI;AAAA,UACrB,MAAM;AAAA,UACN,MAAM,OAAO;AAAA,UACb,SAAS,OAAO,QAAQ,SAAS,IAAI,OAAO,OAAO,OAAO,OAAO,SAAS,CAAC,IAAI;AAAA,UAC/E,KAAK,OAAO,QAAQ,SAAS,IACzB,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO,OAAO,SACzD;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAGD,WAAO,SAAS;AAAA,MACd,OAAO,WAAW,QAAQ;AAAA,MAC1B,QAAQ,WAAW,QAAQ,MAAM,GAAG;AAAA,IACtC;AAGA,QAAI,KAAK,UAAU,SAAS;AAC1B,aAAO,YAAY;AAAA,QACjB,SAAS,cAAc,QAAQ,MAAM,GAAG;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM;AAEN,QAAI,KAAK,UAAU,UAAU;AAC3B,WAAK,UAAU,SAAS,EAAE,MAAM,UAAU,MAAM,OAAO,CAAC;AAAA,IAC1D;AAEA,WAAO;AAAA,EACT;AAKA,WAAS,WAAW,QAAQ,GAAG;AAC7B,QAAI,OAAO,WAAW,EAAG,QAAO;AAChC,UAAM,SAAS,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC/C,UAAM,QAAQ,KAAK,KAAK,OAAO,SAAS,CAAC,IAAI;AAC7C,WAAO,OAAO,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EAClC;AAKA,WAAS,0BAA0B;AACjC,QAAI,CAAC,KAAK,UAAU,QAAS;AAE7B,UAAM,mBAAmB,MAAM;AAC7B,YAAM,SAAS;AAAA,QACb,WAAW,KAAK,IAAI;AAAA,MACtB;AAEA,UAAI,KAAK,UAAU,MAAM,SAAS,QAAQ,GAAG;AAC3C,YAAI,OAAO,YAAY,eAAe,QAAQ,aAAa;AACzD,gBAAM,MAAM,QAAQ,YAAY;AAChC,iBAAO,SAAS;AAAA,YACd,UAAU,IAAI,WAAW,OAAO;AAAA,YAChC,WAAW,IAAI,YAAY,OAAO;AAAA,YAClC,UAAU,IAAI,WAAW,OAAO;AAAA,YAChC,KAAK,IAAI,MAAM,OAAO;AAAA,UACxB;AAAA,QACF,WAAW,OAAO,gBAAgB,eAAe,YAAY,QAAQ;AACnE,iBAAO,SAAS;AAAA,YACd,UAAU,YAAY,OAAO,iBAAiB,OAAO;AAAA,YACrD,WAAW,YAAY,OAAO,kBAAkB,OAAO;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAEA,oBAAc,QAAQ,KAAK,MAAM;AACjC,UAAI,cAAc,QAAQ,SAAS,KAAK;AACtC,sBAAc,UAAU,cAAc,QAAQ,MAAM,IAAI;AAAA,MAC1D;AAEA,oBAAc,QAAQ,WAAW,kBAAkB,KAAK,UAAU,QAAQ;AAAA,IAC5E;AAEA,qBAAiB;AAAA,EACnB;AAKA,WAAS,yBAAyB;AAChC,QAAI,cAAc,OAAO;AACvB,mBAAa,cAAc,KAAK;AAChC,oBAAc,QAAQ;AAAA,IACxB;AAAA,EACF;AAKA,WAAS,iBAAiB;AACxB,QAAI,CAAC,KAAK,UAAU,QAAS;AAE7B,mBAAe,cAAc,YAAY,MAAM;AAC7C,qBAAe;AAAA,IACjB,GAAG,KAAK,UAAU,QAAQ;AAE1B,QAAI,KAAK,UAAU,MAAM,SAAS;AAChC,qBAAe,aAAa,YAAY,MAAM;AAC5C,mBAAW;AAAA,MACb,GAAG,KAAK,UAAU,MAAM,aAAa;AAAA,IACvC;AAAA,EACF;AAKA,WAAS,gBAAgB;AACvB,QAAI,eAAe,aAAa;AAC9B,oBAAc,eAAe,WAAW;AACxC,qBAAe,cAAc;AAAA,IAC/B;AACA,QAAI,eAAe,YAAY;AAC7B,oBAAc,eAAe,UAAU;AACvC,qBAAe,aAAa;AAAA,IAC9B;AACA,eAAW;AAAA,EACb;AAKA,WAAS,iBAAiB;AACxB,QAAI,CAAC,KAAK,UAAU,QAAS;AAAA,EAE/B;AAKA,WAAS,YAAY,MAAM,UAAU,WAAW,CAAC,GAAG;AAClD,QAAI,CAAC,KAAK,UAAU,WAAW,CAAC,KAAK,UAAU,QAAQ,QAAS;AAEhE,QAAI,KAAK,OAAO,IAAI,KAAK,UAAU,QAAQ,YAAY;AACrD,qBAAe,OAAO,KAAK;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAED,UAAI,eAAe,OAAO,SAAS,KAAM;AACvC,uBAAe,SAAS,eAAe,OAAO,MAAM,IAAK;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAKA,WAAS,QAAQ,MAAM,IAAI,WAAW,CAAC,GAAG;AACxC,QAAI,CAAC,KAAK,QAAS,QAAO,GAAG;AAE7B,UAAM,QAAQ,YAAY,IAAI;AAC9B,QAAI;AACF,YAAM,SAAS,GAAG;AAClB,YAAM,WAAW,YAAY,IAAI,IAAI;AAErC,mBAAa,cAAc,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;AAC1D,kBAAY,MAAM,UAAU,QAAQ;AAEpC,aAAO;AAAA,IACT,SAAS,OAAO;AACd,mBAAa,cAAc,GAAG,EAAE,MAAM,OAAO,MAAM,QAAQ,CAAC;AAC5D,YAAM;AAAA,IACR;AAAA,EACF;AAKA,iBAAe,aAAa,MAAM,IAAI,WAAW,CAAC,GAAG;AACnD,QAAI,CAAC,KAAK,QAAS,QAAO,GAAG;AAE7B,UAAM,QAAQ,YAAY,IAAI;AAC9B,QAAI;AACF,YAAM,SAAS,MAAM,GAAG;AACxB,YAAM,WAAW,YAAY,IAAI,IAAI;AAErC,mBAAa,cAAc,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;AAC1D,kBAAY,MAAM,UAAU,QAAQ;AAEpC,aAAO;AAAA,IACT,SAAS,OAAO;AACd,mBAAa,cAAc,GAAG,EAAE,MAAM,OAAO,MAAM,QAAQ,CAAC;AAC5D,YAAM;AAAA,IACR;AAAA,EACF;AAKA,WAAS,UAAU,MAAM,QAAQ;AAC/B,YAAQ,OAAO,IAAI,IAAI;AAAA,MACrB,MAAM,OAAO,QAAQ;AAAA,MACrB,MAAM,OAAO,QAAQ;AAAA,MACrB,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO,SAAS,cAAc,CAAC,IAAI;AAAA,MAC3C,OAAO,OAAO,SAAS,aAAa,OAAO,SAAS,UAAU,IAAI;AAAA,IACpE;AAAA,EACF;AAKA,WAAS,aAAa,MAAM;AAC1B,SAAK,OAAO,MAAM,KAAK,IAAI;AAAA,EAC7B;AAKA,WAAS,WAAW;AAClB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY,cAAc;AAAA,MAC1B,WAAW,eAAe,MAAM;AAAA,MAChC,iBAAiB,cAAc,QAAQ;AAAA,MACvC,QAAQ,eAAe,OAAO;AAAA,MAC9B,QAAQ;AAAA,QACN,OAAO,WAAW,QAAQ;AAAA,QAC1B,QAAQ,WAAW,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAKA,WAAS,QAAQ;AAEf,WAAO,OAAO,QAAQ,OAAO,EAAE,QAAQ,YAAU;AAC/C,UAAI,OAAO,SAAS,eAAe,OAAO,SAAS,SAAS;AAC1D,eAAO,SAAS,CAAC;AAAA,MACnB,WAAW,OAAO,SAAS,WAAW;AACpC,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF,CAAC;AAGD,WAAO,OAAO,QAAQ,MAAM,EAAE,QAAQ,YAAU;AAC9C,UAAI,OAAO,SAAS,eAAe,OAAO,SAAS,SAAS;AAC1D,eAAO,SAAS,CAAC;AAAA,MACnB,WAAW,OAAO,SAAS,WAAW;AACpC,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF,CAAC;AAGD,kBAAc,QAAQ;AACtB,kBAAc,UAAU;AACxB,mBAAe,QAAQ,CAAC;AACxB,eAAW,UAAU,CAAC;AACtB,eAAW,UAAU,MAAM;AAC3B,kBAAc,UAAU,CAAC;AACzB,mBAAe,SAAS,CAAC;AAGzB,UAAM,kBAAkB;AACxB,UAAM,mBAAmB;AACzB,UAAM,kBAAkB;AAAA,EAC1B;AAGA,MAAI,KAAK,SAAS;AAChB,4BAAwB;AACxB,mBAAe;AACf,mBAAe;AAAA,EACjB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AACN,WAAK,UAAU;AACf,8BAAwB;AACxB,qBAAe;AACf,qBAAe;AAAA,IACjB;AAAA,IACA,OAAO;AACL,WAAK,UAAU;AACf,6BAAuB;AACvB,oBAAc;AACd,aAAO,eAAe;AAAA,IACxB;AAAA,EACF;AACF;AAGO,IAAM,qBAAqB,yBAAyB;;;ACnoBpD,IAAM,0BAA0B;AAAA;AAAA,EAEnC,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,eAAe;AAAA;AAAA,EAGf,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA;AAAA;AAAA,EAGV,WAAW;AAAA;AAAA,EACX,YAAY;AAAA;AAAA,EACZ,eAAe;AAAA;AAAA,EACf,gBAAgB;AAAA;AAAA,EAChB,UAAU;AAAA;AAAA;AAAA,EAGV,iBAAiB;AAAA;AAAA,EACjB,WAAW;AAAA;AAAA;AAAA,EAGX,2BAA2B;AAAA,EAC3B,sBAAsB;AAAA;AAAA;AAAA,EAGtB,mBAAmB,OAAO,YAAY,eAAe,QAAQ,OAAO;AAAA,EACpE,oBAAoB;AAAA;AAAA,EAGpB,eAAe;AAAA;AAAA,EACf,cAAc;AAAA;AAClB;AAKO,IAAM,eAAN,MAAmB;AAAA,EACtB,YAAY,UAAU,CAAC,GAAG;AACtB,SAAK,SAAS,KAAK,uBAAuB,OAAO;AACjD,SAAK,UAAU;AAAA,MACX,WAAW;AAAA,MACX,SAAS;AAAA,MACT,mBAAmB;AAAA,IACvB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,SAAS;AAC5B,UAAM,SAAS,EAAE,GAAG,yBAAyB,GAAG,QAAQ;AAGxD,QAAI,OAAO,OAAO,aAAa,UAAU;AACrC,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AACA,QAAI,OAAO,YAAY,GAAG;AACtB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACxD;AAEA,QAAI,OAAO,OAAO,cAAc,UAAU;AACtC,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAChD;AACA,QAAI,OAAO,aAAa,GAAG;AACvB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACzD;AAEA,QAAI,OAAO,OAAO,mBAAmB,UAAU;AAC3C,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACrD;AACA,QAAI,OAAO,kBAAkB,GAAG;AAC5B,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC9D;AAGA,QAAI,OAAO,mBAAmB;AAC1B,UAAI,OAAO,WAAW,KAAM;AACxB,gBAAQ,KAAK,2DAA2D;AAAA,MAC5E;AAEA,UAAI,OAAO,YAAY,OAAO;AAC1B,gBAAQ,KAAK,wDAAwD;AAAA,MACzE;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,cAAc;AAC5B,UAAM,aAAa,EAAE,GAAG,KAAK,OAAO;AAEpC,YAAQ,cAAc;AAAA,MAClB,KAAK;AACD,eAAO;AAAA,UACH,GAAG;AAAA;AAAA,UAEH,aAAa,WAAW,gBAAgB;AAAA,UACxC,kBAAkB,WAAW,qBAAqB;AAAA,QACtD;AAAA,MAEJ,KAAK;AACD,eAAO;AAAA,UACH,GAAG;AAAA;AAAA,UAEH,eAAe,WAAW,iBAAiB;AAAA,UAC3C,UAAU,WAAW,YAAY;AAAA;AAAA,QACrC;AAAA,MAEJ,KAAK;AACD,eAAO;AAAA,UACH,GAAG;AAAA;AAAA,UAEH,iBAAiB,WAAW,oBAAoB;AAAA,QACpD;AAAA,MAEJ;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,WAAW;AACzB,QAAI,KAAK,OAAO,kBAAkB,OAAO;AACrC,aAAO,kBAAkB,SAAS;AAAA,IACtC;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,WAAW;AACxB,QAAI,cAAc,QAAQ,cAAc,OAAW,QAAO;AAC1D,QAAI,OAAO,cAAc,YAAY,OAAO,cAAc,SAAU,QAAO;AAC3E,QAAI,OAAO,cAAc,WAAY,QAAO;AAC5C,QAAI,MAAM,QAAQ,SAAS,EAAG,QAAO,UAAU,MAAM,WAAS,KAAK,iBAAiB,KAAK,CAAC;AAC1F,QAAI,iBAAiB,SAAS,EAAG,QAAO;AACxC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAAO;AACjB,QAAI,QAAQ,KAAK,OAAO,UAAU;AAC9B,YAAM,IAAI,MAAM,yBAAyB,KAAK,OAAO,QAAQ,YAAY;AAAA,IAC7E;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,WAAW;AAE5B,QAAI,cAAc,QAAQ,cAAc,QAAW;AAC/C,aAAO,EAAE,MAAM,SAAS,OAAO,GAAG;AAAA,IACtC;AAGA,QAAI,OAAO,cAAc,UAAU;AAC/B,aAAO,EAAE,MAAM,QAAQ,OAAO,UAAU;AAAA,IAC5C;AAGA,QAAI,OAAO,cAAc,YAAY,OAAO,cAAc,WAAW;AACjE,aAAO,EAAE,MAAM,QAAQ,OAAO,OAAO,SAAS,EAAE;AAAA,IACpD;AAGA,QAAI,OAAO,cAAc,YAAY;AACjC,aAAO,EAAE,MAAM,YAAY,OAAO,UAAU;AAAA,IAChD;AAGA,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC1B,aAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC7C;AAGA,QAAI,iBAAiB,SAAS,GAAG;AAC7B,aAAO,EAAE,MAAM,WAAW,OAAO,UAAU;AAAA,IAC/C;AAGA,WAAO,EAAE,MAAM,WAAW,OAAO,UAAU;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,MAAM,QAAQ,GAAG;AACtC,QAAI;AAEA,YAAM,oBAAoB,KAAK,SAAS,KAAK,KAAK;AAElD,UAAI;AACJ,UAAI,mBAAmB;AAEnB,iBAAS,KAAK,CAAC,aAAa;AACxB,iBAAO,KAAK,gBAAgB,UAAU,KAAK,QAAQ,QAAQ,CAAC;AAAA,QAChE,CAAC;AAAA,MACL,OAAO;AAEH,iBAAS,KAAK;AAAA,MAClB;AAGA,UAAI,OAAO,WAAW,YAAY;AAC9B,eAAO,KAAK,yBAAyB,QAAQ,KAAK;AAAA,MACtD;AAEA,aAAO;AAAA,IACX,SAAS,QAAQ;AACb,UAAI,KAAK,OAAO,kBAAkB;AAC9B,2BAAmB,YAAY,qBAAqB,MAAM;AAAA,MAC9D;AAGA,UAAI,OAAO,YAAY,eAAe,QAAQ,OAAO,MAAwC;AACzF,gBAAQ,KAAK,yCAAyC,OAAO,OAAO;AAAA,MACxE;AAEA,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,UAAU,SAAS,OAAO;AACtC,QAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG;AAC5B,aAAO,CAAC;AAAA,IACZ;AAEA,UAAM,qBAAqB,kBAAkB,QAAQ;AACrD,WAAO,mBAAmB;AAAA,MAAI,WAC1B,KAAK,gBAAgB,OAAO,SAAS,QAAQ,CAAC;AAAA,IAClD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,OAAO;AAC5B,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,CAAC;AAEjD,UAAM,aAAa,EAAE,GAAG,MAAM;AAC9B,WAAO,WAAW;AAClB,WAAO,WAAW;AAClB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,WAAW,WAAW,YAAY,OAAO,WAAW,CAAC,GAAG;AACtE,QAAI,KAAK,OAAO,kBAAkB;AAC9B,yBAAmB;AAAA,QACf;AAAA,QACA,KAAK,eAAe,IAAI;AAAA,QACxB;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,WAAW,QAAQ,WAAW,CAAC,GAAG;AAC1C,QAAI,KAAK,OAAO,kBAAkB;AAC9B,yBAAmB,YAAY,WAAW,QAAQ,QAAQ;AAAA,IAC9D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AACb,QAAI,OAAO,gBAAgB,eAAe,YAAY,KAAK;AACvD,aAAO,YAAY,IAAI;AAAA,IAC3B;AACA,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACV,SAAK,QAAQ,YAAY,KAAK,eAAe;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AACR,SAAK,QAAQ,UAAU,KAAK,eAAe;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AACT,UAAM,WAAW,KAAK,QAAQ,UAC1B,KAAK,QAAQ,UAAU,KAAK,QAAQ,YACpC,KAAK,eAAe,IAAI,KAAK,QAAQ;AAEzC,WAAO;AAAA,MACH,GAAG,KAAK;AAAA,MACR;AAAA,MACA,mBAAmB,KAAK,QAAQ,qBAAqB,WAAW;AAAA,IACpE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AACX,SAAK,UAAU;AAAA,MACX,WAAW;AAAA,MACX,SAAS;AAAA,MACT,mBAAmB;AAAA,IACvB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB;AACd,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACL,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC5D;AACJ;AAKO,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIzB,gBAAgB,SAAS;AACrB,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AACzC,aAAO,OAAO,YAAY,YAAY,OAAO,YAAY;AAAA,IAC7D;AAGA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAChD,UAAI,OAAO,UAAU,WAAY,QAAO;AAExC,UAAI,QAAQ,cAAc,MAAM,QAAQ,KAAK,GAAG;AAE5C,eAAO,MAAM,MAAM,WAAS,cAAc,gBAAgB,KAAK,CAAC;AAAA,MACpE;AAEA,UAAI,QAAQ,cAAc,OAAO,UAAU,YAAY,UAAU,MAAM;AACnE,eAAO,cAAc,gBAAgB,KAAK;AAAA,MAC9C;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAK,UAAU,oBAAI,QAAQ,GAAG;AACvC,QAAI,QAAQ,IAAI,GAAG,EAAG,QAAO;AAC7B,YAAQ,IAAI,GAAG;AAEf,eAAW,SAAS,OAAO,OAAO,GAAG,GAAG;AACpC,UAAI,OAAO,UAAU,WAAY,QAAO;AACxC,UAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,cAAc,aAAa,OAAO,OAAO,GAAG;AAC3F,eAAO;AAAA,MACX;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,SAAS;AAC1B,QAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AAEpD,QAAI,aAAa,OAAO,KAAK,OAAO,EAAE;AAEtC,QAAI,QAAQ,YAAY,MAAM,QAAQ,QAAQ,QAAQ,GAAG;AACrD,oBAAc,QAAQ,SAAS;AAAA,QAC3B,CAAC,KAAK,UAAU,MAAM,cAAc,qBAAqB,KAAK;AAAA,QAC9D;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,SAAS,SAAS;AAC/B,QAAI;AAEA,YAAM,UAAU;AAAA,QACZ,KAAK;AAAA,QACL,OAAO,aAAa,OAAO;AAAA,QAC3B,aAAa,YAAY,OAAO;AAAA,QAChC,cAAc,MAAM,QAAQ,QAAQ,QAAQ,IAAI,UAAU,OAAO,QAAQ;AAAA,MAC7E;AAEA,aAAO,WAAW,KAAK,UAAU,OAAO,CAAC;AAAA,IAC7C,SAAS,QAAQ;AAEb,UAAI,OAAO,YAAY,eAAe,QAAQ,OAAO,MAAwC;AACzF,gBAAQ,KAAK,iCAAiC,MAAM;AAAA,MACxD;AAEA,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAS,SAAS;AAE1B,QAAI,CAAC,QAAQ,YAAa,QAAO;AAGjC,QAAI,cAAc,aAAa,OAAO,EAAG,QAAO;AAGhD,QAAI,cAAc,qBAAqB,OAAO,IAAI,IAAM,QAAO;AAG/D,UAAM,WAAW,cAAc,iBAAiB,QAAQ,WAAW,WAAW,OAAO;AACrF,QAAI,CAAC,SAAU,QAAO;AAEtB,WAAO;AAAA,EACX;AACJ;;;ACvdO,SAAS,WAAW,MAAM;AAC/B,MAAI,OAAO,SAAS,SAAU,QAAO;AAErC,SAAO,KACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;AAaO,SAAS,cAAc,SAAS;AAErC,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,oBAAI,IAAI;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO,aAAa,IAAI,QAAQ,YAAY,CAAC;AAC/C;AAEO,SAAS,iBAAiB,OAAO;AACtC,MAAI,YAAY;AAChB,aAAW,OAAO,OAAO;AACvB,QAAI,MAAM,eAAe,GAAG,GAAG;AAC7B,UAAI,QAAQ,MAAM,GAAG;AAGrB,YAAM,gBAAgB,QAAQ,cAAc,UAAU;AAGtD,UAAI,OAAO,UAAU,YAAY;AAE/B,YAAI,cAAc,WAAW,IAAI,GAAG;AAElC,gBAAM,WAAW,qBAAqB,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAC3F,gBAAM,QAAS,OAAO,YAAY,eAAe,WAAW,QAAQ,QAAQ,QAAQ,IAAI,mBAAmB,OAAO,SAC5G,OAAO,WAAW,eAAe,UAAU,OAAO,mBAAmB;AAI3E,cAAI,OAAO,WAAW,aAAa;AAEjC,gBAAI,CAAC,OAAO,0BAA0B;AACpC,qBAAO,2BAA2B,CAAC;AACnC,kBAAI,MAAO,SAAQ,IAAI,oCAAoC;AAAA,YAC7D;AACA,mBAAO,yBAAyB,QAAQ,IAAI;AAC5C,gBAAI,MAAO,SAAQ,IAAI,gBAAgB,QAAQ,+BAA+B,OAAO,KAAK,OAAO,wBAAwB,EAAE,MAAM,EAAE;AACnI,gBAAI,MAAO,SAAQ,IAAI,yBAAyB,OAAO,KAAK,OAAO,wBAAwB,EAAE,KAAK,IAAI,CAAC,EAAE;AAGzG,gBAAI,OAAO;AACT,kBAAI,OAAO,OAAO,gCAAgC,aAAa;AAC7D,uBAAO,8BAA8B,CAAC;AAAA,cACxC;AACA,qBAAO,4BAA4B,KAAK;AAAA,gBACtC,QAAQ;AAAA,gBACR;AAAA,gBACA,WAAW,KAAK,IAAI;AAAA,gBACpB,cAAc,OAAO,KAAK,OAAO,wBAAwB,EAAE;AAAA,cAC7D,CAAC;AAAA,YACH;AAAA,UACF,WAAW,OAAO,WAAW,aAAa;AAExC,gBAAI,CAAC,OAAO,0BAA0B;AACpC,qBAAO,2BAA2B,CAAC;AACnC,kBAAI,MAAO,SAAQ,IAAI,oCAAoC;AAAA,YAC7D;AACA,mBAAO,yBAAyB,QAAQ,IAAI;AAC5C,gBAAI,MAAO,SAAQ,IAAI,gBAAgB,QAAQ,+BAA+B,OAAO,KAAK,OAAO,wBAAwB,EAAE,MAAM,EAAE;AACnI,gBAAI,MAAO,SAAQ,IAAI,yBAAyB,OAAO,KAAK,OAAO,wBAAwB,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,UAC3G;AAGA,gBAAM,YAAY,cAAc,UAAU,CAAC;AAC3C,uBAAa,iBAAiB,QAAQ,iBAAiB,SAAS;AAChE;AAAA,QACF,OAAO;AAEL,cAAI;AACF,oBAAQ,MAAM;AAAA,UAChB,SAAS,QAAQ;AACf,oBAAQ,KAAK,2CAA2C,GAAG,MAAM;AAAA,cAC/D,QAAQ,OAAO;AAAA,cACf,OAAO,OAAO;AAAA,cACd,cAAc;AAAA,YAChB,CAAC;AAED,oBAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAEA,UAAI,UAAU,MAAM;AAClB,qBAAa,IAAI,aAAa;AAAA,MAChC,WAAW,UAAU,SAAS,UAAU,QAAQ,UAAU,QAAW;AACnE,qBAAa,IAAI,aAAa,KAAK,WAAW,OAAO,KAAK,CAAC,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACA,SAAO,UAAU,KAAK;AACxB;AAEO,SAAS,WAAW,MAAM,UAAU,CAAC,GAAG;AAC7C,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,SACE,KAEG,QAAQ,oBAAoB,EAAE,EAE9B,QAAQ,QAAQ,GAAG,EAEnB,QAAQ,UAAU,IAAI,EAEtB,KAAK;AAEZ;;;AC7GO,SAAS,mBAAmB,UAAU,CAAC,GAAG;AAC/C,QAAM;AAAA,IACJ,eAAe;AAAA,IACf,cAAc;AAAA,IACd,QAAQ,MAAO,KAAK;AAAA;AAAA,IACpB,mBAAmB;AAAA,EACrB,IAAI;AAGJ,QAAM,SAAS;AAAA,IACb,QAAQ,oBAAI,IAAI;AAAA;AAAA,IAChB,WAAW,oBAAI,IAAI;AAAA;AAAA,IACnB,UAAU,oBAAI,IAAI;AAAA;AAAA,IAClB,MAAM,oBAAI,IAAI;AAAA;AAAA,EAChB;AAEA,MAAI,cAAc;AAClB,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,UAAU;AAAA,MACV,MAAM;AAAA,IACR;AAAA,IACA,aAAa;AAAA,MACX,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,UAAU;AAAA,MACV,MAAM;AAAA,IACR;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,OAAO,gBAAgB,YAAY;AACrC,sBAAkB,YAAY,MAAM,QAAQ,GAAG,GAAK;AACpD,QAAI,gBAAgB,OAAO;AACzB,sBAAgB,MAAM;AAAA,IACxB;AAAA,EACF;AASA,WAAS,iBAAiB,WAAW,QAAQ,CAAC,GAAG,UAAU,CAAC,GAAG;AAC7D,UAAM,eAAe,OAAO,cAAc,aACtC,UAAU,QAAQ,UAAU,SAAS,IACrC,KAAK,UAAU,SAAS;AAE5B,UAAM,WAAW,KAAK,UAAU,OAAO,OAAO,KAAK,KAAK,EAAE,KAAK,CAAC;AAChE,UAAM,aAAa,KAAK,UAAU,OAAO;AACzC,UAAM,OAAO,WAAW,eAAe,WAAW,UAAU;AAE5D,WAAO,GAAG,qBAAqB,SAAS,CAAC,IAAI,IAAI;AAAA,EACnD;AAQA,WAAS,IAAI,KAAK,OAAO,aAAa;AACpC,UAAM,QAAQ,OAAO,IAAI,KAAK,OAAO;AACrC,UAAM,QAAQ,MAAM,IAAI,GAAG;AAE3B,QAAI,CAAC,OAAO;AACV,YAAM;AACN,UAAI,iBAAkB,OAAM,YAAY,IAAI;AAC5C,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,IAAI,IAAI,MAAM,YAAY,OAAO;AACxC,YAAM,OAAO,GAAG;AAChB,wBAAkB,CAAC,MAAM,IAAI;AAC7B,YAAM;AACN,UAAI,iBAAkB,OAAM,YAAY,IAAI;AAC5C,aAAO;AAAA,IACT;AAGA,UAAM,aAAa,KAAK,IAAI;AAC5B,UAAM;AACN,UAAM;AACN,QAAI,kBAAkB;AACpB,YAAM,YAAY,IAAI;AACtB,YAAM,QAAQ,IAAI,IAAK,MAAM,QAAQ,MAAM,OAAO,MAAM,UAAW;AAAA,IACrE;AAEA,WAAO,MAAM;AAAA,EACf;AASA,WAAS,IAAI,KAAK,OAAO,OAAO,aAAa,WAAW,CAAC,GAAG;AAC1D,UAAM,QAAQ,OAAO,IAAI,KAAK,OAAO;AACrC,UAAM,OAAO,cAAc,KAAK;AAGhC,QAAI,cAAc,OAAO,cAAc,OAAO,MAAM;AAClD,eAAS,MAAM,IAAI;AAAA,IACrB;AAEA,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,YAAY,KAAK,IAAI;AAAA,MACrB;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AAGA,UAAM,WAAW,MAAM,IAAI,GAAG;AAC9B,QAAI,UAAU;AACZ,wBAAkB,CAAC,SAAS,IAAI;AAAA,IAClC;AAEA,UAAM,IAAI,KAAK,KAAK;AACpB,sBAAkB,IAAI;AAGtB,QAAI,MAAM,OAAO,cAAc;AAC7B,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AAQA,WAAS,OAAO,KAAK,MAAM;AACzB,QAAI,MAAM;AACR,YAAM,QAAQ,OAAO,IAAI;AACzB,UAAI,CAAC,MAAO,QAAO;AAEnB,YAAM,QAAQ,MAAM,IAAI,GAAG;AAC3B,UAAI,OAAO;AACT,0BAAkB,CAAC,MAAM,IAAI;AAC7B,eAAO,MAAM,OAAO,GAAG;AAAA,MACzB;AACA,aAAO;AAAA,IACT;AAGA,eAAW,CAAC,EAAE,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC9C,YAAM,QAAQ,MAAM,IAAI,GAAG;AAC3B,UAAI,OAAO;AACT,0BAAkB,CAAC,MAAM,IAAI;AAC7B,eAAO,MAAM,OAAO,GAAG;AAAA,MACzB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAMA,WAAS,MAAM,MAAM;AACnB,QAAI,MAAM;AACR,YAAM,QAAQ,OAAO,IAAI;AACzB,UAAI,OAAO;AACT,cAAM,MAAM;AAAA,MACd;AAAA,IACF,OAAO;AACL,aAAO,OAAO,MAAM,EAAE,QAAQ,WAAS,MAAM,MAAM,CAAC;AAAA,IACtD;AACA,kBAAc;AAAA,EAChB;AAMA,WAAS,WAAW;AAClB,UAAM,UAAU,OAAO,OAAO,MAAM,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,MAAM,CAAC;AAEhF,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,MAAM;AAAA,MACN;AAAA,MACA,SAAS,MAAM;AAAA,MACf,aAAa,MAAM;AAAA,IACrB;AAAA,EACF;AAKA,WAAS,UAAU;AACjB,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,QAAQ;AAEZ,eAAW,CAAC,EAAE,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC9C,iBAAW,CAAC,KAAK,KAAK,KAAK,MAAM,QAAQ,GAAG;AAC1C,YAAI,MAAM,MAAM,YAAY,OAAO;AACjC,gBAAM,OAAO,GAAG;AAChB,4BAAkB,CAAC,MAAM,IAAI;AAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,MAAM;AAAA,EACjB;AAGA,WAAS,cAAc,OAAO;AAC5B,QAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,QAAI,OAAO,UAAU,SAAU,QAAO,MAAM,SAAS;AACrD,QAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAI,OAAO,UAAU,UAAW,QAAO;AACvC,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,cAAc,IAAI,GAAG,CAAC;AAAA,IACjE;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,OAAO,OAAO,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ,MAAM,cAAc,GAAG,GAAG,CAAC;AAAA,IAC9E;AACA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB,OAAO;AAChC,kBAAc,KAAK,IAAI,GAAG,cAAc,KAAK;AAAA,EAC/C;AAEA,WAAS,SAAS,MAAM,gBAAgB,GAAG;AACzC,UAAM,QAAQ,OAAO,IAAI,KAAK,OAAO;AACrC,UAAM,UAAU,MAAM,KAAK,MAAM,QAAQ,CAAC,EACvC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU;AAErD,QAAI,QAAQ;AACZ,eAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,UAAI,SAAS,cAAe;AAE5B,YAAM,OAAO,GAAG;AAChB,wBAAkB,CAAC,MAAM,IAAI;AAC7B,eAAS,MAAM;AAAA,IACjB;AAEA,WAAO,EAAE,MAAM;AAAA,EACjB;AAEA,WAAS,WAAW,KAAK;AACvB,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAM,OAAO,IAAI,WAAW,CAAC;AAC7B,cAAS,QAAQ,KAAK,OAAQ;AAC9B,aAAO,OAAO;AAAA,IAChB;AACA,WAAO,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE;AAAA,EACnC;AAEA,WAAS,qBAAqB,WAAW;AACvC,QAAI,OAAO,cAAc,YAAY;AACnC,aAAO,UAAU,QAAQ;AAAA,IAC3B;AACA,QAAI,aAAa,OAAO,cAAc,UAAU;AAC9C,YAAM,OAAO,OAAO,KAAK,SAAS;AAClC,aAAO,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAGA,WAAS,UAAU;AACjB,QAAI,iBAAiB;AACnB,oBAAc,eAAe;AAAA,IAC/B;AACA,UAAM;AAAA,EACR;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAAA,IACA,IAAI,YAAY;AACd,aAAO,cAAc,OAAO;AAAA,IAC9B;AAAA,EACF;AACF;AAGO,IAAM,eAAe,mBAAmB;;;ACrV/C,OAAO,QAAQ;AACf,OAAO,UAAU;AAMV,IAAM,aAAN,MAAiB;AAAA,EACpB,YAAY,UAAU,CAAC,GAAG;AACtB,SAAK,UAAU;AAAA,MACX,UAAU,QAAQ,IAAI;AAAA,MACtB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,cAAc;AAAA,MACd,GAAG;AAAA,IACP;AAEA,SAAK,QAAQ,oBAAI,IAAI;AACrB,SAAK,cAAc,oBAAI,IAAI;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,UAAU;AACxB,UAAM,WAAW,KAAK,QAAQ,KAAK,QAAQ,UAAU,QAAQ;AAC7D,UAAM,WAAW;AAGjB,QAAI,KAAK,QAAQ,SAAS,KAAK,MAAM,IAAI,QAAQ,GAAG;AAChD,aAAO,KAAK,MAAM,IAAI,QAAQ;AAAA,IAClC;AAEA,QAAI;AACA,UAAI,UAAU,MAAM,GAAG,SAAS,UAAU,MAAM;AAGhD,UAAI,KAAK,QAAQ,QAAQ;AACrB,kBAAU,KAAK,UAAU,OAAO;AAAA,MACpC;AAGA,UAAI,KAAK,QAAQ,OAAO;AACpB,aAAK,MAAM,IAAI,UAAU,OAAO;AAAA,MACpC;AAEA,WAAK,YAAY,IAAI,QAAQ;AAC7B,aAAO;AAAA,IACX,SAAS,QAAQ;AACb,cAAQ,KAAK,4BAA4B,QAAQ,IAAI,OAAO,OAAO;AACnE,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,WAAW;AAC1B,QAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC3B,kBAAY,CAAC,SAAS;AAAA,IAC1B;AAEA,UAAM,cAAc,MAAM,QAAQ;AAAA,MAC9B,UAAU,IAAI,cAAY,KAAK,YAAY,QAAQ,CAAC;AAAA,IACxD;AAEA,WAAO,YAAY,KAAK,IAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,WAAW,UAAU,KAAK;AACvC,QAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC3B,kBAAY,CAAC,SAAS;AAAA,IAC1B;AAEA,WAAO,UACF,IAAI,cAAY;AACb,YAAM,OAAO,SAAS,WAAW,MAAM,IACjC,WACA,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,QAAQ,GAAG;AAEjD,aAAO,gCAAgC,KAAK,WAAW,IAAI,CAAC;AAAA,IAChE,CAAC,EACA,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,YAAY;AAC7B,QAAI,CAAC,WAAY,QAAO;AAExB,WAAO;AAAA,EAA4B,UAAU;AAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,KAAK;AACX,WAAO,IACF,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,QAAQ,GAAG,EACnB,QAAQ,UAAU,GAAG,EACrB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAM;AACb,UAAM,MAAM,EAAE,aAAa,KAAK;AAChC,WAAO,IAAI,aAAa;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AACT,SAAK,MAAM,MAAM;AACjB,SAAK,YAAY,MAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AACb,WAAO,MAAM,KAAK,KAAK,WAAW;AAAA,EACtC;AACJ;AAKO,IAAM,oBAAoB,IAAI,WAAW;;;ACvHhD,IAAM,gBAAgB,mBAAmB;AAAA,EACrC,SAAS;AAAA,EACT,OAAO;AAAA;AACX,CAAC;AA4BD,IAAM,eAAN,cAA2B,aAAa;AAAA,EACpC,YAAY,UAAU,CAAC,GAAG;AACtB,UAAM;AAAA,MACF,aAAa,QAAQ,gBAAgB;AAAA,MACrC,kBAAkB,QAAQ,qBAAqB;AAAA,MAC/C,QAAQ,QAAQ,UAAU;AAAA,MAC1B,WAAW,QAAQ,aAAa;AAAA,MAChC,UAAU,QAAQ,YAAY;AAAA,MAC9B,GAAG;AAAA,IACP,CAAC;AAGD,QAAI,KAAK,OAAO,eAAe,CAAC,KAAK,OAAO;AACxC,WAAK,QAAQ;AAAA,IACjB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,OAAO,WAAW,UAAU,CAAC,GAAG;AAC5B,UAAM,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,QAAQ;AAC5C,SAAK,YAAY;AAEjB,QAAI;AAEA,UAAI,OAAO,iBAAiB,CAAC,KAAK,iBAAiB,SAAS,GAAG;AAC3D,cAAM,IAAI,MAAM,6BAA6B;AAAA,MACjD;AAGA,YAAM,OAAO,KAAK,gBAAgB,WAAW,QAAQ,CAAC;AACtD,YAAM,YAAY,OAAO,SAAS,WAAW,MAAM,MAAM,IAAI;AAG7D,WAAK,UAAU;AACf,WAAK,kBAAkB,UAAU,KAAK,QAAQ,WAAW,OAAO;AAAA,QAC5D,cAAc,OAAO;AAAA,MACzB,CAAC;AAED,aAAO;AAAA,IAEX,SAAS,QAAQ;AACb,WAAK,YAAY,UAAU,MAAM;AACjC,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,WAAW,SAAS,QAAQ,GAAG;AAE3C,SAAK,cAAc,KAAK;AAGxB,UAAM,EAAE,MAAM,MAAM,IAAI,KAAK,qBAAqB,SAAS;AAE3D,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO,WAAW,KAAK;AAAA,MAC3B,KAAK;AACD,cAAM,SAAS,KAAK,yBAAyB,OAAO,KAAK;AACzD,eAAO,KAAK,gBAAgB,QAAQ,SAAS,QAAQ,CAAC;AAAA,MAC1D,KAAK;AACD,eAAO,MAAM,IAAI,WAAS,KAAK,gBAAgB,OAAO,SAAS,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE;AAAA,MACtF,KAAK;AAED,cAAM,UAAU,OAAO,KAAK,KAAK,EAAE,CAAC;AACpC,cAAM,iBAAiB,MAAM,OAAO;AACpC,eAAO,KAAK,cAAc,SAAS,gBAAgB,SAAS,KAAK;AAAA,MACrE;AACI,aAAK,YAAY,mBAAmB,IAAI,MAAM,2BAA2B,IAAI,EAAE,CAAC;AAChF,eAAO;AAAA,IACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAS,SAAS,SAAS,QAAQ,GAAG;AAChD,UAAM,YAAY,YAAY,IAAI;AAGlC,QAAI,QAAQ,oBAAoB,KAAK,OAAO;AAAA,IAE5C;AAGA,QAAI,QAAQ,eAAe,KAAK,SAAS,cAAc,gBAAgB,OAAO,GAAG;AAC7E,YAAM,WAAW,UAAU,OAAO,IAAI,KAAK,UAAU,OAAO,CAAC;AAC7D,YAAM,SAAS,KAAK,MAAM,IAAI,UAAU,QAAQ;AAChD,UAAI,QAAQ;AACR,aAAK,kBAAkB,SAAS,WAAW,IAAI;AAC/C,eAAO,OAAO;AAAA,MAClB;AAAA,IACJ;AAGA,QAAI,OAAO,YAAY,YAAY,OAAO,YAAY,YAAY,OAAO,YAAY,WAAW;AAC5F,YAAMC,QAAO,cAAc,OAAO,IAC5B,IAAI,OAAO,MACX,IAAI,OAAO,IAAI,WAAW,OAAO,OAAO,CAAC,CAAC,KAAK,OAAO;AAE5D,WAAK,cAAc,SAAS,SAASA,OAAM,OAAO;AAClD,WAAK,kBAAkB,SAAS,WAAW,KAAK;AAChD,aAAOA;AAAA,IACX;AAGA,QAAI,OAAO,YAAY,YAAY;AAC/B,YAAM,SAAS,KAAK,yBAAyB,SAAS,KAAK;AAC3D,aAAO,KAAK,cAAc,SAAS,QAAQ,SAAS,KAAK;AAAA,IAC7D;AAGA,QAAI,WAAW,OAAO,YAAY,UAAU;AACxC,aAAO,KAAK,oBAAoB,SAAS,SAAS,SAAS,KAAK;AAAA,IACpE;AAGA,QAAI,YAAY,QAAQ,YAAY,QAAW;AAC3C,YAAMA,QAAO,cAAc,OAAO,IAC5B,IAAI,OAAO,MACX,IAAI,OAAO,MAAM,OAAO;AAC9B,WAAK,kBAAkB,SAAS,WAAW,KAAK;AAChD,aAAOA;AAAA,IACX;AAGA,UAAM,OAAO,IAAI,OAAO,IAAI,WAAW,OAAO,OAAO,CAAC,CAAC,KAAK,OAAO;AACnE,SAAK,kBAAkB,SAAS,WAAW,KAAK;AAChD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAS,SAAS,MAAM;AAClC,QAAI,KAAK,OAAO,eAAe,KAAK,SAAS,cAAc,gBAAgB,OAAO,GAAG;AACjF,YAAM,WAAW,UAAU,OAAO,IAAI,KAAK,UAAU,OAAO,CAAC;AAC7D,WAAK,MAAM,IAAI,UAAU,UAAU,MAAM;AAAA,QACrC,OAAO,KAAK,OAAO,YAAY,IAAI,KAAK;AAAA;AAAA,QACxC,MAAM,KAAK;AAAA;AAAA,MACf,CAAC;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,SAAS,SAAS,SAAS,QAAQ,GAAG;AACtD,UAAM,YAAY,YAAY,IAAI;AAGlC,QAAI,QAAQ,eAAe,KAAK,OAAO;AACnC,YAAM,WAAW,cAAc,iBAAiB,SAAS,OAAO;AAChE,UAAI,UAAU;AACV,cAAM,SAAS,KAAK,MAAM,IAAI,QAAQ;AACtC,YAAI,QAAQ;AACR,eAAK,kBAAkB,SAAS,WAAW,IAAI;AAC/C,iBAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,EAAE,UAAU,MAAM,GAAG,WAAW,IAAI,WAAW,CAAC;AAGtD,UAAM,kBAAkB,iBAAiB,UAAU;AACnD,UAAM,aAAa,kBACb,IAAI,OAAO,IAAI,eAAe,MAC9B,IAAI,OAAO;AAGjB,QAAI,cAAc;AAClB,QAAI,SAAS,QAAW;AACpB,YAAM,WAAW,YAAY;AAC7B,YAAM,UAAU,YAAY;AAC5B,YAAM,WAAW,YAAY;AAC7B,YAAM,MAAM,OAAO,SAAS,aAAa,OAAO,KAAK,CAAC,IAAI,OAAO,IAAI;AACrE,UAAI,UAAU;AAEV,cAAM,OAAO,IACV,QAAQ,iBAAiB,QAAQ,EACjC,QAAQ,gBAAgB,QAAQ,EAEhC,QAAQ,WAAW,SAAS,EAC5B,QAAQ,WAAW,SAAS;AAC/B,sBAAc;AAAA,MAClB,OAAO;AACH,sBAAc,WAAW,GAAG;AAAA,MAChC;AAAA,IACJ;AAGA,QAAI,eAAe;AACnB,QAAI,YAAY,OAAO,GAAG;AACtB,YAAM,qBAAqB,kBAAkB,QAAQ;AACrD,qBAAe,mBACV,IAAI,WAAS,KAAK,gBAAgB,OAAO,SAAS,QAAQ,CAAC,CAAC,EAC5D,KAAK,EAAE;AAAA,IAChB;AAGA,UAAM,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,KAAK,OAAO;AAGnE,QAAI,QAAQ,eAAe,KAAK,SAAS,cAAc,YAAY,SAAS,OAAO,GAAG;AAClF,YAAM,WAAW,cAAc,iBAAiB,SAAS,OAAO;AAChE,UAAI,UAAU;AACV,aAAK,MAAM,IAAI,UAAU,IAAI;AAAA,MACjC;AAAA,IACJ;AAEA,SAAK,kBAAkB,SAAS,WAAW,KAAK;AAChD,WAAO;AAAA,EACX;AACJ;AAOO,SAAS,OAAO,WAAW,UAAU,CAAC,GAAG;AAE5C,QAAM,gBAAgB;AAAA,IAClB,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,GAAG;AAAA,EACP;AAEA,QAAM,WAAW,IAAI,aAAa,aAAa;AAC/C,SAAO,SAAS,OAAO,WAAW,aAAa;AACnD;;;ACpSO,SAAS,qBAAqB,WAAW,UAAU,CAAC,GAAG;AAC5D,QAAM;AAAA,IACJ,8BAA8B;AAAA,EAChC,IAAI;AAEJ,MAAI;AAEJ,MAAI,6BAA6B;AAC/B,UAAM,WAAW,mBAAmB,YAAY;AAChD,WAAO,OAAO,SAAS;AACvB,uBAAmB,UAAU,QAAQ;AAAA,EACvC,OAAO;AACL,WAAO,OAAO,SAAS;AAAA,EACzB;AAEA,SAAO;AACT;AAWO,SAAS,mBAAmB,WAAW,UAAU,CAAC,GAAG;AAC1D,QAAM;AAAA,IACJ,WAAW;AAAA,EACb,IAAI;AAEJ,QAAM,OAAO,qBAAqB,WAAW,OAAO;AACpD,SAAO,SAAS,QAAQ,eAAe,IAAI;AAC7C;AAYA,eAAsB,uBAAuB,kBAAkB,aAAa,UAAU,CAAC,GAAG;AAExF,QAAM,YAAY,MAAM,QAAQ;AAAA,IAC9B,iBAAiB,GAAG,WAAW;AAAA,EACjC;AAEA,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAGA,SAAO,mBAAmB,WAAW,OAAO;AAC9C;AASO,SAAS,oBAAoB,KAAK;AACvC,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG;AACzD,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,SAAO,KAAK,WAAW;AACzB;;;ACvEO,SAAS,sBAAsB,UAAU,CAAC,GAAG;AAClD,QAAM;AAAA,IACJ,8BAA8B;AAAA,IAC9B,WAAW;AAAA,EACb,IAAI;AAEJ,SAAO,OAAO,KAAK,SAAS;AAC1B,UAAM,KAAK;AAGX,QAAI,oBAAoB,IAAI,IAAI,GAAG;AACjC,UAAI;AAEF,cAAM,YAAY,mBAAmB,IAAI,MAAM,EAAE,6BAA6B,SAAS,CAAC;AAGxF,YAAI,OAAO;AACX,YAAI,OAAO;AAAA,MACb,SAAS,QAAQ;AACf,gBAAQ,MAAM,iCAAiC,MAAM;AACrD,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AASO,SAAS,cAAc,kBAAkB,UAAU,CAAC,GAAG;AAC5D,SAAO,OAAO,KAAK,SAAS;AAC1B,QAAI;AAEF,YAAM,YAAY,MAAM;AAAA,QACtB;AAAA,QACA,CAAC,KAAK,IAAI;AAAA,QACV;AAAA,MACF;AAGA,UAAI,OAAO;AACX,UAAI,OAAO;AAAA,IACb,SAAS,QAAQ;AACf,cAAQ,MAAM,+BAA+B,MAAM;AACnD,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAQO,SAAS,cAAc,KAAK,UAAU,CAAC,GAAG;AAC/C,QAAM;AAAA,IACJ,gBAAgB;AAAA,IAChB,8BAA8B;AAAA,EAChC,IAAI;AAGJ,MAAI,eAAe;AACjB,QAAI,IAAI,sBAAsB,EAAE,4BAA4B,CAAC,CAAC;AAAA,EAChE;AACF;AASA,eAAsB,qBAAqB,UAAU,CAAC,GAAG;AACvD,MAAI;AAEF,UAAM,qBAAqB,OAAO,QAAQ;AAE1C,WAAO,SAAS,KAAK;AACnB,UAAI,CAAC,OAAO,OAAO,IAAI,QAAQ,YAAY;AACzC,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AAEA,oBAAc,KAAK,OAAO;AAC1B,aAAO;AAAA,IACT;AAAA,EACF,SAAS,QAAQ;AACf,UAAM;AAAA,EACR;AACF;AAGA,IAAO,uBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../../core/src/utils/dependency-utils.js", "../../core/src/core/object-utils.js", "../../core/src/performance/monitor.js", "../../core/src/rendering/base-renderer.js", "../../core/src/core/html-utils.js", "../../core/src/performance/cache-manager.js", "../../core/src/rendering/html-renderer.js", "../../core/src/utils/render-utils.js", "../src/coherent-koa.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Utility functions for handling optional peer dependencies\n */\n\n/**\n * Check if a peer dependency is available\n * @param {string} packageName - Name of the package to check\n * @returns {boolean} - Whether the package is available\n */\nexport function isPeerDependencyAvailable(packageName) {\n try {\n // Try to import the package synchronously using require.resolve\n // This is more compatible with code analysis tools\n if (typeof require !== 'undefined' && require.resolve) {\n require.resolve(packageName);\n return true;\n }\n // Fallback: assume available if require is not available (browser context)\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Dynamically import a peer dependency with _error handling\n * @param {string} packageName - Name of the package to import\n * @param {string} integrationName - Human-readable name of the integration\n * @returns {Promise<any>} - The imported module\n * @throws {Error} - If the dependency is not available\n */\nexport async function importPeerDependency(packageName, integrationName) {\n try {\n return await import(packageName);\n } catch {\n throw new Error(\n `${integrationName} integration requires the '${packageName}' package to be installed.\\n` +\n `Please install it with: npm install ${packageName}\\n` +\n `Or with pnpm: pnpm add ${packageName}\\n` +\n `Or with yarn: yarn add ${packageName}`\n );\n }\n}\n\n/**\n * Create a lazy-loaded integration that only imports dependencies when needed\n * @param {string} packageName - Name of the package to import\n * @param {string} integrationName - Human-readable name of the integration\n * @param {Function} createIntegration - Function that creates the integration using the imported package\n * @returns {Function} - Lazy-loaded integration function\n */\nexport function createLazyIntegration(packageName, integrationName, createIntegration) {\n let cachedIntegration = null;\n let importPromise = null;\n\n return async function(...args) {\n // Return cached integration if available\n if (cachedIntegration) {\n return cachedIntegration(...args);\n }\n\n // Avoid multiple concurrent imports\n if (!importPromise) {\n importPromise = importPeerDependency(packageName, integrationName)\n .then(module => {\n cachedIntegration = createIntegration(module);\n return cachedIntegration;\n });\n }\n\n const integration = await importPromise;\n return integration(...args);\n };\n}\n\n/**\n * Check multiple peer dependencies and provide helpful _error messages\n * @param {Array<{package: string, integration: string}>} dependencies - List of dependencies to check\n * @returns {Object} - Object with availability status for each dependency\n */\nexport function checkPeerDependencies(dependencies) {\n const results = {};\n const missing = [];\n\n for (const { package: packageName, integration } of dependencies) {\n const available = isPeerDependencyAvailable(packageName);\n results[packageName] = available;\n \n if (!available) {\n missing.push({ package: packageName, integration });\n }\n }\n\n if (missing.length > 0) {\n const installCommands = missing.map(({ package: pkg }) => pkg).join(' ');\n const integrationsList = missing.map(({ integration }) => integration).join(', ');\n \n console.warn(\n `Optional dependencies missing for ${integrationsList} integration(s).\\n` +\n `To use these integrations, install: npm install ${installCommands}\\n` +\n `Or with pnpm: pnpm add ${installCommands}\\n` +\n `Or with yarn: yarn add ${installCommands}`\n );\n }\n\n return results;\n}\n\n/**\n * Create a function that checks for a dependency before executing\n * @param {string} packageName - Name of the package required\n * @param {string} integrationName - Human-readable name of the integration\n * @param {Function} fn - Function to execute if dependency is available\n * @returns {Function} - Wrapped function with dependency check\n */\nexport function requirePeerDependency(packageName, integrationName, fn) {\n return function(...args) {\n if (!isPeerDependencyAvailable(packageName)) {\n throw new Error(\n `${integrationName} integration requires the '${packageName}' package to be installed.\\n` +\n `Please install it with: npm install ${packageName}`\n );\n }\n return fn.apply(this, args);\n };\n}\n", "/**\n * Core Object Utilities for Coherent.js\n * Handles object validation, manipulation, and analysis\n */\n\n/**\n * Deep clone an object with optimizations for common patterns\n * Handles circular references, functions, dates, regex, and more\n */\nexport function deepClone(obj, seen = new WeakMap()) {\n // Handle primitives\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // Handle circular references\n if (seen.has(obj)) {\n return seen.get(obj);\n }\n\n // Handle Date objects\n if (obj instanceof Date) {\n return new Date(obj.getTime());\n }\n\n // Handle RegExp objects\n if (obj instanceof RegExp) {\n return new RegExp(obj.source, obj.flags);\n }\n\n // Handle Array objects\n if (Array.isArray(obj)) {\n const clonedArray = [];\n seen.set(obj, clonedArray);\n\n for (let i = 0; i < obj.length; i++) {\n clonedArray[i] = deepClone(obj[i], seen);\n }\n\n return clonedArray;\n }\n\n // Handle Function objects (preserve reference for performance)\n if (typeof obj === 'function') {\n // For Coherent components, we typically want to preserve function references\n // rather than cloning them, as they represent behavior\n return obj;\n }\n\n // Handle Map objects\n if (obj instanceof Map) {\n const clonedMap = new Map();\n seen.set(obj, clonedMap);\n\n for (const [key, value] of obj) {\n clonedMap.set(deepClone(key, seen), deepClone(value, seen));\n }\n\n return clonedMap;\n }\n\n // Handle Set objects\n if (obj instanceof Set) {\n const clonedSet = new Set();\n seen.set(obj, clonedSet);\n\n for (const value of obj) {\n clonedSet.add(deepClone(value, seen));\n }\n\n return clonedSet;\n }\n\n // Handle WeakMap and WeakSet (cannot be cloned, return new empty instance)\n if (obj instanceof WeakMap) {\n return new WeakMap();\n }\n\n if (obj instanceof WeakSet) {\n return new WeakSet();\n }\n\n // Handle plain objects and other object types\n const clonedObj = {};\n seen.set(obj, clonedObj);\n\n // Handle objects with custom prototypes\n if (obj.constructor && obj.constructor !== Object) {\n try {\n // Attempt to create instance with same constructor\n clonedObj.__proto__ = obj.__proto__;\n } catch {\n // Fallback to Object.create if direct prototype assignment fails\n Object.setPrototypeOf(clonedObj, Object.getPrototypeOf(obj));\n }\n }\n\n // Clone all enumerable properties\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n clonedObj[key] = deepClone(obj[key], seen);\n }\n }\n\n // Clone non-enumerable properties (important for some objects)\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n for (const key of Object.keys(descriptors)) {\n if (!descriptors[key].enumerable && descriptors[key].configurable) {\n try {\n Object.defineProperty(clonedObj, key, {\n ...descriptors[key],\n value: deepClone(descriptors[key].value, seen)\n });\n } catch {\n // Skip properties that can't be cloned\n }\n }\n }\n\n return clonedObj;\n}\n\n/**\n * Shallow clone optimized for Coherent objects\n * Much faster than deep clone when you only need one level\n */\nexport function shallowClone(obj) {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return [...obj];\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime());\n }\n\n if (obj instanceof RegExp) {\n return new RegExp(obj.source, obj.flags);\n }\n\n // For objects, spread operator is fastest for shallow clone\n return { ...obj };\n}\n\n/**\n * Smart clone that chooses between shallow and deep based on structure\n * Optimized for Coherent component patterns\n */\nexport function smartClone(obj, maxDepth = 10, currentDepth = 0) {\n // Prevent infinite recursion\n if (currentDepth >= maxDepth) {\n return shallowClone(obj);\n }\n\n // Use shallow clone for simple structures\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n // For arrays, check if elements need deep cloning\n if (Array.isArray(obj)) {\n const needsDeepClone = obj.some(item =>\n typeof item === 'object' && item !== null && !isSimpleObject(item)\n );\n\n if (!needsDeepClone && currentDepth < 3) {\n return obj.map(item => smartClone(item, maxDepth, currentDepth + 1));\n } else {\n return obj.map(item => shallowClone(item));\n }\n }\n\n // For Coherent objects, intelligently clone based on content\n if (isCoherentObject(obj)) {\n const cloned = {};\n\n for (const [tag, props] of Object.entries(obj)) {\n if (props && typeof props === 'object') {\n // Deep clone children, shallow clone other props\n if (props.children) {\n cloned[tag] = {\n ...props,\n children: smartClone(props.children, maxDepth, currentDepth + 1)\n };\n } else {\n cloned[tag] = shallowClone(props);\n }\n } else {\n cloned[tag] = props;\n }\n }\n\n return cloned;\n }\n\n // Fallback to shallow clone for other objects\n return shallowClone(obj);\n}\n\n/**\n * Check if object is a simple structure (no nested objects/arrays)\n */\nfunction isSimpleObject(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return true;\n }\n\n if (Array.isArray(obj)) {\n return obj.every(item => typeof item !== 'object' || item === null);\n }\n\n return Object.values(obj).every(value =>\n typeof value !== 'object' || value === null || value instanceof Date || value instanceof RegExp\n );\n}\n\n/**\n * Clone with performance monitoring\n * Useful for debugging clone performance in development\n */\nexport function monitoredClone(obj, options = {}) {\n const {\n method = 'deep',\n logTiming = false,\n maxDepth = 10\n } = options;\n\n const start = performance.now();\n let result;\n\n switch (method) {\n case 'shallow':\n result = shallowClone(obj);\n break;\n case 'smart':\n result = smartClone(obj, maxDepth);\n break;\n case 'deep':\n default:\n result = deepClone(obj);\n break;\n }\n\n const end = performance.now();\n\n if (logTiming) {\n console.log(`\uD83D\uDD04 ${method} clone took ${(end - start).toFixed(2)}ms`);\n }\n\n return result;\n}\n\n// Rest of your existing object-utils.js code...\n\n/**\n * Validate that a component structure is valid for rendering\n */\nexport function validateComponent(component, path = 'root') {\n if (component === null || component === undefined) {\n throw new Error(`Invalid component at ${path}: null or undefined`);\n }\n\n // Allow strings, numbers, booleans as text content\n if (['string', 'number', 'boolean'].includes(typeof component)) {\n return true;\n }\n\n // Allow functions (will be evaluated during render)\n if (typeof component === 'function') {\n return true;\n }\n\n // Handle arrays\n if (Array.isArray(component)) {\n component.forEach((child, index) => {\n validateComponent(child, `${path}[${index}]`);\n });\n return true;\n }\n\n // Handle objects\n if (typeof component === 'object') {\n const keys = Object.keys(component);\n\n if (keys.length === 0) {\n throw new Error(`Empty object at ${path}`);\n }\n\n keys.forEach(key => {\n const value = component[key];\n\n // Validate HTML tag names (basic validation)\n if (!/^[a-zA-Z][a-zA-Z0-9-]*$/.test(key) && key !== 'text') {\n console.warn(`Potentially invalid tag name at ${path}: ${key}`);\n }\n\n // If value is an object, it should be props\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Validate children if present\n if (value.children) {\n validateComponent(value.children, `${path}.${key}.children`);\n }\n } else if (value && typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'function') {\n throw new Error(`Invalid value type at ${path}.${key}: ${typeof value}`);\n }\n });\n\n return true;\n }\n\n throw new Error(`Invalid component type at ${path}: ${typeof component}`);\n}\n\n/**\n * Check if an object follows Coherent.js object syntax\n */\nexport function isCoherentObject(obj) {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return false;\n }\n\n const keys = Object.keys(obj);\n\n // Empty objects are not coherent objects\n if (keys.length === 0) {\n return false;\n }\n\n // Check if all keys look like HTML tags or 'text'\n return keys.every(key => {\n // Allow 'text' as a special key\n if (key === 'text') return true;\n\n // Basic HTML tag validation\n return /^[a-zA-Z][a-zA-Z0-9-]*$/.test(key);\n });\n}\n\n/**\n * Extract props from a Coherent object\n */\nexport function extractProps(coherentObj) {\n if (!isCoherentObject(coherentObj)) {\n return {};\n }\n\n const props = {};\n const keys = Object.keys(coherentObj);\n\n keys.forEach(tag => {\n const value = coherentObj[tag];\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n props[tag] = { ...value };\n } else {\n props[tag] = { text: value };\n }\n });\n\n return props;\n}\n\n/**\n * Check if a component has children\n */\nexport function hasChildren(component) {\n if (Array.isArray(component)) {\n return component.length > 0;\n }\n\n if (isCoherentObject(component)) {\n // First check if the component itself has a children property\n if (component.children !== undefined && component.children !== null) {\n return Array.isArray(component.children) ? component.children.length > 0 : true;\n }\n \n // Then check if any of its properties have children\n const keys = Object.keys(component);\n return keys.some(key => {\n const value = component[key];\n return value && typeof value === 'object' && value.children;\n });\n }\n\n return false;\n}\n\n/**\n * Normalize children to a consistent array format\n */\nexport function normalizeChildren(children) {\n if (children === null || children === undefined) {\n return [];\n }\n\n if (Array.isArray(children)) {\n return children.flat().filter(child => child !== null && child !== undefined);\n }\n\n return [children];\n}\n\n/**\n * Get children from a component's props\n */\nexport function getChildren(props) {\n if (!props || typeof props !== 'object') {\n return [];\n }\n\n if (props.children === undefined) {\n return [];\n }\n\n return normalizeChildren(props.children);\n}\n\n/**\n * Merge props objects with conflict resolution\n */\nexport function mergeProps(base = {}, override = {}) {\n const merged = { ...base };\n\n Object.keys(override).forEach(key => {\n if (key === 'children') {\n // Merge children arrays\n const baseChildren = normalizeChildren(base.children);\n const overrideChildren = normalizeChildren(override.children);\n merged.children = [...baseChildren, ...overrideChildren];\n } else if (key === 'className' && base.className) {\n // Merge class names\n merged.className = `${base.className} ${override.className}`;\n } else if (key === 'style' && base.style && typeof base.style === 'object') {\n // Merge style objects\n merged.style = { ...base.style, ...override.style };\n } else {\n // Override other properties\n merged[key] = override[key];\n }\n });\n\n return merged;\n}\n\n/**\n * Get nested value from object using dot notation\n */\nexport function getNestedValue(obj, path) {\n if (!obj || typeof path !== 'string') {\n return undefined;\n }\n\n return path.split('.').reduce((current, key) => {\n return current && current[key] !== undefined ? current[key] : undefined;\n }, obj);\n}\n\n/**\n * Set nested value in object using dot notation\n */\nexport function setNestedValue(obj, path, value) {\n if (!obj || typeof path !== 'string') {\n return obj;\n }\n\n const keys = path.split('.');\n const lastKey = keys.pop();\n\n const target = keys.reduce((current, key) => {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n return current[key];\n }, obj);\n\n target[lastKey] = value;\n return obj;\n}\n\n/**\n * Compare two components for equality (useful for optimization)\n */\nexport function isEqual(a, b, maxDepth = 5, currentDepth = 0) {\n // Prevent deep comparisons that are too expensive\n if (currentDepth > maxDepth) {\n return a === b;\n }\n\n if (a === b) return true;\n if (a === null || b === null || a === undefined || b === undefined) return false;\n if (typeof a !== typeof b) return false;\n\n if (typeof a === 'function') {\n // Functions are compared by reference\n return a === b;\n }\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n return a.every((item, i) => isEqual(item, b[i], maxDepth, currentDepth + 1));\n }\n\n if (typeof a === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every(key =>\n keysB.includes(key) &&\n isEqual(a[key], b[key], maxDepth, currentDepth + 1)\n );\n }\n\n return false;\n}\n\n/**\n * Create a frozen (immutable) version of a component\n */\nexport function freeze(obj) {\n if (obj && typeof obj === 'object') {\n Object.freeze(obj);\n\n // Recursively freeze nested objects\n Object.values(obj).forEach(value => {\n if (value && typeof value === 'object') {\n freeze(value);\n }\n });\n }\n\n return obj;\n}\n\n/**\n * Check if component tree contains circular references\n */\nexport function hasCircularReferences(obj, seen = new WeakSet()) {\n if (obj && typeof obj === 'object') {\n if (seen.has(obj)) {\n return true;\n }\n\n seen.add(obj);\n\n for (const value of Object.values(obj)) {\n if (hasCircularReferences(value, seen)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Get memory footprint estimate of a component tree\n */\nexport function getMemoryFootprint(obj, visited = new WeakSet()) {\n if (obj === null || obj === undefined) return 0;\n if (visited.has(obj)) return 0;\n\n let size = 0;\n\n if (typeof obj === 'string') {\n size = obj.length * 2; // Rough estimate: 2 bytes per character\n } else if (typeof obj === 'number') {\n size = 8; // 64-bit number\n } else if (typeof obj === 'boolean') {\n size = 4; // Boolean\n } else if (typeof obj === 'object') {\n visited.add(obj);\n size = 48; // Base object overhead\n\n if (Array.isArray(obj)) {\n size += obj.length * 8; // Array overhead\n obj.forEach(item => {\n size += getMemoryFootprint(item, visited);\n });\n } else {\n Object.keys(obj).forEach(key => {\n size += key.length * 2; // Key string\n size += getMemoryFootprint(obj[key], visited);\n });\n }\n }\n\n return size;\n}\n", "/**\n * Enhanced Performance Monitoring System\n *\n * Provides comprehensive performance monitoring with:\n * - Custom metrics\n * - Sampling strategies\n * - Automated reporting\n * - Alert rules\n * - Resource monitoring\n * - Performance budgets\n */\n\n/**\n * Create an enhanced performance monitor\n *\n * @param {Object} options - Configuration options\n * @param {boolean} [options.enabled=true] - Enable monitoring\n * @param {Object} [options.metrics] - Custom metrics configuration\n * @param {Object} [options.sampling] - Sampling strategy configuration\n * @param {Object} [options.reporting] - Automated reporting configuration\n * @param {Object} [options.alerts] - Alert rules configuration\n * @param {Object} [options.resources] - Resource monitoring configuration\n * @param {Object} [options.profiling] - Profiling configuration\n * @returns {Object} Enhanced performance monitor instance\n */\nexport function createPerformanceMonitor(options = {}) {\n const opts = {\n enabled: true,\n metrics: {\n custom: {}\n },\n sampling: {\n enabled: false,\n rate: 1.0,\n strategy: 'random'\n },\n reporting: {\n enabled: false,\n interval: 60000,\n format: 'json',\n batch: {\n enabled: false,\n maxSize: 100,\n flushInterval: 5000\n },\n onReport: null\n },\n alerts: {\n enabled: true,\n debounceMs: 5000,\n rules: []\n },\n resources: {\n enabled: false,\n track: ['memory'],\n interval: 1000\n },\n profiling: {\n enabled: false,\n mode: 'production',\n flamegraph: false,\n tracing: {\n enabled: false,\n sampleRate: 0.01\n }\n },\n ...options\n };\n\n // Ensure nested defaults are preserved\n opts.reporting.batch = {\n enabled: false,\n maxSize: 100,\n flushInterval: 5000,\n ...(options.reporting?.batch || {})\n };\n\n // Metrics storage\n const metrics = {\n builtin: {\n renderTime: { type: 'histogram', unit: 'ms', values: [] },\n componentCount: { type: 'counter', unit: 'renders', value: 0 },\n errorCount: { type: 'counter', unit: 'errors', value: 0 },\n memoryUsage: { type: 'gauge', unit: 'MB', values: [] }\n },\n custom: {}\n };\n\n // Initialize custom metrics\n Object.entries(opts.metrics.custom).forEach(([name, config]) => {\n metrics.custom[name] = {\n type: config.type || 'counter',\n unit: config.unit || '',\n threshold: config.threshold,\n values: config.type === 'histogram' ? [] : undefined,\n value: config.type === 'counter' || config.type === 'gauge' ? 0 : undefined\n };\n });\n\n // Sampling state\n const samplingState = {\n count: 0,\n sampled: 0,\n adaptiveRate: opts.sampling.rate\n };\n\n // Reporting state\n const reportingState = {\n batch: [],\n lastReport: Date.now(),\n reportTimer: null,\n flushTimer: null\n };\n\n // Alert state\n const alertState = {\n triggered: new Map(),\n history: []\n };\n\n // Resource monitoring state\n const resourceState = {\n samples: [],\n timer: null\n };\n\n // Profiling state\n const profilingState = {\n traces: [],\n flamegraphData: []\n };\n\n // Statistics\n const stats = {\n metricsRecorded: 0,\n sampleRate: opts.sampling.rate,\n reportsGenerated: 0,\n alertsTriggered: 0\n };\n\n /**\n * Check if event should be sampled\n */\n function shouldSample() {\n if (!opts.sampling.enabled) return true;\n\n samplingState.count++;\n\n if (opts.sampling.strategy === 'random') {\n return Math.random() < samplingState.adaptiveRate;\n } else if (opts.sampling.strategy === 'deterministic') {\n return samplingState.count % Math.ceil(1 / samplingState.adaptiveRate) === 0;\n } else if (opts.sampling.strategy === 'adaptive') {\n // Adaptive sampling based on recent metric values\n const recentRenderTimes = metrics.builtin.renderTime.values.slice(-10);\n if (recentRenderTimes.length > 0) {\n const avgTime = recentRenderTimes.reduce((a, b) => a + b, 0) / recentRenderTimes.length;\n // Sample more when performance is poor\n samplingState.adaptiveRate = avgTime > 16 ? Math.min(1.0, opts.sampling.rate * 2) : opts.sampling.rate;\n }\n return Math.random() < samplingState.adaptiveRate;\n }\n\n return true;\n }\n\n /**\n * Record a metric value\n */\n function recordMetric(name, value, metadata = {}) {\n if (!opts.enabled) return;\n if (!shouldSample()) return;\n\n stats.metricsRecorded++;\n\n // Check if it's a built-in metric\n const builtinMetric = metrics.builtin[name];\n if (builtinMetric) {\n if (builtinMetric.type === 'histogram') {\n builtinMetric.values.push(value);\n if (builtinMetric.values.length > 1000) {\n builtinMetric.values = builtinMetric.values.slice(-1000);\n }\n } else if (builtinMetric.type === 'counter') {\n builtinMetric.value += value;\n } else if (builtinMetric.type === 'gauge') {\n builtinMetric.values.push(value);\n if (builtinMetric.values.length > 100) {\n builtinMetric.values = builtinMetric.values.slice(-100);\n }\n }\n }\n\n // Check if it's a custom metric\n const customMetric = metrics.custom[name];\n if (customMetric) {\n if (customMetric.type === 'histogram') {\n customMetric.values = customMetric.values || [];\n customMetric.values.push(value);\n if (customMetric.values.length > 1000) {\n customMetric.values = customMetric.values.slice(-1000);\n }\n } else if (customMetric.type === 'counter') {\n customMetric.value = (customMetric.value || 0) + value;\n } else if (customMetric.type === 'gauge') {\n customMetric.values = customMetric.values || [];\n customMetric.values.push(value);\n if (customMetric.values.length > 100) {\n customMetric.values = customMetric.values.slice(-100);\n }\n }\n\n // Check threshold\n if (customMetric.threshold) {\n const currentValue = customMetric.type === 'histogram' || customMetric.type === 'gauge'\n ? customMetric.values[customMetric.values.length - 1]\n : customMetric.value;\n\n if (currentValue > customMetric.threshold) {\n checkAlerts(name, currentValue);\n }\n }\n }\n\n // Add to batch if enabled\n if (opts.reporting.enabled && opts.reporting.batch.enabled) {\n reportingState.batch.push({\n metric: name,\n value,\n metadata,\n timestamp: Date.now()\n });\n\n if (reportingState.batch.length >= opts.reporting.batch.maxSize) {\n flushBatch();\n }\n }\n\n // Check alerts\n checkAlerts(name, value);\n }\n\n /**\n * Check alert rules\n */\n function checkAlerts(metric, value) {\n if (!opts.alerts.enabled) return;\n\n opts.alerts.rules.forEach(rule => {\n if (rule.metric !== metric) return;\n\n let triggered = false;\n\n if (rule.condition === 'exceeds' && value > rule.threshold) {\n triggered = true;\n } else if (rule.condition === 'below' && value < rule.threshold) {\n triggered = true;\n } else if (rule.condition === 'equals' && value === rule.threshold) {\n triggered = true;\n }\n\n if (triggered) {\n const alertKey = `${rule.metric}-${rule.condition}-${rule.threshold}`;\n const lastTriggered = alertState.triggered.get(alertKey);\n const now = Date.now();\n\n // Debounce alerts (don't trigger same alert within debounceMs period)\n if (!lastTriggered || now - lastTriggered > opts.alerts.debounceMs) {\n alertState.triggered.set(alertKey, now);\n alertState.history.push({\n rule,\n value,\n timestamp: now\n });\n stats.alertsTriggered++;\n\n if (rule.action) {\n rule.action(value, rule);\n }\n }\n }\n });\n }\n\n /**\n * Flush batch of metrics\n */\n function flushBatch() {\n if (reportingState.batch.length === 0) return;\n\n const batch = [...reportingState.batch];\n reportingState.batch = [];\n\n if (opts.reporting.onReport) {\n opts.reporting.onReport({ type: 'batch', data: batch });\n }\n }\n\n /**\n * Generate a performance report\n */\n function generateReport() {\n const report = {\n timestamp: Date.now(),\n statistics: { ...stats },\n metrics: {}\n };\n\n // Built-in metrics\n Object.entries(metrics.builtin).forEach(([name, metric]) => {\n if (metric.type === 'histogram') {\n report.metrics[name] = {\n type: 'histogram',\n unit: metric.unit,\n count: metric.values.length,\n min: metric.values.length > 0 ? Math.min(...metric.values) : 0,\n max: metric.values.length > 0 ? Math.max(...metric.values) : 0,\n avg: metric.values.length > 0\n ? metric.values.reduce((a, b) => a + b, 0) / metric.values.length\n : 0,\n p50: percentile(metric.values, 0.5),\n p95: percentile(metric.values, 0.95),\n p99: percentile(metric.values, 0.99)\n };\n } else if (metric.type === 'counter') {\n report.metrics[name] = {\n type: 'counter',\n unit: metric.unit,\n value: metric.value\n };\n } else if (metric.type === 'gauge') {\n report.metrics[name] = {\n type: 'gauge',\n unit: metric.unit,\n current: metric.values.length > 0 ? metric.values[metric.values.length - 1] : 0,\n avg: metric.values.length > 0\n ? metric.values.reduce((a, b) => a + b, 0) / metric.values.length\n : 0\n };\n }\n });\n\n // Custom metrics\n Object.entries(metrics.custom).forEach(([name, metric]) => {\n if (metric.type === 'histogram') {\n report.metrics[name] = {\n type: 'histogram',\n unit: metric.unit,\n count: metric.values?.length || 0,\n min: metric.values?.length > 0 ? Math.min(...metric.values) : 0,\n max: metric.values?.length > 0 ? Math.max(...metric.values) : 0,\n avg: metric.values?.length > 0\n ? metric.values.reduce((a, b) => a + b, 0) / metric.values.length\n : 0,\n p95: percentile(metric.values || [], 0.95),\n p99: percentile(metric.values || [], 0.99)\n };\n } else if (metric.type === 'counter') {\n report.metrics[name] = {\n type: 'counter',\n unit: metric.unit,\n value: metric.value || 0\n };\n } else if (metric.type === 'gauge') {\n report.metrics[name] = {\n type: 'gauge',\n unit: metric.unit,\n current: metric.values?.length > 0 ? metric.values[metric.values.length - 1] : 0,\n avg: metric.values?.length > 0\n ? metric.values.reduce((a, b) => a + b, 0) / metric.values.length\n : 0\n };\n }\n });\n\n // Alerts\n report.alerts = {\n total: alertState.history.length,\n recent: alertState.history.slice(-10)\n };\n\n // Resources\n if (opts.resources.enabled) {\n report.resources = {\n samples: resourceState.samples.slice(-20)\n };\n }\n\n stats.reportsGenerated++;\n\n if (opts.reporting.onReport) {\n opts.reporting.onReport({ type: 'report', data: report });\n }\n\n return report;\n }\n\n /**\n * Calculate percentile\n */\n function percentile(values, p) {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.ceil(sorted.length * p) - 1;\n return sorted[Math.max(0, index)];\n }\n\n /**\n * Start resource monitoring\n */\n function startResourceMonitoring() {\n if (!opts.resources.enabled) return;\n\n const collectResources = () => {\n const sample = {\n timestamp: Date.now()\n };\n\n if (opts.resources.track.includes('memory')) {\n if (typeof process !== 'undefined' && process.memoryUsage) {\n const mem = process.memoryUsage();\n sample.memory = {\n heapUsed: mem.heapUsed / 1024 / 1024,\n heapTotal: mem.heapTotal / 1024 / 1024,\n external: mem.external / 1024 / 1024,\n rss: mem.rss / 1024 / 1024\n };\n } else if (typeof performance !== 'undefined' && performance.memory) {\n sample.memory = {\n heapUsed: performance.memory.usedJSHeapSize / 1024 / 1024,\n heapTotal: performance.memory.totalJSHeapSize / 1024 / 1024\n };\n }\n }\n\n resourceState.samples.push(sample);\n if (resourceState.samples.length > 100) {\n resourceState.samples = resourceState.samples.slice(-100);\n }\n\n resourceState.timer = setTimeout(collectResources, opts.resources.interval);\n };\n\n collectResources();\n }\n\n /**\n * Stop resource monitoring\n */\n function stopResourceMonitoring() {\n if (resourceState.timer) {\n clearTimeout(resourceState.timer);\n resourceState.timer = null;\n }\n }\n\n /**\n * Start automated reporting\n */\n function startReporting() {\n if (!opts.reporting.enabled) return;\n\n reportingState.reportTimer = setInterval(() => {\n generateReport();\n }, opts.reporting.interval);\n\n if (opts.reporting.batch.enabled) {\n reportingState.flushTimer = setInterval(() => {\n flushBatch();\n }, opts.reporting.batch.flushInterval);\n }\n }\n\n /**\n * Stop automated reporting\n */\n function stopReporting() {\n if (reportingState.reportTimer) {\n clearInterval(reportingState.reportTimer);\n reportingState.reportTimer = null;\n }\n if (reportingState.flushTimer) {\n clearInterval(reportingState.flushTimer);\n reportingState.flushTimer = null;\n }\n flushBatch(); // Flush remaining batch\n }\n\n /**\n * Start profiling\n */\n function startProfiling() {\n if (!opts.profiling.enabled) return;\n // Profiling implementation would hook into render pipeline\n }\n\n /**\n * Record a trace\n */\n function recordTrace(name, duration, metadata = {}) {\n if (!opts.profiling.enabled || !opts.profiling.tracing.enabled) return;\n\n if (Math.random() < opts.profiling.tracing.sampleRate) {\n profilingState.traces.push({\n name,\n duration,\n metadata,\n timestamp: Date.now()\n });\n\n if (profilingState.traces.length > 1000) {\n profilingState.traces = profilingState.traces.slice(-1000);\n }\n }\n }\n\n /**\n * Measure execution time\n */\n function measure(name, fn, metadata = {}) {\n if (!opts.enabled) return fn();\n\n const start = performance.now();\n try {\n const result = fn();\n const duration = performance.now() - start;\n\n recordMetric('renderTime', duration, { name, ...metadata });\n recordTrace(name, duration, metadata);\n\n return result;\n } catch (error) {\n recordMetric('errorCount', 1, { name, error: error.message });\n throw error;\n }\n }\n\n /**\n * Measure async execution time\n */\n async function measureAsync(name, fn, metadata = {}) {\n if (!opts.enabled) return fn();\n\n const start = performance.now();\n try {\n const result = await fn();\n const duration = performance.now() - start;\n\n recordMetric('renderTime', duration, { name, ...metadata });\n recordTrace(name, duration, metadata);\n\n return result;\n } catch (error) {\n recordMetric('errorCount', 1, { name, error: error.message });\n throw error;\n }\n }\n\n /**\n * Add a custom metric\n */\n function addMetric(name, config) {\n metrics.custom[name] = {\n type: config.type || 'counter',\n unit: config.unit || '',\n threshold: config.threshold,\n values: config.type === 'histogram' ? [] : undefined,\n value: config.type === 'counter' || config.type === 'gauge' ? 0 : undefined\n };\n }\n\n /**\n * Add an alert rule\n */\n function addAlertRule(rule) {\n opts.alerts.rules.push(rule);\n }\n\n /**\n * Get current statistics\n */\n function getStats() {\n return {\n ...stats,\n sampleRate: samplingState.adaptiveRate,\n batchSize: reportingState.batch.length,\n resourceSamples: resourceState.samples.length,\n traces: profilingState.traces.length,\n alerts: {\n total: alertState.history.length,\n unique: alertState.triggered.size\n }\n };\n }\n\n /**\n * Reset all metrics\n */\n function reset() {\n // Reset built-in metrics\n Object.values(metrics.builtin).forEach(metric => {\n if (metric.type === 'histogram' || metric.type === 'gauge') {\n metric.values = [];\n } else if (metric.type === 'counter') {\n metric.value = 0;\n }\n });\n\n // Reset custom metrics\n Object.values(metrics.custom).forEach(metric => {\n if (metric.type === 'histogram' || metric.type === 'gauge') {\n metric.values = [];\n } else if (metric.type === 'counter') {\n metric.value = 0;\n }\n });\n\n // Reset state\n samplingState.count = 0;\n samplingState.sampled = 0;\n reportingState.batch = [];\n alertState.history = [];\n alertState.triggered.clear();\n resourceState.samples = [];\n profilingState.traces = [];\n\n // Reset stats\n stats.metricsRecorded = 0;\n stats.reportsGenerated = 0;\n stats.alertsTriggered = 0;\n }\n\n // Start monitoring\n if (opts.enabled) {\n startResourceMonitoring();\n startReporting();\n startProfiling();\n }\n\n return {\n recordMetric,\n measure,\n measureAsync,\n addMetric,\n addAlertRule,\n generateReport,\n getStats,\n reset,\n start() {\n opts.enabled = true;\n startResourceMonitoring();\n startReporting();\n startProfiling();\n },\n stop() {\n opts.enabled = false;\n stopResourceMonitoring();\n stopReporting();\n return generateReport();\n }\n };\n}\n\n// Export default instance\nexport const performanceMonitor = createPerformanceMonitor();\n", "/**\n * Base Renderer Class\n * Provides common functionality shared across all Coherent.js renderers\n * Reduces code duplication and ensures consistent behavior\n */\n\nimport {\n validateComponent,\n isCoherentObject,\n extractProps,\n hasChildren,\n normalizeChildren,\n} from '../core/object-utils.js';\n\nimport { performanceMonitor } from '../performance/monitor.js';\n\n/**\n * Unified configuration for all Coherent.js renderers\n * Includes options for HTML, Streaming, and DOM renderers\n */\nexport const DEFAULT_RENDERER_CONFIG = {\n // Core rendering options\n maxDepth: 100,\n enableValidation: true,\n enableMonitoring: false,\n validateInput: true,\n\n // HTML Renderer specific options\n enableCache: true,\n minify: false,\n cacheSize: 1000,\n cacheTTL: 300000, // 5 minutes\n\n // Streaming Renderer specific options\n chunkSize: 1024, // Size of each chunk in bytes\n bufferSize: 4096, // Internal buffer size\n enableMetrics: false, // Track streaming metrics\n yieldThreshold: 100, // Yield control after N elements\n encoding: 'utf8', // Output encoding\n\n // DOM Renderer specific options\n enableHydration: true, // Enable hydration support\n namespace: null, // SVG namespace support\n\n // Performance options\n enablePerformanceTracking: false,\n performanceThreshold: 10, // ms threshold for slow renders\n\n // Development options\n enableDevWarnings: typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development',\n enableDebugLogging: false,\n\n // Error handling options\n errorFallback: '', // Fallback content on errors\n throwOnError: true, // Whether to throw or return fallback\n};\n\n/**\n * Base renderer class with common functionality\n */\nexport class BaseRenderer {\n constructor(options = {}) {\n this.config = this.validateAndMergeConfig(options);\n this.metrics = {\n startTime: null,\n endTime: null,\n elementsProcessed: 0\n };\n }\n\n /**\n * Validate and merge configuration options\n */\n validateAndMergeConfig(options) {\n const config = { ...DEFAULT_RENDERER_CONFIG, ...options };\n \n // Validate critical options\n if (typeof config.maxDepth !== 'number') {\n throw new Error('maxDepth must be a number');\n }\n if (config.maxDepth <= 0) {\n throw new Error('maxDepth must be a positive number');\n }\n \n if (typeof config.chunkSize !== 'number') {\n throw new Error('chunkSize must be a number');\n }\n if (config.chunkSize <= 0) {\n throw new Error('chunkSize must be a positive number');\n }\n \n if (typeof config.yieldThreshold !== 'number') {\n throw new Error('yieldThreshold must be a number');\n }\n if (config.yieldThreshold <= 0) {\n throw new Error('yieldThreshold must be a positive number');\n }\n \n // Warn about potentially problematic configurations\n if (config.enableDevWarnings) {\n if (config.maxDepth > 1000) {\n console.warn('Coherent.js: maxDepth > 1000 may cause performance issues');\n }\n \n if (config.chunkSize > 16384) {\n console.warn('Coherent.js: Large chunkSize may increase memory usage');\n }\n }\n \n return config;\n }\n\n /**\n * Get configuration for specific renderer type\n */\n getRendererConfig(rendererType) {\n const baseConfig = { ...this.config };\n \n switch (rendererType) {\n case 'html':\n return {\n ...baseConfig,\n // HTML-specific defaults\n enableCache: baseConfig.enableCache !== false,\n enableMonitoring: baseConfig.enableMonitoring !== false\n };\n \n case 'streaming':\n return {\n ...baseConfig,\n // Streaming-specific defaults\n enableMetrics: baseConfig.enableMetrics ?? false,\n maxDepth: baseConfig.maxDepth ?? 1000 // Higher default for streaming\n };\n \n case 'dom':\n return {\n ...baseConfig,\n // DOM-specific defaults\n enableHydration: baseConfig.enableHydration !== false\n };\n \n default:\n return baseConfig;\n }\n }\n\n /**\n * Validate component structure\n */\n validateComponent(component) {\n if (this.config.validateInput !== false) {\n return validateComponent(component);\n }\n return true;\n }\n\n /**\n * Check if component is valid for rendering\n */\n isValidComponent(component) {\n if (component === null || component === undefined) return true;\n if (typeof component === 'string' || typeof component === 'number') return true;\n if (typeof component === 'function') return true;\n if (Array.isArray(component)) return component.every(child => this.isValidComponent(child));\n if (isCoherentObject(component)) return true;\n return false;\n }\n\n /**\n * Validate rendering depth to prevent stack overflow\n */\n validateDepth(depth) {\n if (depth > this.config.maxDepth) {\n throw new Error(`Maximum render depth (${this.config.maxDepth}) exceeded`);\n }\n }\n\n /**\n * Handle different component types with consistent logic\n */\n processComponentType(component) {\n // Null/undefined\n if (component === null || component === undefined) {\n return { type: 'empty', value: '' };\n }\n\n // String\n if (typeof component === 'string') {\n return { type: 'text', value: component };\n }\n\n // Number/Boolean\n if (typeof component === 'number' || typeof component === 'boolean') {\n return { type: 'text', value: String(component) };\n }\n\n // Function\n if (typeof component === 'function') {\n return { type: 'function', value: component };\n }\n\n // Array\n if (Array.isArray(component)) {\n return { type: 'array', value: component };\n }\n\n // Object (Coherent element)\n if (isCoherentObject(component)) {\n return { type: 'element', value: component };\n }\n\n // Unknown type\n return { type: 'unknown', value: component };\n }\n\n /**\n * Execute function components with _error handling\n */\n executeFunctionComponent(func, depth = 0) {\n try {\n // Check if this is a context provider by checking function arity or a marker\n const isContextProvider = func.length > 0 || func.isContextProvider;\n \n let result;\n if (isContextProvider) {\n // Call with render function for context providers\n result = func((children) => {\n return this.renderComponent(children, this.config, depth + 1);\n });\n } else {\n // Regular function component\n result = func();\n }\n \n // Handle case where function returns another function\n if (typeof result === 'function') {\n return this.executeFunctionComponent(result, depth);\n }\n \n return result;\n } catch (_error) {\n if (this.config.enableMonitoring) {\n performanceMonitor.recordError('functionComponent', _error);\n }\n \n // In development, provide detailed _error info\n if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development') {\n console.warn('Coherent.js Function Component Error:', _error.message);\n }\n \n return null;\n }\n }\n\n /**\n * Process element children consistently\n */\n processChildren(children, options, depth) {\n if (!hasChildren({ children })) {\n return [];\n }\n\n const normalizedChildren = normalizeChildren(children);\n return normalizedChildren.map(child => \n this.renderComponent(child, options, depth + 1)\n );\n }\n\n /**\n * Extract and process element attributes\n */\n extractElementAttributes(props) {\n if (!props || typeof props !== 'object') return {};\n\n const attributes = { ...props };\n delete attributes.children;\n delete attributes.text;\n return attributes;\n }\n\n /**\n * Record performance metrics\n */\n recordPerformance(operation, startTime, fromCache = false, metadata = {}) {\n if (this.config.enableMonitoring) {\n performanceMonitor.recordRender(\n operation,\n this.getCurrentTime() - startTime,\n fromCache,\n metadata\n );\n }\n }\n\n /**\n * Record _error for monitoring\n */\n recordError(operation, _error, metadata = {}) {\n if (this.config.enableMonitoring) {\n performanceMonitor.recordError(operation, _error, metadata);\n }\n }\n\n /**\n * Get current timestamp with fallback\n */\n getCurrentTime() {\n if (typeof performance !== 'undefined' && performance.now) {\n return performance.now();\n }\n return Date.now();\n }\n\n /**\n * Start performance timing\n */\n startTiming() {\n this.metrics.startTime = this.getCurrentTime();\n }\n\n /**\n * End performance timing\n */\n endTiming() {\n this.metrics.endTime = this.getCurrentTime();\n }\n\n /**\n * Get performance metrics\n */\n getMetrics() {\n const duration = this.metrics.endTime ? \n this.metrics.endTime - this.metrics.startTime :\n this.getCurrentTime() - this.metrics.startTime;\n\n return {\n ...this.metrics,\n duration,\n elementsPerSecond: this.metrics.elementsProcessed / (duration / 1000)\n };\n }\n\n /**\n * Reset metrics for new render\n */\n resetMetrics() {\n this.metrics = {\n startTime: null,\n endTime: null,\n elementsProcessed: 0\n };\n }\n\n /**\n * Abstract method - must be implemented by subclasses\n */\n renderComponent() {\n throw new Error('renderComponent must be implemented by subclass');\n }\n\n /**\n * Abstract method - must be implemented by subclasses\n */\n render() {\n throw new Error('render must be implemented by subclass');\n }\n}\n\n/**\n * Utility functions for renderer implementations\n */\nexport const RendererUtils = {\n /**\n * Check if element is static (no functions)\n */\n isStaticElement(element) {\n if (!element || typeof element !== 'object') {\n return typeof element === 'string' || typeof element === 'number';\n }\n\n // Check if element has any dynamic content\n for (const [key, value] of Object.entries(element)) {\n if (typeof value === 'function') return false;\n\n if (key === 'children' && Array.isArray(value)) {\n // Recursively check children for dynamic content\n return value.every(child => RendererUtils.isStaticElement(child));\n }\n\n if (key === 'children' && typeof value === 'object' && value !== null) {\n return RendererUtils.isStaticElement(value);\n }\n }\n\n return true;\n },\n\n /**\n * Check if object has functions (for caching decisions)\n */\n hasFunctions(obj, visited = new WeakSet()) {\n if (visited.has(obj)) return false;\n visited.add(obj);\n\n for (const value of Object.values(obj)) {\n if (typeof value === 'function') return true;\n if (typeof value === 'object' && value !== null && RendererUtils.hasFunctions(value, visited)) {\n return true;\n }\n }\n return false;\n },\n\n /**\n * Get element complexity score\n */\n getElementComplexity(element) {\n if (!element || typeof element !== 'object') return 1;\n\n let complexity = Object.keys(element).length;\n\n if (element.children && Array.isArray(element.children)) {\n complexity += element.children.reduce(\n (sum, child) => sum + RendererUtils.getElementComplexity(child),\n 0\n );\n }\n\n return complexity;\n },\n\n /**\n * Generate cache key for element\n */\n generateCacheKey(tagName, element) {\n try {\n // Create a stable cache key for the element\n const keyData = {\n tag: tagName,\n props: extractProps(element),\n hasChildren: hasChildren(element),\n childrenType: Array.isArray(element.children) ? 'array' : typeof element.children\n };\n\n return `element:${JSON.stringify(keyData)}`;\n } catch (_error) {\n // Log _error in development mode\n if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development') {\n console.warn('Failed to generate cache key:', _error);\n }\n // Return null to indicate uncacheable element\n return null;\n }\n },\n\n /**\n * Check if element is cacheable\n */\n isCacheable(element, options) {\n // Don't cache if caching is disabled\n if (!options.enableCache) return false;\n\n // Don't cache elements with functions (dynamic content)\n if (RendererUtils.hasFunctions(element)) return false;\n\n // Don't cache very large elements (memory consideration)\n if (RendererUtils.getElementComplexity(element) > 1000) return false;\n\n // Don't cache if we can't generate a stable cache key\n const cacheKey = RendererUtils.generateCacheKey(element.tagName || 'unknown', element);\n if (!cacheKey) return false;\n\n return true;\n }\n};\n\nexport default BaseRenderer;\n", "/**\n * HTML-specific utility functions\n */\n\nexport function escapeHtml(text) {\n if (typeof text !== 'string') return text;\n\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport function unescapeHtml(text) {\n if (typeof text !== 'string') return text;\n\n return text\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/>/g, '>')\n .replace(/</g, '<')\n .replace(/&/g, '&');\n}\n\nexport function isVoidElement(tagName) {\n // Ensure tagName is a string before processing\n if (typeof tagName !== 'string') {\n return false;\n }\n\n const voidElements = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n ]);\n return voidElements.has(tagName.toLowerCase());\n}\n\nexport function formatAttributes(props) {\n let formatted = '';\n for (const key in props) {\n if (props.hasOwnProperty(key)) {\n let value = props[key];\n\n // Convert className to class for HTML output\n const attributeName = key === 'className' ? 'class' : key;\n\n // Handle function values - for event handlers, use data-action attributes\n if (typeof value === 'function') {\n // Check if this is an event handler (starts with 'on')\n if (attributeName.startsWith('on')) {\n // For event handlers, create a unique action identifier\n const actionId = `__coherent_action_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const DEBUG = (typeof process !== 'undefined' && process && process.env && (process.env.COHERENT_DEBUG === '1' || process.env.NODE_ENV === 'development'))\n || (typeof window !== 'undefined' && window && window.COHERENT_DEBUG === true);\n \n // Store the function in a global registry that will be available during hydration\n // Check if we're in Node.js or browser environment\n if (typeof global !== 'undefined') {\n // Server-side, store in global for hydration\n if (!global.__coherentActionRegistry) {\n global.__coherentActionRegistry = {};\n if (DEBUG) console.log('Initialized global action registry');\n }\n global.__coherentActionRegistry[actionId] = value;\n if (DEBUG) console.log(`Added action ${actionId} to global registry, total: ${Object.keys(global.__coherentActionRegistry).length}`);\n if (DEBUG) console.log(`Global registry keys: ${Object.keys(global.__coherentActionRegistry).join(', ')}`);\n \n // Log the global object to see if it's being reset\n if (DEBUG) {\n if (typeof global.__coherentActionRegistryLog === 'undefined') {\n global.__coherentActionRegistryLog = [];\n }\n global.__coherentActionRegistryLog.push({\n action: 'add',\n actionId: actionId,\n timestamp: Date.now(),\n registrySize: Object.keys(global.__coherentActionRegistry).length\n });\n }\n } else if (typeof window !== 'undefined') {\n // Browser-side, store in window\n if (!window.__coherentActionRegistry) {\n window.__coherentActionRegistry = {};\n if (DEBUG) console.log('Initialized window action registry');\n }\n window.__coherentActionRegistry[actionId] = value;\n if (DEBUG) console.log(`Added action ${actionId} to window registry, total: ${Object.keys(window.__coherentActionRegistry).length}`);\n if (DEBUG) console.log(`Window registry keys: ${Object.keys(window.__coherentActionRegistry).join(', ')}`);\n }\n \n // Use data-action and data-event attributes instead of inline JS\n const eventType = attributeName.substring(2); // Remove 'on' prefix\n formatted += ` data-action=\"${actionId}\" data-event=\"${eventType}\"`;\n continue; // Skip normal processing\n } else {\n // For other function attributes, call them to get the value\n try {\n value = value();\n } catch (_error) {\n console.warn(`Error executing function for attribute '${key}':`, {\n _error: _error.message,\n stack: _error.stack,\n attributeKey: key,\n });\n // Consider different fallback strategies based on attribute type\n value = '';\n }\n }\n }\n\n if (value === true) {\n formatted += ` ${attributeName}`;\n } else if (value !== false && value !== null && value !== undefined) {\n formatted += ` ${attributeName}=\"${escapeHtml(String(value))}\"`;\n }\n }\n }\n return formatted.trim();\n}\n\nexport function minifyHtml(html, options = {}) {\n if (!options.minify) return html;\n\n return (\n html\n // Remove comments\n .replace(/<!--[\\s\\S]*?-->/g, '')\n // Remove extra whitespace\n .replace(/\\s+/g, ' ')\n // Remove whitespace around tags\n .replace(/>\\s+</g, '><')\n // Remove leading/trailing whitespace\n .trim()\n );\n}\n\n/**\n * HTML Void Elements - elements that cannot have children\n * These elements are self-closing and don't need closing tags\n */\nexport const voidElements = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n", "/**\n * Advanced caching system with memory management and smart invalidation for Coherent.js\n * \n * @module @coherent/performance/cache-manager\n * @license MIT\n */\n\n/**\n * @typedef {Object} CacheEntry\n * @property {any} value - The cached value\n * @property {number} timestamp - When the entry was created\n * @property {number} lastAccess - Last access time\n * @property {number} size - Approximate size in bytes\n * @property {Object} metadata - Additional metadata\n * @property {number} accessCount - Number of times accessed\n */\n\n/**\n * @typedef {Object} CacheStats\n * @property {number} hits - Number of cache hits\n * @property {number} misses - Number of cache misses\n * @property {number} size - Current cache size in bytes\n * @property {number} entries - Number of cache entries\n * @property {Record<string, number>} hitRate - Hit rate by cache type\n */\n\n/**\n * @typedef {Object} CacheOptions\n * @property {number} [maxCacheSize=1000] - Maximum number of entries per cache type\n * @property {number} [maxMemoryMB=100] - Maximum memory usage in MB\n * @property {number} [ttlMs=300000] - Default time-to-live in milliseconds (5 minutes)\n * @property {boolean} [enableStatistics=true] - Whether to collect usage statistics\n */\n\n/**\n * Creates a new CacheManager instance\n * @param {CacheOptions} [options] - Configuration options\n * @returns {Object} Cache manager instance\n */\nexport function createCacheManager(options = {}) {\n const {\n maxCacheSize = 1000,\n maxMemoryMB = 100,\n ttlMs = 1000 * 60 * 5, // 5 minutes\n enableStatistics = true\n } = options;\n\n // Internal state\n const caches = {\n static: new Map(), // Never-changing components\n component: new Map(), // Component results with deps\n template: new Map(), // Template strings\n data: new Map() // General purpose data\n };\n\n let memoryUsage = 0;\n const stats = {\n hits: 0,\n misses: 0,\n hitRate: {\n static: 0,\n component: 0,\n template: 0,\n data: 0\n },\n accessCount: {\n static: 0,\n component: 0,\n template: 0,\n data: 0\n }\n };\n\n // Cleanup interval (doesn't keep Node.js process alive)\n let cleanupInterval;\n if (typeof setInterval === 'function') {\n cleanupInterval = setInterval(() => cleanup(), 30000);\n if (cleanupInterval.unref) {\n cleanupInterval.unref();\n }\n }\n\n /**\n * Generate a cache key from component and props\n * @param {any} component - Component or component name\n * @param {Object} [props={}] - Component props\n * @param {Object} [context={}] - Additional context\n * @returns {string} Cache key\n */\n function generateCacheKey(component, props = {}, context = {}) {\n const componentStr = typeof component === 'function'\n ? component.name || component.toString()\n : JSON.stringify(component);\n\n const propsStr = JSON.stringify(props, Object.keys(props).sort());\n const contextStr = JSON.stringify(context);\n const hash = simpleHash(componentStr + propsStr + contextStr);\n \n return `${extractComponentName(component)}_${hash}`;\n }\n\n /**\n * Get a value from the cache\n * @param {string} key - Cache key\n * @param {string} [type='component'] - Cache type\n * @returns {any|null} Cached value or null if not found\n */\n function get(key, type = 'component') {\n const cache = caches[type] || caches.component;\n const entry = cache.get(key);\n\n if (!entry) {\n stats.misses++;\n if (enableStatistics) stats.accessCount[type]++;\n return null;\n }\n\n // Check TTL\n if (Date.now() - entry.timestamp > ttlMs) {\n cache.delete(key);\n updateMemoryUsage(-entry.size);\n stats.misses++;\n if (enableStatistics) stats.accessCount[type]++;\n return null;\n }\n\n // Update access time and stats\n entry.lastAccess = Date.now();\n entry.accessCount++;\n stats.hits++;\n if (enableStatistics) {\n stats.accessCount[type]++;\n stats.hitRate[type] = (stats.hits / (stats.hits + stats.misses)) * 100;\n }\n\n return entry.value;\n }\n\n /**\n * Store a value in the cache\n * @param {string} key - Cache key\n * @param {any} value - Value to cache\n * @param {string} [type='component'] - Cache type\n * @param {Object} [metadata={}] - Additional metadata\n */\n function set(key, value, type = 'component', metadata = {}) {\n const cache = caches[type] || caches.component;\n const size = calculateSize(value);\n\n // Check memory limits\n if (memoryUsage + size > maxMemoryMB * 1024 * 1024) {\n optimize(type, size);\n }\n\n const entry = {\n value,\n timestamp: Date.now(),\n lastAccess: Date.now(),\n size,\n metadata,\n accessCount: 0\n };\n\n // Remove existing entry if it exists\n const existing = cache.get(key);\n if (existing) {\n updateMemoryUsage(-existing.size);\n }\n\n cache.set(key, entry);\n updateMemoryUsage(size);\n\n // Enforce cache size limits\n if (cache.size > maxCacheSize) {\n optimize(type);\n }\n }\n\n /**\n * Remove an entry from the cache\n * @param {string} key - Cache key\n * @param {string} [type] - Cache type (optional, checks all caches if not provided)\n * @returns {boolean} True if an entry was removed\n */\n function remove(key, type) {\n if (type) {\n const cache = caches[type];\n if (!cache) return false;\n \n const entry = cache.get(key);\n if (entry) {\n updateMemoryUsage(-entry.size);\n return cache.delete(key);\n }\n return false;\n }\n\n // Check all caches if no type specified\n for (const [, cache] of Object.entries(caches)) {\n const entry = cache.get(key);\n if (entry) {\n updateMemoryUsage(-entry.size);\n return cache.delete(key);\n }\n }\n return false;\n }\n\n /**\n * Clear all caches or a specific cache type\n * @param {string} [type] - Cache type to clear (optional, clears all if not provided)\n */\n function clear(type) {\n if (type) {\n const cache = caches[type];\n if (cache) {\n cache.clear();\n }\n } else {\n Object.values(caches).forEach(cache => cache.clear());\n }\n memoryUsage = 0;\n }\n\n /**\n * Get cache statistics\n * @returns {CacheStats} Cache statistics\n */\n function getStats() {\n const entries = Object.values(caches).reduce((sum, cache) => sum + cache.size, 0);\n \n return {\n hits: stats.hits,\n misses: stats.misses,\n size: memoryUsage,\n entries,\n hitRate: stats.hitRate,\n accessCount: stats.accessCount\n };\n }\n\n /**\n * Clean up expired entries\n */\n function cleanup() {\n const now = Date.now();\n let freed = 0;\n\n for (const [, cache] of Object.entries(caches)) {\n for (const [key, entry] of cache.entries()) {\n if (now - entry.timestamp > ttlMs) {\n cache.delete(key);\n updateMemoryUsage(-entry.size);\n freed++;\n }\n }\n }\n\n return { freed };\n }\n\n // Internal helper functions\n function calculateSize(value) {\n if (value === null || value === undefined) return 0;\n if (typeof value === 'string') return value.length * 2; // UTF-16\n if (typeof value === 'number') return 8; // 64-bit float\n if (typeof value === 'boolean') return 4;\n if (Array.isArray(value)) {\n return value.reduce((sum, item) => sum + calculateSize(item), 0);\n }\n if (typeof value === 'object') {\n return Object.values(value).reduce((sum, val) => sum + calculateSize(val), 0);\n }\n return 0;\n }\n\n function updateMemoryUsage(delta) {\n memoryUsage = Math.max(0, memoryUsage + delta);\n }\n\n function optimize(type, requiredSpace = 0) {\n const cache = caches[type] || caches.component;\n const entries = Array.from(cache.entries())\n .sort(([, a], [, b]) => a.lastAccess - b.lastAccess);\n\n let freed = 0;\n for (const [key, entry] of entries) {\n if (freed >= requiredSpace) break;\n \n cache.delete(key);\n updateMemoryUsage(-entry.size);\n freed += entry.size;\n }\n\n return { freed };\n }\n\n function simpleHash(str) {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(36);\n }\n\n function extractComponentName(component) {\n if (typeof component === 'function') {\n return component.name || 'AnonymousComponent';\n }\n if (component && typeof component === 'object') {\n const keys = Object.keys(component);\n return keys.length > 0 ? keys[0] : 'ObjectComponent';\n }\n return 'UnknownComponent';\n }\n\n // Clean up on destroy\n function destroy() {\n if (cleanupInterval) {\n clearInterval(cleanupInterval);\n }\n clear();\n }\n\n // Public API\n return {\n get,\n set,\n remove,\n clear,\n getStats,\n cleanup,\n destroy,\n generateCacheKey,\n get memoryUsage() {\n return memoryUsage;\n },\n get maxMemory() {\n return maxMemoryMB * 1024 * 1024;\n }\n };\n}\n\n// Create a default instance for convenience\nexport const cacheManager = createCacheManager();\n", "/**\n * High-performance HTML renderer with caching, monitoring, and streaming support\n * Converts object-based components to HTML strings with advanced optimizations\n */\n\nimport { BaseRenderer, RendererUtils } from './base-renderer.js';\nimport {\n hasChildren,\n normalizeChildren,\n} from '../core/object-utils.js';\n\nimport {\n escapeHtml,\n isVoidElement,\n formatAttributes,\n minifyHtml\n} from '../core/html-utils.js';\n\nimport { performanceMonitor } from '../performance/monitor.js';\nimport { createCacheManager } from '../performance/cache-manager.js';\nimport { cssUtils, defaultCSSManager } from './css-manager.js';\n\n// Create a global cache instance for the renderer\nconst rendererCache = createCacheManager({\n maxSize: 1000,\n ttlMs: 300000 // 5 minutes\n});\n\n/**\n * HTML Renderer Class extending BaseRenderer\n * \n * @class HTMLRenderer\n * @extends BaseRenderer\n * @description High-performance HTML renderer with caching, monitoring, and streaming support.\n * Converts object-based components to HTML strings with advanced optimizations.\n * \n * @param {Object} [options={}] - Renderer configuration options\n * @param {boolean} [options.enableCache=true] - Enable component caching\n * @param {boolean} [options.enableMonitoring=true] - Enable performance monitoring\n * @param {boolean} [options.minify=false] - Enable HTML minification\n * @param {boolean} [options.streaming=false] - Enable streaming mode\n * @param {number} [options.maxDepth=100] - Maximum rendering depth\n * @param {number} [options.cacheSize=1000] - Cache size limit\n * @param {number} [options.cacheTTL=300000] - Cache TTL in milliseconds\n * \n * @example\n * const renderer = new HTMLRenderer({\n * enableCache: true,\n * enableMonitoring: true,\n * minify: true\n * });\n * \n * const html = renderer.render({ div: { text: 'Hello World' } });\n */\nclass HTMLRenderer extends BaseRenderer {\n constructor(options = {}) {\n super({\n enableCache: options.enableCache !== false,\n enableMonitoring: options.enableMonitoring !== false,\n minify: options.minify || false,\n streaming: options.streaming || false,\n maxDepth: options.maxDepth || 100,\n ...options\n });\n \n // Initialize cache if enabled\n if (this.config.enableCache && !this.cache) {\n this.cache = rendererCache;\n }\n }\n\n /**\n * Main render method - converts components to HTML string\n * \n * @param {Object|Array|string|Function} component - Component to render\n * @param {Object} [options={}] - Rendering options\n * @param {Object} [options.context] - Rendering context\n * @param {boolean} [options.enableCache] - Override cache setting\n * @param {number} [options.depth=0] - Current rendering depth\n * @returns {string} Rendered HTML string\n * \n * @example\n * const html = renderer.render({\n * div: {\n * className: 'container',\n * children: [\n * { h1: { text: 'Title' } },\n * { p: { text: 'Content' } }\n * ]\n * }\n * });\n */\n render(component, options = {}) {\n const config = { ...this.config, ...options };\n this.startTiming();\n\n try {\n // Input validation\n if (config.validateInput && !this.isValidComponent(component)) {\n throw new Error('Invalid component structure');\n }\n\n // Main rendering logic\n const html = this.renderComponent(component, config, 0);\n const finalHtml = config.minify ? minifyHtml(html, config) : html;\n\n // Performance monitoring\n this.endTiming();\n this.recordPerformance('render', this.metrics.startTime, false, {\n cacheEnabled: config.enableCache \n });\n\n return finalHtml;\n\n } catch (_error) {\n this.recordError('render', _error);\n throw _error;\n }\n }\n\n /**\n * Render a single component with full optimization pipeline\n */\n renderComponent(component, options, depth = 0) {\n // Use base class depth validation\n this.validateDepth(depth);\n \n // Use base class component type processing\n const { type, value } = this.processComponentType(component);\n \n switch (type) {\n case 'empty':\n return '';\n case 'text':\n return escapeHtml(value);\n case 'function':\n const result = this.executeFunctionComponent(value, depth);\n return this.renderComponent(result, options, depth + 1);\n case 'array':\n return value.map(child => this.renderComponent(child, options, depth + 1)).join('');\n case 'element':\n // Process object-based component\n const tagName = Object.keys(value)[0];\n const elementContent = value[tagName];\n return this.renderElement(tagName, elementContent, options, depth);\n default:\n this.recordError('renderComponent', new Error(`Unknown component type: ${type}`));\n return '';\n }\n }\n\n /**\n * Render an HTML element with advanced caching and optimization\n */\n renderElement(tagName, element, options, depth = 0) {\n const startTime = performance.now();\n\n // Track element usage for performance analysis (via stats in the new cache manager)\n if (options.enableMonitoring && this.cache) {\n // The new cache manager tracks usage automatically via get/set operations\n }\n\n // Check cache first for static elements\n if (options.enableCache && this.cache && RendererUtils.isStaticElement(element)) {\n const cacheKey = `static:${tagName}:${JSON.stringify(element)}`;\n const cached = this.cache.get('static', cacheKey);\n if (cached) {\n this.recordPerformance(tagName, startTime, true);\n return cached.value; // Return the cached HTML\n }\n }\n\n // Handle text-only elements including booleans\n if (typeof element === 'string' || typeof element === 'number' || typeof element === 'boolean') {\n const html = isVoidElement(tagName)\n ? `<${tagName}>`\n : `<${tagName}>${escapeHtml(String(element))}</${tagName}>`;\n\n this.cacheIfStatic(tagName, element, html, options);\n this.recordPerformance(tagName, startTime, false);\n return html;\n }\n\n // Handle function elements\n if (typeof element === 'function') {\n const result = this.executeFunctionComponent(element, depth);\n return this.renderElement(tagName, result, options, depth);\n }\n\n // Handle object elements (complex elements with props and children)\n if (element && typeof element === 'object') {\n return this.renderObjectElement(tagName, element, options, depth);\n }\n\n // Handle null and undefined by returning empty tags\n if (element === null || element === undefined) {\n const html = isVoidElement(tagName)\n ? `<${tagName}>`\n : `<${tagName}></${tagName}>`;\n this.recordPerformance(tagName, startTime, false);\n return html;\n }\n\n // Fallback for any other types\n const html = `<${tagName}>${escapeHtml(String(element))}</${tagName}>`;\n this.recordPerformance(tagName, startTime, false);\n return html;\n }\n\n /**\n * Cache element if it's static\n */\n cacheIfStatic(tagName, element, html) {\n if (this.config.enableCache && this.cache && RendererUtils.isStaticElement(element)) {\n const cacheKey = `static:${tagName}:${JSON.stringify(element)}`;\n this.cache.set('static', cacheKey, html, {\n ttlMs: this.config.cacheTTL || 5 * 60 * 1000, // 5 minutes default\n size: html.length // Approximate size\n });\n }\n }\n\n /**\n * Render complex object elements with attributes and children\n */\n renderObjectElement(tagName, element, options, depth = 0) {\n const startTime = performance.now();\n\n // Check component-level cache\n if (options.enableCache && this.cache) {\n const cacheKey = RendererUtils.generateCacheKey(tagName, element);\n if (cacheKey) {\n const cached = this.cache.get(cacheKey);\n if (cached) {\n this.recordPerformance(tagName, startTime, true);\n return cached;\n }\n }\n }\n\n // Extract props and children directly from element content\n const { children, text, ...attributes } = element || {};\n\n // Build opening tag with attributes\n const attributeString = formatAttributes(attributes);\n const openingTag = attributeString\n ? `<${tagName} ${attributeString}>`\n : `<${tagName}>`;\n\n // Handle text content\n let textContent = '';\n if (text !== undefined) {\n const isScript = tagName === 'script';\n const isStyle = tagName === 'style';\n const isRawTag = isScript || isStyle;\n const raw = typeof text === 'function' ? String(text()) : String(text);\n if (isRawTag) {\n // Prevent </script> or </style> early-terminating the tag\n const safe = raw\n .replace(/<\\/(script)/gi, '<\\\\/$1')\n .replace(/<\\/(style)/gi, '<\\\\/$1')\n // Escape problematic Unicode line separators in JS\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n textContent = safe;\n } else {\n textContent = escapeHtml(raw);\n }\n }\n\n // Handle children\n let childrenHtml = '';\n if (hasChildren(element)) {\n const normalizedChildren = normalizeChildren(children);\n childrenHtml = normalizedChildren\n .map(child => this.renderComponent(child, options, depth + 1))\n .join('');\n }\n\n // Build complete HTML\n const html = `${openingTag}${textContent}${childrenHtml}</${tagName}>`;\n\n // Cache the result if appropriate\n if (options.enableCache && this.cache && RendererUtils.isCacheable(element, options)) {\n const cacheKey = RendererUtils.generateCacheKey(tagName, element);\n if (cacheKey) {\n this.cache.set(cacheKey, html);\n }\n }\n\n this.recordPerformance(tagName, startTime, false);\n return html;\n }\n}\n\n// Note: globalCache is now imported from cache-manager.js\n\n/**\n * Main render function - converts object components to HTML\n */\nexport function render(component, options = {}) {\n // Merge default options with provided options\n const mergedOptions = {\n enableCache: true,\n enableMonitoring: false,\n ...options\n };\n \n const renderer = new HTMLRenderer(mergedOptions);\n return renderer.render(component, mergedOptions);\n}\n\n/**\n * Renders component to complete HTML document with DOCTYPE\n * Better alternative to manual DOCTYPE concatenation\n * Supports CSS file inclusion and inline styles\n */\nexport async function renderHTML(component, options = {}) {\n const htmlContent = render(component, options);\n \n // Process CSS options\n const cssOptions = cssUtils.processCSSOptions(options);\n \n // Generate CSS HTML if any CSS is specified\n let cssHtml = '';\n if (cssOptions.files.length > 0 || cssOptions.links.length > 0 || cssOptions.inline) {\n cssHtml = await cssUtils.generateCSSHtml(cssOptions, defaultCSSManager);\n }\n \n // If the component includes a head tag, inject CSS into it\n if (cssHtml && htmlContent.includes('<head>')) {\n const htmlWithCSS = htmlContent.replace(\n '</head>', \n `${cssHtml}\\n</head>`\n );\n return `<!DOCTYPE html>\\n${htmlWithCSS}`;\n }\n \n // If there's CSS but no head tag, wrap the component with a basic HTML structure\n if (cssHtml) {\n return `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n${cssHtml}\n</head>\n<body>\n${htmlContent}\n</body>\n</html>`;\n }\n \n return `<!DOCTYPE html>\\n${htmlContent}`;\n}\n\n/**\n * Synchronous version of render for cases without CSS files\n * Falls back to async if CSS files are detected\n */\nexport function renderHTMLSync(component, options = {}) {\n const cssOptions = cssUtils.processCSSOptions(options);\n \n // If CSS files are specified, return a promise\n if (cssOptions.files.length > 0) {\n console.warn('CSS files detected, use render() (async) instead of renderSync()');\n return render(component, options);\n }\n \n const htmlContent = render(component, options);\n \n // Handle inline CSS and external links only\n let cssHtml = '';\n if (cssOptions.links.length > 0) {\n cssHtml += defaultCSSManager.generateCSSLinks(cssOptions.links);\n }\n if (cssOptions.inline) {\n cssHtml += `\\n${ defaultCSSManager.generateInlineStyles(cssOptions.inline)}`;\n }\n \n if (cssHtml && htmlContent.includes('<head>')) {\n const htmlWithCSS = htmlContent.replace(\n '</head>', \n `${cssHtml}\\n</head>`\n );\n return `<!DOCTYPE html>\\n${htmlWithCSS}`;\n }\n \n if (cssHtml) {\n return `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n${cssHtml}\n</head>\n<body>\n${htmlContent}\n</body>\n</html>`;\n }\n \n return `<!DOCTYPE html>\\n${htmlContent}`;\n}\n\n\n// Old functions removed - now part of HTMLRenderer class\n\n// Old helper functions removed - now available in RendererUtils from BaseRenderer\n\n/**\n * Batch rendering for multiple components\n */\nexport function renderBatch(components, options = {}) {\n if (!Array.isArray(components)) {\n throw new Error('renderBatch expects an array of components');\n }\n\n // Merge default options with provided options\n const mergedOptions = {\n enableCache: true,\n enableMonitoring: false,\n ...options\n };\n\n const renderer = new HTMLRenderer(mergedOptions);\n return components.map(component => renderer.render(component, mergedOptions));\n}\n\n/**\n * Real streaming render - yields chunks progressively as HTML is generated\n * Ideal for large component trees or memory-constrained environments\n */\nexport async function* renderToStream(component, options = {}) {\n const config = {\n chunkSize: 8192, // 8KB default chunk size\n maxDepth: 1000,\n yieldThreshold: 100, // Yield control every 100 elements\n encoding: 'utf8',\n ...options\n };\n\n let buffer = '';\n let elementCount = 0;\n\n // Helper to flush buffer when it reaches chunk size\n async function* flushBuffer(force = false) {\n if (force || buffer.length >= config.chunkSize) {\n if (buffer.length > 0) {\n yield buffer;\n buffer = '';\n }\n }\n }\n\n // Helper to add to buffer\n async function* write(text) {\n buffer += text;\n yield* flushBuffer();\n }\n\n // Recursive streaming component renderer\n async function* streamComponent(comp, depth = 0) {\n if (depth > config.maxDepth) {\n throw new Error(`Maximum nesting depth exceeded: ${config.maxDepth}`);\n }\n\n // Handle null/undefined\n if (comp === null || comp === undefined) return;\n\n // Handle primitives\n if (typeof comp === 'string' || typeof comp === 'number') {\n yield* write(escapeHtml(String(comp)));\n return;\n }\n\n // Handle arrays\n if (Array.isArray(comp)) {\n for (const child of comp) {\n yield* streamComponent(child, depth);\n\n // Yield control periodically\n if (elementCount++ % config.yieldThreshold === 0) {\n await new Promise(resolve => setImmediate(resolve));\n }\n }\n return;\n }\n\n // Handle functions\n if (typeof comp === 'function') {\n const result = comp();\n yield* streamComponent(result, depth);\n return;\n }\n\n // Handle objects (HTML elements)\n if (typeof comp === 'object') {\n for (const [tagName, props] of Object.entries(comp)) {\n if (typeof props === 'object' && props !== null) {\n const { children, text, ...attributes } = props;\n const attrsStr = formatAttributes(attributes);\n const openTag = attrsStr ? `<${tagName} ${attrsStr}>` : `<${tagName}>`;\n\n if (isVoidElement(tagName)) {\n yield* write(openTag.replace('>', ' />'));\n elementCount++;\n return;\n }\n\n yield* write(openTag);\n\n if (text !== undefined) {\n yield* write(escapeHtml(String(text)));\n } else if (children) {\n yield* streamComponent(children, depth + 1);\n }\n\n yield* write(`</${tagName}>`);\n elementCount++;\n } else if (typeof props === 'string') {\n const content = escapeHtml(props);\n if (isVoidElement(tagName)) {\n yield* write(`<${tagName} />`);\n } else {\n yield* write(`<${tagName}>${content}</${tagName}>`);\n }\n elementCount++;\n }\n }\n }\n }\n\n // Start streaming\n try {\n yield* streamComponent(component);\n yield* flushBuffer(true); // Force flush remaining buffer\n } catch (error) {\n // Stream error as HTML comment\n yield `<!-- Streaming Error: ${error.message} -->`;\n }\n}\n\n/**\n * Streaming utilities for common use cases\n */\nexport const streamingUtils = {\n /**\n * Collect all chunks into a single string\n */\n async collectChunks(chunkGenerator) {\n let html = '';\n for await (const chunk of chunkGenerator) {\n html += chunk;\n }\n return html;\n },\n\n /**\n * Stream directly to a Node.js response\n */\n async streamToResponse(chunkGenerator, response) {\n let totalBytes = 0;\n response.setHeader('Content-Type', 'text/html; charset=utf-8');\n response.setHeader('Transfer-Encoding', 'chunked');\n\n for await (const chunk of chunkGenerator) {\n response.write(chunk);\n totalBytes += Buffer.byteLength(chunk);\n }\n\n response.end();\n return totalBytes;\n },\n\n /**\n * Stream with progress callback\n */\n async* streamWithProgress(chunkGenerator, onProgress) {\n let totalBytes = 0;\n let chunkCount = 0;\n\n for await (const chunk of chunkGenerator) {\n totalBytes += Buffer.byteLength(chunk);\n chunkCount++;\n\n if (onProgress) {\n onProgress({ chunkCount, totalBytes, chunk });\n }\n\n yield chunk;\n }\n }\n};\n\n/**\n * Render to chunks (legacy - kept for backward compatibility)\n * For true streaming, use renderToStream() instead\n */\nexport function* renderToChunks(component, options = {}) {\n const mergedOptions = {\n enableCache: true,\n enableMonitoring: false,\n ...options,\n chunkSize: options.chunkSize || 1024 // Default 1KB chunks\n };\n\n const html = render(component, mergedOptions);\n\n for (let i = 0; i < html.length; i += mergedOptions.chunkSize) {\n yield html.slice(i, i + mergedOptions.chunkSize);\n }\n}\n\n/**\n * Get global cache instance for external access\n */\nexport function getCache() {\n return rendererCache;\n}\n\n/**\n * Reset cache (useful for testing)\n */\nexport function resetCache() {\n if (rendererCache) {\n rendererCache.clear();\n }\n}\n\n/**\n * Get rendering statistics\n */\nexport function getRenderingStats() {\n return {\n cache: rendererCache ? rendererCache.getStats() : null,\n performance: performanceMonitor.getStats()\n };\n}\n\n/**\n * Precompile static components for maximum performance\n */\nexport function precompileComponent(component, options = {}) {\n if (!isStaticElement(component)) {\n throw new Error('Can only precompile static components');\n }\n\n const html = render(component, { ...options, enableCache: false });\n\n return {\n html,\n isPrecompiled: true,\n render: () => html\n };\n}\n\n/**\n * Development helper - render with detailed timing\n */\nexport function renderWithTiming(component, options = {}) {\n const start = performance.now();\n const html = render(component, { ...options, enableMonitoring: true });\n const end = performance.now();\n\n return {\n html,\n timing: {\n total: end - start,\n breakdown: performanceMonitor.getStats()\n }\n };\n}\n", "/**\n * Shared rendering utilities for framework integrations\n * Eliminates code duplication across Express, Fastify, Koa, Next.js integrations\n */\n\nimport { render } from '../rendering/html-renderer.js';\nimport { performanceMonitor } from '../performance/monitor.js';\n\n/**\n * Render a component with optional performance monitoring\n * This is the canonical rendering function used by all framework integrations\n * \n * @param {Object} component - Coherent.js component to render\n * @param {Object} options - Rendering options\n * @param {boolean} options.enablePerformanceMonitoring - Enable performance tracking\n * @param {string} options.template - HTML template with {{content}} placeholder\n * @returns {string} Rendered HTML\n */\nexport function renderWithMonitoring(component, options = {}) {\n const {\n enablePerformanceMonitoring = false\n } = options;\n\n let html;\n\n if (enablePerformanceMonitoring) {\n const renderId = performanceMonitor.startRender();\n html = render(component);\n performanceMonitor.endRender(renderId);\n } else {\n html = render(component);\n }\n\n return html;\n}\n\n/**\n * Render a component and apply an HTML template\n * \n * @param {Object} component - Coherent.js component to render\n * @param {Object} options - Rendering options\n * @param {boolean} options.enablePerformanceMonitoring - Enable performance tracking\n * @param {string} options.template - HTML template with {{content}} placeholder\n * @returns {string} Final HTML with template applied\n */\nexport function renderWithTemplate(component, options = {}) {\n const {\n template = '<!DOCTYPE html>\\n{{content}}'\n } = options;\n\n const html = renderWithMonitoring(component, options);\n return template.replace('{{content}}', html);\n}\n\n/**\n * Create a component factory handler for framework integrations\n * Handles component creation, rendering, and error handling\n * \n * @param {Function} componentFactory - Function that creates a component\n * @param {Object} factoryArgs - Arguments to pass to the component factory\n * @param {Object} options - Rendering options\n * @returns {Promise<string>} Rendered HTML\n * @throws {Error} If component factory returns null/undefined or rendering fails\n */\nexport async function renderComponentFactory(componentFactory, factoryArgs, options = {}) {\n // Create component with provided arguments\n const component = await Promise.resolve(\n componentFactory(...factoryArgs)\n );\n\n if (!component) {\n throw new Error('Component factory returned null/undefined');\n }\n\n // Render with template\n return renderWithTemplate(component, options);\n}\n\n/**\n * Check if an object is a Coherent.js component\n * A Coherent.js component is a plain object with a single key representing an HTML tag\n * \n * @param {any} obj - Object to check\n * @returns {boolean} True if object is a Coherent.js component\n */\nexport function isCoherentComponent(obj) {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return false;\n }\n\n const keys = Object.keys(obj);\n return keys.length === 1;\n}\n\n/**\n * Create a standardized error response for framework integrations\n * \n * @param {Error} error - The error that occurred\n * @param {string} context - Context where the error occurred\n * @returns {Object} Error response object\n */\nexport function createErrorResponse(error, context = 'rendering') {\n return {\n error: 'Internal Server Error',\n message: error.message,\n context,\n timestamp: new Date().toISOString()\n };\n}\n", "/**\n * Koa.js integration for Coherent.js\n * Provides middleware and utilities for using Coherent.js with Koa\n */\n\nimport { importPeerDependency } from '../../core/src/utils/dependency-utils.js';\nimport { \n renderWithTemplate, \n renderComponentFactory,\n isCoherentComponent \n} from '../../core/src/utils/render-utils.js';\n\n/**\n * Coherent.js Koa middleware\n * Automatically renders Coherent.js components and handles errors\n * \n * @param {Object} options - Configuration options\n * @param {boolean} options.enablePerformanceMonitoring - Enable performance monitoring\n * @param {string} options.template - HTML template with {{content}} placeholder\n * @returns {Function} Koa middleware function\n */\nexport function coherentKoaMiddleware(options = {}) {\n const {\n enablePerformanceMonitoring = false,\n template = '<!DOCTYPE html>\\n{{content}}'\n } = options;\n \n return async (ctx, next) => {\n await next();\n \n // If response body is a Coherent.js object, render it\n if (isCoherentComponent(ctx.body)) {\n try {\n // Use shared rendering utility\n const finalHtml = renderWithTemplate(ctx.body, { enablePerformanceMonitoring, template });\n \n // Set content type and body\n ctx.type = 'text/html';\n ctx.body = finalHtml;\n } catch (_error) {\n console.error('Coherent.js rendering _error:', _error);\n throw _error;\n }\n }\n };\n}\n\n/**\n * Create a Koa route handler for Coherent.js components\n * \n * @param {Function} componentFactory - Function that returns a Coherent.js component\n * @param {Object} options - Handler options\n * @returns {Function} Koa route handler\n */\nexport function createHandler(componentFactory, options = {}) {\n return async (ctx, next) => {\n try {\n // Use shared rendering utility\n const finalHtml = await renderComponentFactory(\n componentFactory,\n [ctx, next],\n options\n );\n \n // Set response\n ctx.type = 'text/html';\n ctx.body = finalHtml;\n } catch (_error) {\n console.error('Coherent.js handler _error:', _error);\n throw _error;\n }\n };\n}\n\n/**\n * Setup Coherent.js with Koa app\n * \n * @param {Object} app - Koa app instance\n * @param {Object} options - Setup options\n */\nexport function setupCoherent(app, options = {}) {\n const {\n useMiddleware = true,\n enablePerformanceMonitoring = false\n } = options;\n \n // Use middleware for automatic rendering\n if (useMiddleware) {\n app.use(coherentKoaMiddleware({ enablePerformanceMonitoring }));\n }\n}\n\n/**\n * Create Koa integration with dependency checking\n * This function ensures Koa is available before setting up the integration\n * \n * @param {Object} options - Setup options\n * @returns {Promise<Function>} - Function to setup Koa integration\n */\nexport async function createKoaIntegration(options = {}) {\n try {\n // Verify Koa is available\n await importPeerDependency('koa', 'Koa.js');\n \n return function(app) {\n if (!app || typeof app.use !== 'function') {\n throw new Error('Invalid Koa app instance provided');\n }\n \n setupCoherent(app, options);\n return app;\n };\n } catch (_error) {\n throw _error;\n }\n}\n\n// Export all utilities\nexport default {\n coherentKoaMiddleware,\n createHandler,\n setupCoherent,\n createKoaIntegration\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["html"]
|
|
7
7
|
}
|