summaryrefslogtreecommitdiff
path: root/packages/astro/src/runtime/server/scripts.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/astro/src/runtime/server/scripts.ts')
-rw-r--r--packages/astro/src/runtime/server/scripts.ts36
1 files changed, 13 insertions, 23 deletions
diff --git a/packages/astro/src/runtime/server/scripts.ts b/packages/astro/src/runtime/server/scripts.ts
index 1d57c07e9..b466d1df3 100644
--- a/packages/astro/src/runtime/server/scripts.ts
+++ b/packages/astro/src/runtime/server/scripts.ts
@@ -1,12 +1,8 @@
import type { SSRResult } from '../../@types/astro';
-
-import idlePrebuilt from '../client/idle.prebuilt.js';
-import loadPrebuilt from '../client/load.prebuilt.js';
-import mediaPrebuilt from '../client/media.prebuilt.js';
-import onlyPrebuilt from '../client/only.prebuilt.js';
-import visiblePrebuilt from '../client/visible.prebuilt.js';
import islandScript from './astro-island.prebuilt.js';
+const ISLAND_STYLES = `<style>astro-island,astro-slot{display:contents}</style>`;
+
export function determineIfNeedsHydrationScript(result: SSRResult): boolean {
if (result._metadata.hasHydrationScript) {
return false;
@@ -14,14 +10,6 @@ export function determineIfNeedsHydrationScript(result: SSRResult): boolean {
return (result._metadata.hasHydrationScript = true);
}
-export const hydrationScripts: Record<string, string> = {
- idle: idlePrebuilt,
- load: loadPrebuilt,
- only: onlyPrebuilt,
- media: mediaPrebuilt,
- visible: visiblePrebuilt,
-};
-
export function determinesIfNeedsDirectiveScript(result: SSRResult, directive: string): boolean {
if (result._metadata.hasDirectives.has(directive)) {
return false;
@@ -32,26 +20,28 @@ export function determinesIfNeedsDirectiveScript(result: SSRResult, directive: s
export type PrescriptType = null | 'both' | 'directive';
-function getDirectiveScriptText(directive: string): string {
- if (!(directive in hydrationScripts)) {
+function getDirectiveScriptText(result: SSRResult, directive: string): string {
+ const clientDirectives = result._metadata.clientDirectives;
+ const clientDirective = clientDirectives.get(directive);
+ if (!clientDirective) {
throw new Error(`Unknown directive: ${directive}`);
}
- const directiveScriptText = hydrationScripts[directive];
- return directiveScriptText;
+ return clientDirective;
}
-export function getPrescripts(type: PrescriptType, directive: string): string {
+export function getPrescripts(result: SSRResult, type: PrescriptType, directive: string): string {
// Note that this is a classic script, not a module script.
// This is so that it executes immediate, 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>astro-island,astro-slot{display:contents}</style><script>${
- getDirectiveScriptText(directive) + islandScript
- }</script>`;
+ return `${ISLAND_STYLES}<script>${getDirectiveScriptText(
+ result,
+ directive
+ )};${islandScript}</script>`;
case 'directive':
- return `<script>${getDirectiveScriptText(directive)}</script>`;
+ return `<script>${getDirectiveScriptText(result, directive)}</script>`;
}
return '';
}