UNPKG

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
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>`; } }