Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[core] Fix CSSStyleSheet is not defined error in Node build #3222

Merged
merged 3 commits into from Aug 18, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/fifty-monkeys-shop.md
@@ -0,0 +1,6 @@
---
'lit-element': patch
augustjk marked this conversation as resolved.
Show resolved Hide resolved
'lit': patch
---

Fix `CSSStyleSheet is not defined` error that would occur when importing a Lit component in Node when both static `styles` and the `@property` decorator were used.
19 changes: 16 additions & 3 deletions packages/lit-element/src/test/node-imports.ts
Expand Up @@ -21,13 +21,26 @@ import 'lit-element/decorators/query-assigned-elements.js';
import 'lit-element/decorators/query-assigned-nodes.js';
import 'lit-element/decorators/query-async.js';

import {LitElement, html} from 'lit-element';
import {customElement} from 'lit-element/decorators.js';
import {LitElement, html, css} from 'lit-element';
import {customElement, property} from 'lit-element/decorators.js';
augustjk marked this conversation as resolved.
Show resolved Hide resolved

@customElement('my-element')
export class MyElement extends LitElement {
// Include both static styles and a @property decorator in the test. The
// @property decorator trigggers class initialization, and if there are also
// static styles, it will trigger a test for adopted stylesheets, which could
// explode if not handled with care in the node build.
static override styles = css`
p {
color: purple;
}
`;

@property()
name = 'World';

override render() {
return html`Hello World`;
return html`<p>Hello ${this.name}</p>`;
}
}

Expand Down
14 changes: 10 additions & 4 deletions packages/reactive-element/src/css-tag.ts
Expand Up @@ -11,10 +11,16 @@ const global = NODE_MODE ? globalThis : window;
* Whether the current browser supports `adoptedStyleSheets`.
*/
export const supportsAdoptingStyleSheets =
global.ShadowRoot &&
(global.ShadyCSS === undefined || global.ShadyCSS.nativeShadow) &&
'adoptedStyleSheets' in Document.prototype &&
'replace' in CSSStyleSheet.prototype;
// In Node mode, it doesn't really matter whether we believe adopted style
// sheets are supported or not, because styles are handled separately as part
// of SSR anyway; however if we set this to true then we avoid `instanceof
// CSSStyleSheet` checks during initialization, meaning we don't need to shim
// that global.
NODE_MODE ||
augustjk marked this conversation as resolved.
Show resolved Hide resolved
(global.ShadowRoot &&
(global.ShadyCSS === undefined || global.ShadyCSS.nativeShadow) &&
'adoptedStyleSheets' in Document.prototype &&
'replace' in CSSStyleSheet.prototype);

/**
* A CSSResult or native CSSStyleSheet.
Expand Down
19 changes: 16 additions & 3 deletions packages/reactive-element/src/test/node-imports.ts
Expand Up @@ -22,11 +22,24 @@ import '@lit/reactive-element/decorators/query-assigned-elements.js';
import '@lit/reactive-element/decorators/query-assigned-nodes.js';
import '@lit/reactive-element/decorators/query-async.js';

import {customElement} from '@lit/reactive-element/decorators.js';
import {ReactiveElement} from '@lit/reactive-element';
import {customElement, property} from '@lit/reactive-element/decorators.js';
import {ReactiveElement, css} from '@lit/reactive-element';

@customElement('my-element')
export class MyElement extends ReactiveElement {}
export class MyElement extends ReactiveElement {
// Include both static styles and a @property decorator in the test. The
// @property decorator trigggers class initialization, and if there are also
// static styles, it will trigger a test for adopted stylesheets, which could
// explode if not handled with care in the node build.
static override styles = css`
p {
color: purple;
}
`;

@property()
name = 'World';
}

export class MyOtherElement extends ReactiveElement {}
customElements.define('my-other-element', MyOtherElement);