From 33b77376a5ed6957a2603ae44a381eae0ce35f6c Mon Sep 17 00:00:00 2001 From: jhefferman-sfdc <83669775+jhefferman-sfdc@users.noreply.github.com> Date: Tue, 26 Nov 2024 16:44:29 -0700 Subject: [PATCH] fix(ssr-compiler): transform of empty text strings (#4963) Co-authored-by: Nolan Lawson --- .../src/compile-template/transformers/text.ts | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/packages/@lwc/ssr-compiler/src/compile-template/transformers/text.ts b/packages/@lwc/ssr-compiler/src/compile-template/transformers/text.ts index cc517dede3..a1782e584f 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/transformers/text.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/transformers/text.ts @@ -9,7 +9,11 @@ import { builders as b, is } from 'estree-toolkit'; import { esTemplateWithYield } from '../../estemplate'; import { expressionIrToEs } from '../expression'; -import type { Expression as EsExpression, Statement as EsStatement } from 'estree'; +import type { + Expression as EsExpression, + Statement as EsStatement, + BlockStatement as EsBlockStatement, +} from 'estree'; import type { ComplexExpression as IrComplexExpression, Expression as IrExpression, @@ -22,19 +26,14 @@ import type { Transformer } from '../types'; const bYield = (expr: EsExpression) => b.expressionStatement(b.yieldExpression(expr)); const bYieldEscapedString = esTemplateWithYield` - const ${/* temp var */ is.identifier} = ${/* string value */ is.expression}; - switch (typeof ${0}) { - case 'string': - yield (${/* is isolated text node? */ is.literal} && ${0} === '') ? '\\u200D' : htmlEscape(${0}); - break; - case 'number': - case 'boolean': - yield String(${0}); - break; - default: - yield ${0} ? htmlEscape(${0}.toString()) : ${2} ? '\\u200D' : ''; + { + const value = ${/* string value */ is.expression}; + // Using non strict equality to align with original implementation (ex. undefined == null) + // See: https://github.com/salesforce/lwc/blob/348130f/packages/%40lwc/engine-core/src/framework/api.ts#L548 + const massagedValue = value == null ? '' : String(value); + yield ${/* is isolated text node? */ is.literal} && massagedValue === '' ? '\\u200D' : htmlEscape(massagedValue); } -`; +`; function isLiteral(node: IrLiteral | IrExpression | IrComplexExpression): node is IrLiteral { return node.type === 'Literal'; @@ -61,8 +60,7 @@ export const Text: Transformer = function Text(node, cxt): EsStatement[] ); const valueToYield = expressionIrToEs(node.value, cxt); - const tempVariable = b.identifier(cxt.getUniqueVar()); cxt.import('htmlEscape'); - return bYieldEscapedString(tempVariable, valueToYield, isIsolatedTextNode); + return [bYieldEscapedString(valueToYield, isIsolatedTextNode)]; };