summaryrefslogtreecommitdiff
path: root/packages/integrations/lit/server-shim.js
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/lit/server-shim.js')
-rw-r--r--packages/integrations/lit/server-shim.js41
1 files changed, 28 insertions, 13 deletions
diff --git a/packages/integrations/lit/server-shim.js b/packages/integrations/lit/server-shim.js
index 3f4a8df4f..ed371f89a 100644
--- a/packages/integrations/lit/server-shim.js
+++ b/packages/integrations/lit/server-shim.js
@@ -1,20 +1,35 @@
-import { installWindowOnGlobal } from '@lit-labs/ssr/lib/dom-shim.js';
+import { customElements as litCE, HTMLElement as litShimHTMLElement } from '@lit-labs/ssr-dom-shim';
-if (typeof fetch === 'function') {
- const _fetch = fetch;
- installWindowOnGlobal();
- globalThis.fetch = window.fetch = _fetch;
-} else {
- installWindowOnGlobal();
+// Something at build time injects document.currentScript = undefined instead of
+// document.currentScript = null. This causes Sass build to fail because it
+// seems to be expecting `=== null`. This set to `undefined` doesn't seem to be
+// caused by Lit and only happens at build / test time, but not in dev or
+// preview time.
+if (globalThis.document) {
+ document.currentScript = null;
}
-window.global = window;
-document.getElementsByTagName = () => [];
-// See https://github.com/lit/lit/issues/2393
-document.currentScript = null;
+if (globalThis.HTMLElement) {
+ // Seems Astro's Element shim does nothing when `.setAttribute` is called
+ // and subsequently `.getAttribute` is called. Causes Lit to not SSR attrs
+ globalThis.HTMLElement = litShimHTMLElement;
+}
+
+// Astro seems to have a DOM shim and the only real difference that we need out
+// of the Lit DOM shim is that the Lit DOM shim reads
+// `HTMLElement.observedAttributes` which is meant to trigger
+// `ReactiveElement.finalize()`. So this is the only thing we will re-shim since
+// Lit will try to respect other global DOM shims.
+globalThis.customElements = litCE;
+
+const litCeDefine = customElements.define;
-const ceDefine = customElements.define;
+// We need to patch customElements.define to keep track of the tagName on the
+// class itself so that we can transform JSX custom element class definintion to
+// a DSD string on the server, because there is no way to get the tagName from a
+// CE class otherwise. Not an issue on client:only because the browser supports
+// appending a class instance directly to the DOM.
customElements.define = function (tagName, Ctr) {
Ctr[Symbol.for('tagName')] = tagName;
- return ceDefine.call(this, tagName, Ctr);
+ return litCeDefine.call(this, tagName, Ctr);
};