astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
43 lines (42 loc) • 1.81 kB
JavaScript
import islandScript from "./astro-island.prebuilt.js";
import islandScriptDev from "./astro-island.prebuilt-dev.js";
import { ISLAND_STYLES } from "./astro-island-styles.js";
export function determineIfNeedsHydrationScript(result) {
// Scripts in <template> are inert, so don't consume dedup state there.
if (result._metadata.templateDepth > 0) {
return !result._metadata.hasHydrationScript;
}
if (result._metadata.hasHydrationScript) {
return false;
}
return result._metadata.hasHydrationScript = true;
}
export function determinesIfNeedsDirectiveScript(result, directive) {
// Scripts in <template> are inert, so don't consume dedup state there.
if (result._metadata.templateDepth > 0) {
return !result._metadata.hasDirectives.has(directive);
}
if (result._metadata.hasDirectives.has(directive)) {
return false;
}
result._metadata.hasDirectives.add(directive);
return true;
}
function getDirectiveScriptText(result, directive) {
const clientDirectives = result.clientDirectives;
const clientDirective = clientDirectives.get(directive);
if (!clientDirective) {
throw new Error(`Unknown directive: ${directive}`);
}
return clientDirective;
}
export function getPrescripts(result, type, directive) {
// Note that this is a classic script, not a module script.
// This is so that it executes immediately, and when the browser encounters
// an astro-island element, the callbacks will fire immediately, causing the JS
// deps to be loaded immediately.
switch (type) {
case "both": return `<style>${ISLAND_STYLES}</style><script>${getDirectiveScriptText(result, directive)}<\/script><script>${process.env.NODE_ENV === "development" ? islandScriptDev : islandScript}<\/script>`;
case "directive": return `<script>${getDirectiveScriptText(result, directive)}<\/script>`;
}
}