Skip to content

Commit 17bb342

Browse files
committed
fix(ssr): support export { Cmp as default }
1 parent 4ab7230 commit 17bb342

File tree

6 files changed

+37
-17
lines changed

6 files changed

+37
-17
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { LightningElement } from 'lwc';
22

3-
class Component extends LightningElement {
3+
class Light extends LightningElement {
44
static renderMode = 'light';
55
}
66

7-
export { Component as default };
7+
export { Light as default };
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
import { LightningElement } from 'lwc';
22

3-
export default class Component extends LightningElement {}
3+
export default class Parent extends LightningElement {}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { LightningElement } from 'lwc';
22

3-
class Component extends LightningElement {}
3+
class Shadow extends LightningElement {}
44

5-
export { Component as default };
5+
export { Shadow as default };

packages/@lwc/ssr-compiler/src/compile-template/transformers/component/component.ts

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,23 @@ const bYieldFromChildGenerator = esTemplateWithYield`
3737
}
3838
3939
const scopeToken = hasScopedStylesheets ? stylesheetScopeToken : undefined;
40-
const Ctor = ${/* Component */ is.identifier};
40+
const generateMarkup = ${/* Component */ is.identifier}[__SYMBOL__GENERATE_MARKUP];
4141
42-
yield* Ctor[__SYMBOL__GENERATE_MARKUP](
43-
${/* tag name */ is.literal},
44-
childProps,
45-
childAttrs,
46-
shadowSlottedContent,
47-
lightSlottedContentMap,
48-
scopedSlottedContentMap,
49-
instance,
50-
scopeToken,
51-
contextfulParent
52-
);
42+
if (!generateMarkup) {
43+
yield __unimplementedTmpl(${/* tag name */ is.literal}, ${/* Component */ 3});
44+
} else {
45+
yield* generateMarkup(
46+
${/* tag name */ 4},
47+
childProps,
48+
childAttrs,
49+
shadowSlottedContent,
50+
lightSlottedContentMap,
51+
scopedSlottedContentMap,
52+
instance,
53+
scopeToken,
54+
contextfulParent
55+
);
56+
}
5357
}
5458
`<EsBlockStatement>;
5559

@@ -60,6 +64,7 @@ export const Component: Transformer<IrComponent> = function Component(node, cxt)
6064
cxt.import({ default: childComponentLocalName }, importPath);
6165
cxt.import({
6266
SYMBOL__GENERATE_MARKUP: '__SYMBOL__GENERATE_MARKUP',
67+
unimplementedTmpl: '__unimplementedTmpl',
6368
});
6469
const childTagName = node.name;
6570

packages/@lwc/ssr-runtime/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export {
2828
serverSideRenderComponent,
2929
// renderComponent is an alias for serverSideRenderComponent
3030
serverSideRenderComponent as renderComponent,
31+
unimplementedTmpl,
3132
} from './render';
3233
export { normalizeTextContent, renderTextContent } from './render-text-content';
3334
export { hasScopedStaticStylesheets, renderStylesheets } from './styles';

packages/@lwc/ssr-runtime/src/render.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,20 @@ export function fallbackTmplNoYield(
125125
}
126126
}
127127

128+
/**
129+
* If a component is incorrectly implemented, and is missing a `generateMarkup` function,
130+
* then use this template as a fallback so the world doesn't explode.
131+
* @example export { Cmp as default }
132+
*/
133+
export function unimplementedTmpl(tagName: string, Cmp?: LightningElementConstructor): string {
134+
let html = `<${tagName}>`;
135+
if (Cmp?.renderMode !== 'light') {
136+
html += '<template shadowrootmode="open"></template>';
137+
}
138+
html += `</${tagName}>`;
139+
return html;
140+
}
141+
128142
export type GenerateMarkupFn = (
129143
tagName: string,
130144
props: Properties | null,

0 commit comments

Comments
 (0)