diff --git a/packages/babel-plugin-jsx-dom-expressions/src/dom/element.js b/packages/babel-plugin-jsx-dom-expressions/src/dom/element.js index 997a63597..244877beb 100644 --- a/packages/babel-plugin-jsx-dom-expressions/src/dom/element.js +++ b/packages/babel-plugin-jsx-dom-expressions/src/dom/element.js @@ -547,7 +547,7 @@ function transformAttributes(path, results) { (reservedNameSpace || !(t.isStringLiteral(value.expression) || t.isNumericLiteral(value.expression))) ) { - if (key === "ref") { + if (key === "ref" || key.slice(0, 4) === "ref:") { // Normalize expressions for non-null and type-as while ( t.isTSNonNullExpression(value.expression) || diff --git a/packages/babel-plugin-jsx-dom-expressions/src/shared/component.js b/packages/babel-plugin-jsx-dom-expressions/src/shared/component.js index 3762b868b..1bc21094c 100644 --- a/packages/babel-plugin-jsx-dom-expressions/src/shared/component.js +++ b/packages/babel-plugin-jsx-dom-expressions/src/shared/component.js @@ -68,7 +68,7 @@ export default function transformComponent(path) { key = id.name; if (hasChildren && key === "children") return; if (t.isJSXExpressionContainer(value)) - if (key === "ref") { + if (key === "ref" || (key && key.slice(0, 4) === 'ref:')) { if (config.generate === "ssr") return; // Normalize expressions for non-null and type-as while ( diff --git a/packages/babel-plugin-jsx-dom-expressions/src/shared/utils.js b/packages/babel-plugin-jsx-dom-expressions/src/shared/utils.js index 2bde30efe..e52627093 100644 --- a/packages/babel-plugin-jsx-dom-expressions/src/shared/utils.js +++ b/packages/babel-plugin-jsx-dom-expressions/src/shared/utils.js @@ -9,10 +9,11 @@ export const reservedNameSpaces = new Set([ "use", "prop", "attr", - "bool" + "bool", + "ref" ]); -export const nonSpreadNameSpaces = new Set(["class", "style", "use", "prop", "attr", "bool"]); +export const nonSpreadNameSpaces = new Set(["class", "style", "use", "prop", "attr", "bool", "ref"]); export function getConfig(path) { return path.hub.file.metadata.config; diff --git a/packages/babel-plugin-jsx-dom-expressions/src/ssr/element.js b/packages/babel-plugin-jsx-dom-expressions/src/ssr/element.js index 1db752788..1a2ff304b 100644 --- a/packages/babel-plugin-jsx-dom-expressions/src/ssr/element.js +++ b/packages/babel-plugin-jsx-dom-expressions/src/ssr/element.js @@ -302,6 +302,7 @@ function transformAttributes(path, results, info) { ) { if ( key === "ref" || + key.startsWith("ref:") || key.startsWith("use:") || key.startsWith("prop:") || key.startsWith("on") @@ -555,6 +556,7 @@ function createElement(path, { topLevel, hydratable }) { if (hasChildren && key === "children") return; if ( key === "ref" || + key.startsWith("ref:") || key.startsWith("use:") || key.startsWith("prop:") || key.startsWith("on") diff --git a/packages/babel-plugin-jsx-dom-expressions/src/universal/element.js b/packages/babel-plugin-jsx-dom-expressions/src/universal/element.js index cff5d84ec..5613aa75e 100644 --- a/packages/babel-plugin-jsx-dom-expressions/src/universal/element.js +++ b/packages/babel-plugin-jsx-dom-expressions/src/universal/element.js @@ -85,7 +85,7 @@ function transformAttributes(path, results) { node.value = value = t.jsxExpressionContainer(value || t.jsxEmptyExpression()); } if (t.isJSXExpressionContainer(value)) { - if (key === "ref") { + if (key === "ref" || key.slice(0, 4) === "ref:") { // Normalize expressions for non-null and type-as while ( t.isTSNonNullExpression(value.expression) || diff --git a/packages/babel-plugin-jsx-dom-expressions/test/__dom_compatible_fixtures__/attributeExpressions/code.js b/packages/babel-plugin-jsx-dom-expressions/test/__dom_compatible_fixtures__/attributeExpressions/code.js index ac9fe990c..3e92c5f2d 100644 --- a/packages/babel-plugin-jsx-dom-expressions/test/__dom_compatible_fixtures__/attributeExpressions/code.js +++ b/packages/babel-plugin-jsx-dom-expressions/test/__dom_compatible_fixtures__/attributeExpressions/code.js @@ -275,4 +275,14 @@ const template90 =