coralite 0.36.2 → 0.36.3
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 +1 -1
- package/dist/lib/coralite.d.ts.map +1 -1
- package/dist/lib/index.js +13 -8
- package/dist/lib/index.js.map +2 -2
- package/dist/types/core.d.ts +16 -0
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/plugin.d.ts +225 -39
- package/dist/types/plugin.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/lib/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../lib/utils.js", "../../lib/parse.js", "../../lib/dom.js", "../../lib/tags.js", "../../lib/type-helper.js", "../../lib/html.js", "../../lib/collection.js", "../../lib/render-helpers.js", "../../lib/client-runtime.js", "../../lib/style-transform.js", "../../lib/script-manager.js", "../../plugins/refs.js", "../../plugins/metadata.js", "../../lib/plugin.js", "../../plugins/static-assets.js", "../../plugins/testing.js", "../../lib/coralite.js", "../../lib/errors.js", "../../lib/config.js", "../../lib/index.js"],
|
|
4
|
-
"sourcesContent": ["import { parse as parseJS } from 'acorn'\nimport { simple as walkJS } from 'acorn-walk'\nimport render from 'dom-serializer'\nimport { sanitize } from 'isomorphic-dompurify'\nimport { parseHTML } from './parse.js'\nimport { isCoraliteNode } from './type-helper.js'\nimport { createCoraliteTextNode } from './dom.js'\nimport { BOOLEAN_ATTRIBUTES } from './tags.js'\n\n/**\n * @import {\n * CoraliteElement,\n * CoraliteModule,\n * CoraliteModuleSlotElement,\n * CoraliteModuleDefinition,\n * CoraliteTextNode,\n * CoraliteComponent,\n * CoraliteComponentResult,\n * CoraliteContentNode,\n * CoraliteAnyNode,\n * CoraliteDirective,\n * ScriptImport,\n * ScriptContent\n * } from '../types/index.js'\n */\n\nconst KEBAB_REGEX = /[-|:]([a-z])/g\n\n/**\n * Converts a kebab-case string to camelCase\n * @param {string} str - The kebab-case string to convert\n * @returns {string} - The camelCase version of the string\n */\nexport function kebabToCamel (str) {\n // replace each dash followed by a letter with the uppercase version of the letter\n return str.replace(KEBAB_REGEX, function (match, letter) {\n return letter.toUpperCase()\n })\n}\n\n/**\n * Converts all keys in an object from kebab-case to camelCase\n * @template T\n * @param {Record<string, T>} object - The object with kebab-case keys\n * @returns {Record<string, T>} - A new object with camelCase keys\n */\nexport function cleanKeys (object) {\n /** @type {Record<string, T>} */\n const result = {}\n\n for (const [key, value] of Object.entries(object)) {\n result[key] = value\n\n const camelKey = kebabToCamel(key)\n if (camelKey !== key) {\n result[camelKey] = value\n }\n }\n\n return result\n}\n\n/**\n * Recursively clones an object or array and normalizes any function state\n * it finds into a string representation that preserves standard function syntax,\n * bypassing ES6 shorthand method serialization issues.\n * @param {any} target - The object or array to normalize.\n * @param {Function} [transform] - Optional transform function for each node.\n * @param {WeakMap} [seen=new WeakMap()] - Map of seen objects to handle circular references.\n * @returns {any} A deeply cloned object with normalized functions.\n */\nexport function normalizeObjectFunctions (target, transform = null, seen = new WeakMap()) {\n if (typeof transform === 'function') {\n const transformed = transform(target)\n if (transformed !== target) {\n return transformed\n }\n }\n\n if (typeof target !== 'object' || target === null) {\n return target\n }\n\n if (seen.has(target)) {\n return seen.get(target)\n }\n\n if (Array.isArray(target)) {\n const arr = []\n seen.set(target, arr)\n for (let i = 0; i < target.length; i++) {\n arr.push(normalizeObjectFunctions(target[i], transform, seen))\n }\n return arr\n }\n\n const obj = {}\n seen.set(target, obj)\n for (const key in target) {\n if (Object.hasOwn(target, key)) {\n if (typeof target[key] === 'function') {\n const normalizedString = normalizeFunction(target[key])\n const originalFunction = target[key]\n\n const wrapper = function () {\n return originalFunction.apply(this, arguments)\n }\n wrapper.toString = () => normalizedString\n obj[key] = wrapper\n } else {\n obj[key] = normalizeObjectFunctions(target[key], transform, seen)\n }\n }\n }\n\n return obj\n}\n\n/**\n * Checks whether the given object is an object and has at least one own key.\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object is truthy and has keys, otherwise false.\n */\nexport function hasObjectKeys (obj) {\n return obj && typeof obj === 'object' && Object.keys(obj).length > 0\n}\n\n/**\n * Merges two arrays, returning a new array with unique items.\n * Uses JSON.stringify for deep comparison of object elements, preserving object uniqueness correctly.\n * @param {Array<any>} [arr1] - The first array.\n * @param {Array<any>} [arr2] - The second array.\n * @returns {Array<any>} A new array with unique values from both input arrays.\n */\nexport function mergeUniqueObjects (arr1, arr2) {\n const all = [...(arr1 || []), ...(arr2 || [])]\n const seen = new Set()\n return all.filter(item => {\n const key = typeof item === 'object' ? JSON.stringify(item) : item\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n\n/**\n * Normalizes function declarations to ensure consistent formatting.\n * Converts shorthand method syntax to full function declarations where needed,\n * while preserving arrow functions and existing full declarations.\n *\n * @param {Function} func - The function to normalize\n * @returns {string} The normalized function string representation\n */\nexport function normalizeFunction (func) {\n const original = func.toString().trim()\n\n const firstBrace = original.indexOf('{')\n const firstArrow = original.indexOf('=>')\n\n const isArrow = firstArrow !== -1 && (firstBrace === -1 || firstArrow < firstBrace)\n\n if (isArrow) {\n return original\n }\n\n // For non-arrows, extract header to check for shorthand\n const header = firstBrace !== -1 ? original.slice(0, firstBrace).trim() : original\n\n const isStandard = header.startsWith('function') || header.startsWith('async function')\n\n if (isStandard) {\n return original\n }\n\n // Handle Method Shorthand\n if (header.startsWith('async ')) {\n if (header.startsWith('async get ') || header.startsWith('async set ')) {\n return original\n }\n\n return original.replace(/^async\\s+([$\\w]+)\\s*\\(/, 'async function(')\n } else {\n if (header.startsWith('get ') || header.startsWith('set ')) {\n return original\n }\n\n return original.replace(/^([$\\w]+)\\s*\\(/, 'function(')\n }\n}\n\n\n/**\n * Recursively clones an AST node and its children, ensuring that\n * inner references (like parents and slots) point to the newly cloned nodes.\n *\n * @param {Map<Object, Object>} nodeMap - A map tracking original nodes to their newly cloned counterparts.\n * @param {Object} node - The current AST node being cloned.\n * @param {Object} [parent] - The parent node reference to assign to the clone.\n * @returns {Object} The newly cloned node.\n */\nexport function cloneNode (nodeMap, node, parent) {\n const newNode = { ...node }\n\n if (parent) {\n newNode.parent = parent\n }\n\n if (newNode.attribs) {\n newNode.attribs = { ...newNode.attribs }\n }\n\n if (newNode.slots) {\n newNode.slots = [...newNode.slots]\n }\n\n // Register in map\n nodeMap.set(node, newNode)\n\n // Recursively clone children\n if (newNode.children) {\n newNode.children = new Array(node.children.length)\n\n for (let i = 0; i < node.children.length; i++) {\n // @ts-ignore\n newNode.children[i] = cloneNode(nodeMap, node.children[i], newNode)\n }\n }\n\n // Update slot references to point to new cloned nodes\n if (newNode.slots) {\n for (let i = 0; i < newNode.slots.length; i++) {\n const slot = newNode.slots[i]\n if (slot.node) {\n const clonedNode = nodeMap.get(slot.node)\n if (clonedNode) {\n slot.node = clonedNode\n }\n }\n }\n }\n\n return newNode\n}\n\n/**\n * Creates a shallow copy of a CoraliteModule with a deep clone of its DOM tree (template) and re-linked internal references to enable safe independent mutation.\n *\n * Top-level non-DOM state (id, path, script, isTemplate, lineOffset) are shallow copied. Nested objects within these state (e.g., path) remain shared references. Only DOM-related structures undergo deep cloning and reference re-linking to isolate mutations from the original module.\n *\n * @param {CoraliteModule} originalModule - Module to clone.\n * @returns {CoraliteModule}\n */\nexport function cloneModuleInstance (originalModule) {\n const nodeMap = new Map()\n\n // Clone the main template tree\n const newTemplate = cloneNode(nodeMap, originalModule.template, null)\n\n // Reconstruct the 'values' object\n const newValues = {\n attributes: originalModule.values.attributes.map(item => ({\n ...item,\n element: nodeMap.get(item.element)\n })),\n textNodes: originalModule.values.textNodes.map(item => ({\n ...item,\n textNode: nodeMap.get(item.textNode)\n })),\n refs: originalModule.values.refs.map(item => ({\n ...item,\n element: nodeMap.get(item.element)\n }))\n }\n\n // Reconstruct customElements list\n const newCustomElements = originalModule.customElements.map(el => nodeMap.get(el))\n\n // Reconstruct slotElements\n const newSlotElements = {}\n if (originalModule.slotElements) {\n for (const modId in originalModule.slotElements) {\n newSlotElements[modId] = {}\n const slotGroup = originalModule.slotElements[modId]\n\n for (const slotName in slotGroup) {\n const slotItem = slotGroup[slotName]\n newSlotElements[modId][slotName] = {\n ...slotItem,\n element: nodeMap.get(slotItem.element)\n }\n }\n }\n }\n\n // Return the new module structure\n return {\n ...originalModule,\n template: newTemplate,\n values: newValues,\n customElements: newCustomElements,\n // @ts-ignore\n slotElements: newSlotElements\n }\n}\n\n/**\n * Replaces a token in a Coralite node based on its type, attribute, and content.\n *\n * @param {Object} token - The token to replace.\n * @param {string} token.type - The type of the token ('attribute' or 'text').\n * @param {CoraliteElement|CoraliteTextNode} token.node - The node containing the token.\n * @param {string} [token.attribute] - The attribute name to replace within the node.\n * @param {string} token.content - The content of the token.\n * @param {CoraliteModuleDefinition} token.value - The definition associated with the token.\n */\nexport function replaceToken ({\n type,\n node,\n attribute,\n content,\n value\n}) {\n if (\n type === 'attribute'\n && node.type === 'tag'\n ) {\n if (BOOLEAN_ATTRIBUTES.has(attribute) && (node.attribs[attribute] || '').trim() === content) {\n // @ts-ignore\n const isFalsy = value === 'false' || value === 'null' || value === 'undefined' || value === '0' || value === 0 || value === '' || value === false || value === null || value === undefined\n\n if (isFalsy) {\n delete node.attribs[attribute]\n } else {\n node.attribs[attribute] = ''\n }\n } else if (typeof value === 'string') {\n node.attribs[attribute] = node.attribs[attribute].replace(content, value)\n }\n } else if (node.type === 'text') {\n if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value) || value.type) {\n let nodesArray = Array.isArray(value) ? value : [value]\n\n // inject nodes\n const textSplit = node.data.split(content)\n const childIndex = node.parent.children.indexOf(node)\n const children = []\n\n // append computed tokens in between token split\n for (let i = 0; i < nodesArray.length; i++) {\n const child = nodesArray[i]\n\n if (typeof child !== 'string' && child.type !== 'directive' && typeof child === 'object' && child.type) {\n // update child parent\n // @ts-ignore\n child.parent = node.parent\n // @ts-ignore\n children.push(child)\n }\n }\n\n // replace computed token\n node.parent.children.splice(childIndex, 1,\n createCoraliteTextNode({\n type: 'text',\n data: textSplit[0],\n parent: node.parent\n }),\n // @ts-ignore\n ...children,\n createCoraliteTextNode({\n type: 'text',\n data: textSplit[1],\n parent: node.parent\n })\n )\n } else {\n // Handle object values like refs stringification\n node.data = node.data.replace(content, JSON.stringify(value))\n }\n } else {\n // replace token string\n // @ts-ignore\n const newVal = node.data.replace(content, value)\n const isHTML = /<[a-z][\\s\\S]*>/i.test(newVal)\n\n if (isHTML && node.parent\n && node.parent.type === 'tag'\n && node.parent.name === 'c-token'\n ) {\n const sanitized = sanitize(newVal)\n const parsed = parseHTML(sanitized)\n const children = parsed.root.children\n\n // Use the existing object-handling logic by recursing with the children array\n return replaceToken({\n type,\n node,\n attribute,\n content,\n value: children\n })\n }\n node.data = newVal\n }\n }\n}\n\n/**\n * Creates a deep copy of a CoraliteComponent with re-linked internal references to enable safe independent mutation.\n *\n * @param {CoraliteComponent & CoraliteComponentResult} originalDocument - Document to clone.\n * @returns {CoraliteComponent & CoraliteComponentResult}\n */\nexport function cloneComponentInstance (originalDocument) {\n const nodeMap = new Map()\n const newRoot = cloneNode(nodeMap, originalDocument.root, null)\n\n const newCustomElements = originalDocument.customElements.map(el => nodeMap.get(el))\n const newTempElements = originalDocument.tempElements ? originalDocument.tempElements.map(el => nodeMap.get(el)) : []\n const newSkipRenderElements = originalDocument.skipRenderElements ? originalDocument.skipRenderElements.map(el => nodeMap.get(el)) : []\n\n return {\n ...originalDocument,\n state: { ...originalDocument.state },\n root: newRoot,\n customElements: newCustomElements,\n tempElements: newTempElements,\n skipRenderElements: newSkipRenderElements\n }\n}\n\n/**\n * Extracts and normalizes the script content from a component definition.\n *\n * @param {string} code - The raw script content\n * @returns {ScriptContent | null}\n */\nexport function findAndExtractScript (code) {\n const ast = parseJS(code, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n locations: true\n })\n\n /** @type {ScriptContent | null} */\n let result = null\n const components = new Set()\n\n walkJS(ast, {\n CallExpression (node) {\n if (\n node.callee &&\n node.callee.type === 'Identifier' &&\n node.callee.name === 'defineComponent'\n ) {\n const firstArg = node.arguments[0]\n\n if (firstArg && firstArg.type === 'ObjectExpression') {\n const scriptProp = firstArg.properties.find(\n prop => prop.type === 'Property' &&\n prop.key && prop.key.type === 'Identifier' &&\n prop.key.name === 'script'\n )\n\n if (scriptProp && scriptProp.type === 'Property') {\n const { value, method } = scriptProp\n let startLine = value.loc.start.line - 1\n let prefix = ''\n let content = ''\n\n // Get source slice\n const source = code.slice(value.start, value.end)\n\n if (value.type === 'ArrowFunctionExpression') {\n content = prefix + source\n startLine = value.loc.start.line - 1\n } else if (value.type === 'FunctionExpression') {\n if (method) {\n const isAsync = value.async\n prefix += (isAsync ? 'async ' : '') + 'function script'\n content = prefix + source\n startLine = scriptProp.key.loc.start.line - 1\n } else {\n content = prefix + source\n startLine = value.loc.start.line - 1\n }\n }\n\n result = {\n content,\n lineOffset: startLine\n }\n }\n }\n } else if (\n node.callee &&\n node.callee.type === 'MemberExpression' &&\n node.callee.object &&\n node.callee.object.type === 'Identifier' &&\n node.callee.object.name === 'document' &&\n node.callee.property &&\n node.callee.property.type === 'Identifier' &&\n node.callee.property.name === 'createElement'\n ) {\n const arg = node.arguments[0]\n if (arg && arg.type === 'Literal' && typeof arg.value === 'string') {\n components.add(arg.value)\n }\n }\n }\n })\n\n if (result && components.size > 0) {\n result.components = Array.from(components)\n }\n\n return result\n}\n\n/**\n * Extracts and normalizes the state content from a component definition.\n *\n * @param {string} code - The raw script content\n * @returns {ScriptContent | null}\n */\nexport function findAndExtractProperties (code) {\n const ast = parseJS(code, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n locations: true\n })\n\n /** @type {ScriptContent | null} */\n let result = null\n\n walkJS(ast, {\n CallExpression (node) {\n if (\n node.callee &&\n node.callee.type === 'Identifier' &&\n node.callee.name === 'defineComponent'\n ) {\n const firstArg = node.arguments[0]\n\n if (firstArg && firstArg.type === 'ObjectExpression') {\n const stateProp = firstArg.properties.find(\n prop => prop.type === 'Property' &&\n prop.key && prop.key.type === 'Identifier' &&\n prop.key.name === 'state'\n )\n\n if (stateProp && stateProp.type === 'Property') {\n const { value, method } = stateProp\n let startLine = value.loc.start.line - 1\n let prefix = ''\n let content = ''\n\n // Get source slice\n const source = code.slice(value.start, value.end)\n\n if (value.type === 'ArrowFunctionExpression') {\n content = prefix + source\n startLine = value.loc.start.line - 1\n } else if (value.type === 'FunctionExpression') {\n if (method) {\n const isAsync = value.async\n prefix += (isAsync ? 'async ' : '') + 'function state'\n content = prefix + source\n startLine = stateProp.key.loc.start.line - 1\n } else {\n content = prefix + source\n startLine = value.loc.start.line - 1\n }\n } else if (value.type === 'ObjectExpression') {\n // Wrap object in a function returning that object\n content = `() => (${source})`\n startLine = value.loc.start.line - 1\n }\n\n result = {\n content,\n lineOffset: startLine\n }\n }\n }\n }\n }\n })\n\n return result\n}\n\n/**\n * Transforms Coralite AST nodes into HTML strings for serialization.\n *\n * @param {any} target - The target to transform.\n * @returns {any} The transformed target.\n */\nexport function astTransformer (target) {\n if (isCoraliteNode(target)) {\n // @ts-ignore\n return render(target, { decodeEntities: false })\n }\n\n if (Array.isArray(target) && target.length > 0 && isCoraliteNode(target[0])) {\n // @ts-ignore\n return render(target, { decodeEntities: false })\n }\n\n return target\n}\n\n/**\n * Calculates the DOM path from a node to the root.\n * @param {Object} node - The node to calculate the path for.\n * @param {Object} root - The root node.\n * @returns {Array<number>} An array of indices representing the path.\n */\nexport function getNodePath (node, root) {\n const path = []\n let current = node\n while (current && current !== root) {\n const parent = current.parent\n if (!parent) {\n break\n }\n const index = parent.children.indexOf(current)\n if (index === -1) {\n break\n }\n path.unshift(index)\n current = parent\n }\n return path\n}\n\n/**\n * Generates a hydration map for the client.\n * @param {Array<Object>} templateNodes - The component's template nodes.\n * @param {Object} templateValues - The component's template values.\n * @returns {Object} The hydration map.\n */\nexport function generateHydrationMap (templateNodes, templateValues) {\n const map = {\n texts: [],\n attributes: [],\n refs: []\n }\n\n if (!templateNodes || !templateValues) {\n return map\n }\n\n const root = templateNodes.length > 0 ? templateNodes[0].parent : { children: templateNodes }\n\n if (templateValues.textNodes) {\n for (const item of templateValues.textNodes) {\n if (item.textNode) {\n const isHtml = item.type === 'html'\n const targetNode = isHtml ? item.textNode.parent : item.textNode\n\n map.texts.push({\n path: getNodePath(targetNode, root),\n template: item.textNode.data,\n type: isHtml ? 'html' : 'text'\n })\n }\n }\n }\n\n if (templateValues.attributes) {\n for (const item of templateValues.attributes) {\n if (item.element && item.element.attribs) {\n const originalValue = item.element.attribs[item.name]\n map.attributes.push({\n path: getNodePath(item.element, root),\n name: item.name,\n template: originalValue\n })\n }\n }\n }\n\n if (templateValues.refs) {\n for (const item of templateValues.refs) {\n if (item.element) {\n map.refs.push({\n path: getNodePath(item.element, root),\n name: item.name\n })\n }\n }\n }\n\n return map\n}\n\n/**\n * Recursively adds a component and its dependencies to a tracking object.\n *\n * @param {string} componentId - The ID of the component to add.\n * @param {Object.<string, boolean>} processed - The object tracking processed components.\n * @param {Object.<string, any>} sharedFunctions - The map of shared component functions.\n */\nexport function addComponentAndDependencies (componentId, processed, sharedFunctions) {\n if (!processed[componentId] && sharedFunctions[componentId]) {\n processed[componentId] = true\n\n // Add all dependencies of this component\n const dependencies = sharedFunctions[componentId].components || []\n for (const depId of dependencies) {\n addComponentAndDependencies(depId, processed, sharedFunctions)\n }\n }\n}\n\n/**\n * Recursively clones an AST node and its children, stripping circular references\n * and assigning unique IDs for client-side hydration.\n *\n * @param {Array<Object>} nodes - The nodes to clean.\n * @param {WeakMap} nodeMap - Map to track original nodes to their unique IDs.\n * @param {Object} state - Object containing the current node counter.\n * @returns {Array<Object>|null} The cleaned AST nodes.\n */\nexport function cleanAST (nodes, nodeMap, state) {\n if (!nodes) {\n return null\n }\n\n return nodes.map((node) => {\n const cloned = { ...node }\n // Assign unique ID for token mapping\n const id = state.counter++\n nodeMap.set(node, id)\n cloned._id = id\n\n // Remove circular references\n delete cloned.parent\n delete cloned.prev\n delete cloned.next\n delete cloned.slots\n\n if (cloned.children) {\n cloned.children = cleanAST(cloned.children, nodeMap, state)\n }\n return cloned\n })\n}\n\n/**\n * Cleans the template values object, mapping original node references to unique IDs.\n *\n * @param {Object} values - The values object to clean.\n * @param {WeakMap} nodeMap - Map of original nodes to their unique IDs.\n * @returns {Object|null} The cleaned values object.\n */\nexport function cleanValues (values, nodeMap) {\n if (!values) {\n return null\n }\n\n const result = { ...values }\n\n if (result.attributes) {\n result.attributes = result.attributes.map(item => {\n const cloned = { ...item }\n cloned.elementId = nodeMap.get(item.element)\n delete cloned.element\n return cloned\n })\n }\n\n if (result.textNodes) {\n result.textNodes = result.textNodes.map(item => {\n const cloned = { ...item }\n cloned.textNodeId = nodeMap.get(item.textNode)\n delete cloned.textNode\n return cloned\n })\n }\n\n if (result.refs) {\n result.refs = result.refs.map(item => {\n const cloned = { ...item }\n cloned.elementId = nodeMap.get(item.element)\n delete cloned.element\n return cloned\n })\n }\n return result\n}\n\n/**\n * Safely merges partial plugin updates into the main context object.\n * Deeply merges plain objects and overwrites other types (arrays, primitives, etc.).\n *\n * @param {any} current - The current state object.\n * @param {any} patch - The patch object containing updates.\n * @returns {any} The newly merged state object.\n */\nexport function mergePluginState (current, patch) {\n if (!patch || typeof patch !== 'object') {\n return current\n }\n\n const result = { ...current }\n\n for (const key of Object.keys(patch)) {\n const patchValue = patch[key]\n const currentValue = result[key]\n\n // If both are plain objects, merge them deeply\n if (\n patchValue && typeof patchValue === 'object' && !Array.isArray(patchValue) &&\n currentValue && typeof currentValue === 'object' && !Array.isArray(currentValue)\n ) {\n result[key] = mergePluginState(currentValue, patchValue)\n } else {\n // Otherwise, overwrite (Arrays, strings, numbers, etc.)\n result[key] = patchValue\n }\n }\n\n return result\n}\n\n/**\n * Extracts global variable names from a module script code using Acorn parsing and AST walking.\n * @param {string} code - The raw script code\n * @returns {Array<string>} - Array of identified global variables\n */\n/**\n * Extracts all component tag names dynamically created via document.createElement.\n *\n * @param {string} code - The raw script content\n * @returns {Array<string>} - Array of identified imperative component tags\n */\nexport function findAndExtractImperativeComponents (code) {\n try {\n const ast = parseJS(code, {\n ecmaVersion: 'latest',\n sourceType: 'module'\n })\n\n const components = new Set()\n\n walkJS(ast, {\n CallExpression (node) {\n if (\n node.callee &&\n node.callee.type === 'MemberExpression' &&\n node.callee.object &&\n node.callee.object.type === 'Identifier' &&\n node.callee.object.name === 'document' &&\n node.callee.property &&\n node.callee.property.type === 'Identifier' &&\n node.callee.property.name === 'createElement'\n ) {\n const arg = node.arguments[0]\n if (arg && arg.type === 'Literal' && typeof arg.value === 'string' && arg.value.includes('-')) {\n components.add(arg.value)\n }\n }\n }\n })\n\n return [...components]\n } catch (err) {\n return []\n }\n}\n\n/**\n * Creates a reactive proxy that triggers a callback on changes.\n * Supports deep reactivity via lazy proxying of nested objects.\n *\n * @param {Object} target - The object to proxy.\n * @param {Function} onChange - Callback triggered when a property is set or deleted.\n * @param {WeakMap} [proxies=new WeakMap()] - Cache for existing proxies to handle circular references and identity.\n * @returns {Proxy} The reactive proxy.\n */\nexport function createReactiveProxy (target, onChange, proxies = new WeakMap()) {\n if (proxies.has(target)) {\n return proxies.get(target)\n }\n\n const handler = {\n get (target, property, receiver) {\n const value = Reflect.get(target, property, receiver)\n if (value !== null && typeof value === 'object' && !(typeof Node !== 'undefined' && value instanceof Node)) {\n return createReactiveProxy(value, onChange, proxies)\n }\n return value\n },\n set (target, property, value, receiver) {\n const oldValue = target[property]\n if (oldValue === value && property in target) {\n return true\n }\n\n const result = Reflect.set(target, property, value, receiver)\n if (result) {\n onChange({\n property,\n value,\n oldValue,\n target\n })\n }\n return result\n },\n deleteProperty (target, property) {\n const hadProperty = Object.prototype.hasOwnProperty.call(target, property)\n const oldValue = target[property]\n const result = Reflect.deleteProperty(target, property)\n if (result && hadProperty) {\n onChange({\n property,\n value: undefined,\n oldValue,\n target,\n deleted: true\n })\n }\n return result\n }\n }\n\n const proxy = new Proxy(target, handler)\n proxies.set(target, proxy)\n return proxy\n}\n\n/**\n * Creates a read-only proxy that throws on mutation attempts.\n * @param {Object} target - The object to proxy.\n * @param {WeakMap} [proxies=new WeakMap()] - Cache for existing proxies.\n * @returns {Proxy} The read-only proxy.\n */\nexport function createReadOnlyProxy (target, proxies = new WeakMap()) {\n if (proxies.has(target)) {\n return proxies.get(target)\n }\n\n const handler = {\n get (target, property, receiver) {\n const value = Reflect.get(target, property, receiver)\n if (value !== null && typeof value === 'object' && !(typeof Node !== 'undefined' && value instanceof Node)) {\n return createReadOnlyProxy(value, proxies)\n }\n return value\n },\n set () {\n throw new Error('Coralite Error: Cannot mutate state inside a getter. State is read-only here.')\n },\n deleteProperty () {\n throw new Error('Coralite Error: Cannot delete state inside a getter. State is read-only here.')\n }\n }\n\n const proxy = new Proxy(target, handler)\n\n proxies.set(target, proxy)\n\n return proxy\n}\n\n/**\n *\n */\nexport function extractGlobals (code) {\n try {\n const ast = parseJS(code, {\n ecmaVersion: 'latest',\n sourceType: 'module'\n })\n\n const globals = new Set()\n walkJS(ast, {\n Identifier (node) {\n globals.add(node.name)\n }\n })\n\n return [...globals]\n } catch (err) {\n return []\n }\n}\n", "import { Parser } from 'htmlparser2'\nimport {\n createCoraliteElement,\n createCoraliteTextNode,\n createCoraliteComment,\n createCoraliteDirective,\n createCoraliteComponent\n} from './dom.js'\nimport { isValidCustomElementName, VALID_TAGS } from './tags.js'\n\n\n/**\n * @internal\n * @param {CoraliteElement} element - The element being parsed\n * @param {Record<string, string>} attributes - A dictionary of element attributes\n * @param {Array<string | Attribute>} skipRenderByAttribute - Keys to search for skip flag\n */\nfunction applySkipRenderAttribute (element, attributes, skipRenderByAttribute) {\n if (skipRenderByAttribute && skipRenderByAttribute.length > 0) {\n for (let i = 0; i < skipRenderByAttribute.length; i++) {\n const skipItem = skipRenderByAttribute[i]\n if (typeof skipItem === 'string') {\n if (Object.prototype.hasOwnProperty.call(attributes, skipItem)) {\n element.skipRender = true\n break\n }\n } else if (skipItem && typeof skipItem === 'object') {\n if (Object.prototype.hasOwnProperty.call(attributes, skipItem.name) && attributes[skipItem.name].includes(skipItem.value)) {\n element.skipRender = true\n break\n }\n }\n }\n }\n}\n\nfunction handleTemplateOpenTag (attributes) {\n if (!attributes.id) {\n throw new Error('Template requires an \"id\"')\n }\n if (!isValidCustomElementName(attributes.id)) {\n throw new Error('Invalid template id: \"' + attributes.id + '\" it must match following the pattern https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name')\n }\n return attributes.id\n}\n\n/**\n * @internal\n * @param {CoraliteElement} element - The slot element node\n * @param {Record<string, string>} attributes - A dictionary of element attributes\n * @param {string} templateId - Current template definition id\n * @param {Object.<string, Object.<string, CoraliteModuleSlotElement>>} slotElements - State containing slot lists\n */\nfunction handleSlotOpenTag (element, attributes, templateId, slotElements) {\n const name = attributes.name || 'default'\n if (slotElements[templateId] && slotElements[templateId][name]) {\n throw new Error('Slot names must be unique: \"' + name + '\"')\n }\n const slot = {\n name,\n element\n }\n if (!slotElements[templateId]) {\n slotElements[templateId] = { [name]: slot }\n } else {\n slotElements[templateId][name] = slot\n }\n}\n\n/**\n * @import {\n * CoraliteToken,\n * CoraliteModule,\n * CoraliteTextNode,\n * CoraliteElement,\n * CoraliteModuleSlotElement,\n * CoraliteComponentValues,\n * CoraliteComponentRoot,\n * CoraliteContentNode,\n * Attribute,\n * ParseHTMLResult,\n * CoraliteOnError} from '../types/index.js'\n */\n\n/**\n * Parse HTML content and return a CoraliteComponent object representing the parsed component structure\n *\n * @param {string} string - HTML content to parse as string input type textual data\n * @param {Array<string | Attribute>} [ignoreByAttribute] - Ignore element with attribute name value pair\n * @param {Array<string | Attribute>} [skipRenderByAttribute] - Parse element but remove before final render\n * @param {CoraliteOnError} [onError] - Callback function for error and warning handling\n * @returns {ParseHTMLResult}\n * @example parseHTML('<h1>Hello world!</h1>')\n */\nexport function parseHTML (string, ignoreByAttribute, skipRenderByAttribute, onError) {\n // root element reference\n const root = createCoraliteComponent({\n type: 'root',\n children: []\n })\n\n // stack to keep track of current element hierarchy\n /** @type {CoraliteContentNode[]} */\n const stack = [root]\n const customElements = []\n /** @type {CoraliteElement[]} */\n const tempElements = []\n /** @type {CoraliteElement[]} */\n const skipRenderElements = []\n\n const ignoreAttributeMap = getIgnoreAttributeMap(ignoreByAttribute)\n\n const parser = new Parser({\n onprocessinginstruction (name, data) {\n root.children.push(createCoraliteDirective({\n type: 'directive',\n name,\n data\n }))\n },\n onopentag (originalName, attributes) {\n const name = originalName.toLowerCase()\n const parent = stack[stack.length - 1]\n const element = createElement({\n name,\n attributes,\n parent,\n ignoreByAttribute: ignoreAttributeMap,\n onError\n })\n\n applySkipRenderAttribute(element, attributes, skipRenderByAttribute)\n\n if (element.slots) {\n // store custom element\n customElements.push(element)\n }\n\n // push element to stack as it may have children\n stack.push(element)\n },\n ontext (text) {\n const parent = stack[stack.length - 1]\n\n createTextNode(text, parent)\n },\n onclosetag () {\n const element = stack[stack.length - 1]\n\n if (element.type === 'tag') {\n if (element.remove) {\n // store element for removal\n // @ts-ignore\n tempElements.push(element.parent.children[element.parent.children.length - 1])\n } else if (element.skipRender) {\n // @ts-ignore\n skipRenderElements.push(element.parent.children[element.parent.children.length - 1])\n }\n }\n\n // remove current element from stack as we're done with its children\n stack.pop()\n },\n oncomment (data) {\n const parent = stack[stack.length - 1]\n\n parent.children.push(createCoraliteComment({\n type: 'comment',\n data,\n parent\n }))\n }\n }, { decodeEntities: false })\n\n parser.write(string)\n parser.end()\n\n sortSlottedChildren(customElements)\n\n return {\n root,\n customElements,\n tempElements,\n skipRenderElements\n }\n}\n\n/**\n * Processes custom elements to organize their children by slot name.\n * @param {CoraliteElement[]} elements - Array of custom element objects with `children` and `attribs`.\n */\nfunction sortSlottedChildren (elements) {\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i]\n\n for (let k = 0; k < element.children.length; k++) {\n const childNode = element.children[k]\n let slotName = 'default'\n\n if (childNode.type === 'tag'\n && childNode.attribs\n && childNode.attribs.slot) {\n slotName = childNode.attribs.slot\n\n // clean up slot attribute\n delete childNode.attribs.slot\n }\n\n element.slots.push({\n name: slotName,\n node: childNode\n })\n }\n }\n}\n\n/**\n * Parses HTML string containing meta tags or generates Coralite module structure from markup.\n *\n * @param {string} string - HTML content containing meta tags or module markup\n * @param {Object} options\n * @param {Array<string | Attribute>} options.ignoreByAttribute - An array of attribute names and values to ignore during parsing\n * @param {Array<string | Attribute>} [options.skipRenderByAttribute] - An array of attributes that exclude element from rendering\n * @param {CoraliteOnError} [options.onError] - Callback function for error and warning handling\n * @returns {CoraliteModule} - Parsed module information, including template, script, tokens, and slot configurations\n *\n * @example\n * ```\n * // example usage:\n * const html = `<template id=\"home\">\n * <slot name=\"default\">Hello</slot>\n * </template>`;\n * const module = parseModule(html, { ignoreByAttribute: [] });\n *\n * // module object structure will be:\n * //{\n * // id: 'home',\n * // template: { ... },\n * // tokens: [],\n * // customElements: [],\n * // slotElements: {\n * // default: {\n * // name: 'slot',\n * // element: {}\n * // }\n * // }\n * //}\n * ```\n */\nexport function parseModule (string, { ignoreByAttribute, skipRenderByAttribute, onError }) {\n // root element reference\n const root = createCoraliteComponent({\n type: 'root',\n children: []\n })\n // stack to keep track of current element hierarchy\n /** @type {CoraliteContentNode[]} */\n const stack = [root]\n const customElements = []\n /** @type {Object.<string, Object.<string,CoraliteModuleSlotElement>>} */\n const slotElements = {}\n /** @type {CoraliteComponentValues} */\n const documentValues = {\n refs: [],\n attributes: [],\n textNodes: []\n }\n const styles = []\n let isScript = false\n let isTemplate = false\n let templateId = ''\n const rootClasses = new Set()\n const descendantClasses = new Set()\n\n const ignoreAttributeMap = getIgnoreAttributeMap(ignoreByAttribute)\n\n const parser = new Parser({\n onopentag (originalName, attributes) {\n const parent = stack[stack.length - 1]\n const element = createElement({\n name: originalName,\n attributes,\n parent,\n ignoreByAttribute: ignoreAttributeMap,\n onError\n })\n\n applySkipRenderAttribute(element, attributes, skipRenderByAttribute)\n\n if (element.slots) {\n customElements.push(element)\n }\n\n // push element to stack as it may have children\n stack.push(element)\n\n if (element.name === 'script') {\n isScript = true\n } else if (element.name === 'template') {\n isTemplate = true\n templateId = handleTemplateOpenTag(attributes)\n } else if (element.name === 'slot') {\n handleSlotOpenTag(element, attributes, templateId, slotElements)\n } else if (isTemplate) {\n const attributeNames = Object.keys(attributes)\n\n // Collect classes\n if (attributes.class && parent.type !== 'root') {\n const classes = attributes.class.trim().split(/\\s+/)\n const isRoot = parent.name === 'template'\n\n for (const className of classes) {\n if (className) {\n if (isRoot) {\n rootClasses.add(className)\n } else {\n descendantClasses.add(className)\n }\n }\n }\n }\n\n // collect tokens inside template tag\n if (attributeNames.length) {\n for (let i = 0; i < attributeNames.length; i++) {\n const name = attributeNames[i]\n const value = attributes[name]\n const tokens = getTokensFromString(value)\n\n // store attribute tokens\n if (tokens.length) {\n documentValues.attributes.push({\n name,\n tokens,\n element\n })\n }\n\n if (name === 'ref') {\n documentValues.refs.push({\n name: value,\n element\n })\n }\n }\n }\n }\n },\n ontext (text) {\n const parent = stack[stack.length - 1]\n\n if (isTemplate && !isScript && text.trim()) {\n const topLevelTokens = getTokensFromString(text, true)\n\n if (topLevelTokens.length) {\n let lastIndex = 0\n for (const token of topLevelTokens) {\n const index = text.indexOf(token.content, lastIndex)\n\n if (index > lastIndex) {\n createTextNode(text.substring(lastIndex, index), parent)\n }\n\n const cToken = createCoraliteElement({\n type: 'tag',\n name: 'c-token',\n parent,\n attribs: {},\n children: []\n })\n parent.children.push(cToken)\n\n const tokenNode = createTextNode(token.content, cToken)\n documentValues.textNodes.push({\n tokens: getTokensFromString(token.content),\n textNode: tokenNode,\n type: 'html'\n })\n\n lastIndex = index + token.content.length\n }\n\n if (lastIndex < text.length) {\n createTextNode(text.substring(lastIndex), parent)\n }\n return\n }\n }\n\n createTextNode(text, parent)\n },\n onclosetag (name) {\n const element = stack[stack.length - 1]\n\n if (element.type === 'tag' && element.remove) {\n // remove element from tree\n element.parent.children.pop()\n }\n\n if (name === 'template') {\n // exit template tag\n isTemplate = false\n } else if (name === 'script') {\n isScript = false\n }\n\n // remove current element from stack as we're done with its children\n stack.pop()\n },\n oncdatastart (csb) {\n console.log(csb)\n },\n\n oncomment (data) {\n stack[stack.length - 1].children.push(createCoraliteComment({\n type: 'comment',\n data,\n parent: stack[stack.length - 1]\n }))\n }\n }, { decodeEntities: false })\n\n parser.write(string)\n parser.end()\n\n /** @type {CoraliteElement} */\n let template\n let script\n\n for (let i = 0; i < root.children.length; i++) {\n const node = root.children[i]\n\n if (node.type === 'tag') {\n if (node.name === 'template') {\n if (template) {\n throw new Error('One template element is permitted')\n }\n\n // @ts-ignore\n template = node\n\n } else if (node.name === 'script') {\n if (node.attribs.type !== 'module') {\n throw new Error('Template \"' + templateId + '\" script tag must contain the `type=\"module\"` attribute')\n }\n const scriptString = node.children[0]\n\n if (scriptString.type !== 'text') {\n throw new Error('Script tag must contain text')\n }\n\n script = scriptString.data\n } else if (node.name === 'style') {\n const styleContent = node.children[0]\n\n if (styleContent && styleContent.type === 'text') {\n styles.push(styleContent.data)\n }\n }\n }\n }\n\n if (!template) {\n return {\n isTemplate: false\n }\n }\n\n const scriptIndex = string.indexOf('<script')\n const stringHead = string.substring(0, scriptIndex)\n const lineOffset = stringHead.split(/\\r\\n|\\r|\\n/).length - 1\n\n return {\n id: template.attribs.id,\n template,\n script,\n styles,\n values: documentValues,\n lineOffset,\n customElements,\n slotElements,\n isTemplate: true,\n rootClasses,\n descendantClasses\n }\n}\n\n/**\n * Creates an element within the component structure based on provided parameters.\n * @param {Object} data - An object containing details needed to create the element.\n * @param {string} data.name - The tag name of the new element.\n * @param {Object.<string, string>} data.attributes - Attributes for the new element.\n * @param {CoraliteElement | CoraliteComponentRoot} data.parent - Parent element or component root where this element will be attached.\n * @param {Array<string | Attribute> | Map<string, string[]>} [data.ignoreByAttribute] - Optional parameter used for ignoring elements based on attributes.\n * @param {CoraliteOnError} [data.onError] - Callback function for error and warning handling\n * @returns {CoraliteElement} The newly created element with its parent reference and position in the parent's children list.\n */\nexport function createElement ({\n name,\n attributes,\n parent,\n ignoreByAttribute,\n onError\n}) {\n const sanitisedName = name.toLowerCase()\n const element = createCoraliteElement({\n type: 'tag',\n name: sanitisedName,\n attribs: attributes,\n children: [],\n parent,\n parentChildIndex: parent.children.length\n })\n\n if (ignoreByAttribute) {\n const ignore = findAttributesToIgnore(ignoreByAttribute, attributes)\n\n if (ignore) {\n element.remove = true\n }\n }\n\n if (!VALID_TAGS[sanitisedName]) {\n const specUrl = 'https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name'\n\n try {\n element.name = name\n\n // check if the tag name matches the regex for valid custom elements\n if (isValidCustomElementName(name)) {\n // store custom elements\n element.slots = []\n } else {\n const message = 'Invalid custom element tag name: \"' + name + '\" (' + specUrl + ')'\n if (typeof onError === 'function') {\n onError({\n level: 'WARN',\n message\n })\n } else {\n console.warn(message)\n }\n }\n } catch (error) {\n const message = error.message + ' (' + specUrl + ')'\n if (typeof onError === 'function') {\n onError({\n level: 'WARN',\n message,\n error\n })\n } else {\n console.warn(message)\n }\n }\n }\n\n // add element to its parent's children\n parent.children.push(element)\n\n return element\n}\n\n/**\n * @param {string} data - The text content to create a text node\n * @param {CoraliteElement | CoraliteComponentRoot} parent - parent node\n * @returns {CoraliteTextNode}\n *\n * @example\n * const textNode = createTextNode('Hello World', parentNode);\n */\nexport function createTextNode (data, parent) {\n /** @type {CoraliteTextNode} */\n const textNode = createCoraliteTextNode({\n type: 'text',\n data,\n parent\n })\n\n // @ts-ignore\n parent.children.push(textNode)\n\n return textNode\n}\n\n/**\n * Find attributes to be ignored by the parser.\n *\n * @param {Array<string | Attribute> | Map<string, Array<string | null>>} ignoreByAttribute - An array of attribute pairs/strings or a map to be ignored by the parser\n * @param {Object<string, string>} attributes - The HTML attribute object to be parsed by the parser\n * @returns {boolean}\n */\nfunction findAttributesToIgnore (ignoreByAttribute, attributes) {\n if (Array.isArray(ignoreByAttribute)) {\n for (let i = 0; i < ignoreByAttribute.length; i++) {\n const item = ignoreByAttribute[i]\n if (typeof item === 'string') {\n if (Object.prototype.hasOwnProperty.call(attributes, item)) {\n return true\n }\n } else {\n const { name, value } = item\n if (attributes[name] && attributes[name].includes(value)) {\n return true\n }\n }\n }\n return false\n }\n\n // Handle Map optimization\n for (const name in attributes) {\n if (Object.prototype.hasOwnProperty.call(attributes, name)) {\n if (ignoreByAttribute.has(name)) {\n const values = ignoreByAttribute.get(name)\n const attributeValue = attributes[name]\n\n for (let i = 0; i < values.length; i++) {\n if (values[i] === null) {\n return true\n } else if (attributeValue.includes(values[i])) {\n return true\n }\n }\n }\n }\n }\n\n return false\n}\n\n/**\n * Create a map from ignoreByAttribute array.\n * @param {Array<string | Attribute> | Map<string, Array<string | null>>} ignoreByAttribute - The ignore configurations\n * @returns {Map<string, Array<string | null>>} The generated map\n */\nfunction getIgnoreAttributeMap (ignoreByAttribute) {\n if (!ignoreByAttribute) {\n return\n }\n\n if (!Array.isArray(ignoreByAttribute)) {\n return ignoreByAttribute\n }\n\n const map = new Map()\n\n for (let i = 0; i < ignoreByAttribute.length; i++) {\n const item = ignoreByAttribute[i]\n let name, value\n if (typeof item === 'string') {\n name = item\n value = null\n } else {\n name = item.name\n value = item.value\n }\n\n if (!map.has(name)) {\n map.set(name, [])\n }\n map.get(name).push(value)\n }\n\n return map\n}\n\n/**\n * Extract tokens from string\n * @param {string} string - The string to extract tokens from\n * @returns {CoraliteToken[]} The array of tokens extracted from the string\n *\n * @example\n * getTokensFromString('Hello {{ name }} and {{ age }}')\n * // Returns: [{ name: 'name', content: '{{ name }}' }, { name: 'age', content: '{{ age }}' }]\n *\n * Handles:\n * - Multiple tokens in one string\n * - Nested braces: {{ {{nested}} }} extracts both\n * - Complex token names: {{ user.name }}, {{ items[0] }}\n * - Empty tokens: {{}} (returns empty name)\n * - Malformed tokens: {{unclosed, {{extra}} braces}}\n */\nfunction getTokensFromString (string, topLevelOnly = false) {\n const result = []\n let i = 0\n\n while (i < string.length) {\n if (string[i] === '{' && string[i + 1] === '{') {\n const tokenStart = i\n i += 2\n\n // Track brace depth for nested tokens\n let depth = 1\n let tokenEnd = -1\n\n // Scan until we find matching closing braces\n while (i < string.length && depth > 0) {\n if (string[i] === '{' && string[i + 1] === '{') {\n depth++\n i += 2\n } else if (string[i] === '}' && string[i + 1] === '}') {\n depth--\n if (depth === 0) {\n tokenEnd = i + 2\n break\n }\n i += 2\n } else {\n i++\n }\n }\n\n // If we found a complete token\n if (tokenEnd > 0) {\n const fullToken = string.slice(tokenStart, tokenEnd)\n const tokenContent = fullToken.slice(2, -2).trim()\n\n // Add the full token\n result.push({\n name: tokenContent,\n content: fullToken\n })\n\n if (!topLevelOnly) {\n // Also extract any nested tokens from the content\n // This handles cases like {{ {{nested}} }} which should extract both\n const nestedTokens = getTokensFromString(tokenContent)\n\n // Add nested tokens that are different from the full token\n for (const nested of nestedTokens) {\n // Only add if it's not the same as what we just added\n if (nested.content !== fullToken) {\n result.push(nested)\n }\n }\n }\n\n // Continue scanning after this token\n continue\n }\n\n // If token is unclosed, treat it as literal text and continue\n i = tokenStart + 2\n } else {\n i++\n }\n }\n\n return result\n}\n", "/**\n * @import {\n * CoraliteElement,\n * CoraliteTextNode,\n * CoraliteAnyNode,\n * CoraliteComponentRoot,\n * CoraliteComment,\n * CoraliteDirective,\n * RawCoraliteElement,\n * RawCoraliteTextNode,\n * RawCoraliteComment,\n * RawCoraliteDirective,\n * RawCoraliteComponentRoot\n * } from '../types/index.js'\n */\n\nconst ELEMENT_NODE = 1\nconst TEXT_NODE = 3\nconst COMMENT_NODE = 8\nconst DOCUMENT_NODE = 9\nconst DOCUMENT_TYPE_NODE = 10\n\nconst nodeTypes = {\n tag: ELEMENT_NODE,\n script: ELEMENT_NODE,\n style: ELEMENT_NODE,\n text: TEXT_NODE,\n comment: COMMENT_NODE,\n root: DOCUMENT_NODE,\n directive: DOCUMENT_TYPE_NODE\n}\n\n/**\n * Base enhancer for all Coralite nodes\n * @template {RawCoraliteElement | RawCoraliteTextNode | RawCoraliteComment | RawCoraliteDirective | RawCoraliteComponentRoot} T\n * @param {T} node - The raw DOM node to enhance\n */\nfunction CoraliteNodeConstructor (node) {\n for (const key in node) {\n if (['parent', 'prev', 'next', 'slots'].includes(key)) {\n Object.defineProperty(this, key, {\n value: node[key],\n enumerable: false,\n writable: true,\n configurable: true\n })\n } else {\n // @ts-ignore\n this[key] = node[key]\n }\n }\n}\n\nfunction makeCircularPropertiesNonEnumerable (node) {\n for (const key of ['parent', 'prev', 'next', 'slots']) {\n if (Object.hasOwn(node, key)) {\n const value = node[key]\n delete node[key]\n Object.defineProperty(node, key, {\n value,\n enumerable: false,\n writable: true,\n configurable: true\n })\n }\n }\n}\n\nObject.defineProperties(CoraliteNodeConstructor.prototype, {\n nodeType: {\n /**\n * Returns an integer identifying the type of the node.\n * @returns {number}\n */\n get () {\n return nodeTypes[this.type] || ELEMENT_NODE\n }\n },\n parentNode: {\n /**\n * Returns the parent of the specified node in the DOM tree.\n * @returns {CoraliteAnyNode | CoraliteComponentRoot}\n */\n get () {\n return this.parent\n },\n /**\n * Sets the parent of the node.\n * @param {CoraliteAnyNode | CoraliteComponentRoot} value - The parent node to set\n */\n set (value) {\n this.parent = value\n }\n },\n parentElement: {\n /**\n * Returns the DOM node's parent Element, or null if the node either has no parent, or its parent isn't a DOM Element.\n * @returns {CoraliteAnyNode | CoraliteComponentRoot}\n */\n get () {\n return this.parent\n },\n /**\n * Sets the parent element of the node.\n * @param {CoraliteAnyNode | CoraliteComponentRoot} value - The parent element to set\n */\n set (value) {\n this.parent = value\n }\n },\n previousSibling: {\n /**\n * Returns the node immediately preceding the specified one in its parent's childNodes list, or null if the specified node is the first in that list.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n if (!this.parent || !this.parent.children) {\n return null\n }\n const index = this.parent.children.indexOf(this)\n return index > 0 ? this.parent.children[index - 1] : null\n }\n },\n nextSibling: {\n /**\n * Returns the node immediately following the specified one in its parent's childNodes list, or null if the specified node is the last node in that list.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n if (!this.parent || !this.parent.children) {\n return null\n }\n const index = this.parent.children.indexOf(this)\n return index > -1 && index < this.parent.children.length - 1 ? this.parent.children[index + 1] : null\n }\n }\n})\n\n/**\n * Coralite Element Node Constructor\n * @param {RawCoraliteElement} node - The raw element node\n */\nfunction CoraliteElementConstructor (node) {\n CoraliteNodeConstructor.call(this, node)\n}\n\nCoraliteElementConstructor.prototype = Object.create(CoraliteNodeConstructor.prototype)\nCoraliteElementConstructor.prototype.constructor = CoraliteElementConstructor\n\n\nObject.defineProperties(CoraliteElementConstructor.prototype, {\n nodeName: {\n /**\n * Returns the name of the node (uppercase tag name for elements).\n * @returns {string}\n */\n get () {\n return this.name.toUpperCase()\n }\n },\n tagName: {\n /**\n * Returns the tag name of the element (uppercase).\n * @returns {string}\n */\n get () {\n return this.name.toUpperCase()\n },\n /**\n * Sets the tag name of the element (converted to lowercase).\n * @param {string} value - The tag name to set\n */\n set (value) {\n this.name = value.toLowerCase()\n }\n },\n nodeValue: {\n /**\n * Returns null for elements.\n * @returns {null}\n */\n get () {\n return null\n },\n /**\n * Setting nodeValue on an element has no effect.\n */\n set (value) {\n // Elements do not have nodeValue\n }\n },\n attributes: {\n /**\n * Returns a collection of the element's attributes.\n * @returns {Object.<string, string>}\n */\n get () {\n return this.attribs\n },\n /**\n * Sets the attributes of the element.\n * @param {Object.<string, string>} value - The attributes object to set\n */\n set (value) {\n this.attribs = value\n }\n },\n childNodes: {\n /**\n * Returns a live collection of child nodes of the given element.\n * @returns {CoraliteAnyNode[]}\n */\n get () {\n return this.children || []\n },\n /**\n * Sets the child nodes of the element.\n * @param {CoraliteAnyNode[]} value - The array of child nodes to set\n */\n set (value) {\n this.children = value\n }\n },\n firstChild: {\n /**\n * Returns the node's first child in the tree, or null if the node has no children.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n return this.children && this.children.length > 0 ? this.children[0] : null\n }\n },\n lastChild: {\n /**\n * Returns the last child of the node, or null if there are no child nodes.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n return this.children && this.children.length > 0 ? this.children[this.children.length - 1] : null\n }\n },\n textContent: {\n /**\n * Returns the text content of the node and its descendants.\n * @returns {string}\n */\n get () {\n if (this.children) {\n return this.children.map(child => child.textContent).join('')\n }\n return ''\n },\n /**\n * Sets the text content of the node. Replaces all children with a single text node.\n * @param {string} value - The text content to set\n */\n set (value) {\n // Replace all children with a single text node\n const textNode = createCoraliteTextNode({\n type: 'text',\n data: value,\n parent: this\n })\n this.children = [textNode]\n }\n },\n id: {\n /**\n * Returns the element's ID attribute.\n * @returns {string}\n */\n get () {\n return this.attribs ? this.attribs.id : ''\n },\n /**\n * Sets the element's ID attribute.\n * @param {string} value - The ID to set\n */\n set (value) {\n if (this.attribs) {\n this.attribs.id = value\n }\n }\n },\n className: {\n /**\n * Returns the element's class attribute.\n * @returns {string}\n */\n get () {\n return this.attribs ? this.attribs.class : ''\n },\n /**\n * Sets the element's class attribute.\n * @param {string} value - The class names to set\n */\n set (value) {\n if (this.attribs) {\n this.attribs.class = value\n }\n }\n }\n})\n\n/**\n * Creates an enhanced Coralite Element\n * @param {RawCoraliteElement} node - The raw element node\n * @returns {CoraliteElement} The enhanced Coralite Element\n */\nexport function createCoraliteElement (node) {\n makeCircularPropertiesNonEnumerable(node)\n Object.setPrototypeOf(node, CoraliteElementConstructor.prototype)\n // @ts-ignore\n return node\n}\n\n/**\n * Coralite Text Node Constructor\n * @param {RawCoraliteTextNode} node - The raw text node\n */\nfunction CoraliteTextNodeConstructor (node) {\n CoraliteNodeConstructor.call(this, node)\n}\n\nCoraliteTextNodeConstructor.prototype = Object.create(CoraliteNodeConstructor.prototype)\nCoraliteTextNodeConstructor.prototype.constructor = CoraliteTextNodeConstructor\n\nObject.defineProperties(CoraliteTextNodeConstructor.prototype, {\n nodeName: {\n /**\n * Returns the name of the node (#text).\n * @returns {string}\n */\n get () {\n return '#text'\n }\n },\n nodeValue: {\n /**\n * Returns the text content of the node.\n * @returns {string}\n */\n get () {\n return this.data\n },\n /**\n * Sets the text content of the node.\n * @param {string} value - The text content to set\n */\n set (value) {\n this.data = value\n }\n },\n textContent: {\n /**\n * Returns the text content of the node.\n * @returns {string}\n */\n get () {\n return this.data\n },\n /**\n * Sets the text content of the node.\n * @param {string} value - The text content to set\n */\n set (value) {\n this.data = value\n }\n }\n})\n\n/**\n * Creates an enhanced Coralite Text Node\n * @param {RawCoraliteTextNode} node - The raw text node\n * @returns {CoraliteTextNode} The enhanced Coralite Text Node\n */\nexport function createCoraliteTextNode (node) {\n makeCircularPropertiesNonEnumerable(node)\n Object.setPrototypeOf(node, CoraliteTextNodeConstructor.prototype)\n // @ts-ignore\n return node\n}\n\n/**\n * Coralite Comment Node Constructor\n * @param {RawCoraliteComment} node - The raw comment node\n */\nfunction CoraliteCommentConstructor (node) {\n CoraliteNodeConstructor.call(this, node)\n}\n\nCoraliteCommentConstructor.prototype = Object.create(CoraliteNodeConstructor.prototype)\nCoraliteCommentConstructor.prototype.constructor = CoraliteCommentConstructor\n\nObject.defineProperties(CoraliteCommentConstructor.prototype, {\n nodeName: {\n /**\n * Returns the name of the node (#comment).\n * @returns {string}\n */\n get () {\n return '#comment'\n }\n },\n nodeValue: {\n /**\n * Returns the content of the comment.\n * @returns {string}\n */\n get () {\n return this.data\n },\n /**\n * Sets the content of the comment.\n * @param {string} value - The content to set\n */\n set (value) {\n this.data = value\n }\n },\n textContent: {\n /**\n * Returns the content of the comment.\n * @returns {string}\n */\n get () {\n return this.data\n },\n /**\n * Sets the content of the comment.\n * @param {string} value - The content to set\n */\n set (value) {\n this.data = value\n }\n }\n})\n\n/**\n * Creates an enhanced Coralite Comment Node\n * @param {RawCoraliteComment} node - The raw comment node\n * @returns {CoraliteComment} The enhanced Coralite Comment Node\n */\nexport function createCoraliteComment (node) {\n makeCircularPropertiesNonEnumerable(node)\n Object.setPrototypeOf(node, CoraliteCommentConstructor.prototype)\n // @ts-ignore\n return node\n}\n\n/**\n * Coralite Directive Node Constructor\n * @param {RawCoraliteDirective} node - The raw directive node\n */\nfunction CoraliteDirectiveConstructor (node) {\n CoraliteNodeConstructor.call(this, node)\n}\n\nCoraliteDirectiveConstructor.prototype = Object.create(CoraliteNodeConstructor.prototype)\nCoraliteDirectiveConstructor.prototype.constructor = CoraliteDirectiveConstructor\n\nObject.defineProperties(CoraliteDirectiveConstructor.prototype, {\n nodeName: {\n /**\n * Returns the name of the directive (e.g., !DOCTYPE).\n * @returns {string}\n */\n get () {\n return this.name\n }\n },\n nodeValue: {\n /**\n * Returns the content of the directive.\n * @returns {string}\n */\n get () {\n return this.data\n },\n /**\n * Sets the content of the directive.\n * @param {string} value - The content to set\n */\n set (value) {\n this.data = value\n }\n }\n})\n\n/**\n * Creates an enhanced Coralite Directive Node (e.g. DOCTYPE)\n * @param {RawCoraliteDirective} node - The raw directive node\n * @returns {CoraliteDirective} The enhanced Coralite Directive Node\n */\nexport function createCoraliteDirective (node) {\n makeCircularPropertiesNonEnumerable(node)\n Object.setPrototypeOf(node, CoraliteDirectiveConstructor.prototype)\n // @ts-ignore\n return node\n}\n\n/**\n * Coralite Document Node Constructor\n * @param {RawCoraliteComponentRoot} node - The raw document node\n */\nfunction CoraliteComponentConstructor (node) {\n CoraliteNodeConstructor.call(this, node)\n}\n\nCoraliteComponentConstructor.prototype = Object.create(CoraliteNodeConstructor.prototype)\nCoraliteComponentConstructor.prototype.constructor = CoraliteComponentConstructor\n\nObject.defineProperties(CoraliteComponentConstructor.prototype, {\n nodeName: {\n /**\n * Returns the name of the node (#document).\n * @returns {string}\n */\n get () {\n return '#document'\n }\n },\n nodeValue: {\n /**\n * Returns null for document nodes.\n * @returns {null}\n */\n get () {\n return null\n }\n },\n childNodes: {\n /**\n * Returns a live collection of child nodes of the document.\n * @returns {CoraliteAnyNode[]}\n */\n get () {\n return this.children || []\n },\n /**\n * Sets the child nodes of the document.\n * @param {CoraliteAnyNode[]} value - The array of child nodes to set\n */\n set (value) {\n this.children = value\n }\n },\n firstChild: {\n /**\n * Returns the document's first child in the tree, or null if the document has no children.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n return this.children && this.children.length > 0 ? this.children[0] : null\n }\n },\n lastChild: {\n /**\n * Returns the last child of the document, or null if there are no child nodes.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n return this.children && this.children.length > 0 ? this.children[this.children.length - 1] : null\n }\n },\n textContent: {\n /**\n * Returns null for document nodes.\n * @returns {null}\n */\n get () {\n return null\n }\n }\n})\n\n/**\n * Creates an enhanced Coralite Document Root\n * @param {RawCoraliteComponentRoot} node - The raw document node\n * @returns {CoraliteComponentRoot} The enhanced Coralite Document Root\n */\nexport function createCoraliteComponent (node) {\n makeCircularPropertiesNonEnumerable(node)\n Object.setPrototypeOf(node, CoraliteComponentConstructor.prototype)\n // @ts-ignore\n return node\n}\n", "export const BOOLEAN_ATTRIBUTES = new Set([\n 'allowfullscreen',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'inert',\n 'ismap',\n 'itemscope',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected',\n 'truespeed'\n])\n\nexport const VALID_TAGS = {\n a: true,\n abbr: true,\n acronym: true,\n address: true,\n area: true,\n article: true,\n aside: true,\n audio: true,\n b: true,\n base: true,\n bdi: true,\n bdo: true,\n big: true,\n blockquote: true,\n body: true,\n br: true,\n button: true,\n canvas: true,\n caption: true,\n center: true,\n cite: true,\n code: true,\n col: true,\n colgroup: true,\n data: true,\n datalist: true,\n dd: true,\n del: true,\n details: true,\n dfn: true,\n dialog: true,\n dir: true,\n div: true,\n dl: true,\n dt: true,\n em: true,\n embed: true,\n fencedframe: true,\n fieldset: true,\n figcaption: true,\n figure: true,\n font: true,\n footer: true,\n form: true,\n frame: true,\n frameset: true,\n h1: true,\n h2: true,\n h3: true,\n h4: true,\n h5: true,\n h6: true,\n head: true,\n header: true,\n hgroup: true,\n hr: true,\n html: true,\n i: true,\n iframe: true,\n img: true,\n input: true,\n ins: true,\n kbd: true,\n label: true,\n legend: true,\n li: true,\n link: true,\n main: true,\n map: true,\n mark: true,\n marquee: true,\n menu: true,\n meta: true,\n meter: true,\n nav: true,\n nobr: true,\n noembed: true,\n noframes: true,\n noscript: true,\n object: true,\n ol: true,\n optgroup: true,\n option: true,\n output: true,\n p: true,\n param: true,\n picture: true,\n plaintext: true,\n portal: true,\n pre: true,\n progress: true,\n q: true,\n rb: true,\n rp: true,\n rt: true,\n rtc: true,\n ruby: true,\n s: true,\n samp: true,\n script: true,\n search: true,\n section: true,\n select: true,\n slot: true,\n small: true,\n source: true,\n span: true,\n strike: true,\n strong: true,\n style: true,\n sub: true,\n summary: true,\n sup: true,\n table: true,\n tbody: true,\n td: true,\n template: true,\n textarea: true,\n tfoot: true,\n th: true,\n thead: true,\n time: true,\n title: true,\n tr: true,\n track: true,\n tt: true,\n u: true,\n ul: true,\n var: true,\n video: true,\n wbr: true,\n xmp: true,\n // svg\n svg: true,\n animate: true,\n animatemotion: true,\n animatetransform: true,\n circle: true,\n clippath: true,\n defs: true,\n desc: true,\n ellipse: true,\n feblend: true,\n fecolormatrix: true,\n fecomponenttransfer: true,\n fecomposite: true,\n feconvolvematrix: true,\n fediffuselighting: true,\n fedisplacementmap: true,\n fedistantlight: true,\n fedropshadow: true,\n feflood: true,\n fefunca: true,\n fefuncb: true,\n fefuncg: true,\n fefuncr: true,\n fegaussianblur: true,\n feimage: true,\n femerge: true,\n femergenode: true,\n femorphology: true,\n feoffset: true,\n fepointlight: true,\n fespecularlighting: true,\n fespotlight: true,\n fetile: true,\n feturbulence: true,\n filter: true,\n foreignobject: true,\n g: true,\n image: true,\n line: true,\n lineargradient: true,\n marker: true,\n mask: true,\n metadata: true,\n mpath: true,\n path: true,\n pattern: true,\n polygon: true,\n polyline: true,\n radialgradient: true,\n rect: true,\n set: true,\n stop: true,\n switch: true,\n symbol: true,\n text: true,\n textpath: true,\n tspan: true,\n use: true,\n view: true\n}\n\nexport const RESERVED_ELEMENT_NAMES = {\n 'annotation-xml': true,\n 'color-profile': true,\n 'font-face': true,\n 'font-face-src': true,\n 'font-face-uri': true,\n 'font-face-format': true,\n 'font-face-name': true,\n 'missing-glyph': true\n}\n\nconst CUSTOM_ELEMENT_TAG = /^[a-z](?:[-.\\w\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD])*?-(?:[-.\\w\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD])*$/\n\n/**\n * Validates a custom element name\n * @param {string} name - The custom element name to validate\n * @param {number} [maxLength=100] - Max length of the tag name\n * @returns {boolean} - True if valid, false otherwise\n * @throws {Error} - If the element name is reserved\n */\nexport function isValidCustomElementName (name, maxLength = 100) {\n // Check if string is empty or not a string\n if (!name || typeof name !== 'string') {\n return false\n }\n\n // Check against reserved names first (case-insensitive)\n if (RESERVED_ELEMENT_NAMES[name.toLowerCase()]) {\n throw new Error('Element name is reserved: \"'+ name +'\"')\n }\n\n // Length check to prevent ReDoS\n if (name.length > maxLength) {\n return false\n }\n\n // check for obviously invalid patterns that could cause backtracking\n if (name.includes('--') || name.startsWith('-') || name.endsWith('-')) {\n return false\n }\n\n // Test against the regex\n return CUSTOM_ELEMENT_TAG.test(name)\n}\n", "/**\n * @import { CoraliteCollectionItem, CoraliteComment, CoraliteDirective, CoraliteComponentRoot, CoraliteElement, CoraliteTextNode, CoraliteAnyNode, CoraliteSlotElement } from '../types/index.js'\n */\n\n/**\n * Check if value is a non-null object\n * @param {any} obj - The value to check\n * @returns {boolean} True if the value is a non-null object\n */\nfunction isObject (obj) {\n return typeof obj === 'object' && obj !== null\n}\n\n/**\n * Checks if an object is a CoraliteElement.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteElement} True if the object is a CoraliteElement, false otherwise.\n */\nfunction isCoraliteElement (obj) {\n return isObject(obj) && (obj.type === 'tag' || obj.type === 'script' || obj.type === 'style')\n}\n\n/**\n * Checks if an object is a CoraliteTextNode.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteTextNode} True if the object is a CoraliteTextNode, false otherwise.\n */\nfunction isCoraliteTextNode (obj) {\n return isObject(obj) && obj.type === 'text'\n}\n\n/**\n * Checks if an object is a CoraliteComment.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteComment} True if the object is a CoraliteComment, false otherwise.\n */\nfunction isCoraliteComment (obj) {\n return isObject(obj) && obj.type === 'comment'\n}\n\n/**\n * Checks if an object is a CoraliteDirective.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteDirective} True if the object is a CoraliteDirective, false otherwise.\n */\nfunction isCoraliteDirective (obj) {\n return isObject(obj) && obj.type === 'directive'\n}\n\n/**\n * Checks if an object is a CoraliteComponentRoot.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteComponentRoot} True if the object is a CoraliteComponentRoot, false otherwise.\n */\nfunction isCoraliteComponentRoot (obj) {\n return isObject(obj) && obj.type === 'root'\n}\n\n/**\n * Checks if an object is a CoraliteSlotElement.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteSlotElement} True if the object is a CoraliteSlotElement, false otherwise.\n */\nfunction isCoraliteSlotElement (obj) {\n return isObject(obj) &&\n typeof obj.name === 'string' &&\n isCoraliteElement(obj.element) &&\n (obj.customElement === undefined || isCoraliteElement(obj.customElement))\n}\n\n/**\n * Determines whether the given object is a CoraliteCollectionItem.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteCollectionItem} True if the object is a CoraliteCollectionItem, false otherwise.\n */\nfunction isCoraliteCollectionItem (obj) {\n return isObject(obj) &&\n 'path' in obj &&\n isObject(obj.path) &&\n typeof obj.path.pathname === 'string'\n}\n\n/**\n * Checks if an object is any Coralite node type (Element, TextNode, Comment, Directive, or DocumentRoot).\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteAnyNode | CoraliteDirective | CoraliteComponentRoot} True if the object is any Coralite node type.\n */\nfunction isCoraliteNode (obj) {\n return isCoraliteElement(obj) ||\n isCoraliteTextNode(obj) ||\n isCoraliteComment(obj) ||\n isCoraliteDirective(obj) ||\n isCoraliteComponentRoot(obj)\n}\n\n/**\n * Checks if an object has a valid CoraliteElement structure with required state.\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object has valid CoraliteElement structure.\n */\nfunction hasValidElementStructure (obj) {\n return isCoraliteElement(obj) &&\n typeof obj.name === 'string' &&\n isObject(obj.attribs) &&\n Array.isArray(obj.children)\n}\n\n/**\n * Checks if an object has a valid CoraliteTextNode structure with required state.\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object has valid CoraliteTextNode structure.\n */\nfunction hasValidTextNodeStructure (obj) {\n return isCoraliteTextNode(obj) &&\n typeof obj.data === 'string'\n}\n\n/**\n * Checks if an object has a valid CoraliteComment structure with required state.\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object has valid CoraliteComment structure.\n */\nfunction hasValidCommentStructure (obj) {\n return isCoraliteComment(obj) &&\n typeof obj.data === 'string'\n}\n\n/**\n * Safely checks if a value is a valid child node for a CoraliteElement.\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object is a valid child node.\n */\nfunction isValidChildNode (obj) {\n return isCoraliteElement(obj) ||\n isCoraliteTextNode(obj) ||\n isCoraliteComment(obj) ||\n isCoraliteDirective(obj)\n}\n\n/**\n * Checks if an object is a parent node (has children property).\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object has a children property.\n */\nfunction isParentNode (obj) {\n return isObject(obj) && Array.isArray(obj.children)\n}\n\n/**\n * Checks if an object is a removable node (has remove property set to true).\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object has remove property set to true.\n */\nfunction isRemovableNode (obj) {\n return isObject(obj) && obj.remove === true\n}\n\nexport {\n // Core type guards\n isCoraliteElement,\n isCoraliteTextNode,\n isCoraliteComment,\n isCoraliteDirective,\n isCoraliteComponentRoot,\n isCoraliteSlotElement,\n isCoraliteCollectionItem,\n\n // Utility type guards\n isCoraliteNode,\n\n // Structure validation\n hasValidElementStructure,\n hasValidTextNodeStructure,\n hasValidCommentStructure,\n\n // Node property checks\n isValidChildNode,\n isParentNode,\n isRemovableNode\n}\n", "import { dirname, extname, join } from 'node:path'\nimport { readdir, readFile } from 'node:fs/promises'\nimport { readFileSync } from 'node:fs'\nimport { availableParallelism } from 'node:os'\nimport pLimit from 'p-limit'\nimport CoraliteCollection from './collection.js'\n\n/**\n * @import {\n * CoraliteCollectionEventSet,\n * CoraliteCollectionEventUpdate,\n * CoraliteCollectionEventDelete } from '../types/index.js'\n */\n\n/**\n * Get HTML\n * @param {Object} options - Options for searching HTML files\n * @param {string} options.path - Path to the directory containing HTML files\n * @param {'page' | 'component'} options.type - Document types\n * @param {boolean} [options.recursive=false] - Whether to search recursively in subdirectories\n * @param {string[]} [options.exclude=[]] - Files or directories to exclude from search\n * @param {CoraliteCollectionEventSet} [options.onFileSet]\n * @param {CoraliteCollectionEventUpdate} [options.onFileUpdate]\n * @param {CoraliteCollectionEventDelete} [options.onFileDelete]\n * @param {CoraliteCollection} [options.collection] - Optional collection instance to populate\n * @param {import('p-limit').LimitFunction} [options.limit] - Optional concurrency limiter\n * @param {boolean} [options.discoverOnly=false] - Whether to skip reading file content and only discover paths\n * @returns {Promise<CoraliteCollection>} Array of HTML file data including parent path, name, and content\n *\n * @example\n * // example usage:\n * const htmlFiles = await getHtmlFiles({\n * path: 'src',\n * recursive: true,\n * exclude: ['index.html', 'subdir/file2.html']\n * })\n */\nexport async function getHtmlFiles ({\n path,\n type,\n recursive = false,\n exclude = [],\n discoverOnly = false,\n onFileSet,\n onFileUpdate,\n onFileDelete,\n collection,\n limit\n}) {\n const resultCollection = collection || new CoraliteCollection({\n rootDir: path,\n onSet: onFileSet,\n onUpdate: onFileUpdate,\n onDelete: onFileDelete\n })\n\n if (!limit) {\n limit = pLimit(availableParallelism())\n }\n\n const entries = await readdir(path, { withFileTypes: true })\n const tasks = []\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n\n // Skip hidden files/directories starting with dot\n if (entry.name.startsWith('.')) {\n continue\n }\n\n const pathname = join(entry.parentPath, entry.name)\n\n // Calculate relative path from root for exclusion checking\n const relativePath = pathname.replace(path + '/', '')\n\n // Check if entry should be excluded by: name, relative path, or full path\n const shouldExclude = exclude.includes(entry.name) ||\n exclude.includes(relativePath) ||\n exclude.includes(pathname) ||\n exclude.some(excludePath => {\n // Handle directory-based exclusions\n const excludeDir = excludePath.endsWith('/') ? excludePath.slice(0, -1) : excludePath\n return relativePath.startsWith(excludeDir + '/')\n })\n\n if (shouldExclude) {\n continue\n }\n\n if (entry.isDirectory() && recursive) {\n tasks.push(getHtmlFiles({\n path: pathname,\n type,\n recursive,\n exclude,\n discoverOnly,\n onFileSet,\n onFileUpdate,\n onFileDelete,\n collection: resultCollection,\n limit\n }))\n } else if (entry.isFile() && extname(entry.name).toLowerCase() === '.html') {\n tasks.push(limit(async () => {\n const content = discoverOnly ? undefined : await readFile(pathname, { encoding: 'utf8' })\n\n await resultCollection.setItem({\n type,\n content,\n physical: true,\n path: {\n pathname: pathname,\n filename: entry.name,\n dirname: dirname(pathname)\n }\n })\n }))\n }\n }\n\n await Promise.all(tasks)\n\n return resultCollection\n}\n\n/**\n * Generator that yields HTML files found in a directory.\n * Useful for lazy discovery and memory-efficient processing of many files.\n *\n * @param {Object} options - Options for searching HTML files\n * @param {string} options.path - Path to the directory containing HTML files\n * @param {'page' | 'component'} options.type - Document types\n * @param {boolean} [options.recursive=false] - Whether to search recursively\n * @param {string[]} [options.exclude=[]] - Files or directories to exclude\n * @param {boolean} [options.discoverOnly=false] - Whether to skip reading file content\n * @yields {Promise<{ type: 'page' | 'component', content: string | undefined, path: { pathname: string, filename: string, dirname: string } }>}\n */\nexport async function* discoverHtmlFiles ({\n path,\n type,\n recursive = false,\n exclude = [],\n discoverOnly = false\n}) {\n const entries = await readdir(path, { withFileTypes: true })\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n\n if (entry.name.startsWith('.')) {\n continue\n }\n\n const pathname = join(entry.parentPath, entry.name)\n const relativePath = pathname.replace(path + '/', '')\n\n const shouldExclude = exclude.includes(entry.name) ||\n exclude.includes(relativePath) ||\n exclude.includes(pathname) ||\n exclude.some(excludePath => {\n const excludeDir = excludePath.endsWith('/') ? excludePath.slice(0, -1) : excludePath\n return relativePath.startsWith(excludeDir + '/')\n })\n\n if (shouldExclude) {\n continue\n }\n\n if (entry.isDirectory() && recursive) {\n yield* discoverHtmlFiles({\n path: pathname,\n type,\n recursive,\n exclude,\n discoverOnly\n })\n } else if (entry.isFile() && extname(entry.name).toLowerCase() === '.html') {\n const content = discoverOnly ? undefined : await readFile(pathname, { encoding: 'utf8' })\n\n yield {\n type,\n content,\n physical: true,\n path: {\n pathname: pathname,\n filename: entry.name,\n dirname: dirname(pathname)\n }\n }\n }\n }\n}\n\n/**\n * Reads an HTML file and returns its content as a string.\n * @param {string} pathname - The path to the HTML file.\n * @throws {Error} If the file cannot be read.\n */\nexport function getHtmlFileSync (pathname) {\n try {\n const extension = extname(pathname).toLowerCase()\n\n if (extension === '.html') {\n return readFileSync(pathname, 'utf8')\n }\n\n throw new Error('Unexpected filename extension \"' + extension +'\"')\n } catch (err) {\n throw err\n }\n}\n\n/**\n * Reads an HTML file and returns its content as a string.\n * @param {string} pathname - The path to the HTML file.\n * @throws {Error} If the file cannot be read.\n */\nexport async function getHtmlFile (pathname) {\n try {\n const extension = extname(pathname).toLowerCase()\n\n if (extension === '.html') {\n return await readFile(pathname, 'utf8')\n }\n\n throw new Error('Unexpected filename extension \"' + extension +'\"')\n } catch (err) {\n throw err\n }\n}\n", "import path from 'node:path'\nimport { getHtmlFile } from './html.js'\nimport { access } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\n\n/**\n * @import {\n * CoraliteCollectionEventDelete,\n * CoraliteCollectionEventSet,\n * CoraliteCollectionEventUpdate,\n * CoraliteCollectionItem,\n * HTMLData } from '../types/index.js'\n */\n\n/**\n * Represents a collection of documents with methods to organize and retrieve them.\n * Maintains three views: flat list, path-based grouping, and ID lookup.\n * @class\n * @param {Object} [options={}] - Options for configuring the collection\n * @param {string} [options.rootDir=''] - The root directory path for the collection\n * @param {CoraliteCollectionEventSet} [options.onSet] - Event handler for when documents are set\n * @param {CoraliteCollectionEventUpdate} [options.onUpdate] - Event handler for when documents are updated\n * @param {CoraliteCollectionEventDelete} [options.onDelete] - Event handler for when documents are deleted\n */\nfunction CoraliteCollection (options = { rootDir: '' }) {\n /**\n * Root directory where collection items are located\n */\n this.rootDir = path.join(options.rootDir)\n\n if (!existsSync(this.rootDir)) {\n throw new Error('Root directory was not found: ' + this.rootDir)\n }\n\n /**\n * An array of HTMLData objects representing the list of documents.\n * @type {CoraliteCollectionItem[]}\n */\n this.list = []\n\n /**\n * An object mapping paths to arrays of HTMLData objects.\n * Used for grouping documents by their file path.\n * @type {Object.<string, CoraliteCollectionItem[]>}\n */\n this.listByPath = Object.create(null)\n\n /**\n * An object mapping unique identifiers to HTMLData objects.\n * Used for quick lookup of documents by their identifier.\n * @type {Object.<string, CoraliteCollectionItem>}\n */\n this.collection = Object.create(null)\n\n /**\n * Callback triggered when setting a new item\n * @type {CoraliteCollectionEventSet | undefined}\n */\n this._onSet = options.onSet\n\n /**\n * Callback triggered when updating an existing item\n * @type {CoraliteCollectionEventUpdate | undefined}\n */\n this._onUpdate = options.onUpdate\n\n /**\n * Callback triggered when deleting an item\n * @type {CoraliteCollectionEventDelete | undefined}\n */\n this._onDelete = options.onDelete\n}\n\n/**\n * Adds or updates an HTMLData object in the collection and associated lists.\n * If the item already exists, it will be updated in all views.\n * @param {HTMLData|string} value - The HTMLData object to be added or updated.\n * @returns {Promise<CoraliteCollectionItem>} The modified document\n */\nCoraliteCollection.prototype.setItem = async function (value) {\n if (typeof value === 'string') {\n value = await this._loadByPath(value)\n }\n\n if (!value || !value.path) {\n throw new Error('Valid HTMLData object must be provided')\n }\n\n const pathname = value.path.pathname\n const dirname = value.path.dirname\n const originalValue = this.collection[pathname]\n\n /** @type {CoraliteCollectionItem} */\n const documentValue = value\n\n if (!originalValue) {\n // handle pre-set hook if defined\n if (typeof this._onSet === 'function') {\n const result = await this._onSet(value)\n\n // abort adding item\n if (!result) {\n return\n }\n\n documentValue.result = result.value\n\n if (result.state) {\n documentValue.state = result.state\n }\n\n if (result.type === 'page' || result.type === 'component') {\n documentValue.type = result.type\n }\n\n // update collection using ID from hook result if available\n if (typeof result.id === 'string' && result.id) {\n this.collection[result.id] = documentValue\n }\n }\n\n // always update the collection with current pathname\n this.collection[pathname] = documentValue\n\n // initialize directory list if it doesn't exist\n if (!this.listByPath[dirname]) {\n this.listByPath[dirname] = []\n }\n\n // add to both directory-specific and general lists\n // check if already added to avoid duplicates\n if (!this.listByPath[dirname].includes(documentValue)) {\n this.listByPath[dirname].push(documentValue)\n }\n if (!this.list.includes(documentValue)) {\n this.list.push(documentValue)\n }\n } else {\n return await this.updateItem(value)\n }\n\n return documentValue\n}\n\n/**\n * Removes an HTMLData object from the collection and associated lists.\n * Accepts either an HTMLData object or a pathname string.\n * @param {HTMLData | string} value - The HTMLData object or a pathname to be removed.\n * @throws {Error} If invalid input is provided\n */\nCoraliteCollection.prototype.deleteItem = async function (value) {\n if (!value) {\n throw new Error('Valid pathname must be provided')\n }\n\n let pathname\n let dirname\n let valuesByPath\n let originalValue\n\n if (typeof value !== 'string' && value.path) {\n // if the input is an HTMLData object, extract its pathname and directory name\n pathname = value.path.pathname\n dirname = value.path.dirname\n valuesByPath = this.listByPath[dirname]\n originalValue = value\n } else if (typeof value === 'string') {\n // if the input is a string, use it as the pathname and determine the directory name\n pathname = value\n dirname = path.dirname(pathname)\n valuesByPath = this.listByPath[dirname]\n originalValue = this.collection[pathname]\n } else {\n throw new Error('Valid pathname must be provided')\n }\n\n if (!originalValue) {\n // item not found, nothing to delete\n return\n }\n\n if (!valuesByPath) {\n // directory list doesn't exist, but we still need to clean up collection\n // This can happen if the item was stored under a different ID\n for (const key in this.collection) {\n if (this.collection[key] === originalValue) {\n delete this.collection[key]\n }\n }\n return\n }\n\n if (typeof this._onDelete === 'function') {\n await this._onDelete(originalValue)\n }\n\n // remove the document from the collection\n // also check if it's stored under a different ID (from hook result)\n for (const key in this.collection) {\n if (this.collection[key] === originalValue) {\n delete this.collection[key]\n }\n }\n\n // find and remove the document from the list and by-path grouping\n const listIndex = this.list.indexOf(originalValue)\n const pathIndex = valuesByPath.indexOf(originalValue)\n\n if (listIndex !== -1) {\n this.list.splice(listIndex, 1)\n }\n if (pathIndex !== -1) {\n valuesByPath.splice(pathIndex, 1)\n }\n\n // clean up empty directory arrays\n if (valuesByPath.length === 0) {\n delete this.listByPath[dirname]\n }\n}\n\n/**\n * Updates an existing HTMLData object in the collection.\n * If the document does not exist, it will be added using the set method.\n * @param {CoraliteCollectionItem|string} value - The HTMLData object to be updated or added.\n * @throws {Error} If invalid input is provided\n */\nCoraliteCollection.prototype.updateItem = async function (value) {\n if (typeof value === 'string') {\n value = await this._loadByPath(value)\n }\n\n if (!value || !value.path) {\n throw new Error('Valid HTMLData object must be provided')\n }\n\n const pathname = value.path.pathname\n const originalValue = this.collection[pathname]\n\n if (!originalValue) {\n // if the document does not exist, add it using the set method\n return await this.setItem(value)\n }\n\n if (typeof this._onUpdate === 'function') {\n const result = await this._onUpdate(value, originalValue)\n\n // abort update\n if (!result) {\n return originalValue\n }\n\n // handle callback result\n if (result && typeof result === 'object') {\n // if result has a value property, use it\n if (result.value !== undefined) {\n originalValue.result = result.value\n } else {\n originalValue.result = result\n }\n\n // update type if provided\n if (result.type === 'page' || result.type === 'component') {\n originalValue.type = result.type\n }\n } else {\n originalValue.result = result\n }\n }\n\n // update core state\n if (value.content !== undefined) {\n originalValue.content = value.content\n }\n\n // update path information if it changed\n if (value.path && value.path !== originalValue.path) {\n originalValue.path = value.path\n }\n\n // update type if explicitly set\n if (value.type) {\n originalValue.type = value.type\n }\n\n // update any additional state\n if (value.state !== undefined) {\n originalValue.state = value.state\n }\n\n return originalValue\n}\n\n/**\n * Retrieves an item by its unique identifier\n * @param {string} id - Unique identifier of the item\n * @returns {CoraliteCollectionItem | undefined} The found item or undefined\n */\nCoraliteCollection.prototype.getItem = function (id) {\n if (!this.collection[id] && id.endsWith('html')) {\n id = path.join(this.rootDir, id)\n }\n\n return this.collection[id]\n}\n\n/**\n * Retrieves a list of items grouped by directory path\n * @param {string} dirname - Directory name to look up\n * @returns {CoraliteCollectionItem[] | undefined} A copy of the item list or undefined\n */\nCoraliteCollection.prototype.getListByPath = function (dirname) {\n const list = this.listByPath[dirname]\n\n if (list) {\n return list.slice()\n }\n}\n\n/**\n * Loads a collection item by its file path.\n *\n * @param {string} filepath - The path to the collection item file\n * @returns {Promise<HTMLData>} A promise that resolves to the loaded item object\n * @throws {Error} If the file cannot be found at either the provided path or within the root directory\n */\nCoraliteCollection.prototype._loadByPath = async function (filepath) {\n try {\n await access(filepath)\n } catch {\n try {\n filepath = path.join(this.rootDir, filepath)\n\n await access(filepath)\n } catch {\n throw new Error('Could not find collection item: ' + filepath)\n }\n }\n\n const content = await getHtmlFile(filepath)\n\n return {\n type: 'page',\n content,\n path: {\n pathname: filepath,\n dirname: path.dirname(filepath),\n filename: path.basename(filepath)\n }\n }\n}\n\nexport default CoraliteCollection\n", "import { createCoraliteElement, createCoraliteTextNode } from './dom.js'\n\n/**\n * @import {\n * CoraliteElement,\n * CoraliteComponentRoot,\n * CoraliteCollectionItem\n * } from '../types/index.js'\n */\n\n/**\n * @import CoraliteCollection from './collection.js'\n */\n\n/**\n * Finds the <head> and <body> elements within the HTML AST.\n *\n * @param {CoraliteComponentRoot} root - The root of the AST.\n * @returns {{ head: CoraliteElement | null, body: CoraliteElement | CoraliteComponentRoot }}\n */\nexport function findHeadAndBody (root) {\n let head = null\n /** @type {CoraliteElement | CoraliteComponentRoot} */\n let body = root\n\n for (let i = 0; i < root.children.length; i++) {\n const rootNode = root.children[i]\n\n if (rootNode.type === 'tag' && rootNode.name === 'html') {\n for (let j = 0; j < rootNode.children.length; j++) {\n const node = rootNode.children[j]\n\n if (node.type === 'tag' && node.name === 'head') {\n head = node\n }\n if (node.type === 'tag' && node.name === 'body') {\n body = node\n }\n }\n break\n }\n }\n\n return {\n head,\n body\n }\n}\n\n/**\n * Injects external global style link tags into the document head (or root if head is missing).\n *\n * @param {CoraliteComponentRoot} root - The root of the AST.\n * @param {CoraliteElement | null} head - The head element.\n * @param {string[]} styles - Array of style URLs.\n */\nexport function injectExternalStyles (root, head, styles) {\n if (!styles || styles.length === 0) {\n return\n }\n\n const existingLinks = new Set()\n if (head) {\n head.children.forEach(child => {\n if (child.type === 'tag' && child.name === 'link' && child.attribs?.href) {\n existingLinks.add(child.attribs.href)\n }\n })\n }\n\n for (let i = 0; i < styles.length; i++) {\n const styleUrl = styles[i]\n\n if (existingLinks.has(styleUrl)) {\n continue\n }\n\n const linkElement = createCoraliteElement({\n type: 'tag',\n name: 'link',\n parent: head || root,\n attribs: {\n rel: 'stylesheet',\n href: styleUrl\n },\n children: []\n })\n\n if (head) {\n head.children.push(linkElement)\n } else {\n root.children.unshift(linkElement)\n }\n }\n}\n\n/**\n * Injects style tags into the document head (or root if head is missing).\n *\n * @param {CoraliteComponentRoot} root - The root of the AST.\n * @param {CoraliteElement | null} head - The head element.\n * @param {Map<string, string>} styles - Map of style selectors and their CSS content.\n */\nexport function injectStyles (root, head, styles) {\n if (!styles || styles.size === 0) {\n return\n }\n\n let cssContent = ''\n for (const [selector, css] of styles) {\n cssContent += `[data-style-selector=\"${selector}\"] {\\n${css}\\n}\\n`\n }\n\n const styleElement = createCoraliteElement({\n type: 'tag',\n name: 'style',\n parent: head || root,\n attribs: {},\n children: []\n })\n\n styleElement.children.push(createCoraliteTextNode({\n type: 'text',\n data: cssContent,\n parent: styleElement\n }))\n\n if (head) {\n head.children.push(styleElement)\n } else {\n root.children.unshift(styleElement)\n }\n}\n\n/**\n * Injects the readiness script into the document head (or root if head is missing).\n *\n * @param {CoraliteComponentRoot} root - The root of the AST.\n * @param {CoraliteElement | null} head - The head element.\n * @param {boolean} hasScripts - Whether the page has scripts to wait for.\n */\nexport function injectReadinessScript (root, head, hasScripts) {\n const readinessScriptElement = createCoraliteElement({\n type: 'tag',\n name: 'script',\n parent: head || root,\n attribs: {},\n children: []\n })\n\n const data = hasScripts\n ? 'window.__coralite_ready__ = new Promise(resolve => { window.__coralite_resolve_ready__ = resolve; });'\n : 'window.__coralite_ready__ = Promise.resolve(); window.__coralite_resolve_ready__ = () => {};'\n\n readinessScriptElement.children.push(createCoraliteTextNode({\n type: 'text',\n data,\n parent: readinessScriptElement\n }))\n\n if (head) {\n head.children.unshift(readinessScriptElement)\n } else {\n root.children.unshift(readinessScriptElement)\n }\n}\n\n/**\n * Injects an import map into the document head (or root if head is missing).\n *\n * @param {CoraliteComponentRoot} root - The root of the AST.\n * @param {CoraliteElement | null} head - The head element.\n * @param {Object} importMap - The import map object.\n */\nexport function injectImportMap (root, head, importMap) {\n if (!importMap || Object.keys(importMap).length === 0) {\n return\n }\n\n const importMapElement = createCoraliteElement({\n type: 'tag',\n name: 'script',\n parent: head || root,\n attribs: {\n type: 'importmap'\n },\n children: []\n })\n\n importMapElement.children.push(createCoraliteTextNode({\n type: 'text',\n data: JSON.stringify({ imports: importMap }),\n parent: importMapElement\n }))\n\n if (head) {\n head.children.push(importMapElement)\n } else {\n root.children.unshift(importMapElement)\n }\n}\n\n/**\n * Removes temporary and skip-render elements from the AST.\n *\n * @param {CoraliteElement[]} elements - The elements to remove.\n * @param {boolean} [matchInstance=true] - Whether to match by identity (true) or by 'remove' property (false).\n */\nexport function removeElements (elements, matchInstance = true) {\n if (!elements || elements.length === 0) {\n return\n }\n\n if (matchInstance) {\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i]\n if (element.parent && element.parent.children) {\n element.parent.children = element.parent.children.filter(child => child !== element)\n }\n }\n } else {\n // Optimization: collect unique parents and filter children only once per parent\n const parents = new Set()\n for (let i = 0; i < elements.length; i++) {\n if (elements[i].parent) {\n parents.add(elements[i].parent)\n }\n }\n\n for (const parent of parents) {\n if (parent.children) {\n parent.children = parent.children.filter(child => !child.remove)\n }\n }\n }\n}\n\n/**\n * Resolves the initial queue of pages to be generated.\n *\n * @param {CoraliteCollection} pagesCollection - The collection of pages.\n * @param {string | string[]} [path] - The path(s) to include.\n * @returns {CoraliteCollectionItem[]}\n */\nexport function resolvePageQueue (pagesCollection, path) {\n let queue = []\n\n if (Array.isArray(path)) {\n const uniquePaths = new Set(path)\n for (const p of uniquePaths) {\n const result = pagesCollection.getListByPath(p) || pagesCollection.getItem(p)\n if (result) {\n if (Array.isArray(result)) {\n queue = queue.concat(result)\n } else {\n queue.push(result)\n }\n }\n }\n } else if (typeof path === 'string') {\n const result = pagesCollection.getListByPath(path) || pagesCollection.getItem(path)\n if (result) {\n if (Array.isArray(result)) {\n queue = queue.concat(result)\n } else {\n queue.push(result)\n }\n }\n } else {\n queue = pagesCollection.list.slice()\n }\n\n return queue\n}\n", "/**\n * @import { InstanceContext } from '../types/index.js'\n */\n\n/**\n * Generates the client-side runtime script for Coralite pages.\n *\n * @param {Object} options\n * @param {string} options.base - The base URL for assets.\n * @param {string} options.sharedChunkPath - The filename of the shared chunk.\n * @param {Object} options.chunkManifest - Manifest mapping component IDs to their chunk filenames.\n * @param {string[]} [options.declarativeTags=[]] - The declarative tags used.\n * @returns {string} The generated JavaScript runtime.\n */\nexport function generateClientRuntime ({\n base,\n sharedChunkPath,\n chunkManifest,\n declarativeTags = []\n}) {\n return `\nimport { getClientContext, getSetups, createCoraliteClass, globalClientHooks } from '${base}assets/js/${sharedChunkPath}';\n\n(async () => {\n if (!window.__coralite_ready__) {\n window.__coralite_ready__ = new Promise(resolve => { window.__coralite_resolve_ready__ = resolve; });\n }\n globalThis.executableScripts = [];\n globalThis.globalAbortController = new AbortController();\n\n const componentManifest = ${JSON.stringify(chunkManifest)};\n const loadCache = {};\n\n const loadComponent = (componentId) => {\n if (!componentManifest[componentId]) return Promise.resolve();\n if (customElements.get(componentId)) return Promise.resolve();\n if (loadCache[componentId]) return loadCache[componentId];\n\n loadCache[componentId] = (async () => {\n const module = await import('${base}assets/js/' + componentManifest[componentId]);\n if (module.default && module.default.componentId) {\n if (!customElements.get(module.default.componentId)) {\n customElements.define(module.default.componentId, createCoraliteClass(module.default, getClientContext, globalClientHooks));\n }\n }\n })();\n return loadCache[componentId];\n };\n\n const declarativeTags = ${JSON.stringify(declarativeTags)};\n const allTags = Object.keys(componentManifest);\n const imperativeTags = allTags.filter(tag => !declarativeTags.includes(tag));\n\n const loadPromises = declarativeTags.map(tagName => loadComponent(tagName));\n await Promise.all(loadPromises);\n\n if (typeof window.__coralite_resolve_ready__ === 'function') {\n window.__coralite_resolve_ready__();\n }\n\n if (imperativeTags.length > 0) {\n const lazyLoad = () => imperativeTags.forEach(tagName => loadComponent(tagName));\n \n if ('requestIdleCallback' in window) {\n requestIdleCallback(lazyLoad, { timeout: 500 });\n } else {\n setTimeout(lazyLoad, 1);\n }\n }\n})();\n`.trim()\n}\n", "import postcss from 'postcss'\nimport selectorParser from 'postcss-selector-parser'\n\n/**\n * Transforms CSS to automatically apply `&.` prefix to classes present on the root element.\n * @param {string} css - The CSS content\n * @param {Set<string>} rootClasses - Set of classes found on the root element\n * @param {Set<string>} descendantClasses - Set of classes found on descendant elements\n * @param {import('../types/index.js').CoraliteOnError} [onError] - Error handler\n * @returns {Promise<string>} Transformed CSS\n */\nexport async function transformCss (css, rootClasses, descendantClasses, onError) {\n const processor = postcss([\n {\n postcssPlugin: 'coralite-style-transform',\n Rule (rule) {\n // Only process top-level rules or rules directly inside @media/@supports etc.\n // Ignore rules nested inside other rules (standard CSS nesting behavior)\n if (rule.parent.type === 'rule') {\n return\n }\n\n const transformSelector = selectorParser((root) => {\n // Iterate over a static list to avoid infinite loops with insertions\n const selectors = []\n root.each(selector => {\n selectors.push(selector)\n })\n\n selectors.forEach((selector) => {\n // We only care about Selector nodes\n if (selector.type !== 'selector') {\n return\n }\n\n const firstNode = selector.first\n\n // Skip if empty or already nested\n if (!firstNode) {\n return\n }\n if (firstNode.type === 'nesting') {\n return\n }\n\n // Check if first node is a class\n if (firstNode.type === 'class') {\n const className = firstNode.value\n const isRoot = rootClasses.has(className)\n const isDescendant = descendantClasses.has(className)\n\n if (isRoot) {\n if (isDescendant) {\n // Transform to: &.classname, .classname\n // Clone first (creates the descendant version)\n const descendantSelector = selector.clone()\n\n // Modify the original to be root version (&.classname)\n const nesting = selectorParser.nesting()\n selector.insertBefore(firstNode, nesting)\n\n // Append the descendant selector to the parent Container\n root.insertAfter(selector, descendantSelector)\n } else {\n // Transform to: &.classname\n const nesting = selectorParser.nesting()\n selector.insertBefore(firstNode, nesting)\n }\n }\n }\n })\n })\n\n try {\n // @ts-ignore\n transformSelector.processSync(rule, { updateSelector: true })\n } catch (error) {\n const message = 'Error parsing selector: ' + rule.selector\n if (typeof onError === 'function') {\n onError({\n level: 'ERR',\n message,\n error\n })\n } else {\n console.error(message, error)\n }\n }\n }\n }\n ])\n\n const result = await processor.process(css, { from: undefined })\n return result.css\n}\n", "import { build } from 'esbuild'\nimport serialize from 'serialize-javascript'\nimport { parse as parseJS } from 'acorn'\nimport { simple as walkJS } from 'acorn-walk'\nimport { normalizeFunction, normalizeObjectFunctions, hasObjectKeys, mergeUniqueObjects, findAndExtractImperativeComponents, astTransformer, addComponentAndDependencies, cleanAST, cleanValues, generateHydrationMap } from './utils.js'\nimport { pathToFileURL, fileURLToPath } from 'node:url'\nimport { resolve, parse, dirname, relative } from 'node:path'\nimport { nodeModulesPolyfillPlugin } from 'esbuild-plugins-node-modules-polyfill'\nimport render from 'dom-serializer'\n\n/**\n * Script Manager for Coralite\n * Manages shared functions across component instances and provides plugin extensibility\n * @import {ScriptPlugin, InstanceContext} from '../types/index.js'\n */\n\n/**\n * ScriptManager constructor function\n * @class\n */\nexport function ScriptManager (options = {}) {\n this.sharedFunctions = Object.create(null)\n this.contextProps = Object.create(null)\n this.plugins = []\n this.scriptModules = []\n this.options = options\n}\n\n/**\n * Register a plugin\n * @param {ScriptPlugin} plugin - Plugin object or setup function\n * @returns {Promise<ScriptManager>} - Returns this for method chaining\n */\nScriptManager.prototype.use = async function (plugin) {\n // Register script modules (client plugins)\n if (\n plugin\n && typeof plugin !== 'function'\n ) {\n if (plugin.context\n || typeof plugin.setup === 'function'\n || typeof plugin.onBeforeComponentRender === 'function'\n || typeof plugin.onAfterComponentRender === 'function'\n || typeof plugin.onDisconnected === 'function') {\n this.scriptModules.push(plugin)\n\n if (plugin.context) {\n let extractedComponents = []\n for (const key in plugin.context) {\n if (Object.hasOwn(plugin.context, key)) {\n const contextFn = plugin.context[key]\n const contextStr = typeof contextFn === 'function' ? `(${contextFn.toString()})` : serialize(contextFn)\n const foundComponents = findAndExtractImperativeComponents(contextStr)\n extractedComponents = extractedComponents.concat(foundComponents)\n }\n }\n if (extractedComponents.length > 0) {\n plugin._extractedComponents = Array.from(new Set(extractedComponents))\n }\n }\n }\n }\n\n this.plugins.push(plugin)\n return this\n}\n\n/**\n * Get context object content string\n * @returns {string} String containing all context as object state\n */\nScriptManager.prototype.getClientContextContent = function () {\n let contextPropsStr = ''\n\n for (const [key, value] of Object.entries(this.contextProps)) {\n contextPropsStr += `\"${key}\": async (globalContext) => {\n const phase1 = ${value};\n const phase2 = await phase1(globalContext);\n return (localContext) => phase2(localContext);\n },`\n }\n\n return contextPropsStr\n}\n\n/**\n * Add a context property function\n * @param {string} name - Property name\n * @param {function} method - The property function\n * @returns {Promise<ScriptManager>} - Returns this for method chaining\n */\nScriptManager.prototype.addContextProp = async function (name, method) {\n this.contextProps[name] = normalizeFunction(method)\n\n return this\n}\n\n/**\n * Register shared functions for a component\n * @param {Object} options\n * @param {string} options.id - component identifier\n * @param {import('../types/script.js').ScriptContent} [options.script={}] - Script content or function\n * @param {string} [options.filePath] - The source file path to map back to\n * @param {Array<Object>|null} [options.templateAST=null] - Parsed HTML template AST for the client side rendering\n * @param {Object|null} [options.templateValues=null] - Token positions for AST updates\n * @param {Object} [options.defaultValues={}] - Initial default state from setup()\n * @param {Object} [options.getters={}] - Component getters\n * @param {string} [options.styles=''] - Raw CSS string for the component\n * @param {Object.<string, Function>} [options.slots={}] - Computed slots\n */\nScriptManager.prototype.registerComponent = function ({\n id,\n script = {},\n filePath,\n templateAST = null,\n templateValues = null,\n defaultValues = {},\n getters = {},\n styles = '',\n slots = {}\n}) {\n // Initialize base object if it's the first time we are seeing this ID\n if (!this.sharedFunctions[id]) {\n this.sharedFunctions[id] = {\n id,\n components: [],\n filePath: `/component-${id}.js`\n }\n }\n\n const target = this.sharedFunctions[id]\n\n if (hasObjectKeys(script)) {\n target.script = script\n }\n\n if (hasObjectKeys(getters)) {\n if (target.getters) {\n target.getters = {\n ...target.getters,\n ...getters\n }\n } else {\n target.getters = getters\n }\n }\n\n if (templateAST) {\n target.templateAST = templateAST\n }\n\n if (templateValues) {\n target.templateValues = templateValues\n }\n\n if (styles) {\n target.styles = styles\n }\n\n if (filePath) {\n target.filePath = resolve(filePath)\n }\n\n\n if (hasObjectKeys(defaultValues)) {\n if (target.defaultValues) {\n target.defaultValues = {\n ...target.defaultValues,\n ...defaultValues\n }\n } else {\n target.defaultValues = defaultValues\n }\n }\n\n if (hasObjectKeys(slots)) {\n if (target.slots) {\n target.slots = {\n ...target.slots,\n ...slots\n }\n } else {\n target.slots = slots\n }\n }\n\n if (script) {\n if (script.components?.length) {\n target.components = mergeUniqueObjects(target.components, script.components)\n }\n }\n}\n\n/**\n * Generate instance-specific script wrapper\n * @param {string} id - component identifier\n * @param {InstanceContext} instanceContext - Instance context\n * @returns {string} Generated script\n */\nScriptManager.prototype.generateInstanceWrapper = function (id, instanceContext) {\n const state = instanceContext.state ? serialize(instanceContext.state) : '{}'\n const page = instanceContext.page ? serialize(instanceContext.page) : '{}'\n\n // Generate wrapper that calls shared functions with instance context\n return `await coraliteComponentFunctions[\"${id}\"]({\n state: ${state},\n page: ${page},\n ...pluginContexts,\n instanceId: '${instanceContext.instanceId}'\n });`\n}\n\n/**\n * Compile all instances for a component\n * @param {Object.<string, InstanceContext>} instances - Map of instanceId -> instance data\n * @param {string} mode - Build mode\n * @returns {Promise<any>} Compiled script\n */\nScriptManager.prototype.compileAllInstances = async function (instances, mode) {\n const entryCodeParts = []\n const moduleNamespace = 'coralite-script-module:'\n // Generate ESM imports for each script module\n for (let i = 0; i < this.scriptModules.length; i++) {\n entryCodeParts.push(`import { clientContextProps as clientContextProps_${i}, runSetup as runSetup_${i}, onBeforeComponentRender as onBeforeComponentRender_${i}, onAfterComponentRender as onAfterComponentRender_${i}, onDisconnected as onDisconnected_${i} } from \"${moduleNamespace}${i}\";\\n`)\n }\n\n // Setup client context state\n const contextParts = [\n ...this.scriptModules.map((_, i) => `...clientContextProps_${i}`),\n this.getClientContextContent()\n ].filter(Boolean).join(',\\n')\n\n entryCodeParts.push(`const coraliteComponentClientContextProps = {\n ${contextParts}\n };\\n`)\n\n entryCodeParts.push(`const getSetups = async (context) => {\n const state = {};\n const results = await Promise.all([\n ${this.scriptModules.map((_, i) => `runSetup_${i}(context)`).join(',\\n ')}\n ]);\n for (const result of results) {\n if (result && typeof result === 'object') {\n Object.assign(state, result);\n }\n }\n return state;\n }\\n`)\n\n // Global setups initialization\n entryCodeParts.push(`const globalContext = { values: {} };\\n`)\n entryCodeParts.push(`const globalSetupPropertiesPromise = getSetups(globalContext).then(setupValues => {\n Object.assign(globalContext.values, setupValues);\n return setupValues;\n });\\n`)\n\n entryCodeParts.push(`const resolvedContextPropsPromise = globalSetupPropertiesPromise.then(async () => {\n const resolvedProps = {};\n for (const [key, propFn] of Object.entries(coraliteComponentClientContextProps)) {\n resolvedProps[key] = await propFn(globalContext);\n }\n return resolvedProps;\n });\\n`)\n\n entryCodeParts.push(`const getClientContext = async (context) => {\n const clientContextProps = {}\n const resolvedProps = await resolvedContextPropsPromise;\n for (const [key, resolvedProp] of Object.entries(resolvedProps)) {\n clientContextProps[key] = resolvedProp(context)\n }\n return clientContextProps\n }\\n`)\n\n const instanceValues = Object.entries(instances)\n // Collect unique components\n /** @type {Record<string, boolean>} */\n const processedComponent = {}\n\n for (const instanceData of instanceValues) {\n addComponentAndDependencies(instanceData[1].componentId, processedComponent, this.sharedFunctions)\n }\n\n // Add plugin dependencies explicitly if they are standalone\n for (const plugin of this.plugins) {\n if (plugin && plugin._extractedComponents && Array.isArray(plugin._extractedComponents)) {\n for (const compPath of plugin._extractedComponents) {\n for (const [id, fnData] of Object.entries(this.sharedFunctions)) {\n if (compPath.endsWith(`/${id}.html`) || compPath.endsWith(`\\\\${id}.html`) || compPath === id || compPath.endsWith(`/${id}`)) {\n addComponentAndDependencies(id, processedComponent, this.sharedFunctions)\n }\n }\n }\n }\n }\n\n // Force inclusion of all components that evaluate something inside\n // This is required because if a parent is ONLY instantiated via script dynamically,\n // it might not be in instances or plugin explicit references.\n for (const [componentId, fnData] of Object.entries(this.sharedFunctions)) {\n // \"forcing all imperative components into the final chunks bundle, is fine, but it must not include the children of the imperative components since the imperative should load its own dependent components.\"\n if (fnData.script && fnData.script.content) {\n const scriptContent = fnData.script.content.replace(/\\s+/g, '')\n if (scriptContent !== 'function(){}') {\n processedComponent[componentId] = true\n }\n } else if (fnData.script && fnData.script.components && fnData.script.components.length > 0) {\n processedComponent[componentId] = true\n } else if (hasObjectKeys(fnData.defaultValues)) {\n processedComponent[componentId] = true\n }\n }\n\n const processedComponentKeys = Object.keys(processedComponent).sort()\n const regex = /[-.:]/g\n const namespace = 'coralite-component:'\n const componentImportsNamespace = 'coralite-component-imports:'\n\n // Generate ESM imports for each component script\n for (const componentId of processedComponentKeys) {\n if (this.sharedFunctions[componentId]) {\n const safeId = componentId.replace(regex, '_')\n entryCodeParts.push(`import component_${safeId} from \"${namespace}${componentId}\";\\n`)\n }\n }\n\n // Map imports to the functions object\n entryCodeParts.push('const coraliteComponentFunctions = {\\n')\n for (const componentId of processedComponentKeys) {\n if (this.sharedFunctions[componentId]) {\n entryCodeParts.push(` \"${componentId}\": component_${componentId.replace(regex, '_')},\\n`)\n }\n }\n entryCodeParts.push('};\\n')\n\n entryCodeParts.push('const coraliteComponentDefaults = {\\n')\n for (const key of processedComponentKeys) {\n if (this.sharedFunctions[key] && this.sharedFunctions[key].defaultValues) {\n const normalizedDefaults = normalizeObjectFunctions(this.sharedFunctions[key].defaultValues, astTransformer)\n\n entryCodeParts.push(` \"${key}\": (() => {\\n`)\n entryCodeParts.push(` const defaults = ${serialize(normalizedDefaults)};\\n`)\n entryCodeParts.push(` return defaults;\\n`)\n entryCodeParts.push(` })(),\\n`)\n } else {\n entryCodeParts.push(` \"${key}\": {},\\n`)\n }\n }\n entryCodeParts.push('};\\n')\n\n entryCodeParts.push('const coraliteComponentStyles = {\\n')\n for (const key of processedComponentKeys) {\n if (this.sharedFunctions[key] && this.sharedFunctions[key].styles) {\n entryCodeParts.push(` \"${key}\": ${JSON.stringify(this.sharedFunctions[key].styles)},\\n`)\n }\n }\n entryCodeParts.push('};\\n')\n\n const coraliteElementPath = fileURLToPath(import.meta.resolve('./coralite-element.js'))\n\n entryCodeParts.push(`const globalClientHooks = {\n onBeforeComponentRender: [${this.scriptModules.map((_, i) => `onBeforeComponentRender_${i}`).join(', ')}].filter(Boolean),\n onAfterComponentRender: [${this.scriptModules.map((_, i) => `onAfterComponentRender_${i}`).join(', ')}].filter(Boolean),\n onDisconnected: [${this.scriptModules.map((_, i) => `onDisconnected_${i}`).join(', ')}].filter(Boolean)\n };\\n`)\n\n entryCodeParts.push(`import { createCoraliteClass } from ${JSON.stringify(coraliteElementPath)};\\n`)\n entryCodeParts.push('\\nexport { getClientContext, getSetups, createCoraliteClass, globalClientHooks };\\n')\n\n const entryPoints = {\n 'chunk-shared': entryCodeParts.join('').trimEnd()\n }\n\n // Create virtual entry points for each component\n for (const componentId of processedComponentKeys) {\n if (this.sharedFunctions[componentId]) {\n const safeId = componentId.replace(regex, '_')\n let componentEntryCode = ''\n\n const hasScript = this.sharedFunctions[componentId].script && this.sharedFunctions[componentId].script.content && this.sharedFunctions[componentId].script.content.trim() !== 'function(){}' && this.sharedFunctions[componentId].script.content.trim() !== 'function() {}' && this.sharedFunctions[componentId].script.content.trim() !== 'function() { }'\n const hasState = this.sharedFunctions[componentId].script && this.sharedFunctions[componentId].script.stateContent\n\n if (hasScript || hasState) {\n componentEntryCode += `import * as componentModule_${safeId} from \"${namespace}${componentId}\";\\n`\n }\n\n // Use a WeakMap to map original nodes to a unique index\n const nodeMap = new WeakMap()\n const state = { counter: 0 }\n\n cleanAST(this.sharedFunctions[componentId].templateAST, nodeMap, state)\n const templateHTML = serialize(this.sharedFunctions[componentId].templateAST ? render(this.sharedFunctions[componentId].templateAST, { decodeEntities: false }) : '')\n const templateValues = serialize(cleanValues(this.sharedFunctions[componentId].templateValues, nodeMap) || {\n attributes: [],\n textNodes: [],\n refs: []\n })\n const styles = JSON.stringify(this.sharedFunctions[componentId].styles || '')\n\n let normalizedDefaults = this.sharedFunctions[componentId].defaultValues || {}\n if (this.sharedFunctions[componentId].defaultValues) {\n normalizedDefaults = normalizeObjectFunctions(this.sharedFunctions[componentId].defaultValues, astTransformer)\n }\n const defaults = serialize(normalizedDefaults)\n const attributes = serialize(this.sharedFunctions[componentId].script?.attributes || {})\n const hydrationMap = serialize(generateHydrationMap(this.sharedFunctions[componentId].templateAST, this.sharedFunctions[componentId].templateValues))\n const getters = serialize(this.sharedFunctions[componentId].getters || this.sharedFunctions[componentId].script?.getters || {})\n const dependencies = JSON.stringify(this.sharedFunctions[componentId].components || [])\n\n let normalizedSlots = this.sharedFunctions[componentId].slots || {}\n if (this.sharedFunctions[componentId].slots) {\n normalizedSlots = normalizeObjectFunctions(this.sharedFunctions[componentId].slots, astTransformer)\n }\n const slots = serialize(normalizedSlots)\n\n componentEntryCode += `\nexport default {\n componentId: \"${componentId}\",\n templateHTML: ${templateHTML},\n templateValues: ${templateValues},\n styles: ${styles},\n attributes: ${attributes},\n hydrationMap: ${hydrationMap},\n getters: ${getters},\n defaultValues: (() => { const defaults = ${defaults}; return defaults; })(),\n slots: (() => { const slots = ${slots}; return slots; })(),\n dependencies: ${dependencies},\n imports: {},\n script: ${hasScript ? `componentModule_${safeId}.script` : 'null'},\n state: ${hasState ? `componentModule_${safeId}.state` : 'null'}\n};\n`\n entryPoints[componentId] = componentEntryCode\n }\n }\n\n const resolvedImportMap = {}\n\n // Use config's import map if available\n const userImportMap = this.options?.importMap || {}\n\n // Since we cannot pass raw code directly as values in the entryPoints object to esbuild,\n // we need to pass virtual paths.\n /** @type {Record<string, string>} */\n const virtualEntryPoints = {}\n for (const key of Object.keys(entryPoints)) {\n virtualEntryPoints[key] = `virtual-entry-point:${key}`\n }\n\n // Build and bundle\n const result = await build({\n entryPoints: virtualEntryPoints,\n bundle: true,\n write: false,\n treeShaking: true,\n splitting: true,\n metafile: true,\n minify: mode === 'production',\n sourcemap: mode === 'production' ? 'external' : 'inline',\n outdir: 'assets/js',\n entryNames: '[name]-[hash]',\n chunkNames: '[name]-[hash]',\n format: 'esm',\n sourceRoot: pathToFileURL(process.cwd()).href,\n define: {\n global: 'window',\n __dirname: '\"\"',\n __filename: '\"\"'\n },\n plugins: [\n nodeModulesPolyfillPlugin(),\n {\n name: 'coralite-import-map-resolver',\n setup: (pluginBuild) => {\n // Regex to catch bare specifiers (doesn't start with ., .., /, or http)\n const bareSpecifierRegex = /^[^.\\/]|^\\.[^.\\/]|^\\.\\.[^\\/]/\n\n pluginBuild.onResolve({ filter: bareSpecifierRegex }, (args) => {\n // Only intercept specifiers inside generated component scripts/files.\n // Do not externalize entry points themselves.\n if (args.kind === 'entry-point') {\n return null\n }\n\n // Do not externalize if the path resolves to a virtual module\n if (args.namespace === 'coralite-entry') {\n return null\n }\n\n // Check for Coralite internal modules first\n if (args.path.startsWith('coralite-component:') ||\n args.path.startsWith('coralite-script-module:') ||\n args.path === 'chunk-shared' ||\n args.path === 'coralite-shared') {\n return null\n }\n\n // Support virtual module imports for plugins by name\n if (this.plugins.some(p => p.name === args.path)) {\n return {\n path: args.path,\n external: true\n }\n }\n\n\n // Do not externalize if the entry point name actually matches a bare specifier\n if (Object.hasOwn(entryPoints, args.path)) {\n return null\n }\n\n // Ignore absolute URLs that are already explicitly defined\n if (args.path.startsWith('http')) {\n return {\n path: args.path,\n external: true\n }\n }\n\n // Check if the user provided an explicit override in coralite.config.js\n if (userImportMap[args.path]) {\n resolvedImportMap[args.path] = userImportMap[args.path]\n return {\n path: userImportMap[args.path],\n external: true\n }\n }\n })\n }\n },\n {\n name: 'coralite-virtual-modules',\n setup: (pluginBuild) => {\n pluginBuild.onResolve({ filter: /^virtual-entry-point:/ }, args => {\n const key = args.path.replace('virtual-entry-point:', '')\n if (entryPoints[key]) {\n return {\n path: key,\n namespace: 'coralite-entry'\n }\n }\n })\n\n pluginBuild.onLoad({\n filter: /.*/,\n namespace: 'coralite-entry'\n }, args => {\n if (entryPoints[args.path]) {\n return {\n contents: entryPoints[args.path],\n loader: 'js',\n resolveDir: process.cwd()\n }\n }\n })\n }\n },\n {\n name: 'coralite-component-resolver',\n setup: (pluginBuild) => {\n // Catch the script module, associate with real file paths\n const componentRegex = new RegExp(`^${namespace}`)\n\n pluginBuild.onResolve({ filter: componentRegex }, args => {\n const componentId = args.path.replace(namespace, '')\n const sharedFn = this.sharedFunctions[componentId]\n\n return {\n path: sharedFn.filePath,\n pluginData: { componentId }\n }\n })\n\n // Handle script modules\n const moduleRegex = new RegExp(`^${moduleNamespace}`)\n pluginBuild.onResolve({ filter: moduleRegex }, args => {\n const index = parseInt(args.path.replace(moduleNamespace, ''), 10)\n return {\n path: args.path,\n namespace: 'coralite-script-module',\n pluginData: { index }\n }\n })\n\n pluginBuild.onLoad({\n filter: /.*/,\n namespace: 'coralite-script-module'\n }, args => {\n const index = args.pluginData.index\n const module = this.scriptModules[index]\n let contents = ''\n\n // Generate config object\n const configContent = module.config\n ? `const pluginConfig = ${JSON.stringify(module.config)};`\n : 'const pluginConfig = {};'\n\n contents += configContent + '\\n'\n\n // Generate setup function\n const setupFn = module.setup ? normalizeFunction(module.setup) : 'null'\n contents += `export const runSetup = async (context) => {\n const setup = ${setupFn};\n if (!setup) return {};\n const contextObject = {\n config: pluginConfig,\n ...context\n };\n return await setup(contextObject);\n };\\n`\n\n const beforeFn = module.onBeforeComponentRender ? normalizeFunction(module.onBeforeComponentRender) : 'null'\n contents += `export const onBeforeComponentRender = ${beforeFn};\\n`\n\n const afterFn = module.onAfterComponentRender ? normalizeFunction(module.onAfterComponentRender) : 'null'\n contents += `export const onAfterComponentRender = ${afterFn};\\n`\n\n const disconnectedFn = module.onDisconnected ? normalizeFunction(module.onDisconnected) : 'null'\n contents += `export const onDisconnected = ${disconnectedFn};\\n`\n\n // Generate client context state\n contents += 'export const clientContextProps = {\\n'\n if (module.context) {\n for (const key in module.context) {\n if (Object.hasOwn(module.context, key)) {\n if (['id', 'state', 'page', 'root', 'signal'].includes(key)) {\n throw new Error(`Reserved context key '${key}' cannot be used in plugin context.`)\n }\n const fn = normalizeFunction(module.context[key])\n contents += ` \"${key}\": async (context) => {\n const globalContext = {\n ...context,\n config: pluginConfig\n };\n const fn = ${fn};\n const phase2 = await fn(globalContext);\n return (localContext) => phase2(localContext);\n },\\n`\n }\n }\n }\n contents += '};\\n'\n\n return {\n contents,\n loader: 'js',\n resolveDir: module.rootDir || (module.filePath ? dirname(module.filePath) : process.cwd())\n }\n })\n\n // Provide the script content to esbuild when it loads those file paths\n pluginBuild.onLoad({\n filter: /.*/\n }, args => {\n if (!args.pluginData || !args.pluginData.componentId) {\n return\n }\n\n const sharedFn = this.sharedFunctions[args.pluginData.componentId]\n let contents = ''\n\n\n if (sharedFn.script && sharedFn.script.content) {\n const padding = '\\n'.repeat(Math.max(0, sharedFn.script.lineOffset || 0))\n\n // More robust way to strip 'data' from defineComponent call\n let strippedContent = sharedFn.script.content\n\n try {\n const ast = parseJS(strippedContent, {\n ecmaVersion: 'latest',\n sourceType: 'module'\n })\n let dataStart = -1\n let dataEnd = -1\n\n walkJS(ast, {\n CallExpression (node) {\n if (node.callee.type === 'Identifier' && node.callee.name === 'defineComponent') {\n const firstArg = node.arguments[0]\n if (firstArg && firstArg.type === 'ObjectExpression') {\n const dataProp = firstArg.properties.find(p => p.type === 'Property' && p.key?.type === 'Identifier' && p.key?.name === 'data')\n // @ts-ignore\n if (dataProp && dataProp.type === 'Property') {\n // @ts-ignore\n dataStart = dataProp.start\n // @ts-ignore\n dataEnd = dataProp.end\n }\n }\n }\n }\n })\n\n if (dataStart !== -1) {\n let start = dataStart\n let end = dataEnd\n\n // Handle comma to avoid syntax errors\n const afterContent = strippedContent.slice(end)\n const trailingComma = afterContent.match(/^\\s*,/)\n if (trailingComma) {\n end += trailingComma[0].length\n } else {\n const beforeContent = strippedContent.slice(0, start)\n const leadingComma = beforeContent.match(/,\\s*$/)\n if (leadingComma) {\n start -= leadingComma[0].length\n }\n }\n strippedContent = strippedContent.slice(0, start) + strippedContent.slice(end)\n }\n } catch (e) {\n // Fallback to regex if AST parsing fails\n strippedContent = strippedContent.replace(/data\\s*:\\s*async\\s*function\\s*\\([^\\)]*\\)\\s*\\{[\\s\\S]*?\\}(?=\\s*,|\\s*\\})/, '/* data stripped */')\n strippedContent = strippedContent.replace(/async\\s*data\\s*\\([^\\)]*\\)\\s*\\{[\\s\\S]*?\\}(?=\\s*,|\\s*\\})/, '/* data stripped */')\n }\n\n contents += `${padding}export const script = ${strippedContent};\\n`\n contents += `export default script;\\n`\n } else {\n contents += `export const script = null;\\n`\n contents += `export default null;\\n`\n }\n\n if (sharedFn.script && sharedFn.script.stateContent) {\n const padding = '\\n'.repeat(Math.max(0, sharedFn.script.stateLineOffset || 0))\n contents += `${padding}export const state = ${sharedFn.script.stateContent};\\n`\n } else {\n contents += `export const state = null;\\n`\n }\n\n return {\n contents,\n loader: 'js',\n resolveDir: sharedFn.filePath ? dirname(sharedFn.filePath) : process.cwd()\n }\n })\n }\n }\n ]\n })\n\n const manifest = {}\n if (result.metafile && result.metafile.outputs) {\n for (const [outputPath, meta] of Object.entries(result.metafile.outputs)) {\n if (meta.entryPoint) {\n const entryPoint = meta.entryPoint\n const cleanEntry = entryPoint.includes(':') ? entryPoint.split(':').pop() : entryPoint\n\n // 1. STRIP THE EXTENSION (Fixes E2E Bootstrapper Timeout)\n const tagName = parse(cleanEntry).name\n\n // 2. USE RELATIVE PATHS (Fixes the chunks/ 404 issue)\n const relativePath = relative('assets/js', outputPath).replace(/\\\\/g, '/')\n\n manifest[tagName] = relativePath\n }\n }\n }\n\n const outdirAbs = resolve('assets/js')\n const outputFiles = {}\n\n if (result.outputFiles) {\n for (const file of result.outputFiles) {\n // Keep the relative path for the physical output file creation\n const relativePath = relative(outdirAbs, file.path).replace(/\\\\/g, '/')\n\n outputFiles[relativePath] = {\n ...file,\n hashedPath: relativePath,\n text: file.text\n }\n }\n }\n\n return {\n manifest,\n outputFiles,\n importMap: resolvedImportMap\n }\n}\n", "import { definePlugin } from '#lib'\n\n/**\n * @import { ScriptPluginHelperLocalInstance } from '../types/index.js'\n */\n\nexport const refsPlugin = definePlugin({\n name: 'refs',\n server: {\n onBeforeComponentRender: ({ state, instanceId, refs }) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i]\n const uniqueRefValue = `${instanceId}__${ref.name}`\n\n // Update the ref attribute value to be unique\n if (ref.element && ref.element.attribs) {\n ref.element.attribs.ref = uniqueRefValue\n }\n\n // inject flat token into component state\n state[`ref_${ref.name}`] = uniqueRefValue\n }\n }\n },\n client: {\n onBeforeComponentRender: ({ state, instanceId, element, options }) => {\n // @ts-ignore\n const hydrationMap = options.hydrationMap\n\n if (hydrationMap && hydrationMap.refs) {\n for (const ref of hydrationMap.refs) {\n const uniqueRefValue = `${instanceId}__${ref.name}`\n\n // Update state if not already set (e.g. by SSR hydration)\n if (!state[`ref_${ref.name}`]) {\n state[`ref_${ref.name}`] = uniqueRefValue\n }\n\n // Update the actual DOM element if it exists\n // Since this is client side, we need to find the node\n if (hydrationMap && hydrationMap.refs) {\n const refMap = hydrationMap.refs.find(r => r.name === ref.name)\n if (refMap) {\n const node = element.getNodeByPath(refMap.path)\n // @ts-ignore\n if (node && node.setAttribute) {\n // @ts-ignore\n node.setAttribute('ref', uniqueRefValue)\n }\n }\n }\n }\n }\n },\n context: {\n /**\n * Creates a ref resolver function that maps IDs to DOM elements.\n *\n * @returns {ScriptPluginHelperLocalInstance}\n */\n refs () {\n return ({ state, root }) => {\n return function (id) {\n const refId = state[`ref_${id}`]\n\n if (!refId && typeof refId !== 'string') {\n return null\n }\n\n return root.querySelector(`[ref=\"${refId}\"]`)\n }\n }\n }\n }\n }\n})\n", "import { definePlugin } from '#lib'\n\n/**\n * @import { ParseHTMLResult } from '../types/index.js'\n * @import { CoraliteCollectionItem } from '../types/collection.js'\n * @import { Coralite } from '../lib/index.js'\n * @import { CoralitePage } from '../types/core.js'\n */\n\n/**\n * Processes a single element to extract metadata.\n */\nasync function processMetadataElement (element, context, index) {\n const { page, state, data, app, elements } = context\n\n if (element.type !== 'tag') {\n return\n }\n\n if (element.name === 'meta' && element.attribs?.name && element.attribs?.content) {\n page.meta[element.attribs.name] = element.attribs.content\n } else if (element.slots) {\n const componentElement = await app.createComponentElement({\n id: element.name,\n state,\n element,\n page,\n root: elements.root,\n contextId: data.path.pathname + index + element.name,\n index\n })\n\n if (componentElement) {\n for (let j = 0; j < componentElement.children.length; j++) {\n const child = componentElement.children[j]\n if (child.type === 'tag' && child.name === 'meta' && child.attribs?.name && child.attribs?.content) {\n page.meta[child.attribs.name] = child.attribs.content\n } else if (child.type === 'tag' && child.name === 'title' && child.children?.length && child.children[0].type === 'text') {\n page.meta.title = child.children[0].data\n }\n }\n }\n } else if (element.name === 'title' && element.children?.length && element.children[0].type === 'text') {\n page.meta.title = element.children[0].data\n }\n}\n\n/**\n * Extracts metadata tags from the parsed HTML root elements.\n * Supports static <title> and <meta> tags, as well as resolving dynamic custom\n * element slots inside the <head> segment to compute metadata.\n *\n * @param {Object} context -\n * @param {ParseHTMLResult} context.elements - The parsed HTML elements including root\n * @param {CoralitePage} context.page - The global page object to store the extracted metadata\n * @param {Object.<string, any>} context.state - The global state object to store the extracted metadata\n * @param {CoraliteCollectionItem} context.data - The file data currently being evaluated\n * @param {Coralite} [context.app] - The global coralite app instance\n * @returns {Promise<void>}\n */\nasync function extractMetadata (context) {\n const { elements, page } = context\n page.meta.lang = ''\n\n for (let i = 0; i < elements.root.children.length; i++) {\n const rootNode = elements.root.children[i]\n\n if (rootNode.type === 'tag' && rootNode.name === 'html') {\n page.meta.lang = rootNode.attribs?.lang || ''\n\n for (let j = 0; j < rootNode.children.length; j++) {\n const node = rootNode.children[j]\n\n if (node.type === 'tag' && node.name === 'head') {\n for (let k = 0; k < node.children.length; k++) {\n await processMetadataElement(node.children[k], context, k)\n }\n return\n }\n }\n }\n }\n}\n\nexport const metadataPlugin = definePlugin({\n name: 'metadata',\n server: {\n async onPageSet ({ elements, state, page, data, app }) {\n await extractMetadata({\n elements,\n state,\n page,\n data,\n app\n })\n },\n async onPageUpdate ({ elements, page, newValue, app }) {\n await extractMetadata({\n elements,\n state: newValue.result.state,\n page,\n data: newValue,\n app\n })\n\n return {\n newValue: {\n result: {\n page\n }\n }\n }\n }\n }\n})\n", "/**\n * @import { CoralitePlugin, HTMLData } from '../types/index.js'\n */\n\nimport { basename, dirname } from 'path'\n\n/**\n * Validates that a value is a non-empty string\n * @param {*} value - Value to validate\n * @param {string} paramName - Parameter name for error messages\n * @throws {Error} If value is not a valid non-empty string\n */\nfunction validateNonEmptyString (value, paramName) {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(\n `Coralite plugin validation failed: \"${paramName}\" must be a non-empty string, received ${typeof value}`\n )\n }\n}\n\n/**\n * Validates that a value is an array of strings (or empty array)\n * @param {*} value - Value to validate\n * @param {string} paramName - Parameter name for error messages\n * @throws {Error} If value is defined but not an array of strings\n */\nfunction validateStringArray (value, paramName) {\n if (!Array.isArray(value)) {\n throw new Error(\n `Coralite plugin validation failed: \"${paramName}\" must be an array, received ${typeof value}`\n )\n }\n\n for (let i = 0; i < value.length; i++) {\n if (typeof value[i] !== 'string') {\n throw new Error(\n `Coralite plugin validation failed: \"${paramName}[${i}]\" must be a string, received ${typeof value[i]}`\n )\n }\n }\n}\n\n/**\n * Processes a single components file with optional caching\n * @param {string} path - Template file path\n * @returns {HTMLData} Template data\n * @throws {Error} If components file cannot be read or is invalid\n */\nfunction processComponents (path) {\n try {\n const componentData = {\n path: {\n pathname: path,\n dirname: dirname(path),\n filename: basename(path)\n }\n }\n\n return componentData\n } catch (error) {\n throw new Error(\n `Coralite plugin component processing failed for \"${path}\": ${error.message}`\n )\n }\n}\n\n/**\n * Creates a new Coralite plugin instance based on provided configuration options.\n * @param {CoralitePlugin & { server?: { components?: string[] } }} options - Plugin configuration object\n * @returns {CoralitePlugin} A configured plugin instance ready to be registered with Coralite\n * @example\n * // Basic plugin\n * const myPlugin = definePlugin({\n * name: 'my-plugin',\n * server: {\n * exports: {\n * getData: (context) => (options) => {\n * // Plugin logic implementation\n * return { ...context.state, custom: 'data', ...options }\n * }\n * }\n * }\n * })\n *\n * @example\n * // Plugin with components and metadata\n * const advancedPlugin = definePlugin({\n * name: 'advanced-plugin',\n * server: {\n * exports: {\n * process: (context) => async (options) => {\n * // Async plugin logic\n * return { ...context.state, processed: true, ...options }\n * }\n * },\n * components: ['src/components/header.html', 'src/components/footer.html'],\n * onPageSet: async (data) => {\n * console.log('Page created:', data.path.pathname)\n * }\n * }\n * })\n */\nexport function definePlugin ({\n name,\n server,\n client\n}) {\n validateNonEmptyString(name, 'name')\n\n let callerDir\n if (client != null && client.rootDir == null) {\n const stack = new Error().stack\n if (stack) {\n const callerLine = stack.split('\\n')[2]\n if (callerLine) {\n const match = callerLine.match(/file:\\/\\/(.+?):/)\n if (match) {\n callerDir = dirname(match[1])\n }\n }\n }\n }\n\n // Validate server plugin if provided\n if (server != null) {\n if (typeof server !== 'object') {\n throw new Error(\n `Coralite plugin validation failed: \"server\" must be an object, received ${typeof server}`\n )\n }\n\n server = { ...server }\n\n // Process component files with error handling\n if (server.components) {\n validateStringArray(server.components, 'server.components')\n\n const componentHTMLData = []\n try {\n // Process all components\n for (const path of server.components) {\n componentHTMLData.push(processComponents(path))\n }\n // @ts-ignore\n server.components = componentHTMLData\n } catch (error) {\n // Enhance error message with plugin context\n throw new Error(\n `Coralite plugin \"${name}\" failed to load components: ${error.message}`\n )\n }\n }\n }\n\n // Validate client plugin if provided\n if (client != null) {\n if (typeof client !== 'object') {\n throw new Error(\n `Coralite plugin validation failed: \"client\" must be an object, received ${typeof client}`\n )\n }\n\n // Validate optional client state\n if (client.setup != null && typeof client.setup !== 'function') {\n throw new Error(\n `Coralite plugin validation failed: \"client.setup\" must be a function, received ${typeof client.setup}`\n )\n }\n\n if (client.config != null && typeof client.config !== 'object') {\n throw new Error(\n `Coralite plugin validation failed: \"client.config\" must be an object, received ${typeof client.config}`\n )\n }\n\n // append rootDir\n client.rootDir = client.rootDir || callerDir\n }\n\n // Create the plugin object with all configured state\n return {\n name,\n server,\n client\n }\n}\n", "import { definePlugin } from '../lib/plugin.js'\nimport { createRequire } from 'node:module'\nimport { dirname, join, parse } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { cp, mkdir } from 'node:fs/promises'\n\n/**\n * Finds the nearest package.json starting from a given directory.\n * @param {string} startDir - The directory to start searching from.\n * @returns {string} The path to the directory containing package.json.\n * @throws {Error} If package.json is not found up to the root.\n */\nfunction findPackageRoot (startDir) {\n let currentDir = startDir\n const rootDir = parse(currentDir).root\n\n while (currentDir !== rootDir) {\n if (existsSync(join(currentDir, 'package.json'))) {\n return currentDir\n }\n currentDir = dirname(currentDir)\n }\n\n throw new Error('package.json not found')\n}\n\n/**\n * Coralite plugin to copy static assets during build\n * @param {import('../types/index.js').CoraliteStaticAsset[]} assets - Static assets to copy during build.\n */\nexport const staticAssetPlugin = (assets = []) => {\n return definePlugin({\n name: 'static-asset-plugin',\n server: {\n onBeforeBuild: async function (context) {\n const outputDir = context.app.options.output || join(process.cwd(), 'dist')\n\n for (const asset of assets) {\n if (!asset.dest) {\n throw new Error('staticAssetPlugin requires assets to have a dest property.')\n }\n\n const dest = join(outputDir, asset.dest)\n\n if (asset.src) {\n await mkdir(dirname(dest), { recursive: true })\n await cp(asset.src, dest, { recursive: true })\n continue\n }\n\n if (!asset.pkg || !asset.path) {\n throw new Error('staticAssetPlugin requires assets to have pkg and path state when src is not provided.')\n }\n\n const require = createRequire(join(process.cwd(), 'package.json'))\n let pkgPath\n\n try {\n pkgPath = dirname(require.resolve(`${asset.pkg}/package.json`))\n } catch (e) {\n try {\n const resolvedPath = require.resolve(asset.pkg)\n pkgPath = findPackageRoot(dirname(resolvedPath))\n } catch (resolutionError) {\n throw new Error(`staticAssetPlugin could not resolve package.json for package: ${asset.pkg}`)\n }\n }\n\n const src = join(pkgPath, asset.path)\n\n await mkdir(dirname(dest), { recursive: true })\n await cp(src, dest, { recursive: true })\n }\n }\n }\n })\n}\n", "import { definePlugin } from '#lib'\n\n/**\n * Traverses an AST recursively and duplicates 'ref' attributes to 'data-testid'.\n * Note: Modifying AST nodes in-place is required to preserve reference identity\n * for internal framework arrays (e.g. customElements, skipRenderElements).\n * @param {Array} children - The AST nodes to traverse.\n */\nfunction traverseAndAddTestId (children) {\n if (!Array.isArray(children)) {\n return\n }\n\n for (let i = 0; i < children.length; i++) {\n const node = children[i]\n\n if (node.type === 'tag' && node.attribs?.ref) {\n node.attribs['data-testid'] = node.attribs.ref\n }\n\n if (node.children?.length > 0) {\n traverseAndAddTestId(node.children)\n }\n }\n}\n\nexport const testingPlugin = definePlugin({\n name: 'testing',\n server: {\n onBeforeComponentRender: ({ instanceId, refs }) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i]\n const uniqueRefValue = `${instanceId}__${ref.name}`\n\n if (ref.element.attribs) {\n ref.element.attribs['data-testid'] = uniqueRefValue\n }\n }\n },\n onComponentSet: (component) => {\n const children = component?.template?.children\n if (children) {\n traverseAndAddTestId(children)\n }\n },\n onPageSet: ({ elements }) => {\n const children = elements?.root?.children\n if (children) {\n traverseAndAddTestId(children)\n }\n }\n },\n client: {\n onBeforeComponentRender: ({ instanceId, refs }) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i]\n const uniqueRefValue = `${instanceId}__${ref.name}`\n\n if (ref.element && ref.element.setAttribute) {\n ref.element.setAttribute('data-testid', uniqueRefValue)\n }\n }\n }\n }\n})\n", "import { cleanKeys, cloneModuleInstance, replaceToken, cloneComponentInstance, findAndExtractScript, findAndExtractProperties, extractGlobals, mergePluginState, normalizeObjectFunctions, astTransformer } from './utils.js'\nimport { getHtmlFile, getHtmlFiles, discoverHtmlFiles } from './html.js'\nimport { findHeadAndBody, injectExternalStyles, injectStyles, injectReadinessScript, injectImportMap, removeElements, resolvePageQueue } from './render-helpers.js'\nimport { generateClientRuntime } from './client-runtime.js'\nimport { parseHTML, parseModule, createElement, createTextNode } from './parse.js'\nimport { transformCss } from './style-transform.js'\nimport { ScriptManager } from './script-manager.js'\nimport { metadataPlugin, refsPlugin, staticAssetPlugin, testingPlugin } from '#plugins'\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { dirname, join, normalize, relative, resolve } from 'node:path'\nimport { createRequire } from 'node:module'\nimport { transform } from 'esbuild'\nimport {\n isCoraliteElement,\n isCoraliteCollectionItem,\n isCoraliteComment,\n isCoraliteTextNode\n} from './type-helper.js'\nimport { CoraliteError } from './errors.js'\nimport { pathToFileURL } from 'node:url'\nimport { availableParallelism } from 'node:os'\nimport render from 'dom-serializer'\nimport pLimit from 'p-limit'\nimport { createCoraliteElement, createCoraliteTextNode } from './dom.js'\nimport CoraliteCollection from './collection.js'\nimport { randomUUID } from 'node:crypto'\nimport { createContext } from 'node:vm'\nimport { createReadOnlyProxy } from './utils.js'\n\n/**\n * @import {\n * CoraliteElement,\n * CoraliteAnyNode,\n * CoraliteModule,\n * CoraliteResult,\n * CoraliteModuleDefinitions,\n * CoraliteComponent,\n * CoraliteCollectionItem,\n * CoraliteComponentRoot,\n * CoraliteCollectionEventSet,\n * CoraliteComponentResult,\n * InstanceContext,\n * CoraliteConfig,\n * CoraliteFilePath,\n * CoralitePage,\n * CoraliteSession,\n * CoralitePluginContext,\n * Attribute\n * } from '../types/index.js'\n */\n\n/**\n * @import {DomSerializerOptions} from 'dom-serializer'\n */\n\n/**\n * @class\n * @param {CoraliteConfig} options\n * @example\n * const coralite = new Coralite({\n * components: './path/to/components',\n * pages: './path/to/pages',\n * mode: 'development',\n * plugins: [myPlugin],\n * ignoreByAttribute: [{ name: 'data-ignore', value: 'true' }],\n * skipRenderByAttribute: ['data-skip-render']\n * });\n */\nexport function Coralite ({\n components,\n pages,\n plugins,\n assets,\n externalStyles,\n baseURL = '/',\n ignoreByAttribute,\n skipRenderByAttribute,\n onError,\n mode = 'production',\n output\n}) {\n // Validate required parameters\n if (!components && typeof components !== 'string') {\n throw new Error('Coralite constructor requires \"components\" option to be defined')\n }\n\n if (!pages && typeof pages !== 'string') {\n throw new Error('Coralite constructor requires \"pages\" option to be defined')\n }\n\n if (!plugins) {\n plugins = []\n }\n\n const path = {\n components: normalize(components),\n pages: normalize(pages)\n }\n\n this._onErrorCallback = onError\n\n // instance options\n this.options = {\n components,\n pages,\n plugins,\n assets,\n externalStyles,\n baseURL,\n ignoreByAttribute,\n skipRenderByAttribute,\n mode,\n path,\n output: output ? normalize(output) : undefined\n }\n\n /** @type {Map<string, CoraliteCollectionItem[]>} */\n this._renderQueues = new Map()\n\n // plugins\n this._plugins = {\n components: [],\n hooks: {\n onPageSet: [],\n onPageUpdate: [],\n onPageDelete: [],\n onComponentSet: [],\n onComponentUpdate: [],\n onComponentDelete: [],\n onBeforePageRender: [],\n onAfterPageRender: [],\n onBeforeComponentRender: [],\n onAfterComponentRender: [],\n onBeforeBuild: [],\n onAfterBuild: []\n }\n }\n\n // Initialize script manager\n this._scriptManager = new ScriptManager(this.options)\n\n // source context\n this._source = {\n utils: {\n parseHTML: (string, ignoreByAttribute = this.options.ignoreByAttribute, skipRenderByAttribute = this.options.skipRenderByAttribute) => parseHTML(string, ignoreByAttribute, skipRenderByAttribute, (errorData) => this._handleError(errorData)),\n parseModule: (string, options) => parseModule(string, {\n ignoreByAttribute: this.options.ignoreByAttribute,\n skipRenderByAttribute: this.options.skipRenderByAttribute,\n onError: (errorData) => this._handleError(errorData),\n ...options\n }),\n getHtmlFiles,\n getHtmlFile,\n createElement: (options) => createElement({\n onError: (errorData) => this._handleError(errorData),\n ...options\n }),\n createTextNode,\n transform: this.transform\n },\n plugins: {\n }\n }\n\n // place core plugin first\n if (this.options.mode === 'development') {\n plugins.unshift(testingPlugin)\n }\n plugins.unshift(refsPlugin, metadataPlugin)\n\n if (assets) {\n plugins.unshift(staticAssetPlugin(assets))\n }\n\n const source = this._source\n // iterate over each plugin and register its hooks and modules in the Coralite source context.\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i]\n\n if (plugin.server) {\n // set plugin method\n if (plugin.server.exports !== undefined) {\n source.plugins[plugin.name] = plugin.server.exports\n }\n\n // queue any components provided by the plugin to be registered.\n if (plugin.server.components && Array.isArray(plugin.server.components)) {\n for (let j = 0; j < plugin.server.components.length; j++) {\n this._plugins.components.push(plugin.server.components[j])\n }\n }\n\n // add the plugin's hooks to the appropriate Coralite hook lists.\n if (plugin.server.onPageSet) {\n this._addPluginHook('onPageSet', plugin.server.onPageSet)\n }\n if (plugin.server.onPageDelete) {\n this._addPluginHook('onPageDelete', plugin.server.onPageDelete)\n }\n if (plugin.server.onPageUpdate) {\n this._addPluginHook('onPageUpdate', plugin.server.onPageUpdate)\n }\n if (plugin.server.onComponentSet) {\n this._addPluginHook('onComponentSet', plugin.server.onComponentSet)\n }\n if (plugin.server.onComponentDelete) {\n this._addPluginHook('onComponentDelete', plugin.server.onComponentDelete)\n }\n if (plugin.server.onComponentUpdate) {\n this._addPluginHook('onComponentUpdate', plugin.server.onComponentUpdate)\n }\n if (plugin.server.onBeforePageRender) {\n this._addPluginHook('onBeforePageRender', plugin.server.onBeforePageRender)\n }\n if (plugin.server.onAfterPageRender) {\n this._addPluginHook('onAfterPageRender', plugin.server.onAfterPageRender)\n }\n if (plugin.server.onBeforeComponentRender) {\n this._addPluginHook('onBeforeComponentRender', plugin.server.onBeforeComponentRender)\n }\n if (plugin.server.onAfterComponentRender) {\n this._addPluginHook('onAfterComponentRender', plugin.server.onAfterComponentRender)\n }\n if (plugin.server.onBeforeBuild) {\n this._addPluginHook('onBeforeBuild', plugin.server.onBeforeBuild)\n }\n if (plugin.server.onAfterBuild) {\n this._addPluginHook('onAfterBuild', plugin.server.onAfterBuild)\n }\n }\n\n // register client-side plugin if provided\n if (plugin.client) {\n this._scriptManager.use(plugin.client)\n }\n }\n\n const propertyDescriptors = {\n enumerable: false,\n configurable: false,\n writable: false\n }\n\n const enumerablePropertyDescriptors = {\n enumerable: true,\n configurable: false,\n writable: true\n }\n\n Object.defineProperties(this, {\n options: { ...enumerablePropertyDescriptors },\n _plugins: { ...propertyDescriptors },\n _scriptManager: { ...propertyDescriptors },\n _source: { ...propertyDescriptors },\n _onErrorCallback: { ...propertyDescriptors },\n _renderQueues: { ...propertyDescriptors }\n })\n}\n\n/**\n * Initialises the Coralite instance.\n * @returns {Promise<void>}\n */\nCoralite.prototype.initialise = async function () {\n this.components = await getHtmlFiles({\n path: this.options.components,\n recursive: true,\n type: 'component',\n onFileSet: async (value) => {\n if (value.content === undefined) {\n value.content = await getHtmlFile(value.path.pathname)\n }\n\n const component = parseModule(value.content, {\n ignoreByAttribute: this.options.ignoreByAttribute,\n skipRenderByAttribute: this.options.skipRenderByAttribute,\n onError: (errorData) => this._handleError(errorData)\n })\n\n // abort component add\n if (!component.isTemplate) {\n return\n }\n\n const mappedComponent = await this._triggerPluginHook('onComponentSet', component)\n\n return {\n type: 'component',\n id: mappedComponent.id,\n value: mappedComponent\n }\n },\n onFileUpdate: async (value) => {\n if (value.content === undefined) {\n value.content = await getHtmlFile(value.path.pathname)\n }\n\n const component = parseModule(value.content, {\n ignoreByAttribute: this.options.ignoreByAttribute,\n skipRenderByAttribute: this.options.skipRenderByAttribute,\n onError: (errorData) => this._handleError(errorData)\n })\n\n // abort component update\n if (!component.isTemplate) {\n return\n }\n\n return await this._triggerPluginHook('onComponentUpdate', component)\n },\n onFileDelete: async (value) => {\n await this._triggerPluginHook('onComponentDelete', value)\n }\n })\n\n // register plugin components\n await Promise.all(this._plugins.components.map(c => this.components.setItem(c)))\n\n // collection of custom elements used by pages\n /** @type {Object.<string, Set<string>>} */\n const pageCustomElements = {}\n /** @type {Object.<string, string>} */\n const childCustomElements = {}\n\n /**\n * @type {Object.<string, Set<string>>}\n */\n this._pageCustomElements = pageCustomElements\n /**\n * @type {Object.<string, string>}\n */\n this._childCustomElements = childCustomElements\n\n Object.defineProperties(this, {\n _pageCustomElements: {\n enumerable: false,\n configurable: false,\n writable: false\n },\n _childCustomElements: {\n enumerable: false,\n configurable: false,\n writable: false\n }\n })\n\n /** @type {CoraliteCollectionEventSet} */\n const onFileSet = async (data) => {\n // Determine the root path based on the data type\n let rootPath = this.options.path.pages\n\n if (data.type === 'component') {\n rootPath = this.options.path.components\n }\n\n // Convert relative file path to a URL pathname format\n const urlPathname = pathToFileURL(join('/', relative(rootPath, data.path.pathname))).pathname\n\n const page = {\n url: {\n pathname: urlPathname,\n dirname: pathToFileURL(dirname(urlPathname)).pathname\n },\n file: {\n pathname: data.path.pathname,\n dirname: data.path.dirname,\n filename: data.path.filename\n },\n meta: {}\n }\n\n // define a set of context state for component rendering\n /** @type {any} */\n const state = {\n ...data.state,\n page\n }\n\n // If discovered only, skip parsing and plugin hooks to save memory\n if (data.content === undefined) {\n return {\n type: 'page',\n value: {\n state,\n page,\n path: data.path\n }\n }\n }\n\n const elements = parseHTML(data.content, this.options.ignoreByAttribute, this.options.skipRenderByAttribute, (errorData) => this._handleError(errorData))\n\n // track parent-child relationship between custom elements (only in development)\n if (this.options.mode !== 'production') {\n const customElementsList = elements ? (elements.customElements || []) : []\n for (let i = 0; i < customElementsList.length; i++) {\n const customElement = customElementsList[i]\n const name = customElement.name\n let item = pageCustomElements[name]\n\n if (!item) {\n pageCustomElements[name] = new Set()\n item = pageCustomElements[name]\n\n const component = this.components.getItem(name)\n\n if (\n component &&\n component.result &&\n component.result.customElements &&\n component.result.customElements.length\n ) {\n const stack = [component.result.customElements]\n\n while (stack.length > 0) {\n const current = stack.pop()\n\n for (let i = 0; i < current.length; i++) {\n const element = current[i]\n\n if (!childCustomElements[element.name]) {\n childCustomElements[element.name] = name\n\n // process nested elements recursively\n const component = this.components.getItem(element.name)\n\n if (\n component &&\n component.result &&\n component.result.customElements &&\n component.result.customElements.length\n ) {\n // push nested custom elements to stack for processing\n stack.push(component.result.customElements)\n }\n }\n }\n }\n }\n }\n\n // add page to custom element collection\n item.add(data.path.pathname)\n }\n }\n\n const mappedContext = await this._triggerPluginHook('onPageSet', {\n elements,\n state: state,\n page,\n data\n })\n\n const isProduction = this.options.mode === 'production'\n\n if (isProduction && data.physical) {\n delete data.content\n }\n\n return {\n type: 'page',\n value: {\n state: mappedContext.state,\n page: mappedContext.page,\n path: mappedContext.data.path,\n // In production, we discard the heavy AST nodes after initialization hooks to save memory.\n // They will be re-parsed on-demand during the build/render phase.\n root: isProduction ? null : mappedContext.elements.root,\n customElements: isProduction ? null : mappedContext.elements.customElements,\n tempElements: isProduction ? null : mappedContext.elements.tempElements,\n skipRenderElements: isProduction ? null : mappedContext.elements.skipRenderElements\n },\n state: mappedContext.state\n }\n }\n\n const onPageUpdate = async (newValue, oldValue) => {\n if (this.options.mode === 'production') {\n return newValue.result\n }\n\n let newCustomElements\n\n if (!newValue.result) {\n const result = await onFileSet(newValue)\n\n newValue.result = result.value\n newCustomElements = result.value.customElements\n } else {\n newCustomElements = newValue.result.customElements\n }\n\n let oldElements = (oldValue.result.customElements || []).slice()\n\n const mappedContext = await this._triggerPluginHook('onPageUpdate', {\n elements: newValue.result,\n page: newValue.result.page,\n newValue,\n oldValue\n })\n\n // Assign back the mapped elements to result so that rendering uses the updated AST and state\n newValue.result = mappedContext.elements\n newValue = mappedContext.newValue\n\n for (let i = 0; i < newCustomElements.length; i++) {\n const newElement = newCustomElements[i]\n\n let hasElement = false\n\n for (let j = 0; j < oldElements.length; j++) {\n const oldElement = oldElements[j]\n\n if (newElement.name === oldElement.name) {\n hasElement = true\n oldElements.splice(j, 1)\n break\n }\n }\n\n if (!hasElement) {\n let item = pageCustomElements[newElement.name]\n\n if (!item) {\n pageCustomElements[newElement.name] = new Set()\n item = pageCustomElements[newElement.name]\n }\n\n // add page to custom element collection\n item.add(newValue.path.pathname)\n }\n }\n\n for (let i = 0; i < oldElements.length; i++) {\n const pageCustomElement = pageCustomElements[oldElements[i].name]\n\n // remove page from custom element reference\n pageCustomElement.delete(newValue.path.pathname)\n }\n\n return newValue.result\n }\n\n const onPageDelete = async (value) => {\n if (this.options.mode === 'production') {\n return\n }\n\n value = await this._triggerPluginHook('onPageDelete', value)\n\n // remove page from custom element reference\n if (value && value.result && value.result.customElements) {\n const customElements = value.result.customElements\n\n for (let i = 0; i < customElements.length; i++) {\n const pageCustomElement = pageCustomElements[customElements[i]]\n\n if (pageCustomElement) {\n pageCustomElement.delete(value.path.pathname)\n }\n }\n }\n }\n\n this.pages = new CoraliteCollection({\n rootDir: this.options.pages,\n onSet: onFileSet,\n onUpdate: onPageUpdate,\n onDelete: onPageDelete\n })\n\n const isProduction = this.options.mode === 'production'\n\n if (isProduction) {\n for await (const file of discoverHtmlFiles({\n path: this.options.pages,\n recursive: true,\n type: 'page',\n discoverOnly: false\n })) {\n // Process file for metadata, then it will be discarded because isProduction is true in onFileSet\n await this.pages.setItem(file)\n }\n } else {\n /** @type {CoraliteCollection} */\n await getHtmlFiles({\n path: this.options.pages,\n recursive: true,\n type: 'page',\n discoverOnly: false,\n collection: this.pages\n })\n }\n}\n\n/**\n * Default error handler for the Coralite instance.\n * @internal\n * @param {Object} data\n * @param {'WARN' | 'ERR' | 'LOG'} data.level\n * @param {string} data.message\n * @param {Error} [data.error]\n */\nCoralite.prototype._defaultOnError = function ({ level, message, error }) {\n if (level === 'ERR') {\n if (error) {\n throw error\n }\n throw new Error(message)\n } else if (level === 'WARN') {\n console.warn(message)\n } else {\n console.log(message)\n }\n}\n\n/**\n * Internal error handler for the Coralite instance.\n * @internal\n * @param {Object} data - The error or log data object containing the details of the event.\n * @param {'WARN' | 'ERR' | 'LOG'} data.level - The severity level of the message.\n * @param {string} data.message - The descriptive message to be logged or thrown.\n * @param {Error} [data.error] - An optional Error instance providing a stack trace.\n */\nCoralite.prototype._handleError = function (data) {\n if (this._onErrorCallback) {\n this._onErrorCallback(data)\n } else {\n this._defaultOnError(data)\n }\n}\n\n/**\n * Helper to create CoraliteError during component execution\n * @internal\n * @param {Error} error - The caught error\n * @param {CoraliteModule} module - The component module\n * @param {CoraliteCollectionItem} moduleComponent - The parent module component\n * @param {CoralitePage} page - The current page\n * @param {string} instanceId - The unique instance id\n * @returns {CoraliteError} The generated error object\n */\nCoralite.prototype._createExecutionError = function (error, module, moduleComponent, page, instanceId) {\n return new CoraliteError(error.message, {\n cause: error,\n componentId: module.id,\n filePath: moduleComponent.path.pathname,\n pagePath: page?.file?.pathname,\n instanceId\n })\n}\n\n/**\n * Creates a render context for the build process.\n * @internal\n * @param {string} [buildId] - The unique identifier for the build process.\n * @returns {CoraliteSession}\n */\nCoralite.prototype._createSession = function (buildId) {\n return {\n buildId,\n state: {},\n styles: new Map(),\n componentTags: new Set(),\n instanceCounters: {},\n generateId (prefix) {\n if (this.instanceCounters[prefix] === undefined) {\n this.instanceCounters[prefix] = 0\n }\n return `${prefix}-${this.instanceCounters[prefix]++}`\n },\n scripts: {\n content: {},\n add (id, item) {\n if (!this.content[id]) {\n this.content[id] = {}\n }\n this.content[id][item.id] = item\n }\n },\n source: {\n currentSourceContextId: '',\n contextInstances: {}\n }\n }\n}\n/**\n * Compiles specified page(s) by rendering their document content and measuring render time.\n * Processes pages based on provided path(s), replacing custom elements with components,\n * and returns rendered results with performance metrics.\n *\n * @internal\n *\n * @param {string | string[]} [path] - Path to a single page or array of page paths relative to the pages directory. If omitted, compiles all pages.\n * @param {Object} [state] - Properties to be passed to the page\n * @returns {AsyncGenerator<CoraliteResult>}\n */\n\n/**\n * Processes custom elements found within a generated page context\n * @internal\n * @param {CoraliteComponent & CoraliteComponentResult} mappedComponent - The compiled component instance\n * @param {CoraliteComponentResult} originalDocument - The original document mapping\n * @param {Object} state - Local component state\n * @param {CoraliteSession} mappedSessionObject - Global rendering state\n * @returns {Promise<void>} Resolves when the elements are processed\n */\nCoralite.prototype._processCustomElementsInPage = async function (mappedComponent, originalDocument, state, mappedSessionObject, pageContext) {\n const customElementsList = mappedComponent.customElements || []\n for (let i = 0; i < customElementsList.length; i++) {\n const customElement = customElementsList[i]\n\n const contextId = mappedSessionObject.generateId(customElement.name)\n const currentProperties = mappedSessionObject.state[contextId] || {}\n\n if (typeof customElement.attribs === 'object') {\n mappedSessionObject.state[contextId] = {\n ...currentProperties,\n ...state,\n ...mappedComponent.state,\n ...customElement.attribs\n }\n } else {\n mappedSessionObject.state[contextId] = {\n ...currentProperties,\n ...state,\n ...mappedComponent.state\n }\n }\n\n const noHydration = customElement.attribs && 'no-hydration' in customElement.attribs\n const componentElement = await this.createComponentElement({\n id: customElement.name,\n state: mappedSessionObject.state[contextId],\n element: customElement,\n page: pageContext || originalDocument.page,\n root: mappedComponent.root,\n contextId,\n index: i,\n session: mappedSessionObject,\n noHydration\n })\n\n if (componentElement) {\n if (noHydration) {\n const parent = customElement.parent\n if (parent && parent.children) {\n const elementIndex = parent.children.indexOf(customElement)\n if (elementIndex !== -1) {\n for (let j = 0; j < componentElement.children.length; j++) {\n componentElement.children[j].parent = parent\n }\n parent.children.splice(elementIndex, 1, ...componentElement.children)\n }\n }\n } else {\n customElement.children = componentElement.children\n for (let j = 0; j < customElement.children.length; j++) {\n customElement.children[j].parent = customElement\n }\n\n if (!customElement.attribs) {\n customElement.attribs = {}\n }\n customElement.attribs['data-cid'] = contextId\n\n mappedSessionObject.componentTags.add(customElement.name)\n }\n }\n }\n}\n\nCoralite.prototype._generatePages = async function* (path, state = {}) {\n const isProduction = this.options.mode === 'production'\n\n if (path) {\n const paths = Array.isArray(path) ? path : [path]\n for (const p of paths) {\n if (!this.pages.getItem(p)) {\n try {\n await this.pages.setItem(p)\n } catch (e) {\n // Path might not be a direct file, could be a glob or dir handled by resolvePageQueue\n }\n }\n }\n }\n\n const queue = resolvePageQueue(this.pages, path)\n\n const buildId = randomUUID()\n this._renderQueues.set(buildId, queue)\n const scriptResultCache = new Map()\n\n try {\n const activeQueue = this._renderQueues.get(buildId)\n\n for (let q = 0; q < activeQueue.length; q++) {\n const pageItem = activeQueue[q]\n const startTime = performance.now()\n\n /** @type {CoraliteComponent & CoraliteComponentResult} */\n const originalDocument = pageItem.result\n\n /** @type {CoraliteComponent & CoraliteComponentResult} */\n // @ts-ignore\n let component\n let pageContext = originalDocument.page\n\n // If the page was discovery-only initialized (no root AST), parse it on-demand\n if (!originalDocument.root) {\n let content = pageItem.content\n if (content === undefined) {\n try {\n content = await getHtmlFile(pageItem.path.pathname)\n } catch (e) {\n // Re-check content in case it was set concurrently or by a plugin (virtual pages)\n if (pageItem.content !== undefined) {\n content = pageItem.content\n } else {\n throw e\n }\n }\n }\n\n // Temporarily store content so plugins can find it via app.pages.getItem()\n pageItem.content = content\n\n const elements = parseHTML(content, this.options.ignoreByAttribute, this.options.skipRenderByAttribute, (errorData) => this._handleError(errorData))\n\n // Shallow clone page object to avoid polluting state across builds\n pageContext = {\n ...originalDocument.page,\n meta: { ...originalDocument.page.meta }\n }\n const pageState = {\n ...originalDocument.state,\n page: pageContext\n }\n\n const mappedContext = await this._triggerPluginHook('onPageSet', {\n elements,\n state: pageState,\n page: pageContext,\n data: pageItem\n })\n\n const fullPath = Object.assign({}, mappedContext.data.path, {\n pages: this.options.path.pages,\n components: this.options.path.components\n })\n /** @type {CoraliteComponent & CoraliteComponentResult} */\n // @ts-ignore\n component = {\n // @ts-ignore\n state: { ...mappedContext.state },\n page: mappedContext.page,\n path: fullPath,\n root: mappedContext.elements.root,\n customElements: mappedContext.elements.customElements,\n tempElements: mappedContext.elements.tempElements,\n skipRenderElements: mappedContext.elements.skipRenderElements,\n ignoreByAttribute: this.options.ignoreByAttribute || []\n }\n\n } else {\n // Deep clone the document to ensure thread safety\n component = cloneComponentInstance(originalDocument)\n component.ignoreByAttribute = component.ignoreByAttribute || this.options.ignoreByAttribute || []\n\n // Ensure pageContext is correctly initialized from cloned component\n pageContext = component.page\n }\n\n // Merge state into component\n Object.assign(component.state, state)\n\n // Initialize Render Context\n const session = this._createSession(buildId)\n // @ts-ignore\n session.mode = this.options.mode\n\n const mappedSession = await this._triggerPluginHook('onBeforePageRender', {\n component,\n state,\n page: pageContext,\n session\n })\n\n const mappedComponent = mappedSession.component\n const mappedSessionObject = mappedSession.session\n\n // reassign the top-level state object in case it was modified\n state = mappedSession.state\n\n // @ts-ignore\n mappedSessionObject.mode = this.options.mode\n\n // remove temporary elements\n removeElements(mappedComponent.tempElements, false)\n\n await this._processCustomElementsInPage(mappedComponent, originalDocument, state, mappedSessionObject, pageContext)\n\n const { head: headElement, body: bodyElement } = findHeadAndBody(mappedComponent.root)\n\n if (this.options.externalStyles && this.options.externalStyles.length > 0) {\n injectExternalStyles(mappedComponent.root, headElement, this.options.externalStyles)\n }\n\n if (mappedSessionObject.styles.size > 0) {\n injectStyles(mappedComponent.root, headElement, mappedSessionObject.styles)\n }\n\n if (mappedSessionObject.componentTags.size > 0) {\n const targetElement = headElement || bodyElement || mappedComponent.root\n const layoutStyleElement = createCoraliteElement({\n type: 'tag',\n name: 'style',\n parent: targetElement,\n attribs: {\n id: 'coralite-components'\n },\n children: []\n })\n\n const selectors = Array.from(mappedSessionObject.componentTags)\n selectors.push('c-token')\n const selector = selectors.join(', ')\n layoutStyleElement.children.push(createCoraliteTextNode({\n type: 'text',\n data: `${selector} { display: contents; }`,\n parent: layoutStyleElement\n }))\n\n if (targetElement === headElement || targetElement === bodyElement) {\n targetElement.children.push(layoutStyleElement)\n } else {\n targetElement.children.unshift(layoutStyleElement)\n }\n }\n\n if (mappedSessionObject.scripts.content[mappedComponent.path.pathname]) {\n const scripts = mappedSessionObject.scripts.content[mappedComponent.path.pathname]\n\n // Build instances object for script manager\n /** @type {Object.<string, InstanceContext>} */\n const instances = {}\n const componentIds = new Set()\n for (const key in scripts) {\n if (Object.prototype.hasOwnProperty.call(scripts, key)) {\n const script = scripts[key]\n componentIds.add(script.componentId)\n // extending script content with templateId and values\n instances[script.id] = {\n instanceId: script.id,\n componentId: script.componentId,\n page: script.page,\n state: script.state\n }\n }\n }\n\n // Generate a deterministic cache key based on the sorted list of components required by this page\n const cacheKey = Array.from(componentIds).sort().join(',')\n\n let scriptResult\n if (scriptResultCache.has(cacheKey)) {\n scriptResult = scriptResultCache.get(cacheKey)\n } else {\n // Wrap hydration state in AST-safe normalization to prevent circularity\n /** @type {Object.<string, InstanceContext>} **/\n const normalizedInstances = {}\n for (const [id, instance] of Object.entries(instances)) {\n normalizedInstances[id] = {\n ...instance,\n state: normalizeObjectFunctions(instance.state, astTransformer)\n }\n }\n\n // Use script manager to compile all instances\n scriptResult = await this._scriptManager.compileAllInstances(normalizedInstances, this.options.mode)\n scriptResultCache.set(cacheKey, scriptResult)\n\n // Store the asset results in the coralite instance to be saved later\n if (!this.outputFiles) {\n this.outputFiles = {}\n }\n Object.assign(this.outputFiles, scriptResult.outputFiles)\n }\n\n if (!scriptResult.manifest['chunk-shared']) {\n this._handleError({\n level: 'ERR',\n message: 'MANIFEST MISSING chunk-shared!',\n error: new Error(JSON.stringify(scriptResult.manifest))\n })\n }\n\n injectReadinessScript(mappedComponent.root, headElement, true)\n injectImportMap(mappedComponent.root, headElement, scriptResult.importMap)\n\n const chunkManifest = { ...scriptResult.manifest }\n delete chunkManifest['chunk-shared']\n\n const base = this.options.baseURL.endsWith('/') ? this.options.baseURL : this.options.baseURL + '/'\n const scriptContent = generateClientRuntime({\n base,\n sharedChunkPath: scriptResult.manifest['chunk-shared'],\n chunkManifest\n })\n\n const hydrationData = {}\n for (const [id, instance] of Object.entries(instances)) {\n const contextId = instance.instanceId\n if (instance.state && Object.keys(instance.state).length > 0) {\n // Ensure state is normalized to remove circular AST nodes before JSON serialization\n hydrationData[contextId] = normalizeObjectFunctions(instance.state, astTransformer)\n }\n }\n\n const hydrationScriptElement = createCoraliteElement({\n type: 'tag',\n name: 'script',\n parent: bodyElement,\n attribs: {\n id: '__CORALITE_HYDRATION__',\n type: 'application/json'\n },\n children: []\n })\n\n hydrationScriptElement.children.push(createCoraliteTextNode({\n type: 'text',\n data: JSON.stringify(hydrationData),\n parent: hydrationScriptElement\n }))\n\n bodyElement.children.push(hydrationScriptElement)\n\n const scriptElement = createCoraliteElement({\n type: 'tag',\n name: 'script',\n parent: bodyElement,\n attribs: {\n type: 'module'\n },\n children: []\n })\n\n scriptElement.children.push(createCoraliteTextNode({\n type: 'text',\n data: scriptContent,\n parent: scriptElement\n }))\n\n bodyElement.children.push(scriptElement)\n }\n\n // remove skip render elements\n removeElements(mappedComponent.skipRenderElements, true)\n\n if (!mappedSessionObject.scripts.content[mappedComponent.path.pathname]) {\n injectReadinessScript(mappedComponent.root, headElement, false)\n }\n\n let rawHTML = ''\n // render document\n rawHTML = this.transform(mappedComponent.root)\n\n\n yield {\n type: 'page',\n path: mappedComponent.path,\n content: rawHTML,\n duration: performance.now() - startTime,\n session\n }\n\n // Explicitly nullify large objects to help GC\n if (isProduction) {\n mappedComponent.root = null\n mappedComponent.customElements = null\n mappedComponent.tempElements = null\n mappedComponent.skipRenderElements = null\n }\n\n if (isProduction) {\n // In production, we can discard the yielded content from the item\n // but we must keep the result object (minus the AST) for metadata and rebuilds.\n delete pageItem.content\n }\n\n // Explicitly nullify render context contents to help GC\n session.state = null\n session.styles = null\n session.scripts = null\n if (session.source) {\n session.source.contextInstances = null\n session.source = null\n }\n }\n } finally {\n this._renderQueues.delete(buildId)\n }\n}\n\n/**\n * @callback BuildPageHandler\n * @param {CoraliteResult} result - The rendered output document for a specific page.\n * @returns {Promise<any> | any} The transformed result to be collected (falsy values are filtered).\n */\n\n/**\n * Compiles pages and collects the results with controlled concurrency.\n * Can optionally transform each result via a callback before collecting.\n *\n * @overload\n * @param {string | string[]} [path] - The target directory or an array of specific page paths to build.\n * @returns {Promise<CoraliteResult[]>} A Promise that resolves to an array of build results.\n *\n * @overload\n * @param {BuildPageHandler} callback - A function invoked for each page to transform the result.\n * @returns {Promise<CoraliteResult[]>} A Promise that resolves to an array of build results.\n *\n * @overload\n * @param {string | string[]} [path] - The target directory or an array of specific page paths to build.\n * @param {Object} [options] - Configuration options for the build process.\n * @param {number} [options.maxConcurrent=availableParallelism] - The maximum number of concurrent file write operations.\n * @param {AbortSignal} [options.signal] - An AbortSignal to cancel the build operation.\n * @param {Object} [options.variables] - Local variables for the page\n * @returns {Promise<CoraliteResult[]>} A Promise that resolves to an array of build results.\n *\n * @overload\n * @param {string | string[]} [path] - The target directory or an array of specific page paths to build.\n * @param {BuildPageHandler} callback - A function invoked for each page to transform the result.\n * @returns {Promise<any[]>} A Promise that resolves to an array of the transformed results.\n *\n * @overload\n * @param {string | string[]} [path] - The target directory or an array of specific page paths to build.\n * @param {Object} [options] - Configuration options for the build process.\n * @param {number} [options.maxConcurrent=availableParallelism] - The maximum number of concurrent file write operations.\n * @param {AbortSignal} [options.signal] - An AbortSignal to cancel the build operation.\n * @param {BuildPageHandler} callback - A function invoked for each page to transform the result.\n * @returns {Promise<any[]>} A Promise that resolves to an array of the transformed results.\n *\n * @example\n * // Build and get all results\n * const results = await coralite.build('./dist')\n * // results is CoraliteResult[]\n *\n * // Build and transform results\n * const titles = await coralite.build('./dist', (result) => {\n * return result.path\n * })\n */\nCoralite.prototype.build = async function (...args) {\n const startTime = performance.now()\n let path = args[0]\n let options\n let callback\n\n // add callback since there are no options\n if (typeof args[0] === 'function') {\n path = null\n callback = args[0]\n } else if (typeof args[1] === 'function') {\n callback = args[1]\n } else {\n options = args[1]\n callback = args[2]\n }\n\n if (!options) {\n options = {}\n }\n\n const mappedBeforeBuild = await this._triggerPluginHook('onBeforeBuild', {\n path,\n options\n })\n\n path = mappedBeforeBuild.path\n options = mappedBeforeBuild.options\n\n // Add options with defaults\n const signal = options?.signal\n const maxConcurrent = options?.maxConcurrent || availableParallelism()\n const variables = options?.variables\n\n // Initialize the limiter\n const limit = pLimit(maxConcurrent)\n const executing = new Set()\n const results = []\n let buildError = null\n const isStreaming = !!callback\n\n try {\n for await (const result of this._generatePages(path, variables)) {\n // Check for immediate cancellation\n if (signal?.aborted) {\n throw signal.reason\n }\n\n // Backpressure - don't pull more data than we can process\n if (executing.size >= limit.concurrency) {\n await Promise.race(executing)\n }\n\n const task = limit(async () => {\n // Exit early if build was cancelled while in queue\n if (signal?.aborted) {\n throw signal.reason\n }\n\n // Trigger onAfterPageRender hooks using the aggregate method\n const additionalPages = await this._triggerPluginAggregateHook('onAfterPageRender', {\n result,\n session: result.session\n })\n\n const items = [result]\n\n // Process any dynamically generated pages returned by the plugins\n for (const newPage of additionalPages) {\n if (newPage && newPage.path && newPage.content) {\n // Mock path data for dynamically generated pages if needed\n if (typeof newPage.path === 'string') {\n newPage.path = {\n pathname: newPage.path,\n filename: join(newPage.path),\n dirname: dirname(newPage.path)\n }\n }\n items.push(newPage)\n }\n }\n\n const finalResults = []\n\n for (const item of items) {\n if (typeof callback === 'function') {\n const transformed = await callback(item)\n if (transformed) {\n finalResults.push(transformed)\n }\n } else {\n finalResults.push(item)\n }\n }\n\n return finalResults\n })\n\n executing.add(task)\n\n // Clean up task\n task.then((callbackResults) => {\n if (callbackResults && callbackResults.length) {\n results.push(...callbackResults)\n }\n\n executing.delete(task)\n }).catch((err) => {\n executing.delete(task)\n\n this._handleError({\n level: 'ERR',\n message: err.message,\n error: err\n })\n })\n }\n\n await Promise.all(executing)\n\n return results\n\n } catch (error) {\n // Clean up - If one fails or we abort, wait for pending to settle\n await Promise.allSettled(executing)\n\n let finalError = error\n\n if (error.name === 'AbortError') {\n this._handleError({\n level: 'WARN',\n message: 'Build cancelled by user.'\n })\n }\n\n if (error instanceof Error) {\n error.message = `Build failed: ${error.message}`\n finalError = error\n } else {\n finalError = new Error(`Build failed: ${error.message}`, { cause: error })\n }\n\n buildError = finalError\n throw finalError\n } finally {\n const duration = performance.now() - startTime\n await this._triggerPluginHook('onAfterBuild', {\n results,\n error: buildError,\n duration\n })\n\n // Clean up to save memory\n }\n}\n\n/**\n * Compiles and saves pages to disk\n *\n * @param {string | string[]} [path] - Optional page path(s) to build\n * @param {Object} [options] - Build configuration\n * @param {number} [options.maxConcurrent=10] - Max concurrent file writes (min 1, max 100)\n * @param {AbortSignal} [options.signal] - AbortSignal\n * @returns {Promise<{ path: string, duration: number }[]>} Array of saved file paths\n * @example\n * // Build entire site with default concurrency (10 files)\n * await coralite.save()\n *\n * // Build specific pages with custom concurrency\n * await coralite.save(['blog/*'], { maxConcurrent: 5 })\n */\nCoralite.prototype.save = async function (path, options = {}) {\n const signal = options?.signal\n const createdDir = {}\n\n if (!this.options.output) {\n throw new Error('Coralite instance must be configured with an \"output\" option to use save()')\n }\n\n const output = this.options.output\n\n const results = []\n await this.build(path, options, async (result) => {\n let relativeDir, outDir, outFile, contentToWrite\n\n // It's a standard HTML page\n relativeDir = relative(this.options.path.pages, result.path.dirname)\n outDir = join(output, relativeDir)\n outFile = join(outDir, result.path.filename)\n contentToWrite = result.content\n\n if (!createdDir[outDir]) {\n await mkdir(outDir, { recursive: true })\n\n createdDir[outDir] = true\n }\n\n // Pass signal to writeFile so Node can stop the I/O immediately\n await writeFile(outFile, contentToWrite, { signal })\n\n results.push({\n path: outFile,\n duration: result.duration\n })\n\n // Return undefined to prevent build() from accumulating redundant results\n return undefined\n })\n\n // Write ESM script assets generated during the build phase\n if (this.outputFiles) {\n const assetsDir = join(output, 'assets', 'js')\n if (!createdDir[assetsDir]) {\n await mkdir(assetsDir, { recursive: true })\n createdDir[assetsDir] = true\n }\n\n const assetWrites = Object.values(this.outputFiles).map(async (file) => {\n const outFile = join(assetsDir, file.hashedPath)\n const outDir = dirname(outFile)\n\n if (!createdDir[outDir]) {\n await mkdir(outDir, { recursive: true })\n createdDir[outDir] = true\n }\n\n await writeFile(outFile, file.text, { signal })\n results.push({\n path: outFile,\n duration: 0\n })\n })\n\n await Promise.all(assetWrites)\n }\n\n return results\n}\n\n/**\n * Renders the provided node or array of nodes using the render function.\n *\n * @param {CoraliteComponentRoot | CoraliteAnyNode | CoraliteAnyNode[]} root - The node(s) to be rendered.\n * @param {DomSerializerOptions} [options] - Changes serialization behavior\n * @returns {string} returns raw HTML\n */\nCoralite.prototype.transform = function (root, options) {\n // @ts-ignore\n return render(root, {\n decodeEntities: false,\n ...options\n })\n}\n\n/**\n * Adds a page to the current render queue.\n * @param {string|CoraliteCollectionItem} value - The path to a page or a CoraliteCollectionItem to add to the render queue.\n * @param {string} buildId - The unique identifier for the current build process.\n */\nCoralite.prototype.addRenderQueue = async function (value, buildId) {\n if (!buildId) {\n throw new Error('addRenderQueue requires a buildId')\n }\n\n const queue = this._renderQueues.get(buildId)\n\n if (!queue) {\n throw new Error('addRenderQueue - buildId not found: \"' + buildId + '\"')\n }\n\n if (typeof value === 'string') {\n const component = this.pages.getItem(value)\n\n if (!component) {\n throw new Error('addRenderQueue - unexpected page ID: \"' + value + '\"')\n }\n\n queue.push(component)\n } else if (isCoraliteCollectionItem(value)) {\n const component = await this.pages.setItem(value)\n\n // add render queue\n queue.push(component)\n }\n}\n\n/**\n * Retrieves page paths associated with a custom element components.\n *\n * @param {string} path - The original path potentially prefixed with the components directory.\n * @returns {string[]} An array of page paths linked to the custom element component.\n */\nCoralite.prototype.getPagePathsUsingCustomElement = function (path) {\n if (this.options.mode === 'production') {\n return []\n }\n\n // normalize path by removing the components directory prefix\n if (path.startsWith(this.options.path.components)) {\n path = path.substring(this.options.path.components.length + 1)\n }\n\n // retrieve the component item from the components collection\n const item = this.components.getItem(path)\n const pages = []\n\n // if component exists, collect associated page paths\n if (item) {\n const id = this._childCustomElements[item.result.id] || item.result.id\n const pageCustomElements = this._pageCustomElements[id]\n\n if (pageCustomElements) {\n // iterate over custom element paths linked to this component\n pageCustomElements.forEach(path => {\n pages.push(path)\n })\n }\n }\n\n return pages\n}\n\n/**\n * Recursively resolves imperative component dependencies, bundling their HTML and state for the client.\n *\n * @param {string[]} componentIds - Array of component IDs to process.\n * @param {CoraliteSession} session - The current build render context.\n * @param {CoralitePage} page - The global page object\n * @param {CoraliteComponentRoot} root - The root element of the component\n * @param {Object} state - The current token state and state available\n * @returns {Promise<void>}\n */\nCoralite.prototype._processDependentComponents = async function (componentIds, session, page, root, state = {}) {\n if (!componentIds?.length) {\n return\n }\n\n for (const id of componentIds) {\n if (this._scriptManager.sharedFunctions[id]) {\n continue\n }\n\n const moduleComponent = this.components.getItem(id)\n if (!moduleComponent) {\n continue\n }\n\n const module = cloneModuleInstance(moduleComponent.result)\n\n // Evaluate the script\n let scriptResult = {}\n if (module.script) {\n try {\n scriptResult = await this._evaluate({\n module,\n state,\n page,\n root,\n contextId: `dependent-${id}`,\n session\n })\n } catch (error) {\n throw this._createExecutionError(error, module, moduleComponent, page, `dependent-${id}`)\n }\n }\n\n // Safely extract __script__ metadata once\n const scriptMeta = scriptResult.__script__ || {}\n const templateAST = moduleComponent.result.template?.children || []\n const templateValues = moduleComponent.result.values || {}\n\n // Process CSS\n if (module.styles?.length && !moduleComponent.result._processedCss) {\n const rawCss = module.styles.join('\\n')\n const { rootClasses, descendantClasses } = moduleComponent.result\n moduleComponent.result._processedCss = await transformCss(\n rawCss, rootClasses, descendantClasses,\n (errorData) => this._handleError(errorData)\n )\n }\n const stylesHTML = moduleComponent.result._processedCss || ''\n\n // Construct script object\n const scriptObj = {\n content: 'function(){}',\n state: scriptMeta.state || {},\n slots: scriptMeta.slots || {}\n }\n\n let defaultValues = scriptMeta.defaultValues || {}\n let extractedComponents = []\n\n // Extract AST\n if (scriptResult.__script__) {\n const extractedScript = findAndExtractScript(module.script)\n if (extractedScript) {\n scriptObj.content = extractedScript.content\n scriptObj.lineOffset = (module.lineOffset || 0) + extractedScript.lineOffset\n extractedComponents = extractedScript.components || []\n }\n\n const extractedProperties = findAndExtractProperties(module.script)\n if (extractedProperties) {\n scriptObj.stateContent = extractedProperties.content\n scriptObj.stateLineOffset = (module.lineOffset || 0) + extractedProperties.lineOffset\n }\n }\n\n // Deduplicate nested components\n const declarativeComponents = (module.customElements || []).map(el => el.name)\n const nestedComponents = [...new Set([...declarativeComponents, ...extractedComponents])]\n\n scriptObj.components = nestedComponents\n\n // Extract tokens\n const extractTokens = (nodes) => nodes?.flatMap(n => n.tokens?.map(t => t.name) || []) || []\n const allTokens = new Set([\n ...extractTokens(module.values?.attributes),\n ...extractTokens(module.values?.textNodes)\n ])\n\n // Apply token values to defaultValues\n for (const token of allTokens) {\n if (defaultValues[token] === undefined && scriptResult[token] !== undefined) {\n defaultValues[token] = scriptResult[token]\n }\n }\n\n // Process Template Refs\n templateValues?.refs?.forEach(ref => {\n const refKey = `ref_${ref.name}`\n defaultValues[refKey] = ''\n scriptObj.state[refKey] = ''\n })\n\n scriptObj.defaultValues = defaultValues\n\n this._scriptManager.registerComponent({\n id: module.id,\n getters: scriptMeta.getters,\n script: scriptObj,\n filePath: moduleComponent.path.pathname,\n templateAST,\n templateValues,\n defaultValues,\n styles: stylesHTML,\n slots: scriptObj.slots\n })\n\n // Recursively process deeper dependencies\n if (nestedComponents.length > 0) {\n const inheritedState = {\n ...state\n }\n delete inheritedState.__script__\n\n await this._processDependentComponents(nestedComponents, session, page, root, inheritedState)\n }\n\n }\n}\n\n/**\n * @param {Object} options\n * @param {string} options.id - id - Unique identifier for the component\n * @param {CoraliteModuleDefinitions} [options.state={}] - Token state available for replacement\n * @param {CoraliteElement} [options.element] - The original Custom Element node\n * @param {CoralitePage} options.page - The global page object\n * @param {CoraliteComponentRoot} [options.root] - The root element of the component\n * @param {string} [options.contextId] - Context Id\n * @param {number} [options.index] - Context index\n * @param {CoraliteSession} [options.session] - Render Context\n * @param {boolean} [options.noHydration] - Indicates if the component should be stripped and not hydrated\n * @param {boolean} [head=true] - Indicates if the current function call is for the head of the recursion\n * @returns {Promise<CoraliteElement | void>}\n */\nCoralite.prototype.createComponentElement = async function ({\n id,\n state = {},\n element,\n page,\n root,\n contextId,\n index,\n session,\n noHydration\n}, head = true) {\n if (!session) {\n session = this._createSession()\n }\n\n const moduleComponent = this.components.getItem(id)\n\n if (!moduleComponent || !moduleComponent.result) {\n return\n }\n\n const componentId = moduleComponent.result.id\n\n if (!contextId) {\n contextId = session.generateId(componentId)\n }\n\n const instanceId = contextId\n\n let componentState = { ...state }\n\n if (head) {\n if (element && element.attribs) {\n componentState = Object.assign(componentState, element.attribs)\n }\n\n // convert object keys to camel case format for consistent naming conventions\n // @ts-ignore\n componentState = cleanKeys(componentState)\n }\n\n /**\n * clone the component to avoid mutations during replacement process.\n * @type {CoraliteModule}\n */\n const module = cloneModuleInstance(moduleComponent.result)\n\n const mappedComponentContext = await this._triggerPluginHook('onBeforeComponentRender', {\n state: componentState,\n componentId: module.id,\n instanceId,\n refs: module.values.refs,\n textNodes: module.values.textNodes,\n attributes: module.values.attributes,\n page,\n element,\n session\n })\n componentState = mappedComponentContext.state\n\n const result = module.template\n\n if (module.styles.length) {\n const attributeName = 'data-style-selector'\n const selector = module.id\n\n // Check if styles have been processed for this component\n if (!moduleComponent.result._processedCss) {\n const rawCss = module.styles.join('\\n')\n\n const { rootClasses, descendantClasses } = moduleComponent.result\n\n // Transform CSS\n moduleComponent.result._processedCss = await transformCss(rawCss, rootClasses, descendantClasses, (errorData) => this._handleError(errorData))\n }\n\n // Add styles to session (idempotent for the build)\n if (!session.styles.has(selector)) {\n session.styles.set(selector, moduleComponent.result._processedCss)\n }\n\n // Inject attribute into component root elements\n const value = selector\n\n for (let i = 0; i < result.children.length; i++) {\n const child = result.children[i]\n if (child.type === 'tag') {\n if (!child.attribs) {\n child.attribs = {}\n }\n\n // Handle existing attribute value\n child.attribs[attributeName] = value\n }\n }\n }\n\n // merge state from component script\n if (module.script) {\n let scriptResult = {}\n\n try {\n const evaluationState = Object.assign({}, componentState)\n\n scriptResult = await this._evaluate({\n module,\n element,\n state: evaluationState,\n page,\n root: element || root,\n contextId,\n session,\n noHydration\n })\n } catch (error) {\n throw this._createExecutionError(error, module, moduleComponent, page, contextId)\n }\n\n if (scriptResult && scriptResult.__script__ != null) {\n const extractedScript = findAndExtractScript(module.script)\n let extractedComponents = []\n\n if (extractedScript) {\n scriptResult.__script__.lineOffset = (module.lineOffset || 0) + extractedScript.lineOffset\n scriptResult.__script__.content = extractedScript.content\n if (extractedScript.components) {\n extractedComponents = extractedScript.components\n }\n } else {\n // Fallback for when script extraction fails (shouldn't happen with valid defineComponent)\n // Ensure we don't crash\n scriptResult.__script__.lineOffset = module.lineOffset || 0\n scriptResult.__script__.content = 'function(){}'\n }\n\n // Extract processed styles from the module\n const stylesHTML = moduleComponent.result._processedCss || ''\n\n const templateAST = moduleComponent.result.template.children\n const templateValues = moduleComponent.result.values\n const componentTokens = {}\n\n for (let i = 0; i < module.values.attributes.length; i++) {\n const item = module.values.attributes[i]\n for (let j = 0; j < item.tokens.length; j++) {\n componentTokens[item.tokens[j].name] = true\n }\n }\n for (let i = 0; i < module.values.textNodes.length; i++) {\n const item = module.values.textNodes[i]\n for (let j = 0; j < item.tokens.length; j++) {\n componentTokens[item.tokens[j].name] = true\n }\n }\n\n // Include all computed state into default values so client script can use them\n const componentDefaultValues = scriptResult.__script__.defaultValues || {}\n if (componentState) {\n for (const token of Object.keys(componentTokens)) {\n if (componentDefaultValues[token] === undefined && componentState[token] !== undefined) {\n componentDefaultValues[token] = componentState[token]\n }\n }\n }\n\n // Dynamically load any components dynamically inserted if they are explicitly mentioned\n const declarativeComponents = (module.customElements || []).map(el => el.name)\n const mergedComponents = Array.from(new Set([...declarativeComponents, ...extractedComponents]))\n\n if (scriptResult.__script__) {\n scriptResult.__script__.components = mergedComponents\n }\n\n // Register component script with script manager\n this._scriptManager.registerComponent({\n id: module.id,\n getters: scriptResult.__script__.getters,\n script: scriptResult.__script__,\n filePath: moduleComponent.path.pathname,\n templateAST,\n templateValues,\n defaultValues: componentDefaultValues,\n styles: stylesHTML,\n slots: scriptResult.__script__.slots || {}\n })\n\n if (mergedComponents.length > 0) {\n // Merge the evaluated script results into the state context for dependencies\n const inheritedState = Object.assign({}, state)\n delete inheritedState.__script__\n\n await this._processDependentComponents(mergedComponents, session, page, root, inheritedState)\n }\n\n // Ensure state object exists in scriptResult\n if (!scriptResult.__script__.state) {\n scriptResult.__script__.state = {}\n }\n\n\n // Store instance data for script manager\n if (!noHydration) {\n session.scripts.add(page.file.pathname, {\n id: contextId,\n componentId: module.id,\n page,\n state: scriptResult.__script__.state\n })\n }\n\n delete scriptResult.__script__\n }\n\n componentState = Object.assign(componentState, scriptResult)\n }\n\n session.state[contextId] = componentState\n\n // replace tokens in the component with their state from `componentState` object and store them into computed value array for later use if needed (e.g., to be injected back).\n for (let i = 0; i < module.values.attributes.length; i++) {\n const item = module.values.attributes[i]\n\n for (let j = 0; j < item.tokens.length; j++) {\n const token = item.tokens[j]\n let value = componentState[token.name]\n\n if (value == null) {\n // console.error('Token \"' + token.name +'\" was empty used on \"' + moduleComponent.id + '\"')\n value = ''\n }\n\n replaceToken({\n type: 'attribute',\n node: item.element,\n attribute: item.name,\n content: token.content,\n value\n })\n }\n }\n\n for (let i = 0; i < module.values.textNodes.length; i++) {\n const item = module.values.textNodes[i]\n\n for (let j = 0; j < item.tokens.length; j++) {\n const token = item.tokens[j]\n let value = componentState[token.name]\n\n if (value == null) {\n // console.error('Token \"' + token.name +'\" was empty used on \"' + moduleComponent.id + '\"')\n value = ''\n }\n\n replaceToken({\n type: 'textNode',\n node: item.textNode,\n content: token.content,\n value\n })\n }\n }\n\n // replace nested customElements\n const customElements = module.customElements\n let childIndex\n\n // Update slot elements for all custom elements\n for (let i = 0; i < customElements.length; i++) {\n const customElement = customElements[i]\n\n // update slot elements\n if (customElement.children\n && customElement.children.length\n && !customElement.slots.length\n ) {\n for (let j = 0; j < customElement.children.length; j++) {\n const node = customElement.children[j]\n const slotElement = {\n name: 'default',\n node\n }\n\n // @ts-ignore\n if (isCoraliteElement(node) && node.attribs.slot) {\n // add named slot\n // @ts-ignore\n slotElement.name = node.attribs.slot\n }\n\n customElement.slots.push(slotElement)\n }\n }\n }\n\n const createComponentTasks = []\n\n for (let i = 0; i < customElements.length; i++) {\n const customElement = customElements[i]\n\n // Skip if this element is a direct child of another custom element.\n // The parent will handle processing this element via slots.\n // @ts-ignore\n if (customElement.parent && customElement.parent.slots) {\n continue\n }\n\n const childContextId = session.generateId(customElement.name)\n const currentProperties = session.state[childContextId] || {}\n\n let childState = { ...state }\n\n // append custom attributes to state\n if (typeof customElement.attribs === 'object') {\n const attribValues = cleanKeys(customElement.attribs)\n\n childState = {\n ...childState,\n ...currentProperties,\n ...attribValues\n }\n } else {\n childState = {\n ...childState,\n ...currentProperties\n }\n }\n\n session.state[childContextId] = childState\n\n const childNoHydration = noHydration || (customElement.attribs && 'no-hydration' in customElement.attribs)\n\n createComponentTasks.push(\n this.createComponentElement({\n id: customElement.name,\n state: childState,\n element: customElement,\n page,\n root,\n contextId: childContextId,\n index,\n session,\n noHydration: childNoHydration\n }, false).then(childComponentElement => ({\n childComponentElement,\n customElement,\n childContextId,\n noHydration: childNoHydration\n }))\n )\n }\n\n const results = await Promise.all(createComponentTasks)\n\n for (let i = 0; i < results.length; i++) {\n const { childComponentElement, customElement, childContextId, noHydration: childNoHydration } = results[i]\n\n // replace custom element with component\n if (childComponentElement && typeof childComponentElement === 'object') {\n if (childNoHydration) {\n const parent = customElement.parent\n if (parent && parent.children) {\n const elementIndex = parent.children.indexOf(customElement)\n if (elementIndex !== -1) {\n for (let j = 0; j < childComponentElement.children.length; j++) {\n childComponentElement.children[j].parent = parent\n }\n parent.children.splice(elementIndex, 1, ...childComponentElement.children)\n }\n }\n } else {\n customElement.children = childComponentElement.children\n for (let j = 0; j < customElement.children.length; j++) {\n customElement.children[j].parent = customElement\n }\n\n if (!customElement.attribs) {\n customElement.attribs = {}\n }\n customElement.attribs['data-cid'] = childContextId\n\n session.componentTags.add(customElement.name)\n }\n }\n }\n\n await this._replaceSlots(id, element, module, componentState, page, root, index, session, noHydration)\n\n if (noHydration) {\n const stack = [...result.children]\n while (stack.length > 0) {\n const node = stack.pop()\n if (node.type === 'tag') {\n if (node.name === 'c-token') {\n const parent = node.parent\n if (parent && parent.children) {\n const index = parent.children.indexOf(node)\n if (index !== -1) {\n for (let j = 0; j < node.children.length; j++) {\n node.children[j].parent = parent\n }\n parent.children.splice(index, 1, ...node.children)\n }\n }\n } else {\n stack.push(...(node.children || []))\n }\n }\n }\n }\n\n const mappedAfterContext = await this._triggerPluginHook('onAfterComponentRender', {\n result,\n state: componentState,\n componentId: module.id,\n instanceId,\n refs: module.values.refs,\n textNodes: module.values.textNodes,\n attributes: module.values.attributes,\n page,\n element,\n session\n })\n return mappedAfterContext.result\n}\n\n\n/**\n * Replaces slot elements in a component with provided content\n * @internal\n * @param {string} id - Component ID\n * @param {CoraliteElement} element - The original Custom Element node\n * @param {CoraliteModule} module - The component module configuration\n * @param {Object} state - The component state\n * @param {CoralitePage} page - Active page object\n * @param {any} root - The component root element\n * @param {number} index - Index of element\n * @param {CoraliteSession} session - Rendering state\n * @param {boolean} noHydration - No hydration flag\n * @returns {Promise<void>} Resolves when slots are successfully replaced\n */\nCoralite.prototype._replaceSlots = async function (id, element, module, state, page, root, index, session, noHydration) {\n const slots = module.slotElements ? module.slotElements[id] : null\n\n if (!slots) {\n return\n }\n\n const slotChildren = {}\n const slotNames = Object.keys(slots)\n\n for (let i = 0; i < slotNames.length; i++) {\n const slotName = slotNames[i]\n slotChildren[slotName] = []\n }\n\n if (element && element.slots) {\n for (let i = 0; i < element.slots.length; i++) {\n const elementSlotContent = element.slots[i]\n const slotName = elementSlotContent.name\n const slot = slots[slotName]\n\n if (slot) {\n if (elementSlotContent.node.attribs) {\n delete elementSlotContent.node.attribs.slot\n }\n\n slotChildren[slotName].push(elementSlotContent.node)\n }\n }\n }\n\n for (let i = 0; i < slotNames.length; i++) {\n const slotName = slotNames[i]\n let slotNodes = slotChildren[slotName]\n const slot = slots[slotName]\n\n if (!slot.element || !slot.element.parent || !slot.element.parent.children) {\n continue\n }\n\n const slotIndex = slot.element.parent.children.indexOf(slot.element)\n\n const emptySlot = slotNodes.filter(node => {\n return node.type !== 'text' || (node.data && node.data.trim().length > 0)\n })\n\n if (!emptySlot.length) {\n slotNodes = slot.element.children || []\n } else {\n const startIndex = slotNodes.length - 1\n\n for (let i = startIndex; i > -1; i--) {\n const node = slotNodes[i]\n\n if (node.name) {\n const slotComponentItem = this.components.getItem(node.name)\n\n if (slotComponentItem) {\n const slotContextId = session.generateId(node.name)\n const currentProperties = session.state[slotContextId] || {}\n const attribValues = cleanKeys(node.attribs)\n\n if (typeof node.attribs === 'object') {\n session.state[slotContextId] = {\n ...currentProperties,\n ...state,\n ...attribValues\n }\n } else {\n session.state[slotContextId] = Object.assign(currentProperties, state)\n }\n\n const childNoHydration = noHydration || (node.attribs && 'no-hydration' in node.attribs)\n\n const componentElement = await this.createComponentElement({\n id: node.name,\n state: session.state[slotContextId],\n element: node,\n page,\n root,\n contextId: slotContextId,\n index,\n session,\n noHydration: childNoHydration\n }, false)\n\n if (componentElement) {\n if (childNoHydration) {\n const parent = node.parent\n if (parent && parent.children) {\n const elementIndex = parent.children.indexOf(node)\n if (elementIndex !== -1) {\n for (let j = 0; j < componentElement.children.length; j++) {\n componentElement.children[j].parent = parent\n }\n parent.children.splice(elementIndex, 1, ...componentElement.children)\n }\n }\n } else {\n node.children = componentElement.children\n for (let j = 0; j < node.children.length; j++) {\n node.children[j].parent = node\n }\n\n if (!node.attribs) {\n node.attribs = {}\n }\n node.attribs['data-cid'] = slotContextId\n\n session.componentTags.add(node.name)\n }\n }\n }\n }\n }\n }\n\n slot.element.children = slotNodes\n\n for (let j = 0; j < slotNodes.length; j++) {\n if (slotNodes[j]) {\n slotNodes[j].parent = slot.element\n }\n }\n }\n}\n\n\n/**\n * Generates a custom module linker callback for the Node.js VM context.\n * This linker is responsible for resolving `import` statements inside evaluated\n * component scripts. It intercepts specific specifiers to provide synthetic modules\n * for `coralite` and plugins, correctly resolves relative paths against\n * the component's directory, and safely bridges external Node.js modules into the VM sandbox.\n *\n * @internal\n * @param {CoraliteFilePath} path - The file path metadata of the component currently being evaluated. Used as the base for relative imports.\n * @param {CoralitePluginContext} context - Contextual rendering data and state to be exposed when a script imports `'coralite'`.\n * @returns {(specifier: string, referencingModule: import('node:vm').Module, extra: { attributes: any }) => Promise<import('node:vm').Module>} The async linker function used by the VM module.\n */\nCoralite.prototype._moduleLinker = function (path, context) {\n const source = this._source\n const componentDirURL = pathToFileURL(resolve(path.dirname)).href\n\n /**\n * The linker callback invoked by the Node.js VM when an `import` is encountered.\n *\n * @param {string} specifier - The string path of the requested module (e.g., `'./utils.js'`, `'coralite'`).\n * @param {import('node:vm').Module} referencingModule - The VM Module instance that initiated the import request.\n * @param {{ attributes: Record<string, string> }} extra - Additional import constraints, such as import attributes (e.g., `with { type: 'json' }`).\n * @returns {Promise<import('node:vm').Module>} A promise that resolves to a newly instantiated VM SourceTextModule containing the requested exports.\n */\n return async (specifier, referencingModule, extra) => {\n const { SourceTextModule } = await import('node:vm')\n const originalSpecifier = specifier\n\n if (source.plugins[specifier]) {\n const plugin = source.plugins[specifier]\n let pluginExports = ''\n\n for (const key in plugin) {\n if (Object.prototype.hasOwnProperty.call(plugin, key)) {\n pluginExports += `export const ${key} = globalThis.__coralite_plugins__[\"${specifier}\"][\"${key}\"];\\n`\n }\n }\n\n return new SourceTextModule(pluginExports, {\n context: referencingModule.context\n })\n } else if (specifier == 'coralite/utils') {\n const utils = source.utils\n let utilsExports = ''\n\n utilsExports = 'const utils = globalThis.__coralite_utils__; export default utils;'\n\n for (const key in utils) {\n if (Object.prototype.hasOwnProperty.call(utils, key)) {\n utilsExports += `export const ${key} = utils[\"${key}\"];\\n`\n }\n }\n\n return new SourceTextModule(utilsExports, {\n context: referencingModule.context\n })\n } else if (specifier === 'coralite') {\n let coraliteExports = 'const context = globalThis.__coralite_context__; export default context;'\n\n for (const key in context) {\n if (Object.prototype.hasOwnProperty.call(context, key)) {\n coraliteExports += `export const ${key} = context[\"${key}\"];\\n`\n }\n }\n\n coraliteExports += 'export const defineComponent = globalThis.__coralite_define_component__;\\n'\n\n return new SourceTextModule(coraliteExports, {\n context: referencingModule.context\n })\n } else if (specifier.startsWith('.')) {\n // handle relative path\n specifier = pathToFileURL(resolve(path.dirname, specifier)).href\n } else {\n // handle modules\n specifier = import.meta.resolve(specifier, componentDirURL)\n }\n\n try {\n let module\n if (extra.attributes && Object.keys(extra.attributes).length > 0) {\n module = await import(specifier, { with: extra.attributes })\n } else {\n module = await import(specifier)\n }\n let exportModule = ''\n\n for (const key in module) {\n if (Object.prototype.hasOwnProperty.call(module, key)) {\n const name = 'globalThis[\"' + originalSpecifier + '\"].'\n\n if (key === 'default') {\n exportModule += 'export default ' + name + key + ';\\n'\n } else {\n exportModule += 'export const ' + key + ' = ' + name + key + ';\\n'\n }\n }\n\n referencingModule.context[originalSpecifier] = module\n }\n\n const { SourceTextModule } = await import('node:vm')\n\n return new SourceTextModule(exportModule, {\n context: referencingModule.context\n })\n } catch (error) {\n throw new Error(error)\n }\n }\n}\n\n/**\n * Parses a Coralite module script and evaluates it using SourceTextModule.\n *\n * @param {Object} data\n * @param {CoraliteModule} data.module - The Coralite module to parse\n * @param {CoraliteModuleDefinitions} data.state - Replacement tokens for the component\n * @param {CoralitePage} data.page - The global page object\n * @param {any} data.root - The Coralite module to parse\n * @param {string} data.contextId - Context Id\n * @param {CoraliteSession} data.session - Render Context\n * @param {boolean} data.noHydration - No hydration flag\n *\n * @returns {Promise<CoraliteModuleDefinitions>}\n */\nCoralite.prototype._evaluateDevelopment = async function ({\n module,\n state,\n page,\n root,\n contextId,\n session,\n noHydration\n}) {\n const { SourceTextModule } = await import('node:vm')\n\n if (!SourceTextModule) {\n throw new Error('SourceTextModule is not available. Please run Node.js with --experimental-vm-modules to use Development mode.')\n }\n\n const context = {\n state: state || {},\n page,\n root,\n module,\n id: contextId,\n session,\n app: this,\n noHydration\n }\n\n const cachedBoundPlugins = this._bindPlugins(this._source.plugins, context)\n\n session.source.currentSourceContextId = contextId\n session.source.contextInstances[contextId] = context\n\n const boundDefineComponent = (options) => this._defineComponent(options, context)\n\n // Protect fundamental constructors from being extracted and polluting the context realm\n const standardBuiltIns = new Set(['Object', 'Function', 'Array', 'String', 'Boolean', 'Number', 'Math', 'Date', 'RegExp', 'Error', 'EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'JSON', 'Promise', 'Proxy', 'Reflect', 'Map', 'Set', 'WeakMap', 'WeakSet', 'ArrayBuffer', 'SharedArrayBuffer', 'DataView', 'Atomics', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'BigInt', 'BigInt64Array', 'BigUint64Array', 'Symbol', 'Infinity', 'NaN', 'undefined', 'globalThis', 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'unescape'])\n const usedGlobals = extractGlobals(module.script)\n const contextGlobals = {\n __coralite_context__: context,\n __coralite_plugins__: cachedBoundPlugins,\n __coralite_utils__: this._source.utils,\n __coralite_define_component__: boundDefineComponent\n }\n\n for (const glob of usedGlobals) {\n if (!standardBuiltIns.has(glob) && glob in globalThis && globalThis[glob] !== undefined && !(glob in contextGlobals)) {\n contextGlobals[glob] = globalThis[glob]\n }\n }\n\n // Create a fresh context for the module\n const contextifiedObject = createContext(contextGlobals)\n\n const moduleComponent = this.components.getItem(module.id)\n\n // create a new source text module with the provided script content, configuration options, and context\n const script = new SourceTextModule(module.script, {\n initializeImportMeta (meta) {\n meta.url = pathToFileURL(resolve(moduleComponent.path.pathname)).href\n },\n lineOffset: module.lineOffset,\n identifier: resolve(moduleComponent.path.pathname),\n context: contextifiedObject\n })\n\n const linker = this._moduleLinker(moduleComponent.path, context)\n\n await script.link(linker)\n\n // evaluate the module to execute its content\n try {\n await script.evaluate()\n } catch (error) {\n throw this._createExecutionError(error, module, moduleComponent, page, contextId)\n }\n\n // @ts-ignore\n if (script.namespace.default != null) {\n // @ts-ignore\n return await script.namespace.default\n }\n\n // throw an error if no default export was found\n throw new Error(`Module \"${module.id}\" has no default export`)\n}\n\n/**\n * Parses a Coralite module script and compiles it into JavaScript using esbuild.\n * Replaces node:vm SourceTextModule for better performance and memory management.\n *\n * @param {Object} data\n * @param {CoraliteModule} data.module - The Coralite module to parse\n * @param {CoraliteModuleDefinitions} data.state - Replacement tokens for the component\n * @param {CoralitePage} data.page - The global page object\n * @param {any} data.root - The Coralite module to parse\n * @param {string} data.contextId - Context Id\n * @param {CoraliteSession} data.session - Render Context\n * @param {boolean} data.noHydration - No hydration flag\n *\n * @returns {Promise<CoraliteModuleDefinitions>}\n */\nCoralite.prototype._evaluateProduction = async function ({\n module,\n state,\n page,\n root,\n contextId,\n session,\n noHydration\n}) {\n const context = {\n state: state || {},\n page,\n root,\n module,\n id: contextId,\n session,\n app: this,\n noHydration\n }\n\n session.source.currentSourceContextId = contextId\n session.source.contextInstances[contextId] = context\n\n // Retrieve Template and check cache\n const moduleComponent = this.components.getItem(module.id)\n\n if (!moduleComponent.result._compiledCode) {\n const paddingCount = Math.max(0, (module.lineOffset - 1 || 0))\n const padding = '\\n'.repeat(paddingCount)\n\n // Transform using esbuild\n const { code } = await transform(padding + module.script, {\n loader: 'js',\n format: 'cjs',\n target: 'node18',\n platform: 'node'\n })\n\n moduleComponent.result._compiledCode = `(async() => {${code}})();`\n }\n\n // Create a require function anchored to the moduleComponent's file path to resolve relative imports\n const fileRequire = createRequire(resolve(moduleComponent.path.pathname))\n\n let cachedBoundPlugins = null\n\n const customRequire = (id) => {\n const isCoralite = id === 'coralite'\n const isUtils = id === 'coralite/utils'\n const isPlugin = this._source.plugins[id] !== undefined\n\n // Handle internal coralite imports\n if (isCoralite || isUtils || isPlugin) {\n // Lazily bind plugins once per evaluation\n if (!cachedBoundPlugins) {\n cachedBoundPlugins = this._bindPlugins(this._source.plugins, context)\n }\n\n if (isCoralite) {\n return {\n ...context,\n defineComponent: (options) => this._defineComponent(options, context),\n default: {\n ...context,\n defineComponent: (options) => this._defineComponent(options, context)\n }\n }\n }\n\n if (isPlugin) {\n return {\n ...(cachedBoundPlugins[id] || {}),\n default: cachedBoundPlugins[id]\n }\n }\n\n if (isUtils) {\n return {\n ...this._source.utils,\n default: this._source.utils\n }\n }\n }\n\n return fileRequire(id)\n }\n\n // Mock the CommonJS 'module' object to capture exports\n const moduleMock = { exports: {} }\n\n // Create the function. We pass 'coralite' explicitly to support the\n // \"export const document = coralite.document\" pattern found in existing modules.\n // Arguments: module, exports, require, coralite\n if (!moduleComponent.result._compiledFunction) {\n moduleComponent.result._compiledFunction = new Function(\n 'module',\n 'exports',\n 'require',\n 'coralite',\n moduleComponent.result._compiledCode.trim()\n )\n }\n\n const fn = moduleComponent.result._compiledFunction\n\n // Execute the function with our mocks and context\n try {\n await fn(moduleMock, moduleMock.exports, customRequire, context)\n } catch (error) {\n throw this._createExecutionError(error, module, moduleComponent, page, contextId)\n }\n\n if (moduleMock.exports.default != null) {\n return moduleMock.exports.default\n }\n\n throw new Error(`Module \"${module.id}\" has no default export`)\n}\n\n/**\n * Parses a Coralite module script and compiles it into JavaScript using esbuild.\n * Replaces node:vm SourceTextModule for better performance and memory management.\n *\n * @param {Object} data -\n * @param {CoraliteModule} data.module - The Coralite module to parse\n * @param {CoraliteModuleDefinitions} data.state - Replacement tokens for the component\n * @param {CoralitePage} data.page - The global page object\n * @param {any} data.element - The Coralite module to parse\n * @param {string} data.contextId - Context Id\n * @param {CoraliteSession} data.session - Render Context\n *\n * @returns {Promise<CoraliteModuleDefinitions>}\n */\nCoralite.prototype._evaluate = async function (options) {\n if (this.options.mode === 'development') {\n return this._evaluateDevelopment(options)\n }\n return this._evaluateProduction(options)\n}\n\n/**\n * Executes a collecting plugin hook where the results are aggregated.\n * Useful for hooks like `onAfterPageRender` that return new pages to be added to the build.\n *\n * @internal\n * @param {string} name - The name of the hook to trigger.\n * @param {any} contextData - Context to pass to the callbacks (not mutated by this function).\n * @returns {Promise<any[]>} A flattened array of all results returned by the plugins.\n */\nCoralite.prototype._triggerPluginAggregateHook = async function (name, contextData) {\n const pluginHooks = this._plugins.hooks[name]\n const aggregatedResults = []\n\n if (!pluginHooks || pluginHooks.length === 0) {\n return aggregatedResults\n }\n\n for (let i = 0; i < pluginHooks.length; i++) {\n let result = pluginHooks[i](contextData)\n\n if (result !== null && typeof result === 'object' && typeof result.then === 'function') {\n result = await result\n }\n\n // Collect the results into a flat array instead of merging them into the context\n if (result !== undefined && result !== null) {\n if (Array.isArray(result)) {\n aggregatedResults.push(...result)\n } else {\n aggregatedResults.push(result)\n }\n }\n }\n\n return aggregatedResults\n}\n\n/**\n * @internal Executes Phase 1 of plugin exports with the given context.\n *\n * @param {Object} plugins - The plugins object\n * @param {Object} context - The context object to pass to Phase 1\n * @returns {Object} The Phase 2 functions\n */\nCoralite.prototype._bindPlugins = function (plugins, context) {\n const cachedBoundPlugins = {}\n\n for (const key in plugins) {\n const pluginExports = plugins[key]\n if (pluginExports !== null && typeof pluginExports === 'object') {\n const pluginObj = {}\n for (const prop in pluginExports) {\n if (typeof pluginExports[prop] === 'function') {\n pluginObj[prop] = pluginExports[prop](context)\n } else {\n pluginObj[prop] = pluginExports[prop]\n }\n }\n cachedBoundPlugins[key] = pluginObj\n } else {\n cachedBoundPlugins[key] = pluginExports\n }\n }\n\n return cachedBoundPlugins\n}\n\n/**\n * @template T\n *\n * Executes all plugin callbacks registered under the specified hook name sequentially.\n *\n * @internal\n *\n * @param {'onPageSet'|'onPageUpdate'|'onPageDelete'|'onComponentSet'|'onComponentUpdate'|'onComponentDelete'|'onBeforePageRender'|'onAfterPageRender'|'onBeforeComponentRender'|'onAfterComponentRender'|'onBeforeBuild'|'onAfterBuild'} name - The name of the hook to trigger.\n * @param {T} initialData - Data to pass to each callback function.\n * @returns {Promise<T>} A promise that resolves to the merged data.\n */\nCoralite.prototype._triggerPluginHook = async function (name, initialData) {\n const pluginHooks = this._plugins.hooks[name]\n\n if (!pluginHooks || pluginHooks.length === 0) {\n return initialData\n }\n\n // Clone initial data once to prevent accidental root-level mutations\n // leaking backwards if a plugin still mutates it directly.\n let currentData = typeof initialData === 'object' && initialData !== null\n ? {\n ...initialData,\n app: this\n }\n : initialData\n\n for (let i = 0; i < pluginHooks.length; i++) {\n let result = pluginHooks[i](currentData)\n\n if (result !== null && typeof result === 'object' && typeof result.then === 'function') {\n result = await result\n }\n\n // If the plugin returned a patch, the framework handles the mapping\n if (result !== undefined && result !== null) {\n currentData = mergePluginState(currentData, result)\n }\n }\n\n return currentData\n}\n\n/**\n * Registers a callback function under the specified hook name.\n *\n * @internal\n *\n * @param {'onPageSet'|'onPageUpdate'|'onPageDelete'|'onComponentSet'|'onComponentUpdate'|'onComponentDelete'|'onBeforePageRender'|'onAfterPageRender'|'onBeforeComponentRender'|'onAfterComponentRender'|'onBeforeBuild'|'onAfterBuild'} name - The name of the hook to register the callback with.\n * @param {Function} callback - The callback function to be executed when the hook is triggered.\n */\nCoralite.prototype._addPluginHook = function (name, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`Plugin hook \"${name}\" must be a function`)\n }\n\n if (this._plugins.hooks[name]) {\n this._plugins.hooks[name].push(callback)\n }\n}\n\n/**\n * Replaces a custom element with its template content.\n * @internal\n * @param {CoraliteElement} coraliteElement - The custom element to be replaced.\n * @param {CoraliteElement} element - The target element to replace the tokens with.\n */\nCoralite.prototype._replaceCustomElementWithTemplate = function (coraliteElement, element) {\n coraliteElement.children = element.children\n for (let j = 0; j < coraliteElement.children.length; j++) {\n coraliteElement.children[j].parent = coraliteElement\n }\n}\n\n/**\n * Process a token value - parse HTML strings and handle custom elements\n * @internal\n * @param {any} value - The value to process\n * @param {Object} context - Processing context\n * @param {Attribute[]} [context.excludeByAttribute] - List of attribute name-value pairs to ignore\n * @param {Object} [context.state] - Replacement tokens for the component\n * @param {CoraliteModule} [context.module] - The component module\n * @param {Function} [context.createComponentElement] - The createComponentElement function\n * @param {CoraliteSession} [context.session] - The current build session\n * @param {boolean} [context.noHydration] - No hydration flag\n * @returns {Promise<any>} - Processed value\n */\nCoralite.prototype._processTokenValue = async function (value, context) {\n const { excludeByAttribute, state, module, createComponentElement, session, noHydration } = context\n // If not a string, return as-is\n if (typeof value !== 'string') {\n return value\n }\n\n // Parse HTML string\n const result = parseHTML(value, excludeByAttribute)\n\n // If no children, return undefined (for empty HTML)\n if (!result.root.children.length) {\n return undefined\n }\n\n // Process custom elements\n for (let i = 0; i < result.customElements.length; i++) {\n const customElement = result.customElements[i]\n const cid = `${module.path.pathname}${customElement.name}-${i}`\n const childNoHydration = noHydration || (customElement.attribs && 'no-hydration' in customElement.attribs)\n\n const componentElement = await createComponentElement({\n contextId: cid,\n id: customElement.name,\n state,\n element: customElement,\n module,\n index: i,\n session,\n noHydration: childNoHydration\n })\n\n if (componentElement) {\n if (childNoHydration) {\n const parent = customElement.parent\n if (parent && parent.children) {\n const elementIndex = parent.children.indexOf(customElement)\n if (elementIndex !== -1) {\n for (let j = 0; j < componentElement.children.length; j++) {\n componentElement.children[j].parent = parent\n }\n parent.children.splice(elementIndex, 1, ...componentElement.children)\n }\n }\n } else {\n customElement.children = componentElement.children\n for (let j = 0; j < customElement.children.length; j++) {\n customElement.children[j].parent = customElement\n }\n\n if (!customElement.attribs) {\n customElement.attribs = {}\n }\n customElement.attribs['data-cid'] = cid\n\n session.componentTags.add(customElement.name)\n }\n }\n }\n\n // For static strings, optimize single text nodes\n if (result.root.children.length === 1 && result.root.children[0].type === 'text') {\n return result.root.children[0].data\n }\n\n return result.root.children\n}\n\n/**\n * This function defines a component for the Coralite framework.\n * It is used to register components with their associated state and scripts.\n * @internal\n * @param {Object} options - Configuration options for the component\n * @param {CoralitePluginContext} context - The evaluation context\n * @returns {Promise<Object>} A promise resolving to the module state associated with this component.\n */\nCoralite.prototype._defineComponent = async function (options, context) {\n const {\n attributes,\n data,\n getters,\n slots,\n script\n } = options\n\n const {\n state: initialState,\n module,\n root\n } = context\n\n // Validate attributes\n if (attributes) {\n for (const [key, value] of Object.entries(attributes)) {\n if (value.type === Object || value.type === Array) {\n throw new Error(`Coralite Error: Component \"${module.id}\" defines attribute \"${key}\" as ${value.type.name}. Object and Array types are blocked in attributes for V1.1 to prevent \"JSON-in-HTML\" anti-patterns. Use the data() block for complex data.`)\n }\n }\n }\n\n let state = Object.assign({}, initialState)\n\n const serializableAttributes = {}\n if (attributes) {\n for (const [key, schema] of Object.entries(attributes)) {\n serializableAttributes[key] = {\n type: schema.type.name || schema.type,\n default: schema.default\n }\n }\n }\n\n state.__script__ = {\n attributes: serializableAttributes,\n getters: getters || {},\n state: {},\n defaultValues: {},\n slots: slots || {}\n }\n\n if (attributes) {\n for (const [key, schema] of Object.entries(attributes)) {\n const typeName = schema.type.name || schema.type\n if (state[key] !== undefined) {\n // Coerce existing attribute values\n const value = state[key]\n if (typeName === 'Number') {\n state[key] = Number(value)\n } else if (typeName === 'Boolean') {\n state[key] = value !== 'false' && value !== null && value !== ''\n } else if (typeName === 'String') {\n state[key] = String(value)\n }\n } else if (schema.default !== undefined) {\n state[key] = schema.default\n }\n }\n }\n\n if (typeof data === 'function') {\n const dataResult = await data(context)\n if (dataResult) {\n state.__script__.data = dataResult\n Object.assign(state, dataResult)\n // Ensure data results are added to state.__script__.state for serialization to client\n Object.assign(state.__script__.state, dataResult)\n }\n }\n\n if (getters) {\n const roState = createReadOnlyProxy(state)\n for (const [key, getter] of Object.entries(getters)) {\n // Ensure getters use read-only proxy to preemptively throw error if developer attempts to mutate the state.\n const result = getter(roState, { signal: new AbortController().signal })\n\n if (result && typeof result.then === 'function') {\n state[key] = await result\n } else {\n state[key] = result\n }\n\n // Add getter result to state.__script__.state so it's serialized to the client\n if (state.__script__ && state.__script__.state) {\n state.__script__.state[key] = state[key]\n }\n }\n }\n\n // process computed slots\n if (slots) {\n for (const name in slots) {\n if (Object.prototype.hasOwnProperty.call(slots, name)) {\n const computedSlot = slots[name]\n\n const methodKey = `slots_method_${name}`\n state.__script__.defaultValues[methodKey] = computedSlot\n\n // slot content to compute\n const slotContent = []\n // new slot elements\n const elementSlots = []\n\n // @ts-ignore\n if (root && root.slots) {\n // @ts-ignore\n for (let j = 0; j < root.slots.length; j++) {\n // @ts-ignore\n const slot = root.slots[j]\n\n if (slot.name === name) {\n // slot content to compute\n slotContent.push(slot.node)\n } else {\n elementSlots.push(slot)\n }\n }\n }\n\n // compute slot nodes\n const result = computedSlot(slotContent, state) || slotContent\n\n // append new slot nodes\n if (typeof result === 'string') {\n // process string result through unified processor\n const processedResult = await this._processTokenValue(result, {\n ...context,\n state,\n createComponentElement: context.app.createComponentElement,\n noHydration: context.noHydration\n })\n\n if (Array.isArray(processedResult)) {\n // multiple nodes from parsed HTML\n for (let j = 0; j < processedResult.length; j++) {\n elementSlots.push({\n name,\n node: processedResult[j]\n })\n }\n } else {\n // single text node\n elementSlots.push({\n name,\n node: {\n type: 'text',\n data: processedResult\n }\n })\n }\n } else if (Array.isArray(result)) {\n for (let index = 0; index < result.length; index++) {\n const node = result[index]\n\n if (\n isCoraliteElement(node)\n || isCoraliteTextNode(node)\n || isCoraliteComment(node)\n ) {\n elementSlots.push({\n name,\n node\n })\n } else {\n throw new Error('Unexpected slot value, expected a node but found: '\n + '\\n result: ' + JSON.stringify(node)\n + '\\n path: \"' + module.path.pathname + '\"')\n }\n }\n }\n\n // update element slots\n if (root) {\n // @ts-ignore\n root.slots = elementSlots\n }\n }\n }\n }\n const hasScript = typeof script === 'function'\n const hasSlots = slots && Object.keys(slots).length > 0\n const hasGetters = getters && Object.keys(getters).length > 0\n const hasAttributes = attributes && Object.keys(attributes).length > 0\n const hasData = typeof data === 'function'\n\n if (hasScript || hasSlots || hasGetters || hasAttributes || hasData) {\n if (hasScript) {\n const scriptTextContent = script.toString().trim()\n\n // include state used in script\n const args = {}\n for (const key in state) {\n if (!Object.hasOwn(state, key)) {\n continue\n }\n\n if (scriptTextContent.includes(key) || key.startsWith('ref_')) {\n args[key] = state.__script__.defaultValues[key] !== undefined\n ? state.__script__.defaultValues[key]\n : state[key]\n }\n }\n\n Object.assign(state.__script__.state, args)\n }\n } else {\n // remove custom element parent script\n delete state.__script__\n }\n\n return state\n}\n\nconst coraliteInternalProperty = {\n enumerable: false,\n configurable: false,\n writable: false\n}\n\nObject.defineProperty(Coralite.prototype, '_defaultOnError', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_handleError', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_createExecutionError', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_createSession', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_processCustomElementsInPage', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_generatePages', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_processDependentComponents', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_replaceSlots', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_moduleLinker', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_evaluateDevelopment', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_evaluateProduction', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_evaluate', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_triggerPluginAggregateHook', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_triggerPluginHook', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_bindPlugins', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_addPluginHook', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_replaceCustomElementWithTemplate', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_processTokenValue', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_defineComponent', coraliteInternalProperty)\n\nexport default Coralite\n", "/**\n *\n */\nexport class CoraliteError extends Error {\n /**\n *\n */\n constructor (message, options = {}) {\n super(message, options)\n this.name = 'CoraliteError'\n this.isCoraliteError = true\n this.componentId = options.componentId\n this.filePath = options.filePath\n this.instanceId = options.instanceId\n this.pagePath = options.pagePath\n\n // Polyfill cause if necessary (node version differences)\n if (options.cause && !this.cause) {\n this.cause = options.cause\n }\n }\n}\n", "/**\n * @import {CoraliteConfig} from '../types/index.js'\n */\n\n/**\n * Validates and defines a Coralite configuration object\n * @param {CoraliteConfig} options - The configuration options to validate and define\n * @returns {CoraliteConfig} The validated configuration object\n * @throws {Error} If the configuration is invalid\n */\nexport function defineConfig (options) {\n // Validate that options is an object\n if (!options || typeof options !== 'object') {\n throw new Error('Config must be an object')\n }\n\n // Validate required string state\n const requiredProps = ['output', 'components', 'pages']\n\n for (const prop of requiredProps) {\n // Check if property exists\n if (!(prop in options)) {\n throw new Error(`Missing required config property: \"${prop}\"`)\n }\n\n // Check if property is a string\n if (typeof options[prop] !== 'string') {\n throw new Error(\n `Config property \"${prop}\" must be a string, received ${typeof options[prop]}`\n )\n }\n\n // Check if property is not empty\n if (options[prop].trim() === '') {\n throw new Error(`Config property \"${prop}\" cannot be empty`)\n }\n }\n\n // Validate optional plugins property\n if ('plugins' in options && options.plugins !== undefined) {\n if (!Array.isArray(options.plugins)) {\n throw new Error(\n `Config property \"plugins\" must be an array, received ${typeof options.plugins}`\n )\n }\n\n // Validate each plugin in the array\n options.plugins.forEach((plugin, index) => {\n if (typeof plugin !== 'object' || plugin === null) {\n throw new Error(\n `Plugin at index ${index} must be an object, received ${typeof plugin}`\n )\n }\n\n if (typeof plugin.name !== 'string' || plugin.name.trim() === '') {\n throw new Error(\n `Plugin at index ${index} must have a valid \"name\" property (non-empty string)`\n )\n }\n })\n }\n\n return options\n}\n", "import Coralite from './coralite.js'\n\nexport * from './html.js'\nexport * from './parse.js'\nexport * from './utils.js'\nexport * from './plugin.js'\nexport * from './config.js'\nexport * from './type-helper.js'\nexport * from './errors.js'\nexport * from './script-manager.js'\n\nexport { Coralite }\nexport default Coralite\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { parse as parseJS } from 'acorn'\nimport { simple as walkJS } from 'acorn-walk'\nimport render from 'dom-serializer'\nimport { sanitize } from 'isomorphic-dompurify'\nimport { parseHTML } from './parse.js'\nimport { isCoraliteNode } from './type-helper.js'\nimport { createCoraliteTextNode } from './dom.js'\nimport { BOOLEAN_ATTRIBUTES } from './tags.js'\n\n/**\n * @import {\n * CoraliteElement,\n * CoraliteModule,\n * CoraliteModuleSlotElement,\n * CoraliteModuleDefinition,\n * CoraliteTextNode,\n * CoraliteComponent,\n * CoraliteComponentResult,\n * CoraliteContentNode,\n * CoraliteAnyNode,\n * CoraliteDirective,\n * ScriptImport,\n * ScriptContent\n * } from '../types/index.js'\n */\n\nconst KEBAB_REGEX = /[-|:]([a-z])/g\n\n/**\n * Converts a kebab-case string to camelCase\n * @param {string} str - The kebab-case string to convert\n * @returns {string} - The camelCase version of the string\n */\nexport function kebabToCamel (str) {\n // replace each dash followed by a letter with the uppercase version of the letter\n return str.replace(KEBAB_REGEX, function (match, letter) {\n return letter.toUpperCase()\n })\n}\n\n/**\n * Converts all keys in an object from kebab-case to camelCase\n * @template T\n * @param {Record<string, T>} object - The object with kebab-case keys\n * @returns {Record<string, T>} - A new object with camelCase keys\n */\nexport function cleanKeys (object) {\n /** @type {Record<string, T>} */\n const result = {}\n\n for (const [key, value] of Object.entries(object)) {\n result[key] = value\n\n const camelKey = kebabToCamel(key)\n if (camelKey !== key) {\n result[camelKey] = value\n }\n }\n\n return result\n}\n\n/**\n * Recursively clones an object or array and normalizes any function state\n * it finds into a string representation that preserves standard function syntax,\n * bypassing ES6 shorthand method serialization issues.\n * @param {any} target - The object or array to normalize.\n * @param {Function} [transform] - Optional transform function for each node.\n * @param {WeakMap} [seen=new WeakMap()] - Map of seen objects to handle circular references.\n * @returns {any} A deeply cloned object with normalized functions.\n */\nexport function normalizeObjectFunctions (target, transform = null, seen = new WeakMap()) {\n if (typeof transform === 'function') {\n const transformed = transform(target)\n if (transformed !== target) {\n return transformed\n }\n }\n\n if (typeof target !== 'object' || target === null) {\n return target\n }\n\n if (seen.has(target)) {\n return seen.get(target)\n }\n\n if (Array.isArray(target)) {\n const arr = []\n seen.set(target, arr)\n for (let i = 0; i < target.length; i++) {\n arr.push(normalizeObjectFunctions(target[i], transform, seen))\n }\n return arr\n }\n\n const obj = {}\n seen.set(target, obj)\n for (const key in target) {\n if (Object.hasOwn(target, key)) {\n if (typeof target[key] === 'function') {\n const normalizedString = normalizeFunction(target[key])\n const originalFunction = target[key]\n\n const wrapper = function () {\n return originalFunction.apply(this, arguments)\n }\n wrapper.toString = () => normalizedString\n obj[key] = wrapper\n } else {\n obj[key] = normalizeObjectFunctions(target[key], transform, seen)\n }\n }\n }\n\n return obj\n}\n\n/**\n * Checks whether the given object is an object and has at least one own key.\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object is truthy and has keys, otherwise false.\n */\nexport function hasObjectKeys (obj) {\n return obj && typeof obj === 'object' && Object.keys(obj).length > 0\n}\n\n/**\n * Merges two arrays, returning a new array with unique items.\n * Uses JSON.stringify for deep comparison of object elements, preserving object uniqueness correctly.\n * @param {Array<any>} [arr1] - The first array.\n * @param {Array<any>} [arr2] - The second array.\n * @returns {Array<any>} A new array with unique values from both input arrays.\n */\nexport function mergeUniqueObjects (arr1, arr2) {\n const all = [...(arr1 || []), ...(arr2 || [])]\n const seen = new Set()\n return all.filter(item => {\n const key = typeof item === 'object' ? JSON.stringify(item) : item\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n\n/**\n * Normalizes function declarations to ensure consistent formatting.\n * Converts shorthand method syntax to full function declarations where needed,\n * while preserving arrow functions and existing full declarations.\n *\n * @param {Function} func - The function to normalize\n * @returns {string} The normalized function string representation\n */\nexport function normalizeFunction (func) {\n const original = func.toString().trim()\n\n const firstBrace = original.indexOf('{')\n const firstArrow = original.indexOf('=>')\n\n const isArrow = firstArrow !== -1 && (firstBrace === -1 || firstArrow < firstBrace)\n\n if (isArrow) {\n return original\n }\n\n // For non-arrows, extract header to check for shorthand\n const header = firstBrace !== -1 ? original.slice(0, firstBrace).trim() : original\n\n const isStandard = header.startsWith('function') || header.startsWith('async function')\n\n if (isStandard) {\n return original\n }\n\n // Handle Method Shorthand\n if (header.startsWith('async ')) {\n if (header.startsWith('async get ') || header.startsWith('async set ')) {\n return original\n }\n\n return original.replace(/^async\\s+([$\\w]+)\\s*\\(/, 'async function(')\n } else {\n if (header.startsWith('get ') || header.startsWith('set ')) {\n return original\n }\n\n return original.replace(/^([$\\w]+)\\s*\\(/, 'function(')\n }\n}\n\n\n/**\n * Recursively clones an AST node and its children, ensuring that\n * inner references (like parents and slots) point to the newly cloned nodes.\n *\n * @param {Map<Object, Object>} nodeMap - A map tracking original nodes to their newly cloned counterparts.\n * @param {Object} node - The current AST node being cloned.\n * @param {Object} [parent] - The parent node reference to assign to the clone.\n * @returns {Object} The newly cloned node.\n */\nexport function cloneNode (nodeMap, node, parent) {\n const newNode = { ...node }\n\n if (parent) {\n newNode.parent = parent\n }\n\n if (newNode.attribs) {\n newNode.attribs = { ...newNode.attribs }\n }\n\n if (newNode.slots) {\n newNode.slots = [...newNode.slots]\n }\n\n // Register in map\n nodeMap.set(node, newNode)\n\n // Recursively clone children\n if (newNode.children) {\n newNode.children = new Array(node.children.length)\n\n for (let i = 0; i < node.children.length; i++) {\n // @ts-ignore\n newNode.children[i] = cloneNode(nodeMap, node.children[i], newNode)\n }\n }\n\n // Update slot references to point to new cloned nodes\n if (newNode.slots) {\n for (let i = 0; i < newNode.slots.length; i++) {\n const slot = newNode.slots[i]\n if (slot.node) {\n const clonedNode = nodeMap.get(slot.node)\n if (clonedNode) {\n slot.node = clonedNode\n }\n }\n }\n }\n\n return newNode\n}\n\n/**\n * Creates a shallow copy of a CoraliteModule with a deep clone of its DOM tree (template) and re-linked internal references to enable safe independent mutation.\n *\n * Top-level non-DOM state (id, path, script, isTemplate, lineOffset) are shallow copied. Nested objects within these state (e.g., path) remain shared references. Only DOM-related structures undergo deep cloning and reference re-linking to isolate mutations from the original module.\n *\n * @param {CoraliteModule} originalModule - Module to clone.\n * @returns {CoraliteModule}\n */\nexport function cloneModuleInstance (originalModule) {\n const nodeMap = new Map()\n\n // Clone the main template tree\n const newTemplate = cloneNode(nodeMap, originalModule.template, null)\n\n // Reconstruct the 'values' object\n const newValues = {\n attributes: originalModule.values.attributes.map(item => ({\n ...item,\n element: nodeMap.get(item.element)\n })),\n textNodes: originalModule.values.textNodes.map(item => ({\n ...item,\n textNode: nodeMap.get(item.textNode)\n })),\n refs: originalModule.values.refs.map(item => ({\n ...item,\n element: nodeMap.get(item.element)\n }))\n }\n\n // Reconstruct customElements list\n const newCustomElements = originalModule.customElements.map(el => nodeMap.get(el))\n\n // Reconstruct slotElements\n const newSlotElements = {}\n if (originalModule.slotElements) {\n for (const modId in originalModule.slotElements) {\n newSlotElements[modId] = {}\n const slotGroup = originalModule.slotElements[modId]\n\n for (const slotName in slotGroup) {\n const slotItem = slotGroup[slotName]\n newSlotElements[modId][slotName] = {\n ...slotItem,\n element: nodeMap.get(slotItem.element)\n }\n }\n }\n }\n\n // Return the new module structure\n return {\n ...originalModule,\n template: newTemplate,\n values: newValues,\n customElements: newCustomElements,\n // @ts-ignore\n slotElements: newSlotElements\n }\n}\n\n/**\n * Replaces a token in a Coralite node based on its type, attribute, and content.\n *\n * @param {Object} token - The token to replace.\n * @param {string} token.type - The type of the token ('attribute' or 'text').\n * @param {CoraliteElement|CoraliteTextNode} token.node - The node containing the token.\n * @param {string} [token.attribute] - The attribute name to replace within the node.\n * @param {string} token.content - The content of the token.\n * @param {CoraliteModuleDefinition} token.value - The definition associated with the token.\n */\nexport function replaceToken ({\n type,\n node,\n attribute,\n content,\n value\n}) {\n if (\n type === 'attribute'\n && node.type === 'tag'\n ) {\n if (BOOLEAN_ATTRIBUTES.has(attribute) && (node.attribs[attribute] || '').trim() === content) {\n // @ts-ignore\n const isFalsy = value === 'false' || value === 'null' || value === 'undefined' || value === '0' || value === 0 || value === '' || value === false || value === null || value === undefined\n\n if (isFalsy) {\n delete node.attribs[attribute]\n } else {\n node.attribs[attribute] = ''\n }\n } else if (typeof value === 'string') {\n node.attribs[attribute] = node.attribs[attribute].replace(content, value)\n }\n } else if (node.type === 'text') {\n if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value) || value.type) {\n let nodesArray = Array.isArray(value) ? value : [value]\n\n // inject nodes\n const textSplit = node.data.split(content)\n const childIndex = node.parent.children.indexOf(node)\n const children = []\n\n // append computed tokens in between token split\n for (let i = 0; i < nodesArray.length; i++) {\n const child = nodesArray[i]\n\n if (typeof child !== 'string' && child.type !== 'directive' && typeof child === 'object' && child.type) {\n // update child parent\n // @ts-ignore\n child.parent = node.parent\n // @ts-ignore\n children.push(child)\n }\n }\n\n // replace computed token\n node.parent.children.splice(childIndex, 1,\n createCoraliteTextNode({\n type: 'text',\n data: textSplit[0],\n parent: node.parent\n }),\n // @ts-ignore\n ...children,\n createCoraliteTextNode({\n type: 'text',\n data: textSplit[1],\n parent: node.parent\n })\n )\n } else {\n // Handle object values like refs stringification\n node.data = node.data.replace(content, JSON.stringify(value))\n }\n } else {\n // replace token string\n // @ts-ignore\n const newVal = node.data.replace(content, value)\n const isHTML = /<[a-z][\\s\\S]*>/i.test(newVal)\n\n if (isHTML && node.parent\n && node.parent.type === 'tag'\n && node.parent.name === 'c-token'\n ) {\n const sanitized = sanitize(newVal)\n const parsed = parseHTML(sanitized)\n const children = parsed.root.children\n\n // Use the existing object-handling logic by recursing with the children array\n return replaceToken({\n type,\n node,\n attribute,\n content,\n value: children\n })\n }\n node.data = newVal\n }\n }\n}\n\n/**\n * Creates a deep copy of a CoraliteComponent with re-linked internal references to enable safe independent mutation.\n *\n * @param {CoraliteComponent & CoraliteComponentResult} originalDocument - Document to clone.\n * @returns {CoraliteComponent & CoraliteComponentResult}\n */\nexport function cloneComponentInstance (originalDocument) {\n const nodeMap = new Map()\n const newRoot = cloneNode(nodeMap, originalDocument.root, null)\n\n const newCustomElements = originalDocument.customElements.map(el => nodeMap.get(el))\n const newTempElements = originalDocument.tempElements ? originalDocument.tempElements.map(el => nodeMap.get(el)) : []\n const newSkipRenderElements = originalDocument.skipRenderElements ? originalDocument.skipRenderElements.map(el => nodeMap.get(el)) : []\n\n return {\n ...originalDocument,\n state: { ...originalDocument.state },\n root: newRoot,\n customElements: newCustomElements,\n tempElements: newTempElements,\n skipRenderElements: newSkipRenderElements\n }\n}\n\n/**\n * Extracts and normalizes the script content from a component definition.\n *\n * @param {string} code - The raw script content\n * @returns {ScriptContent | null}\n */\nexport function findAndExtractScript (code) {\n const ast = parseJS(code, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n locations: true\n })\n\n /** @type {ScriptContent | null} */\n let result = null\n const components = new Set()\n\n walkJS(ast, {\n CallExpression (node) {\n if (\n node.callee &&\n node.callee.type === 'Identifier' &&\n node.callee.name === 'defineComponent'\n ) {\n const firstArg = node.arguments[0]\n\n if (firstArg && firstArg.type === 'ObjectExpression') {\n const scriptProp = firstArg.properties.find(\n prop => prop.type === 'Property' &&\n prop.key && prop.key.type === 'Identifier' &&\n prop.key.name === 'script'\n )\n\n if (scriptProp && scriptProp.type === 'Property') {\n const { value, method } = scriptProp\n let startLine = value.loc.start.line - 1\n let prefix = ''\n let content = ''\n\n // Get source slice\n const source = code.slice(value.start, value.end)\n\n if (value.type === 'ArrowFunctionExpression') {\n content = prefix + source\n startLine = value.loc.start.line - 1\n } else if (value.type === 'FunctionExpression') {\n if (method) {\n const isAsync = value.async\n prefix += (isAsync ? 'async ' : '') + 'function script'\n content = prefix + source\n startLine = scriptProp.key.loc.start.line - 1\n } else {\n content = prefix + source\n startLine = value.loc.start.line - 1\n }\n }\n\n result = {\n content,\n lineOffset: startLine\n }\n }\n }\n } else if (\n node.callee &&\n node.callee.type === 'MemberExpression' &&\n node.callee.object &&\n node.callee.object.type === 'Identifier' &&\n node.callee.object.name === 'document' &&\n node.callee.property &&\n node.callee.property.type === 'Identifier' &&\n node.callee.property.name === 'createElement'\n ) {\n const arg = node.arguments[0]\n if (arg && arg.type === 'Literal' && typeof arg.value === 'string') {\n components.add(arg.value)\n }\n }\n }\n })\n\n if (result && components.size > 0) {\n result.components = Array.from(components)\n }\n\n return result\n}\n\n/**\n * Extracts and normalizes the state content from a component definition.\n *\n * @param {string} code - The raw script content\n * @returns {ScriptContent | null}\n */\nexport function findAndExtractProperties (code) {\n const ast = parseJS(code, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n locations: true\n })\n\n /** @type {ScriptContent | null} */\n let result = null\n\n walkJS(ast, {\n CallExpression (node) {\n if (\n node.callee &&\n node.callee.type === 'Identifier' &&\n node.callee.name === 'defineComponent'\n ) {\n const firstArg = node.arguments[0]\n\n if (firstArg && firstArg.type === 'ObjectExpression') {\n const stateProp = firstArg.properties.find(\n prop => prop.type === 'Property' &&\n prop.key && prop.key.type === 'Identifier' &&\n prop.key.name === 'state'\n )\n\n if (stateProp && stateProp.type === 'Property') {\n const { value, method } = stateProp\n let startLine = value.loc.start.line - 1\n let prefix = ''\n let content = ''\n\n // Get source slice\n const source = code.slice(value.start, value.end)\n\n if (value.type === 'ArrowFunctionExpression') {\n content = prefix + source\n startLine = value.loc.start.line - 1\n } else if (value.type === 'FunctionExpression') {\n if (method) {\n const isAsync = value.async\n prefix += (isAsync ? 'async ' : '') + 'function state'\n content = prefix + source\n startLine = stateProp.key.loc.start.line - 1\n } else {\n content = prefix + source\n startLine = value.loc.start.line - 1\n }\n } else if (value.type === 'ObjectExpression') {\n // Wrap object in a function returning that object\n content = `() => (${source})`\n startLine = value.loc.start.line - 1\n }\n\n result = {\n content,\n lineOffset: startLine\n }\n }\n }\n }\n }\n })\n\n return result\n}\n\n/**\n * Transforms Coralite AST nodes into HTML strings for serialization.\n *\n * @param {any} target - The target to transform.\n * @returns {any} The transformed target.\n */\nexport function astTransformer (target) {\n if (isCoraliteNode(target)) {\n // @ts-ignore\n return render(target, { decodeEntities: false })\n }\n\n if (Array.isArray(target) && target.length > 0 && isCoraliteNode(target[0])) {\n // @ts-ignore\n return render(target, { decodeEntities: false })\n }\n\n return target\n}\n\n/**\n * Calculates the DOM path from a node to the root.\n * @param {Object} node - The node to calculate the path for.\n * @param {Object} root - The root node.\n * @returns {Array<number>} An array of indices representing the path.\n */\nexport function getNodePath (node, root) {\n const path = []\n let current = node\n while (current && current !== root) {\n const parent = current.parent\n if (!parent) {\n break\n }\n const index = parent.children.indexOf(current)\n if (index === -1) {\n break\n }\n path.unshift(index)\n current = parent\n }\n return path\n}\n\n/**\n * Generates a hydration map for the client.\n * @param {Array<Object>} templateNodes - The component's template nodes.\n * @param {Object} templateValues - The component's template values.\n * @returns {Object} The hydration map.\n */\nexport function generateHydrationMap (templateNodes, templateValues) {\n const map = {\n texts: [],\n attributes: [],\n refs: []\n }\n\n if (!templateNodes || !templateValues) {\n return map\n }\n\n const root = templateNodes.length > 0 ? templateNodes[0].parent : { children: templateNodes }\n\n if (templateValues.textNodes) {\n for (const item of templateValues.textNodes) {\n if (item.textNode) {\n const isHtml = item.type === 'html'\n const targetNode = isHtml ? item.textNode.parent : item.textNode\n\n map.texts.push({\n path: getNodePath(targetNode, root),\n template: item.textNode.data,\n type: isHtml ? 'html' : 'text'\n })\n }\n }\n }\n\n if (templateValues.attributes) {\n for (const item of templateValues.attributes) {\n if (item.element && item.element.attribs) {\n const originalValue = item.element.attribs[item.name]\n map.attributes.push({\n path: getNodePath(item.element, root),\n name: item.name,\n template: originalValue\n })\n }\n }\n }\n\n if (templateValues.refs) {\n for (const item of templateValues.refs) {\n if (item.element) {\n map.refs.push({\n path: getNodePath(item.element, root),\n name: item.name\n })\n }\n }\n }\n\n return map\n}\n\n/**\n * Recursively adds a component and its dependencies to a tracking object.\n *\n * @param {string} componentId - The ID of the component to add.\n * @param {Object.<string, boolean>} processed - The object tracking processed components.\n * @param {Object.<string, any>} sharedFunctions - The map of shared component functions.\n */\nexport function addComponentAndDependencies (componentId, processed, sharedFunctions) {\n if (!processed[componentId] && sharedFunctions[componentId]) {\n processed[componentId] = true\n\n // Add all dependencies of this component\n const dependencies = sharedFunctions[componentId].components || []\n for (const depId of dependencies) {\n addComponentAndDependencies(depId, processed, sharedFunctions)\n }\n }\n}\n\n/**\n * Recursively clones an AST node and its children, stripping circular references\n * and assigning unique IDs for client-side hydration.\n *\n * @param {Array<Object>} nodes - The nodes to clean.\n * @param {WeakMap} nodeMap - Map to track original nodes to their unique IDs.\n * @param {Object} state - Object containing the current node counter.\n * @returns {Array<Object>|null} The cleaned AST nodes.\n */\nexport function cleanAST (nodes, nodeMap, state) {\n if (!nodes) {\n return null\n }\n\n return nodes.map((node) => {\n const cloned = { ...node }\n // Assign unique ID for token mapping\n const id = state.counter++\n nodeMap.set(node, id)\n cloned._id = id\n\n // Remove circular references\n delete cloned.parent\n delete cloned.prev\n delete cloned.next\n delete cloned.slots\n\n if (cloned.children) {\n cloned.children = cleanAST(cloned.children, nodeMap, state)\n }\n return cloned\n })\n}\n\n/**\n * Cleans the template values object, mapping original node references to unique IDs.\n *\n * @param {Object} values - The values object to clean.\n * @param {WeakMap} nodeMap - Map of original nodes to their unique IDs.\n * @returns {Object|null} The cleaned values object.\n */\nexport function cleanValues (values, nodeMap) {\n if (!values) {\n return null\n }\n\n const result = { ...values }\n\n if (result.attributes) {\n result.attributes = result.attributes.map(item => {\n const cloned = { ...item }\n cloned.elementId = nodeMap.get(item.element)\n delete cloned.element\n return cloned\n })\n }\n\n if (result.textNodes) {\n result.textNodes = result.textNodes.map(item => {\n const cloned = { ...item }\n cloned.textNodeId = nodeMap.get(item.textNode)\n delete cloned.textNode\n return cloned\n })\n }\n\n if (result.refs) {\n result.refs = result.refs.map(item => {\n const cloned = { ...item }\n cloned.elementId = nodeMap.get(item.element)\n delete cloned.element\n return cloned\n })\n }\n return result\n}\n\n/**\n * Safely merges partial plugin updates into the main context object.\n * Deeply merges plain objects and overwrites other types (arrays, primitives, etc.).\n *\n * @param {any} current - The current state object.\n * @param {any} patch - The patch object containing updates.\n * @returns {any} The newly merged state object.\n */\nexport function mergePluginState (current, patch) {\n if (!patch || typeof patch !== 'object') {\n return current\n }\n\n const result = { ...current }\n\n for (const key of Object.keys(patch)) {\n const patchValue = patch[key]\n const currentValue = result[key]\n\n // If both are plain objects, merge them deeply\n if (\n patchValue && typeof patchValue === 'object' && !Array.isArray(patchValue) &&\n currentValue && typeof currentValue === 'object' && !Array.isArray(currentValue)\n ) {\n result[key] = mergePluginState(currentValue, patchValue)\n } else {\n // Otherwise, overwrite (Arrays, strings, numbers, etc.)\n result[key] = patchValue\n }\n }\n\n return result\n}\n\n/**\n * Extracts global variable names from a module script code using Acorn parsing and AST walking.\n * @param {string} code - The raw script code\n * @returns {Array<string>} - Array of identified global variables\n */\n/**\n * Extracts all component tag names dynamically created via document.createElement.\n *\n * @param {string} code - The raw script content\n * @returns {Array<string>} - Array of identified imperative component tags\n */\nexport function findAndExtractImperativeComponents (code) {\n try {\n const ast = parseJS(code, {\n ecmaVersion: 'latest',\n sourceType: 'module'\n })\n\n const components = new Set()\n\n walkJS(ast, {\n CallExpression (node) {\n if (\n node.callee &&\n node.callee.type === 'MemberExpression' &&\n node.callee.object &&\n node.callee.object.type === 'Identifier' &&\n node.callee.object.name === 'document' &&\n node.callee.property &&\n node.callee.property.type === 'Identifier' &&\n node.callee.property.name === 'createElement'\n ) {\n const arg = node.arguments[0]\n if (arg && arg.type === 'Literal' && typeof arg.value === 'string' && arg.value.includes('-')) {\n components.add(arg.value)\n }\n }\n }\n })\n\n return [...components]\n } catch (err) {\n return []\n }\n}\n\n/**\n * Creates a reactive proxy that triggers a callback on changes.\n * Supports deep reactivity via lazy proxying of nested objects.\n *\n * @param {Object} target - The object to proxy.\n * @param {Function} onChange - Callback triggered when a property is set or deleted.\n * @param {WeakMap} [proxies=new WeakMap()] - Cache for existing proxies to handle circular references and identity.\n * @returns {Proxy} The reactive proxy.\n */\nexport function createReactiveProxy (target, onChange, proxies = new WeakMap()) {\n if (proxies.has(target)) {\n return proxies.get(target)\n }\n\n const handler = {\n get (target, property, receiver) {\n const value = Reflect.get(target, property, receiver)\n if (value !== null && typeof value === 'object' && !(typeof Node !== 'undefined' && value instanceof Node)) {\n return createReactiveProxy(value, onChange, proxies)\n }\n return value\n },\n set (target, property, value, receiver) {\n const oldValue = target[property]\n if (oldValue === value && property in target) {\n return true\n }\n\n const result = Reflect.set(target, property, value, receiver)\n if (result) {\n onChange({\n property,\n value,\n oldValue,\n target\n })\n }\n return result\n },\n deleteProperty (target, property) {\n const hadProperty = Object.prototype.hasOwnProperty.call(target, property)\n const oldValue = target[property]\n const result = Reflect.deleteProperty(target, property)\n if (result && hadProperty) {\n onChange({\n property,\n value: undefined,\n oldValue,\n target,\n deleted: true\n })\n }\n return result\n }\n }\n\n const proxy = new Proxy(target, handler)\n proxies.set(target, proxy)\n return proxy\n}\n\n/**\n * Creates a read-only proxy that throws on mutation attempts.\n * @param {Object} target - The object to proxy.\n * @param {WeakMap} [proxies=new WeakMap()] - Cache for existing proxies.\n * @returns {Proxy} The read-only proxy.\n */\nexport function createReadOnlyProxy (target, proxies = new WeakMap()) {\n if (proxies.has(target)) {\n return proxies.get(target)\n }\n\n const handler = {\n get (target, property, receiver) {\n const value = Reflect.get(target, property, receiver)\n if (value !== null && typeof value === 'object' && !(typeof Node !== 'undefined' && value instanceof Node)) {\n return createReadOnlyProxy(value, proxies)\n }\n return value\n },\n set () {\n throw new Error('Coralite Error: Cannot mutate state inside a getter. State is read-only here.')\n },\n deleteProperty () {\n throw new Error('Coralite Error: Cannot delete state inside a getter. State is read-only here.')\n }\n }\n\n const proxy = new Proxy(target, handler)\n\n proxies.set(target, proxy)\n\n return proxy\n}\n\n/**\n *\n */\nexport function extractGlobals (code) {\n try {\n const ast = parseJS(code, {\n ecmaVersion: 'latest',\n sourceType: 'module'\n })\n\n const globals = new Set()\n walkJS(ast, {\n Identifier (node) {\n globals.add(node.name)\n }\n })\n\n return [...globals]\n } catch (err) {\n return []\n }\n}\n", "import { Parser } from 'htmlparser2'\nimport {\n createCoraliteElement,\n createCoraliteTextNode,\n createCoraliteComment,\n createCoraliteDirective,\n createCoraliteComponent\n} from './dom.js'\nimport { isValidCustomElementName, VALID_TAGS } from './tags.js'\n\n\n/**\n * @internal\n * @param {CoraliteElement} element - The element being parsed\n * @param {Record<string, string>} attributes - A dictionary of element attributes\n * @param {Array<string | Attribute>} skipRenderByAttribute - Keys to search for skip flag\n */\nfunction applySkipRenderAttribute (element, attributes, skipRenderByAttribute) {\n if (skipRenderByAttribute && skipRenderByAttribute.length > 0) {\n for (let i = 0; i < skipRenderByAttribute.length; i++) {\n const skipItem = skipRenderByAttribute[i]\n if (typeof skipItem === 'string') {\n if (Object.prototype.hasOwnProperty.call(attributes, skipItem)) {\n element.skipRender = true\n break\n }\n } else if (skipItem && typeof skipItem === 'object') {\n if (Object.prototype.hasOwnProperty.call(attributes, skipItem.name) && attributes[skipItem.name].includes(skipItem.value)) {\n element.skipRender = true\n break\n }\n }\n }\n }\n}\n\nfunction handleTemplateOpenTag (attributes) {\n if (!attributes.id) {\n throw new Error('Template requires an \"id\"')\n }\n if (!isValidCustomElementName(attributes.id)) {\n throw new Error('Invalid template id: \"' + attributes.id + '\" it must match following the pattern https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name')\n }\n return attributes.id\n}\n\n/**\n * @internal\n * @param {CoraliteElement} element - The slot element node\n * @param {Record<string, string>} attributes - A dictionary of element attributes\n * @param {string} templateId - Current template definition id\n * @param {Object.<string, Object.<string, CoraliteModuleSlotElement>>} slotElements - State containing slot lists\n */\nfunction handleSlotOpenTag (element, attributes, templateId, slotElements) {\n const name = attributes.name || 'default'\n if (slotElements[templateId] && slotElements[templateId][name]) {\n throw new Error('Slot names must be unique: \"' + name + '\"')\n }\n const slot = {\n name,\n element\n }\n if (!slotElements[templateId]) {\n slotElements[templateId] = { [name]: slot }\n } else {\n slotElements[templateId][name] = slot\n }\n}\n\n/**\n * @import {\n * CoraliteToken,\n * CoraliteModule,\n * CoraliteTextNode,\n * CoraliteElement,\n * CoraliteModuleSlotElement,\n * CoraliteComponentValues,\n * CoraliteComponentRoot,\n * CoraliteContentNode,\n * Attribute,\n * ParseHTMLResult,\n * CoraliteOnError} from '../types/index.js'\n */\n\n/**\n * Parse HTML content and return a CoraliteComponent object representing the parsed component structure\n *\n * @param {string} string - HTML content to parse as string input type textual data\n * @param {Array<string | Attribute>} [ignoreByAttribute] - Ignore element with attribute name value pair\n * @param {Array<string | Attribute>} [skipRenderByAttribute] - Parse element but remove before final render\n * @param {CoraliteOnError} [onError] - Callback function for error and warning handling\n * @returns {ParseHTMLResult}\n * @example parseHTML('<h1>Hello world!</h1>')\n */\nexport function parseHTML (string, ignoreByAttribute, skipRenderByAttribute, onError) {\n // root element reference\n const root = createCoraliteComponent({\n type: 'root',\n children: []\n })\n\n // stack to keep track of current element hierarchy\n /** @type {CoraliteContentNode[]} */\n const stack = [root]\n const customElements = []\n /** @type {CoraliteElement[]} */\n const tempElements = []\n /** @type {CoraliteElement[]} */\n const skipRenderElements = []\n\n const ignoreAttributeMap = getIgnoreAttributeMap(ignoreByAttribute)\n\n const parser = new Parser({\n onprocessinginstruction (name, data) {\n root.children.push(createCoraliteDirective({\n type: 'directive',\n name,\n data\n }))\n },\n onopentag (originalName, attributes) {\n const name = originalName.toLowerCase()\n const parent = stack[stack.length - 1]\n const element = createElement({\n name,\n attributes,\n parent,\n ignoreByAttribute: ignoreAttributeMap,\n onError\n })\n\n applySkipRenderAttribute(element, attributes, skipRenderByAttribute)\n\n if (element.slots) {\n // store custom element\n customElements.push(element)\n }\n\n // push element to stack as it may have children\n stack.push(element)\n },\n ontext (text) {\n const parent = stack[stack.length - 1]\n\n createTextNode(text, parent)\n },\n onclosetag () {\n const element = stack[stack.length - 1]\n\n if (element.type === 'tag') {\n if (element.remove) {\n // store element for removal\n // @ts-ignore\n tempElements.push(element.parent.children[element.parent.children.length - 1])\n } else if (element.skipRender) {\n // @ts-ignore\n skipRenderElements.push(element.parent.children[element.parent.children.length - 1])\n }\n }\n\n // remove current element from stack as we're done with its children\n stack.pop()\n },\n oncomment (data) {\n const parent = stack[stack.length - 1]\n\n parent.children.push(createCoraliteComment({\n type: 'comment',\n data,\n parent\n }))\n }\n }, { decodeEntities: false })\n\n parser.write(string)\n parser.end()\n\n sortSlottedChildren(customElements)\n\n return {\n root,\n customElements,\n tempElements,\n skipRenderElements\n }\n}\n\n/**\n * Processes custom elements to organize their children by slot name.\n * @param {CoraliteElement[]} elements - Array of custom element objects with `children` and `attribs`.\n */\nfunction sortSlottedChildren (elements) {\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i]\n\n for (let k = 0; k < element.children.length; k++) {\n const childNode = element.children[k]\n let slotName = 'default'\n\n if (childNode.type === 'tag'\n && childNode.attribs\n && childNode.attribs.slot) {\n slotName = childNode.attribs.slot\n\n // clean up slot attribute\n delete childNode.attribs.slot\n }\n\n element.slots.push({\n name: slotName,\n node: childNode\n })\n }\n }\n}\n\n/**\n * Parses HTML string containing meta tags or generates Coralite module structure from markup.\n *\n * @param {string} string - HTML content containing meta tags or module markup\n * @param {Object} options\n * @param {Array<string | Attribute>} options.ignoreByAttribute - An array of attribute names and values to ignore during parsing\n * @param {Array<string | Attribute>} [options.skipRenderByAttribute] - An array of attributes that exclude element from rendering\n * @param {CoraliteOnError} [options.onError] - Callback function for error and warning handling\n * @returns {CoraliteModule} - Parsed module information, including template, script, tokens, and slot configurations\n *\n * @example\n * ```\n * // example usage:\n * const html = `<template id=\"home\">\n * <slot name=\"default\">Hello</slot>\n * </template>`;\n * const module = parseModule(html, { ignoreByAttribute: [] });\n *\n * // module object structure will be:\n * //{\n * // id: 'home',\n * // template: { ... },\n * // tokens: [],\n * // customElements: [],\n * // slotElements: {\n * // default: {\n * // name: 'slot',\n * // element: {}\n * // }\n * // }\n * //}\n * ```\n */\nexport function parseModule (string, { ignoreByAttribute, skipRenderByAttribute, onError }) {\n // root element reference\n const root = createCoraliteComponent({\n type: 'root',\n children: []\n })\n // stack to keep track of current element hierarchy\n /** @type {CoraliteContentNode[]} */\n const stack = [root]\n const customElements = []\n /** @type {Object.<string, Object.<string,CoraliteModuleSlotElement>>} */\n const slotElements = {}\n /** @type {CoraliteComponentValues} */\n const documentValues = {\n refs: [],\n attributes: [],\n textNodes: []\n }\n const styles = []\n let isScript = false\n let isTemplate = false\n let templateId = ''\n const rootClasses = new Set()\n const descendantClasses = new Set()\n\n const ignoreAttributeMap = getIgnoreAttributeMap(ignoreByAttribute)\n\n const parser = new Parser({\n onopentag (originalName, attributes) {\n const parent = stack[stack.length - 1]\n const element = createElement({\n name: originalName,\n attributes,\n parent,\n ignoreByAttribute: ignoreAttributeMap,\n onError\n })\n\n applySkipRenderAttribute(element, attributes, skipRenderByAttribute)\n\n if (element.slots) {\n customElements.push(element)\n }\n\n // push element to stack as it may have children\n stack.push(element)\n\n if (element.name === 'script') {\n isScript = true\n } else if (element.name === 'template') {\n isTemplate = true\n templateId = handleTemplateOpenTag(attributes)\n } else if (element.name === 'slot') {\n handleSlotOpenTag(element, attributes, templateId, slotElements)\n } else if (isTemplate) {\n const attributeNames = Object.keys(attributes)\n\n // Collect classes\n if (attributes.class && parent.type !== 'root') {\n const classes = attributes.class.trim().split(/\\s+/)\n const isRoot = parent.name === 'template'\n\n for (const className of classes) {\n if (className) {\n if (isRoot) {\n rootClasses.add(className)\n } else {\n descendantClasses.add(className)\n }\n }\n }\n }\n\n // collect tokens inside template tag\n if (attributeNames.length) {\n for (let i = 0; i < attributeNames.length; i++) {\n const name = attributeNames[i]\n const value = attributes[name]\n const tokens = getTokensFromString(value)\n\n // store attribute tokens\n if (tokens.length) {\n documentValues.attributes.push({\n name,\n tokens,\n element\n })\n }\n\n if (name === 'ref') {\n documentValues.refs.push({\n name: value,\n element\n })\n }\n }\n }\n }\n },\n ontext (text) {\n const parent = stack[stack.length - 1]\n\n if (isTemplate && !isScript && text.trim()) {\n const topLevelTokens = getTokensFromString(text, true)\n\n if (topLevelTokens.length) {\n let lastIndex = 0\n for (const token of topLevelTokens) {\n const index = text.indexOf(token.content, lastIndex)\n\n if (index > lastIndex) {\n createTextNode(text.substring(lastIndex, index), parent)\n }\n\n const cToken = createCoraliteElement({\n type: 'tag',\n name: 'c-token',\n parent,\n attribs: {},\n children: []\n })\n parent.children.push(cToken)\n\n const tokenNode = createTextNode(token.content, cToken)\n documentValues.textNodes.push({\n tokens: getTokensFromString(token.content),\n textNode: tokenNode,\n type: 'html'\n })\n\n lastIndex = index + token.content.length\n }\n\n if (lastIndex < text.length) {\n createTextNode(text.substring(lastIndex), parent)\n }\n return\n }\n }\n\n createTextNode(text, parent)\n },\n onclosetag (name) {\n const element = stack[stack.length - 1]\n\n if (element.type === 'tag' && element.remove) {\n // remove element from tree\n element.parent.children.pop()\n }\n\n if (name === 'template') {\n // exit template tag\n isTemplate = false\n } else if (name === 'script') {\n isScript = false\n }\n\n // remove current element from stack as we're done with its children\n stack.pop()\n },\n oncdatastart (csb) {\n console.log(csb)\n },\n\n oncomment (data) {\n stack[stack.length - 1].children.push(createCoraliteComment({\n type: 'comment',\n data,\n parent: stack[stack.length - 1]\n }))\n }\n }, { decodeEntities: false })\n\n parser.write(string)\n parser.end()\n\n /** @type {CoraliteElement} */\n let template\n let script\n\n for (let i = 0; i < root.children.length; i++) {\n const node = root.children[i]\n\n if (node.type === 'tag') {\n if (node.name === 'template') {\n if (template) {\n throw new Error('One template element is permitted')\n }\n\n // @ts-ignore\n template = node\n\n } else if (node.name === 'script') {\n if (node.attribs.type !== 'module') {\n throw new Error('Template \"' + templateId + '\" script tag must contain the `type=\"module\"` attribute')\n }\n const scriptString = node.children[0]\n\n if (scriptString.type !== 'text') {\n throw new Error('Script tag must contain text')\n }\n\n script = scriptString.data\n } else if (node.name === 'style') {\n const styleContent = node.children[0]\n\n if (styleContent && styleContent.type === 'text') {\n styles.push(styleContent.data)\n }\n }\n }\n }\n\n if (!template) {\n return {\n isTemplate: false\n }\n }\n\n const scriptIndex = string.indexOf('<script')\n const stringHead = string.substring(0, scriptIndex)\n const lineOffset = stringHead.split(/\\r\\n|\\r|\\n/).length - 1\n\n return {\n id: template.attribs.id,\n template,\n script,\n styles,\n values: documentValues,\n lineOffset,\n customElements,\n slotElements,\n isTemplate: true,\n rootClasses,\n descendantClasses\n }\n}\n\n/**\n * Creates an element within the component structure based on provided parameters.\n * @param {Object} data - An object containing details needed to create the element.\n * @param {string} data.name - The tag name of the new element.\n * @param {Object.<string, string>} data.attributes - Attributes for the new element.\n * @param {CoraliteElement | CoraliteComponentRoot} data.parent - Parent element or component root where this element will be attached.\n * @param {Array<string | Attribute> | Map<string, string[]>} [data.ignoreByAttribute] - Optional parameter used for ignoring elements based on attributes.\n * @param {CoraliteOnError} [data.onError] - Callback function for error and warning handling\n * @returns {CoraliteElement} The newly created element with its parent reference and position in the parent's children list.\n */\nexport function createElement ({\n name,\n attributes,\n parent,\n ignoreByAttribute,\n onError\n}) {\n const sanitisedName = name.toLowerCase()\n const element = createCoraliteElement({\n type: 'tag',\n name: sanitisedName,\n attribs: attributes,\n children: [],\n parent,\n parentChildIndex: parent.children.length\n })\n\n if (ignoreByAttribute) {\n const ignore = findAttributesToIgnore(ignoreByAttribute, attributes)\n\n if (ignore) {\n element.remove = true\n }\n }\n\n if (!VALID_TAGS[sanitisedName]) {\n const specUrl = 'https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name'\n\n try {\n element.name = name\n\n // check if the tag name matches the regex for valid custom elements\n if (isValidCustomElementName(name)) {\n // store custom elements\n element.slots = []\n } else {\n const message = 'Invalid custom element tag name: \"' + name + '\" (' + specUrl + ')'\n if (typeof onError === 'function') {\n onError({\n level: 'WARN',\n message\n })\n } else {\n console.warn(message)\n }\n }\n } catch (error) {\n const message = error.message + ' (' + specUrl + ')'\n if (typeof onError === 'function') {\n onError({\n level: 'WARN',\n message,\n error\n })\n } else {\n console.warn(message)\n }\n }\n }\n\n // add element to its parent's children\n parent.children.push(element)\n\n return element\n}\n\n/**\n * @param {string} data - The text content to create a text node\n * @param {CoraliteElement | CoraliteComponentRoot} parent - parent node\n * @returns {CoraliteTextNode}\n *\n * @example\n * const textNode = createTextNode('Hello World', parentNode);\n */\nexport function createTextNode (data, parent) {\n /** @type {CoraliteTextNode} */\n const textNode = createCoraliteTextNode({\n type: 'text',\n data,\n parent\n })\n\n // @ts-ignore\n parent.children.push(textNode)\n\n return textNode\n}\n\n/**\n * Find attributes to be ignored by the parser.\n *\n * @param {Array<string | Attribute> | Map<string, Array<string | null>>} ignoreByAttribute - An array of attribute pairs/strings or a map to be ignored by the parser\n * @param {Object<string, string>} attributes - The HTML attribute object to be parsed by the parser\n * @returns {boolean}\n */\nfunction findAttributesToIgnore (ignoreByAttribute, attributes) {\n if (Array.isArray(ignoreByAttribute)) {\n for (let i = 0; i < ignoreByAttribute.length; i++) {\n const item = ignoreByAttribute[i]\n if (typeof item === 'string') {\n if (Object.prototype.hasOwnProperty.call(attributes, item)) {\n return true\n }\n } else {\n const { name, value } = item\n if (attributes[name] && attributes[name].includes(value)) {\n return true\n }\n }\n }\n return false\n }\n\n // Handle Map optimization\n for (const name in attributes) {\n if (Object.prototype.hasOwnProperty.call(attributes, name)) {\n if (ignoreByAttribute.has(name)) {\n const values = ignoreByAttribute.get(name)\n const attributeValue = attributes[name]\n\n for (let i = 0; i < values.length; i++) {\n if (values[i] === null) {\n return true\n } else if (attributeValue.includes(values[i])) {\n return true\n }\n }\n }\n }\n }\n\n return false\n}\n\n/**\n * Create a map from ignoreByAttribute array.\n * @param {Array<string | Attribute> | Map<string, Array<string | null>>} ignoreByAttribute - The ignore configurations\n * @returns {Map<string, Array<string | null>>} The generated map\n */\nfunction getIgnoreAttributeMap (ignoreByAttribute) {\n if (!ignoreByAttribute) {\n return\n }\n\n if (!Array.isArray(ignoreByAttribute)) {\n return ignoreByAttribute\n }\n\n const map = new Map()\n\n for (let i = 0; i < ignoreByAttribute.length; i++) {\n const item = ignoreByAttribute[i]\n let name, value\n if (typeof item === 'string') {\n name = item\n value = null\n } else {\n name = item.name\n value = item.value\n }\n\n if (!map.has(name)) {\n map.set(name, [])\n }\n map.get(name).push(value)\n }\n\n return map\n}\n\n/**\n * Extract tokens from string\n * @param {string} string - The string to extract tokens from\n * @returns {CoraliteToken[]} The array of tokens extracted from the string\n *\n * @example\n * getTokensFromString('Hello {{ name }} and {{ age }}')\n * // Returns: [{ name: 'name', content: '{{ name }}' }, { name: 'age', content: '{{ age }}' }]\n *\n * Handles:\n * - Multiple tokens in one string\n * - Nested braces: {{ {{nested}} }} extracts both\n * - Complex token names: {{ user.name }}, {{ items[0] }}\n * - Empty tokens: {{}} (returns empty name)\n * - Malformed tokens: {{unclosed, {{extra}} braces}}\n */\nfunction getTokensFromString (string, topLevelOnly = false) {\n const result = []\n let i = 0\n\n while (i < string.length) {\n if (string[i] === '{' && string[i + 1] === '{') {\n const tokenStart = i\n i += 2\n\n // Track brace depth for nested tokens\n let depth = 1\n let tokenEnd = -1\n\n // Scan until we find matching closing braces\n while (i < string.length && depth > 0) {\n if (string[i] === '{' && string[i + 1] === '{') {\n depth++\n i += 2\n } else if (string[i] === '}' && string[i + 1] === '}') {\n depth--\n if (depth === 0) {\n tokenEnd = i + 2\n break\n }\n i += 2\n } else {\n i++\n }\n }\n\n // If we found a complete token\n if (tokenEnd > 0) {\n const fullToken = string.slice(tokenStart, tokenEnd)\n const tokenContent = fullToken.slice(2, -2).trim()\n\n // Add the full token\n result.push({\n name: tokenContent,\n content: fullToken\n })\n\n if (!topLevelOnly) {\n // Also extract any nested tokens from the content\n // This handles cases like {{ {{nested}} }} which should extract both\n const nestedTokens = getTokensFromString(tokenContent)\n\n // Add nested tokens that are different from the full token\n for (const nested of nestedTokens) {\n // Only add if it's not the same as what we just added\n if (nested.content !== fullToken) {\n result.push(nested)\n }\n }\n }\n\n // Continue scanning after this token\n continue\n }\n\n // If token is unclosed, treat it as literal text and continue\n i = tokenStart + 2\n } else {\n i++\n }\n }\n\n return result\n}\n", "/**\n * @import {\n * CoraliteElement,\n * CoraliteTextNode,\n * CoraliteAnyNode,\n * CoraliteComponentRoot,\n * CoraliteComment,\n * CoraliteDirective,\n * RawCoraliteElement,\n * RawCoraliteTextNode,\n * RawCoraliteComment,\n * RawCoraliteDirective,\n * RawCoraliteComponentRoot\n * } from '../types/index.js'\n */\n\nconst ELEMENT_NODE = 1\nconst TEXT_NODE = 3\nconst COMMENT_NODE = 8\nconst DOCUMENT_NODE = 9\nconst DOCUMENT_TYPE_NODE = 10\n\nconst nodeTypes = {\n tag: ELEMENT_NODE,\n script: ELEMENT_NODE,\n style: ELEMENT_NODE,\n text: TEXT_NODE,\n comment: COMMENT_NODE,\n root: DOCUMENT_NODE,\n directive: DOCUMENT_TYPE_NODE\n}\n\n/**\n * Base enhancer for all Coralite nodes\n * @template {RawCoraliteElement | RawCoraliteTextNode | RawCoraliteComment | RawCoraliteDirective | RawCoraliteComponentRoot} T\n * @param {T} node - The raw DOM node to enhance\n */\nfunction CoraliteNodeConstructor (node) {\n for (const key in node) {\n if (['parent', 'prev', 'next', 'slots'].includes(key)) {\n Object.defineProperty(this, key, {\n value: node[key],\n enumerable: false,\n writable: true,\n configurable: true\n })\n } else {\n // @ts-ignore\n this[key] = node[key]\n }\n }\n}\n\nfunction makeCircularPropertiesNonEnumerable (node) {\n for (const key of ['parent', 'prev', 'next', 'slots']) {\n if (Object.hasOwn(node, key)) {\n const value = node[key]\n delete node[key]\n Object.defineProperty(node, key, {\n value,\n enumerable: false,\n writable: true,\n configurable: true\n })\n }\n }\n}\n\nObject.defineProperties(CoraliteNodeConstructor.prototype, {\n nodeType: {\n /**\n * Returns an integer identifying the type of the node.\n * @returns {number}\n */\n get () {\n return nodeTypes[this.type] || ELEMENT_NODE\n }\n },\n parentNode: {\n /**\n * Returns the parent of the specified node in the DOM tree.\n * @returns {CoraliteAnyNode | CoraliteComponentRoot}\n */\n get () {\n return this.parent\n },\n /**\n * Sets the parent of the node.\n * @param {CoraliteAnyNode | CoraliteComponentRoot} value - The parent node to set\n */\n set (value) {\n this.parent = value\n }\n },\n parentElement: {\n /**\n * Returns the DOM node's parent Element, or null if the node either has no parent, or its parent isn't a DOM Element.\n * @returns {CoraliteAnyNode | CoraliteComponentRoot}\n */\n get () {\n return this.parent\n },\n /**\n * Sets the parent element of the node.\n * @param {CoraliteAnyNode | CoraliteComponentRoot} value - The parent element to set\n */\n set (value) {\n this.parent = value\n }\n },\n previousSibling: {\n /**\n * Returns the node immediately preceding the specified one in its parent's childNodes list, or null if the specified node is the first in that list.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n if (!this.parent || !this.parent.children) {\n return null\n }\n const index = this.parent.children.indexOf(this)\n return index > 0 ? this.parent.children[index - 1] : null\n }\n },\n nextSibling: {\n /**\n * Returns the node immediately following the specified one in its parent's childNodes list, or null if the specified node is the last node in that list.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n if (!this.parent || !this.parent.children) {\n return null\n }\n const index = this.parent.children.indexOf(this)\n return index > -1 && index < this.parent.children.length - 1 ? this.parent.children[index + 1] : null\n }\n }\n})\n\n/**\n * Coralite Element Node Constructor\n * @param {RawCoraliteElement} node - The raw element node\n */\nfunction CoraliteElementConstructor (node) {\n CoraliteNodeConstructor.call(this, node)\n}\n\nCoraliteElementConstructor.prototype = Object.create(CoraliteNodeConstructor.prototype)\nCoraliteElementConstructor.prototype.constructor = CoraliteElementConstructor\n\n\nObject.defineProperties(CoraliteElementConstructor.prototype, {\n nodeName: {\n /**\n * Returns the name of the node (uppercase tag name for elements).\n * @returns {string}\n */\n get () {\n return this.name.toUpperCase()\n }\n },\n tagName: {\n /**\n * Returns the tag name of the element (uppercase).\n * @returns {string}\n */\n get () {\n return this.name.toUpperCase()\n },\n /**\n * Sets the tag name of the element (converted to lowercase).\n * @param {string} value - The tag name to set\n */\n set (value) {\n this.name = value.toLowerCase()\n }\n },\n nodeValue: {\n /**\n * Returns null for elements.\n * @returns {null}\n */\n get () {\n return null\n },\n /**\n * Setting nodeValue on an element has no effect.\n */\n set (value) {\n // Elements do not have nodeValue\n }\n },\n attributes: {\n /**\n * Returns a collection of the element's attributes.\n * @returns {Object.<string, string>}\n */\n get () {\n return this.attribs\n },\n /**\n * Sets the attributes of the element.\n * @param {Object.<string, string>} value - The attributes object to set\n */\n set (value) {\n this.attribs = value\n }\n },\n childNodes: {\n /**\n * Returns a live collection of child nodes of the given element.\n * @returns {CoraliteAnyNode[]}\n */\n get () {\n return this.children || []\n },\n /**\n * Sets the child nodes of the element.\n * @param {CoraliteAnyNode[]} value - The array of child nodes to set\n */\n set (value) {\n this.children = value\n }\n },\n firstChild: {\n /**\n * Returns the node's first child in the tree, or null if the node has no children.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n return this.children && this.children.length > 0 ? this.children[0] : null\n }\n },\n lastChild: {\n /**\n * Returns the last child of the node, or null if there are no child nodes.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n return this.children && this.children.length > 0 ? this.children[this.children.length - 1] : null\n }\n },\n textContent: {\n /**\n * Returns the text content of the node and its descendants.\n * @returns {string}\n */\n get () {\n if (this.children) {\n return this.children.map(child => child.textContent).join('')\n }\n return ''\n },\n /**\n * Sets the text content of the node. Replaces all children with a single text node.\n * @param {string} value - The text content to set\n */\n set (value) {\n // Replace all children with a single text node\n const textNode = createCoraliteTextNode({\n type: 'text',\n data: value,\n parent: this\n })\n this.children = [textNode]\n }\n },\n id: {\n /**\n * Returns the element's ID attribute.\n * @returns {string}\n */\n get () {\n return this.attribs ? this.attribs.id : ''\n },\n /**\n * Sets the element's ID attribute.\n * @param {string} value - The ID to set\n */\n set (value) {\n if (this.attribs) {\n this.attribs.id = value\n }\n }\n },\n className: {\n /**\n * Returns the element's class attribute.\n * @returns {string}\n */\n get () {\n return this.attribs ? this.attribs.class : ''\n },\n /**\n * Sets the element's class attribute.\n * @param {string} value - The class names to set\n */\n set (value) {\n if (this.attribs) {\n this.attribs.class = value\n }\n }\n }\n})\n\n/**\n * Creates an enhanced Coralite Element\n * @param {RawCoraliteElement} node - The raw element node\n * @returns {CoraliteElement} The enhanced Coralite Element\n */\nexport function createCoraliteElement (node) {\n makeCircularPropertiesNonEnumerable(node)\n Object.setPrototypeOf(node, CoraliteElementConstructor.prototype)\n // @ts-ignore\n return node\n}\n\n/**\n * Coralite Text Node Constructor\n * @param {RawCoraliteTextNode} node - The raw text node\n */\nfunction CoraliteTextNodeConstructor (node) {\n CoraliteNodeConstructor.call(this, node)\n}\n\nCoraliteTextNodeConstructor.prototype = Object.create(CoraliteNodeConstructor.prototype)\nCoraliteTextNodeConstructor.prototype.constructor = CoraliteTextNodeConstructor\n\nObject.defineProperties(CoraliteTextNodeConstructor.prototype, {\n nodeName: {\n /**\n * Returns the name of the node (#text).\n * @returns {string}\n */\n get () {\n return '#text'\n }\n },\n nodeValue: {\n /**\n * Returns the text content of the node.\n * @returns {string}\n */\n get () {\n return this.data\n },\n /**\n * Sets the text content of the node.\n * @param {string} value - The text content to set\n */\n set (value) {\n this.data = value\n }\n },\n textContent: {\n /**\n * Returns the text content of the node.\n * @returns {string}\n */\n get () {\n return this.data\n },\n /**\n * Sets the text content of the node.\n * @param {string} value - The text content to set\n */\n set (value) {\n this.data = value\n }\n }\n})\n\n/**\n * Creates an enhanced Coralite Text Node\n * @param {RawCoraliteTextNode} node - The raw text node\n * @returns {CoraliteTextNode} The enhanced Coralite Text Node\n */\nexport function createCoraliteTextNode (node) {\n makeCircularPropertiesNonEnumerable(node)\n Object.setPrototypeOf(node, CoraliteTextNodeConstructor.prototype)\n // @ts-ignore\n return node\n}\n\n/**\n * Coralite Comment Node Constructor\n * @param {RawCoraliteComment} node - The raw comment node\n */\nfunction CoraliteCommentConstructor (node) {\n CoraliteNodeConstructor.call(this, node)\n}\n\nCoraliteCommentConstructor.prototype = Object.create(CoraliteNodeConstructor.prototype)\nCoraliteCommentConstructor.prototype.constructor = CoraliteCommentConstructor\n\nObject.defineProperties(CoraliteCommentConstructor.prototype, {\n nodeName: {\n /**\n * Returns the name of the node (#comment).\n * @returns {string}\n */\n get () {\n return '#comment'\n }\n },\n nodeValue: {\n /**\n * Returns the content of the comment.\n * @returns {string}\n */\n get () {\n return this.data\n },\n /**\n * Sets the content of the comment.\n * @param {string} value - The content to set\n */\n set (value) {\n this.data = value\n }\n },\n textContent: {\n /**\n * Returns the content of the comment.\n * @returns {string}\n */\n get () {\n return this.data\n },\n /**\n * Sets the content of the comment.\n * @param {string} value - The content to set\n */\n set (value) {\n this.data = value\n }\n }\n})\n\n/**\n * Creates an enhanced Coralite Comment Node\n * @param {RawCoraliteComment} node - The raw comment node\n * @returns {CoraliteComment} The enhanced Coralite Comment Node\n */\nexport function createCoraliteComment (node) {\n makeCircularPropertiesNonEnumerable(node)\n Object.setPrototypeOf(node, CoraliteCommentConstructor.prototype)\n // @ts-ignore\n return node\n}\n\n/**\n * Coralite Directive Node Constructor\n * @param {RawCoraliteDirective} node - The raw directive node\n */\nfunction CoraliteDirectiveConstructor (node) {\n CoraliteNodeConstructor.call(this, node)\n}\n\nCoraliteDirectiveConstructor.prototype = Object.create(CoraliteNodeConstructor.prototype)\nCoraliteDirectiveConstructor.prototype.constructor = CoraliteDirectiveConstructor\n\nObject.defineProperties(CoraliteDirectiveConstructor.prototype, {\n nodeName: {\n /**\n * Returns the name of the directive (e.g., !DOCTYPE).\n * @returns {string}\n */\n get () {\n return this.name\n }\n },\n nodeValue: {\n /**\n * Returns the content of the directive.\n * @returns {string}\n */\n get () {\n return this.data\n },\n /**\n * Sets the content of the directive.\n * @param {string} value - The content to set\n */\n set (value) {\n this.data = value\n }\n }\n})\n\n/**\n * Creates an enhanced Coralite Directive Node (e.g. DOCTYPE)\n * @param {RawCoraliteDirective} node - The raw directive node\n * @returns {CoraliteDirective} The enhanced Coralite Directive Node\n */\nexport function createCoraliteDirective (node) {\n makeCircularPropertiesNonEnumerable(node)\n Object.setPrototypeOf(node, CoraliteDirectiveConstructor.prototype)\n // @ts-ignore\n return node\n}\n\n/**\n * Coralite Document Node Constructor\n * @param {RawCoraliteComponentRoot} node - The raw document node\n */\nfunction CoraliteComponentConstructor (node) {\n CoraliteNodeConstructor.call(this, node)\n}\n\nCoraliteComponentConstructor.prototype = Object.create(CoraliteNodeConstructor.prototype)\nCoraliteComponentConstructor.prototype.constructor = CoraliteComponentConstructor\n\nObject.defineProperties(CoraliteComponentConstructor.prototype, {\n nodeName: {\n /**\n * Returns the name of the node (#document).\n * @returns {string}\n */\n get () {\n return '#document'\n }\n },\n nodeValue: {\n /**\n * Returns null for document nodes.\n * @returns {null}\n */\n get () {\n return null\n }\n },\n childNodes: {\n /**\n * Returns a live collection of child nodes of the document.\n * @returns {CoraliteAnyNode[]}\n */\n get () {\n return this.children || []\n },\n /**\n * Sets the child nodes of the document.\n * @param {CoraliteAnyNode[]} value - The array of child nodes to set\n */\n set (value) {\n this.children = value\n }\n },\n firstChild: {\n /**\n * Returns the document's first child in the tree, or null if the document has no children.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n return this.children && this.children.length > 0 ? this.children[0] : null\n }\n },\n lastChild: {\n /**\n * Returns the last child of the document, or null if there are no child nodes.\n * @returns {CoraliteAnyNode | null}\n */\n get () {\n return this.children && this.children.length > 0 ? this.children[this.children.length - 1] : null\n }\n },\n textContent: {\n /**\n * Returns null for document nodes.\n * @returns {null}\n */\n get () {\n return null\n }\n }\n})\n\n/**\n * Creates an enhanced Coralite Document Root\n * @param {RawCoraliteComponentRoot} node - The raw document node\n * @returns {CoraliteComponentRoot} The enhanced Coralite Document Root\n */\nexport function createCoraliteComponent (node) {\n makeCircularPropertiesNonEnumerable(node)\n Object.setPrototypeOf(node, CoraliteComponentConstructor.prototype)\n // @ts-ignore\n return node\n}\n", "export const BOOLEAN_ATTRIBUTES = new Set([\n 'allowfullscreen',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'inert',\n 'ismap',\n 'itemscope',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected',\n 'truespeed'\n])\n\nexport const VALID_TAGS = {\n a: true,\n abbr: true,\n acronym: true,\n address: true,\n area: true,\n article: true,\n aside: true,\n audio: true,\n b: true,\n base: true,\n bdi: true,\n bdo: true,\n big: true,\n blockquote: true,\n body: true,\n br: true,\n button: true,\n canvas: true,\n caption: true,\n center: true,\n cite: true,\n code: true,\n col: true,\n colgroup: true,\n data: true,\n datalist: true,\n dd: true,\n del: true,\n details: true,\n dfn: true,\n dialog: true,\n dir: true,\n div: true,\n dl: true,\n dt: true,\n em: true,\n embed: true,\n fencedframe: true,\n fieldset: true,\n figcaption: true,\n figure: true,\n font: true,\n footer: true,\n form: true,\n frame: true,\n frameset: true,\n h1: true,\n h2: true,\n h3: true,\n h4: true,\n h5: true,\n h6: true,\n head: true,\n header: true,\n hgroup: true,\n hr: true,\n html: true,\n i: true,\n iframe: true,\n img: true,\n input: true,\n ins: true,\n kbd: true,\n label: true,\n legend: true,\n li: true,\n link: true,\n main: true,\n map: true,\n mark: true,\n marquee: true,\n menu: true,\n meta: true,\n meter: true,\n nav: true,\n nobr: true,\n noembed: true,\n noframes: true,\n noscript: true,\n object: true,\n ol: true,\n optgroup: true,\n option: true,\n output: true,\n p: true,\n param: true,\n picture: true,\n plaintext: true,\n portal: true,\n pre: true,\n progress: true,\n q: true,\n rb: true,\n rp: true,\n rt: true,\n rtc: true,\n ruby: true,\n s: true,\n samp: true,\n script: true,\n search: true,\n section: true,\n select: true,\n slot: true,\n small: true,\n source: true,\n span: true,\n strike: true,\n strong: true,\n style: true,\n sub: true,\n summary: true,\n sup: true,\n table: true,\n tbody: true,\n td: true,\n template: true,\n textarea: true,\n tfoot: true,\n th: true,\n thead: true,\n time: true,\n title: true,\n tr: true,\n track: true,\n tt: true,\n u: true,\n ul: true,\n var: true,\n video: true,\n wbr: true,\n xmp: true,\n // svg\n svg: true,\n animate: true,\n animatemotion: true,\n animatetransform: true,\n circle: true,\n clippath: true,\n defs: true,\n desc: true,\n ellipse: true,\n feblend: true,\n fecolormatrix: true,\n fecomponenttransfer: true,\n fecomposite: true,\n feconvolvematrix: true,\n fediffuselighting: true,\n fedisplacementmap: true,\n fedistantlight: true,\n fedropshadow: true,\n feflood: true,\n fefunca: true,\n fefuncb: true,\n fefuncg: true,\n fefuncr: true,\n fegaussianblur: true,\n feimage: true,\n femerge: true,\n femergenode: true,\n femorphology: true,\n feoffset: true,\n fepointlight: true,\n fespecularlighting: true,\n fespotlight: true,\n fetile: true,\n feturbulence: true,\n filter: true,\n foreignobject: true,\n g: true,\n image: true,\n line: true,\n lineargradient: true,\n marker: true,\n mask: true,\n metadata: true,\n mpath: true,\n path: true,\n pattern: true,\n polygon: true,\n polyline: true,\n radialgradient: true,\n rect: true,\n set: true,\n stop: true,\n switch: true,\n symbol: true,\n text: true,\n textpath: true,\n tspan: true,\n use: true,\n view: true\n}\n\nexport const RESERVED_ELEMENT_NAMES = {\n 'annotation-xml': true,\n 'color-profile': true,\n 'font-face': true,\n 'font-face-src': true,\n 'font-face-uri': true,\n 'font-face-format': true,\n 'font-face-name': true,\n 'missing-glyph': true\n}\n\nconst CUSTOM_ELEMENT_TAG = /^[a-z](?:[-.\\w\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD])*?-(?:[-.\\w\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD])*$/\n\n/**\n * Validates a custom element name\n * @param {string} name - The custom element name to validate\n * @param {number} [maxLength=100] - Max length of the tag name\n * @returns {boolean} - True if valid, false otherwise\n * @throws {Error} - If the element name is reserved\n */\nexport function isValidCustomElementName (name, maxLength = 100) {\n // Check if string is empty or not a string\n if (!name || typeof name !== 'string') {\n return false\n }\n\n // Check against reserved names first (case-insensitive)\n if (RESERVED_ELEMENT_NAMES[name.toLowerCase()]) {\n throw new Error('Element name is reserved: \"'+ name +'\"')\n }\n\n // Length check to prevent ReDoS\n if (name.length > maxLength) {\n return false\n }\n\n // check for obviously invalid patterns that could cause backtracking\n if (name.includes('--') || name.startsWith('-') || name.endsWith('-')) {\n return false\n }\n\n // Test against the regex\n return CUSTOM_ELEMENT_TAG.test(name)\n}\n", "/**\n * @import { CoraliteCollectionItem, CoraliteComment, CoraliteDirective, CoraliteComponentRoot, CoraliteElement, CoraliteTextNode, CoraliteAnyNode, CoraliteSlotElement } from '../types/index.js'\n */\n\n/**\n * Check if value is a non-null object\n * @param {any} obj - The value to check\n * @returns {boolean} True if the value is a non-null object\n */\nfunction isObject (obj) {\n return typeof obj === 'object' && obj !== null\n}\n\n/**\n * Checks if an object is a CoraliteElement.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteElement} True if the object is a CoraliteElement, false otherwise.\n */\nfunction isCoraliteElement (obj) {\n return isObject(obj) && (obj.type === 'tag' || obj.type === 'script' || obj.type === 'style')\n}\n\n/**\n * Checks if an object is a CoraliteTextNode.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteTextNode} True if the object is a CoraliteTextNode, false otherwise.\n */\nfunction isCoraliteTextNode (obj) {\n return isObject(obj) && obj.type === 'text'\n}\n\n/**\n * Checks if an object is a CoraliteComment.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteComment} True if the object is a CoraliteComment, false otherwise.\n */\nfunction isCoraliteComment (obj) {\n return isObject(obj) && obj.type === 'comment'\n}\n\n/**\n * Checks if an object is a CoraliteDirective.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteDirective} True if the object is a CoraliteDirective, false otherwise.\n */\nfunction isCoraliteDirective (obj) {\n return isObject(obj) && obj.type === 'directive'\n}\n\n/**\n * Checks if an object is a CoraliteComponentRoot.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteComponentRoot} True if the object is a CoraliteComponentRoot, false otherwise.\n */\nfunction isCoraliteComponentRoot (obj) {\n return isObject(obj) && obj.type === 'root'\n}\n\n/**\n * Checks if an object is a CoraliteSlotElement.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteSlotElement} True if the object is a CoraliteSlotElement, false otherwise.\n */\nfunction isCoraliteSlotElement (obj) {\n return isObject(obj) &&\n typeof obj.name === 'string' &&\n isCoraliteElement(obj.element) &&\n (obj.customElement === undefined || isCoraliteElement(obj.customElement))\n}\n\n/**\n * Determines whether the given object is a CoraliteCollectionItem.\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteCollectionItem} True if the object is a CoraliteCollectionItem, false otherwise.\n */\nfunction isCoraliteCollectionItem (obj) {\n return isObject(obj) &&\n 'path' in obj &&\n isObject(obj.path) &&\n typeof obj.path.pathname === 'string'\n}\n\n/**\n * Checks if an object is any Coralite node type (Element, TextNode, Comment, Directive, or DocumentRoot).\n * @param {any} obj - The object to check.\n * @returns {obj is CoraliteAnyNode | CoraliteDirective | CoraliteComponentRoot} True if the object is any Coralite node type.\n */\nfunction isCoraliteNode (obj) {\n return isCoraliteElement(obj) ||\n isCoraliteTextNode(obj) ||\n isCoraliteComment(obj) ||\n isCoraliteDirective(obj) ||\n isCoraliteComponentRoot(obj)\n}\n\n/**\n * Checks if an object has a valid CoraliteElement structure with required state.\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object has valid CoraliteElement structure.\n */\nfunction hasValidElementStructure (obj) {\n return isCoraliteElement(obj) &&\n typeof obj.name === 'string' &&\n isObject(obj.attribs) &&\n Array.isArray(obj.children)\n}\n\n/**\n * Checks if an object has a valid CoraliteTextNode structure with required state.\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object has valid CoraliteTextNode structure.\n */\nfunction hasValidTextNodeStructure (obj) {\n return isCoraliteTextNode(obj) &&\n typeof obj.data === 'string'\n}\n\n/**\n * Checks if an object has a valid CoraliteComment structure with required state.\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object has valid CoraliteComment structure.\n */\nfunction hasValidCommentStructure (obj) {\n return isCoraliteComment(obj) &&\n typeof obj.data === 'string'\n}\n\n/**\n * Safely checks if a value is a valid child node for a CoraliteElement.\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object is a valid child node.\n */\nfunction isValidChildNode (obj) {\n return isCoraliteElement(obj) ||\n isCoraliteTextNode(obj) ||\n isCoraliteComment(obj) ||\n isCoraliteDirective(obj)\n}\n\n/**\n * Checks if an object is a parent node (has children property).\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object has a children property.\n */\nfunction isParentNode (obj) {\n return isObject(obj) && Array.isArray(obj.children)\n}\n\n/**\n * Checks if an object is a removable node (has remove property set to true).\n * @param {any} obj - The object to check.\n * @returns {boolean} True if the object has remove property set to true.\n */\nfunction isRemovableNode (obj) {\n return isObject(obj) && obj.remove === true\n}\n\nexport {\n // Core type guards\n isCoraliteElement,\n isCoraliteTextNode,\n isCoraliteComment,\n isCoraliteDirective,\n isCoraliteComponentRoot,\n isCoraliteSlotElement,\n isCoraliteCollectionItem,\n\n // Utility type guards\n isCoraliteNode,\n\n // Structure validation\n hasValidElementStructure,\n hasValidTextNodeStructure,\n hasValidCommentStructure,\n\n // Node property checks\n isValidChildNode,\n isParentNode,\n isRemovableNode\n}\n", "import { dirname, extname, join } from 'node:path'\nimport { readdir, readFile } from 'node:fs/promises'\nimport { readFileSync } from 'node:fs'\nimport { availableParallelism } from 'node:os'\nimport pLimit from 'p-limit'\nimport CoraliteCollection from './collection.js'\n\n/**\n * @import {\n * CoraliteCollectionEventSet,\n * CoraliteCollectionEventUpdate,\n * CoraliteCollectionEventDelete } from '../types/index.js'\n */\n\n/**\n * Get HTML\n * @param {Object} options - Options for searching HTML files\n * @param {string} options.path - Path to the directory containing HTML files\n * @param {'page' | 'component'} options.type - Document types\n * @param {boolean} [options.recursive=false] - Whether to search recursively in subdirectories\n * @param {string[]} [options.exclude=[]] - Files or directories to exclude from search\n * @param {CoraliteCollectionEventSet} [options.onFileSet]\n * @param {CoraliteCollectionEventUpdate} [options.onFileUpdate]\n * @param {CoraliteCollectionEventDelete} [options.onFileDelete]\n * @param {CoraliteCollection} [options.collection] - Optional collection instance to populate\n * @param {import('p-limit').LimitFunction} [options.limit] - Optional concurrency limiter\n * @param {boolean} [options.discoverOnly=false] - Whether to skip reading file content and only discover paths\n * @returns {Promise<CoraliteCollection>} Array of HTML file data including parent path, name, and content\n *\n * @example\n * // example usage:\n * const htmlFiles = await getHtmlFiles({\n * path: 'src',\n * recursive: true,\n * exclude: ['index.html', 'subdir/file2.html']\n * })\n */\nexport async function getHtmlFiles ({\n path,\n type,\n recursive = false,\n exclude = [],\n discoverOnly = false,\n onFileSet,\n onFileUpdate,\n onFileDelete,\n collection,\n limit\n}) {\n const resultCollection = collection || new CoraliteCollection({\n rootDir: path,\n onSet: onFileSet,\n onUpdate: onFileUpdate,\n onDelete: onFileDelete\n })\n\n if (!limit) {\n limit = pLimit(availableParallelism())\n }\n\n const entries = await readdir(path, { withFileTypes: true })\n const tasks = []\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n\n // Skip hidden files/directories starting with dot\n if (entry.name.startsWith('.')) {\n continue\n }\n\n const pathname = join(entry.parentPath, entry.name)\n\n // Calculate relative path from root for exclusion checking\n const relativePath = pathname.replace(path + '/', '')\n\n // Check if entry should be excluded by: name, relative path, or full path\n const shouldExclude = exclude.includes(entry.name) ||\n exclude.includes(relativePath) ||\n exclude.includes(pathname) ||\n exclude.some(excludePath => {\n // Handle directory-based exclusions\n const excludeDir = excludePath.endsWith('/') ? excludePath.slice(0, -1) : excludePath\n return relativePath.startsWith(excludeDir + '/')\n })\n\n if (shouldExclude) {\n continue\n }\n\n if (entry.isDirectory() && recursive) {\n tasks.push(getHtmlFiles({\n path: pathname,\n type,\n recursive,\n exclude,\n discoverOnly,\n onFileSet,\n onFileUpdate,\n onFileDelete,\n collection: resultCollection,\n limit\n }))\n } else if (entry.isFile() && extname(entry.name).toLowerCase() === '.html') {\n tasks.push(limit(async () => {\n const content = discoverOnly ? undefined : await readFile(pathname, { encoding: 'utf8' })\n\n await resultCollection.setItem({\n type,\n content,\n physical: true,\n path: {\n pathname: pathname,\n filename: entry.name,\n dirname: dirname(pathname)\n }\n })\n }))\n }\n }\n\n await Promise.all(tasks)\n\n return resultCollection\n}\n\n/**\n * Generator that yields HTML files found in a directory.\n * Useful for lazy discovery and memory-efficient processing of many files.\n *\n * @param {Object} options - Options for searching HTML files\n * @param {string} options.path - Path to the directory containing HTML files\n * @param {'page' | 'component'} options.type - Document types\n * @param {boolean} [options.recursive=false] - Whether to search recursively\n * @param {string[]} [options.exclude=[]] - Files or directories to exclude\n * @param {boolean} [options.discoverOnly=false] - Whether to skip reading file content\n * @yields {Promise<{ type: 'page' | 'component', content: string | undefined, path: { pathname: string, filename: string, dirname: string } }>}\n */\nexport async function* discoverHtmlFiles ({\n path,\n type,\n recursive = false,\n exclude = [],\n discoverOnly = false\n}) {\n const entries = await readdir(path, { withFileTypes: true })\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n\n if (entry.name.startsWith('.')) {\n continue\n }\n\n const pathname = join(entry.parentPath, entry.name)\n const relativePath = pathname.replace(path + '/', '')\n\n const shouldExclude = exclude.includes(entry.name) ||\n exclude.includes(relativePath) ||\n exclude.includes(pathname) ||\n exclude.some(excludePath => {\n const excludeDir = excludePath.endsWith('/') ? excludePath.slice(0, -1) : excludePath\n return relativePath.startsWith(excludeDir + '/')\n })\n\n if (shouldExclude) {\n continue\n }\n\n if (entry.isDirectory() && recursive) {\n yield* discoverHtmlFiles({\n path: pathname,\n type,\n recursive,\n exclude,\n discoverOnly\n })\n } else if (entry.isFile() && extname(entry.name).toLowerCase() === '.html') {\n const content = discoverOnly ? undefined : await readFile(pathname, { encoding: 'utf8' })\n\n yield {\n type,\n content,\n physical: true,\n path: {\n pathname: pathname,\n filename: entry.name,\n dirname: dirname(pathname)\n }\n }\n }\n }\n}\n\n/**\n * Reads an HTML file and returns its content as a string.\n * @param {string} pathname - The path to the HTML file.\n * @throws {Error} If the file cannot be read.\n */\nexport function getHtmlFileSync (pathname) {\n try {\n const extension = extname(pathname).toLowerCase()\n\n if (extension === '.html') {\n return readFileSync(pathname, 'utf8')\n }\n\n throw new Error('Unexpected filename extension \"' + extension +'\"')\n } catch (err) {\n throw err\n }\n}\n\n/**\n * Reads an HTML file and returns its content as a string.\n * @param {string} pathname - The path to the HTML file.\n * @throws {Error} If the file cannot be read.\n */\nexport async function getHtmlFile (pathname) {\n try {\n const extension = extname(pathname).toLowerCase()\n\n if (extension === '.html') {\n return await readFile(pathname, 'utf8')\n }\n\n throw new Error('Unexpected filename extension \"' + extension +'\"')\n } catch (err) {\n throw err\n }\n}\n", "import path from 'node:path'\nimport { getHtmlFile } from './html.js'\nimport { access } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\n\n/**\n * @import {\n * CoraliteCollectionEventDelete,\n * CoraliteCollectionEventSet,\n * CoraliteCollectionEventUpdate,\n * CoraliteCollectionItem,\n * HTMLData } from '../types/index.js'\n */\n\n/**\n * Represents a collection of documents with methods to organize and retrieve them.\n * Maintains three views: flat list, path-based grouping, and ID lookup.\n * @class\n * @param {Object} [options={}] - Options for configuring the collection\n * @param {string} [options.rootDir=''] - The root directory path for the collection\n * @param {CoraliteCollectionEventSet} [options.onSet] - Event handler for when documents are set\n * @param {CoraliteCollectionEventUpdate} [options.onUpdate] - Event handler for when documents are updated\n * @param {CoraliteCollectionEventDelete} [options.onDelete] - Event handler for when documents are deleted\n */\nfunction CoraliteCollection (options = { rootDir: '' }) {\n /**\n * Root directory where collection items are located\n */\n this.rootDir = path.join(options.rootDir)\n\n if (!existsSync(this.rootDir)) {\n throw new Error('Root directory was not found: ' + this.rootDir)\n }\n\n /**\n * An array of HTMLData objects representing the list of documents.\n * @type {CoraliteCollectionItem[]}\n */\n this.list = []\n\n /**\n * An object mapping paths to arrays of HTMLData objects.\n * Used for grouping documents by their file path.\n * @type {Object.<string, CoraliteCollectionItem[]>}\n */\n this.listByPath = Object.create(null)\n\n /**\n * An object mapping unique identifiers to HTMLData objects.\n * Used for quick lookup of documents by their identifier.\n * @type {Object.<string, CoraliteCollectionItem>}\n */\n this.collection = Object.create(null)\n\n /**\n * Callback triggered when setting a new item\n * @type {CoraliteCollectionEventSet | undefined}\n */\n this._onSet = options.onSet\n\n /**\n * Callback triggered when updating an existing item\n * @type {CoraliteCollectionEventUpdate | undefined}\n */\n this._onUpdate = options.onUpdate\n\n /**\n * Callback triggered when deleting an item\n * @type {CoraliteCollectionEventDelete | undefined}\n */\n this._onDelete = options.onDelete\n}\n\n/**\n * Adds or updates an HTMLData object in the collection and associated lists.\n * If the item already exists, it will be updated in all views.\n * @param {HTMLData|string} value - The HTMLData object to be added or updated.\n * @returns {Promise<CoraliteCollectionItem>} The modified document\n */\nCoraliteCollection.prototype.setItem = async function (value) {\n if (typeof value === 'string') {\n value = await this._loadByPath(value)\n }\n\n if (!value || !value.path) {\n throw new Error('Valid HTMLData object must be provided')\n }\n\n const pathname = value.path.pathname\n const dirname = value.path.dirname\n const originalValue = this.collection[pathname]\n\n /** @type {CoraliteCollectionItem} */\n const documentValue = value\n\n if (!originalValue) {\n // handle pre-set hook if defined\n if (typeof this._onSet === 'function') {\n const result = await this._onSet(value)\n\n // abort adding item\n if (!result) {\n return\n }\n\n documentValue.result = result.value\n\n if (result.state) {\n documentValue.state = result.state\n }\n\n if (result.type === 'page' || result.type === 'component') {\n documentValue.type = result.type\n }\n\n // update collection using ID from hook result if available\n if (typeof result.id === 'string' && result.id) {\n this.collection[result.id] = documentValue\n }\n }\n\n // always update the collection with current pathname\n this.collection[pathname] = documentValue\n\n // initialize directory list if it doesn't exist\n if (!this.listByPath[dirname]) {\n this.listByPath[dirname] = []\n }\n\n // add to both directory-specific and general lists\n // check if already added to avoid duplicates\n if (!this.listByPath[dirname].includes(documentValue)) {\n this.listByPath[dirname].push(documentValue)\n }\n if (!this.list.includes(documentValue)) {\n this.list.push(documentValue)\n }\n } else {\n return await this.updateItem(value)\n }\n\n return documentValue\n}\n\n/**\n * Removes an HTMLData object from the collection and associated lists.\n * Accepts either an HTMLData object or a pathname string.\n * @param {HTMLData | string} value - The HTMLData object or a pathname to be removed.\n * @throws {Error} If invalid input is provided\n */\nCoraliteCollection.prototype.deleteItem = async function (value) {\n if (!value) {\n throw new Error('Valid pathname must be provided')\n }\n\n let pathname\n let dirname\n let valuesByPath\n let originalValue\n\n if (typeof value !== 'string' && value.path) {\n // if the input is an HTMLData object, extract its pathname and directory name\n pathname = value.path.pathname\n dirname = value.path.dirname\n valuesByPath = this.listByPath[dirname]\n originalValue = value\n } else if (typeof value === 'string') {\n // if the input is a string, use it as the pathname and determine the directory name\n pathname = value\n dirname = path.dirname(pathname)\n valuesByPath = this.listByPath[dirname]\n originalValue = this.collection[pathname]\n } else {\n throw new Error('Valid pathname must be provided')\n }\n\n if (!originalValue) {\n // item not found, nothing to delete\n return\n }\n\n if (!valuesByPath) {\n // directory list doesn't exist, but we still need to clean up collection\n // This can happen if the item was stored under a different ID\n for (const key in this.collection) {\n if (this.collection[key] === originalValue) {\n delete this.collection[key]\n }\n }\n return\n }\n\n if (typeof this._onDelete === 'function') {\n await this._onDelete(originalValue)\n }\n\n // remove the document from the collection\n // also check if it's stored under a different ID (from hook result)\n for (const key in this.collection) {\n if (this.collection[key] === originalValue) {\n delete this.collection[key]\n }\n }\n\n // find and remove the document from the list and by-path grouping\n const listIndex = this.list.indexOf(originalValue)\n const pathIndex = valuesByPath.indexOf(originalValue)\n\n if (listIndex !== -1) {\n this.list.splice(listIndex, 1)\n }\n if (pathIndex !== -1) {\n valuesByPath.splice(pathIndex, 1)\n }\n\n // clean up empty directory arrays\n if (valuesByPath.length === 0) {\n delete this.listByPath[dirname]\n }\n}\n\n/**\n * Updates an existing HTMLData object in the collection.\n * If the document does not exist, it will be added using the set method.\n * @param {CoraliteCollectionItem|string} value - The HTMLData object to be updated or added.\n * @throws {Error} If invalid input is provided\n */\nCoraliteCollection.prototype.updateItem = async function (value) {\n if (typeof value === 'string') {\n value = await this._loadByPath(value)\n }\n\n if (!value || !value.path) {\n throw new Error('Valid HTMLData object must be provided')\n }\n\n const pathname = value.path.pathname\n const originalValue = this.collection[pathname]\n\n if (!originalValue) {\n // if the document does not exist, add it using the set method\n return await this.setItem(value)\n }\n\n if (typeof this._onUpdate === 'function') {\n const result = await this._onUpdate(value, originalValue)\n\n // abort update\n if (!result) {\n return originalValue\n }\n\n // handle callback result\n if (result && typeof result === 'object') {\n // if result has a value property, use it\n if (result.value !== undefined) {\n originalValue.result = result.value\n } else {\n originalValue.result = result\n }\n\n // update type if provided\n if (result.type === 'page' || result.type === 'component') {\n originalValue.type = result.type\n }\n } else {\n originalValue.result = result\n }\n }\n\n // update core state\n if (value.content !== undefined) {\n originalValue.content = value.content\n }\n\n // update path information if it changed\n if (value.path && value.path !== originalValue.path) {\n originalValue.path = value.path\n }\n\n // update type if explicitly set\n if (value.type) {\n originalValue.type = value.type\n }\n\n // update any additional state\n if (value.state !== undefined) {\n originalValue.state = value.state\n }\n\n return originalValue\n}\n\n/**\n * Retrieves an item by its unique identifier\n * @param {string} id - Unique identifier of the item\n * @returns {CoraliteCollectionItem | undefined} The found item or undefined\n */\nCoraliteCollection.prototype.getItem = function (id) {\n if (!this.collection[id] && id.endsWith('html')) {\n id = path.join(this.rootDir, id)\n }\n\n return this.collection[id]\n}\n\n/**\n * Retrieves a list of items grouped by directory path\n * @param {string} dirname - Directory name to look up\n * @returns {CoraliteCollectionItem[] | undefined} A copy of the item list or undefined\n */\nCoraliteCollection.prototype.getListByPath = function (dirname) {\n const list = this.listByPath[dirname]\n\n if (list) {\n return list.slice()\n }\n}\n\n/**\n * Loads a collection item by its file path.\n *\n * @param {string} filepath - The path to the collection item file\n * @returns {Promise<HTMLData>} A promise that resolves to the loaded item object\n * @throws {Error} If the file cannot be found at either the provided path or within the root directory\n */\nCoraliteCollection.prototype._loadByPath = async function (filepath) {\n try {\n await access(filepath)\n } catch {\n try {\n filepath = path.join(this.rootDir, filepath)\n\n await access(filepath)\n } catch {\n throw new Error('Could not find collection item: ' + filepath)\n }\n }\n\n const content = await getHtmlFile(filepath)\n\n return {\n type: 'page',\n content,\n path: {\n pathname: filepath,\n dirname: path.dirname(filepath),\n filename: path.basename(filepath)\n }\n }\n}\n\nexport default CoraliteCollection\n", "import { createCoraliteElement, createCoraliteTextNode } from './dom.js'\n\n/**\n * @import {\n * CoraliteElement,\n * CoraliteComponentRoot,\n * CoraliteCollectionItem\n * } from '../types/index.js'\n */\n\n/**\n * @import CoraliteCollection from './collection.js'\n */\n\n/**\n * Finds the <head> and <body> elements within the HTML AST.\n *\n * @param {CoraliteComponentRoot} root - The root of the AST.\n * @returns {{ head: CoraliteElement | null, body: CoraliteElement | CoraliteComponentRoot }}\n */\nexport function findHeadAndBody (root) {\n let head = null\n /** @type {CoraliteElement | CoraliteComponentRoot} */\n let body = root\n\n for (let i = 0; i < root.children.length; i++) {\n const rootNode = root.children[i]\n\n if (rootNode.type === 'tag' && rootNode.name === 'html') {\n for (let j = 0; j < rootNode.children.length; j++) {\n const node = rootNode.children[j]\n\n if (node.type === 'tag' && node.name === 'head') {\n head = node\n }\n if (node.type === 'tag' && node.name === 'body') {\n body = node\n }\n }\n break\n }\n }\n\n return {\n head,\n body\n }\n}\n\n/**\n * Injects external global style link tags into the document head (or root if head is missing).\n *\n * @param {CoraliteComponentRoot} root - The root of the AST.\n * @param {CoraliteElement | null} head - The head element.\n * @param {string[]} styles - Array of style URLs.\n */\nexport function injectExternalStyles (root, head, styles) {\n if (!styles || styles.length === 0) {\n return\n }\n\n const existingLinks = new Set()\n if (head) {\n head.children.forEach(child => {\n if (child.type === 'tag' && child.name === 'link' && child.attribs?.href) {\n existingLinks.add(child.attribs.href)\n }\n })\n }\n\n for (let i = 0; i < styles.length; i++) {\n const styleUrl = styles[i]\n\n if (existingLinks.has(styleUrl)) {\n continue\n }\n\n const linkElement = createCoraliteElement({\n type: 'tag',\n name: 'link',\n parent: head || root,\n attribs: {\n rel: 'stylesheet',\n href: styleUrl\n },\n children: []\n })\n\n if (head) {\n head.children.push(linkElement)\n } else {\n root.children.unshift(linkElement)\n }\n }\n}\n\n/**\n * Injects style tags into the document head (or root if head is missing).\n *\n * @param {CoraliteComponentRoot} root - The root of the AST.\n * @param {CoraliteElement | null} head - The head element.\n * @param {Map<string, string>} styles - Map of style selectors and their CSS content.\n */\nexport function injectStyles (root, head, styles) {\n if (!styles || styles.size === 0) {\n return\n }\n\n let cssContent = ''\n for (const [selector, css] of styles) {\n cssContent += `[data-style-selector=\"${selector}\"] {\\n${css}\\n}\\n`\n }\n\n const styleElement = createCoraliteElement({\n type: 'tag',\n name: 'style',\n parent: head || root,\n attribs: {},\n children: []\n })\n\n styleElement.children.push(createCoraliteTextNode({\n type: 'text',\n data: cssContent,\n parent: styleElement\n }))\n\n if (head) {\n head.children.push(styleElement)\n } else {\n root.children.unshift(styleElement)\n }\n}\n\n/**\n * Injects the readiness script into the document head (or root if head is missing).\n *\n * @param {CoraliteComponentRoot} root - The root of the AST.\n * @param {CoraliteElement | null} head - The head element.\n * @param {boolean} hasScripts - Whether the page has scripts to wait for.\n */\nexport function injectReadinessScript (root, head, hasScripts) {\n const readinessScriptElement = createCoraliteElement({\n type: 'tag',\n name: 'script',\n parent: head || root,\n attribs: {},\n children: []\n })\n\n const data = hasScripts\n ? 'window.__coralite_ready__ = new Promise(resolve => { window.__coralite_resolve_ready__ = resolve; });'\n : 'window.__coralite_ready__ = Promise.resolve(); window.__coralite_resolve_ready__ = () => {};'\n\n readinessScriptElement.children.push(createCoraliteTextNode({\n type: 'text',\n data,\n parent: readinessScriptElement\n }))\n\n if (head) {\n head.children.unshift(readinessScriptElement)\n } else {\n root.children.unshift(readinessScriptElement)\n }\n}\n\n/**\n * Injects an import map into the document head (or root if head is missing).\n *\n * @param {CoraliteComponentRoot} root - The root of the AST.\n * @param {CoraliteElement | null} head - The head element.\n * @param {Object} importMap - The import map object.\n */\nexport function injectImportMap (root, head, importMap) {\n if (!importMap || Object.keys(importMap).length === 0) {\n return\n }\n\n const importMapElement = createCoraliteElement({\n type: 'tag',\n name: 'script',\n parent: head || root,\n attribs: {\n type: 'importmap'\n },\n children: []\n })\n\n importMapElement.children.push(createCoraliteTextNode({\n type: 'text',\n data: JSON.stringify({ imports: importMap }),\n parent: importMapElement\n }))\n\n if (head) {\n head.children.push(importMapElement)\n } else {\n root.children.unshift(importMapElement)\n }\n}\n\n/**\n * Removes temporary and skip-render elements from the AST.\n *\n * @param {CoraliteElement[]} elements - The elements to remove.\n * @param {boolean} [matchInstance=true] - Whether to match by identity (true) or by 'remove' property (false).\n */\nexport function removeElements (elements, matchInstance = true) {\n if (!elements || elements.length === 0) {\n return\n }\n\n if (matchInstance) {\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i]\n if (element.parent && element.parent.children) {\n element.parent.children = element.parent.children.filter(child => child !== element)\n }\n }\n } else {\n // Optimization: collect unique parents and filter children only once per parent\n const parents = new Set()\n for (let i = 0; i < elements.length; i++) {\n if (elements[i].parent) {\n parents.add(elements[i].parent)\n }\n }\n\n for (const parent of parents) {\n if (parent.children) {\n parent.children = parent.children.filter(child => !child.remove)\n }\n }\n }\n}\n\n/**\n * Resolves the initial queue of pages to be generated.\n *\n * @param {CoraliteCollection} pagesCollection - The collection of pages.\n * @param {string | string[]} [path] - The path(s) to include.\n * @returns {CoraliteCollectionItem[]}\n */\nexport function resolvePageQueue (pagesCollection, path) {\n let queue = []\n\n if (Array.isArray(path)) {\n const uniquePaths = new Set(path)\n for (const p of uniquePaths) {\n const result = pagesCollection.getListByPath(p) || pagesCollection.getItem(p)\n if (result) {\n if (Array.isArray(result)) {\n queue = queue.concat(result)\n } else {\n queue.push(result)\n }\n }\n }\n } else if (typeof path === 'string') {\n const result = pagesCollection.getListByPath(path) || pagesCollection.getItem(path)\n if (result) {\n if (Array.isArray(result)) {\n queue = queue.concat(result)\n } else {\n queue.push(result)\n }\n }\n } else {\n queue = pagesCollection.list.slice()\n }\n\n return queue\n}\n", "/**\n * @import { InstanceContext } from '../types/index.js'\n */\n\n/**\n * Generates the client-side runtime script for Coralite pages.\n *\n * @param {Object} options\n * @param {string} options.base - The base URL for assets.\n * @param {string} options.sharedChunkPath - The filename of the shared chunk.\n * @param {Object} options.chunkManifest - Manifest mapping component IDs to their chunk filenames.\n * @param {string[]} [options.declarativeTags=[]] - The declarative tags used.\n * @returns {string} The generated JavaScript runtime.\n */\nexport function generateClientRuntime ({\n base,\n sharedChunkPath,\n chunkManifest,\n declarativeTags = []\n}) {\n return `\nimport { getClientContext, getSetups, createCoraliteClass, globalClientHooks } from '${base}assets/js/${sharedChunkPath}';\n\n(async () => {\n if (!window.__coralite_ready__) {\n window.__coralite_ready__ = new Promise(resolve => { window.__coralite_resolve_ready__ = resolve; });\n }\n globalThis.executableScripts = [];\n globalThis.globalAbortController = new AbortController();\n\n const componentManifest = ${JSON.stringify(chunkManifest)};\n const loadCache = {};\n\n const loadComponent = (componentId) => {\n if (!componentManifest[componentId]) return Promise.resolve();\n if (customElements.get(componentId)) return Promise.resolve();\n if (loadCache[componentId]) return loadCache[componentId];\n\n loadCache[componentId] = (async () => {\n const module = await import('${base}assets/js/' + componentManifest[componentId]);\n if (module.default && module.default.componentId) {\n if (!customElements.get(module.default.componentId)) {\n customElements.define(module.default.componentId, createCoraliteClass(module.default, getClientContext, globalClientHooks));\n }\n }\n })();\n return loadCache[componentId];\n };\n\n const declarativeTags = ${JSON.stringify(declarativeTags)};\n const allTags = Object.keys(componentManifest);\n const imperativeTags = allTags.filter(tag => !declarativeTags.includes(tag));\n\n const loadPromises = declarativeTags.map(tagName => loadComponent(tagName));\n await Promise.all(loadPromises);\n\n if (typeof window.__coralite_resolve_ready__ === 'function') {\n window.__coralite_resolve_ready__();\n }\n\n if (imperativeTags.length > 0) {\n const lazyLoad = () => imperativeTags.forEach(tagName => loadComponent(tagName));\n \n if ('requestIdleCallback' in window) {\n requestIdleCallback(lazyLoad, { timeout: 500 });\n } else {\n setTimeout(lazyLoad, 1);\n }\n }\n})();\n`.trim()\n}\n", "import postcss from 'postcss'\nimport selectorParser from 'postcss-selector-parser'\n\n/**\n * Transforms CSS to automatically apply `&.` prefix to classes present on the root element.\n * @param {string} css - The CSS content\n * @param {Set<string>} rootClasses - Set of classes found on the root element\n * @param {Set<string>} descendantClasses - Set of classes found on descendant elements\n * @param {import('../types/index.js').CoraliteOnError} [onError] - Error handler\n * @returns {Promise<string>} Transformed CSS\n */\nexport async function transformCss (css, rootClasses, descendantClasses, onError) {\n const processor = postcss([\n {\n postcssPlugin: 'coralite-style-transform',\n Rule (rule) {\n // Only process top-level rules or rules directly inside @media/@supports etc.\n // Ignore rules nested inside other rules (standard CSS nesting behavior)\n if (rule.parent.type === 'rule') {\n return\n }\n\n const transformSelector = selectorParser((root) => {\n // Iterate over a static list to avoid infinite loops with insertions\n const selectors = []\n root.each(selector => {\n selectors.push(selector)\n })\n\n selectors.forEach((selector) => {\n // We only care about Selector nodes\n if (selector.type !== 'selector') {\n return\n }\n\n const firstNode = selector.first\n\n // Skip if empty or already nested\n if (!firstNode) {\n return\n }\n if (firstNode.type === 'nesting') {\n return\n }\n\n // Check if first node is a class\n if (firstNode.type === 'class') {\n const className = firstNode.value\n const isRoot = rootClasses.has(className)\n const isDescendant = descendantClasses.has(className)\n\n if (isRoot) {\n if (isDescendant) {\n // Transform to: &.classname, .classname\n // Clone first (creates the descendant version)\n const descendantSelector = selector.clone()\n\n // Modify the original to be root version (&.classname)\n const nesting = selectorParser.nesting()\n selector.insertBefore(firstNode, nesting)\n\n // Append the descendant selector to the parent Container\n root.insertAfter(selector, descendantSelector)\n } else {\n // Transform to: &.classname\n const nesting = selectorParser.nesting()\n selector.insertBefore(firstNode, nesting)\n }\n }\n }\n })\n })\n\n try {\n // @ts-ignore\n transformSelector.processSync(rule, { updateSelector: true })\n } catch (error) {\n const message = 'Error parsing selector: ' + rule.selector\n if (typeof onError === 'function') {\n onError({\n level: 'ERR',\n message,\n error\n })\n } else {\n console.error(message, error)\n }\n }\n }\n }\n ])\n\n const result = await processor.process(css, { from: undefined })\n return result.css\n}\n", "import { build } from 'esbuild'\nimport serialize from 'serialize-javascript'\nimport { parse as parseJS } from 'acorn'\nimport { simple as walkJS } from 'acorn-walk'\nimport { normalizeFunction, normalizeObjectFunctions, hasObjectKeys, mergeUniqueObjects, findAndExtractImperativeComponents, astTransformer, addComponentAndDependencies, cleanAST, cleanValues, generateHydrationMap } from './utils.js'\nimport { pathToFileURL, fileURLToPath } from 'node:url'\nimport { resolve, parse, dirname, relative } from 'node:path'\nimport { nodeModulesPolyfillPlugin } from 'esbuild-plugins-node-modules-polyfill'\nimport render from 'dom-serializer'\n\n/**\n * Script Manager for Coralite\n * Manages shared functions across component instances and provides plugin extensibility\n * @import {ScriptPlugin, InstanceContext} from '../types/index.js'\n */\n\n/**\n * ScriptManager constructor function\n * @class\n */\nexport function ScriptManager (options = {}) {\n this.sharedFunctions = Object.create(null)\n this.contextProps = Object.create(null)\n this.plugins = []\n this.scriptModules = []\n this.options = options\n}\n\n/**\n * Register a plugin\n * @param {ScriptPlugin} plugin - Plugin object or setup function\n * @returns {Promise<ScriptManager>} - Returns this for method chaining\n */\nScriptManager.prototype.use = async function (plugin) {\n // Register script modules (client plugins)\n if (\n plugin\n && typeof plugin !== 'function'\n ) {\n if (plugin.context\n || typeof plugin.setup === 'function'\n || typeof plugin.onBeforeComponentRender === 'function'\n || typeof plugin.onAfterComponentRender === 'function'\n || typeof plugin.onDisconnected === 'function') {\n this.scriptModules.push(plugin)\n\n if (plugin.context) {\n let extractedComponents = []\n for (const key in plugin.context) {\n if (Object.hasOwn(plugin.context, key)) {\n const contextFn = plugin.context[key]\n const contextStr = typeof contextFn === 'function' ? `(${contextFn.toString()})` : serialize(contextFn)\n const foundComponents = findAndExtractImperativeComponents(contextStr)\n extractedComponents = extractedComponents.concat(foundComponents)\n }\n }\n if (extractedComponents.length > 0) {\n plugin._extractedComponents = Array.from(new Set(extractedComponents))\n }\n }\n }\n }\n\n this.plugins.push(plugin)\n return this\n}\n\n/**\n * Get context object content string\n * @returns {string} String containing all context as object state\n */\nScriptManager.prototype.getClientContextContent = function () {\n let contextPropsStr = ''\n\n for (const [key, value] of Object.entries(this.contextProps)) {\n contextPropsStr += `\"${key}\": async (globalContext) => {\n const phase1 = ${value};\n const phase2 = await phase1(globalContext);\n return (localContext) => phase2(localContext);\n },`\n }\n\n return contextPropsStr\n}\n\n/**\n * Add a context property function\n * @param {string} name - Property name\n * @param {function} method - The property function\n * @returns {Promise<ScriptManager>} - Returns this for method chaining\n */\nScriptManager.prototype.addContextProp = async function (name, method) {\n this.contextProps[name] = normalizeFunction(method)\n\n return this\n}\n\n/**\n * Register shared functions for a component\n * @param {Object} options\n * @param {string} options.id - component identifier\n * @param {import('../types/script.js').ScriptContent} [options.script={}] - Script content or function\n * @param {string} [options.filePath] - The source file path to map back to\n * @param {Array<Object>|null} [options.templateAST=null] - Parsed HTML template AST for the client side rendering\n * @param {Object|null} [options.templateValues=null] - Token positions for AST updates\n * @param {Object} [options.defaultValues={}] - Initial default state from setup()\n * @param {Object} [options.getters={}] - Component getters\n * @param {string} [options.styles=''] - Raw CSS string for the component\n * @param {Object.<string, Function>} [options.slots={}] - Computed slots\n */\nScriptManager.prototype.registerComponent = function ({\n id,\n script = {},\n filePath,\n templateAST = null,\n templateValues = null,\n defaultValues = {},\n getters = {},\n styles = '',\n slots = {}\n}) {\n // Initialize base object if it's the first time we are seeing this ID\n if (!this.sharedFunctions[id]) {\n this.sharedFunctions[id] = {\n id,\n components: [],\n filePath: `/component-${id}.js`\n }\n }\n\n const target = this.sharedFunctions[id]\n\n if (hasObjectKeys(script)) {\n target.script = script\n }\n\n if (hasObjectKeys(getters)) {\n if (target.getters) {\n target.getters = {\n ...target.getters,\n ...getters\n }\n } else {\n target.getters = getters\n }\n }\n\n if (templateAST) {\n target.templateAST = templateAST\n }\n\n if (templateValues) {\n target.templateValues = templateValues\n }\n\n if (styles) {\n target.styles = styles\n }\n\n if (filePath) {\n target.filePath = resolve(filePath)\n }\n\n\n if (hasObjectKeys(defaultValues)) {\n if (target.defaultValues) {\n target.defaultValues = {\n ...target.defaultValues,\n ...defaultValues\n }\n } else {\n target.defaultValues = defaultValues\n }\n }\n\n if (hasObjectKeys(slots)) {\n if (target.slots) {\n target.slots = {\n ...target.slots,\n ...slots\n }\n } else {\n target.slots = slots\n }\n }\n\n if (script) {\n if (script.components?.length) {\n target.components = mergeUniqueObjects(target.components, script.components)\n }\n }\n}\n\n/**\n * Generate instance-specific script wrapper\n * @param {string} id - component identifier\n * @param {InstanceContext} instanceContext - Instance context\n * @returns {string} Generated script\n */\nScriptManager.prototype.generateInstanceWrapper = function (id, instanceContext) {\n const state = instanceContext.state ? serialize(instanceContext.state) : '{}'\n const page = instanceContext.page ? serialize(instanceContext.page) : '{}'\n\n // Generate wrapper that calls shared functions with instance context\n return `await coraliteComponentFunctions[\"${id}\"]({\n state: ${state},\n page: ${page},\n ...pluginContexts,\n instanceId: '${instanceContext.instanceId}'\n });`\n}\n\n/**\n * Compile all instances for a component\n * @param {Object.<string, InstanceContext>} instances - Map of instanceId -> instance data\n * @param {string} mode - Build mode\n * @returns {Promise<any>} Compiled script\n */\nScriptManager.prototype.compileAllInstances = async function (instances, mode) {\n const entryCodeParts = []\n const moduleNamespace = 'coralite-script-module:'\n // Generate ESM imports for each script module\n for (let i = 0; i < this.scriptModules.length; i++) {\n entryCodeParts.push(`import { clientContextProps as clientContextProps_${i}, runSetup as runSetup_${i}, onBeforeComponentRender as onBeforeComponentRender_${i}, onAfterComponentRender as onAfterComponentRender_${i}, onDisconnected as onDisconnected_${i} } from \"${moduleNamespace}${i}\";\\n`)\n }\n\n // Setup client context state\n const contextParts = [\n ...this.scriptModules.map((_, i) => `...clientContextProps_${i}`),\n this.getClientContextContent()\n ].filter(Boolean).join(',\\n')\n\n entryCodeParts.push(`const coraliteComponentClientContextProps = {\n ${contextParts}\n };\\n`)\n\n entryCodeParts.push(`const getSetups = async (context) => {\n const state = {};\n const results = await Promise.all([\n ${this.scriptModules.map((_, i) => `runSetup_${i}(context)`).join(',\\n ')}\n ]);\n for (const result of results) {\n if (result && typeof result === 'object') {\n Object.assign(state, result);\n }\n }\n return state;\n }\\n`)\n\n // Global setups initialization\n entryCodeParts.push(`const globalContext = { values: {} };\\n`)\n entryCodeParts.push(`const globalSetupPropertiesPromise = getSetups(globalContext).then(setupValues => {\n Object.assign(globalContext.values, setupValues);\n return setupValues;\n });\\n`)\n\n entryCodeParts.push(`const resolvedContextPropsPromise = globalSetupPropertiesPromise.then(async () => {\n const resolvedProps = {};\n for (const [key, propFn] of Object.entries(coraliteComponentClientContextProps)) {\n resolvedProps[key] = await propFn(globalContext);\n }\n return resolvedProps;\n });\\n`)\n\n entryCodeParts.push(`const getClientContext = async (context) => {\n const clientContextProps = {}\n const resolvedProps = await resolvedContextPropsPromise;\n for (const [key, resolvedProp] of Object.entries(resolvedProps)) {\n clientContextProps[key] = resolvedProp(context)\n }\n return clientContextProps\n }\\n`)\n\n const instanceValues = Object.entries(instances)\n // Collect unique components\n /** @type {Record<string, boolean>} */\n const processedComponent = {}\n\n for (const instanceData of instanceValues) {\n addComponentAndDependencies(instanceData[1].componentId, processedComponent, this.sharedFunctions)\n }\n\n // Add plugin dependencies explicitly if they are standalone\n for (const plugin of this.plugins) {\n if (plugin && plugin._extractedComponents && Array.isArray(plugin._extractedComponents)) {\n for (const compPath of plugin._extractedComponents) {\n for (const [id, fnData] of Object.entries(this.sharedFunctions)) {\n if (compPath.endsWith(`/${id}.html`) || compPath.endsWith(`\\\\${id}.html`) || compPath === id || compPath.endsWith(`/${id}`)) {\n addComponentAndDependencies(id, processedComponent, this.sharedFunctions)\n }\n }\n }\n }\n }\n\n // Force inclusion of all components that evaluate something inside\n // This is required because if a parent is ONLY instantiated via script dynamically,\n // it might not be in instances or plugin explicit references.\n for (const [componentId, fnData] of Object.entries(this.sharedFunctions)) {\n // \"forcing all imperative components into the final chunks bundle, is fine, but it must not include the children of the imperative components since the imperative should load its own dependent components.\"\n if (fnData.script && fnData.script.content) {\n const scriptContent = fnData.script.content.replace(/\\s+/g, '')\n if (scriptContent !== 'function(){}') {\n processedComponent[componentId] = true\n }\n } else if (fnData.script && fnData.script.components && fnData.script.components.length > 0) {\n processedComponent[componentId] = true\n } else if (hasObjectKeys(fnData.defaultValues)) {\n processedComponent[componentId] = true\n }\n }\n\n const processedComponentKeys = Object.keys(processedComponent).sort()\n const regex = /[-.:]/g\n const namespace = 'coralite-component:'\n const componentImportsNamespace = 'coralite-component-imports:'\n\n // Generate ESM imports for each component script\n for (const componentId of processedComponentKeys) {\n if (this.sharedFunctions[componentId]) {\n const safeId = componentId.replace(regex, '_')\n entryCodeParts.push(`import component_${safeId} from \"${namespace}${componentId}\";\\n`)\n }\n }\n\n // Map imports to the functions object\n entryCodeParts.push('const coraliteComponentFunctions = {\\n')\n for (const componentId of processedComponentKeys) {\n if (this.sharedFunctions[componentId]) {\n entryCodeParts.push(` \"${componentId}\": component_${componentId.replace(regex, '_')},\\n`)\n }\n }\n entryCodeParts.push('};\\n')\n\n entryCodeParts.push('const coraliteComponentDefaults = {\\n')\n for (const key of processedComponentKeys) {\n if (this.sharedFunctions[key] && this.sharedFunctions[key].defaultValues) {\n const normalizedDefaults = normalizeObjectFunctions(this.sharedFunctions[key].defaultValues, astTransformer)\n\n entryCodeParts.push(` \"${key}\": (() => {\\n`)\n entryCodeParts.push(` const defaults = ${serialize(normalizedDefaults)};\\n`)\n entryCodeParts.push(` return defaults;\\n`)\n entryCodeParts.push(` })(),\\n`)\n } else {\n entryCodeParts.push(` \"${key}\": {},\\n`)\n }\n }\n entryCodeParts.push('};\\n')\n\n entryCodeParts.push('const coraliteComponentStyles = {\\n')\n for (const key of processedComponentKeys) {\n if (this.sharedFunctions[key] && this.sharedFunctions[key].styles) {\n entryCodeParts.push(` \"${key}\": ${JSON.stringify(this.sharedFunctions[key].styles)},\\n`)\n }\n }\n entryCodeParts.push('};\\n')\n\n const coraliteElementPath = fileURLToPath(import.meta.resolve('./coralite-element.js'))\n\n entryCodeParts.push(`const globalClientHooks = {\n onBeforeComponentRender: [${this.scriptModules.map((_, i) => `onBeforeComponentRender_${i}`).join(', ')}].filter(Boolean),\n onAfterComponentRender: [${this.scriptModules.map((_, i) => `onAfterComponentRender_${i}`).join(', ')}].filter(Boolean),\n onDisconnected: [${this.scriptModules.map((_, i) => `onDisconnected_${i}`).join(', ')}].filter(Boolean)\n };\\n`)\n\n entryCodeParts.push(`import { createCoraliteClass } from ${JSON.stringify(coraliteElementPath)};\\n`)\n entryCodeParts.push('\\nexport { getClientContext, getSetups, createCoraliteClass, globalClientHooks };\\n')\n\n const entryPoints = {\n 'chunk-shared': entryCodeParts.join('').trimEnd()\n }\n\n // Create virtual entry points for each component\n for (const componentId of processedComponentKeys) {\n if (this.sharedFunctions[componentId]) {\n const safeId = componentId.replace(regex, '_')\n let componentEntryCode = ''\n\n const hasScript = this.sharedFunctions[componentId].script && this.sharedFunctions[componentId].script.content && this.sharedFunctions[componentId].script.content.trim() !== 'function(){}' && this.sharedFunctions[componentId].script.content.trim() !== 'function() {}' && this.sharedFunctions[componentId].script.content.trim() !== 'function() { }'\n const hasState = this.sharedFunctions[componentId].script && this.sharedFunctions[componentId].script.stateContent\n\n if (hasScript || hasState) {\n componentEntryCode += `import * as componentModule_${safeId} from \"${namespace}${componentId}\";\\n`\n }\n\n // Use a WeakMap to map original nodes to a unique index\n const nodeMap = new WeakMap()\n const state = { counter: 0 }\n\n cleanAST(this.sharedFunctions[componentId].templateAST, nodeMap, state)\n const templateHTML = serialize(this.sharedFunctions[componentId].templateAST ? render(this.sharedFunctions[componentId].templateAST, { decodeEntities: false }) : '')\n const templateValues = serialize(cleanValues(this.sharedFunctions[componentId].templateValues, nodeMap) || {\n attributes: [],\n textNodes: [],\n refs: []\n })\n const styles = JSON.stringify(this.sharedFunctions[componentId].styles || '')\n\n let normalizedDefaults = this.sharedFunctions[componentId].defaultValues || {}\n if (this.sharedFunctions[componentId].defaultValues) {\n normalizedDefaults = normalizeObjectFunctions(this.sharedFunctions[componentId].defaultValues, astTransformer)\n }\n const defaults = serialize(normalizedDefaults)\n const attributes = serialize(this.sharedFunctions[componentId].script?.attributes || {})\n const hydrationMap = serialize(generateHydrationMap(this.sharedFunctions[componentId].templateAST, this.sharedFunctions[componentId].templateValues))\n const getters = serialize(this.sharedFunctions[componentId].getters || this.sharedFunctions[componentId].script?.getters || {})\n const dependencies = JSON.stringify(this.sharedFunctions[componentId].components || [])\n\n let normalizedSlots = this.sharedFunctions[componentId].slots || {}\n if (this.sharedFunctions[componentId].slots) {\n normalizedSlots = normalizeObjectFunctions(this.sharedFunctions[componentId].slots, astTransformer)\n }\n const slots = serialize(normalizedSlots)\n\n componentEntryCode += `\nexport default {\n componentId: \"${componentId}\",\n templateHTML: ${templateHTML},\n templateValues: ${templateValues},\n styles: ${styles},\n attributes: ${attributes},\n hydrationMap: ${hydrationMap},\n getters: ${getters},\n defaultValues: (() => { const defaults = ${defaults}; return defaults; })(),\n slots: (() => { const slots = ${slots}; return slots; })(),\n dependencies: ${dependencies},\n imports: {},\n script: ${hasScript ? `componentModule_${safeId}.script` : 'null'},\n state: ${hasState ? `componentModule_${safeId}.state` : 'null'}\n};\n`\n entryPoints[componentId] = componentEntryCode\n }\n }\n\n const resolvedImportMap = {}\n\n // Use config's import map if available\n const userImportMap = this.options?.importMap || {}\n\n // Since we cannot pass raw code directly as values in the entryPoints object to esbuild,\n // we need to pass virtual paths.\n /** @type {Record<string, string>} */\n const virtualEntryPoints = {}\n for (const key of Object.keys(entryPoints)) {\n virtualEntryPoints[key] = `virtual-entry-point:${key}`\n }\n\n // Build and bundle\n const result = await build({\n entryPoints: virtualEntryPoints,\n bundle: true,\n write: false,\n treeShaking: true,\n splitting: true,\n metafile: true,\n minify: mode === 'production',\n sourcemap: mode === 'production' ? 'external' : 'inline',\n outdir: 'assets/js',\n entryNames: '[name]-[hash]',\n chunkNames: '[name]-[hash]',\n format: 'esm',\n sourceRoot: pathToFileURL(process.cwd()).href,\n define: {\n global: 'window',\n __dirname: '\"\"',\n __filename: '\"\"'\n },\n plugins: [\n nodeModulesPolyfillPlugin(),\n {\n name: 'coralite-import-map-resolver',\n setup: (pluginBuild) => {\n // Regex to catch bare specifiers (doesn't start with ., .., /, or http)\n const bareSpecifierRegex = /^[^.\\/]|^\\.[^.\\/]|^\\.\\.[^\\/]/\n\n pluginBuild.onResolve({ filter: bareSpecifierRegex }, (args) => {\n // Only intercept specifiers inside generated component scripts/files.\n // Do not externalize entry points themselves.\n if (args.kind === 'entry-point') {\n return null\n }\n\n // Do not externalize if the path resolves to a virtual module\n if (args.namespace === 'coralite-entry') {\n return null\n }\n\n // Check for Coralite internal modules first\n if (args.path.startsWith('coralite-component:') ||\n args.path.startsWith('coralite-script-module:') ||\n args.path === 'chunk-shared' ||\n args.path === 'coralite-shared') {\n return null\n }\n\n // Support virtual module imports for plugins by name\n if (this.plugins.some(p => p.name === args.path)) {\n return {\n path: args.path,\n external: true\n }\n }\n\n\n // Do not externalize if the entry point name actually matches a bare specifier\n if (Object.hasOwn(entryPoints, args.path)) {\n return null\n }\n\n // Ignore absolute URLs that are already explicitly defined\n if (args.path.startsWith('http')) {\n return {\n path: args.path,\n external: true\n }\n }\n\n // Check if the user provided an explicit override in coralite.config.js\n if (userImportMap[args.path]) {\n resolvedImportMap[args.path] = userImportMap[args.path]\n return {\n path: userImportMap[args.path],\n external: true\n }\n }\n })\n }\n },\n {\n name: 'coralite-virtual-modules',\n setup: (pluginBuild) => {\n pluginBuild.onResolve({ filter: /^virtual-entry-point:/ }, args => {\n const key = args.path.replace('virtual-entry-point:', '')\n if (entryPoints[key]) {\n return {\n path: key,\n namespace: 'coralite-entry'\n }\n }\n })\n\n pluginBuild.onLoad({\n filter: /.*/,\n namespace: 'coralite-entry'\n }, args => {\n if (entryPoints[args.path]) {\n return {\n contents: entryPoints[args.path],\n loader: 'js',\n resolveDir: process.cwd()\n }\n }\n })\n }\n },\n {\n name: 'coralite-component-resolver',\n setup: (pluginBuild) => {\n // Catch the script module, associate with real file paths\n const componentRegex = new RegExp(`^${namespace}`)\n\n pluginBuild.onResolve({ filter: componentRegex }, args => {\n const componentId = args.path.replace(namespace, '')\n const sharedFn = this.sharedFunctions[componentId]\n\n return {\n path: sharedFn.filePath,\n pluginData: { componentId }\n }\n })\n\n // Handle script modules\n const moduleRegex = new RegExp(`^${moduleNamespace}`)\n pluginBuild.onResolve({ filter: moduleRegex }, args => {\n const index = parseInt(args.path.replace(moduleNamespace, ''), 10)\n return {\n path: args.path,\n namespace: 'coralite-script-module',\n pluginData: { index }\n }\n })\n\n pluginBuild.onLoad({\n filter: /.*/,\n namespace: 'coralite-script-module'\n }, args => {\n const index = args.pluginData.index\n const module = this.scriptModules[index]\n let contents = ''\n\n // Generate config object\n const configContent = module.config\n ? `const pluginConfig = ${JSON.stringify(module.config)};`\n : 'const pluginConfig = {};'\n\n contents += configContent + '\\n'\n\n // Generate setup function\n const setupFn = module.setup ? normalizeFunction(module.setup) : 'null'\n contents += `export const runSetup = async (context) => {\n const setup = ${setupFn};\n if (!setup) return {};\n const contextObject = {\n config: pluginConfig,\n ...context\n };\n return await setup(contextObject);\n };\\n`\n\n const beforeFn = module.onBeforeComponentRender ? normalizeFunction(module.onBeforeComponentRender) : 'null'\n contents += `export const onBeforeComponentRender = ${beforeFn};\\n`\n\n const afterFn = module.onAfterComponentRender ? normalizeFunction(module.onAfterComponentRender) : 'null'\n contents += `export const onAfterComponentRender = ${afterFn};\\n`\n\n const disconnectedFn = module.onDisconnected ? normalizeFunction(module.onDisconnected) : 'null'\n contents += `export const onDisconnected = ${disconnectedFn};\\n`\n\n // Generate client context state\n contents += 'export const clientContextProps = {\\n'\n if (module.context) {\n for (const key in module.context) {\n if (Object.hasOwn(module.context, key)) {\n if (['id', 'state', 'page', 'root', 'signal'].includes(key)) {\n throw new Error(`Reserved context key '${key}' cannot be used in plugin context.`)\n }\n const fn = normalizeFunction(module.context[key])\n contents += ` \"${key}\": async (context) => {\n const globalContext = {\n ...context,\n config: pluginConfig\n };\n const fn = ${fn};\n const phase2 = await fn(globalContext);\n return (localContext) => phase2(localContext);\n },\\n`\n }\n }\n }\n contents += '};\\n'\n\n return {\n contents,\n loader: 'js',\n resolveDir: module.rootDir || (module.filePath ? dirname(module.filePath) : process.cwd())\n }\n })\n\n // Provide the script content to esbuild when it loads those file paths\n pluginBuild.onLoad({\n filter: /.*/\n }, args => {\n if (!args.pluginData || !args.pluginData.componentId) {\n return\n }\n\n const sharedFn = this.sharedFunctions[args.pluginData.componentId]\n let contents = ''\n\n\n if (sharedFn.script && sharedFn.script.content) {\n const padding = '\\n'.repeat(Math.max(0, sharedFn.script.lineOffset || 0))\n\n // More robust way to strip 'data' from defineComponent call\n let strippedContent = sharedFn.script.content\n\n try {\n const ast = parseJS(strippedContent, {\n ecmaVersion: 'latest',\n sourceType: 'module'\n })\n let dataStart = -1\n let dataEnd = -1\n\n walkJS(ast, {\n CallExpression (node) {\n if (node.callee.type === 'Identifier' && node.callee.name === 'defineComponent') {\n const firstArg = node.arguments[0]\n if (firstArg && firstArg.type === 'ObjectExpression') {\n const dataProp = firstArg.properties.find(p => p.type === 'Property' && p.key?.type === 'Identifier' && p.key?.name === 'data')\n // @ts-ignore\n if (dataProp && dataProp.type === 'Property') {\n // @ts-ignore\n dataStart = dataProp.start\n // @ts-ignore\n dataEnd = dataProp.end\n }\n }\n }\n }\n })\n\n if (dataStart !== -1) {\n let start = dataStart\n let end = dataEnd\n\n // Handle comma to avoid syntax errors\n const afterContent = strippedContent.slice(end)\n const trailingComma = afterContent.match(/^\\s*,/)\n if (trailingComma) {\n end += trailingComma[0].length\n } else {\n const beforeContent = strippedContent.slice(0, start)\n const leadingComma = beforeContent.match(/,\\s*$/)\n if (leadingComma) {\n start -= leadingComma[0].length\n }\n }\n strippedContent = strippedContent.slice(0, start) + strippedContent.slice(end)\n }\n } catch (e) {\n // Fallback to regex if AST parsing fails\n strippedContent = strippedContent.replace(/data\\s*:\\s*async\\s*function\\s*\\([^\\)]*\\)\\s*\\{[\\s\\S]*?\\}(?=\\s*,|\\s*\\})/, '/* data stripped */')\n strippedContent = strippedContent.replace(/async\\s*data\\s*\\([^\\)]*\\)\\s*\\{[\\s\\S]*?\\}(?=\\s*,|\\s*\\})/, '/* data stripped */')\n }\n\n contents += `${padding}export const script = ${strippedContent};\\n`\n contents += `export default script;\\n`\n } else {\n contents += `export const script = null;\\n`\n contents += `export default null;\\n`\n }\n\n if (sharedFn.script && sharedFn.script.stateContent) {\n const padding = '\\n'.repeat(Math.max(0, sharedFn.script.stateLineOffset || 0))\n contents += `${padding}export const state = ${sharedFn.script.stateContent};\\n`\n } else {\n contents += `export const state = null;\\n`\n }\n\n return {\n contents,\n loader: 'js',\n resolveDir: sharedFn.filePath ? dirname(sharedFn.filePath) : process.cwd()\n }\n })\n }\n }\n ]\n })\n\n const manifest = {}\n if (result.metafile && result.metafile.outputs) {\n for (const [outputPath, meta] of Object.entries(result.metafile.outputs)) {\n if (meta.entryPoint) {\n const entryPoint = meta.entryPoint\n const cleanEntry = entryPoint.includes(':') ? entryPoint.split(':').pop() : entryPoint\n\n // 1. STRIP THE EXTENSION (Fixes E2E Bootstrapper Timeout)\n const tagName = parse(cleanEntry).name\n\n // 2. USE RELATIVE PATHS (Fixes the chunks/ 404 issue)\n const relativePath = relative('assets/js', outputPath).replace(/\\\\/g, '/')\n\n manifest[tagName] = relativePath\n }\n }\n }\n\n const outdirAbs = resolve('assets/js')\n const outputFiles = {}\n\n if (result.outputFiles) {\n for (const file of result.outputFiles) {\n // Keep the relative path for the physical output file creation\n const relativePath = relative(outdirAbs, file.path).replace(/\\\\/g, '/')\n\n outputFiles[relativePath] = {\n ...file,\n hashedPath: relativePath,\n text: file.text\n }\n }\n }\n\n return {\n manifest,\n outputFiles,\n importMap: resolvedImportMap\n }\n}\n", "import { definePlugin } from '#lib'\n\n/**\n * @import { ScriptPluginHelperLocalInstance } from '../types/index.js'\n */\n\nexport const refsPlugin = definePlugin({\n name: 'refs',\n server: {\n onBeforeComponentRender: ({ state, instanceId, refs }) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i]\n const uniqueRefValue = `${instanceId}__${ref.name}`\n\n // Update the ref attribute value to be unique\n if (ref.element && ref.element.attribs) {\n ref.element.attribs.ref = uniqueRefValue\n }\n\n // inject flat token into component state\n state[`ref_${ref.name}`] = uniqueRefValue\n }\n }\n },\n client: {\n onBeforeComponentRender: ({ state, instanceId, element, options }) => {\n // @ts-ignore\n const hydrationMap = options.hydrationMap\n\n if (hydrationMap && hydrationMap.refs) {\n for (const ref of hydrationMap.refs) {\n const uniqueRefValue = `${instanceId}__${ref.name}`\n\n // Update state if not already set (e.g. by SSR hydration)\n if (!state[`ref_${ref.name}`]) {\n state[`ref_${ref.name}`] = uniqueRefValue\n }\n\n // Update the actual DOM element if it exists\n // Since this is client side, we need to find the node\n if (hydrationMap && hydrationMap.refs) {\n const refMap = hydrationMap.refs.find(r => r.name === ref.name)\n if (refMap) {\n const node = element.getNodeByPath(refMap.path)\n // @ts-ignore\n if (node && node.setAttribute) {\n // @ts-ignore\n node.setAttribute('ref', uniqueRefValue)\n }\n }\n }\n }\n }\n },\n context: {\n /**\n * Creates a ref resolver function that maps IDs to DOM elements.\n *\n * @returns {ScriptPluginHelperLocalInstance}\n */\n refs () {\n return ({ state, root }) => {\n return function (id) {\n const refId = state[`ref_${id}`]\n\n if (!refId && typeof refId !== 'string') {\n return null\n }\n\n return root.querySelector(`[ref=\"${refId}\"]`)\n }\n }\n }\n }\n }\n})\n", "import { definePlugin } from '#lib'\n\n/**\n * @import { ParseHTMLResult } from '../types/index.js'\n * @import { CoraliteCollectionItem } from '../types/collection.js'\n * @import { Coralite } from '../lib/index.js'\n * @import { CoralitePage } from '../types/core.js'\n */\n\n/**\n * Processes a single element to extract metadata.\n */\nasync function processMetadataElement (element, context, index) {\n const { page, state, data, app, elements } = context\n\n if (element.type !== 'tag') {\n return\n }\n\n if (element.name === 'meta' && element.attribs?.name && element.attribs?.content) {\n page.meta[element.attribs.name] = element.attribs.content\n } else if (element.slots) {\n const componentElement = await app.createComponentElement({\n id: element.name,\n state,\n element,\n page,\n root: elements.root,\n contextId: data.path.pathname + index + element.name,\n index\n })\n\n if (componentElement) {\n for (let j = 0; j < componentElement.children.length; j++) {\n const child = componentElement.children[j]\n if (child.type === 'tag' && child.name === 'meta' && child.attribs?.name && child.attribs?.content) {\n page.meta[child.attribs.name] = child.attribs.content\n } else if (child.type === 'tag' && child.name === 'title' && child.children?.length && child.children[0].type === 'text') {\n page.meta.title = child.children[0].data\n }\n }\n }\n } else if (element.name === 'title' && element.children?.length && element.children[0].type === 'text') {\n page.meta.title = element.children[0].data\n }\n}\n\n/**\n * Extracts metadata tags from the parsed HTML root elements.\n * Supports static <title> and <meta> tags, as well as resolving dynamic custom\n * element slots inside the <head> segment to compute metadata.\n *\n * @param {Object} context -\n * @param {ParseHTMLResult} context.elements - The parsed HTML elements including root\n * @param {CoralitePage} context.page - The global page object to store the extracted metadata\n * @param {Object.<string, any>} context.state - The global state object to store the extracted metadata\n * @param {CoraliteCollectionItem} context.data - The file data currently being evaluated\n * @param {Coralite} [context.app] - The global coralite app instance\n * @returns {Promise<void>}\n */\nasync function extractMetadata (context) {\n const { elements, page } = context\n page.meta.lang = ''\n\n for (let i = 0; i < elements.root.children.length; i++) {\n const rootNode = elements.root.children[i]\n\n if (rootNode.type === 'tag' && rootNode.name === 'html') {\n page.meta.lang = rootNode.attribs?.lang || ''\n\n for (let j = 0; j < rootNode.children.length; j++) {\n const node = rootNode.children[j]\n\n if (node.type === 'tag' && node.name === 'head') {\n for (let k = 0; k < node.children.length; k++) {\n await processMetadataElement(node.children[k], context, k)\n }\n return\n }\n }\n }\n }\n}\n\nexport const metadataPlugin = definePlugin({\n name: 'metadata',\n server: {\n async onPageSet ({ elements, state, page, data, app }) {\n await extractMetadata({\n elements,\n state,\n page,\n data,\n app\n })\n },\n async onPageUpdate ({ elements, page, newValue, app }) {\n await extractMetadata({\n elements,\n state: newValue.result.state,\n page,\n data: newValue,\n app\n })\n\n return {\n newValue: {\n result: {\n page\n }\n }\n }\n }\n }\n})\n", "/**\n * @import { CoralitePlugin, HTMLData } from '../types/index.js'\n */\n\nimport { basename, dirname } from 'path'\n\n/**\n * Validates that a value is a non-empty string\n * @param {*} value - Value to validate\n * @param {string} paramName - Parameter name for error messages\n * @throws {Error} If value is not a valid non-empty string\n */\nfunction validateNonEmptyString (value, paramName) {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(\n `Coralite plugin validation failed: \"${paramName}\" must be a non-empty string, received ${typeof value}`\n )\n }\n}\n\n/**\n * Validates that a value is an array of strings (or empty array)\n * @param {*} value - Value to validate\n * @param {string} paramName - Parameter name for error messages\n * @throws {Error} If value is defined but not an array of strings\n */\nfunction validateStringArray (value, paramName) {\n if (!Array.isArray(value)) {\n throw new Error(\n `Coralite plugin validation failed: \"${paramName}\" must be an array, received ${typeof value}`\n )\n }\n\n for (let i = 0; i < value.length; i++) {\n if (typeof value[i] !== 'string') {\n throw new Error(\n `Coralite plugin validation failed: \"${paramName}[${i}]\" must be a string, received ${typeof value[i]}`\n )\n }\n }\n}\n\n/**\n * Processes a single components file with optional caching\n * @param {string} path - Template file path\n * @returns {HTMLData} Template data\n * @throws {Error} If components file cannot be read or is invalid\n */\nfunction processComponents (path) {\n try {\n const componentData = {\n path: {\n pathname: path,\n dirname: dirname(path),\n filename: basename(path)\n }\n }\n\n return componentData\n } catch (error) {\n throw new Error(\n `Coralite plugin component processing failed for \"${path}\": ${error.message}`\n )\n }\n}\n\n/**\n * Creates a new Coralite plugin instance based on provided configuration options.\n * @param {CoralitePlugin & { server?: { components?: string[] } }} options - Plugin configuration object\n * @returns {CoralitePlugin} A configured plugin instance ready to be registered with Coralite\n * @example\n * // Basic plugin\n * const myPlugin = definePlugin({\n * name: 'my-plugin',\n * server: {\n * exports: {\n * getData: (context) => (options) => {\n * // Plugin logic implementation\n * return { ...context.state, custom: 'data', ...options }\n * }\n * }\n * }\n * })\n *\n * @example\n * // Plugin with components and metadata\n * const advancedPlugin = definePlugin({\n * name: 'advanced-plugin',\n * server: {\n * exports: {\n * process: (context) => async (options) => {\n * // Async plugin logic\n * return { ...context.state, processed: true, ...options }\n * }\n * },\n * components: ['src/components/header.html', 'src/components/footer.html'],\n * onPageSet: async (data) => {\n * console.log('Page created:', data.path.pathname)\n * }\n * }\n * })\n */\nexport function definePlugin ({\n name,\n server,\n client\n}) {\n validateNonEmptyString(name, 'name')\n\n let callerDir\n if (client != null && client.rootDir == null) {\n const stack = new Error().stack\n if (stack) {\n const callerLine = stack.split('\\n')[2]\n if (callerLine) {\n const match = callerLine.match(/file:\\/\\/(.+?):/)\n if (match) {\n callerDir = dirname(match[1])\n }\n }\n }\n }\n\n // Validate server plugin if provided\n if (server != null) {\n if (typeof server !== 'object') {\n throw new Error(\n `Coralite plugin validation failed: \"server\" must be an object, received ${typeof server}`\n )\n }\n\n server = { ...server }\n\n // Process component files with error handling\n if (server.components) {\n validateStringArray(server.components, 'server.components')\n\n const componentHTMLData = []\n try {\n // Process all components\n for (const path of server.components) {\n componentHTMLData.push(processComponents(path))\n }\n // @ts-ignore\n server.components = componentHTMLData\n } catch (error) {\n // Enhance error message with plugin context\n throw new Error(\n `Coralite plugin \"${name}\" failed to load components: ${error.message}`\n )\n }\n }\n }\n\n // Validate client plugin if provided\n if (client != null) {\n if (typeof client !== 'object') {\n throw new Error(\n `Coralite plugin validation failed: \"client\" must be an object, received ${typeof client}`\n )\n }\n\n // Validate optional client state\n if (client.setup != null && typeof client.setup !== 'function') {\n throw new Error(\n `Coralite plugin validation failed: \"client.setup\" must be a function, received ${typeof client.setup}`\n )\n }\n\n if (client.config != null && typeof client.config !== 'object') {\n throw new Error(\n `Coralite plugin validation failed: \"client.config\" must be an object, received ${typeof client.config}`\n )\n }\n\n // append rootDir\n client.rootDir = client.rootDir || callerDir\n }\n\n // Create the plugin object with all configured state\n return {\n name,\n server,\n client\n }\n}\n", "import { definePlugin } from '../lib/plugin.js'\nimport { createRequire } from 'node:module'\nimport { dirname, join, parse } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { cp, mkdir } from 'node:fs/promises'\n\n/**\n * Finds the nearest package.json starting from a given directory.\n * @param {string} startDir - The directory to start searching from.\n * @returns {string} The path to the directory containing package.json.\n * @throws {Error} If package.json is not found up to the root.\n */\nfunction findPackageRoot (startDir) {\n let currentDir = startDir\n const rootDir = parse(currentDir).root\n\n while (currentDir !== rootDir) {\n if (existsSync(join(currentDir, 'package.json'))) {\n return currentDir\n }\n currentDir = dirname(currentDir)\n }\n\n throw new Error('package.json not found')\n}\n\n/**\n * Coralite plugin to copy static assets during build\n * @param {import('../types/index.js').CoraliteStaticAsset[]} assets - Static assets to copy during build.\n */\nexport const staticAssetPlugin = (assets = []) => {\n return definePlugin({\n name: 'static-asset-plugin',\n server: {\n onBeforeBuild: async function (context) {\n const outputDir = context.app.options.output || join(process.cwd(), 'dist')\n\n for (const asset of assets) {\n if (!asset.dest) {\n throw new Error('staticAssetPlugin requires assets to have a dest property.')\n }\n\n const dest = join(outputDir, asset.dest)\n\n if (asset.src) {\n await mkdir(dirname(dest), { recursive: true })\n await cp(asset.src, dest, { recursive: true })\n continue\n }\n\n if (!asset.pkg || !asset.path) {\n throw new Error('staticAssetPlugin requires assets to have pkg and path state when src is not provided.')\n }\n\n const require = createRequire(join(process.cwd(), 'package.json'))\n let pkgPath\n\n try {\n pkgPath = dirname(require.resolve(`${asset.pkg}/package.json`))\n } catch (e) {\n try {\n const resolvedPath = require.resolve(asset.pkg)\n pkgPath = findPackageRoot(dirname(resolvedPath))\n } catch (resolutionError) {\n throw new Error(`staticAssetPlugin could not resolve package.json for package: ${asset.pkg}`)\n }\n }\n\n const src = join(pkgPath, asset.path)\n\n await mkdir(dirname(dest), { recursive: true })\n await cp(src, dest, { recursive: true })\n }\n }\n }\n })\n}\n", "import { definePlugin } from '#lib'\n\n/**\n * Traverses an AST recursively and duplicates 'ref' attributes to 'data-testid'.\n * Note: Modifying AST nodes in-place is required to preserve reference identity\n * for internal framework arrays (e.g. customElements, skipRenderElements).\n * @param {Array} children - The AST nodes to traverse.\n */\nfunction traverseAndAddTestId (children) {\n if (!Array.isArray(children)) {\n return\n }\n\n for (let i = 0; i < children.length; i++) {\n const node = children[i]\n\n if (node.type === 'tag' && node.attribs?.ref) {\n node.attribs['data-testid'] = node.attribs.ref\n }\n\n if (node.children?.length > 0) {\n traverseAndAddTestId(node.children)\n }\n }\n}\n\nexport const testingPlugin = definePlugin({\n name: 'testing',\n server: {\n onBeforeComponentRender: ({ instanceId, refs }) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i]\n const uniqueRefValue = `${instanceId}__${ref.name}`\n\n if (ref.element.attribs) {\n ref.element.attribs['data-testid'] = uniqueRefValue\n }\n }\n },\n onComponentSet: ({ component }) => {\n const children = component?.template?.children\n if (children) {\n traverseAndAddTestId(children)\n }\n },\n onPageSet: ({ elements }) => {\n const children = elements?.root?.children\n if (children) {\n traverseAndAddTestId(children)\n }\n }\n },\n client: {\n onBeforeComponentRender: ({ instanceId, refs }) => {\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i]\n const uniqueRefValue = `${instanceId}__${ref.name}`\n\n if (ref.element && ref.element.setAttribute) {\n ref.element.setAttribute('data-testid', uniqueRefValue)\n }\n }\n }\n }\n})\n", "import { cleanKeys, cloneModuleInstance, replaceToken, cloneComponentInstance, findAndExtractScript, findAndExtractProperties, extractGlobals, mergePluginState, normalizeObjectFunctions, astTransformer } from './utils.js'\nimport { getHtmlFile, getHtmlFiles, discoverHtmlFiles } from './html.js'\nimport { findHeadAndBody, injectExternalStyles, injectStyles, injectReadinessScript, injectImportMap, removeElements, resolvePageQueue } from './render-helpers.js'\nimport { generateClientRuntime } from './client-runtime.js'\nimport { parseHTML, parseModule, createElement, createTextNode } from './parse.js'\nimport { transformCss } from './style-transform.js'\nimport { ScriptManager } from './script-manager.js'\nimport { metadataPlugin, refsPlugin, staticAssetPlugin, testingPlugin } from '#plugins'\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { dirname, join, normalize, relative, resolve } from 'node:path'\nimport { createRequire } from 'node:module'\nimport { transform } from 'esbuild'\nimport {\n isCoraliteElement,\n isCoraliteCollectionItem,\n isCoraliteComment,\n isCoraliteTextNode\n} from './type-helper.js'\nimport { CoraliteError } from './errors.js'\nimport { pathToFileURL } from 'node:url'\nimport { availableParallelism } from 'node:os'\nimport render from 'dom-serializer'\nimport pLimit from 'p-limit'\nimport { createCoraliteElement, createCoraliteTextNode } from './dom.js'\nimport CoraliteCollection from './collection.js'\nimport { randomUUID } from 'node:crypto'\nimport { createContext } from 'node:vm'\nimport { createReadOnlyProxy } from './utils.js'\n\n/**\n * @import {\n * CoraliteElement,\n * CoraliteAnyNode,\n * CoraliteModule,\n * CoraliteResult,\n * CoraliteModuleDefinitions,\n * CoraliteComponent,\n * CoraliteCollectionItem,\n * CoraliteComponentRoot,\n * CoraliteCollectionEventSet,\n * CoraliteComponentResult,\n * InstanceContext,\n * CoraliteConfig,\n * CoraliteFilePath,\n * CoralitePage,\n * CoraliteSession,\n * CoralitePluginContext,\n * Attribute\n * } from '../types/index.js'\n */\n\n/**\n * @import {DomSerializerOptions} from 'dom-serializer'\n */\n\n/**\n * @class\n * @param {CoraliteConfig} options\n * @example\n * const coralite = new Coralite({\n * components: './path/to/components',\n * pages: './path/to/pages',\n * mode: 'development',\n * plugins: [myPlugin],\n * ignoreByAttribute: [{ name: 'data-ignore', value: 'true' }],\n * skipRenderByAttribute: ['data-skip-render']\n * });\n */\nexport function Coralite ({\n components,\n pages,\n plugins,\n assets,\n externalStyles,\n baseURL = '/',\n ignoreByAttribute,\n skipRenderByAttribute,\n onError,\n mode = 'production',\n output\n}) {\n // Validate required parameters\n if (!components && typeof components !== 'string') {\n throw new Error('Coralite constructor requires \"components\" option to be defined')\n }\n\n if (!pages && typeof pages !== 'string') {\n throw new Error('Coralite constructor requires \"pages\" option to be defined')\n }\n\n if (!plugins) {\n plugins = []\n }\n\n const path = {\n components: normalize(components),\n pages: normalize(pages)\n }\n\n this._onErrorCallback = onError\n\n // instance options\n this.options = {\n components,\n pages,\n plugins,\n assets,\n externalStyles,\n baseURL,\n ignoreByAttribute,\n skipRenderByAttribute,\n mode,\n path,\n output: output ? normalize(output) : undefined\n }\n\n /** @type {Map<string, CoraliteCollectionItem[]>} */\n this._renderQueues = new Map()\n\n // plugins\n this._plugins = {\n components: [],\n hooks: {\n onPageSet: [],\n onPageUpdate: [],\n onPageDelete: [],\n onComponentSet: [],\n onComponentUpdate: [],\n onComponentDelete: [],\n onBeforePageRender: [],\n onAfterPageRender: [],\n onBeforeComponentRender: [],\n onAfterComponentRender: [],\n onBeforeBuild: [],\n onAfterBuild: []\n }\n }\n\n // Initialize script manager\n this._scriptManager = new ScriptManager(this.options)\n\n // source context\n this._source = {\n utils: {\n parseHTML: (string, ignoreByAttribute = this.options.ignoreByAttribute, skipRenderByAttribute = this.options.skipRenderByAttribute) => parseHTML(string, ignoreByAttribute, skipRenderByAttribute, (errorData) => this._handleError(errorData)),\n parseModule: (string, options) => parseModule(string, {\n ignoreByAttribute: this.options.ignoreByAttribute,\n skipRenderByAttribute: this.options.skipRenderByAttribute,\n onError: (errorData) => this._handleError(errorData),\n ...options\n }),\n getHtmlFiles,\n getHtmlFile,\n createElement: (options) => createElement({\n onError: (errorData) => this._handleError(errorData),\n ...options\n }),\n createTextNode,\n transform: this.transform\n },\n plugins: {\n }\n }\n\n // place core plugin first\n if (this.options.mode === 'development') {\n plugins.unshift(testingPlugin)\n }\n plugins.unshift(refsPlugin, metadataPlugin)\n\n if (assets) {\n plugins.unshift(staticAssetPlugin(assets))\n }\n\n const source = this._source\n // iterate over each plugin and register its hooks and modules in the Coralite source context.\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i]\n\n if (plugin.server) {\n // set plugin method\n if (plugin.server.exports !== undefined) {\n source.plugins[plugin.name] = plugin.server.exports\n }\n\n // queue any components provided by the plugin to be registered.\n if (plugin.server.components && Array.isArray(plugin.server.components)) {\n for (let j = 0; j < plugin.server.components.length; j++) {\n this._plugins.components.push(plugin.server.components[j])\n }\n }\n\n // add the plugin's hooks to the appropriate Coralite hook lists.\n if (plugin.server.onPageSet) {\n this._addPluginHook('onPageSet', plugin.server.onPageSet)\n }\n if (plugin.server.onPageDelete) {\n this._addPluginHook('onPageDelete', plugin.server.onPageDelete)\n }\n if (plugin.server.onPageUpdate) {\n this._addPluginHook('onPageUpdate', plugin.server.onPageUpdate)\n }\n if (plugin.server.onComponentSet) {\n this._addPluginHook('onComponentSet', plugin.server.onComponentSet)\n }\n if (plugin.server.onComponentDelete) {\n this._addPluginHook('onComponentDelete', plugin.server.onComponentDelete)\n }\n if (plugin.server.onComponentUpdate) {\n this._addPluginHook('onComponentUpdate', plugin.server.onComponentUpdate)\n }\n if (plugin.server.onBeforePageRender) {\n this._addPluginHook('onBeforePageRender', plugin.server.onBeforePageRender)\n }\n if (plugin.server.onAfterPageRender) {\n this._addPluginHook('onAfterPageRender', plugin.server.onAfterPageRender)\n }\n if (plugin.server.onBeforeComponentRender) {\n this._addPluginHook('onBeforeComponentRender', plugin.server.onBeforeComponentRender)\n }\n if (plugin.server.onAfterComponentRender) {\n this._addPluginHook('onAfterComponentRender', plugin.server.onAfterComponentRender)\n }\n if (plugin.server.onBeforeBuild) {\n this._addPluginHook('onBeforeBuild', plugin.server.onBeforeBuild)\n }\n if (plugin.server.onAfterBuild) {\n this._addPluginHook('onAfterBuild', plugin.server.onAfterBuild)\n }\n }\n\n // register client-side plugin if provided\n if (plugin.client) {\n this._scriptManager.use(plugin.client)\n }\n }\n\n const propertyDescriptors = {\n enumerable: false,\n configurable: false,\n writable: false\n }\n\n const enumerablePropertyDescriptors = {\n enumerable: true,\n configurable: false,\n writable: true\n }\n\n Object.defineProperties(this, {\n options: { ...enumerablePropertyDescriptors },\n _plugins: { ...propertyDescriptors },\n _scriptManager: { ...propertyDescriptors },\n _source: { ...propertyDescriptors },\n _onErrorCallback: { ...propertyDescriptors },\n _renderQueues: { ...propertyDescriptors }\n })\n}\n\n/**\n * Initialises the Coralite instance.\n * @returns {Promise<void>}\n */\nCoralite.prototype.initialise = async function () {\n this.components = await getHtmlFiles({\n path: this.options.components,\n recursive: true,\n type: 'component',\n onFileSet: async (value) => {\n if (value.content === undefined) {\n value.content = await getHtmlFile(value.path.pathname)\n }\n\n const component = parseModule(value.content, {\n ignoreByAttribute: this.options.ignoreByAttribute,\n skipRenderByAttribute: this.options.skipRenderByAttribute,\n onError: (errorData) => this._handleError(errorData)\n })\n\n // abort component add\n if (!component.isTemplate) {\n return\n }\n\n const result = await this._triggerPluginHook('onComponentSet', { component })\n\n return {\n type: 'component',\n id: result.component.id,\n value: result.component\n }\n },\n onFileUpdate: async (value) => {\n if (value.content === undefined) {\n value.content = await getHtmlFile(value.path.pathname)\n }\n\n const component = parseModule(value.content, {\n ignoreByAttribute: this.options.ignoreByAttribute,\n skipRenderByAttribute: this.options.skipRenderByAttribute,\n onError: (errorData) => this._handleError(errorData)\n })\n\n // abort component update\n if (!component.isTemplate) {\n return\n }\n\n const result = await this._triggerPluginHook('onComponentUpdate', { component })\n\n return result.component\n },\n onFileDelete: async (value) => {\n await this._triggerPluginHook('onComponentDelete', { component: value })\n }\n })\n\n // register plugin components\n await Promise.all(this._plugins.components.map(c => this.components.setItem(c)))\n\n // collection of custom elements used by pages\n /** @type {Object.<string, Set<string>>} */\n const pageCustomElements = {}\n /** @type {Object.<string, string>} */\n const childCustomElements = {}\n\n /**\n * @type {Object.<string, Set<string>>}\n */\n this._pageCustomElements = pageCustomElements\n /**\n * @type {Object.<string, string>}\n */\n this._childCustomElements = childCustomElements\n\n Object.defineProperties(this, {\n _pageCustomElements: {\n enumerable: false,\n configurable: false,\n writable: false\n },\n _childCustomElements: {\n enumerable: false,\n configurable: false,\n writable: false\n }\n })\n\n /** @type {CoraliteCollectionEventSet} */\n const onFileSet = async (data) => {\n // Determine the root path based on the data type\n let rootPath = this.options.path.pages\n\n if (data.type === 'component') {\n rootPath = this.options.path.components\n }\n\n // Convert relative file path to a URL pathname format\n const urlPathname = pathToFileURL(join('/', relative(rootPath, data.path.pathname))).pathname\n\n const page = {\n url: {\n pathname: urlPathname,\n dirname: pathToFileURL(dirname(urlPathname)).pathname\n },\n file: {\n pathname: data.path.pathname,\n dirname: data.path.dirname,\n filename: data.path.filename\n },\n meta: {}\n }\n\n // define a set of context state for component rendering\n /** @type {any} */\n const state = {\n ...data.state,\n page\n }\n\n // If discovered only, skip parsing and plugin hooks to save memory\n if (data.content === undefined) {\n return {\n type: 'page',\n value: {\n state,\n page,\n path: data.path\n }\n }\n }\n\n const elements = parseHTML(data.content, this.options.ignoreByAttribute, this.options.skipRenderByAttribute, (errorData) => this._handleError(errorData))\n\n // track parent-child relationship between custom elements (only in development)\n if (this.options.mode !== 'production') {\n const customElementsList = elements ? (elements.customElements || []) : []\n for (let i = 0; i < customElementsList.length; i++) {\n const customElement = customElementsList[i]\n const name = customElement.name\n let item = pageCustomElements[name]\n\n if (!item) {\n pageCustomElements[name] = new Set()\n item = pageCustomElements[name]\n\n const component = this.components.getItem(name)\n\n if (\n component &&\n component.result &&\n component.result.customElements &&\n component.result.customElements.length\n ) {\n const stack = [component.result.customElements]\n\n while (stack.length > 0) {\n const current = stack.pop()\n\n for (let i = 0; i < current.length; i++) {\n const element = current[i]\n\n if (!childCustomElements[element.name]) {\n childCustomElements[element.name] = name\n\n // process nested elements recursively\n const component = this.components.getItem(element.name)\n\n if (\n component &&\n component.result &&\n component.result.customElements &&\n component.result.customElements.length\n ) {\n // push nested custom elements to stack for processing\n stack.push(component.result.customElements)\n }\n }\n }\n }\n }\n }\n\n // add page to custom element collection\n item.add(data.path.pathname)\n }\n }\n\n const mappedContext = await this._triggerPluginHook('onPageSet', {\n elements,\n state: state,\n page,\n data\n })\n\n const isProduction = this.options.mode === 'production'\n\n if (isProduction && data.physical) {\n delete data.content\n }\n\n return {\n type: 'page',\n value: {\n state: mappedContext.state,\n page: mappedContext.page,\n path: mappedContext.data.path,\n // In production, we discard the heavy AST nodes after initialization hooks to save memory.\n // They will be re-parsed on-demand during the build/render phase.\n root: isProduction ? null : mappedContext.elements.root,\n customElements: isProduction ? null : mappedContext.elements.customElements,\n tempElements: isProduction ? null : mappedContext.elements.tempElements,\n skipRenderElements: isProduction ? null : mappedContext.elements.skipRenderElements\n },\n state: mappedContext.state\n }\n }\n\n const onPageUpdate = async (newValue, oldValue) => {\n if (this.options.mode === 'production') {\n return newValue.result\n }\n\n let newCustomElements\n\n if (!newValue.result) {\n const result = await onFileSet(newValue)\n\n newValue.result = result.value\n newCustomElements = result.value.customElements\n } else {\n newCustomElements = newValue.result.customElements\n }\n\n let oldElements = (oldValue.result.customElements || []).slice()\n\n const mappedContext = await this._triggerPluginHook('onPageUpdate', {\n elements: newValue.result,\n page: newValue.result.page,\n newValue,\n oldValue\n })\n\n // Assign back the mapped elements to result so that rendering uses the updated AST and state\n newValue.result = mappedContext.elements\n newValue = mappedContext.newValue\n\n for (let i = 0; i < newCustomElements.length; i++) {\n const newElement = newCustomElements[i]\n\n let hasElement = false\n\n for (let j = 0; j < oldElements.length; j++) {\n const oldElement = oldElements[j]\n\n if (newElement.name === oldElement.name) {\n hasElement = true\n oldElements.splice(j, 1)\n break\n }\n }\n\n if (!hasElement) {\n let item = pageCustomElements[newElement.name]\n\n if (!item) {\n pageCustomElements[newElement.name] = new Set()\n item = pageCustomElements[newElement.name]\n }\n\n // add page to custom element collection\n item.add(newValue.path.pathname)\n }\n }\n\n for (let i = 0; i < oldElements.length; i++) {\n const pageCustomElement = pageCustomElements[oldElements[i].name]\n\n // remove page from custom element reference\n pageCustomElement.delete(newValue.path.pathname)\n }\n\n return newValue.result\n }\n\n const onPageDelete = async (value) => {\n if (this.options.mode === 'production') {\n return\n }\n\n const result = await this._triggerPluginHook('onPageDelete', { data: value })\n value = result.data\n\n // remove page from custom element reference\n if (value && value.result && value.result.customElements) {\n const customElements = value.result.customElements\n\n for (let i = 0; i < customElements.length; i++) {\n const pageCustomElement = pageCustomElements[customElements[i]]\n\n if (pageCustomElement) {\n pageCustomElement.delete(value.path.pathname)\n }\n }\n }\n }\n\n this.pages = new CoraliteCollection({\n rootDir: this.options.pages,\n onSet: onFileSet,\n onUpdate: onPageUpdate,\n onDelete: onPageDelete\n })\n\n const isProduction = this.options.mode === 'production'\n\n if (isProduction) {\n for await (const file of discoverHtmlFiles({\n path: this.options.pages,\n recursive: true,\n type: 'page',\n discoverOnly: false\n })) {\n // Process file for metadata, then it will be discarded because isProduction is true in onFileSet\n await this.pages.setItem(file)\n }\n } else {\n /** @type {CoraliteCollection} */\n await getHtmlFiles({\n path: this.options.pages,\n recursive: true,\n type: 'page',\n discoverOnly: false,\n collection: this.pages\n })\n }\n}\n\n/**\n * Default error handler for the Coralite instance.\n * @internal\n * @param {Object} data\n * @param {'WARN' | 'ERR' | 'LOG'} data.level\n * @param {string} data.message\n * @param {Error} [data.error]\n */\nCoralite.prototype._defaultOnError = function ({ level, message, error }) {\n if (level === 'ERR') {\n if (error) {\n throw error\n }\n throw new Error(message)\n } else if (level === 'WARN') {\n console.warn(message)\n } else {\n console.log(message)\n }\n}\n\n/**\n * Internal error handler for the Coralite instance.\n * @internal\n * @param {Object} data - The error or log data object containing the details of the event.\n * @param {'WARN' | 'ERR' | 'LOG'} data.level - The severity level of the message.\n * @param {string} data.message - The descriptive message to be logged or thrown.\n * @param {Error} [data.error] - An optional Error instance providing a stack trace.\n */\nCoralite.prototype._handleError = function (data) {\n if (this._onErrorCallback) {\n this._onErrorCallback(data)\n } else {\n this._defaultOnError(data)\n }\n}\n\n/**\n * Helper to create CoraliteError during component execution\n * @internal\n * @param {Error} error - The caught error\n * @param {CoraliteModule} module - The component module\n * @param {CoraliteCollectionItem} moduleComponent - The parent module component\n * @param {CoralitePage} page - The current page\n * @param {string} instanceId - The unique instance id\n * @returns {CoraliteError} The generated error object\n */\nCoralite.prototype._createExecutionError = function (error, module, moduleComponent, page, instanceId) {\n return new CoraliteError(error.message, {\n cause: error,\n componentId: module.id,\n filePath: moduleComponent.path.pathname,\n pagePath: page?.file?.pathname,\n instanceId\n })\n}\n\n/**\n * Creates a render context for the build process.\n * @internal\n * @param {string} [buildId] - The unique identifier for the build process.\n * @returns {CoraliteSession}\n */\nCoralite.prototype._createSession = function (buildId) {\n return {\n buildId,\n state: {},\n styles: new Map(),\n componentTags: new Set(),\n instanceCounters: {},\n generateId (prefix) {\n if (this.instanceCounters[prefix] === undefined) {\n this.instanceCounters[prefix] = 0\n }\n return `${prefix}-${this.instanceCounters[prefix]++}`\n },\n scripts: {\n content: {},\n add (id, item) {\n if (!this.content[id]) {\n this.content[id] = {}\n }\n this.content[id][item.id] = item\n }\n },\n source: {\n currentSourceContextId: '',\n contextInstances: {}\n }\n }\n}\n/**\n * Compiles specified page(s) by rendering their document content and measuring render time.\n * Processes pages based on provided path(s), replacing custom elements with components,\n * and returns rendered results with performance metrics.\n *\n * @internal\n *\n * @param {string | string[]} [path] - Path to a single page or array of page paths relative to the pages directory. If omitted, compiles all pages.\n * @param {Object} [state] - Properties to be passed to the page\n * @returns {AsyncGenerator<CoraliteResult>}\n */\n\n/**\n * Processes custom elements found within a generated page context\n * @internal\n * @param {CoraliteComponent & CoraliteComponentResult} mappedComponent - The compiled component instance\n * @param {CoraliteComponentResult} originalDocument - The original document mapping\n * @param {Object} state - Local component state\n * @param {CoraliteSession} mappedSessionObject - Global rendering state\n * @returns {Promise<void>} Resolves when the elements are processed\n */\nCoralite.prototype._processCustomElementsInPage = async function (mappedComponent, originalDocument, state, mappedSessionObject, pageContext) {\n const customElementsList = mappedComponent.customElements || []\n for (let i = 0; i < customElementsList.length; i++) {\n const customElement = customElementsList[i]\n\n const contextId = mappedSessionObject.generateId(customElement.name)\n const currentProperties = mappedSessionObject.state[contextId] || {}\n\n if (typeof customElement.attribs === 'object') {\n mappedSessionObject.state[contextId] = {\n ...currentProperties,\n ...state,\n ...mappedComponent.state,\n ...customElement.attribs\n }\n } else {\n mappedSessionObject.state[contextId] = {\n ...currentProperties,\n ...state,\n ...mappedComponent.state\n }\n }\n\n const noHydration = customElement.attribs && 'no-hydration' in customElement.attribs\n const componentElement = await this.createComponentElement({\n id: customElement.name,\n state: mappedSessionObject.state[contextId],\n element: customElement,\n page: pageContext || originalDocument.page,\n root: mappedComponent.root,\n contextId,\n index: i,\n session: mappedSessionObject,\n noHydration\n })\n\n if (componentElement) {\n if (noHydration) {\n const parent = customElement.parent\n if (parent && parent.children) {\n const elementIndex = parent.children.indexOf(customElement)\n if (elementIndex !== -1) {\n for (let j = 0; j < componentElement.children.length; j++) {\n componentElement.children[j].parent = parent\n }\n parent.children.splice(elementIndex, 1, ...componentElement.children)\n }\n }\n } else {\n customElement.children = componentElement.children\n for (let j = 0; j < customElement.children.length; j++) {\n customElement.children[j].parent = customElement\n }\n\n if (!customElement.attribs) {\n customElement.attribs = {}\n }\n customElement.attribs['data-cid'] = contextId\n\n mappedSessionObject.componentTags.add(customElement.name)\n }\n }\n }\n}\n\nCoralite.prototype._generatePages = async function* (path, state = {}) {\n const isProduction = this.options.mode === 'production'\n\n if (path) {\n const paths = Array.isArray(path) ? path : [path]\n for (const p of paths) {\n if (!this.pages.getItem(p)) {\n try {\n await this.pages.setItem(p)\n } catch (e) {\n // Path might not be a direct file, could be a glob or dir handled by resolvePageQueue\n }\n }\n }\n }\n\n const queue = resolvePageQueue(this.pages, path)\n\n const buildId = randomUUID()\n this._renderQueues.set(buildId, queue)\n const scriptResultCache = new Map()\n\n try {\n const activeQueue = this._renderQueues.get(buildId)\n\n for (let q = 0; q < activeQueue.length; q++) {\n const pageItem = activeQueue[q]\n const startTime = performance.now()\n\n /** @type {CoraliteComponent & CoraliteComponentResult} */\n const originalDocument = pageItem.result\n\n /** @type {CoraliteComponent & CoraliteComponentResult} */\n // @ts-ignore\n let component\n let pageContext = originalDocument.page\n\n // If the page was discovery-only initialized (no root AST), parse it on-demand\n if (!originalDocument.root) {\n let content = pageItem.content\n if (content === undefined) {\n try {\n content = await getHtmlFile(pageItem.path.pathname)\n } catch (e) {\n // Re-check content in case it was set concurrently or by a plugin (virtual pages)\n if (pageItem.content !== undefined) {\n content = pageItem.content\n } else {\n throw e\n }\n }\n }\n\n // Temporarily store content so plugins can find it via app.pages.getItem()\n pageItem.content = content\n\n const elements = parseHTML(content, this.options.ignoreByAttribute, this.options.skipRenderByAttribute, (errorData) => this._handleError(errorData))\n\n // Shallow clone page object to avoid polluting state across builds\n pageContext = {\n ...originalDocument.page,\n meta: { ...originalDocument.page.meta }\n }\n const pageState = {\n ...originalDocument.state,\n page: pageContext\n }\n\n const mappedContext = await this._triggerPluginHook('onPageSet', {\n elements,\n state: pageState,\n page: pageContext,\n data: pageItem\n })\n\n const fullPath = Object.assign({}, mappedContext.data.path, {\n pages: this.options.path.pages,\n components: this.options.path.components\n })\n /** @type {CoraliteComponent & CoraliteComponentResult} */\n // @ts-ignore\n component = {\n // @ts-ignore\n state: { ...mappedContext.state },\n page: mappedContext.page,\n path: fullPath,\n root: mappedContext.elements.root,\n customElements: mappedContext.elements.customElements,\n tempElements: mappedContext.elements.tempElements,\n skipRenderElements: mappedContext.elements.skipRenderElements,\n ignoreByAttribute: this.options.ignoreByAttribute || []\n }\n\n } else {\n // Deep clone the document to ensure thread safety\n component = cloneComponentInstance(originalDocument)\n component.ignoreByAttribute = component.ignoreByAttribute || this.options.ignoreByAttribute || []\n\n // Ensure pageContext is correctly initialized from cloned component\n pageContext = component.page\n }\n\n // Merge state into component\n Object.assign(component.state, state)\n\n // Initialize Render Context\n const session = this._createSession(buildId)\n // @ts-ignore\n session.mode = this.options.mode\n\n const mappedSession = await this._triggerPluginHook('onBeforePageRender', {\n component,\n state,\n page: pageContext,\n session\n })\n\n const mappedComponent = mappedSession.component\n const mappedSessionObject = mappedSession.session\n\n // reassign the top-level state object in case it was modified\n state = mappedSession.state\n\n // @ts-ignore\n mappedSessionObject.mode = this.options.mode\n\n // remove temporary elements\n removeElements(mappedComponent.tempElements, false)\n\n await this._processCustomElementsInPage(mappedComponent, originalDocument, state, mappedSessionObject, pageContext)\n\n const { head: headElement, body: bodyElement } = findHeadAndBody(mappedComponent.root)\n\n if (this.options.externalStyles && this.options.externalStyles.length > 0) {\n injectExternalStyles(mappedComponent.root, headElement, this.options.externalStyles)\n }\n\n if (mappedSessionObject.styles.size > 0) {\n injectStyles(mappedComponent.root, headElement, mappedSessionObject.styles)\n }\n\n if (mappedSessionObject.componentTags.size > 0) {\n const targetElement = headElement || bodyElement || mappedComponent.root\n const layoutStyleElement = createCoraliteElement({\n type: 'tag',\n name: 'style',\n parent: targetElement,\n attribs: {\n id: 'coralite-components'\n },\n children: []\n })\n\n const selectors = Array.from(mappedSessionObject.componentTags)\n selectors.push('c-token')\n const selector = selectors.join(', ')\n layoutStyleElement.children.push(createCoraliteTextNode({\n type: 'text',\n data: `${selector} { display: contents; }`,\n parent: layoutStyleElement\n }))\n\n if (targetElement === headElement || targetElement === bodyElement) {\n targetElement.children.push(layoutStyleElement)\n } else {\n targetElement.children.unshift(layoutStyleElement)\n }\n }\n\n if (mappedSessionObject.scripts.content[mappedComponent.path.pathname]) {\n const scripts = mappedSessionObject.scripts.content[mappedComponent.path.pathname]\n\n // Build instances object for script manager\n /** @type {Object.<string, InstanceContext>} */\n const instances = {}\n const componentIds = new Set()\n for (const key in scripts) {\n if (Object.prototype.hasOwnProperty.call(scripts, key)) {\n const script = scripts[key]\n componentIds.add(script.componentId)\n // extending script content with templateId and values\n instances[script.id] = {\n instanceId: script.id,\n componentId: script.componentId,\n page: script.page,\n state: script.state\n }\n }\n }\n\n // Generate a deterministic cache key based on the sorted list of components required by this page\n const cacheKey = Array.from(componentIds).sort().join(',')\n\n let scriptResult\n if (scriptResultCache.has(cacheKey)) {\n scriptResult = scriptResultCache.get(cacheKey)\n } else {\n // Wrap hydration state in AST-safe normalization to prevent circularity\n /** @type {Object.<string, InstanceContext>} **/\n const normalizedInstances = {}\n for (const [id, instance] of Object.entries(instances)) {\n normalizedInstances[id] = {\n ...instance,\n state: normalizeObjectFunctions(instance.state, astTransformer)\n }\n }\n\n // Use script manager to compile all instances\n scriptResult = await this._scriptManager.compileAllInstances(normalizedInstances, this.options.mode)\n scriptResultCache.set(cacheKey, scriptResult)\n\n // Store the asset results in the coralite instance to be saved later\n if (!this.outputFiles) {\n this.outputFiles = {}\n }\n Object.assign(this.outputFiles, scriptResult.outputFiles)\n }\n\n if (!scriptResult.manifest['chunk-shared']) {\n this._handleError({\n level: 'ERR',\n message: 'MANIFEST MISSING chunk-shared!',\n error: new Error(JSON.stringify(scriptResult.manifest))\n })\n }\n\n injectReadinessScript(mappedComponent.root, headElement, true)\n injectImportMap(mappedComponent.root, headElement, scriptResult.importMap)\n\n const chunkManifest = { ...scriptResult.manifest }\n delete chunkManifest['chunk-shared']\n\n const base = this.options.baseURL.endsWith('/') ? this.options.baseURL : this.options.baseURL + '/'\n const scriptContent = generateClientRuntime({\n base,\n sharedChunkPath: scriptResult.manifest['chunk-shared'],\n chunkManifest\n })\n\n const hydrationData = {}\n for (const [id, instance] of Object.entries(instances)) {\n const contextId = instance.instanceId\n if (instance.state && Object.keys(instance.state).length > 0) {\n // Ensure state is normalized to remove circular AST nodes before JSON serialization\n hydrationData[contextId] = normalizeObjectFunctions(instance.state, astTransformer)\n }\n }\n\n const hydrationScriptElement = createCoraliteElement({\n type: 'tag',\n name: 'script',\n parent: bodyElement,\n attribs: {\n id: '__CORALITE_HYDRATION__',\n type: 'application/json'\n },\n children: []\n })\n\n hydrationScriptElement.children.push(createCoraliteTextNode({\n type: 'text',\n data: JSON.stringify(hydrationData),\n parent: hydrationScriptElement\n }))\n\n bodyElement.children.push(hydrationScriptElement)\n\n const scriptElement = createCoraliteElement({\n type: 'tag',\n name: 'script',\n parent: bodyElement,\n attribs: {\n type: 'module'\n },\n children: []\n })\n\n scriptElement.children.push(createCoraliteTextNode({\n type: 'text',\n data: scriptContent,\n parent: scriptElement\n }))\n\n bodyElement.children.push(scriptElement)\n }\n\n // remove skip render elements\n removeElements(mappedComponent.skipRenderElements, true)\n\n if (!mappedSessionObject.scripts.content[mappedComponent.path.pathname]) {\n injectReadinessScript(mappedComponent.root, headElement, false)\n }\n\n let rawHTML = ''\n // render document\n rawHTML = this.transform(mappedComponent.root)\n\n\n yield {\n type: 'page',\n path: mappedComponent.path,\n content: rawHTML,\n duration: performance.now() - startTime,\n session\n }\n\n // Explicitly nullify large objects to help GC\n if (isProduction) {\n mappedComponent.root = null\n mappedComponent.customElements = null\n mappedComponent.tempElements = null\n mappedComponent.skipRenderElements = null\n }\n\n if (isProduction) {\n // In production, we can discard the yielded content from the item\n // but we must keep the result object (minus the AST) for metadata and rebuilds.\n delete pageItem.content\n }\n\n // Explicitly nullify render context contents to help GC\n session.state = null\n session.styles = null\n session.scripts = null\n if (session.source) {\n session.source.contextInstances = null\n session.source = null\n }\n }\n } finally {\n this._renderQueues.delete(buildId)\n }\n}\n\n/**\n * @callback BuildPageHandler\n * @param {CoraliteResult} result - The rendered output document for a specific page.\n * @returns {Promise<any> | any} The transformed result to be collected (falsy values are filtered).\n */\n\n/**\n * Compiles pages and collects the results with controlled concurrency.\n * Can optionally transform each result via a callback before collecting.\n *\n * @overload\n * @param {string | string[]} [path] - The target directory or an array of specific page paths to build.\n * @returns {Promise<CoraliteResult[]>} A Promise that resolves to an array of build results.\n *\n * @overload\n * @param {BuildPageHandler} callback - A function invoked for each page to transform the result.\n * @returns {Promise<CoraliteResult[]>} A Promise that resolves to an array of build results.\n *\n * @overload\n * @param {string | string[]} [path] - The target directory or an array of specific page paths to build.\n * @param {Object} [options] - Configuration options for the build process.\n * @param {number} [options.maxConcurrent=availableParallelism] - The maximum number of concurrent file write operations.\n * @param {AbortSignal} [options.signal] - An AbortSignal to cancel the build operation.\n * @param {Object} [options.variables] - Local variables for the page\n * @returns {Promise<CoraliteResult[]>} A Promise that resolves to an array of build results.\n *\n * @overload\n * @param {string | string[]} [path] - The target directory or an array of specific page paths to build.\n * @param {BuildPageHandler} callback - A function invoked for each page to transform the result.\n * @returns {Promise<any[]>} A Promise that resolves to an array of the transformed results.\n *\n * @overload\n * @param {string | string[]} [path] - The target directory or an array of specific page paths to build.\n * @param {Object} [options] - Configuration options for the build process.\n * @param {number} [options.maxConcurrent=availableParallelism] - The maximum number of concurrent file write operations.\n * @param {AbortSignal} [options.signal] - An AbortSignal to cancel the build operation.\n * @param {BuildPageHandler} callback - A function invoked for each page to transform the result.\n * @returns {Promise<any[]>} A Promise that resolves to an array of the transformed results.\n *\n * @example\n * // Build and get all results\n * const results = await coralite.build('./dist')\n * // results is CoraliteResult[]\n *\n * // Build and transform results\n * const titles = await coralite.build('./dist', (result) => {\n * return result.path\n * })\n */\nCoralite.prototype.build = async function (...args) {\n const startTime = performance.now()\n let path = args[0]\n let options\n let callback\n\n // add callback since there are no options\n if (typeof args[0] === 'function') {\n path = null\n callback = args[0]\n } else if (typeof args[1] === 'function') {\n callback = args[1]\n } else {\n options = args[1]\n callback = args[2]\n }\n\n if (!options) {\n options = {}\n }\n\n const mappedBeforeBuild = await this._triggerPluginHook('onBeforeBuild', {\n path,\n options\n })\n\n path = mappedBeforeBuild.path\n options = mappedBeforeBuild.options\n\n // Add options with defaults\n const signal = options?.signal\n const maxConcurrent = options?.maxConcurrent || availableParallelism()\n const variables = options?.variables\n\n // Initialize the limiter\n const limit = pLimit(maxConcurrent)\n const executing = new Set()\n const results = []\n let buildError = null\n const isStreaming = !!callback\n\n try {\n for await (const result of this._generatePages(path, variables)) {\n // Check for immediate cancellation\n if (signal?.aborted) {\n throw signal.reason\n }\n\n // Backpressure - don't pull more data than we can process\n if (executing.size >= limit.concurrency) {\n await Promise.race(executing)\n }\n\n const task = limit(async () => {\n // Exit early if build was cancelled while in queue\n if (signal?.aborted) {\n throw signal.reason\n }\n\n // Trigger onAfterPageRender hooks using the aggregate method\n const additionalPages = await this._triggerPluginAggregateHook('onAfterPageRender', {\n result,\n session: result.session\n })\n\n const items = [result]\n\n // Process any dynamically generated pages returned by the plugins\n for (const newPage of additionalPages) {\n if (newPage && newPage.path && newPage.content) {\n // Mock path data for dynamically generated pages if needed\n if (typeof newPage.path === 'string') {\n newPage.path = {\n pathname: newPage.path,\n filename: join(newPage.path),\n dirname: dirname(newPage.path)\n }\n }\n items.push(newPage)\n }\n }\n\n const finalResults = []\n\n for (const item of items) {\n if (typeof callback === 'function') {\n const transformed = await callback(item)\n if (transformed) {\n finalResults.push(transformed)\n }\n } else {\n finalResults.push(item)\n }\n }\n\n return finalResults\n })\n\n executing.add(task)\n\n // Clean up task\n task.then((callbackResults) => {\n if (callbackResults && callbackResults.length) {\n results.push(...callbackResults)\n }\n\n executing.delete(task)\n }).catch((err) => {\n executing.delete(task)\n\n this._handleError({\n level: 'ERR',\n message: err.message,\n error: err\n })\n })\n }\n\n await Promise.all(executing)\n\n return results\n\n } catch (error) {\n // Clean up - If one fails or we abort, wait for pending to settle\n await Promise.allSettled(executing)\n\n let finalError = error\n\n if (error.name === 'AbortError') {\n this._handleError({\n level: 'WARN',\n message: 'Build cancelled by user.'\n })\n }\n\n if (error instanceof Error) {\n error.message = `Build failed: ${error.message}`\n finalError = error\n } else {\n finalError = new Error(`Build failed: ${error.message}`, { cause: error })\n }\n\n buildError = finalError\n throw finalError\n } finally {\n const duration = performance.now() - startTime\n await this._triggerPluginHook('onAfterBuild', {\n results,\n error: buildError,\n duration\n })\n\n // Clean up to save memory\n }\n}\n\n/**\n * Compiles and saves pages to disk\n *\n * @param {string | string[]} [path] - Optional page path(s) to build\n * @param {Object} [options] - Build configuration\n * @param {number} [options.maxConcurrent=10] - Max concurrent file writes (min 1, max 100)\n * @param {AbortSignal} [options.signal] - AbortSignal\n * @returns {Promise<{ path: string, duration: number }[]>} Array of saved file paths\n * @example\n * // Build entire site with default concurrency (10 files)\n * await coralite.save()\n *\n * // Build specific pages with custom concurrency\n * await coralite.save(['blog/*'], { maxConcurrent: 5 })\n */\nCoralite.prototype.save = async function (path, options = {}) {\n const signal = options?.signal\n const createdDir = {}\n\n if (!this.options.output) {\n throw new Error('Coralite instance must be configured with an \"output\" option to use save()')\n }\n\n const output = this.options.output\n\n const results = []\n await this.build(path, options, async (result) => {\n let relativeDir, outDir, outFile, contentToWrite\n\n // It's a standard HTML page\n relativeDir = relative(this.options.path.pages, result.path.dirname)\n outDir = join(output, relativeDir)\n outFile = join(outDir, result.path.filename)\n contentToWrite = result.content\n\n if (!createdDir[outDir]) {\n await mkdir(outDir, { recursive: true })\n\n createdDir[outDir] = true\n }\n\n // Pass signal to writeFile so Node can stop the I/O immediately\n await writeFile(outFile, contentToWrite, { signal })\n\n results.push({\n path: outFile,\n duration: result.duration\n })\n\n // Return undefined to prevent build() from accumulating redundant results\n return undefined\n })\n\n // Write ESM script assets generated during the build phase\n if (this.outputFiles) {\n const assetsDir = join(output, 'assets', 'js')\n if (!createdDir[assetsDir]) {\n await mkdir(assetsDir, { recursive: true })\n createdDir[assetsDir] = true\n }\n\n const assetWrites = Object.values(this.outputFiles).map(async (file) => {\n const outFile = join(assetsDir, file.hashedPath)\n const outDir = dirname(outFile)\n\n if (!createdDir[outDir]) {\n await mkdir(outDir, { recursive: true })\n createdDir[outDir] = true\n }\n\n await writeFile(outFile, file.text, { signal })\n results.push({\n path: outFile,\n duration: 0\n })\n })\n\n await Promise.all(assetWrites)\n }\n\n return results\n}\n\n/**\n * Renders the provided node or array of nodes using the render function.\n *\n * @param {CoraliteComponentRoot | CoraliteAnyNode | CoraliteAnyNode[]} root - The node(s) to be rendered.\n * @param {DomSerializerOptions} [options] - Changes serialization behavior\n * @returns {string} returns raw HTML\n */\nCoralite.prototype.transform = function (root, options) {\n // @ts-ignore\n return render(root, {\n decodeEntities: false,\n ...options\n })\n}\n\n/**\n * Adds a page to the current render queue.\n * @param {string|CoraliteCollectionItem} value - The path to a page or a CoraliteCollectionItem to add to the render queue.\n * @param {string} buildId - The unique identifier for the current build process.\n */\nCoralite.prototype.addRenderQueue = async function (value, buildId) {\n if (!buildId) {\n throw new Error('addRenderQueue requires a buildId')\n }\n\n const queue = this._renderQueues.get(buildId)\n\n if (!queue) {\n throw new Error('addRenderQueue - buildId not found: \"' + buildId + '\"')\n }\n\n if (typeof value === 'string') {\n const component = this.pages.getItem(value)\n\n if (!component) {\n throw new Error('addRenderQueue - unexpected page ID: \"' + value + '\"')\n }\n\n queue.push(component)\n } else if (isCoraliteCollectionItem(value)) {\n const component = await this.pages.setItem(value)\n\n // add render queue\n queue.push(component)\n }\n}\n\n/**\n * Retrieves page paths associated with a custom element components.\n *\n * @param {string} path - The original path potentially prefixed with the components directory.\n * @returns {string[]} An array of page paths linked to the custom element component.\n */\nCoralite.prototype.getPagePathsUsingCustomElement = function (path) {\n if (this.options.mode === 'production') {\n return []\n }\n\n // normalize path by removing the components directory prefix\n if (path.startsWith(this.options.path.components)) {\n path = path.substring(this.options.path.components.length + 1)\n }\n\n // retrieve the component item from the components collection\n const item = this.components.getItem(path)\n const pages = []\n\n // if component exists, collect associated page paths\n if (item) {\n const id = this._childCustomElements[item.result.id] || item.result.id\n const pageCustomElements = this._pageCustomElements[id]\n\n if (pageCustomElements) {\n // iterate over custom element paths linked to this component\n pageCustomElements.forEach(path => {\n pages.push(path)\n })\n }\n }\n\n return pages\n}\n\n/**\n * Recursively resolves imperative component dependencies, bundling their HTML and state for the client.\n *\n * @param {string[]} componentIds - Array of component IDs to process.\n * @param {CoraliteSession} session - The current build render context.\n * @param {CoralitePage} page - The global page object\n * @param {CoraliteComponentRoot} root - The root element of the component\n * @param {Object} state - The current token state and state available\n * @returns {Promise<void>}\n */\nCoralite.prototype._processDependentComponents = async function (componentIds, session, page, root, state = {}) {\n if (!componentIds?.length) {\n return\n }\n\n for (const id of componentIds) {\n if (this._scriptManager.sharedFunctions[id]) {\n continue\n }\n\n const moduleComponent = this.components.getItem(id)\n if (!moduleComponent) {\n continue\n }\n\n const module = cloneModuleInstance(moduleComponent.result)\n\n // Evaluate the script\n let scriptResult = {}\n if (module.script) {\n try {\n scriptResult = await this._evaluate({\n module,\n state,\n page,\n root,\n contextId: `dependent-${id}`,\n session\n })\n } catch (error) {\n throw this._createExecutionError(error, module, moduleComponent, page, `dependent-${id}`)\n }\n }\n\n // Safely extract __script__ metadata once\n const scriptMeta = scriptResult.__script__ || {}\n const templateAST = moduleComponent.result.template?.children || []\n const templateValues = moduleComponent.result.values || {}\n\n // Process CSS\n if (module.styles?.length && !moduleComponent.result._processedCss) {\n const rawCss = module.styles.join('\\n')\n const { rootClasses, descendantClasses } = moduleComponent.result\n moduleComponent.result._processedCss = await transformCss(\n rawCss, rootClasses, descendantClasses,\n (errorData) => this._handleError(errorData)\n )\n }\n const stylesHTML = moduleComponent.result._processedCss || ''\n\n // Construct script object\n const scriptObj = {\n content: 'function(){}',\n state: scriptMeta.state || {},\n slots: scriptMeta.slots || {}\n }\n\n let defaultValues = scriptMeta.defaultValues || {}\n let extractedComponents = []\n\n // Extract AST\n if (scriptResult.__script__) {\n const extractedScript = findAndExtractScript(module.script)\n if (extractedScript) {\n scriptObj.content = extractedScript.content\n scriptObj.lineOffset = (module.lineOffset || 0) + extractedScript.lineOffset\n extractedComponents = extractedScript.components || []\n }\n\n const extractedProperties = findAndExtractProperties(module.script)\n if (extractedProperties) {\n scriptObj.stateContent = extractedProperties.content\n scriptObj.stateLineOffset = (module.lineOffset || 0) + extractedProperties.lineOffset\n }\n }\n\n // Deduplicate nested components\n const declarativeComponents = (module.customElements || []).map(el => el.name)\n const nestedComponents = [...new Set([...declarativeComponents, ...extractedComponents])]\n\n scriptObj.components = nestedComponents\n\n // Extract tokens\n const extractTokens = (nodes) => nodes?.flatMap(n => n.tokens?.map(t => t.name) || []) || []\n const allTokens = new Set([\n ...extractTokens(module.values?.attributes),\n ...extractTokens(module.values?.textNodes)\n ])\n\n // Apply token values to defaultValues\n for (const token of allTokens) {\n if (defaultValues[token] === undefined && scriptResult[token] !== undefined) {\n defaultValues[token] = scriptResult[token]\n }\n }\n\n // Process Template Refs\n templateValues?.refs?.forEach(ref => {\n const refKey = `ref_${ref.name}`\n defaultValues[refKey] = ''\n scriptObj.state[refKey] = ''\n })\n\n scriptObj.defaultValues = defaultValues\n\n this._scriptManager.registerComponent({\n id: module.id,\n getters: scriptMeta.getters,\n script: scriptObj,\n filePath: moduleComponent.path.pathname,\n templateAST,\n templateValues,\n defaultValues,\n styles: stylesHTML,\n slots: scriptObj.slots\n })\n\n // Recursively process deeper dependencies\n if (nestedComponents.length > 0) {\n const inheritedState = {\n ...state\n }\n delete inheritedState.__script__\n\n await this._processDependentComponents(nestedComponents, session, page, root, inheritedState)\n }\n\n }\n}\n\n/**\n * @param {Object} options\n * @param {string} options.id - id - Unique identifier for the component\n * @param {CoraliteModuleDefinitions} [options.state={}] - Token state available for replacement\n * @param {CoraliteElement} [options.element] - The original Custom Element node\n * @param {CoralitePage} options.page - The global page object\n * @param {CoraliteComponentRoot} [options.root] - The root element of the component\n * @param {string} [options.contextId] - Context Id\n * @param {number} [options.index] - Context index\n * @param {CoraliteSession} [options.session] - Render Context\n * @param {boolean} [options.noHydration] - Indicates if the component should be stripped and not hydrated\n * @param {boolean} [head=true] - Indicates if the current function call is for the head of the recursion\n * @returns {Promise<CoraliteElement | void>}\n */\nCoralite.prototype.createComponentElement = async function ({\n id,\n state = {},\n element,\n page,\n root,\n contextId,\n index,\n session,\n noHydration\n}, head = true) {\n if (!session) {\n session = this._createSession()\n }\n\n const moduleComponent = this.components.getItem(id)\n\n if (!moduleComponent || !moduleComponent.result) {\n return\n }\n\n const componentId = moduleComponent.result.id\n\n if (!contextId) {\n contextId = session.generateId(componentId)\n }\n\n const instanceId = contextId\n\n let componentState = { ...state }\n\n if (head) {\n if (element && element.attribs) {\n componentState = Object.assign(componentState, element.attribs)\n }\n\n // convert object keys to camel case format for consistent naming conventions\n // @ts-ignore\n componentState = cleanKeys(componentState)\n }\n\n /**\n * clone the component to avoid mutations during replacement process.\n * @type {CoraliteModule}\n */\n const module = cloneModuleInstance(moduleComponent.result)\n\n const mappedComponentContext = await this._triggerPluginHook('onBeforeComponentRender', {\n state: componentState,\n componentId: module.id,\n instanceId,\n refs: module.values.refs,\n textNodes: module.values.textNodes,\n attributes: module.values.attributes,\n page,\n element,\n session\n })\n componentState = mappedComponentContext.state\n\n const result = module.template\n\n if (module.styles.length) {\n const attributeName = 'data-style-selector'\n const selector = module.id\n\n // Check if styles have been processed for this component\n if (!moduleComponent.result._processedCss) {\n const rawCss = module.styles.join('\\n')\n\n const { rootClasses, descendantClasses } = moduleComponent.result\n\n // Transform CSS\n moduleComponent.result._processedCss = await transformCss(rawCss, rootClasses, descendantClasses, (errorData) => this._handleError(errorData))\n }\n\n // Add styles to session (idempotent for the build)\n if (!session.styles.has(selector)) {\n session.styles.set(selector, moduleComponent.result._processedCss)\n }\n\n // Inject attribute into component root elements\n const value = selector\n\n for (let i = 0; i < result.children.length; i++) {\n const child = result.children[i]\n if (child.type === 'tag') {\n if (!child.attribs) {\n child.attribs = {}\n }\n\n // Handle existing attribute value\n child.attribs[attributeName] = value\n }\n }\n }\n\n // merge state from component script\n if (module.script) {\n let scriptResult = {}\n\n try {\n const evaluationState = Object.assign({}, componentState)\n\n scriptResult = await this._evaluate({\n module,\n element,\n state: evaluationState,\n page,\n root: element || root,\n contextId,\n session,\n noHydration\n })\n } catch (error) {\n throw this._createExecutionError(error, module, moduleComponent, page, contextId)\n }\n\n if (scriptResult && scriptResult.__script__ != null) {\n const extractedScript = findAndExtractScript(module.script)\n let extractedComponents = []\n\n if (extractedScript) {\n scriptResult.__script__.lineOffset = (module.lineOffset || 0) + extractedScript.lineOffset\n scriptResult.__script__.content = extractedScript.content\n if (extractedScript.components) {\n extractedComponents = extractedScript.components\n }\n } else {\n // Fallback for when script extraction fails (shouldn't happen with valid defineComponent)\n // Ensure we don't crash\n scriptResult.__script__.lineOffset = module.lineOffset || 0\n scriptResult.__script__.content = 'function(){}'\n }\n\n // Extract processed styles from the module\n const stylesHTML = moduleComponent.result._processedCss || ''\n\n const templateAST = moduleComponent.result.template.children\n const templateValues = moduleComponent.result.values\n const componentTokens = {}\n\n for (let i = 0; i < module.values.attributes.length; i++) {\n const item = module.values.attributes[i]\n for (let j = 0; j < item.tokens.length; j++) {\n componentTokens[item.tokens[j].name] = true\n }\n }\n for (let i = 0; i < module.values.textNodes.length; i++) {\n const item = module.values.textNodes[i]\n for (let j = 0; j < item.tokens.length; j++) {\n componentTokens[item.tokens[j].name] = true\n }\n }\n\n // Include all computed state into default values so client script can use them\n const componentDefaultValues = scriptResult.__script__.defaultValues || {}\n if (componentState) {\n for (const token of Object.keys(componentTokens)) {\n if (componentDefaultValues[token] === undefined && componentState[token] !== undefined) {\n componentDefaultValues[token] = componentState[token]\n }\n }\n }\n\n // Dynamically load any components dynamically inserted if they are explicitly mentioned\n const declarativeComponents = (module.customElements || []).map(el => el.name)\n const mergedComponents = Array.from(new Set([...declarativeComponents, ...extractedComponents]))\n\n if (scriptResult.__script__) {\n scriptResult.__script__.components = mergedComponents\n }\n\n // Register component script with script manager\n this._scriptManager.registerComponent({\n id: module.id,\n getters: scriptResult.__script__.getters,\n script: scriptResult.__script__,\n filePath: moduleComponent.path.pathname,\n templateAST,\n templateValues,\n defaultValues: componentDefaultValues,\n styles: stylesHTML,\n slots: scriptResult.__script__.slots || {}\n })\n\n if (mergedComponents.length > 0) {\n // Merge the evaluated script results into the state context for dependencies\n const inheritedState = Object.assign({}, state)\n delete inheritedState.__script__\n\n await this._processDependentComponents(mergedComponents, session, page, root, inheritedState)\n }\n\n // Ensure state object exists in scriptResult\n if (!scriptResult.__script__.state) {\n scriptResult.__script__.state = {}\n }\n\n\n // Store instance data for script manager\n if (!noHydration) {\n session.scripts.add(page.file.pathname, {\n id: contextId,\n componentId: module.id,\n page,\n state: scriptResult.__script__.state\n })\n }\n\n delete scriptResult.__script__\n }\n\n componentState = Object.assign(componentState, scriptResult)\n }\n\n session.state[contextId] = componentState\n\n // replace tokens in the component with their state from `componentState` object and store them into computed value array for later use if needed (e.g., to be injected back).\n for (let i = 0; i < module.values.attributes.length; i++) {\n const item = module.values.attributes[i]\n\n for (let j = 0; j < item.tokens.length; j++) {\n const token = item.tokens[j]\n let value = componentState[token.name]\n\n if (value == null) {\n // console.error('Token \"' + token.name +'\" was empty used on \"' + moduleComponent.id + '\"')\n value = ''\n }\n\n replaceToken({\n type: 'attribute',\n node: item.element,\n attribute: item.name,\n content: token.content,\n value\n })\n }\n }\n\n for (let i = 0; i < module.values.textNodes.length; i++) {\n const item = module.values.textNodes[i]\n\n for (let j = 0; j < item.tokens.length; j++) {\n const token = item.tokens[j]\n let value = componentState[token.name]\n\n if (value == null) {\n // console.error('Token \"' + token.name +'\" was empty used on \"' + moduleComponent.id + '\"')\n value = ''\n }\n\n replaceToken({\n type: 'textNode',\n node: item.textNode,\n content: token.content,\n value\n })\n }\n }\n\n // replace nested customElements\n const customElements = module.customElements\n let childIndex\n\n // Update slot elements for all custom elements\n for (let i = 0; i < customElements.length; i++) {\n const customElement = customElements[i]\n\n // update slot elements\n if (customElement.children\n && customElement.children.length\n && !customElement.slots.length\n ) {\n for (let j = 0; j < customElement.children.length; j++) {\n const node = customElement.children[j]\n const slotElement = {\n name: 'default',\n node\n }\n\n // @ts-ignore\n if (isCoraliteElement(node) && node.attribs.slot) {\n // add named slot\n // @ts-ignore\n slotElement.name = node.attribs.slot\n }\n\n customElement.slots.push(slotElement)\n }\n }\n }\n\n const createComponentTasks = []\n\n for (let i = 0; i < customElements.length; i++) {\n const customElement = customElements[i]\n\n // Skip if this element is a direct child of another custom element.\n // The parent will handle processing this element via slots.\n // @ts-ignore\n if (customElement.parent && customElement.parent.slots) {\n continue\n }\n\n const childContextId = session.generateId(customElement.name)\n const currentProperties = session.state[childContextId] || {}\n\n let childState = { ...state }\n\n // append custom attributes to state\n if (typeof customElement.attribs === 'object') {\n const attribValues = cleanKeys(customElement.attribs)\n\n childState = {\n ...childState,\n ...currentProperties,\n ...attribValues\n }\n } else {\n childState = {\n ...childState,\n ...currentProperties\n }\n }\n\n session.state[childContextId] = childState\n\n const childNoHydration = noHydration || (customElement.attribs && 'no-hydration' in customElement.attribs)\n\n createComponentTasks.push(\n this.createComponentElement({\n id: customElement.name,\n state: childState,\n element: customElement,\n page,\n root,\n contextId: childContextId,\n index,\n session,\n noHydration: childNoHydration\n }, false).then(childComponentElement => ({\n childComponentElement,\n customElement,\n childContextId,\n noHydration: childNoHydration\n }))\n )\n }\n\n const results = await Promise.all(createComponentTasks)\n\n for (let i = 0; i < results.length; i++) {\n const { childComponentElement, customElement, childContextId, noHydration: childNoHydration } = results[i]\n\n // replace custom element with component\n if (childComponentElement && typeof childComponentElement === 'object') {\n if (childNoHydration) {\n const parent = customElement.parent\n if (parent && parent.children) {\n const elementIndex = parent.children.indexOf(customElement)\n if (elementIndex !== -1) {\n for (let j = 0; j < childComponentElement.children.length; j++) {\n childComponentElement.children[j].parent = parent\n }\n parent.children.splice(elementIndex, 1, ...childComponentElement.children)\n }\n }\n } else {\n customElement.children = childComponentElement.children\n for (let j = 0; j < customElement.children.length; j++) {\n customElement.children[j].parent = customElement\n }\n\n if (!customElement.attribs) {\n customElement.attribs = {}\n }\n customElement.attribs['data-cid'] = childContextId\n\n session.componentTags.add(customElement.name)\n }\n }\n }\n\n await this._replaceSlots(id, element, module, componentState, page, root, index, session, noHydration)\n\n if (noHydration) {\n const stack = [...result.children]\n while (stack.length > 0) {\n const node = stack.pop()\n if (node.type === 'tag') {\n if (node.name === 'c-token') {\n const parent = node.parent\n if (parent && parent.children) {\n const index = parent.children.indexOf(node)\n if (index !== -1) {\n for (let j = 0; j < node.children.length; j++) {\n node.children[j].parent = parent\n }\n parent.children.splice(index, 1, ...node.children)\n }\n }\n } else {\n stack.push(...(node.children || []))\n }\n }\n }\n }\n\n const mappedAfterContext = await this._triggerPluginHook('onAfterComponentRender', {\n result,\n state: componentState,\n componentId: module.id,\n instanceId,\n refs: module.values.refs,\n textNodes: module.values.textNodes,\n attributes: module.values.attributes,\n page,\n element,\n session\n })\n return mappedAfterContext.result\n}\n\n\n/**\n * Replaces slot elements in a component with provided content\n * @internal\n * @param {string} id - Component ID\n * @param {CoraliteElement} element - The original Custom Element node\n * @param {CoraliteModule} module - The component module configuration\n * @param {Object} state - The component state\n * @param {CoralitePage} page - Active page object\n * @param {any} root - The component root element\n * @param {number} index - Index of element\n * @param {CoraliteSession} session - Rendering state\n * @param {boolean} noHydration - No hydration flag\n * @returns {Promise<void>} Resolves when slots are successfully replaced\n */\nCoralite.prototype._replaceSlots = async function (id, element, module, state, page, root, index, session, noHydration) {\n const slots = module.slotElements ? module.slotElements[id] : null\n\n if (!slots) {\n return\n }\n\n const slotChildren = {}\n const slotNames = Object.keys(slots)\n\n for (let i = 0; i < slotNames.length; i++) {\n const slotName = slotNames[i]\n slotChildren[slotName] = []\n }\n\n if (element && element.slots) {\n for (let i = 0; i < element.slots.length; i++) {\n const elementSlotContent = element.slots[i]\n const slotName = elementSlotContent.name\n const slot = slots[slotName]\n\n if (slot) {\n if (elementSlotContent.node.attribs) {\n delete elementSlotContent.node.attribs.slot\n }\n\n slotChildren[slotName].push(elementSlotContent.node)\n }\n }\n }\n\n for (let i = 0; i < slotNames.length; i++) {\n const slotName = slotNames[i]\n let slotNodes = slotChildren[slotName]\n const slot = slots[slotName]\n\n if (!slot.element || !slot.element.parent || !slot.element.parent.children) {\n continue\n }\n\n const slotIndex = slot.element.parent.children.indexOf(slot.element)\n\n const emptySlot = slotNodes.filter(node => {\n return node.type !== 'text' || (node.data && node.data.trim().length > 0)\n })\n\n if (!emptySlot.length) {\n slotNodes = slot.element.children || []\n } else {\n const startIndex = slotNodes.length - 1\n\n for (let i = startIndex; i > -1; i--) {\n const node = slotNodes[i]\n\n if (node.name) {\n const slotComponentItem = this.components.getItem(node.name)\n\n if (slotComponentItem) {\n const slotContextId = session.generateId(node.name)\n const currentProperties = session.state[slotContextId] || {}\n const attribValues = cleanKeys(node.attribs)\n\n if (typeof node.attribs === 'object') {\n session.state[slotContextId] = {\n ...currentProperties,\n ...state,\n ...attribValues\n }\n } else {\n session.state[slotContextId] = Object.assign(currentProperties, state)\n }\n\n const childNoHydration = noHydration || (node.attribs && 'no-hydration' in node.attribs)\n\n const componentElement = await this.createComponentElement({\n id: node.name,\n state: session.state[slotContextId],\n element: node,\n page,\n root,\n contextId: slotContextId,\n index,\n session,\n noHydration: childNoHydration\n }, false)\n\n if (componentElement) {\n if (childNoHydration) {\n const parent = node.parent\n if (parent && parent.children) {\n const elementIndex = parent.children.indexOf(node)\n if (elementIndex !== -1) {\n for (let j = 0; j < componentElement.children.length; j++) {\n componentElement.children[j].parent = parent\n }\n parent.children.splice(elementIndex, 1, ...componentElement.children)\n }\n }\n } else {\n node.children = componentElement.children\n for (let j = 0; j < node.children.length; j++) {\n node.children[j].parent = node\n }\n\n if (!node.attribs) {\n node.attribs = {}\n }\n node.attribs['data-cid'] = slotContextId\n\n session.componentTags.add(node.name)\n }\n }\n }\n }\n }\n }\n\n slot.element.children = slotNodes\n\n for (let j = 0; j < slotNodes.length; j++) {\n if (slotNodes[j]) {\n slotNodes[j].parent = slot.element\n }\n }\n }\n}\n\n\n/**\n * Generates a custom module linker callback for the Node.js VM context.\n * This linker is responsible for resolving `import` statements inside evaluated\n * component scripts. It intercepts specific specifiers to provide synthetic modules\n * for `coralite` and plugins, correctly resolves relative paths against\n * the component's directory, and safely bridges external Node.js modules into the VM sandbox.\n *\n * @internal\n * @param {CoraliteFilePath} path - The file path metadata of the component currently being evaluated. Used as the base for relative imports.\n * @param {CoralitePluginContext} context - Contextual rendering data and state to be exposed when a script imports `'coralite'`.\n * @returns {(specifier: string, referencingModule: import('node:vm').Module, extra: { attributes: any }) => Promise<import('node:vm').Module>} The async linker function used by the VM module.\n */\nCoralite.prototype._moduleLinker = function (path, context) {\n const source = this._source\n const componentDirURL = pathToFileURL(resolve(path.dirname)).href\n\n /**\n * The linker callback invoked by the Node.js VM when an `import` is encountered.\n *\n * @param {string} specifier - The string path of the requested module (e.g., `'./utils.js'`, `'coralite'`).\n * @param {import('node:vm').Module} referencingModule - The VM Module instance that initiated the import request.\n * @param {{ attributes: Record<string, string> }} extra - Additional import constraints, such as import attributes (e.g., `with { type: 'json' }`).\n * @returns {Promise<import('node:vm').Module>} A promise that resolves to a newly instantiated VM SourceTextModule containing the requested exports.\n */\n return async (specifier, referencingModule, extra) => {\n const { SourceTextModule } = await import('node:vm')\n const originalSpecifier = specifier\n\n if (source.plugins[specifier]) {\n const plugin = source.plugins[specifier]\n let pluginExports = ''\n\n for (const key in plugin) {\n if (Object.prototype.hasOwnProperty.call(plugin, key)) {\n pluginExports += `export const ${key} = globalThis.__coralite_plugins__[\"${specifier}\"][\"${key}\"];\\n`\n }\n }\n\n return new SourceTextModule(pluginExports, {\n context: referencingModule.context\n })\n } else if (specifier == 'coralite/utils') {\n const utils = source.utils\n let utilsExports = ''\n\n utilsExports = 'const utils = globalThis.__coralite_utils__; export default utils;'\n\n for (const key in utils) {\n if (Object.prototype.hasOwnProperty.call(utils, key)) {\n utilsExports += `export const ${key} = utils[\"${key}\"];\\n`\n }\n }\n\n return new SourceTextModule(utilsExports, {\n context: referencingModule.context\n })\n } else if (specifier === 'coralite') {\n let coraliteExports = 'const context = globalThis.__coralite_context__; export default context;'\n\n for (const key in context) {\n if (Object.prototype.hasOwnProperty.call(context, key)) {\n coraliteExports += `export const ${key} = context[\"${key}\"];\\n`\n }\n }\n\n coraliteExports += 'export const defineComponent = globalThis.__coralite_define_component__;\\n'\n\n return new SourceTextModule(coraliteExports, {\n context: referencingModule.context\n })\n } else if (specifier.startsWith('.')) {\n // handle relative path\n specifier = pathToFileURL(resolve(path.dirname, specifier)).href\n } else {\n // handle modules\n specifier = import.meta.resolve(specifier, componentDirURL)\n }\n\n try {\n let module\n if (extra.attributes && Object.keys(extra.attributes).length > 0) {\n module = await import(specifier, { with: extra.attributes })\n } else {\n module = await import(specifier)\n }\n let exportModule = ''\n\n for (const key in module) {\n if (Object.prototype.hasOwnProperty.call(module, key)) {\n const name = 'globalThis[\"' + originalSpecifier + '\"].'\n\n if (key === 'default') {\n exportModule += 'export default ' + name + key + ';\\n'\n } else {\n exportModule += 'export const ' + key + ' = ' + name + key + ';\\n'\n }\n }\n\n referencingModule.context[originalSpecifier] = module\n }\n\n const { SourceTextModule } = await import('node:vm')\n\n return new SourceTextModule(exportModule, {\n context: referencingModule.context\n })\n } catch (error) {\n throw new Error(error)\n }\n }\n}\n\n/**\n * Parses a Coralite module script and evaluates it using SourceTextModule.\n *\n * @param {Object} data\n * @param {CoraliteModule} data.module - The Coralite module to parse\n * @param {CoraliteModuleDefinitions} data.state - Replacement tokens for the component\n * @param {CoralitePage} data.page - The global page object\n * @param {any} data.root - The Coralite module to parse\n * @param {string} data.contextId - Context Id\n * @param {CoraliteSession} data.session - Render Context\n * @param {boolean} data.noHydration - No hydration flag\n *\n * @returns {Promise<CoraliteModuleDefinitions>}\n */\nCoralite.prototype._evaluateDevelopment = async function ({\n module,\n state,\n page,\n root,\n contextId,\n session,\n noHydration\n}) {\n const { SourceTextModule } = await import('node:vm')\n\n if (!SourceTextModule) {\n throw new Error('SourceTextModule is not available. Please run Node.js with --experimental-vm-modules to use Development mode.')\n }\n\n const context = {\n state: state || {},\n page,\n root,\n module,\n id: contextId,\n session,\n app: this,\n noHydration\n }\n\n const cachedBoundPlugins = this._bindPlugins(this._source.plugins, context)\n\n session.source.currentSourceContextId = contextId\n session.source.contextInstances[contextId] = context\n\n const boundDefineComponent = (options) => this._defineComponent(options, context)\n\n // Protect fundamental constructors from being extracted and polluting the context realm\n const standardBuiltIns = new Set(['Object', 'Function', 'Array', 'String', 'Boolean', 'Number', 'Math', 'Date', 'RegExp', 'Error', 'EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'JSON', 'Promise', 'Proxy', 'Reflect', 'Map', 'Set', 'WeakMap', 'WeakSet', 'ArrayBuffer', 'SharedArrayBuffer', 'DataView', 'Atomics', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'BigInt', 'BigInt64Array', 'BigUint64Array', 'Symbol', 'Infinity', 'NaN', 'undefined', 'globalThis', 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'unescape'])\n const usedGlobals = extractGlobals(module.script)\n const contextGlobals = {\n __coralite_context__: context,\n __coralite_plugins__: cachedBoundPlugins,\n __coralite_utils__: this._source.utils,\n __coralite_define_component__: boundDefineComponent\n }\n\n for (const glob of usedGlobals) {\n if (!standardBuiltIns.has(glob) && glob in globalThis && globalThis[glob] !== undefined && !(glob in contextGlobals)) {\n contextGlobals[glob] = globalThis[glob]\n }\n }\n\n // Create a fresh context for the module\n const contextifiedObject = createContext(contextGlobals)\n\n const moduleComponent = this.components.getItem(module.id)\n\n // create a new source text module with the provided script content, configuration options, and context\n const script = new SourceTextModule(module.script, {\n initializeImportMeta (meta) {\n meta.url = pathToFileURL(resolve(moduleComponent.path.pathname)).href\n },\n lineOffset: module.lineOffset,\n identifier: resolve(moduleComponent.path.pathname),\n context: contextifiedObject\n })\n\n const linker = this._moduleLinker(moduleComponent.path, context)\n\n await script.link(linker)\n\n // evaluate the module to execute its content\n try {\n await script.evaluate()\n } catch (error) {\n throw this._createExecutionError(error, module, moduleComponent, page, contextId)\n }\n\n // @ts-ignore\n if (script.namespace.default != null) {\n // @ts-ignore\n return await script.namespace.default\n }\n\n // throw an error if no default export was found\n throw new Error(`Module \"${module.id}\" has no default export`)\n}\n\n/**\n * Parses a Coralite module script and compiles it into JavaScript using esbuild.\n * Replaces node:vm SourceTextModule for better performance and memory management.\n *\n * @param {Object} data\n * @param {CoraliteModule} data.module - The Coralite module to parse\n * @param {CoraliteModuleDefinitions} data.state - Replacement tokens for the component\n * @param {CoralitePage} data.page - The global page object\n * @param {any} data.root - The Coralite module to parse\n * @param {string} data.contextId - Context Id\n * @param {CoraliteSession} data.session - Render Context\n * @param {boolean} data.noHydration - No hydration flag\n *\n * @returns {Promise<CoraliteModuleDefinitions>}\n */\nCoralite.prototype._evaluateProduction = async function ({\n module,\n state,\n page,\n root,\n contextId,\n session,\n noHydration\n}) {\n const context = {\n state: state || {},\n page,\n root,\n module,\n id: contextId,\n session,\n app: this,\n noHydration\n }\n\n session.source.currentSourceContextId = contextId\n session.source.contextInstances[contextId] = context\n\n // Retrieve Template and check cache\n const moduleComponent = this.components.getItem(module.id)\n\n if (!moduleComponent.result._compiledCode) {\n const paddingCount = Math.max(0, (module.lineOffset - 1 || 0))\n const padding = '\\n'.repeat(paddingCount)\n\n // Transform using esbuild\n const { code } = await transform(padding + module.script, {\n loader: 'js',\n format: 'cjs',\n target: 'node18',\n platform: 'node'\n })\n\n moduleComponent.result._compiledCode = `(async() => {${code}})();`\n }\n\n // Create a require function anchored to the moduleComponent's file path to resolve relative imports\n const fileRequire = createRequire(resolve(moduleComponent.path.pathname))\n\n let cachedBoundPlugins = null\n\n const customRequire = (id) => {\n const isCoralite = id === 'coralite'\n const isUtils = id === 'coralite/utils'\n const isPlugin = this._source.plugins[id] !== undefined\n\n // Handle internal coralite imports\n if (isCoralite || isUtils || isPlugin) {\n // Lazily bind plugins once per evaluation\n if (!cachedBoundPlugins) {\n cachedBoundPlugins = this._bindPlugins(this._source.plugins, context)\n }\n\n if (isCoralite) {\n return {\n ...context,\n defineComponent: (options) => this._defineComponent(options, context),\n default: {\n ...context,\n defineComponent: (options) => this._defineComponent(options, context)\n }\n }\n }\n\n if (isPlugin) {\n return {\n ...(cachedBoundPlugins[id] || {}),\n default: cachedBoundPlugins[id]\n }\n }\n\n if (isUtils) {\n return {\n ...this._source.utils,\n default: this._source.utils\n }\n }\n }\n\n return fileRequire(id)\n }\n\n // Mock the CommonJS 'module' object to capture exports\n const moduleMock = { exports: {} }\n\n // Create the function. We pass 'coralite' explicitly to support the\n // \"export const document = coralite.document\" pattern found in existing modules.\n // Arguments: module, exports, require, coralite\n if (!moduleComponent.result._compiledFunction) {\n moduleComponent.result._compiledFunction = new Function(\n 'module',\n 'exports',\n 'require',\n 'coralite',\n moduleComponent.result._compiledCode.trim()\n )\n }\n\n const fn = moduleComponent.result._compiledFunction\n\n // Execute the function with our mocks and context\n try {\n await fn(moduleMock, moduleMock.exports, customRequire, context)\n } catch (error) {\n throw this._createExecutionError(error, module, moduleComponent, page, contextId)\n }\n\n if (moduleMock.exports.default != null) {\n return moduleMock.exports.default\n }\n\n throw new Error(`Module \"${module.id}\" has no default export`)\n}\n\n/**\n * Parses a Coralite module script and compiles it into JavaScript using esbuild.\n * Replaces node:vm SourceTextModule for better performance and memory management.\n *\n * @param {Object} data -\n * @param {CoraliteModule} data.module - The Coralite module to parse\n * @param {CoraliteModuleDefinitions} data.state - Replacement tokens for the component\n * @param {CoralitePage} data.page - The global page object\n * @param {any} data.element - The Coralite module to parse\n * @param {string} data.contextId - Context Id\n * @param {CoraliteSession} data.session - Render Context\n *\n * @returns {Promise<CoraliteModuleDefinitions>}\n */\nCoralite.prototype._evaluate = async function (options) {\n if (this.options.mode === 'development') {\n return this._evaluateDevelopment(options)\n }\n return this._evaluateProduction(options)\n}\n\n/**\n * Executes a collecting plugin hook where the results are aggregated.\n * Useful for hooks like `onAfterPageRender` that return new pages to be added to the build.\n *\n * @internal\n * @param {string} name - The name of the hook to trigger.\n * @param {any} contextData - Context to pass to the callbacks (not mutated by this function).\n * @returns {Promise<any[]>} A flattened array of all results returned by the plugins.\n */\nCoralite.prototype._triggerPluginAggregateHook = async function (name, contextData) {\n const pluginHooks = this._plugins.hooks[name]\n const aggregatedResults = []\n\n if (!pluginHooks || pluginHooks.length === 0) {\n return aggregatedResults\n }\n\n for (let i = 0; i < pluginHooks.length; i++) {\n let result = pluginHooks[i]({\n ...contextData,\n app: this\n })\n\n if (result !== null && typeof result === 'object' && typeof result.then === 'function') {\n result = await result\n }\n\n // Collect the results into a flat array instead of merging them into the context\n if (result !== undefined && result !== null) {\n if (Array.isArray(result)) {\n aggregatedResults.push(...result)\n } else {\n aggregatedResults.push(result)\n }\n }\n }\n\n return aggregatedResults\n}\n\n/**\n * @internal Executes Phase 1 of plugin exports with the given context.\n *\n * @param {Object} plugins - The plugins object\n * @param {Object} context - The context object to pass to Phase 1\n * @returns {Object} The Phase 2 functions\n */\nCoralite.prototype._bindPlugins = function (plugins, context) {\n const cachedBoundPlugins = {}\n\n for (const key in plugins) {\n const pluginExports = plugins[key]\n if (pluginExports !== null && typeof pluginExports === 'object') {\n const pluginObj = {}\n for (const prop in pluginExports) {\n if (typeof pluginExports[prop] === 'function') {\n pluginObj[prop] = pluginExports[prop](context)\n } else {\n pluginObj[prop] = pluginExports[prop]\n }\n }\n cachedBoundPlugins[key] = pluginObj\n } else {\n cachedBoundPlugins[key] = pluginExports\n }\n }\n\n return cachedBoundPlugins\n}\n\n/**\n * @template T\n *\n * Executes all plugin callbacks registered under the specified hook name sequentially.\n *\n * @internal\n *\n * @param {'onPageSet'|'onPageUpdate'|'onPageDelete'|'onComponentSet'|'onComponentUpdate'|'onComponentDelete'|'onBeforePageRender'|'onAfterPageRender'|'onBeforeComponentRender'|'onAfterComponentRender'|'onBeforeBuild'|'onAfterBuild'} name - The name of the hook to trigger.\n * @param {T} initialData - Data to pass to each callback function.\n * @returns {Promise<T>} A promise that resolves to the merged data.\n */\nCoralite.prototype._triggerPluginHook = async function (name, initialData) {\n const pluginHooks = this._plugins.hooks[name]\n\n if (!pluginHooks || pluginHooks.length === 0) {\n return initialData\n }\n\n // Clone initial data once to prevent accidental root-level mutations\n // leaking backwards if a plugin still mutates it directly.\n let currentData = typeof initialData === 'object' && initialData !== null\n ? {\n ...initialData,\n app: this\n }\n : initialData\n\n for (let i = 0; i < pluginHooks.length; i++) {\n let result = pluginHooks[i](currentData)\n\n if (result !== null && typeof result === 'object' && typeof result.then === 'function') {\n result = await result\n }\n\n // If the plugin returned a patch, the framework handles the mapping\n if (result !== undefined && result !== null) {\n currentData = mergePluginState(currentData, result)\n }\n }\n\n return currentData\n}\n\n/**\n * Registers a callback function under the specified hook name.\n *\n * @internal\n *\n * @param {'onPageSet'|'onPageUpdate'|'onPageDelete'|'onComponentSet'|'onComponentUpdate'|'onComponentDelete'|'onBeforePageRender'|'onAfterPageRender'|'onBeforeComponentRender'|'onAfterComponentRender'|'onBeforeBuild'|'onAfterBuild'} name - The name of the hook to register the callback with.\n * @param {Function} callback - The callback function to be executed when the hook is triggered.\n */\nCoralite.prototype._addPluginHook = function (name, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`Plugin hook \"${name}\" must be a function`)\n }\n\n if (this._plugins.hooks[name]) {\n this._plugins.hooks[name].push(callback)\n }\n}\n\n/**\n * Replaces a custom element with its template content.\n * @internal\n * @param {CoraliteElement} coraliteElement - The custom element to be replaced.\n * @param {CoraliteElement} element - The target element to replace the tokens with.\n */\nCoralite.prototype._replaceCustomElementWithTemplate = function (coraliteElement, element) {\n coraliteElement.children = element.children\n for (let j = 0; j < coraliteElement.children.length; j++) {\n coraliteElement.children[j].parent = coraliteElement\n }\n}\n\n/**\n * Process a token value - parse HTML strings and handle custom elements\n * @internal\n * @param {any} value - The value to process\n * @param {Object} context - Processing context\n * @param {Attribute[]} [context.excludeByAttribute] - List of attribute name-value pairs to ignore\n * @param {Object} [context.state] - Replacement tokens for the component\n * @param {CoraliteModule} [context.module] - The component module\n * @param {Function} [context.createComponentElement] - The createComponentElement function\n * @param {CoraliteSession} [context.session] - The current build session\n * @param {boolean} [context.noHydration] - No hydration flag\n * @returns {Promise<any>} - Processed value\n */\nCoralite.prototype._processTokenValue = async function (value, context) {\n const { excludeByAttribute, state, module, createComponentElement, session, noHydration } = context\n // If not a string, return as-is\n if (typeof value !== 'string') {\n return value\n }\n\n // Parse HTML string\n const result = parseHTML(value, excludeByAttribute)\n\n // If no children, return undefined (for empty HTML)\n if (!result.root.children.length) {\n return undefined\n }\n\n // Process custom elements\n for (let i = 0; i < result.customElements.length; i++) {\n const customElement = result.customElements[i]\n const cid = `${module.path.pathname}${customElement.name}-${i}`\n const childNoHydration = noHydration || (customElement.attribs && 'no-hydration' in customElement.attribs)\n\n const componentElement = await createComponentElement({\n contextId: cid,\n id: customElement.name,\n state,\n element: customElement,\n module,\n index: i,\n session,\n noHydration: childNoHydration\n })\n\n if (componentElement) {\n if (childNoHydration) {\n const parent = customElement.parent\n if (parent && parent.children) {\n const elementIndex = parent.children.indexOf(customElement)\n if (elementIndex !== -1) {\n for (let j = 0; j < componentElement.children.length; j++) {\n componentElement.children[j].parent = parent\n }\n parent.children.splice(elementIndex, 1, ...componentElement.children)\n }\n }\n } else {\n customElement.children = componentElement.children\n for (let j = 0; j < customElement.children.length; j++) {\n customElement.children[j].parent = customElement\n }\n\n if (!customElement.attribs) {\n customElement.attribs = {}\n }\n customElement.attribs['data-cid'] = cid\n\n session.componentTags.add(customElement.name)\n }\n }\n }\n\n // For static strings, optimize single text nodes\n if (result.root.children.length === 1 && result.root.children[0].type === 'text') {\n return result.root.children[0].data\n }\n\n return result.root.children\n}\n\n/**\n * This function defines a component for the Coralite framework.\n * It is used to register components with their associated state and scripts.\n * @internal\n * @param {Object} options - Configuration options for the component\n * @param {CoralitePluginContext} context - The evaluation context\n * @returns {Promise<Object>} A promise resolving to the module state associated with this component.\n */\nCoralite.prototype._defineComponent = async function (options, context) {\n const {\n attributes,\n data,\n getters,\n slots,\n script\n } = options\n\n const {\n state: initialState,\n module,\n root\n } = context\n\n // Validate attributes\n if (attributes) {\n for (const [key, value] of Object.entries(attributes)) {\n if (value.type === Object || value.type === Array) {\n throw new Error(`Coralite Error: Component \"${module.id}\" defines attribute \"${key}\" as ${value.type.name}. Object and Array types are blocked in attributes for V1.1 to prevent \"JSON-in-HTML\" anti-patterns. Use the data() block for complex data.`)\n }\n }\n }\n\n let state = Object.assign({}, initialState)\n\n const serializableAttributes = {}\n if (attributes) {\n for (const [key, schema] of Object.entries(attributes)) {\n serializableAttributes[key] = {\n type: schema.type.name || schema.type,\n default: schema.default\n }\n }\n }\n\n state.__script__ = {\n attributes: serializableAttributes,\n getters: getters || {},\n state: {},\n defaultValues: {},\n slots: slots || {}\n }\n\n if (attributes) {\n for (const [key, schema] of Object.entries(attributes)) {\n const typeName = schema.type.name || schema.type\n if (state[key] !== undefined) {\n // Coerce existing attribute values\n const value = state[key]\n if (typeName === 'Number') {\n state[key] = Number(value)\n } else if (typeName === 'Boolean') {\n state[key] = value !== 'false' && value !== null && value !== ''\n } else if (typeName === 'String') {\n state[key] = String(value)\n }\n } else if (schema.default !== undefined) {\n state[key] = schema.default\n }\n }\n }\n\n if (typeof data === 'function') {\n const dataResult = await data(context)\n if (dataResult) {\n state.__script__.data = dataResult\n Object.assign(state, dataResult)\n // Ensure data results are added to state.__script__.state for serialization to client\n Object.assign(state.__script__.state, dataResult)\n }\n }\n\n if (getters) {\n const roState = createReadOnlyProxy(state)\n for (const [key, getter] of Object.entries(getters)) {\n // Ensure getters use read-only proxy to preemptively throw error if developer attempts to mutate the state.\n const result = getter(roState, { signal: new AbortController().signal })\n\n if (result && typeof result.then === 'function') {\n state[key] = await result\n } else {\n state[key] = result\n }\n\n // Add getter result to state.__script__.state so it's serialized to the client\n if (state.__script__ && state.__script__.state) {\n state.__script__.state[key] = state[key]\n }\n }\n }\n\n // process computed slots\n if (slots) {\n for (const name in slots) {\n if (Object.prototype.hasOwnProperty.call(slots, name)) {\n const computedSlot = slots[name]\n\n const methodKey = `slots_method_${name}`\n state.__script__.defaultValues[methodKey] = computedSlot\n\n // slot content to compute\n const slotContent = []\n // new slot elements\n const elementSlots = []\n\n // @ts-ignore\n if (root && root.slots) {\n // @ts-ignore\n for (let j = 0; j < root.slots.length; j++) {\n // @ts-ignore\n const slot = root.slots[j]\n\n if (slot.name === name) {\n // slot content to compute\n slotContent.push(slot.node)\n } else {\n elementSlots.push(slot)\n }\n }\n }\n\n // compute slot nodes\n const result = computedSlot(slotContent, state) || slotContent\n\n // append new slot nodes\n if (typeof result === 'string') {\n // process string result through unified processor\n const processedResult = await this._processTokenValue(result, {\n ...context,\n state,\n createComponentElement: context.app.createComponentElement,\n noHydration: context.noHydration\n })\n\n if (Array.isArray(processedResult)) {\n // multiple nodes from parsed HTML\n for (let j = 0; j < processedResult.length; j++) {\n elementSlots.push({\n name,\n node: processedResult[j]\n })\n }\n } else {\n // single text node\n elementSlots.push({\n name,\n node: {\n type: 'text',\n data: processedResult\n }\n })\n }\n } else if (Array.isArray(result)) {\n for (let index = 0; index < result.length; index++) {\n const node = result[index]\n\n if (\n isCoraliteElement(node)\n || isCoraliteTextNode(node)\n || isCoraliteComment(node)\n ) {\n elementSlots.push({\n name,\n node\n })\n } else {\n throw new Error('Unexpected slot value, expected a node but found: '\n + '\\n result: ' + JSON.stringify(node)\n + '\\n path: \"' + module.path.pathname + '\"')\n }\n }\n }\n\n // update element slots\n if (root) {\n // @ts-ignore\n root.slots = elementSlots\n }\n }\n }\n }\n const hasScript = typeof script === 'function'\n const hasSlots = slots && Object.keys(slots).length > 0\n const hasGetters = getters && Object.keys(getters).length > 0\n const hasAttributes = attributes && Object.keys(attributes).length > 0\n const hasData = typeof data === 'function'\n\n if (hasScript || hasSlots || hasGetters || hasAttributes || hasData) {\n if (hasScript) {\n const scriptTextContent = script.toString().trim()\n\n // include state used in script\n const args = {}\n for (const key in state) {\n if (!Object.hasOwn(state, key)) {\n continue\n }\n\n if (scriptTextContent.includes(key) || key.startsWith('ref_')) {\n args[key] = state.__script__.defaultValues[key] !== undefined\n ? state.__script__.defaultValues[key]\n : state[key]\n }\n }\n\n Object.assign(state.__script__.state, args)\n }\n } else {\n // remove custom element parent script\n delete state.__script__\n }\n\n return state\n}\n\nconst coraliteInternalProperty = {\n enumerable: false,\n configurable: false,\n writable: false\n}\n\nObject.defineProperty(Coralite.prototype, '_defaultOnError', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_handleError', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_createExecutionError', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_createSession', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_processCustomElementsInPage', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_generatePages', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_processDependentComponents', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_replaceSlots', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_moduleLinker', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_evaluateDevelopment', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_evaluateProduction', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_evaluate', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_triggerPluginAggregateHook', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_triggerPluginHook', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_bindPlugins', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_addPluginHook', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_replaceCustomElementWithTemplate', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_processTokenValue', coraliteInternalProperty)\nObject.defineProperty(Coralite.prototype, '_defineComponent', coraliteInternalProperty)\n\nexport default Coralite\n", "/**\n *\n */\nexport class CoraliteError extends Error {\n /**\n *\n */\n constructor (message, options = {}) {\n super(message, options)\n this.name = 'CoraliteError'\n this.isCoraliteError = true\n this.componentId = options.componentId\n this.filePath = options.filePath\n this.instanceId = options.instanceId\n this.pagePath = options.pagePath\n\n // Polyfill cause if necessary (node version differences)\n if (options.cause && !this.cause) {\n this.cause = options.cause\n }\n }\n}\n", "/**\n * @import {CoraliteConfig} from '../types/index.js'\n */\n\n/**\n * Validates and defines a Coralite configuration object\n * @param {CoraliteConfig} options - The configuration options to validate and define\n * @returns {CoraliteConfig} The validated configuration object\n * @throws {Error} If the configuration is invalid\n */\nexport function defineConfig (options) {\n // Validate that options is an object\n if (!options || typeof options !== 'object') {\n throw new Error('Config must be an object')\n }\n\n // Validate required string state\n const requiredProps = ['output', 'components', 'pages']\n\n for (const prop of requiredProps) {\n // Check if property exists\n if (!(prop in options)) {\n throw new Error(`Missing required config property: \"${prop}\"`)\n }\n\n // Check if property is a string\n if (typeof options[prop] !== 'string') {\n throw new Error(\n `Config property \"${prop}\" must be a string, received ${typeof options[prop]}`\n )\n }\n\n // Check if property is not empty\n if (options[prop].trim() === '') {\n throw new Error(`Config property \"${prop}\" cannot be empty`)\n }\n }\n\n // Validate optional plugins property\n if ('plugins' in options && options.plugins !== undefined) {\n if (!Array.isArray(options.plugins)) {\n throw new Error(\n `Config property \"plugins\" must be an array, received ${typeof options.plugins}`\n )\n }\n\n // Validate each plugin in the array\n options.plugins.forEach((plugin, index) => {\n if (typeof plugin !== 'object' || plugin === null) {\n throw new Error(\n `Plugin at index ${index} must be an object, received ${typeof plugin}`\n )\n }\n\n if (typeof plugin.name !== 'string' || plugin.name.trim() === '') {\n throw new Error(\n `Plugin at index ${index} must have a valid \"name\" property (non-empty string)`\n )\n }\n })\n }\n\n return options\n}\n", "import Coralite from './coralite.js'\n\nexport * from './html.js'\nexport * from './parse.js'\nexport * from './utils.js'\nexport * from './plugin.js'\nexport * from './config.js'\nexport * from './type-helper.js'\nexport * from './errors.js'\nexport * from './script-manager.js'\n\nexport { Coralite }\nexport default Coralite\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["transform", "path", "target", "dirname", "path", "path", "parseJS", "walkJS", "dirname", "render", "parseJS", "walkJS", "dirname", "path", "dirname", "join", "parse", "existsSync", "require", "mkdir", "dirname", "join", "relative", "resolve", "createRequire", "pathToFileURL", "availableParallelism", "render", "pLimit", "path", "ignoreByAttribute", "skipRenderByAttribute", "pathToFileURL", "join", "relative", "dirname", "i", "component", "isProduction", "availableParallelism", "pLimit", "mkdir", "render", "index", "resolve", "SourceTextModule", "createRequire"]
|
|
7
7
|
}
|