Skip to content

Commit ec694bb

Browse files
committed
Chore: Create standalone repo for astro lit
0 parents  commit ec694bb

19 files changed

Lines changed: 1071 additions & 0 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules/

CHANGELOG.md

Lines changed: 323 additions & 0 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# @astrojs/lit 🔥
2+
3+
> First party support for Lit was included up until Astro 5 but was removed. This community version preserves Lit SSR rendering for newer versions of Lit.
4+
5+
This **[Astro integration][https://astro.build/integrations/]** enables server-side rendering and client-side hydration for your [Lit](https://lit.dev/) custom elements.
6+
7+
## License
8+
9+
MIT

client-shim.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
async function polyfill() {
2+
const { hydrateShadowRoots } = await import(
3+
'@webcomponents/template-shadowroot/template-shadowroot.js'
4+
);
5+
window.addEventListener('DOMContentLoaded', () => hydrateShadowRoots(document.body), {
6+
once: true,
7+
});
8+
}
9+
10+
const polyfillCheckEl = Document.parseHTMLUnsafe(
11+
`<p><template shadowrootmode="open"></template></p>`
12+
).querySelector('p');
13+
14+
if (!polyfillCheckEl?.shadowRoot) {
15+
polyfill();
16+
}

client-shim.min.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/** @license Copyright 2020 Google LLC (BSD-3-Clause) */
2+
/** Bundled JS generated from "@astrojs/lit/client-shim.js" */
3+
var N = Object.defineProperty;
4+
var i = (t, n) => () => (t && (n = t((t = 0))), n);
5+
var b = (t, n) => {
6+
for (var a in n) N(t, a, { get: n[a], enumerable: !0 });
7+
};
8+
function s() {
9+
if (d === void 0) {
10+
let t = document.createElement('div');
11+
(t.innerHTML = '<div><template shadowrootmode="open"></template></div>'),
12+
(d = !!t.firstElementChild.shadowRoot);
13+
}
14+
return d;
15+
}
16+
var d,
17+
m = i(() => {});
18+
var p,
19+
c,
20+
f,
21+
u = i(() => {
22+
(p = (t) => t.parentElement === null),
23+
(c = (t) => t.tagName === 'TEMPLATE'),
24+
(f = (t) => t.nodeType === Node.ELEMENT_NODE);
25+
});
26+
var h,
27+
E = i(() => {
28+
m();
29+
u();
30+
h = (t) => {
31+
var n;
32+
if (s()) return;
33+
let a = [],
34+
e = t.firstElementChild;
35+
for (; e !== t && e !== null; )
36+
if (c(e)) a.push(e), (e = e.content);
37+
else if (e.firstElementChild !== null) e = e.firstElementChild;
38+
else if (f(e) && e.nextElementSibling !== null) e = e.nextElementSibling;
39+
else {
40+
let o;
41+
for (; e !== t && e !== null; )
42+
if (p(e)) {
43+
o = a.pop();
44+
let r = o.parentElement,
45+
l = o.getAttribute('shadowroot');
46+
if (((e = o), l === 'open' || l === 'closed')) {
47+
let y = o.hasAttribute('shadowrootdelegatesfocus');
48+
try {
49+
r.attachShadow({ mode: l, delegatesFocus: y }).append(o.content);
50+
} catch {}
51+
} else o = void 0;
52+
} else {
53+
let r = e.nextElementSibling;
54+
if (r != null) {
55+
(e = r), o !== void 0 && o.parentElement.removeChild(o);
56+
break;
57+
}
58+
let l =
59+
(n = e.parentElement) === null || n === void 0 ? void 0 : n.nextElementSibling;
60+
if (l != null) {
61+
(e = l), o !== void 0 && o.parentElement.removeChild(o);
62+
break;
63+
}
64+
(e = e.parentElement), o !== void 0 && (o.parentElement.removeChild(o), (o = void 0));
65+
}
66+
}
67+
};
68+
});
69+
var w = i(() => {
70+
E();
71+
});
72+
var v = {};
73+
b(v, { hasNativeDeclarativeShadowRoots: () => s, hydrateShadowRoots: () => h });
74+
var S = i(() => {
75+
m();
76+
w();
77+
});
78+
async function g() {
79+
let { hydrateShadowRoots: t } = await Promise.resolve().then(() => (S(), v));
80+
window.addEventListener('DOMContentLoaded', () => t(document.body), { once: true });
81+
}
82+
var x = Document.parseHTMLUnsafe(
83+
'<p><template shadowrootmode="open"></template></p>'
84+
).querySelector('p');
85+
(!x || !x.shadowRoot) && g();

dist/client.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
declare const _default: (element: HTMLElement) => (Component: any, props: Record<string, any>, { default: defaultChildren, ...slotted }: {
2+
default: string;
3+
[slotName: string]: string;
4+
}) => Promise<void>;
5+
export default _default;

dist/client.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const addSlotAttrsToHtmlString = (slotName, html) => {
2+
const templ = document.createElement("template");
3+
templ.innerHTML = html;
4+
Array.from(templ.content.children).forEach((node) => {
5+
node.setAttribute("slot", slotName);
6+
});
7+
return templ.innerHTML;
8+
};
9+
var client_default = (element) => async (Component, props, { default: defaultChildren, ...slotted }) => {
10+
let component = element.children[0];
11+
const isClientOnly = element.getAttribute("client") === "only";
12+
if (isClientOnly) {
13+
component = new Component();
14+
const otherSlottedChildren = Object.entries(slotted).map(([slotName, htmlStr]) => addSlotAttrsToHtmlString(slotName, htmlStr)).join("");
15+
component.innerHTML = `${defaultChildren ?? ""}${otherSlottedChildren}`;
16+
element.appendChild(component);
17+
for (let [name, value] of Object.entries(props)) {
18+
if (!(name in Component.prototype)) {
19+
component.setAttribute(name, value);
20+
}
21+
}
22+
}
23+
if (!component || !(component.hasAttribute("defer-hydration") || isClientOnly)) {
24+
return;
25+
}
26+
for (let [name, value] of Object.entries(props)) {
27+
if (name in Component.prototype) {
28+
component[name] = value;
29+
}
30+
}
31+
component.removeAttribute("defer-hydration");
32+
};
33+
export {
34+
client_default as default
35+
};

dist/index.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import type { AstroIntegration, ContainerRenderer } from 'astro';
2+
export declare function getContainerRenderer(): ContainerRenderer;
3+
export default function (): AstroIntegration;

dist/index.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { readFileSync } from "node:fs";
2+
function getViteConfiguration() {
3+
return {
4+
optimizeDeps: {
5+
include: [
6+
"@astrojs/lit/dist/client.js",
7+
"@astrojs/lit/client-shim.js",
8+
"@astrojs/lit/hydration-support.js",
9+
"@webcomponents/template-shadowroot/template-shadowroot.js",
10+
"@lit-labs/ssr-client/lit-element-hydrate-support.js"
11+
],
12+
exclude: ["@astrojs/lit/server.js"]
13+
},
14+
ssr: {
15+
external: ["lit-element", "@lit-labs/ssr", "@astrojs/lit", "lit/decorators.js"]
16+
}
17+
};
18+
}
19+
function getContainerRenderer() {
20+
return {
21+
name: "@astrojs/lit",
22+
serverEntrypoint: "@astrojs/lit/server.js"
23+
};
24+
}
25+
function index_default() {
26+
return {
27+
name: "@astrojs/lit",
28+
hooks: {
29+
"astro:config:setup": ({ updateConfig, addRenderer, injectScript }) => {
30+
injectScript(
31+
"head-inline",
32+
readFileSync(new URL("../client-shim.min.js", import.meta.url), { encoding: "utf-8" })
33+
);
34+
injectScript("before-hydration", `import '@astrojs/lit/hydration-support.js';`);
35+
addRenderer({
36+
name: "@astrojs/lit",
37+
serverEntrypoint: "@astrojs/lit/server.js",
38+
clientEntrypoint: "@astrojs/lit/dist/client.js"
39+
});
40+
updateConfig({
41+
vite: getViteConfiguration()
42+
});
43+
},
44+
"astro:build:setup": ({ vite, target }) => {
45+
if (target === "server") {
46+
if (!vite.ssr) {
47+
vite.ssr = {};
48+
}
49+
if (!vite.ssr.noExternal) {
50+
vite.ssr.noExternal = [];
51+
}
52+
if (Array.isArray(vite.ssr.noExternal)) {
53+
vite.ssr.noExternal.push("lit");
54+
}
55+
}
56+
}
57+
}
58+
};
59+
}
60+
export {
61+
index_default as default,
62+
getContainerRenderer
63+
};

hydration-support.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// @ts-check
2+
import '@lit-labs/ssr-client/lit-element-hydrate-support.js';

0 commit comments

Comments
 (0)