@litsx/babel-preset-litsx 0.4.0 → 0.5.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"transform-litsx-renderer-props.cjs","sources":["../../../jsx-authoring/src/index.js","../../src/internal/transform-litsx-renderer-props.js"],"sourcesContent":["import MagicString from \"magic-string\";\n\nconst PREFIX_TO_KIND = {\n \"@\": \"event\",\n \".\": \"prop\",\n \"?\": \"bool\",\n};\n\nconst KIND_TO_PREFIX = {\n event: \"@\",\n prop: \".\",\n bool: \"?\",\n};\n\nconst ATTR_NAME_CHAR = /[\\w:-]/;\nconst TAG_NAME_START_CHAR = /[A-Za-z]/;\nconst TAG_NAME_CHAR = /[\\w:.-]/;\nconst MACRO_NAME_START_CHAR = /[A-Za-z$_]/;\nconst MACRO_NAME_CHAR = /[A-Za-z0-9$_]/;\n\nfunction isWhitespace(char) {\n return char === \" \" || char === \"\\t\" || char === \"\\n\" || char === \"\\r\";\n}\n\nfunction isReservedVirtualAttributeName(name) {\n return /^__litsx_(event|prop|bool)_/.test(name);\n}\n\nfunction sanitizeIdentifierTailChar(char) {\n return /[A-Za-z0-9$_]/.test(char) ? char : \"_\";\n}\n\nfunction encodeEditorVirtualAttributeName(name) {\n const prefix = name[0];\n const localName = name.slice(1);\n const encodedPrefix = prefix === \"@\" ? \"e\" : prefix === \".\" ? \"p\" : \"b\";\n return `${encodedPrefix}${Array.from(localName, sanitizeIdentifierTailChar).join(\"\")}`;\n}\n\nfunction encodeEditorStaticHoistName(originalName, macroName) {\n return `$${macroName}`;\n}\n\nfunction scanQuotedString(sourceText, start, quote) {\n let index = start + 1;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n if (char === \"\\\\\") {\n index += 2;\n continue;\n }\n if (char === quote) {\n return index + 1;\n }\n index += 1;\n }\n\n return index;\n}\n\nfunction scanLineComment(sourceText, start) {\n let index = start + 2;\n while (index < sourceText.length && sourceText[index] !== \"\\n\") {\n index += 1;\n }\n return index;\n}\n\nfunction scanBlockComment(sourceText, start) {\n let index = start + 2;\n while (index < sourceText.length) {\n if (sourceText[index] === \"*\" && sourceText[index + 1] === \"/\") {\n return index + 2;\n }\n index += 1;\n }\n return index;\n}\n\nfunction scanTemplateLiteral(sourceText, start) {\n let index = start + 1;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n if (char === \"\\\\\") {\n index += 2;\n continue;\n }\n if (char === \"`\") {\n return index + 1;\n }\n if (char === \"$\" && sourceText[index + 1] === \"{\") {\n index = scanBalancedBraces(sourceText, index + 1);\n continue;\n }\n index += 1;\n }\n\n return index;\n}\n\nfunction scanBalancedBraces(sourceText, start) {\n let depth = 0;\n let index = start;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n const next = sourceText[index + 1];\n\n if (char === \"'\" || char === \"\\\"\") {\n index = scanQuotedString(sourceText, index, char);\n continue;\n }\n\n if (char === \"`\") {\n index = scanTemplateLiteral(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"/\") {\n index = scanLineComment(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n index = scanBlockComment(sourceText, index);\n continue;\n }\n\n if (char === \"{\") {\n depth += 1;\n index += 1;\n continue;\n }\n\n if (char === \"}\") {\n depth -= 1;\n index += 1;\n if (depth <= 0) {\n return index;\n }\n continue;\n }\n\n index += 1;\n }\n\n return index;\n}\n\nfunction scanBalancedBracesWithJsx(sourceText, start, replacements, encodeAttributeName) {\n let depth = 0;\n let index = start;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n const next = sourceText[index + 1];\n\n if (char === \"'\" || char === \"\\\"\") {\n index = scanQuotedString(sourceText, index, char);\n continue;\n }\n\n if (char === \"`\") {\n index = scanTemplateLiteral(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"/\") {\n index = scanLineComment(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n index = scanBlockComment(sourceText, index);\n continue;\n }\n\n if (char === \"<\" && isLikelyJsxTagStart(sourceText, index)) {\n index = scanJsxElement(sourceText, index, replacements, encodeAttributeName);\n continue;\n }\n\n if (char === \"{\") {\n depth += 1;\n index += 1;\n continue;\n }\n\n if (char === \"}\") {\n depth -= 1;\n index += 1;\n if (depth <= 0) {\n return index;\n }\n continue;\n }\n\n index += 1;\n }\n\n return index;\n}\n\nfunction trimTrailingWhitespaceAndComments(sourceText) {\n let text = sourceText;\n let changed = true;\n\n while (changed) {\n changed = false;\n\n const trimmedWhitespace = text.replace(/\\s+$/u, \"\");\n if (trimmedWhitespace !== text) {\n text = trimmedWhitespace;\n changed = true;\n }\n\n const trimmedLineComment = text.replace(/\\/\\/[^\\n\\r]*$/u, \"\");\n if (trimmedLineComment !== text) {\n text = trimmedLineComment;\n changed = true;\n continue;\n }\n\n const trimmedBlockComment = text.replace(/\\/\\*[\\s\\S]*?\\*\\/$/u, \"\");\n if (trimmedBlockComment !== text) {\n text = trimmedBlockComment;\n changed = true;\n }\n }\n\n return text;\n}\n\nfunction previousSignificantIndex(sourceText, start) {\n let index = start - 1;\n while (index >= 0 && isWhitespace(sourceText[index])) {\n index -= 1;\n }\n return index;\n}\n\nfunction readPreviousWord(sourceText, endIndex) {\n let index = endIndex;\n while (index >= 0 && /[A-Za-z]/.test(sourceText[index])) {\n index -= 1;\n }\n return sourceText.slice(index + 1, endIndex + 1);\n}\n\nfunction isLikelyJsxTagStart(sourceText, index) {\n const next = sourceText[index + 1];\n if (!TAG_NAME_START_CHAR.test(next || \"\")) {\n return false;\n }\n\n const previousIndex = previousSignificantIndex(sourceText, index);\n if (previousIndex < 0) {\n return true;\n }\n\n const previousChar = sourceText[previousIndex];\n if (\"=({[,!?:;>&|\".includes(previousChar)) {\n return true;\n }\n\n const previousWord = readPreviousWord(sourceText, previousIndex);\n return [\"return\", \"case\", \"throw\", \"yield\", \"else\"].includes(previousWord);\n}\n\nfunction readJsxTagName(sourceText, start) {\n let index = start + 1;\n const isClosing = sourceText[index] === \"/\";\n\n if (isClosing) {\n index += 1;\n }\n\n if (!TAG_NAME_START_CHAR.test(sourceText[index] || \"\")) {\n return null;\n }\n\n const nameStart = index;\n\n while (index < sourceText.length && TAG_NAME_CHAR.test(sourceText[index])) {\n index += 1;\n }\n\n return {\n name: sourceText.slice(nameStart, index),\n isClosing,\n end: index,\n };\n}\n\nfunction scanJsxTag(sourceText, start, replacements, encodeAttributeName) {\n const tag = readJsxTagName(sourceText, start);\n\n if (!tag) {\n return {\n end: start + 1,\n tagName: null,\n isClosing: false,\n selfClosing: false,\n };\n }\n\n let index = tag.end;\n\n if (tag.isClosing) {\n while (index < sourceText.length) {\n if (sourceText[index] === \">\") {\n return {\n end: index + 1,\n tagName: tag.name,\n isClosing: true,\n selfClosing: false,\n };\n }\n\n index += 1;\n }\n\n return {\n end: index,\n tagName: tag.name,\n isClosing: true,\n selfClosing: false,\n };\n }\n\n function scanAttributeValue(valueStart) {\n let valueIndex = valueStart;\n\n while (valueIndex < sourceText.length && isWhitespace(sourceText[valueIndex])) {\n valueIndex += 1;\n }\n\n if (valueIndex >= sourceText.length) {\n return valueIndex;\n }\n\n const valueChar = sourceText[valueIndex];\n if (valueChar === \"{\") {\n return scanBalancedBracesWithJsx(\n sourceText,\n valueIndex,\n replacements,\n encodeAttributeName\n );\n }\n\n if (valueChar === \"'\" || valueChar === \"\\\"\") {\n return scanQuotedString(sourceText, valueIndex, valueChar);\n }\n\n while (\n valueIndex < sourceText.length &&\n !isWhitespace(sourceText[valueIndex]) &&\n sourceText[valueIndex] !== \">\" &&\n !(sourceText[valueIndex] === \"/\" && sourceText[valueIndex + 1] === \">\")\n ) {\n valueIndex += 1;\n }\n\n return valueIndex;\n }\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n const next = sourceText[index + 1];\n\n if (char === \">\") {\n return {\n end: index + 1,\n tagName: tag.name,\n isClosing: false,\n selfClosing: false,\n };\n }\n\n if (char === \"/\" && next === \">\") {\n return {\n end: index + 2,\n tagName: tag.name,\n isClosing: false,\n selfClosing: true,\n };\n }\n\n if (isWhitespace(char)) {\n index += 1;\n continue;\n }\n\n if (char === \"{\") {\n index = scanBalancedBracesWithJsx(\n sourceText,\n index,\n replacements,\n encodeAttributeName\n );\n continue;\n }\n\n if (char === \"'\" || char === \"\\\"\") {\n index = scanQuotedString(sourceText, index, char);\n continue;\n }\n\n if (Object.hasOwn(PREFIX_TO_KIND, char) && ATTR_NAME_CHAR.test(next || \"\")) {\n const attrStart = index;\n index += 1;\n\n while (index < sourceText.length && ATTR_NAME_CHAR.test(sourceText[index])) {\n index += 1;\n }\n\n const originalName = sourceText.slice(attrStart, index);\n replacements.push({\n start: attrStart,\n end: index,\n originalName,\n replacement: encodeAttributeName(originalName),\n });\n\n while (index < sourceText.length && isWhitespace(sourceText[index])) {\n index += 1;\n }\n if (sourceText[index] === \"=\") {\n index = scanAttributeValue(index + 1);\n }\n continue;\n }\n\n const attrStart = index;\n while (\n index < sourceText.length &&\n !isWhitespace(sourceText[index]) &&\n sourceText[index] !== \"=\" &&\n sourceText[index] !== \">\" &&\n !(sourceText[index] === \"/\" && sourceText[index + 1] === \">\")\n ) {\n index += 1;\n }\n\n if (index === attrStart) {\n index += 1;\n continue;\n }\n\n while (index < sourceText.length && isWhitespace(sourceText[index])) {\n index += 1;\n }\n if (sourceText[index] === \"=\") {\n index = scanAttributeValue(index + 1);\n }\n }\n\n return {\n end: index,\n tagName: tag.name,\n isClosing: false,\n selfClosing: false,\n };\n}\n\nfunction scanJsxElement(sourceText, start, replacements, encodeAttributeName) {\n const openingTag = scanJsxTag(sourceText, start, replacements, encodeAttributeName);\n\n if (\n openingTag.isClosing ||\n openingTag.selfClosing ||\n !openingTag.tagName\n ) {\n return openingTag.end;\n }\n\n let index = openingTag.end;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n const next = sourceText[index + 1];\n\n if (char === \"'\" || char === \"\\\"\") {\n index = scanQuotedString(sourceText, index, char);\n continue;\n }\n\n if (char === \"`\") {\n index = scanTemplateLiteral(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"/\") {\n index = scanLineComment(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n index = scanBlockComment(sourceText, index);\n continue;\n }\n\n if (char === \"{\") {\n index = scanBalancedBracesWithJsx(\n sourceText,\n index,\n replacements,\n encodeAttributeName\n );\n continue;\n }\n\n if (char === \"<\") {\n const nestedTag = readJsxTagName(sourceText, index);\n\n if (!nestedTag) {\n index += 1;\n continue;\n }\n\n if (nestedTag.isClosing && nestedTag.name === openingTag.tagName) {\n return scanJsxTag(sourceText, index, replacements, encodeAttributeName).end;\n }\n\n if (!nestedTag.isClosing) {\n index = scanJsxElement(sourceText, index, replacements, encodeAttributeName);\n continue;\n }\n }\n\n index += 1;\n }\n\n return index;\n}\n\nexport function encodeVirtualAttributeName(name) {\n const prefix = name[0];\n const localName = name.slice(1);\n const kind = PREFIX_TO_KIND[prefix];\n\n if (!kind) {\n return name;\n }\n\n return `__litsx_${kind}_${localName}`;\n}\n\nexport function decodeVirtualAttributeName(name) {\n const match = /^__litsx_(event|prop|bool)_(.+)$/.exec(name);\n\n if (!match) {\n return null;\n }\n\n const [, kind, localName] = match;\n return `${KIND_TO_PREFIX[kind]}${localName}`;\n}\n\nexport function decodeVirtualStaticHoistName(name) {\n const match = /^__litsx_static_([A-Za-z$_][A-Za-z0-9$_]*)$/.exec(name);\n\n if (!match) {\n return null;\n }\n\n return `^${match[1]}`;\n}\n\nexport function remapVirtualText(text) {\n if (typeof text !== \"string\") {\n return text;\n }\n\n return text\n .replace(/__litsx_(event|prop|bool)_[\\w:-]+/g, (name) => (\n decodeVirtualAttributeName(name) ?? name\n ))\n .replace(/__litsx_static_[A-Za-z$_][A-Za-z0-9$_]*/g, (name) => (\n decodeVirtualStaticHoistName(name) ?? name\n ));\n}\n\nexport function looksLikeLitsxJsx(sourceText) {\n return (\n /<[\\w.-]+[^>]*\\s(?:[@.?][\\w:-]+)/m.test(sourceText) ||\n /(?:^|[;{}]\\s*)\\^[A-Za-z$_][A-Za-z0-9$_]*/m.test(sourceText) ||\n /^\\s*\\^[A-Za-z$_][A-Za-z0-9$_]*/m.test(sourceText)\n );\n}\n\nfunction isLikelyStaticMacroStart(sourceText, index) {\n const next = sourceText[index + 1];\n if (!MACRO_NAME_START_CHAR.test(next || \"\")) {\n return false;\n }\n\n const prefix = trimTrailingWhitespaceAndComments(sourceText.slice(0, index));\n if (!prefix) {\n return true;\n }\n\n const previousChar = prefix[prefix.length - 1];\n return previousChar === \";\" || previousChar === \"{\" || previousChar === \"}\";\n}\n\nfunction scanStaticMacro(sourceText, start, replacements, encodeMacroName) {\n let index = start + 1;\n\n while (index < sourceText.length && MACRO_NAME_CHAR.test(sourceText[index])) {\n index += 1;\n }\n\n const originalName = sourceText.slice(start, index);\n const macroName = originalName.slice(1);\n\n if (macroName === \"mixins\") {\n return index;\n }\n\n replacements.push({\n start,\n end: index,\n originalName,\n replacement: encodeMacroName(originalName, macroName),\n });\n\n return index;\n}\n\nexport function createVirtualLitsxJsxSource(sourceText, options = {}) {\n const strategy = options.strategy === \"editor\" ? \"editor\" : \"compiler\";\n const includeSourceMap = options.sourceMap === true;\n const encodeAttributeName =\n strategy === \"editor\"\n ? encodeEditorVirtualAttributeName\n : encodeVirtualAttributeName;\n const encodeMacroName =\n strategy === \"editor\"\n ? encodeEditorStaticHoistName\n : (_originalName, macroName) => `__litsx_static_${macroName}`;\n\n if (!sourceText || typeof sourceText !== \"string\") {\n return {\n code: sourceText,\n map: null,\n replacements: [],\n };\n }\n\n if (strategy === \"compiler\" && sourceText.includes(\"__litsx_\")) {\n return {\n code: sourceText,\n map: null,\n replacements: [],\n collision: true,\n };\n }\n\n if (!looksLikeLitsxJsx(sourceText)) {\n return {\n code: sourceText,\n map: null,\n replacements: [],\n };\n }\n\n const replacements = [];\n let index = 0;\n let braceDepth = 0;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n const next = sourceText[index + 1];\n\n if (char === \"'\" || char === \"\\\"\") {\n index = scanQuotedString(sourceText, index, char);\n continue;\n }\n\n if (char === \"`\") {\n index = scanTemplateLiteral(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"/\") {\n index = scanLineComment(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n index = scanBlockComment(sourceText, index);\n continue;\n }\n\n if (char === \"<\" && isLikelyJsxTagStart(sourceText, index)) {\n index = scanJsxElement(sourceText, index, replacements, encodeAttributeName);\n continue;\n }\n\n if (char === \"^\" && isLikelyStaticMacroStart(sourceText, index)) {\n index = scanStaticMacro(sourceText, index, replacements, encodeMacroName);\n continue;\n }\n\n if (char === \"{\") {\n braceDepth += 1;\n index += 1;\n continue;\n }\n\n if (char === \"}\") {\n braceDepth = Math.max(0, braceDepth - 1);\n index += 1;\n continue;\n }\n\n index += 1;\n }\n\n if (!replacements.length) {\n return {\n code: sourceText,\n map: null,\n replacements: [],\n };\n }\n\n let lastIndex = 0;\n let transformed = \"\";\n\n for (const replacement of replacements) {\n transformed += sourceText.slice(lastIndex, replacement.start);\n transformed += replacement.replacement;\n lastIndex = replacement.end;\n }\n\n transformed += sourceText.slice(lastIndex);\n\n return {\n code: transformed,\n map: includeSourceMap\n ? createVirtualLitsxJsxSourceMap(sourceText, replacements, {\n sourceFileName: options.sourceFileName,\n })\n : null,\n replacements,\n };\n}\n\nexport function createVirtualLitsxJsxSourceMap(\n sourceText,\n replacements = [],\n options = {}\n) {\n const editable = new MagicString(sourceText);\n applyVirtualAttributeReplacements(editable, replacements);\n\n return editable.generateMap({\n hires: true,\n source: options.sourceFileName,\n includeContent: true,\n });\n}\n\nfunction findReplacementByVirtualPosition(position, replacements) {\n let originalCursor = 0;\n let virtualCursor = 0;\n\n for (const replacement of replacements) {\n const untouchedLength = replacement.start - originalCursor;\n const replacementVirtualStart = virtualCursor + untouchedLength;\n const replacementVirtualEnd =\n replacementVirtualStart + replacement.replacement.length;\n\n if (position >= replacementVirtualStart && position < replacementVirtualEnd) {\n return {\n replacement,\n virtualStart: replacementVirtualStart,\n virtualEnd: replacementVirtualEnd,\n };\n }\n\n originalCursor = replacement.end;\n virtualCursor = replacementVirtualEnd;\n }\n\n return null;\n}\n\nexport function mapOriginalPositionToVirtual(position, replacements = []) {\n if (!replacements.length) {\n return position;\n }\n\n let offset = 0;\n\n for (const replacement of replacements) {\n if (position < replacement.start) {\n break;\n }\n\n const originalLength = replacement.end - replacement.start;\n const replacementLength = replacement.replacement.length;\n\n if (position < replacement.end) {\n return replacement.start + offset;\n }\n\n offset += replacementLength - originalLength;\n }\n\n return position + offset;\n}\n\nexport function remapTextSpanToOriginal(span, replacements = []) {\n if (!span || !replacements.length) {\n return span;\n }\n\n const startMapping = findReplacementByVirtualPosition(span.start, replacements);\n if (startMapping) {\n return {\n start: startMapping.replacement.start,\n length: startMapping.replacement.end - startMapping.replacement.start,\n };\n }\n\n let originalStart = span.start;\n let originalEnd = span.start + span.length;\n\n for (const replacement of replacements) {\n const originalLength = replacement.end - replacement.start;\n const replacementLength = replacement.replacement.length;\n const delta = originalLength - replacementLength;\n const virtualStart = mapOriginalPositionToVirtual(replacement.start, replacements);\n const virtualEnd = virtualStart + replacementLength;\n\n if (virtualEnd <= span.start) {\n originalStart += delta;\n originalEnd += delta;\n continue;\n }\n\n if (virtualStart < span.start) {\n originalStart = replacement.start;\n }\n\n if (virtualStart < span.start + span.length) {\n originalEnd += delta;\n }\n }\n\n return {\n start: originalStart,\n length: Math.max(0, originalEnd - originalStart),\n };\n}\n\nexport function remapVirtualPositionToOriginal(position, replacements = []) {\n const span = remapTextSpanToOriginal({ start: position, length: 0 }, replacements);\n return span.start;\n}\n\nexport const mapVirtualPositionToOriginal = remapVirtualPositionToOriginal;\n\nexport function applyVirtualAttributeReplacements(editable, replacements = []) {\n for (const replacement of replacements) {\n editable.overwrite(replacement.start, replacement.end, replacement.replacement);\n }\n}\n\nexport {\n isReservedVirtualAttributeName,\n};\n","import jsxSyntaxPlugin from \"@babel/plugin-syntax-jsx\";\nimport { decodeVirtualAttributeName } from \"@litsx/jsx-authoring\";\nimport { importedBindingNeedsRendererContext } from \"./transform-litsx-element-candidates.js\";\n\nlet t;\n\nfunction createHostReferenceExpression() {\n return t.conditionalExpression(\n t.binaryExpression(\n \"===\",\n t.unaryExpression(\"typeof\", t.thisExpression(), true),\n t.stringLiteral(\"undefined\")\n ),\n t.nullLiteral(),\n t.thisExpression()\n );\n}\n\nfunction stringifyJsxName(nameNode) {\n if (t.isJSXIdentifier(nameNode)) {\n return nameNode.name;\n }\n\n if (t.isJSXMemberExpression(nameNode)) {\n return `${stringifyJsxName(nameNode.object)}.${nameNode.property.name}`;\n }\n\n if (t.isJSXNamespacedName(nameNode)) {\n return `${nameNode.namespace.name}:${nameNode.name.name}`;\n }\n\n return \"unknown\";\n}\n\nfunction getTag(node) {\n const name = stringifyJsxName(node.name);\n const isCapitalized =\n name.charAt(0) === name.charAt(0).toUpperCase() &&\n name.charAt(0) !== name.charAt(0).toLowerCase();\n const isComponent =\n node.name.type !== \"JSXIdentifier\" || isCapitalized || name.includes(\"-\");\n return { name, isComponent };\n}\n\nfunction unwrapExpression(node) {\n let current = node;\n\n while (current) {\n if (t.isParenthesizedExpression?.(current)) {\n current = current.expression;\n continue;\n }\n\n if (\n t.isTSAsExpression?.(current) ||\n t.isTSSatisfiesExpression?.(current) ||\n t.isTypeCastExpression?.(current) ||\n t.isTSNonNullExpression?.(current)\n ) {\n current = current.expression;\n continue;\n }\n\n break;\n }\n\n return current;\n}\n\nfunction getFunctionNodeFromBinding(binding) {\n if (!binding?.path) {\n return null;\n }\n\n if (binding.path.isFunctionDeclaration()) {\n return binding.path.node;\n }\n\n if (binding.path.isVariableDeclarator()) {\n const init = unwrapExpression(binding.path.node.init);\n if (t.isArrowFunctionExpression(init) || t.isFunctionExpression(init)) {\n return init;\n }\n }\n\n return null;\n}\n\nfunction mergeBooleanResults(results) {\n return results.some(Boolean);\n}\n\nfunction jsxTreeNeedsRendererContext(node, scope, seenBindings = new Set()) {\n if (!node) {\n return false;\n }\n\n if (t.isJSXFragment(node)) {\n return mergeBooleanResults(\n node.children.map((child) => jsxChildNeedsRendererContext(child, scope, seenBindings))\n );\n }\n\n if (!t.isJSXElement(node)) {\n return false;\n }\n\n const { isComponent } = getTag(node.openingElement);\n if (isComponent) {\n return true;\n }\n\n const childNeedsContext = mergeBooleanResults(\n node.children.map((child) => jsxChildNeedsRendererContext(child, scope, seenBindings))\n );\n\n if (childNeedsContext) {\n return true;\n }\n\n return mergeBooleanResults(\n node.openingElement.attributes.map((attr) => {\n if (!t.isJSXAttribute(attr) || !t.isJSXExpressionContainer(attr.value)) {\n return false;\n }\n return expressionNeedsRendererContext(attr.value.expression, scope, seenBindings);\n })\n );\n}\n\nfunction jsxChildNeedsRendererContext(child, scope, seenBindings) {\n if (t.isJSXElement(child) || t.isJSXFragment(child)) {\n return jsxTreeNeedsRendererContext(child, scope, seenBindings);\n }\n\n if (t.isJSXExpressionContainer(child)) {\n return expressionNeedsRendererContext(child.expression, scope, seenBindings);\n }\n\n return false;\n}\n\nfunction functionBodyNeedsRendererContext(body, scope, seenBindings = new Set()) {\n if (!body) {\n return false;\n }\n\n if (t.isBlockStatement(body)) {\n return mergeBooleanResults(\n body.body.map((statement) => statementNeedsRendererContext(statement, scope, seenBindings))\n );\n }\n\n return expressionNeedsRendererContext(body, scope, seenBindings);\n}\n\nfunction statementNeedsRendererContext(statement, scope, seenBindings) {\n if (t.isReturnStatement(statement)) {\n return expressionNeedsRendererContext(statement.argument, scope, seenBindings);\n }\n\n if (t.isIfStatement(statement)) {\n return mergeBooleanResults([\n statementNeedsRendererContext(statement.consequent, scope, seenBindings),\n statement.alternate\n ? statementNeedsRendererContext(statement.alternate, scope, seenBindings)\n : false,\n ]);\n }\n\n if (t.isBlockStatement(statement)) {\n return functionBodyNeedsRendererContext(statement, scope, seenBindings);\n }\n\n return false;\n}\n\nfunction callExpressionNeedsRendererContext(node, scope, seenBindings) {\n const callee = unwrapExpression(node.callee);\n if (!t.isIdentifier(callee)) {\n return false;\n }\n\n const binding = scope.getBinding(callee.name);\n const functionNode = getFunctionNodeFromBinding(binding);\n if (!functionNode) {\n return false;\n }\n\n if (seenBindings.has(binding)) {\n return false;\n }\n\n const nextSeenBindings = new Set(seenBindings);\n nextSeenBindings.add(binding);\n return functionBodyNeedsRendererContext(functionNode.body, binding.path.scope, nextSeenBindings);\n}\n\nfunction expressionNeedsRendererContext(node, scope, seenBindings = new Set()) {\n const expression = unwrapExpression(node);\n if (!expression) {\n return false;\n }\n\n if (t.isJSXElement(expression) || t.isJSXFragment(expression)) {\n return jsxTreeNeedsRendererContext(expression, scope, seenBindings);\n }\n\n if (t.isConditionalExpression(expression)) {\n return mergeBooleanResults([\n expressionNeedsRendererContext(expression.consequent, scope, seenBindings),\n expressionNeedsRendererContext(expression.alternate, scope, seenBindings),\n ]);\n }\n\n if (t.isLogicalExpression(expression)) {\n return mergeBooleanResults([\n expressionNeedsRendererContext(expression.left, scope, seenBindings),\n expressionNeedsRendererContext(expression.right, scope, seenBindings),\n ]);\n }\n\n if (t.isSequenceExpression(expression)) {\n return mergeBooleanResults(\n expression.expressions.map((part) => expressionNeedsRendererContext(part, scope, seenBindings))\n );\n }\n\n if (t.isArrayExpression(expression)) {\n return mergeBooleanResults(\n expression.elements.filter(Boolean).map((part) => expressionNeedsRendererContext(part, scope, seenBindings))\n );\n }\n\n if (t.isCallExpression(expression)) {\n return callExpressionNeedsRendererContext(expression, scope, seenBindings);\n }\n\n return false;\n}\n\nfunction isBindableFunctionReference(expressionPath, options = {}) {\n const expression = unwrapExpression(expressionPath.node);\n if (\n t.isArrowFunctionExpression(expression) ||\n t.isFunctionExpression(expression)\n ) {\n return functionBodyNeedsRendererContext(expression.body, expressionPath.scope);\n }\n\n if (t.isIdentifier(expression)) {\n const binding = expressionPath.scope.getBinding(expression.name);\n const functionNode = getFunctionNodeFromBinding(binding);\n if (!functionNode) {\n const programPath = expressionPath.findParent((entry) => entry.isProgram?.());\n return importedBindingNeedsRendererContext(\n programPath,\n expression.name,\n options\n );\n }\n return functionBodyNeedsRendererContext(functionNode.body, binding.path.scope, new Set([binding]));\n }\n\n return false;\n}\n\nfunction shouldBindRendererContext(attributePath, rawName, expressionPath, options = {}) {\n if (typeof rawName !== \"string\" || rawName[0] !== \".\") {\n return false;\n }\n\n const openingElement = attributePath.parentPath;\n if (!openingElement?.isJSXOpeningElement()) {\n return false;\n }\n\n const { isComponent } = getTag(openingElement.node);\n if (!isComponent) {\n return false;\n }\n\n return isBindableFunctionReference(expressionPath, options);\n}\n\nfunction ensureRendererBindingImport(programPath) {\n const bodyPaths = programPath.get(\"body\");\n const runtimeImports = bodyPaths.filter(\n (path) =>\n path.isImportDeclaration() &&\n path.node.source.value === \"@litsx/litsx/internal/runtime-render-context\"\n );\n\n const importSpecifier = t.importSpecifier(\n t.identifier(\"bindRendererContext\"),\n t.identifier(\"bindRendererContext\")\n );\n\n for (const importPath of runtimeImports) {\n const { specifiers } = importPath.node;\n const hasImport = specifiers.some(\n (specifier) =>\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: \"bindRendererContext\" })\n );\n\n if (hasImport) {\n return;\n }\n\n specifiers.push(importSpecifier);\n return;\n }\n\n programPath.unshiftContainer(\"body\", t.importDeclaration(\n [importSpecifier],\n t.stringLiteral(\"@litsx/litsx/internal/runtime-render-context\")\n ));\n}\n\nexport default function transformLitsxRendererProps(api) {\n api.assertVersion?.(7);\n t = api.types;\n\n return {\n name: \"transform-litsx-renderer-props\",\n inherits: jsxSyntaxPlugin.default || jsxSyntaxPlugin,\n visitor: {\n Program: {\n enter(_, state) {\n state.__litsxNeedsRendererBindingImport = false;\n },\n exit(programPath, state) {\n if (state.__litsxNeedsRendererBindingImport) {\n ensureRendererBindingImport(programPath);\n }\n },\n },\n JSXAttribute(path, state) {\n const { node } = path;\n if (node.value?.type !== \"JSXExpressionContainer\") {\n return;\n }\n\n const rawName = decodeVirtualAttributeName(node.name.name) ?? node.name.name;\n const expressionPath = path.get(\"value.expression\");\n if (!expressionPath?.node) {\n return;\n }\n\n if (!shouldBindRendererContext(path, rawName, expressionPath, {\n filename: state.file?.opts?.filename || \"\",\n })) {\n return;\n }\n\n state.__litsxNeedsRendererBindingImport = true;\n node.value.expression = t.callExpression(\n t.identifier(\"bindRendererContext\"),\n [\n createHostReferenceExpression(),\n expressionPath.node,\n ]\n );\n },\n },\n };\n}\n"],"names":["importedBindingNeedsRendererContext"],"mappings":"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"}
1
+ {"version":3,"file":"transform-litsx-renderer-props.cjs","sources":["../../../jsx-authoring/src/index.js","../../src/internal/transform-litsx-renderer-props.js"],"sourcesContent":["import MagicString from \"magic-string\";\n\nconst PREFIX_TO_KIND = {\n \"@\": \"event\",\n \".\": \"prop\",\n \"?\": \"bool\",\n};\n\nconst KIND_TO_PREFIX = {\n event: \"@\",\n prop: \".\",\n bool: \"?\",\n};\n\nconst ATTR_NAME_CHAR = /[\\w:-]/;\nconst TAG_NAME_START_CHAR = /[A-Za-z]/;\nconst TAG_NAME_CHAR = /[\\w:.-]/;\nconst MACRO_NAME_START_CHAR = /[A-Za-z$_]/;\nconst MACRO_NAME_CHAR = /[A-Za-z0-9$_]/;\n\nfunction isWhitespace(char) {\n return char === \" \" || char === \"\\t\" || char === \"\\n\" || char === \"\\r\";\n}\n\nfunction isReservedVirtualAttributeName(name) {\n return /^__litsx_(event|prop|bool)_/.test(name);\n}\n\nfunction sanitizeIdentifierTailChar(char) {\n return /[A-Za-z0-9$_]/.test(char) ? char : \"_\";\n}\n\nfunction isIdentifierStartChar(char) {\n return /[A-Za-z$_]/.test(char);\n}\n\nfunction isIdentifierChar(char) {\n return /[A-Za-z0-9$_]/.test(char);\n}\n\nfunction encodeEditorVirtualAttributeName(name) {\n const prefix = name[0];\n const localName = name.slice(1);\n const encodedPrefix = prefix === \"@\" ? \"e\" : prefix === \".\" ? \"p\" : \"b\";\n return `${encodedPrefix}${Array.from(localName, sanitizeIdentifierTailChar).join(\"\")}`;\n}\n\nfunction encodeEditorStaticHoistName(originalName, macroName) {\n return `$${macroName}`;\n}\n\nfunction encodeEditorStaticHoistAssignment(name) {\n return `const $${name} = `;\n}\n\nfunction scanQuotedString(sourceText, start, quote) {\n let index = start + 1;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n if (char === \"\\\\\") {\n index += 2;\n continue;\n }\n if (char === quote) {\n return index + 1;\n }\n index += 1;\n }\n\n return index;\n}\n\nfunction scanLineComment(sourceText, start) {\n let index = start + 2;\n while (index < sourceText.length && sourceText[index] !== \"\\n\") {\n index += 1;\n }\n return index;\n}\n\nfunction scanBlockComment(sourceText, start) {\n let index = start + 2;\n while (index < sourceText.length) {\n if (sourceText[index] === \"*\" && sourceText[index + 1] === \"/\") {\n return index + 2;\n }\n index += 1;\n }\n return index;\n}\n\nfunction scanTemplateLiteral(sourceText, start) {\n let index = start + 1;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n if (char === \"\\\\\") {\n index += 2;\n continue;\n }\n if (char === \"`\") {\n return index + 1;\n }\n if (char === \"$\" && sourceText[index + 1] === \"{\") {\n index = scanBalancedBraces(sourceText, index + 1);\n continue;\n }\n index += 1;\n }\n\n return index;\n}\n\nfunction scanBalancedBraces(sourceText, start) {\n let depth = 0;\n let index = start;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n const next = sourceText[index + 1];\n\n if (char === \"'\" || char === \"\\\"\") {\n index = scanQuotedString(sourceText, index, char);\n continue;\n }\n\n if (char === \"`\") {\n index = scanTemplateLiteral(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"/\") {\n index = scanLineComment(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n index = scanBlockComment(sourceText, index);\n continue;\n }\n\n if (char === \"{\") {\n depth += 1;\n index += 1;\n continue;\n }\n\n if (char === \"}\") {\n depth -= 1;\n index += 1;\n if (depth <= 0) {\n return index;\n }\n continue;\n }\n\n index += 1;\n }\n\n return index;\n}\n\nfunction scanBalancedBracesWithJsx(sourceText, start, replacements, encodeAttributeName) {\n let depth = 0;\n let index = start;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n const next = sourceText[index + 1];\n\n if (char === \"'\" || char === \"\\\"\") {\n index = scanQuotedString(sourceText, index, char);\n continue;\n }\n\n if (char === \"`\") {\n index = scanTemplateLiteral(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"/\") {\n index = scanLineComment(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n index = scanBlockComment(sourceText, index);\n continue;\n }\n\n if (char === \"<\" && isLikelyJsxTagStart(sourceText, index)) {\n index = scanJsxElement(sourceText, index, replacements, encodeAttributeName);\n continue;\n }\n\n if (char === \"{\") {\n depth += 1;\n index += 1;\n continue;\n }\n\n if (char === \"}\") {\n depth -= 1;\n index += 1;\n if (depth <= 0) {\n return index;\n }\n continue;\n }\n\n index += 1;\n }\n\n return index;\n}\n\nfunction trimTrailingWhitespaceAndComments(sourceText) {\n let text = sourceText;\n let changed = true;\n\n while (changed) {\n changed = false;\n\n const trimmedWhitespace = text.replace(/\\s+$/u, \"\");\n if (trimmedWhitespace !== text) {\n text = trimmedWhitespace;\n changed = true;\n }\n\n const trimmedLineComment = text.replace(/\\/\\/[^\\n\\r]*$/u, \"\");\n if (trimmedLineComment !== text) {\n text = trimmedLineComment;\n changed = true;\n continue;\n }\n\n const trimmedBlockComment = text.replace(/\\/\\*[\\s\\S]*?\\*\\/$/u, \"\");\n if (trimmedBlockComment !== text) {\n text = trimmedBlockComment;\n changed = true;\n }\n }\n\n return text;\n}\n\nfunction previousSignificantIndex(sourceText, start) {\n let index = start - 1;\n while (index >= 0 && isWhitespace(sourceText[index])) {\n index -= 1;\n }\n return index;\n}\n\nfunction readPreviousWord(sourceText, endIndex) {\n let index = endIndex;\n while (index >= 0 && /[A-Za-z]/.test(sourceText[index])) {\n index -= 1;\n }\n return sourceText.slice(index + 1, endIndex + 1);\n}\n\nfunction isLikelyJsxTagStart(sourceText, index) {\n const next = sourceText[index + 1];\n if (!TAG_NAME_START_CHAR.test(next || \"\")) {\n return false;\n }\n\n const previousIndex = previousSignificantIndex(sourceText, index);\n if (previousIndex < 0) {\n return true;\n }\n\n const previousChar = sourceText[previousIndex];\n if (\"=({[,!?:;>&|\".includes(previousChar)) {\n return true;\n }\n\n const previousWord = readPreviousWord(sourceText, previousIndex);\n return [\"return\", \"case\", \"throw\", \"yield\", \"else\"].includes(previousWord);\n}\n\nfunction readJsxTagName(sourceText, start) {\n let index = start + 1;\n const isClosing = sourceText[index] === \"/\";\n\n if (isClosing) {\n index += 1;\n }\n\n if (!TAG_NAME_START_CHAR.test(sourceText[index] || \"\")) {\n return null;\n }\n\n const nameStart = index;\n\n while (index < sourceText.length && TAG_NAME_CHAR.test(sourceText[index])) {\n index += 1;\n }\n\n return {\n name: sourceText.slice(nameStart, index),\n isClosing,\n end: index,\n };\n}\n\nfunction scanJsxTag(sourceText, start, replacements, encodeAttributeName) {\n const tag = readJsxTagName(sourceText, start);\n\n if (!tag) {\n return {\n end: start + 1,\n tagName: null,\n isClosing: false,\n selfClosing: false,\n };\n }\n\n let index = tag.end;\n\n if (tag.isClosing) {\n while (index < sourceText.length) {\n if (sourceText[index] === \">\") {\n return {\n end: index + 1,\n tagName: tag.name,\n isClosing: true,\n selfClosing: false,\n };\n }\n\n index += 1;\n }\n\n return {\n end: index,\n tagName: tag.name,\n isClosing: true,\n selfClosing: false,\n };\n }\n\n function scanAttributeValue(valueStart) {\n let valueIndex = valueStart;\n\n while (valueIndex < sourceText.length && isWhitespace(sourceText[valueIndex])) {\n valueIndex += 1;\n }\n\n if (valueIndex >= sourceText.length) {\n return valueIndex;\n }\n\n const valueChar = sourceText[valueIndex];\n if (valueChar === \"{\") {\n return scanBalancedBracesWithJsx(\n sourceText,\n valueIndex,\n replacements,\n encodeAttributeName\n );\n }\n\n if (valueChar === \"'\" || valueChar === \"\\\"\") {\n return scanQuotedString(sourceText, valueIndex, valueChar);\n }\n\n while (\n valueIndex < sourceText.length &&\n !isWhitespace(sourceText[valueIndex]) &&\n sourceText[valueIndex] !== \">\" &&\n !(sourceText[valueIndex] === \"/\" && sourceText[valueIndex + 1] === \">\")\n ) {\n valueIndex += 1;\n }\n\n return valueIndex;\n }\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n const next = sourceText[index + 1];\n\n if (char === \">\") {\n return {\n end: index + 1,\n tagName: tag.name,\n isClosing: false,\n selfClosing: false,\n };\n }\n\n if (char === \"/\" && next === \">\") {\n return {\n end: index + 2,\n tagName: tag.name,\n isClosing: false,\n selfClosing: true,\n };\n }\n\n if (isWhitespace(char)) {\n index += 1;\n continue;\n }\n\n if (char === \"{\") {\n index = scanBalancedBracesWithJsx(\n sourceText,\n index,\n replacements,\n encodeAttributeName\n );\n continue;\n }\n\n if (char === \"'\" || char === \"\\\"\") {\n index = scanQuotedString(sourceText, index, char);\n continue;\n }\n\n if (Object.hasOwn(PREFIX_TO_KIND, char) && ATTR_NAME_CHAR.test(next || \"\")) {\n const attrStart = index;\n index += 1;\n\n while (index < sourceText.length && ATTR_NAME_CHAR.test(sourceText[index])) {\n index += 1;\n }\n\n const originalName = sourceText.slice(attrStart, index);\n replacements.push({\n start: attrStart,\n end: index,\n originalName,\n replacement: encodeAttributeName(originalName),\n });\n\n while (index < sourceText.length && isWhitespace(sourceText[index])) {\n index += 1;\n }\n if (sourceText[index] === \"=\") {\n index = scanAttributeValue(index + 1);\n }\n continue;\n }\n\n const attrStart = index;\n while (\n index < sourceText.length &&\n !isWhitespace(sourceText[index]) &&\n sourceText[index] !== \"=\" &&\n sourceText[index] !== \">\" &&\n !(sourceText[index] === \"/\" && sourceText[index + 1] === \">\")\n ) {\n index += 1;\n }\n\n if (index === attrStart) {\n index += 1;\n continue;\n }\n\n while (index < sourceText.length && isWhitespace(sourceText[index])) {\n index += 1;\n }\n if (sourceText[index] === \"=\") {\n index = scanAttributeValue(index + 1);\n }\n }\n\n return {\n end: index,\n tagName: tag.name,\n isClosing: false,\n selfClosing: false,\n };\n}\n\nfunction scanJsxElement(sourceText, start, replacements, encodeAttributeName) {\n const openingTag = scanJsxTag(sourceText, start, replacements, encodeAttributeName);\n\n if (\n openingTag.isClosing ||\n openingTag.selfClosing ||\n !openingTag.tagName\n ) {\n return openingTag.end;\n }\n\n let index = openingTag.end;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n const next = sourceText[index + 1];\n\n if (char === \"'\" || char === \"\\\"\") {\n index = scanQuotedString(sourceText, index, char);\n continue;\n }\n\n if (char === \"`\") {\n index = scanTemplateLiteral(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"/\") {\n index = scanLineComment(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n index = scanBlockComment(sourceText, index);\n continue;\n }\n\n if (char === \"{\") {\n index = scanBalancedBracesWithJsx(\n sourceText,\n index,\n replacements,\n encodeAttributeName\n );\n continue;\n }\n\n if (char === \"<\") {\n const nestedTag = readJsxTagName(sourceText, index);\n\n if (!nestedTag) {\n index += 1;\n continue;\n }\n\n if (nestedTag.isClosing && nestedTag.name === openingTag.tagName) {\n return scanJsxTag(sourceText, index, replacements, encodeAttributeName).end;\n }\n\n if (!nestedTag.isClosing) {\n index = scanJsxElement(sourceText, index, replacements, encodeAttributeName);\n continue;\n }\n }\n\n index += 1;\n }\n\n return index;\n}\n\nexport function encodeVirtualAttributeName(name) {\n const prefix = name[0];\n const localName = name.slice(1);\n const kind = PREFIX_TO_KIND[prefix];\n\n if (!kind) {\n return name;\n }\n\n return `__litsx_${kind}_${localName}`;\n}\n\nexport function decodeVirtualAttributeName(name) {\n const match = /^__litsx_(event|prop|bool)_(.+)$/.exec(name);\n\n if (!match) {\n return null;\n }\n\n const [, kind, localName] = match;\n return `${KIND_TO_PREFIX[kind]}${localName}`;\n}\n\nexport function decodeVirtualStaticHoistName(name) {\n const match = /^__litsx_static_([A-Za-z$_][A-Za-z0-9$_]*)$/.exec(name);\n\n if (!match) {\n return null;\n }\n\n return `static ${match[1]}`;\n}\n\nexport function remapVirtualText(text) {\n if (typeof text !== \"string\") {\n return text;\n }\n\n return text\n .replace(/__litsx_(event|prop|bool)_[\\w:-]+/g, (name) => (\n decodeVirtualAttributeName(name) ?? name\n ))\n .replace(/__litsx_static_[A-Za-z$_][A-Za-z0-9$_]*/g, (name) => (\n decodeVirtualStaticHoistName(name) ?? name\n ));\n}\n\nexport function looksLikeLitsxJsx(sourceText) {\n return (\n /<[\\w.-]+[^>]*\\s(?:[@.?][\\w:-]+)/m.test(sourceText) ||\n /(?:^|[;{}]\\s*)\\^[A-Za-z$_][A-Za-z0-9$_]*/m.test(sourceText) ||\n /^\\s*\\^[A-Za-z$_][A-Za-z0-9$_]*/m.test(sourceText) ||\n /(?:^|[;{}]\\s*)static\\s+[A-Za-z$_][A-Za-z0-9$_]*\\s*=/m.test(sourceText) ||\n /^\\s*static\\s+[A-Za-z$_][A-Za-z0-9$_]*\\s*=/m.test(sourceText)\n );\n}\n\nfunction isLikelyStaticMacroStart(sourceText, index) {\n const next = sourceText[index + 1];\n if (!MACRO_NAME_START_CHAR.test(next || \"\")) {\n return false;\n }\n\n const prefix = trimTrailingWhitespaceAndComments(sourceText.slice(0, index));\n if (!prefix) {\n return true;\n }\n\n const previousChar = prefix[prefix.length - 1];\n return previousChar === \";\" || previousChar === \"{\" || previousChar === \"}\";\n}\n\nfunction scanStaticMacro(sourceText, start, replacements, encodeMacroName) {\n let index = start + 1;\n\n while (index < sourceText.length && MACRO_NAME_CHAR.test(sourceText[index])) {\n index += 1;\n }\n\n const originalName = sourceText.slice(start, index);\n const macroName = originalName.slice(1);\n\n if (macroName === \"mixins\") {\n return index;\n }\n\n replacements.push({\n start,\n end: index,\n originalName,\n replacement: encodeMacroName(originalName, macroName),\n });\n\n return index;\n}\n\nfunction isLikelyStaticHoistAssignmentStart(sourceText, index) {\n if (sourceText.slice(index, index + 6) !== \"static\") {\n return false;\n }\n\n const previousChar = sourceText[index - 1];\n if (previousChar && /[A-Za-z0-9$_]/.test(previousChar)) {\n return false;\n }\n\n const next = sourceText[index + 6];\n if (!isWhitespace(next || \"\")) {\n return false;\n }\n\n const prefix = trimTrailingWhitespaceAndComments(sourceText.slice(0, index));\n if (!prefix) {\n return true;\n }\n\n const previousSignificantChar = prefix[prefix.length - 1];\n return (\n previousSignificantChar === \";\" ||\n previousSignificantChar === \"{\" ||\n previousSignificantChar === \"}\"\n );\n}\n\nfunction readStaticHoistAssignment(sourceText, start) {\n let index = start + 6;\n\n while (index < sourceText.length && isWhitespace(sourceText[index])) {\n index += 1;\n }\n\n const nameStart = index;\n if (!MACRO_NAME_START_CHAR.test(sourceText[index] || \"\")) {\n return null;\n }\n\n index += 1;\n while (index < sourceText.length && MACRO_NAME_CHAR.test(sourceText[index])) {\n index += 1;\n }\n\n const macroName = sourceText.slice(nameStart, index);\n\n while (index < sourceText.length && isWhitespace(sourceText[index])) {\n index += 1;\n }\n\n if (sourceText[index] !== \"=\") {\n return null;\n }\n\n index += 1;\n while (index < sourceText.length && isWhitespace(sourceText[index])) {\n index += 1;\n }\n\n return {\n macroName,\n valueStart: index,\n };\n}\n\nfunction scanStaticHoistAssignment(sourceText, start, replacements, strategy) {\n const assignment = readStaticHoistAssignment(sourceText, start);\n if (!assignment) {\n return start + 1;\n }\n\n const { macroName, valueStart } = assignment;\n\n let index = valueStart;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n let statementEnd = sourceText.length;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n const next = sourceText[index + 1];\n\n if (char === \"'\" || char === \"\\\"\") {\n index = scanQuotedString(sourceText, index, char);\n continue;\n }\n\n if (char === \"`\") {\n index = scanTemplateLiteral(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"/\") {\n index = scanLineComment(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n index = scanBlockComment(sourceText, index);\n continue;\n }\n\n if (char === \"(\") {\n parenDepth += 1;\n index += 1;\n continue;\n }\n\n if (char === \")\") {\n parenDepth = Math.max(0, parenDepth - 1);\n index += 1;\n continue;\n }\n\n if (char === \"[\") {\n bracketDepth += 1;\n index += 1;\n continue;\n }\n\n if (char === \"]\") {\n bracketDepth = Math.max(0, bracketDepth - 1);\n index += 1;\n continue;\n }\n\n if (char === \"{\") {\n braceDepth += 1;\n index += 1;\n continue;\n }\n\n if (char === \"}\") {\n if (parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) {\n statementEnd = index;\n break;\n }\n\n braceDepth = Math.max(0, braceDepth - 1);\n index += 1;\n continue;\n }\n\n if (\n char === \";\" &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n statementEnd = index + 1;\n break;\n }\n\n index += 1;\n }\n\n const hasSemicolon = statementEnd > valueStart && sourceText[statementEnd - 1] === \";\";\n const expressionSegment = sourceText.slice(\n valueStart,\n hasSemicolon ? statementEnd - 1 : statementEnd,\n );\n const statementBody = sourceText.slice(valueStart, statementEnd);\n const expressionText = trimTrailingWhitespaceAndComments(expressionSegment);\n const trailingText = statementBody.slice(expressionSegment.length);\n\n replacements.push({\n start,\n end: statementEnd,\n originalName: `static ${macroName}`,\n replacement:\n strategy === \"editor\"\n ? `${encodeEditorStaticHoistAssignment(macroName)}${statementBody}`\n : `__litsx_static_${macroName}(${expressionText})${trailingText}`,\n });\n\n return statementEnd;\n}\n\nexport function createVirtualLitsxJsxSource(sourceText, options = {}) {\n const strategy = options.strategy === \"editor\" ? \"editor\" : \"compiler\";\n const includeSourceMap = options.sourceMap === true;\n const encodeAttributeName =\n strategy === \"editor\"\n ? encodeEditorVirtualAttributeName\n : encodeVirtualAttributeName;\n const encodeMacroName =\n strategy === \"editor\"\n ? encodeEditorStaticHoistName\n : (_originalName, macroName) => `__litsx_static_${macroName}`;\n\n if (!sourceText || typeof sourceText !== \"string\") {\n return {\n code: sourceText,\n map: null,\n replacements: [],\n };\n }\n\n if (strategy === \"compiler\" && sourceText.includes(\"__litsx_\")) {\n return {\n code: sourceText,\n map: null,\n replacements: [],\n collision: true,\n };\n }\n\n if (!looksLikeLitsxJsx(sourceText)) {\n return {\n code: sourceText,\n map: null,\n replacements: [],\n };\n }\n\n const replacements = [];\n let index = 0;\n let braceDepth = 0;\n const blockStack = [];\n let pendingClassBody = false;\n\n while (index < sourceText.length) {\n const char = sourceText[index];\n const next = sourceText[index + 1];\n\n if (char === \"'\" || char === \"\\\"\") {\n index = scanQuotedString(sourceText, index, char);\n continue;\n }\n\n if (char === \"`\") {\n index = scanTemplateLiteral(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"/\") {\n index = scanLineComment(sourceText, index);\n continue;\n }\n\n if (char === \"/\" && next === \"*\") {\n index = scanBlockComment(sourceText, index);\n continue;\n }\n\n if (char === \"<\" && isLikelyJsxTagStart(sourceText, index)) {\n index = scanJsxElement(sourceText, index, replacements, encodeAttributeName);\n continue;\n }\n\n if (char === \"^\" && isLikelyStaticMacroStart(sourceText, index)) {\n index = scanStaticMacro(sourceText, index, replacements, encodeMacroName);\n continue;\n }\n\n if (\n char === \"s\" &&\n blockStack[blockStack.length - 1] !== \"class\" &&\n isLikelyStaticHoistAssignmentStart(sourceText, index)\n ) {\n index = scanStaticHoistAssignment(sourceText, index, replacements, strategy);\n continue;\n }\n\n if (isIdentifierStartChar(char)) {\n const wordStart = index;\n index += 1;\n while (index < sourceText.length && isIdentifierChar(sourceText[index])) {\n index += 1;\n }\n\n const word = sourceText.slice(wordStart, index);\n if (word === \"class\") {\n let lookahead = index;\n while (lookahead < sourceText.length && isWhitespace(sourceText[lookahead])) {\n lookahead += 1;\n }\n\n pendingClassBody = sourceText[lookahead] !== \":\";\n }\n\n continue;\n }\n\n if (char === \"{\") {\n braceDepth += 1;\n blockStack.push(pendingClassBody ? \"class\" : \"block\");\n pendingClassBody = false;\n index += 1;\n continue;\n }\n\n if (char === \"}\") {\n braceDepth = Math.max(0, braceDepth - 1);\n blockStack.pop();\n pendingClassBody = false;\n index += 1;\n continue;\n }\n\n if (char === \";\" || char === \"=\") {\n pendingClassBody = false;\n }\n\n index += 1;\n }\n\n if (!replacements.length) {\n return {\n code: sourceText,\n map: null,\n replacements: [],\n };\n }\n\n let lastIndex = 0;\n let transformed = \"\";\n\n for (const replacement of replacements) {\n transformed += sourceText.slice(lastIndex, replacement.start);\n transformed += replacement.replacement;\n lastIndex = replacement.end;\n }\n\n transformed += sourceText.slice(lastIndex);\n\n return {\n code: transformed,\n map: includeSourceMap\n ? createVirtualLitsxJsxSourceMap(sourceText, replacements, {\n sourceFileName: options.sourceFileName,\n })\n : null,\n replacements,\n };\n}\n\nexport function createVirtualLitsxJsxSourceMap(\n sourceText,\n replacements = [],\n options = {}\n) {\n const editable = new MagicString(sourceText);\n applyVirtualAttributeReplacements(editable, replacements);\n\n return editable.generateMap({\n hires: true,\n source: options.sourceFileName,\n includeContent: true,\n });\n}\n\nfunction findReplacementByVirtualPosition(position, replacements) {\n let originalCursor = 0;\n let virtualCursor = 0;\n\n for (const replacement of replacements) {\n const untouchedLength = replacement.start - originalCursor;\n const replacementVirtualStart = virtualCursor + untouchedLength;\n const replacementVirtualEnd =\n replacementVirtualStart + replacement.replacement.length;\n\n if (position >= replacementVirtualStart && position < replacementVirtualEnd) {\n return {\n replacement,\n virtualStart: replacementVirtualStart,\n virtualEnd: replacementVirtualEnd,\n };\n }\n\n originalCursor = replacement.end;\n virtualCursor = replacementVirtualEnd;\n }\n\n return null;\n}\n\nexport function mapOriginalPositionToVirtual(position, replacements = []) {\n if (!replacements.length) {\n return position;\n }\n\n let offset = 0;\n\n for (const replacement of replacements) {\n if (position < replacement.start) {\n break;\n }\n\n const originalLength = replacement.end - replacement.start;\n const replacementLength = replacement.replacement.length;\n\n if (position < replacement.end) {\n return replacement.start + offset;\n }\n\n offset += replacementLength - originalLength;\n }\n\n return position + offset;\n}\n\nexport function remapTextSpanToOriginal(span, replacements = []) {\n if (!span || !replacements.length) {\n return span;\n }\n\n const startMapping = findReplacementByVirtualPosition(span.start, replacements);\n if (startMapping) {\n return {\n start: startMapping.replacement.start,\n length: startMapping.replacement.end - startMapping.replacement.start,\n };\n }\n\n let originalStart = span.start;\n let originalEnd = span.start + span.length;\n\n for (const replacement of replacements) {\n const originalLength = replacement.end - replacement.start;\n const replacementLength = replacement.replacement.length;\n const delta = originalLength - replacementLength;\n const virtualStart = mapOriginalPositionToVirtual(replacement.start, replacements);\n const virtualEnd = virtualStart + replacementLength;\n\n if (virtualEnd <= span.start) {\n originalStart += delta;\n originalEnd += delta;\n continue;\n }\n\n if (virtualStart < span.start) {\n originalStart = replacement.start;\n }\n\n if (virtualStart < span.start + span.length) {\n originalEnd += delta;\n }\n }\n\n return {\n start: originalStart,\n length: Math.max(0, originalEnd - originalStart),\n };\n}\n\nexport function remapVirtualPositionToOriginal(position, replacements = []) {\n const span = remapTextSpanToOriginal({ start: position, length: 0 }, replacements);\n return span.start;\n}\n\nexport const mapVirtualPositionToOriginal = remapVirtualPositionToOriginal;\n\nexport function applyVirtualAttributeReplacements(editable, replacements = []) {\n for (const replacement of replacements) {\n editable.overwrite(replacement.start, replacement.end, replacement.replacement);\n }\n}\n\nexport {\n isReservedVirtualAttributeName,\n};\n","import jsxSyntaxPlugin from \"@babel/plugin-syntax-jsx\";\nimport { decodeVirtualAttributeName } from \"@litsx/jsx-authoring\";\nimport { importedBindingNeedsRendererContext } from \"./transform-litsx-element-candidates.js\";\n\nlet t;\n\nfunction createHostReferenceExpression() {\n return t.conditionalExpression(\n t.binaryExpression(\n \"===\",\n t.unaryExpression(\"typeof\", t.thisExpression(), true),\n t.stringLiteral(\"undefined\")\n ),\n t.nullLiteral(),\n t.thisExpression()\n );\n}\n\nfunction stringifyJsxName(nameNode) {\n if (t.isJSXIdentifier(nameNode)) {\n return nameNode.name;\n }\n\n if (t.isJSXMemberExpression(nameNode)) {\n return `${stringifyJsxName(nameNode.object)}.${nameNode.property.name}`;\n }\n\n if (t.isJSXNamespacedName(nameNode)) {\n return `${nameNode.namespace.name}:${nameNode.name.name}`;\n }\n\n return \"unknown\";\n}\n\nfunction getTag(node) {\n const name = stringifyJsxName(node.name);\n const isCapitalized =\n name.charAt(0) === name.charAt(0).toUpperCase() &&\n name.charAt(0) !== name.charAt(0).toLowerCase();\n const isComponent =\n node.name.type !== \"JSXIdentifier\" || isCapitalized || name.includes(\"-\");\n return { name, isComponent };\n}\n\nfunction unwrapExpression(node) {\n let current = node;\n\n while (current) {\n if (t.isParenthesizedExpression?.(current)) {\n current = current.expression;\n continue;\n }\n\n if (\n t.isTSAsExpression?.(current) ||\n t.isTSSatisfiesExpression?.(current) ||\n t.isTypeCastExpression?.(current) ||\n t.isTSNonNullExpression?.(current)\n ) {\n current = current.expression;\n continue;\n }\n\n break;\n }\n\n return current;\n}\n\nfunction getFunctionNodeFromBinding(binding) {\n if (!binding?.path) {\n return null;\n }\n\n if (binding.path.isFunctionDeclaration()) {\n return binding.path.node;\n }\n\n if (binding.path.isVariableDeclarator()) {\n const init = unwrapExpression(binding.path.node.init);\n if (t.isArrowFunctionExpression(init) || t.isFunctionExpression(init)) {\n return init;\n }\n }\n\n return null;\n}\n\nfunction mergeBooleanResults(results) {\n return results.some(Boolean);\n}\n\nfunction jsxTreeNeedsRendererContext(node, scope, seenBindings = new Set()) {\n if (!node) {\n return false;\n }\n\n if (t.isJSXFragment(node)) {\n return mergeBooleanResults(\n node.children.map((child) => jsxChildNeedsRendererContext(child, scope, seenBindings))\n );\n }\n\n if (!t.isJSXElement(node)) {\n return false;\n }\n\n const { isComponent } = getTag(node.openingElement);\n if (isComponent) {\n return true;\n }\n\n const childNeedsContext = mergeBooleanResults(\n node.children.map((child) => jsxChildNeedsRendererContext(child, scope, seenBindings))\n );\n\n if (childNeedsContext) {\n return true;\n }\n\n return mergeBooleanResults(\n node.openingElement.attributes.map((attr) => {\n if (!t.isJSXAttribute(attr) || !t.isJSXExpressionContainer(attr.value)) {\n return false;\n }\n return expressionNeedsRendererContext(attr.value.expression, scope, seenBindings);\n })\n );\n}\n\nfunction jsxChildNeedsRendererContext(child, scope, seenBindings) {\n if (t.isJSXElement(child) || t.isJSXFragment(child)) {\n return jsxTreeNeedsRendererContext(child, scope, seenBindings);\n }\n\n if (t.isJSXExpressionContainer(child)) {\n return expressionNeedsRendererContext(child.expression, scope, seenBindings);\n }\n\n return false;\n}\n\nfunction functionBodyNeedsRendererContext(body, scope, seenBindings = new Set()) {\n if (!body) {\n return false;\n }\n\n if (t.isBlockStatement(body)) {\n return mergeBooleanResults(\n body.body.map((statement) => statementNeedsRendererContext(statement, scope, seenBindings))\n );\n }\n\n return expressionNeedsRendererContext(body, scope, seenBindings);\n}\n\nfunction statementNeedsRendererContext(statement, scope, seenBindings) {\n if (t.isReturnStatement(statement)) {\n return expressionNeedsRendererContext(statement.argument, scope, seenBindings);\n }\n\n if (t.isIfStatement(statement)) {\n return mergeBooleanResults([\n statementNeedsRendererContext(statement.consequent, scope, seenBindings),\n statement.alternate\n ? statementNeedsRendererContext(statement.alternate, scope, seenBindings)\n : false,\n ]);\n }\n\n if (t.isBlockStatement(statement)) {\n return functionBodyNeedsRendererContext(statement, scope, seenBindings);\n }\n\n return false;\n}\n\nfunction callExpressionNeedsRendererContext(node, scope, seenBindings) {\n const callee = unwrapExpression(node.callee);\n if (!t.isIdentifier(callee)) {\n return false;\n }\n\n const binding = scope.getBinding(callee.name);\n const functionNode = getFunctionNodeFromBinding(binding);\n if (!functionNode) {\n return false;\n }\n\n if (seenBindings.has(binding)) {\n return false;\n }\n\n const nextSeenBindings = new Set(seenBindings);\n nextSeenBindings.add(binding);\n return functionBodyNeedsRendererContext(functionNode.body, binding.path.scope, nextSeenBindings);\n}\n\nfunction expressionNeedsRendererContext(node, scope, seenBindings = new Set()) {\n const expression = unwrapExpression(node);\n if (!expression) {\n return false;\n }\n\n if (t.isJSXElement(expression) || t.isJSXFragment(expression)) {\n return jsxTreeNeedsRendererContext(expression, scope, seenBindings);\n }\n\n if (t.isConditionalExpression(expression)) {\n return mergeBooleanResults([\n expressionNeedsRendererContext(expression.consequent, scope, seenBindings),\n expressionNeedsRendererContext(expression.alternate, scope, seenBindings),\n ]);\n }\n\n if (t.isLogicalExpression(expression)) {\n return mergeBooleanResults([\n expressionNeedsRendererContext(expression.left, scope, seenBindings),\n expressionNeedsRendererContext(expression.right, scope, seenBindings),\n ]);\n }\n\n if (t.isSequenceExpression(expression)) {\n return mergeBooleanResults(\n expression.expressions.map((part) => expressionNeedsRendererContext(part, scope, seenBindings))\n );\n }\n\n if (t.isArrayExpression(expression)) {\n return mergeBooleanResults(\n expression.elements.filter(Boolean).map((part) => expressionNeedsRendererContext(part, scope, seenBindings))\n );\n }\n\n if (t.isCallExpression(expression)) {\n return callExpressionNeedsRendererContext(expression, scope, seenBindings);\n }\n\n return false;\n}\n\nfunction isBindableFunctionReference(expressionPath, options = {}) {\n const expression = unwrapExpression(expressionPath.node);\n if (\n t.isArrowFunctionExpression(expression) ||\n t.isFunctionExpression(expression)\n ) {\n return functionBodyNeedsRendererContext(expression.body, expressionPath.scope);\n }\n\n if (t.isIdentifier(expression)) {\n const binding = expressionPath.scope.getBinding(expression.name);\n const functionNode = getFunctionNodeFromBinding(binding);\n if (!functionNode) {\n const programPath = expressionPath.findParent((entry) => entry.isProgram?.());\n return importedBindingNeedsRendererContext(\n programPath,\n expression.name,\n options\n );\n }\n return functionBodyNeedsRendererContext(functionNode.body, binding.path.scope, new Set([binding]));\n }\n\n return false;\n}\n\nfunction shouldBindRendererContext(attributePath, rawName, expressionPath, options = {}) {\n if (typeof rawName !== \"string\" || rawName[0] !== \".\") {\n return false;\n }\n\n const openingElement = attributePath.parentPath;\n if (!openingElement?.isJSXOpeningElement()) {\n return false;\n }\n\n const { isComponent } = getTag(openingElement.node);\n if (!isComponent) {\n return false;\n }\n\n return isBindableFunctionReference(expressionPath, options);\n}\n\nfunction ensureRendererBindingImport(programPath) {\n const bodyPaths = programPath.get(\"body\");\n const runtimeImports = bodyPaths.filter(\n (path) =>\n path.isImportDeclaration() &&\n path.node.source.value === \"@litsx/litsx/internal/runtime-render-context\"\n );\n\n const importSpecifier = t.importSpecifier(\n t.identifier(\"bindRendererContext\"),\n t.identifier(\"bindRendererContext\")\n );\n\n for (const importPath of runtimeImports) {\n const { specifiers } = importPath.node;\n const hasImport = specifiers.some(\n (specifier) =>\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: \"bindRendererContext\" })\n );\n\n if (hasImport) {\n return;\n }\n\n specifiers.push(importSpecifier);\n return;\n }\n\n programPath.unshiftContainer(\"body\", t.importDeclaration(\n [importSpecifier],\n t.stringLiteral(\"@litsx/litsx/internal/runtime-render-context\")\n ));\n}\n\nexport default function transformLitsxRendererProps(api) {\n api.assertVersion?.(7);\n t = api.types;\n\n return {\n name: \"transform-litsx-renderer-props\",\n inherits: jsxSyntaxPlugin.default || jsxSyntaxPlugin,\n visitor: {\n Program: {\n enter(_, state) {\n state.__litsxNeedsRendererBindingImport = false;\n },\n exit(programPath, state) {\n if (state.__litsxNeedsRendererBindingImport) {\n ensureRendererBindingImport(programPath);\n }\n },\n },\n JSXAttribute(path, state) {\n const { node } = path;\n if (node.value?.type !== \"JSXExpressionContainer\") {\n return;\n }\n\n const rawName = decodeVirtualAttributeName(node.name.name) ?? node.name.name;\n const expressionPath = path.get(\"value.expression\");\n if (!expressionPath?.node) {\n return;\n }\n\n if (!shouldBindRendererContext(path, rawName, expressionPath, {\n filename: state.file?.opts?.filename || \"\",\n })) {\n return;\n }\n\n state.__litsxNeedsRendererBindingImport = true;\n node.value.expression = t.callExpression(\n t.identifier(\"bindRendererContext\"),\n [\n createHostReferenceExpression(),\n expressionPath.node,\n ]\n );\n },\n },\n };\n}\n"],"names":["importedBindingNeedsRendererContext"],"mappings":"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"}
package/dist/pipeline.cjs CHANGED
@@ -30,7 +30,7 @@ const NATIVE_TRANSFORM_OPTION_KEYS = [
30
30
  const HOOK_FEATURE_PATTERN = /\b(?:useOnConnect|useAfterUpdate|useOnCommit|useMemoValue|useStableCallback|useEvent|useEmit|usePrevious|useReducedState|useState|useControlledState|useAsyncState|useOptimistic|useExpose|useExternalStore|useHost|useHostContent|useSlot|useTextContent|useTransition|useDeferredValue|useStyle|useRef|useCallbackRef)\b/;
31
31
  const REF_FEATURE_PATTERN = /\buseRef\b|\bref\s*=/;
32
32
  const SCOPED_ELEMENTS_PATTERN = /<\s*(?:[A-Z][\w.]*(?=[\s/>])|[a-z][\w]*-[\w-]*(?=[\s/>]))/;
33
- const LIGHT_DOM_PATTERN = /\^lightDom\b/;
33
+ const LIGHT_DOM_PATTERN = /\^lightDom\b|static\s+lightDom\s*=\s*true\b/;
34
34
 
35
35
  function normalizeTransformLitsxOptions(options = {}) {
36
36
  const transformLitsxOptions = {
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.cjs","sources":["../src/pipeline.js"],"sourcesContent":["import transformJsxHtmlTemplate from \"@litsx/babel-plugin-transform-jsx-html-template\";\nimport transformLitsxScopedElements from \"@litsx/babel-plugin-transform-litsx-scoped-elements\";\nimport transformLitsxDomRefs from \"./internal/transform-litsx-dom-refs.js\";\nimport transformLitsxHooks from \"./internal/transform-litsx-hooks.js\";\nimport transformLitsxComponents from \"./internal/transform-litsx-components.js\";\nimport transformLitsxRendererProps from \"./internal/transform-litsx-renderer-props.js\";\n\nconst NATIVE_TRANSFORM_OPTION_KEYS = [\n \"defaultDomMode\",\n \"typeResolutionMode\",\n \"inMemoryFiles\",\n \"typescriptSession\",\n \"suppressNativeClassNameWarning\",\n \"__litsxCompilationSession\",\n];\n\nconst HOOK_FEATURE_PATTERN = /\\b(?:useOnConnect|useAfterUpdate|useOnCommit|useMemoValue|useStableCallback|useEvent|useEmit|usePrevious|useReducedState|useState|useControlledState|useAsyncState|useOptimistic|useExpose|useExternalStore|useHost|useHostContent|useSlot|useTextContent|useTransition|useDeferredValue|useStyle|useRef|useCallbackRef)\\b/;\nconst REF_FEATURE_PATTERN = /\\buseRef\\b|\\bref\\s*=/;\nconst SCOPED_ELEMENTS_PATTERN = /<\\s*(?:[A-Z][\\w.]*(?=[\\s/>])|[a-z][\\w]*-[\\w-]*(?=[\\s/>]))/;\nconst LIGHT_DOM_PATTERN = /\\^lightDom\\b/;\n\nexport function normalizeTransformLitsxOptions(options = {}) {\n const transformLitsxOptions = {\n ...(options.transformLitsx || {}),\n };\n\n for (const key of NATIVE_TRANSFORM_OPTION_KEYS) {\n if (Object.prototype.hasOwnProperty.call(options, key)) {\n transformLitsxOptions[key] = options[key];\n }\n }\n\n return transformLitsxOptions;\n}\n\nexport function detectLitsxSourceFeatures(source, options = {}) {\n const text = typeof source === \"string\" ? source : \"\";\n const transformOptions = normalizeTransformLitsxOptions(options);\n\n return {\n hooks: HOOK_FEATURE_PATTERN.test(text),\n domRefs: REF_FEATURE_PATTERN.test(text),\n scopedElements:\n transformOptions.defaultDomMode === \"light\" ||\n LIGHT_DOM_PATTERN.test(text) ||\n SCOPED_ELEMENTS_PATTERN.test(text),\n };\n}\n\nfunction shouldIncludeFeaturePlugin(sourceFeatures, key) {\n if (!sourceFeatures) {\n return true;\n }\n\n return sourceFeatures[key] === true;\n}\n\nexport function createLitsxPresetPlugins(options = {}, sourceFeatures = null) {\n const plugins = [\n [transformLitsxRendererProps, options.transformLitsxRendererProps || {}],\n [transformLitsxComponents, normalizeTransformLitsxOptions(options)],\n ];\n\n if (shouldIncludeFeaturePlugin(sourceFeatures, \"hooks\")) {\n plugins.push([transformLitsxHooks, options.transformLitsxHooks || {}]);\n }\n\n if (shouldIncludeFeaturePlugin(sourceFeatures, \"domRefs\")) {\n plugins.push([transformLitsxDomRefs, options.transformLitsxDomRefs || {}]);\n }\n\n if (shouldIncludeFeaturePlugin(sourceFeatures, \"scopedElements\")) {\n plugins.push([transformLitsxScopedElements, options.transformLitsxScopedElements || {}]);\n }\n\n if (options.jsxTemplate !== false) {\n if (options.jsxTemplateOptions && Object.keys(options.jsxTemplateOptions).length > 0) {\n plugins.push([transformJsxHtmlTemplate, options.jsxTemplateOptions]);\n } else {\n plugins.push(transformJsxHtmlTemplate);\n }\n }\n\n return plugins;\n}\n\nexport {\n default as transformLitsxComponents,\n createTransformFunctionToClassPlugin as createTransformLitsxComponentsPlugin,\n} from \"./internal/transform-litsx-components.js\";\nexport {\n setTypescriptModule,\n} from \"./internal/transform-litsx-properties.js\";\n"],"names":["transformLitsxRendererProps","transformLitsxComponents","transformLitsxHooks","transformLitsxDomRefs"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline.cjs","sources":["../src/pipeline.js"],"sourcesContent":["import transformJsxHtmlTemplate from \"@litsx/babel-plugin-transform-jsx-html-template\";\nimport transformLitsxScopedElements from \"@litsx/babel-plugin-transform-litsx-scoped-elements\";\nimport transformLitsxDomRefs from \"./internal/transform-litsx-dom-refs.js\";\nimport transformLitsxHooks from \"./internal/transform-litsx-hooks.js\";\nimport transformLitsxComponents from \"./internal/transform-litsx-components.js\";\nimport transformLitsxRendererProps from \"./internal/transform-litsx-renderer-props.js\";\n\nconst NATIVE_TRANSFORM_OPTION_KEYS = [\n \"defaultDomMode\",\n \"typeResolutionMode\",\n \"inMemoryFiles\",\n \"typescriptSession\",\n \"suppressNativeClassNameWarning\",\n \"__litsxCompilationSession\",\n];\n\nconst HOOK_FEATURE_PATTERN = /\\b(?:useOnConnect|useAfterUpdate|useOnCommit|useMemoValue|useStableCallback|useEvent|useEmit|usePrevious|useReducedState|useState|useControlledState|useAsyncState|useOptimistic|useExpose|useExternalStore|useHost|useHostContent|useSlot|useTextContent|useTransition|useDeferredValue|useStyle|useRef|useCallbackRef)\\b/;\nconst REF_FEATURE_PATTERN = /\\buseRef\\b|\\bref\\s*=/;\nconst SCOPED_ELEMENTS_PATTERN = /<\\s*(?:[A-Z][\\w.]*(?=[\\s/>])|[a-z][\\w]*-[\\w-]*(?=[\\s/>]))/;\nconst LIGHT_DOM_PATTERN = /\\^lightDom\\b|static\\s+lightDom\\s*=\\s*true\\b/;\n\nexport function normalizeTransformLitsxOptions(options = {}) {\n const transformLitsxOptions = {\n ...(options.transformLitsx || {}),\n };\n\n for (const key of NATIVE_TRANSFORM_OPTION_KEYS) {\n if (Object.prototype.hasOwnProperty.call(options, key)) {\n transformLitsxOptions[key] = options[key];\n }\n }\n\n return transformLitsxOptions;\n}\n\nexport function detectLitsxSourceFeatures(source, options = {}) {\n const text = typeof source === \"string\" ? source : \"\";\n const transformOptions = normalizeTransformLitsxOptions(options);\n\n return {\n hooks: HOOK_FEATURE_PATTERN.test(text),\n domRefs: REF_FEATURE_PATTERN.test(text),\n scopedElements:\n transformOptions.defaultDomMode === \"light\" ||\n LIGHT_DOM_PATTERN.test(text) ||\n SCOPED_ELEMENTS_PATTERN.test(text),\n };\n}\n\nfunction shouldIncludeFeaturePlugin(sourceFeatures, key) {\n if (!sourceFeatures) {\n return true;\n }\n\n return sourceFeatures[key] === true;\n}\n\nexport function createLitsxPresetPlugins(options = {}, sourceFeatures = null) {\n const plugins = [\n [transformLitsxRendererProps, options.transformLitsxRendererProps || {}],\n [transformLitsxComponents, normalizeTransformLitsxOptions(options)],\n ];\n\n if (shouldIncludeFeaturePlugin(sourceFeatures, \"hooks\")) {\n plugins.push([transformLitsxHooks, options.transformLitsxHooks || {}]);\n }\n\n if (shouldIncludeFeaturePlugin(sourceFeatures, \"domRefs\")) {\n plugins.push([transformLitsxDomRefs, options.transformLitsxDomRefs || {}]);\n }\n\n if (shouldIncludeFeaturePlugin(sourceFeatures, \"scopedElements\")) {\n plugins.push([transformLitsxScopedElements, options.transformLitsxScopedElements || {}]);\n }\n\n if (options.jsxTemplate !== false) {\n if (options.jsxTemplateOptions && Object.keys(options.jsxTemplateOptions).length > 0) {\n plugins.push([transformJsxHtmlTemplate, options.jsxTemplateOptions]);\n } else {\n plugins.push(transformJsxHtmlTemplate);\n }\n }\n\n return plugins;\n}\n\nexport {\n default as transformLitsxComponents,\n createTransformFunctionToClassPlugin as createTransformLitsxComponentsPlugin,\n} from \"./internal/transform-litsx-components.js\";\nexport {\n setTypescriptModule,\n} from \"./internal/transform-litsx-properties.js\";\n"],"names":["transformLitsxRendererProps","transformLitsxComponents","transformLitsxHooks","transformLitsxDomRefs"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litsx/babel-preset-litsx",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Canonical native Babel preset for LitSX-authored source",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -74,7 +74,7 @@
74
74
  "@babel/helper-plugin-utils": "^7.28.6",
75
75
  "@babel/plugin-syntax-jsx": "^7.28.6",
76
76
  "@babel/traverse": "^7.28.5",
77
- "@litsx/babel-parser": "^0.2.1",
77
+ "@litsx/babel-parser": "^0.2.2",
78
78
  "@litsx/babel-plugin-shared-hooks": "^0.2.1",
79
79
  "@litsx/babel-plugin-transform-jsx-html-template": "^0.3.0",
80
80
  "@litsx/babel-plugin-transform-litsx-scoped-elements": "^0.2.1",
@@ -1117,7 +1117,7 @@ export function extractProperties(functionPath, programPath, options = {}) {
1117
1117
  if (!propertyMap.has(propName) && warn) {
1118
1118
  warn({
1119
1119
  code: 91018,
1120
- message: `Falling back to String for prop "${propName}" inferred from opaque props access. Prefer destructuring, TypeScript types, or ^properties(...) for stronger property metadata.`,
1120
+ message: `Falling back to String for prop "${propName}" inferred from opaque props access. Prefer destructuring, TypeScript types, or static properties = ... for stronger property metadata.`,
1121
1121
  propName,
1122
1122
  localName: bindingName,
1123
1123
  line: memberPath.node.loc?.start?.line ?? null,
@@ -16,10 +16,17 @@ function isLightDomHoist(statement) {
16
16
  if (!t.isIdentifier(statement.expression.callee, { name: "__litsx_static_lightDom" })) {
17
17
  return false;
18
18
  }
19
- if (statement.expression.arguments.length !== 0) {
20
- throw new Error("^lightDom() does not accept arguments.");
19
+
20
+ const args = statement.expression.arguments;
21
+ if (args.length === 0) {
22
+ return true;
23
+ }
24
+
25
+ if (args.length === 1 && t.isBooleanLiteral(args[0], { value: true })) {
26
+ return true;
21
27
  }
22
- return true;
28
+
29
+ throw new Error("static lightDom = true only accepts the literal value true.");
23
30
  }
24
31
 
25
32
  function createStaticHoistGetter(name, symbolId, expression) {
@@ -97,11 +104,11 @@ function getStaticPropsExpression(statement) {
97
104
 
98
105
  const [argument] = statement.expression.arguments;
99
106
  if (isHoistedProperties && (t.isFunctionExpression(argument) || t.isArrowFunctionExpression(argument))) {
100
- throw new Error("^properties(...) only accepts an object literal with static Lit property options.");
107
+ throw new Error("static properties = ... only accepts an object literal with static Lit property options.");
101
108
  }
102
109
 
103
110
  if (!t.isObjectExpression(argument)) {
104
- throw new Error("^properties(...) only accepts an object literal with static Lit property options.");
111
+ throw new Error("static properties = ... only accepts an object literal with static Lit property options.");
105
112
  }
106
113
 
107
114
  return isHoistedProperties ? {
@@ -146,7 +153,7 @@ function normalizeStaticPropOverrideValue(value) {
146
153
  }
147
154
 
148
155
  throw new Error(
149
- "^properties(...) values must be Lit property option objects or constructor references."
156
+ "static properties = ... values must be Lit property option objects or constructor references."
150
157
  );
151
158
  }
152
159
 
@@ -157,12 +164,12 @@ function mergeStaticPropertyObject(targetNode, overrideObject) {
157
164
 
158
165
  overrideObject.properties.forEach((property) => {
159
166
  if (!t.isObjectProperty(property) && !t.isObjectMethod(property)) {
160
- throw new Error("^properties(...) only accepts plain object members.");
167
+ throw new Error("static properties = ... only accepts plain object members.");
161
168
  }
162
169
 
163
170
  const keyName = getStaticPropertyName(property.key);
164
171
  if (!keyName) {
165
- throw new Error("^properties(...) property option names must be static identifiers or strings.");
172
+ throw new Error("static properties = ... property option names must be static identifiers or strings.");
166
173
  }
167
174
 
168
175
  const existing = targetNode.value.properties.find(
@@ -194,12 +201,12 @@ function mergeStaticPropsIntoProperties(propertiesStatic, staticProps) {
194
201
  staticProps.forEach((optionsObject) => {
195
202
  optionsObject.properties.forEach((property) => {
196
203
  if (!t.isObjectProperty(property)) {
197
- throw new Error("^properties(...) only accepts plain object properties.");
204
+ throw new Error("static properties = ... only accepts plain object properties.");
198
205
  }
199
206
 
200
207
  const keyName = getStaticPropertyName(property.key);
201
208
  if (!keyName) {
202
- throw new Error("^properties(...) property names must be static identifiers or strings.");
209
+ throw new Error("static properties = ... property names must be static identifiers or strings.");
203
210
  }
204
211
 
205
212
  const existing = propertyMap.get(keyName);
@@ -302,7 +309,7 @@ function getStaticStylesExpression(statement, functionPath) {
302
309
  const [argument] = statement.expression.arguments;
303
310
 
304
311
  if (isHoistedStyles && (t.isFunctionExpression(argument) || t.isArrowFunctionExpression(argument))) {
305
- throw new Error("^styles(...) only accepts static values. Move dynamic values to useStyle(...) or CSS custom properties.");
312
+ throw new Error("static styles = ... only accepts static values. Move dynamic values to useStyle(...) or CSS custom properties.");
306
313
  }
307
314
 
308
315
  const template = normalizeStylesTemplate(
@@ -310,7 +317,7 @@ function getStaticStylesExpression(statement, functionPath) {
310
317
  functionPath
311
318
  );
312
319
  if (!template) {
313
- throw new Error("^styles(...) only accepts static values. Move dynamic values to useStyle(...) or CSS custom properties.");
320
+ throw new Error("static styles = ... only accepts static values. Move dynamic values to useStyle(...) or CSS custom properties.");
314
321
  }
315
322
 
316
323
  const expression = t.taggedTemplateExpression(t.identifier("css"), template);
@@ -335,7 +342,7 @@ function getStaticHoistExpression(statement, functionPath) {
335
342
  }
336
343
 
337
344
  if (statement.expression.arguments.length !== 1) {
338
- throw new Error(`^${name}(...) expects exactly one argument.`);
345
+ throw new Error(`static ${name} = ... expects exactly one argument.`);
339
346
  }
340
347
 
341
348
  const [argument] = statement.expression.arguments;
@@ -347,15 +354,15 @@ function getStaticHoistExpression(statement, functionPath) {
347
354
  };
348
355
  }
349
356
 
350
- throw new Error("^expose(...) only accepts an object literal.");
357
+ throw new Error("static expose = ... only accepts an object literal.");
351
358
  }
352
359
 
353
360
  if (t.isFunctionExpression(argument) || t.isArrowFunctionExpression(argument)) {
354
- throw new Error(`^${name}(...) only accepts a direct static value.`);
361
+ throw new Error(`static ${name} = ... only accepts a direct static value.`);
355
362
  }
356
363
 
357
364
  if (!isStaticStylesExpression(argument, functionPath)) {
358
- throw new Error(`^${name}(...) only accepts a direct static value.`);
365
+ throw new Error(`static ${name} = ... only accepts a direct static value.`);
359
366
  }
360
367
 
361
368
  return {
@@ -379,7 +386,7 @@ function normalizeExposeHoistExpression(expression) {
379
386
  };
380
387
  }
381
388
 
382
- throw new Error("^expose(...) only accepts an object literal.");
389
+ throw new Error("static expose = ... only accepts an object literal.");
383
390
  }
384
391
 
385
392
  function createExposeClassMethod(property) {
@@ -390,12 +397,12 @@ function createExposeClassMethod(property) {
390
397
 
391
398
  function normalizeExposePropertyToClassMethod(property) {
392
399
  if (t.isSpreadElement(property)) {
393
- throw new Error("^expose(...) does not accept spread elements.");
400
+ throw new Error("static expose = ... does not accept spread elements.");
394
401
  }
395
402
 
396
403
  if (t.isObjectMethod(property)) {
397
404
  if (property.kind !== "method") {
398
- throw new Error("^expose(...) only accepts plain methods.");
405
+ throw new Error("static expose = ... only accepts plain methods.");
399
406
  }
400
407
 
401
408
  return t.classMethod(
@@ -408,12 +415,12 @@ function normalizeExposePropertyToClassMethod(property) {
408
415
  }
409
416
 
410
417
  if (!t.isObjectProperty(property)) {
411
- throw new Error("^expose(...) only accepts plain methods.");
418
+ throw new Error("static expose = ... only accepts plain methods.");
412
419
  }
413
420
 
414
421
  const value = property.value;
415
422
  if (!t.isFunctionExpression(value) && !t.isArrowFunctionExpression(value)) {
416
- throw new Error("^expose(...) values must be functions.");
423
+ throw new Error("static expose = ... values must be functions.");
417
424
  }
418
425
 
419
426
  const body = t.isBlockStatement(value.body)
@@ -451,7 +458,7 @@ export function assertStaticHoistsStayTopLevel(functionPath) {
451
458
 
452
459
  const macroName = callPath.node.callee.name.slice("__litsx_static_".length);
453
460
  throw callPath.buildCodeFrameError(
454
- `^${macroName}(...) must appear as a top-level statement in the component body.`
461
+ `static ${macroName} = ... must appear as a top-level statement in the component body.`
455
462
  );
456
463
  },
457
464
  });
@@ -662,8 +669,12 @@ export function processStaticHoists({
662
669
  }
663
670
  }
664
671
 
665
- if (lightDomRequested && staticHoists.some((entry) => entry.name === "shadowRootOptions")) {
666
- throw new Error("^lightDom() cannot be combined with ^shadowRootOptions(...).");
672
+ if (lightDomRequested) {
673
+ for (let index = staticHoists.length - 1; index >= 0; index -= 1) {
674
+ if (staticHoists[index]?.name === "shadowRootOptions") {
675
+ staticHoists.splice(index, 1);
676
+ }
677
+ }
667
678
  }
668
679
 
669
680
  if (staticProps.length > 0) {
package/src/pipeline.js CHANGED
@@ -17,7 +17,7 @@ const NATIVE_TRANSFORM_OPTION_KEYS = [
17
17
  const HOOK_FEATURE_PATTERN = /\b(?:useOnConnect|useAfterUpdate|useOnCommit|useMemoValue|useStableCallback|useEvent|useEmit|usePrevious|useReducedState|useState|useControlledState|useAsyncState|useOptimistic|useExpose|useExternalStore|useHost|useHostContent|useSlot|useTextContent|useTransition|useDeferredValue|useStyle|useRef|useCallbackRef)\b/;
18
18
  const REF_FEATURE_PATTERN = /\buseRef\b|\bref\s*=/;
19
19
  const SCOPED_ELEMENTS_PATTERN = /<\s*(?:[A-Z][\w.]*(?=[\s/>])|[a-z][\w]*-[\w-]*(?=[\s/>]))/;
20
- const LIGHT_DOM_PATTERN = /\^lightDom\b/;
20
+ const LIGHT_DOM_PATTERN = /\^lightDom\b|static\s+lightDom\s*=\s*true\b/;
21
21
 
22
22
  export function normalizeTransformLitsxOptions(options = {}) {
23
23
  const transformLitsxOptions = {