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 @@
+
+
+
+ I am rendered.
+
+
+ Render me!
+
+
+
\ 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 @@
+
+
+ I am not rendered.
+
+
+ I am rendered.
+
+
+ I am also not rendered.
+
+
+
+ I am not rendered.
+
+
+ I, too, do not render.
+
+
+ Render me!
+
+
\ 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 @@
+
+
+
+ I am true!
+
+
+ I am not false!
+
+
+
\ 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 @@
+
+
+ I am true!
+
+
+ I am not true!
+
+
+
+ I am false!
+
+
+ I am not false!
+
+
\ 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 @@
+
+
+
+ I am rendered!
+
+
+
\ 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 @@
+
+
+ I am rendered!
+
+
+ I am not rendered!
+
+
\ 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);
}