diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/error.txt b/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/error.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/expected.html b/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/expected.html new file mode 100644 index 0000000000..06eeef1603 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/expected.html @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/index.js b/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/index.js new file mode 100644 index 0000000000..e1bbf136a8 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/index.js @@ -0,0 +1,3 @@ +export const tagName = 'x-attribute-boolean'; +export { default } from 'x/attribute-boolean'; +export * from 'x/attribute-boolean'; \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/modules/x/attribute-boolean/attribute-boolean.html b/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/modules/x/attribute-boolean/attribute-boolean.html new file mode 100755 index 0000000000..b0e7779751 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/modules/x/attribute-boolean/attribute-boolean.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/modules/x/attribute-boolean/attribute-boolean.js b/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/modules/x/attribute-boolean/attribute-boolean.js new file mode 100755 index 0000000000..f3236c1b2d --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/attribute-boolean copy/modules/x/attribute-boolean/attribute-boolean.js @@ -0,0 +1,3 @@ +import { LightningElement } from 'lwc'; + +export default class AttributeBoolean extends LightningElement {} \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/error.txt b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/error.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/expected.html b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/expected.html new file mode 100644 index 0000000000..922761b9c6 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/expected.html @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/index.js b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/index.js new file mode 100644 index 0000000000..f385012e94 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/index.js @@ -0,0 +1,3 @@ +export const tagName = 'x-component'; +export { default } from 'x/component'; +export * from 'x/component'; \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/modules/x/component/component.html b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/modules/x/component/component.html new file mode 100755 index 0000000000..bdb4880dc8 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/modules/x/component/component.html @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/modules/x/component/component.js b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/modules/x/component/component.js new file mode 100755 index 0000000000..5894154122 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else-if-else/modules/x/component/component.js @@ -0,0 +1,6 @@ +import { LightningElement, api } from 'lwc'; + +export default class IfBlock extends LightningElement { + isTrue = true; + isFalse = false; +} \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/error.txt b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/error.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/expected.html b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/expected.html new file mode 100644 index 0000000000..d9dab77faa --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/expected.html @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/index.js b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/index.js new file mode 100644 index 0000000000..f385012e94 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/index.js @@ -0,0 +1,3 @@ +export const tagName = 'x-component'; +export { default } from 'x/component'; +export * from 'x/component'; \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/modules/x/component/component.html b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/modules/x/component/component.html new file mode 100755 index 0000000000..ea7379b400 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/modules/x/component/component.html @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/modules/x/component/component.js b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/modules/x/component/component.js new file mode 100755 index 0000000000..5894154122 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if-else/modules/x/component/component.js @@ -0,0 +1,6 @@ +import { LightningElement, api } from 'lwc'; + +export default class IfBlock extends LightningElement { + isTrue = true; + isFalse = false; +} \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/error.txt b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/error.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/expected.html b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/expected.html new file mode 100644 index 0000000000..735209f54b --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/expected.html @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/index.js b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/index.js new file mode 100644 index 0000000000..f385012e94 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/index.js @@ -0,0 +1,3 @@ +export const tagName = 'x-component'; +export { default } from 'x/component'; +export * from 'x/component'; \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/modules/x/component/component.html b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/modules/x/component/component.html new file mode 100755 index 0000000000..7f4a076bd3 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/modules/x/component/component.html @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/modules/x/component/component.js b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/modules/x/component/component.js new file mode 100755 index 0000000000..5894154122 --- /dev/null +++ b/packages/@lwc/engine-server/src/__tests__/fixtures/lwc-if/modules/x/component/component.js @@ -0,0 +1,6 @@ +import { LightningElement, api } from 'lwc'; + +export default class IfBlock extends LightningElement { + isTrue = true; + isFalse = false; +} \ No newline at end of file diff --git a/packages/@lwc/ssr-compiler/src/compile-template/if.ts b/packages/@lwc/ssr-compiler/src/compile-template/if.ts index 7bfb200f3b..002edd0fb3 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/if.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/if.ts @@ -19,10 +19,18 @@ import type { import type { BlockStatement as EsBlockStatement, IfStatement as EsIfStatement } from 'estree'; import type { Transformer, TransformerContext } from './types'; -function bBlockStatement(childNodes: IrChildNode[], cxt: TransformerContext): EsBlockStatement { - return b.blockStatement( - optimizeAdjacentYieldStmts(childNodes.flatMap((childNode) => irToEs(childNode, cxt))) - ); +function bYieldComment(text = '') { + return b.expressionStatement(b.yieldExpression(b.literal(``))); +} + +function bBlockStatement( + childNodes: IrChildNode[], + cxt: TransformerContext, + insertComments: boolean +): EsBlockStatement { + let statements = childNodes.flatMap((childNode) => irToEs(childNode, cxt)); + if (insertComments) statements = [bYieldComment(), ...statements, bYieldComment()]; + return b.blockStatement(optimizeAdjacentYieldStmts(statements)); } export const If: Transformer = function If(node, cxt) { @@ -35,7 +43,7 @@ export const If: Transformer = function If(node, cxt) { expressionIrToEs(condition, cxt) ); - return [b.ifStatement(comparison, bBlockStatement(children, cxt))]; + return [b.ifStatement(comparison, bBlockStatement(children, cxt, false))]; }; function bIfStatement( @@ -47,7 +55,7 @@ function bIfStatement( let elseBlock = null; if (elseNode) { if (elseNode.type === 'ElseBlock') { - elseBlock = bBlockStatement(elseNode.children, cxt); + elseBlock = bBlockStatement(elseNode.children, cxt, true); } else { elseBlock = bIfStatement(elseNode, cxt); } @@ -55,11 +63,11 @@ function bIfStatement( return b.ifStatement( expressionIrToEs(condition, cxt), - bBlockStatement(children, cxt), + bBlockStatement(children, cxt, true), elseBlock ); } -export const IfBlock: Transformer = function IfBlock(node, cxt) { +export const IfBlock: Transformer = function IfBlock(node, cxt) { return [bIfStatement(node, cxt)]; }; diff --git a/packages/@lwc/ssr-compiler/src/compile-template/ir-to-es.ts b/packages/@lwc/ssr-compiler/src/compile-template/ir-to-es.ts index b5f186b870..287cd053b0 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/ir-to-es.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/ir-to-es.ts @@ -51,7 +51,9 @@ const transformers: Transformers = { IfBlock, Root, Text, + // lwc:elseif cannot exist without an lwc:if (IfBlock); this gets handled by that transformer ElseifBlock: defaultTransformer, + // lwc:elseif cannot exist without an lwc:elseif (IfBlock); this gets handled by that transformer ElseBlock: defaultTransformer, ScopedSlotFragment: defaultTransformer, Slot: defaultTransformer, @@ -70,7 +72,7 @@ export function irChildrenToEs(children: IrChildNode[], cxt: TransformerContext) } export function irToEs(node: T, cxt: TransformerContext): EsStatement[] { - const transformer = (transformers[node.type] as Transformer) ?? defaultTransformer; + const transformer = transformers[node.type] as Transformer; return transformer(node, cxt); }