Initial commit

This commit is contained in:
Alejandro Martinez
2026-02-12 02:04:10 +01:00
commit f09af719cf
13433 changed files with 2193445 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
import type { PropagationHint } from '../../types/public/internal.js';
import type { AstroComponentFactory } from './render/index.js';
interface CreateComponentOptions {
factory: AstroComponentFactory;
moduleId?: string;
propagation?: PropagationHint;
}
export declare function createComponent(arg1: AstroComponentFactory | CreateComponentOptions, moduleId?: string, propagation?: PropagationHint): AstroComponentFactory;
export {};

View File

@@ -0,0 +1,37 @@
import { AstroError, AstroErrorData } from "../../core/errors/index.js";
function validateArgs(args) {
if (args.length !== 3) return false;
if (!args[0] || typeof args[0] !== "object") return false;
return true;
}
function baseCreateComponent(cb, moduleId, propagation) {
const name = moduleId?.split("/").pop()?.replace(".astro", "") ?? "";
const fn = (...args) => {
if (!validateArgs(args)) {
throw new AstroError({
...AstroErrorData.InvalidComponentArgs,
message: AstroErrorData.InvalidComponentArgs.message(name)
});
}
return cb(...args);
};
Object.defineProperty(fn, "name", { value: name, writable: false });
fn.isAstroComponentFactory = true;
fn.moduleId = moduleId;
fn.propagation = propagation;
return fn;
}
function createComponentWithOptions(opts) {
const cb = baseCreateComponent(opts.factory, opts.moduleId, opts.propagation);
return cb;
}
function createComponent(arg1, moduleId, propagation) {
if (typeof arg1 === "function") {
return baseCreateComponent(arg1, moduleId, propagation);
} else {
return createComponentWithOptions(arg1);
}
}
export {
createComponent
};

View File

@@ -0,0 +1,2 @@
import type { AstroGlobalPartial } from '../../types/public/context.js';
export declare function createAstro(site: string | undefined): AstroGlobalPartial;

33
node_modules/astro/dist/runtime/server/astro-global.js generated vendored Normal file
View File

@@ -0,0 +1,33 @@
import { ASTRO_VERSION } from "../../core/constants.js";
import { AstroError, AstroErrorData } from "../../core/errors/index.js";
function createAstroGlobFn() {
const globHandler = (importMetaGlobResult) => {
console.warn(`Astro.glob is deprecated and will be removed in a future major version of Astro.
Use import.meta.glob instead: https://vitejs.dev/guide/features.html#glob-import`);
if (typeof importMetaGlobResult === "string") {
throw new AstroError({
...AstroErrorData.AstroGlobUsedOutside,
message: AstroErrorData.AstroGlobUsedOutside.message(JSON.stringify(importMetaGlobResult))
});
}
let allEntries = [...Object.values(importMetaGlobResult)];
if (allEntries.length === 0) {
throw new AstroError({
...AstroErrorData.AstroGlobNoMatch,
message: AstroErrorData.AstroGlobNoMatch.message(JSON.stringify(importMetaGlobResult))
});
}
return Promise.all(allEntries.map((fn) => fn()));
};
return globHandler;
}
function createAstro(site) {
return {
site: site ? new URL(site) : void 0,
generator: `Astro v${ASTRO_VERSION}`,
glob: createAstroGlobFn()
};
}
export {
createAstro
};

View File

@@ -0,0 +1 @@
export declare const ISLAND_STYLES = "astro-island,astro-slot,astro-static-slot{display:contents}";

View File

@@ -0,0 +1,4 @@
const ISLAND_STYLES = "astro-island,astro-slot,astro-static-slot{display:contents}";
export {
ISLAND_STYLES
};

View File

@@ -0,0 +1 @@
export {};

156
node_modules/astro/dist/runtime/server/astro-island.js generated vendored Normal file
View File

@@ -0,0 +1,156 @@
{
const propTypes = {
0: (value) => reviveObject(value),
1: (value) => reviveArray(value),
2: (value) => new RegExp(value),
3: (value) => new Date(value),
4: (value) => new Map(reviveArray(value)),
5: (value) => new Set(reviveArray(value)),
6: (value) => BigInt(value),
7: (value) => new URL(value),
8: (value) => new Uint8Array(value),
9: (value) => new Uint16Array(value),
10: (value) => new Uint32Array(value),
11: (value) => Infinity * value
};
const reviveTuple = (raw) => {
const [type, value] = raw;
return type in propTypes ? propTypes[type](value) : void 0;
};
const reviveArray = (raw) => raw.map(reviveTuple);
const reviveObject = (raw) => {
if (typeof raw !== "object" || raw === null) return raw;
return Object.fromEntries(Object.entries(raw).map(([key, value]) => [key, reviveTuple(value)]));
};
class AstroIsland extends HTMLElement {
Component;
hydrator;
static observedAttributes = ["props"];
disconnectedCallback() {
document.removeEventListener("astro:after-swap", this.unmount);
document.addEventListener("astro:after-swap", this.unmount, { once: true });
}
connectedCallback() {
if (!this.hasAttribute("await-children") || document.readyState === "interactive" || document.readyState === "complete") {
this.childrenConnectedCallback();
} else {
const onConnected = () => {
document.removeEventListener("DOMContentLoaded", onConnected);
mo.disconnect();
this.childrenConnectedCallback();
};
const mo = new MutationObserver(() => {
if (this.lastChild?.nodeType === Node.COMMENT_NODE && this.lastChild.nodeValue === "astro:end") {
this.lastChild.remove();
onConnected();
}
});
mo.observe(this, { childList: true });
document.addEventListener("DOMContentLoaded", onConnected);
}
}
async childrenConnectedCallback() {
let beforeHydrationUrl = this.getAttribute("before-hydration-url");
if (beforeHydrationUrl) {
await import(beforeHydrationUrl);
}
this.start();
}
async start() {
const opts = JSON.parse(this.getAttribute("opts"));
const directive = this.getAttribute("client");
if (Astro[directive] === void 0) {
window.addEventListener(`astro:${directive}`, () => this.start(), { once: true });
return;
}
try {
await Astro[directive](
async () => {
const rendererUrl = this.getAttribute("renderer-url");
const [componentModule, { default: hydrator }] = await Promise.all([
import(this.getAttribute("component-url")),
rendererUrl ? import(rendererUrl) : () => () => {
}
]);
const componentExport = this.getAttribute("component-export") || "default";
if (!componentExport.includes(".")) {
this.Component = componentModule[componentExport];
} else {
this.Component = componentModule;
for (const part of componentExport.split(".")) {
this.Component = this.Component[part];
}
}
this.hydrator = hydrator;
return this.hydrate;
},
opts,
this
);
} catch (e) {
console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`, e);
}
}
hydrate = async () => {
if (!this.hydrator) return;
if (!this.isConnected) return;
const parentSsrIsland = this.parentElement?.closest("astro-island[ssr]");
if (parentSsrIsland) {
parentSsrIsland.addEventListener("astro:hydrate", this.hydrate, { once: true });
return;
}
const slotted = this.querySelectorAll("astro-slot");
const slots = {};
const templates = this.querySelectorAll("template[data-astro-template]");
for (const template of templates) {
const closest = template.closest(this.tagName);
if (!closest?.isSameNode(this)) continue;
slots[template.getAttribute("data-astro-template") || "default"] = template.innerHTML;
template.remove();
}
for (const slot of slotted) {
const closest = slot.closest(this.tagName);
if (!closest?.isSameNode(this)) continue;
slots[slot.getAttribute("name") || "default"] = slot.innerHTML;
}
let props;
try {
props = this.hasAttribute("props") ? reviveObject(JSON.parse(this.getAttribute("props"))) : {};
} catch (e) {
let componentName = this.getAttribute("component-url") || "<unknown>";
const componentExport = this.getAttribute("component-export");
if (componentExport) {
componentName += ` (export ${componentExport})`;
}
console.error(
`[hydrate] Error parsing props for component ${componentName}`,
this.getAttribute("props"),
e
);
throw e;
}
let hydrationTimeStart;
const hydrator = this.hydrator(this);
if (process.env.NODE_ENV === "development") hydrationTimeStart = performance.now();
await hydrator(this.Component, props, slots, {
client: this.getAttribute("client")
});
if (process.env.NODE_ENV === "development" && hydrationTimeStart)
this.setAttribute(
"client-render-time",
(performance.now() - hydrationTimeStart).toString()
);
this.removeAttribute("ssr");
this.dispatchEvent(new CustomEvent("astro:hydrate"));
};
attributeChangedCallback() {
this.hydrate();
}
unmount = () => {
if (!this.isConnected) this.dispatchEvent(new CustomEvent("astro:unmount"));
};
}
if (!customElements.get("astro-island")) {
customElements.define("astro-island", AstroIsland);
}
}

View File

@@ -0,0 +1,7 @@
/**
* This file is prebuilt from packages/astro/src/runtime/server/astro-island.ts
* Do not edit this directly, but instead edit that file and rerun the prebuild
* to generate this file.
*/
declare const _default: "(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var l=(i,o,a)=>g(i,typeof o!=\"symbol\"?o+\"\":o,a);{let i={0:t=>y(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[h,e]=t;return h in i?i[h](e):void 0},a=t=>t.map(o),y=t=>typeof t!=\"object\"||t===null?t:Object.fromEntries(Object.entries(t).map(([h,e])=>[h,o(e)]));class f extends HTMLElement{constructor(){super(...arguments);l(this,\"Component\");l(this,\"hydrator\");l(this,\"hydrate\",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest(\"astro-island[ssr]\");if(e){e.addEventListener(\"astro:hydrate\",this.hydrate,{once:!0});return}let c=this.querySelectorAll(\"astro-slot\"),n={},p=this.querySelectorAll(\"template[data-astro-template]\");for(let r of p){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute(\"data-astro-template\")||\"default\"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute(\"name\")||\"default\"]=r.innerHTML)}let u;try{u=this.hasAttribute(\"props\")?y(JSON.parse(this.getAttribute(\"props\"))):{}}catch(r){let s=this.getAttribute(\"component-url\")||\"<unknown>\",v=this.getAttribute(\"component-export\");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute(\"props\"),r),r}let d,m=this.hydrator(this);d=performance.now(),await m(this.Component,u,n,{client:this.getAttribute(\"client\")}),d&&this.setAttribute(\"client-render-time\",(performance.now()-d).toString()),this.removeAttribute(\"ssr\"),this.dispatchEvent(new CustomEvent(\"astro:hydrate\"))});l(this,\"unmount\",()=>{this.isConnected||this.dispatchEvent(new CustomEvent(\"astro:unmount\"))})}disconnectedCallback(){document.removeEventListener(\"astro:after-swap\",this.unmount),document.addEventListener(\"astro:after-swap\",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute(\"await-children\")||document.readyState===\"interactive\"||document.readyState===\"complete\")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener(\"DOMContentLoaded\",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue===\"astro:end\"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener(\"DOMContentLoaded\",e)}}async childrenConnectedCallback(){let e=this.getAttribute(\"before-hydration-url\");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute(\"opts\")),c=this.getAttribute(\"client\");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute(\"renderer-url\"),[p,{default:u}]=await Promise.all([import(this.getAttribute(\"component-url\")),n?import(n):()=>()=>{}]),d=this.getAttribute(\"component-export\")||\"default\";if(!d.includes(\".\"))this.Component=p[d];else{this.Component=p;for(let m of d.split(\".\"))this.Component=this.Component[m]}return this.hydrator=u,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute(\"component-url\")}`,n)}}attributeChangedCallback(){this.hydrate()}}l(f,\"observedAttributes\",[\"props\"]),customElements.get(\"astro-island\")||customElements.define(\"astro-island\",f)}})();";
export default _default;

View File

@@ -0,0 +1,4 @@
var astro_island_prebuilt_dev_default = `(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var l=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>y(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[h,e]=t;return h in i?i[h](e):void 0},a=t=>t.map(o),y=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([h,e])=>[h,o(e)]));class f extends HTMLElement{constructor(){super(...arguments);l(this,"Component");l(this,"hydrator");l(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},p=this.querySelectorAll("template[data-astro-template]");for(let r of p){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let u;try{u=this.hasAttribute("props")?y(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=\` (export \${v})\`),console.error(\`[hydrate] Error parsing props for component \${s}\`,this.getAttribute("props"),r),r}let d,m=this.hydrator(this);d=performance.now(),await m(this.Component,u,n,{client:this.getAttribute("client")}),d&&this.setAttribute("client-render-time",(performance.now()-d).toString()),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});l(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(\`astro:\${c}\`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[p,{default:u}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),d=this.getAttribute("component-export")||"default";if(!d.includes("."))this.Component=p[d];else{this.Component=p;for(let m of d.split("."))this.Component=this.Component[m]}return this.hydrator=u,this.hydrate},e,this)}catch(n){console.error(\`[astro-island] Error hydrating \${this.getAttribute("component-url")}\`,n)}}attributeChangedCallback(){this.hydrate()}}l(f,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",f)}})();`;
export {
astro_island_prebuilt_dev_default as default
};

View File

@@ -0,0 +1,7 @@
/**
* This file is prebuilt from packages/astro/src/runtime/server/astro-island.ts
* Do not edit this directly, but instead edit that file and rerun the prebuild
* to generate this file.
*/
declare const _default: "(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!=\"symbol\"?o+\"\":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!=\"object\"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,\"Component\");d(this,\"hydrator\");d(this,\"hydrate\",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest(\"astro-island[ssr]\");if(e){e.addEventListener(\"astro:hydrate\",this.hydrate,{once:!0});return}let c=this.querySelectorAll(\"astro-slot\"),n={},h=this.querySelectorAll(\"template[data-astro-template]\");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute(\"data-astro-template\")||\"default\"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute(\"name\")||\"default\"]=r.innerHTML)}let p;try{p=this.hasAttribute(\"props\")?m(JSON.parse(this.getAttribute(\"props\"))):{}}catch(r){let s=this.getAttribute(\"component-url\")||\"<unknown>\",v=this.getAttribute(\"component-export\");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute(\"props\"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute(\"client\")}),this.removeAttribute(\"ssr\"),this.dispatchEvent(new CustomEvent(\"astro:hydrate\"))});d(this,\"unmount\",()=>{this.isConnected||this.dispatchEvent(new CustomEvent(\"astro:unmount\"))})}disconnectedCallback(){document.removeEventListener(\"astro:after-swap\",this.unmount),document.addEventListener(\"astro:after-swap\",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute(\"await-children\")||document.readyState===\"interactive\"||document.readyState===\"complete\")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener(\"DOMContentLoaded\",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue===\"astro:end\"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener(\"DOMContentLoaded\",e)}}async childrenConnectedCallback(){let e=this.getAttribute(\"before-hydration-url\");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute(\"opts\")),c=this.getAttribute(\"client\");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute(\"renderer-url\"),[h,{default:p}]=await Promise.all([import(this.getAttribute(\"component-url\")),n?import(n):()=>()=>{}]),u=this.getAttribute(\"component-export\")||\"default\";if(!u.includes(\".\"))this.Component=h[u];else{this.Component=h;for(let f of u.split(\".\"))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute(\"component-url\")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,\"observedAttributes\",[\"props\"]),customElements.get(\"astro-island\")||customElements.define(\"astro-island\",y)}})();";
export default _default;

View File

@@ -0,0 +1,4 @@
var astro_island_prebuilt_default = `(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=\` (export \${v})\`),console.error(\`[hydrate] Error parsing props for component \${s}\`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(\`astro:\${c}\`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(\`[astro-island] Error hydrating \${this.getAttribute("component-url")}\`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();`;
export {
astro_island_prebuilt_default as default
};

7
node_modules/astro/dist/runtime/server/endpoint.d.ts generated vendored Normal file
View File

@@ -0,0 +1,7 @@
import type { Logger } from '../../core/logger/core.js';
import type { APIRoute } from '../../types/public/common.js';
import type { APIContext } from '../../types/public/context.js';
/** Renders an endpoint request to completion, returning the body. */
export declare function renderEndpoint(mod: {
[method: string]: APIRoute;
}, context: APIContext, isPrerendered: boolean, logger: Logger): Promise<Response>;

60
node_modules/astro/dist/runtime/server/endpoint.js generated vendored Normal file
View File

@@ -0,0 +1,60 @@
import colors from "piccolore";
import { REROUTABLE_STATUS_CODES, REROUTE_DIRECTIVE_HEADER } from "../../core/constants.js";
import { AstroError } from "../../core/errors/errors.js";
import { EndpointDidNotReturnAResponse } from "../../core/errors/errors-data.js";
async function renderEndpoint(mod, context, isPrerendered, logger) {
const { request, url } = context;
const method = request.method.toUpperCase();
let handler = mod[method] ?? mod["ALL"];
if (!handler && method === "HEAD" && mod["GET"]) {
handler = mod["GET"];
}
if (isPrerendered && !["GET", "HEAD"].includes(method)) {
logger.warn(
"router",
`${url.pathname} ${colors.bold(
method
)} requests are not available in static endpoints. Mark this page as server-rendered (\`export const prerender = false;\`) or update your config to \`output: 'server'\` to make all your pages server-rendered by default.`
);
}
if (handler === void 0) {
logger.warn(
"router",
`No API Route handler exists for the method "${method}" for the route "${url.pathname}".
Found handlers: ${Object.keys(mod).map((exp) => JSON.stringify(exp)).join(", ")}
` + ("all" in mod ? `One of the exported handlers is "all" (lowercase), did you mean to export 'ALL'?
` : "")
);
return new Response(null, { status: 404 });
}
if (typeof handler !== "function") {
logger.error(
"router",
`The route "${url.pathname}" exports a value for the method "${method}", but it is of the type ${typeof handler} instead of a function.`
);
return new Response(null, { status: 500 });
}
let response = await handler.call(mod, context);
if (!response || response instanceof Response === false) {
throw new AstroError(EndpointDidNotReturnAResponse);
}
if (REROUTABLE_STATUS_CODES.includes(response.status)) {
try {
response.headers.set(REROUTE_DIRECTIVE_HEADER, "no");
} catch (err) {
if (err.message?.includes("immutable")) {
response = new Response(response.body, response);
response.headers.set(REROUTE_DIRECTIVE_HEADER, "no");
} else {
throw err;
}
}
}
if (method === "HEAD") {
return new Response(null, response);
}
return response;
}
export {
renderEndpoint
};

21
node_modules/astro/dist/runtime/server/escape.d.ts generated vendored Normal file
View File

@@ -0,0 +1,21 @@
export declare const escapeHTML: (str: string) => string;
export declare class HTMLBytes extends Uint8Array {
}
/**
* A "blessed" extension of String that tells Astro that the string
* has already been escaped. This helps prevent double-escaping of HTML.
*/
export declare class HTMLString extends String {
get [Symbol.toStringTag](): string;
}
type BlessedType = string | HTMLBytes;
/**
* markHTMLString marks a string as raw or "already escaped" by returning
* a `HTMLString` instance. This is meant for internal use, and should not
* be returned through any public JS API.
*/
export declare const markHTMLString: (value: any) => any;
export declare function isHTMLString(value: any): value is HTMLString;
export declare function isHTMLBytes(value: any): value is HTMLBytes;
export declare function unescapeHTML(str: any): BlessedType | Promise<BlessedType | AsyncGenerator<BlessedType, void, unknown>> | AsyncGenerator<BlessedType, void, unknown>;
export {};

82
node_modules/astro/dist/runtime/server/escape.js generated vendored Normal file
View File

@@ -0,0 +1,82 @@
import { escape } from "html-escaper";
import { streamAsyncIterator } from "./util.js";
const escapeHTML = escape;
class HTMLBytes extends Uint8Array {
}
Object.defineProperty(HTMLBytes.prototype, Symbol.toStringTag, {
get() {
return "HTMLBytes";
}
});
class HTMLString extends String {
get [Symbol.toStringTag]() {
return "HTMLString";
}
}
const markHTMLString = (value) => {
if (value instanceof HTMLString) {
return value;
}
if (typeof value === "string") {
return new HTMLString(value);
}
return value;
};
function isHTMLString(value) {
return Object.prototype.toString.call(value) === "[object HTMLString]";
}
function markHTMLBytes(bytes) {
return new HTMLBytes(bytes);
}
function isHTMLBytes(value) {
return Object.prototype.toString.call(value) === "[object HTMLBytes]";
}
function hasGetReader(obj) {
return typeof obj.getReader === "function";
}
async function* unescapeChunksAsync(iterable) {
if (hasGetReader(iterable)) {
for await (const chunk of streamAsyncIterator(iterable)) {
yield unescapeHTML(chunk);
}
} else {
for await (const chunk of iterable) {
yield unescapeHTML(chunk);
}
}
}
function* unescapeChunks(iterable) {
for (const chunk of iterable) {
yield unescapeHTML(chunk);
}
}
function unescapeHTML(str) {
if (!!str && typeof str === "object") {
if (str instanceof Uint8Array) {
return markHTMLBytes(str);
} else if (str instanceof Response && str.body) {
const body = str.body;
return unescapeChunksAsync(body);
} else if (typeof str.then === "function") {
return Promise.resolve(str).then((value) => {
return unescapeHTML(value);
});
} else if (str[Symbol.for("astro:slot-string")]) {
return str;
} else if (Symbol.iterator in str) {
return unescapeChunks(str);
} else if (Symbol.asyncIterator in str || hasGetReader(str)) {
return unescapeChunksAsync(str);
}
}
return markHTMLString(str);
}
export {
HTMLBytes,
HTMLString,
escapeHTML,
isHTMLBytes,
isHTMLString,
markHTMLString,
unescapeHTML
};

27
node_modules/astro/dist/runtime/server/hydration.d.ts generated vendored Normal file
View File

@@ -0,0 +1,27 @@
import type { AstroComponentMetadata, SSRElement, SSRLoadedRenderer, SSRResult } from '../../types/public/internal.js';
export interface HydrationMetadata {
directive: string;
value: string;
componentUrl: string;
componentExport: {
value: string;
};
}
type Props = Record<string | number | symbol, any>;
interface ExtractedProps {
isPage: boolean;
hydration: HydrationMetadata | null;
props: Props;
propsWithoutTransitionAttributes: Props;
}
export declare function extractDirectives(inputProps: Props, clientDirectives: SSRResult['clientDirectives']): ExtractedProps;
interface HydrateScriptOptions {
renderer: SSRLoadedRenderer;
result: SSRResult;
astroId: string;
props: Record<string | number, any>;
attrs: Record<string, string> | undefined;
}
/** For hydrated components, generate a <script type="module"> to load the component */
export declare function generateHydrateScript(scriptOptions: HydrateScriptOptions, metadata: Required<AstroComponentMetadata>): Promise<SSRElement>;
export {};

127
node_modules/astro/dist/runtime/server/hydration.js generated vendored Normal file
View File

@@ -0,0 +1,127 @@
import { AstroError, AstroErrorData } from "../../core/errors/index.js";
import { escapeHTML } from "./escape.js";
import { serializeProps } from "./serialize.js";
const transitionDirectivesToCopyOnIsland = Object.freeze([
"data-astro-transition-scope",
"data-astro-transition-persist",
"data-astro-transition-persist-props"
]);
function extractDirectives(inputProps, clientDirectives) {
let extracted = {
isPage: false,
hydration: null,
props: {},
propsWithoutTransitionAttributes: {}
};
for (const [key, value] of Object.entries(inputProps)) {
if (key.startsWith("server:")) {
if (key === "server:root") {
extracted.isPage = true;
}
}
if (key.startsWith("client:")) {
if (!extracted.hydration) {
extracted.hydration = {
directive: "",
value: "",
componentUrl: "",
componentExport: { value: "" }
};
}
switch (key) {
case "client:component-path": {
extracted.hydration.componentUrl = value;
break;
}
case "client:component-export": {
extracted.hydration.componentExport.value = value;
break;
}
// This is a special prop added to prove that the client hydration method
// was added statically.
case "client:component-hydration": {
break;
}
case "client:display-name": {
break;
}
default: {
extracted.hydration.directive = key.split(":")[1];
extracted.hydration.value = value;
if (!clientDirectives.has(extracted.hydration.directive)) {
const hydrationMethods = Array.from(clientDirectives.keys()).map((d) => `client:${d}`).join(", ");
throw new Error(
`Error: invalid hydration directive "${key}". Supported hydration methods: ${hydrationMethods}`
);
}
if (extracted.hydration.directive === "media" && typeof extracted.hydration.value !== "string") {
throw new AstroError(AstroErrorData.MissingMediaQueryDirective);
}
break;
}
}
} else {
extracted.props[key] = value;
if (!transitionDirectivesToCopyOnIsland.includes(key)) {
extracted.propsWithoutTransitionAttributes[key] = value;
}
}
}
for (const sym of Object.getOwnPropertySymbols(inputProps)) {
extracted.props[sym] = inputProps[sym];
extracted.propsWithoutTransitionAttributes[sym] = inputProps[sym];
}
return extracted;
}
async function generateHydrateScript(scriptOptions, metadata) {
const { renderer, result, astroId, props, attrs } = scriptOptions;
const { hydrate, componentUrl, componentExport } = metadata;
if (!componentExport.value) {
throw new AstroError({
...AstroErrorData.NoMatchingImport,
message: AstroErrorData.NoMatchingImport.message(metadata.displayName)
});
}
const island = {
children: "",
props: {
// This is for HMR, probably can avoid it in prod
uid: astroId
}
};
if (attrs) {
for (const [key, value] of Object.entries(attrs)) {
island.props[key] = escapeHTML(value);
}
}
island.props["component-url"] = await result.resolve(decodeURI(componentUrl));
if (renderer.clientEntrypoint) {
island.props["component-export"] = componentExport.value;
island.props["renderer-url"] = await result.resolve(
decodeURI(renderer.clientEntrypoint.toString())
);
island.props["props"] = escapeHTML(serializeProps(props, metadata));
}
island.props["ssr"] = "";
island.props["client"] = hydrate;
let beforeHydrationUrl = await result.resolve("astro:scripts/before-hydration.js");
if (beforeHydrationUrl.length) {
island.props["before-hydration-url"] = beforeHydrationUrl;
}
island.props["opts"] = escapeHTML(
JSON.stringify({
name: metadata.displayName,
value: metadata.hydrateArgs || ""
})
);
transitionDirectivesToCopyOnIsland.forEach((name) => {
if (typeof props[name] !== "undefined") {
island.props[name] = props[name];
}
});
return island;
}
export {
extractDirectives,
generateHydrateScript
};

14
node_modules/astro/dist/runtime/server/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,14 @@
export { createComponent } from './astro-component.js';
export { createAstro } from './astro-global.js';
export { renderEndpoint } from './endpoint.js';
export { escapeHTML, HTMLBytes, HTMLString, isHTMLString, markHTMLString, unescapeHTML, } from './escape.js';
export { renderJSX } from './jsx.js';
export type { AstroComponentFactory, AstroComponentInstance, ComponentSlots, RenderInstruction, } from './render/index.js';
export { addAttribute, createHeadAndContent, defineScriptVars, Fragment, maybeRenderHead, Renderer as Renderer, renderComponent, renderHead, renderHTMLElement, renderPage, renderScript, renderScriptElement, renderSlot, renderSlotToString, renderTemplate as render, renderTemplate, renderToString, renderUniqueStylesheet, voidElementNames, } from './render/index.js';
export type { ServerIslandComponent } from './render/server-islands.js';
export { createTransitionScope, renderTransition } from './transition.js';
export declare function mergeSlots(...slotted: unknown[]): Record<string, () => any>;
export declare function spreadAttributes(values?: Record<any, any>, _name?: string, { class: scopedClassName }?: {
class?: string;
}): any;
export declare function defineStyleVars(defs: Record<any, any> | Record<any, any>[]): any;

122
node_modules/astro/dist/runtime/server/index.js generated vendored Normal file
View File

@@ -0,0 +1,122 @@
import { createComponent } from "./astro-component.js";
import { createAstro } from "./astro-global.js";
import { renderEndpoint } from "./endpoint.js";
import {
escapeHTML,
HTMLBytes,
HTMLString,
isHTMLString,
markHTMLString,
unescapeHTML
} from "./escape.js";
import { renderJSX } from "./jsx.js";
import {
addAttribute,
createHeadAndContent,
defineScriptVars,
Fragment,
maybeRenderHead,
Renderer,
renderComponent,
renderHead,
renderHTMLElement,
renderPage,
renderScript,
renderScriptElement,
renderSlot,
renderSlotToString,
renderTemplate,
renderTemplate as renderTemplate2,
renderToString,
renderUniqueStylesheet,
voidElementNames
} from "./render/index.js";
import { createTransitionScope, renderTransition } from "./transition.js";
import { markHTMLString as markHTMLString2 } from "./escape.js";
import { addAttribute as addAttribute2, Renderer as Renderer2 } from "./render/index.js";
function mergeSlots(...slotted) {
const slots = {};
for (const slot of slotted) {
if (!slot) continue;
if (typeof slot === "object") {
Object.assign(slots, slot);
} else if (typeof slot === "function") {
Object.assign(slots, mergeSlots(slot()));
}
}
return slots;
}
function __astro_tag_component__(Component, rendererName) {
if (!Component) return;
if (typeof Component !== "function") return;
Object.defineProperty(Component, Renderer2, {
value: rendererName,
enumerable: false,
writable: false
});
}
function spreadAttributes(values = {}, _name, { class: scopedClassName } = {}) {
let output = "";
if (scopedClassName) {
if (typeof values.class !== "undefined") {
values.class += ` ${scopedClassName}`;
} else if (typeof values["class:list"] !== "undefined") {
values["class:list"] = [values["class:list"], scopedClassName];
} else {
values.class = scopedClassName;
}
}
for (const [key, value] of Object.entries(values)) {
output += addAttribute2(value, key, true, _name);
}
return markHTMLString2(output);
}
function defineStyleVars(defs) {
let output = "";
let arr = !Array.isArray(defs) ? [defs] : defs;
for (const vars of arr) {
for (const [key, value] of Object.entries(vars)) {
if (value || value === 0) {
output += `--${key}: ${value};`;
}
}
}
return markHTMLString2(output);
}
export {
Fragment,
HTMLBytes,
HTMLString,
Renderer,
__astro_tag_component__,
addAttribute,
createAstro,
createComponent,
createHeadAndContent,
createTransitionScope,
defineScriptVars,
defineStyleVars,
escapeHTML,
isHTMLString,
markHTMLString,
maybeRenderHead,
mergeSlots,
renderTemplate as render,
renderComponent,
renderEndpoint,
renderHTMLElement,
renderHead,
renderJSX,
renderPage,
renderScript,
renderScriptElement,
renderSlot,
renderSlotToString,
renderTemplate2 as renderTemplate,
renderToString,
renderTransition,
renderUniqueStylesheet,
spreadAttributes,
unescapeHTML,
voidElementNames
};

2
node_modules/astro/dist/runtime/server/jsx.d.ts generated vendored Normal file
View File

@@ -0,0 +1,2 @@
import type { SSRResult } from '../../types/public/internal.js';
export declare function renderJSX(result: SSRResult, vnode: any): Promise<any>;

176
node_modules/astro/dist/runtime/server/jsx.js generated vendored Normal file
View File

@@ -0,0 +1,176 @@
import { AstroJSX, isVNode } from "../../jsx-runtime/index.js";
import {
escapeHTML,
HTMLString,
markHTMLString,
spreadAttributes,
voidElementNames
} from "./index.js";
import { isAstroComponentFactory } from "./render/astro/factory.js";
import { renderComponentToString } from "./render/component.js";
import { mergeSlotInstructions, SlotString } from "./render/slot.js";
const ClientOnlyPlaceholder = "astro-client-only";
const hasTriedRenderComponentSymbol = Symbol("hasTriedRenderComponent");
async function renderJSX(result, vnode) {
switch (true) {
case vnode instanceof HTMLString:
if (vnode.toString().trim() === "") {
return "";
}
return vnode;
case typeof vnode === "string":
return markHTMLString(escapeHTML(vnode));
case typeof vnode === "function":
return vnode;
case (!vnode && vnode !== 0):
return "";
case Array.isArray(vnode): {
const renderedItems = await Promise.all(vnode.map((v) => renderJSX(result, v)));
let instructions = null;
let content = "";
for (const item of renderedItems) {
if (item instanceof SlotString) {
content += item;
instructions = mergeSlotInstructions(instructions, item);
} else {
content += item;
}
}
if (instructions) {
return markHTMLString(new SlotString(content, instructions));
}
return markHTMLString(content);
}
}
return renderJSXVNode(result, vnode);
}
async function renderJSXVNode(result, vnode) {
if (isVNode(vnode)) {
switch (true) {
case !vnode.type: {
throw new Error(`Unable to render ${result.pathname} because it contains an undefined Component!
Did you forget to import the component or is it possible there is a typo?`);
}
case vnode.type === Symbol.for("astro:fragment"):
return renderJSX(result, vnode.props.children);
case isAstroComponentFactory(vnode.type): {
let props = {};
let slots = {};
for (const [key, value] of Object.entries(vnode.props ?? {})) {
if (key === "children" || value && typeof value === "object" && value["$$slot"]) {
slots[key === "children" ? "default" : key] = () => renderJSX(result, value);
} else {
props[key] = value;
}
}
const str = await renderComponentToString(
result,
vnode.type.name,
vnode.type,
props,
slots
);
const html = markHTMLString(str);
return html;
}
case (!vnode.type && vnode.type !== 0):
return "";
case (typeof vnode.type === "string" && vnode.type !== ClientOnlyPlaceholder):
return markHTMLString(await renderElement(result, vnode.type, vnode.props ?? {}));
}
if (vnode.type) {
let extractSlots2 = function(child) {
if (Array.isArray(child)) {
return child.map((c) => extractSlots2(c));
}
if (!isVNode(child)) {
_slots.default.push(child);
return;
}
if ("slot" in child.props) {
_slots[child.props.slot] = [..._slots[child.props.slot] ?? [], child];
delete child.props.slot;
return;
}
_slots.default.push(child);
};
var extractSlots = extractSlots2;
if (typeof vnode.type === "function" && vnode.props["server:root"]) {
const output2 = await vnode.type(vnode.props ?? {});
return await renderJSX(result, output2);
}
if (typeof vnode.type === "function") {
if (vnode.props[hasTriedRenderComponentSymbol]) {
delete vnode.props[hasTriedRenderComponentSymbol];
const output2 = await vnode.type(vnode.props ?? {});
if (output2?.[AstroJSX] || !output2) {
return await renderJSXVNode(result, output2);
} else {
return;
}
} else {
vnode.props[hasTriedRenderComponentSymbol] = true;
}
}
const { children = null, ...props } = vnode.props ?? {};
const _slots = {
default: []
};
extractSlots2(children);
for (const [key, value] of Object.entries(props)) {
if (value?.["$$slot"]) {
_slots[key] = value;
delete props[key];
}
}
const slotPromises = [];
const slots = {};
for (const [key, value] of Object.entries(_slots)) {
slotPromises.push(
renderJSX(result, value).then((output2) => {
if (output2.toString().trim().length === 0) return;
slots[key] = () => output2;
})
);
}
await Promise.all(slotPromises);
let output;
if (vnode.type === ClientOnlyPlaceholder && vnode.props["client:only"]) {
output = await renderComponentToString(
result,
vnode.props["client:display-name"] ?? "",
null,
props,
slots
);
} else {
output = await renderComponentToString(
result,
typeof vnode.type === "function" ? vnode.type.name : vnode.type,
vnode.type,
props,
slots
);
}
return markHTMLString(output);
}
}
return markHTMLString(`${vnode}`);
}
async function renderElement(result, tag, { children, ...props }) {
return markHTMLString(
`<${tag}${spreadAttributes(props)}${markHTMLString(
(children == null || children == "") && voidElementNames.test(tag) ? `/>` : `>${children == null ? "" : await renderJSX(result, prerenderElementChildren(tag, children))}</${tag}>`
)}`
);
}
function prerenderElementChildren(tag, children) {
if (typeof children === "string" && (tag === "style" || tag === "script")) {
return markHTMLString(children);
} else {
return children;
}
}
export {
renderJSX
};

View File

@@ -0,0 +1,2 @@
import { type RenderDestination } from './common.js';
export declare function renderChild(destination: RenderDestination, child: any): void | Promise<void>;

97
node_modules/astro/dist/runtime/server/render/any.js generated vendored Normal file
View File

@@ -0,0 +1,97 @@
import { escapeHTML, isHTMLString, markHTMLString } from "../escape.js";
import { isPromise } from "../util.js";
import { isAstroComponentInstance, isRenderTemplateResult } from "./astro/index.js";
import { isRenderInstance } from "./common.js";
import { SlotString } from "./slot.js";
import { createBufferedRenderer } from "./util.js";
function renderChild(destination, child) {
if (isPromise(child)) {
return child.then((x) => renderChild(destination, x));
}
if (child instanceof SlotString) {
destination.write(child);
return;
}
if (isHTMLString(child)) {
destination.write(child);
return;
}
if (Array.isArray(child)) {
return renderArray(destination, child);
}
if (typeof child === "function") {
return renderChild(destination, child());
}
if (!child && child !== 0) {
return;
}
if (typeof child === "string") {
destination.write(markHTMLString(escapeHTML(child)));
return;
}
if (isRenderInstance(child)) {
return child.render(destination);
}
if (isRenderTemplateResult(child)) {
return child.render(destination);
}
if (isAstroComponentInstance(child)) {
return child.render(destination);
}
if (ArrayBuffer.isView(child)) {
destination.write(child);
return;
}
if (typeof child === "object" && (Symbol.asyncIterator in child || Symbol.iterator in child)) {
if (Symbol.asyncIterator in child) {
return renderAsyncIterable(destination, child);
}
return renderIterable(destination, child);
}
destination.write(child);
}
function renderArray(destination, children) {
const flushers = children.map((c) => {
return createBufferedRenderer(destination, (bufferDestination) => {
return renderChild(bufferDestination, c);
});
});
const iterator = flushers[Symbol.iterator]();
const iterate = () => {
for (; ; ) {
const { value: flusher, done } = iterator.next();
if (done) {
break;
}
const result = flusher.flush();
if (isPromise(result)) {
return result.then(iterate);
}
}
};
return iterate();
}
function renderIterable(destination, children) {
const iterator = children[Symbol.iterator]();
const iterate = () => {
for (; ; ) {
const { value, done } = iterator.next();
if (done) {
break;
}
const result = renderChild(destination, value);
if (isPromise(result)) {
return result.then(iterate);
}
}
};
return iterate();
}
async function renderAsyncIterable(destination, children) {
for await (const value of children) {
await renderChild(destination, value);
}
}
export {
renderChild
};

View File

@@ -0,0 +1,13 @@
import type { PropagationHint, SSRResult } from '../../../../types/public/internal.js';
import type { HeadAndContent, ThinHead } from './head-and-content.js';
import type { RenderTemplateResult } from './render-template.js';
export type AstroFactoryReturnValue = RenderTemplateResult | Response | HeadAndContent | ThinHead;
export interface AstroComponentFactory {
(result: any, props: any, slots: any): AstroFactoryReturnValue | Promise<AstroFactoryReturnValue>;
isAstroComponentFactory?: boolean;
moduleId?: string | undefined;
propagation?: PropagationHint;
}
export declare function isAstroComponentFactory(obj: any): obj is AstroComponentFactory;
export declare function isAPropagatingComponent(result: SSRResult, factory: AstroComponentFactory): boolean;
export declare function getPropagationHint(result: SSRResult, factory: AstroComponentFactory): PropagationHint;

View File

@@ -0,0 +1,19 @@
function isAstroComponentFactory(obj) {
return obj == null ? false : obj.isAstroComponentFactory === true;
}
function isAPropagatingComponent(result, factory) {
const hint = getPropagationHint(result, factory);
return hint === "in-tree" || hint === "self";
}
function getPropagationHint(result, factory) {
let hint = factory.propagation || "none";
if (factory.moduleId && result.componentMetadata.has(factory.moduleId) && hint === "none") {
hint = result.componentMetadata.get(factory.moduleId).propagation;
}
return hint;
}
export {
getPropagationHint,
isAPropagatingComponent,
isAstroComponentFactory
};

View File

@@ -0,0 +1,17 @@
import type { RenderTemplateResult } from './render-template.js';
declare const headAndContentSym: unique symbol;
export type HeadAndContent = {
[headAndContentSym]: true;
head: string;
content: RenderTemplateResult;
};
/**
* A head that doesn't contain any content
*/
export type ThinHead = {
[headAndContentSym]: true;
};
export declare function isHeadAndContent(obj: unknown): obj is HeadAndContent;
export declare function createHeadAndContent(head: string, content: RenderTemplateResult): HeadAndContent;
export declare function createThinHead(): ThinHead;
export {};

View File

@@ -0,0 +1,21 @@
const headAndContentSym = Symbol.for("astro.headAndContent");
function isHeadAndContent(obj) {
return typeof obj === "object" && obj !== null && !!obj[headAndContentSym];
}
function createHeadAndContent(head, content) {
return {
[headAndContentSym]: true,
head,
content
};
}
function createThinHead() {
return {
[headAndContentSym]: true
};
}
export {
createHeadAndContent,
createThinHead,
isHeadAndContent
};

View File

@@ -0,0 +1,7 @@
export type { AstroComponentFactory } from './factory.js';
export { isAstroComponentFactory } from './factory.js';
export { createHeadAndContent, isHeadAndContent } from './head-and-content.js';
export type { AstroComponentInstance } from './instance.js';
export { createAstroComponentInstance, isAstroComponentInstance } from './instance.js';
export { renderToReadableStream, renderToString } from './render.js';
export { isRenderTemplateResult, renderTemplate } from './render-template.js';

View File

@@ -0,0 +1,16 @@
import { isAstroComponentFactory } from "./factory.js";
import { createHeadAndContent, isHeadAndContent } from "./head-and-content.js";
import { createAstroComponentInstance, isAstroComponentInstance } from "./instance.js";
import { renderToReadableStream, renderToString } from "./render.js";
import { isRenderTemplateResult, renderTemplate } from "./render-template.js";
export {
createAstroComponentInstance,
createHeadAndContent,
isAstroComponentFactory,
isAstroComponentInstance,
isHeadAndContent,
isRenderTemplateResult,
renderTemplate,
renderToReadableStream,
renderToString
};

View File

@@ -0,0 +1,21 @@
import type { SSRResult } from '../../../../types/public/internal.js';
import type { RenderDestination } from '../common.js';
import type { ComponentSlots } from '../slot.js';
import type { AstroComponentFactory, AstroFactoryReturnValue } from './factory.js';
type ComponentProps = Record<string | number, any>;
declare const astroComponentInstanceSym: unique symbol;
export declare class AstroComponentInstance {
[astroComponentInstanceSym]: boolean;
private readonly result;
private readonly props;
private readonly slotValues;
private readonly factory;
private returnValue;
constructor(result: SSRResult, props: ComponentProps, slots: ComponentSlots, factory: AstroComponentFactory);
init(result: SSRResult): AstroFactoryReturnValue | Promise<AstroFactoryReturnValue>;
render(destination: RenderDestination): void | Promise<void>;
private renderImpl;
}
export declare function createAstroComponentInstance(result: SSRResult, displayName: string, factory: AstroComponentFactory, props: ComponentProps, slots?: any): AstroComponentInstance;
export declare function isAstroComponentInstance(obj: unknown): obj is AstroComponentInstance;
export {};

View File

@@ -0,0 +1,85 @@
import { isPromise } from "../../util.js";
import { renderChild } from "../any.js";
import { isAPropagatingComponent } from "./factory.js";
import { isHeadAndContent } from "./head-and-content.js";
const astroComponentInstanceSym = Symbol.for("astro.componentInstance");
class AstroComponentInstance {
[astroComponentInstanceSym] = true;
result;
props;
slotValues;
factory;
returnValue;
constructor(result, props, slots, factory) {
this.result = result;
this.props = props;
this.factory = factory;
this.slotValues = {};
for (const name in slots) {
let didRender = false;
let value = slots[name](result);
this.slotValues[name] = () => {
if (!didRender) {
didRender = true;
return value;
}
return slots[name](result);
};
}
}
init(result) {
if (this.returnValue !== void 0) {
return this.returnValue;
}
this.returnValue = this.factory(result, this.props, this.slotValues);
if (isPromise(this.returnValue)) {
this.returnValue.then((resolved) => {
this.returnValue = resolved;
}).catch(() => {
});
}
return this.returnValue;
}
render(destination) {
const returnValue = this.init(this.result);
if (isPromise(returnValue)) {
return returnValue.then((x) => this.renderImpl(destination, x));
}
return this.renderImpl(destination, returnValue);
}
renderImpl(destination, returnValue) {
if (isHeadAndContent(returnValue)) {
return returnValue.content.render(destination);
} else {
return renderChild(destination, returnValue);
}
}
}
function validateComponentProps(props, clientDirectives, displayName) {
if (props != null) {
const directives = [...clientDirectives.keys()].map((directive) => `client:${directive}`);
for (const prop of Object.keys(props)) {
if (directives.includes(prop)) {
console.warn(
`You are attempting to render <${displayName} ${prop} />, but ${displayName} is an Astro component. Astro components do not render in the client and should not have a hydration directive. Please use a framework component for client rendering.`
);
}
}
}
}
function createAstroComponentInstance(result, displayName, factory, props, slots = {}) {
validateComponentProps(props, result.clientDirectives, displayName);
const instance = new AstroComponentInstance(result, props, slots, factory);
if (isAPropagatingComponent(result, factory)) {
result._metadata.propagators.add(instance);
}
return instance;
}
function isAstroComponentInstance(obj) {
return typeof obj === "object" && obj !== null && !!obj[astroComponentInstanceSym];
}
export {
AstroComponentInstance,
createAstroComponentInstance,
isAstroComponentInstance
};

View File

@@ -0,0 +1,13 @@
import type { RenderDestination } from '../common.js';
declare const renderTemplateResultSym: unique symbol;
export declare class RenderTemplateResult {
[renderTemplateResultSym]: boolean;
private htmlParts;
expressions: any[];
private error;
constructor(htmlParts: TemplateStringsArray, expressions: unknown[]);
render(destination: RenderDestination): void | Promise<void>;
}
export declare function isRenderTemplateResult(obj: unknown): obj is RenderTemplateResult;
export declare function renderTemplate(htmlParts: TemplateStringsArray, ...expressions: any[]): RenderTemplateResult;
export {};

View File

@@ -0,0 +1,64 @@
import { markHTMLString } from "../../escape.js";
import { isPromise } from "../../util.js";
import { renderChild } from "../any.js";
import { createBufferedRenderer } from "../util.js";
const renderTemplateResultSym = Symbol.for("astro.renderTemplateResult");
class RenderTemplateResult {
[renderTemplateResultSym] = true;
htmlParts;
expressions;
error;
constructor(htmlParts, expressions) {
this.htmlParts = htmlParts;
this.error = void 0;
this.expressions = expressions.map((expression) => {
if (isPromise(expression)) {
return Promise.resolve(expression).catch((err) => {
if (!this.error) {
this.error = err;
throw err;
}
});
}
return expression;
});
}
render(destination) {
const flushers = this.expressions.map((exp) => {
return createBufferedRenderer(destination, (bufferDestination) => {
if (exp || exp === 0) {
return renderChild(bufferDestination, exp);
}
});
});
let i = 0;
const iterate = () => {
while (i < this.htmlParts.length) {
const html = this.htmlParts[i];
const flusher = flushers[i];
i++;
if (html) {
destination.write(markHTMLString(html));
}
if (flusher) {
const result = flusher.flush();
if (isPromise(result)) {
return result.then(iterate);
}
}
}
};
return iterate();
}
}
function isRenderTemplateResult(obj) {
return typeof obj === "object" && obj !== null && !!obj[renderTemplateResultSym];
}
function renderTemplate(htmlParts, ...expressions) {
return new RenderTemplateResult(htmlParts, expressions);
}
export {
RenderTemplateResult,
isRenderTemplateResult,
renderTemplate
};

View File

@@ -0,0 +1,6 @@
import type { RouteData, SSRResult } from '../../../../types/public/internal.js';
import type { AstroComponentFactory } from './factory.js';
export declare function renderToString(result: SSRResult, componentFactory: AstroComponentFactory, props: any, children: any, isPage?: boolean, route?: RouteData): Promise<string | Response>;
export declare function renderToReadableStream(result: SSRResult, componentFactory: AstroComponentFactory, props: any, children: any, isPage?: boolean, route?: RouteData): Promise<ReadableStream | Response>;
export declare function bufferHeadContent(result: SSRResult): Promise<void>;
export declare function renderToAsyncIterable(result: SSRResult, componentFactory: AstroComponentFactory, props: any, children: any, isPage?: boolean, route?: RouteData): Promise<AsyncIterable<Uint8Array> | Response>;

View File

@@ -0,0 +1,259 @@
import { AstroError, AstroErrorData } from "../../../../core/errors/index.js";
import { isPromise } from "../../util.js";
import {
chunkToByteArray,
chunkToByteArrayOrString,
chunkToString,
encoder
} from "../common.js";
import { promiseWithResolvers } from "../util.js";
import { isHeadAndContent } from "./head-and-content.js";
import { isRenderTemplateResult } from "./render-template.js";
const DOCTYPE_EXP = /<!doctype html/i;
async function renderToString(result, componentFactory, props, children, isPage = false, route) {
const templateResult = await callComponentAsTemplateResultOrResponse(
result,
componentFactory,
props,
children,
route
);
if (templateResult instanceof Response) return templateResult;
let str = "";
let renderedFirstPageChunk = false;
if (isPage) {
await bufferHeadContent(result);
}
const destination = {
write(chunk) {
if (isPage && !renderedFirstPageChunk) {
renderedFirstPageChunk = true;
if (!result.partial && !DOCTYPE_EXP.test(String(chunk))) {
const doctype = result.compressHTML ? "<!DOCTYPE html>" : "<!DOCTYPE html>\n";
str += doctype;
}
}
if (chunk instanceof Response) return;
str += chunkToString(result, chunk);
}
};
await templateResult.render(destination);
return str;
}
async function renderToReadableStream(result, componentFactory, props, children, isPage = false, route) {
const templateResult = await callComponentAsTemplateResultOrResponse(
result,
componentFactory,
props,
children,
route
);
if (templateResult instanceof Response) return templateResult;
let renderedFirstPageChunk = false;
if (isPage) {
await bufferHeadContent(result);
}
return new ReadableStream({
start(controller) {
const destination = {
write(chunk) {
if (isPage && !renderedFirstPageChunk) {
renderedFirstPageChunk = true;
if (!result.partial && !DOCTYPE_EXP.test(String(chunk))) {
const doctype = result.compressHTML ? "<!DOCTYPE html>" : "<!DOCTYPE html>\n";
controller.enqueue(encoder.encode(doctype));
}
}
if (chunk instanceof Response) {
throw new AstroError({
...AstroErrorData.ResponseSentError
});
}
const bytes = chunkToByteArray(result, chunk);
controller.enqueue(bytes);
}
};
(async () => {
try {
await templateResult.render(destination);
controller.close();
} catch (e) {
if (AstroError.is(e) && !e.loc) {
e.setLocation({
file: route?.component
});
}
setTimeout(() => controller.error(e), 0);
}
})();
},
cancel() {
result.cancelled = true;
}
});
}
async function callComponentAsTemplateResultOrResponse(result, componentFactory, props, children, route) {
const factoryResult = await componentFactory(result, props, children);
if (factoryResult instanceof Response) {
return factoryResult;
} else if (isHeadAndContent(factoryResult)) {
if (!isRenderTemplateResult(factoryResult.content)) {
throw new AstroError({
...AstroErrorData.OnlyResponseCanBeReturned,
message: AstroErrorData.OnlyResponseCanBeReturned.message(
route?.route,
typeof factoryResult
),
location: {
file: route?.component
}
});
}
return factoryResult.content;
} else if (!isRenderTemplateResult(factoryResult)) {
throw new AstroError({
...AstroErrorData.OnlyResponseCanBeReturned,
message: AstroErrorData.OnlyResponseCanBeReturned.message(route?.route, typeof factoryResult),
location: {
file: route?.component
}
});
}
return factoryResult;
}
async function bufferHeadContent(result) {
const iterator = result._metadata.propagators.values();
while (true) {
const { value, done } = iterator.next();
if (done) {
break;
}
const returnValue = await value.init(result);
if (isHeadAndContent(returnValue) && returnValue.head) {
result._metadata.extraHead.push(returnValue.head);
}
}
}
async function renderToAsyncIterable(result, componentFactory, props, children, isPage = false, route) {
const templateResult = await callComponentAsTemplateResultOrResponse(
result,
componentFactory,
props,
children,
route
);
if (templateResult instanceof Response) return templateResult;
let renderedFirstPageChunk = false;
if (isPage) {
await bufferHeadContent(result);
}
let error = null;
let next = null;
const buffer = [];
let renderingComplete = false;
const iterator = {
async next() {
if (result.cancelled) return { done: true, value: void 0 };
if (next !== null) {
await next.promise;
} else if (!renderingComplete && !buffer.length) {
next = promiseWithResolvers();
await next.promise;
}
if (!renderingComplete) {
next = promiseWithResolvers();
}
if (error) {
throw error;
}
let length = 0;
let stringToEncode = "";
for (let i = 0, len = buffer.length; i < len; i++) {
const bufferEntry = buffer[i];
if (typeof bufferEntry === "string") {
const nextIsString = i + 1 < len && typeof buffer[i + 1] === "string";
stringToEncode += bufferEntry;
if (!nextIsString) {
const encoded = encoder.encode(stringToEncode);
length += encoded.length;
stringToEncode = "";
buffer[i] = encoded;
} else {
buffer[i] = "";
}
} else {
length += bufferEntry.length;
}
}
let mergedArray = new Uint8Array(length);
let offset = 0;
for (let i = 0, len = buffer.length; i < len; i++) {
const item = buffer[i];
if (item === "") {
continue;
}
mergedArray.set(item, offset);
offset += item.length;
}
buffer.length = 0;
const returnValue = {
// The iterator is done when rendering has finished
// and there are no more chunks to return.
done: length === 0 && renderingComplete,
value: mergedArray
};
return returnValue;
},
async return() {
result.cancelled = true;
return { done: true, value: void 0 };
}
};
const destination = {
write(chunk) {
if (isPage && !renderedFirstPageChunk) {
renderedFirstPageChunk = true;
if (!result.partial && !DOCTYPE_EXP.test(String(chunk))) {
const doctype = result.compressHTML ? "<!DOCTYPE html>" : "<!DOCTYPE html>\n";
buffer.push(encoder.encode(doctype));
}
}
if (chunk instanceof Response) {
throw new AstroError(AstroErrorData.ResponseSentError);
}
const bytes = chunkToByteArrayOrString(result, chunk);
if (bytes.length > 0) {
buffer.push(bytes);
next?.resolve();
} else if (buffer.length > 0) {
next?.resolve();
}
}
};
const renderResult = toPromise(() => templateResult.render(destination));
renderResult.catch((err) => {
error = err;
}).finally(() => {
renderingComplete = true;
next?.resolve();
});
return {
[Symbol.asyncIterator]() {
return iterator;
}
};
}
function toPromise(fn) {
try {
const result = fn();
return isPromise(result) ? result : Promise.resolve(result);
} catch (err) {
return Promise.reject(err);
}
}
export {
bufferHeadContent,
renderToAsyncIterable,
renderToReadableStream,
renderToString
};

View File

@@ -0,0 +1,31 @@
import type { SSRResult } from '../../../types/public/internal.js';
import type { HTMLBytes, HTMLString } from '../escape.js';
import type { RenderInstruction } from './instruction.js';
import { type SlotString } from './slot.js';
/**
* Possible chunk types to be written to the destination, and it'll
* handle stringifying them at the end.
*
* NOTE: Try to reduce adding new types here. If possible, serialize
* the custom types to a string in `renderChild` in `any.ts`.
*/
export type RenderDestinationChunk = string | HTMLBytes | HTMLString | SlotString | ArrayBufferView | RenderInstruction | Response;
export interface RenderDestination {
/**
* Any rendering logic should call this to construct the HTML output.
* See the `chunk` parameter for possible writable values.
*/
write(chunk: RenderDestinationChunk): void;
}
export interface RenderInstance {
render: RenderFunction;
}
export type RenderFunction = (destination: RenderDestination) => Promise<void> | void;
export declare const Fragment: unique symbol;
export declare const Renderer: unique symbol;
export declare const encoder: TextEncoder;
export declare const decoder: TextDecoder;
export declare function chunkToString(result: SSRResult, chunk: Exclude<RenderDestinationChunk, Response>): string;
export declare function chunkToByteArray(result: SSRResult, chunk: Exclude<RenderDestinationChunk, Response>): Uint8Array;
export declare function chunkToByteArrayOrString(result: SSRResult, chunk: Exclude<RenderDestinationChunk, Response>): Uint8Array | string;
export declare function isRenderInstance(obj: unknown): obj is RenderInstance;

122
node_modules/astro/dist/runtime/server/render/common.js generated vendored Normal file
View File

@@ -0,0 +1,122 @@
import { markHTMLString } from "../escape.js";
import {
determineIfNeedsHydrationScript,
determinesIfNeedsDirectiveScript,
getPrescripts
} from "../scripts.js";
import { renderAllHeadContent } from "./head.js";
import { isRenderInstruction } from "./instruction.js";
import { renderServerIslandRuntime } from "./server-islands.js";
import { isSlotString } from "./slot.js";
const Fragment = Symbol.for("astro:fragment");
const Renderer = Symbol.for("astro:renderer");
const encoder = new TextEncoder();
const decoder = new TextDecoder();
function stringifyChunk(result, chunk) {
if (isRenderInstruction(chunk)) {
const instruction = chunk;
switch (instruction.type) {
case "directive": {
const { hydration } = instruction;
let needsHydrationScript = hydration && determineIfNeedsHydrationScript(result);
let needsDirectiveScript = hydration && determinesIfNeedsDirectiveScript(result, hydration.directive);
if (needsHydrationScript) {
let prescripts = getPrescripts(result, "both", hydration.directive);
return markHTMLString(prescripts);
} else if (needsDirectiveScript) {
let prescripts = getPrescripts(result, "directive", hydration.directive);
return markHTMLString(prescripts);
} else {
return "";
}
}
case "head": {
if (result._metadata.hasRenderedHead || result.partial) {
return "";
}
return renderAllHeadContent(result);
}
case "maybe-head": {
if (result._metadata.hasRenderedHead || result._metadata.headInTree || result.partial) {
return "";
}
return renderAllHeadContent(result);
}
case "renderer-hydration-script": {
const { rendererSpecificHydrationScripts } = result._metadata;
const { rendererName } = instruction;
if (!rendererSpecificHydrationScripts.has(rendererName)) {
rendererSpecificHydrationScripts.add(rendererName);
return instruction.render();
}
return "";
}
case "server-island-runtime": {
if (result._metadata.hasRenderedServerIslandRuntime) {
return "";
}
result._metadata.hasRenderedServerIslandRuntime = true;
return renderServerIslandRuntime();
}
case "script": {
const { id, content } = instruction;
if (result._metadata.renderedScripts.has(id)) {
return "";
}
result._metadata.renderedScripts.add(id);
return content;
}
default: {
throw new Error(`Unknown chunk type: ${chunk.type}`);
}
}
} else if (chunk instanceof Response) {
return "";
} else if (isSlotString(chunk)) {
let out = "";
const c = chunk;
if (c.instructions) {
for (const instr of c.instructions) {
out += stringifyChunk(result, instr);
}
}
out += chunk.toString();
return out;
}
return chunk.toString();
}
function chunkToString(result, chunk) {
if (ArrayBuffer.isView(chunk)) {
return decoder.decode(chunk);
} else {
return stringifyChunk(result, chunk);
}
}
function chunkToByteArray(result, chunk) {
if (ArrayBuffer.isView(chunk)) {
return chunk;
} else {
const stringified = stringifyChunk(result, chunk);
return encoder.encode(stringified.toString());
}
}
function chunkToByteArrayOrString(result, chunk) {
if (ArrayBuffer.isView(chunk)) {
return chunk;
} else {
return stringifyChunk(result, chunk).toString();
}
}
function isRenderInstance(obj) {
return !!obj && typeof obj === "object" && "render" in obj && typeof obj.render === "function";
}
export {
Fragment,
Renderer,
chunkToByteArray,
chunkToByteArrayOrString,
chunkToString,
decoder,
encoder,
isRenderInstance
};

View File

@@ -0,0 +1,11 @@
import type { RouteData, SSRResult } from '../../../types/public/internal.js';
import { type RenderInstance } from './common.js';
import { type ComponentSlots } from './slot.js';
declare const needsHeadRenderingSymbol: unique symbol;
export declare function renderComponent(result: SSRResult, displayName: string, Component: unknown, props: Record<string | number, any>, slots?: ComponentSlots): RenderInstance | Promise<RenderInstance>;
export declare function renderComponentToString(result: SSRResult, displayName: string, Component: unknown, props: Record<string | number, any>, slots?: any, isPage?: boolean, route?: RouteData): Promise<string>;
export type NonAstroPageComponent = {
name: string;
[needsHeadRenderingSymbol]: boolean;
};
export {};

View File

@@ -0,0 +1,440 @@
import { clsx } from "clsx";
import { AstroError, AstroErrorData } from "../../../core/errors/index.js";
import { markHTMLString } from "../escape.js";
import { extractDirectives, generateHydrateScript } from "../hydration.js";
import { serializeProps } from "../serialize.js";
import { shorthash } from "../shorthash.js";
import { isPromise } from "../util.js";
import { isAstroComponentFactory } from "./astro/factory.js";
import { renderTemplate } from "./astro/index.js";
import { createAstroComponentInstance } from "./astro/instance.js";
import { bufferHeadContent } from "./astro/render.js";
import {
chunkToString,
Fragment,
Renderer
} from "./common.js";
import { componentIsHTMLElement, renderHTMLElement } from "./dom.js";
import { maybeRenderHead } from "./head.js";
import { createRenderInstruction } from "./instruction.js";
import { containsServerDirective, ServerIslandComponent } from "./server-islands.js";
import { renderSlots, renderSlotToString } from "./slot.js";
import { formatList, internalSpreadAttributes, renderElement, voidElementNames } from "./util.js";
const needsHeadRenderingSymbol = Symbol.for("astro.needsHeadRendering");
const rendererAliases = /* @__PURE__ */ new Map([["solid", "solid-js"]]);
const clientOnlyValues = /* @__PURE__ */ new Set(["solid-js", "react", "preact", "vue", "svelte"]);
function guessRenderers(componentUrl) {
const extname = componentUrl?.split(".").pop();
switch (extname) {
case "svelte":
return ["@astrojs/svelte"];
case "vue":
return ["@astrojs/vue"];
case "jsx":
case "tsx":
return ["@astrojs/react", "@astrojs/preact", "@astrojs/solid-js", "@astrojs/vue (jsx)"];
case void 0:
default:
return [
"@astrojs/react",
"@astrojs/preact",
"@astrojs/solid-js",
"@astrojs/vue",
"@astrojs/svelte"
];
}
}
function isFragmentComponent(Component) {
return Component === Fragment;
}
function isHTMLComponent(Component) {
return Component && Component["astro:html"] === true;
}
const ASTRO_SLOT_EXP = /<\/?astro-slot\b[^>]*>/g;
const ASTRO_STATIC_SLOT_EXP = /<\/?astro-static-slot\b[^>]*>/g;
function removeStaticAstroSlot(html, supportsAstroStaticSlot = true) {
const exp = supportsAstroStaticSlot ? ASTRO_STATIC_SLOT_EXP : ASTRO_SLOT_EXP;
return html.replace(exp, "");
}
async function renderFrameworkComponent(result, displayName, Component, _props, slots = {}) {
if (!Component && "client:only" in _props === false) {
throw new Error(
`Unable to render ${displayName} because it is ${Component}!
Did you forget to import the component or is it possible there is a typo?`
);
}
const { renderers, clientDirectives } = result;
const metadata = {
astroStaticSlot: true,
displayName
};
const { hydration, isPage, props, propsWithoutTransitionAttributes } = extractDirectives(
_props,
clientDirectives
);
let html = "";
let attrs = void 0;
if (hydration) {
metadata.hydrate = hydration.directive;
metadata.hydrateArgs = hydration.value;
metadata.componentExport = hydration.componentExport;
metadata.componentUrl = hydration.componentUrl;
}
const probableRendererNames = guessRenderers(metadata.componentUrl);
const validRenderers = renderers.filter((r) => r.name !== "astro:jsx");
const { children, slotInstructions } = await renderSlots(result, slots);
let renderer;
if (metadata.hydrate !== "only") {
let isTagged = false;
try {
isTagged = Component && Component[Renderer];
} catch {
}
if (isTagged) {
const rendererName = Component[Renderer];
renderer = renderers.find(({ name }) => name === rendererName);
}
if (!renderer) {
let error;
for (const r of renderers) {
try {
if (await r.ssr.check.call({ result }, Component, props, children)) {
renderer = r;
break;
}
} catch (e) {
error ??= e;
}
}
if (!renderer && error) {
throw error;
}
}
if (!renderer && typeof HTMLElement === "function" && componentIsHTMLElement(Component)) {
const output = await renderHTMLElement(
result,
Component,
_props,
slots
);
return {
render(destination) {
destination.write(output);
}
};
}
} else {
if (metadata.hydrateArgs) {
const rendererName = rendererAliases.has(metadata.hydrateArgs) ? rendererAliases.get(metadata.hydrateArgs) : metadata.hydrateArgs;
if (clientOnlyValues.has(rendererName)) {
renderer = renderers.find(
({ name }) => name === `@astrojs/${rendererName}` || name === rendererName
);
}
}
if (!renderer && validRenderers.length === 1) {
renderer = validRenderers[0];
}
if (!renderer) {
const extname = metadata.componentUrl?.split(".").pop();
renderer = renderers.find(({ name }) => name === `@astrojs/${extname}` || name === extname);
}
}
let componentServerRenderEndTime;
if (!renderer) {
if (metadata.hydrate === "only") {
const rendererName = rendererAliases.has(metadata.hydrateArgs) ? rendererAliases.get(metadata.hydrateArgs) : metadata.hydrateArgs;
if (clientOnlyValues.has(rendererName)) {
const plural = validRenderers.length > 1;
throw new AstroError({
...AstroErrorData.NoMatchingRenderer,
message: AstroErrorData.NoMatchingRenderer.message(
metadata.displayName,
metadata?.componentUrl?.split(".").pop(),
plural,
validRenderers.length
),
hint: AstroErrorData.NoMatchingRenderer.hint(
formatList(probableRendererNames.map((r) => "`" + r + "`"))
)
});
} else {
throw new AstroError({
...AstroErrorData.NoClientOnlyHint,
message: AstroErrorData.NoClientOnlyHint.message(metadata.displayName),
hint: AstroErrorData.NoClientOnlyHint.hint(
probableRendererNames.map((r) => r.replace("@astrojs/", "")).join("|")
)
});
}
} else if (typeof Component !== "string") {
const matchingRenderers = validRenderers.filter(
(r) => probableRendererNames.includes(r.name)
);
const plural = validRenderers.length > 1;
if (matchingRenderers.length === 0) {
throw new AstroError({
...AstroErrorData.NoMatchingRenderer,
message: AstroErrorData.NoMatchingRenderer.message(
metadata.displayName,
metadata?.componentUrl?.split(".").pop(),
plural,
validRenderers.length
),
hint: AstroErrorData.NoMatchingRenderer.hint(
formatList(probableRendererNames.map((r) => "`" + r + "`"))
)
});
} else if (matchingRenderers.length === 1) {
renderer = matchingRenderers[0];
({ html, attrs } = await renderer.ssr.renderToStaticMarkup.call(
{ result },
Component,
propsWithoutTransitionAttributes,
children,
metadata
));
} else {
throw new Error(`Unable to render ${metadata.displayName}!
This component likely uses ${formatList(probableRendererNames)},
but Astro encountered an error during server-side rendering.
Please ensure that ${metadata.displayName}:
1. Does not unconditionally access browser-specific globals like \`window\` or \`document\`.
If this is unavoidable, use the \`client:only\` hydration directive.
2. Does not conditionally return \`null\` or \`undefined\` when rendered on the server.
If you're still stuck, please open an issue on GitHub or join us at https://astro.build/chat.`);
}
}
} else {
if (metadata.hydrate === "only") {
html = await renderSlotToString(result, slots?.fallback);
} else {
const componentRenderStartTime = performance.now();
({ html, attrs } = await renderer.ssr.renderToStaticMarkup.call(
{ result },
Component,
propsWithoutTransitionAttributes,
children,
metadata
));
if (process.env.NODE_ENV === "development")
componentServerRenderEndTime = performance.now() - componentRenderStartTime;
}
}
if (!html && typeof Component === "string") {
const Tag = sanitizeElementName(Component);
const childSlots = Object.values(children).join("");
const renderTemplateResult = renderTemplate`<${Tag}${internalSpreadAttributes(
props,
true,
Tag
)}${markHTMLString(
childSlots === "" && voidElementNames.test(Tag) ? `/>` : `>${childSlots}</${Tag}>`
)}`;
html = "";
const destination = {
write(chunk) {
if (chunk instanceof Response) return;
html += chunkToString(result, chunk);
}
};
await renderTemplateResult.render(destination);
}
if (!hydration) {
return {
render(destination) {
if (slotInstructions) {
for (const instruction of slotInstructions) {
destination.write(instruction);
}
}
if (isPage || renderer?.name === "astro:jsx") {
destination.write(html);
} else if (html && html.length > 0) {
destination.write(
markHTMLString(removeStaticAstroSlot(html, renderer?.ssr?.supportsAstroStaticSlot))
);
}
}
};
}
const astroId = shorthash(
`<!--${metadata.componentExport.value}:${metadata.componentUrl}-->
${html}
${serializeProps(
props,
metadata
)}`
);
const island = await generateHydrateScript(
{ renderer, result, astroId, props, attrs },
metadata
);
if (componentServerRenderEndTime && process.env.NODE_ENV === "development")
island.props["server-render-time"] = componentServerRenderEndTime;
let unrenderedSlots = [];
if (html) {
if (Object.keys(children).length > 0) {
for (const key of Object.keys(children)) {
let tagName = renderer?.ssr?.supportsAstroStaticSlot ? !!metadata.hydrate ? "astro-slot" : "astro-static-slot" : "astro-slot";
let expectedHTML = key === "default" ? `<${tagName}>` : `<${tagName} name="${key}">`;
if (!html.includes(expectedHTML)) {
unrenderedSlots.push(key);
}
}
}
} else {
unrenderedSlots = Object.keys(children);
}
const template = unrenderedSlots.length > 0 ? unrenderedSlots.map(
(key) => `<template data-astro-template${key !== "default" ? `="${key}"` : ""}>${children[key]}</template>`
).join("") : "";
island.children = `${html ?? ""}${template}`;
if (island.children) {
island.props["await-children"] = "";
island.children += `<!--astro:end-->`;
}
return {
render(destination) {
if (slotInstructions) {
for (const instruction of slotInstructions) {
destination.write(instruction);
}
}
destination.write(createRenderInstruction({ type: "directive", hydration }));
if (hydration.directive !== "only" && renderer?.ssr.renderHydrationScript) {
destination.write(
createRenderInstruction({
type: "renderer-hydration-script",
rendererName: renderer.name,
render: renderer.ssr.renderHydrationScript
})
);
}
const renderedElement = renderElement("astro-island", island, false);
destination.write(markHTMLString(renderedElement));
}
};
}
function sanitizeElementName(tag) {
const unsafe = /[&<>'"\s]+/;
if (!unsafe.test(tag)) return tag;
return tag.trim().split(unsafe)[0].trim();
}
async function renderFragmentComponent(result, slots = {}) {
const children = await renderSlotToString(result, slots?.default);
return {
render(destination) {
if (children == null) return;
destination.write(children);
}
};
}
async function renderHTMLComponent(result, Component, _props, slots = {}) {
const { slotInstructions, children } = await renderSlots(result, slots);
const html = Component({ slots: children });
const hydrationHtml = slotInstructions ? slotInstructions.map((instr) => chunkToString(result, instr)).join("") : "";
return {
render(destination) {
destination.write(markHTMLString(hydrationHtml + html));
}
};
}
function renderAstroComponent(result, displayName, Component, props, slots = {}) {
if (containsServerDirective(props)) {
const serverIslandComponent = new ServerIslandComponent(result, props, slots, displayName);
result._metadata.propagators.add(serverIslandComponent);
return serverIslandComponent;
}
const instance = createAstroComponentInstance(result, displayName, Component, props, slots);
return {
render(destination) {
return instance.render(destination);
}
};
}
function renderComponent(result, displayName, Component, props, slots = {}) {
if (isPromise(Component)) {
return Component.catch(handleCancellation).then((x) => {
return renderComponent(result, displayName, x, props, slots);
});
}
if (isFragmentComponent(Component)) {
return renderFragmentComponent(result, slots).catch(handleCancellation);
}
props = normalizeProps(props);
if (isHTMLComponent(Component)) {
return renderHTMLComponent(result, Component, props, slots).catch(handleCancellation);
}
if (isAstroComponentFactory(Component)) {
return renderAstroComponent(result, displayName, Component, props, slots);
}
return renderFrameworkComponent(result, displayName, Component, props, slots).catch(
handleCancellation
);
function handleCancellation(e) {
if (result.cancelled)
return {
render() {
}
};
throw e;
}
}
function normalizeProps(props) {
if (props["class:list"] !== void 0) {
const value = props["class:list"];
delete props["class:list"];
props["class"] = clsx(props["class"], value);
if (props["class"] === "") {
delete props["class"];
}
}
return props;
}
async function renderComponentToString(result, displayName, Component, props, slots = {}, isPage = false, route) {
let str = "";
let renderedFirstPageChunk = false;
let head = "";
if (isPage && !result.partial && nonAstroPageNeedsHeadInjection(Component)) {
head += chunkToString(result, maybeRenderHead());
}
try {
const destination = {
write(chunk) {
if (isPage && !result.partial && !renderedFirstPageChunk) {
renderedFirstPageChunk = true;
if (!/<!doctype html/i.test(String(chunk))) {
const doctype = result.compressHTML ? "<!DOCTYPE html>" : "<!DOCTYPE html>\n";
str += doctype + head;
}
}
if (chunk instanceof Response) return;
str += chunkToString(result, chunk);
}
};
const renderInstance = await renderComponent(result, displayName, Component, props, slots);
if (containsServerDirective(props)) {
await bufferHeadContent(result);
}
await renderInstance.render(destination);
} catch (e) {
if (AstroError.is(e) && !e.loc) {
e.setLocation({
file: route?.component
});
}
throw e;
}
return str;
}
function nonAstroPageNeedsHeadInjection(pageComponent) {
return !!pageComponent?.[needsHeadRenderingSymbol];
}
export {
renderComponent,
renderComponentToString
};

View File

@@ -0,0 +1,2 @@
import type { SSRResult } from '../../../types/public/index.js';
export declare function renderCspContent(result: SSRResult): string;

35
node_modules/astro/dist/runtime/server/render/csp.js generated vendored Normal file
View File

@@ -0,0 +1,35 @@
function renderCspContent(result) {
const finalScriptHashes = /* @__PURE__ */ new Set();
const finalStyleHashes = /* @__PURE__ */ new Set();
for (const scriptHash of result.scriptHashes) {
finalScriptHashes.add(`'${scriptHash}'`);
}
for (const styleHash of result.styleHashes) {
finalStyleHashes.add(`'${styleHash}'`);
}
for (const styleHash of result._metadata.extraStyleHashes) {
finalStyleHashes.add(`'${styleHash}'`);
}
for (const scriptHash of result._metadata.extraScriptHashes) {
finalScriptHashes.add(`'${scriptHash}'`);
}
let directives;
if (result.directives.length > 0) {
directives = result.directives.join(";") + ";";
}
let scriptResources = "'self'";
if (result.scriptResources.length > 0) {
scriptResources = result.scriptResources.map((r) => `${r}`).join(" ");
}
let styleResources = "'self'";
if (result.styleResources.length > 0) {
styleResources = result.styleResources.map((r) => `${r}`).join(" ");
}
const strictDynamic = result.isStrictDynamic ? ` 'strict-dynamic'` : "";
const scriptSrc = `script-src ${scriptResources} ${Array.from(finalScriptHashes).join(" ")}${strictDynamic};`;
const styleSrc = `style-src ${styleResources} ${Array.from(finalStyleHashes).join(" ")};`;
return [directives, scriptSrc, styleSrc].filter(Boolean).join(" ");
}
export {
renderCspContent
};

View File

@@ -0,0 +1,3 @@
import type { SSRResult } from '../../../types/public/internal.js';
export declare function componentIsHTMLElement(Component: unknown): boolean;
export declare function renderHTMLElement(result: SSRResult, constructor: typeof HTMLElement, props: any, slots: any): Promise<string>;

26
node_modules/astro/dist/runtime/server/render/dom.js generated vendored Normal file
View File

@@ -0,0 +1,26 @@
import { markHTMLString } from "../escape.js";
import { renderSlotToString } from "./slot.js";
import { toAttributeString } from "./util.js";
function componentIsHTMLElement(Component) {
return typeof HTMLElement !== "undefined" && HTMLElement.isPrototypeOf(Component);
}
async function renderHTMLElement(result, constructor, props, slots) {
const name = getHTMLElementName(constructor);
let attrHTML = "";
for (const attr in props) {
attrHTML += ` ${attr}="${toAttributeString(await props[attr])}"`;
}
return markHTMLString(
`<${name}${attrHTML}>${await renderSlotToString(result, slots?.default)}</${name}>`
);
}
function getHTMLElementName(constructor) {
const definedName = customElements.getName(constructor);
if (definedName) return definedName;
const assignedName = constructor.name.replace(/^HTML|Element$/g, "").replace(/[A-Z]/g, "-$&").toLowerCase().replace(/^-/, "html-");
return assignedName;
}
export {
componentIsHTMLElement,
renderHTMLElement
};

View File

@@ -0,0 +1,5 @@
import type { SSRResult } from '../../../types/public/internal.js';
import type { MaybeRenderHeadInstruction, RenderHeadInstruction } from './instruction.js';
export declare function renderAllHeadContent(result: SSRResult): any;
export declare function renderHead(): RenderHeadInstruction;
export declare function maybeRenderHead(): MaybeRenderHeadInstruction;

55
node_modules/astro/dist/runtime/server/render/head.js generated vendored Normal file
View File

@@ -0,0 +1,55 @@
import { markHTMLString } from "../escape.js";
import { renderCspContent } from "./csp.js";
import { createRenderInstruction } from "./instruction.js";
import { renderElement } from "./util.js";
const uniqueElements = (item, index, all) => {
const props = JSON.stringify(item.props);
const children = item.children;
return index === all.findIndex((i) => JSON.stringify(i.props) === props && i.children == children);
};
function renderAllHeadContent(result) {
result._metadata.hasRenderedHead = true;
let content = "";
if (result.shouldInjectCspMetaTags && result.cspDestination === "meta") {
content += renderElement(
"meta",
{
props: {
"http-equiv": "content-security-policy",
content: renderCspContent(result)
},
children: ""
},
false
);
}
const styles = Array.from(result.styles).filter(uniqueElements).map(
(style) => style.props.rel === "stylesheet" ? renderElement("link", style) : renderElement("style", style)
);
result.styles.clear();
const scripts = Array.from(result.scripts).filter(uniqueElements).map((script) => {
if (result.userAssetsBase) {
script.props.src = (result.base === "/" ? "" : result.base) + result.userAssetsBase + script.props.src;
}
return renderElement("script", script, false);
});
const links = Array.from(result.links).filter(uniqueElements).map((link) => renderElement("link", link, false));
content += styles.join("\n") + links.join("\n") + scripts.join("\n");
if (result._metadata.extraHead.length > 0) {
for (const part of result._metadata.extraHead) {
content += part;
}
}
return markHTMLString(content);
}
function renderHead() {
return createRenderInstruction({ type: "head" });
}
function maybeRenderHead() {
return createRenderInstruction({ type: "maybe-head" });
}
export {
maybeRenderHead,
renderAllHeadContent,
renderHead
};

View File

@@ -0,0 +1,12 @@
export type { AstroComponentFactory, AstroComponentInstance } from './astro/index.js';
export { createHeadAndContent, renderTemplate, renderToString } from './astro/index.js';
export { chunkToByteArray, chunkToString, Fragment, Renderer } from './common.js';
export { renderComponent, renderComponentToString } from './component.js';
export { renderHTMLElement } from './dom.js';
export { maybeRenderHead, renderHead } from './head.js';
export type { RenderInstruction } from './instruction.js';
export { renderPage } from './page.js';
export { renderScript } from './script.js';
export { type ComponentSlots, renderSlot, renderSlotToString } from './slot.js';
export { renderScriptElement, renderUniqueStylesheet } from './tags.js';
export { addAttribute, defineScriptVars, voidElementNames } from './util.js';

33
node_modules/astro/dist/runtime/server/render/index.js generated vendored Normal file
View File

@@ -0,0 +1,33 @@
import { createHeadAndContent, renderTemplate, renderToString } from "./astro/index.js";
import { chunkToByteArray, chunkToString, Fragment, Renderer } from "./common.js";
import { renderComponent, renderComponentToString } from "./component.js";
import { renderHTMLElement } from "./dom.js";
import { maybeRenderHead, renderHead } from "./head.js";
import { renderPage } from "./page.js";
import { renderScript } from "./script.js";
import { renderSlot, renderSlotToString } from "./slot.js";
import { renderScriptElement, renderUniqueStylesheet } from "./tags.js";
import { addAttribute, defineScriptVars, voidElementNames } from "./util.js";
export {
Fragment,
Renderer,
addAttribute,
chunkToByteArray,
chunkToString,
createHeadAndContent,
defineScriptVars,
maybeRenderHead,
renderComponent,
renderComponentToString,
renderHTMLElement,
renderHead,
renderPage,
renderScript,
renderScriptElement,
renderSlot,
renderSlotToString,
renderTemplate,
renderToString,
renderUniqueStylesheet,
voidElementNames
};

View File

@@ -0,0 +1,31 @@
import type { HydrationMetadata } from '../hydration.js';
export type RenderDirectiveInstruction = {
type: 'directive';
hydration: HydrationMetadata;
};
export type RenderHeadInstruction = {
type: 'head';
};
/**
* Render a renderer-specific hydration script before the first component of that
* framework
*/
export type RendererHydrationScriptInstruction = {
type: 'renderer-hydration-script';
rendererName: string;
render: () => string;
};
export type MaybeRenderHeadInstruction = {
type: 'maybe-head';
};
export type ServerIslandRuntimeInstruction = {
type: 'server-island-runtime';
};
export type RenderScriptInstruction = {
type: 'script';
id: string;
content: string;
};
export type RenderInstruction = RenderDirectiveInstruction | RenderHeadInstruction | MaybeRenderHeadInstruction | RendererHydrationScriptInstruction | ServerIslandRuntimeInstruction | RenderScriptInstruction;
export declare function createRenderInstruction<T extends RenderInstruction>(instruction: T): T;
export declare function isRenderInstruction(chunk: any): chunk is RenderInstruction;

View File

@@ -0,0 +1,13 @@
const RenderInstructionSymbol = Symbol.for("astro:render");
function createRenderInstruction(instruction) {
return Object.defineProperty(instruction, RenderInstructionSymbol, {
value: true
});
}
function isRenderInstruction(chunk) {
return chunk && typeof chunk === "object" && chunk[RenderInstructionSymbol];
}
export {
createRenderInstruction,
isRenderInstruction
};

View File

@@ -0,0 +1,4 @@
import type { RouteData, SSRResult } from '../../../types/public/internal.js';
import { type NonAstroPageComponent } from './component.js';
import type { AstroComponentFactory } from './index.js';
export declare function renderPage(result: SSRResult, componentFactory: AstroComponentFactory | NonAstroPageComponent, props: any, children: any, streaming: boolean, route?: RouteData): Promise<Response>;

82
node_modules/astro/dist/runtime/server/render/page.js generated vendored Normal file
View File

@@ -0,0 +1,82 @@
import { isAstroComponentFactory } from "./astro/index.js";
import { renderToAsyncIterable, renderToReadableStream, renderToString } from "./astro/render.js";
import { encoder } from "./common.js";
import { renderComponentToString } from "./component.js";
import { renderCspContent } from "./csp.js";
import { isDeno, isNode } from "./util.js";
async function renderPage(result, componentFactory, props, children, streaming, route) {
if (!isAstroComponentFactory(componentFactory)) {
result._metadata.headInTree = result.componentMetadata.get(componentFactory.moduleId)?.containsHead ?? false;
const pageProps = { ...props ?? {}, "server:root": true };
const str = await renderComponentToString(
result,
componentFactory.name,
componentFactory,
pageProps,
{},
true,
route
);
const bytes = encoder.encode(str);
const headers2 = new Headers([
["Content-Type", "text/html"],
["Content-Length", bytes.byteLength.toString()]
]);
if (result.shouldInjectCspMetaTags && (result.cspDestination === "header" || result.cspDestination === "adapter")) {
headers2.set("content-security-policy", renderCspContent(result));
}
return new Response(bytes, {
headers: headers2
});
}
result._metadata.headInTree = result.componentMetadata.get(componentFactory.moduleId)?.containsHead ?? false;
let body;
if (streaming) {
if (isNode && !isDeno) {
const nodeBody = await renderToAsyncIterable(
result,
componentFactory,
props,
children,
true,
route
);
body = nodeBody;
} else {
body = await renderToReadableStream(result, componentFactory, props, children, true, route);
}
} else {
body = await renderToString(result, componentFactory, props, children, true, route);
}
if (body instanceof Response) return body;
const init = result.response;
const headers = new Headers(init.headers);
if (result.shouldInjectCspMetaTags && result.cspDestination === "header" || result.cspDestination === "adapter") {
headers.set("content-security-policy", renderCspContent(result));
}
if (!streaming && typeof body === "string") {
body = encoder.encode(body);
headers.set("Content-Length", body.byteLength.toString());
}
let status = init.status;
let statusText = init.statusText;
if (route?.route === "/404") {
status = 404;
if (statusText === "OK") {
statusText = "Not Found";
}
} else if (route?.route === "/500") {
status = 500;
if (statusText === "OK") {
statusText = "Internal Server Error";
}
}
if (status) {
return new Response(body, { ...init, headers, status, statusText });
} else {
return new Response(body, { ...init, headers });
}
}
export {
renderPage
};

View File

@@ -0,0 +1,10 @@
import type { SSRResult } from '../../../types/public/internal.js';
/**
* Relies on the `renderScript: true` compiler option
* @experimental
*/
export declare function renderScript(result: SSRResult, id: string): Promise<{
type: "script";
id: string;
content: string;
}>;

View File

@@ -0,0 +1,17 @@
import { createRenderInstruction } from "./instruction.js";
async function renderScript(result, id) {
const inlined = result.inlinedScripts.get(id);
let content = "";
if (inlined != null) {
if (inlined) {
content = `<script type="module">${inlined}</script>`;
}
} else {
const resolved = await result.resolve(id);
content = `<script type="module" src="${result.userAssetsBase ? (result.base === "/" ? "" : result.base) + result.userAssetsBase : ""}${resolved}"></script>`;
}
return createRenderInstruction({ type: "script", id, content });
}
export {
renderScript
};

View File

@@ -0,0 +1,24 @@
import type { SSRResult } from '../../../types/public/internal.js';
import { type ThinHead } from './astro/head-and-content.js';
import type { RenderDestination } from './common.js';
import { type ComponentSlots } from './slot.js';
export declare function containsServerDirective(props: Record<string | number, any>): boolean;
export declare class ServerIslandComponent {
result: SSRResult;
props: Record<string | number, any>;
slots: ComponentSlots;
displayName: string;
hostId: string | undefined;
islandContent: string | undefined;
componentPath: string | undefined;
componentExport: string | undefined;
componentId: string | undefined;
constructor(result: SSRResult, props: Record<string | number, any>, slots: ComponentSlots, displayName: string);
init(): Promise<ThinHead>;
render(destination: RenderDestination): Promise<void>;
getComponentPath(): string;
getComponentExport(): string;
getHostId(): Promise<string>;
getIslandContent(): Promise<string>;
}
export declare const renderServerIslandRuntime: () => string;

View File

@@ -0,0 +1,195 @@
import { encryptString, generateCspDigest } from "../../../core/encryption.js";
import { markHTMLString } from "../escape.js";
import { renderChild } from "./any.js";
import { createThinHead } from "./astro/head-and-content.js";
import { createRenderInstruction } from "./instruction.js";
import { renderSlotToString } from "./slot.js";
const internalProps = /* @__PURE__ */ new Set([
"server:component-path",
"server:component-export",
"server:component-directive",
"server:defer"
]);
function containsServerDirective(props) {
return "server:component-directive" in props;
}
const SCRIPT_RE = /<\/script/giu;
const COMMENT_RE = /<!--/gu;
const SCRIPT_REPLACER = "<\\/script";
const COMMENT_REPLACER = "\\u003C!--";
function safeJsonStringify(obj) {
return JSON.stringify(obj).replace(SCRIPT_RE, SCRIPT_REPLACER).replace(COMMENT_RE, COMMENT_REPLACER);
}
function createSearchParams(encryptedComponentExport, encryptedProps, slots) {
const params = new URLSearchParams();
params.set("e", encryptedComponentExport);
params.set("p", encryptedProps);
params.set("s", slots);
return params;
}
function isWithinURLLimit(pathname, params) {
const url = pathname + "?" + params.toString();
const chars = url.length;
return chars < 2048;
}
class ServerIslandComponent {
result;
props;
slots;
displayName;
hostId;
islandContent;
componentPath;
componentExport;
componentId;
constructor(result, props, slots, displayName) {
this.result = result;
this.props = props;
this.slots = slots;
this.displayName = displayName;
}
async init() {
const content = await this.getIslandContent();
if (this.result.cspDestination) {
this.result._metadata.extraScriptHashes.push(
await generateCspDigest(SERVER_ISLAND_REPLACER, this.result.cspAlgorithm)
);
const contentDigest = await generateCspDigest(content, this.result.cspAlgorithm);
this.result._metadata.extraScriptHashes.push(contentDigest);
}
return createThinHead();
}
async render(destination) {
const hostId = await this.getHostId();
const islandContent = await this.getIslandContent();
destination.write(createRenderInstruction({ type: "server-island-runtime" }));
destination.write("<!--[if astro]>server-island-start<![endif]-->");
for (const name in this.slots) {
if (name === "fallback") {
await renderChild(destination, this.slots.fallback(this.result));
}
}
destination.write(
`<script type="module" data-astro-rerun data-island-id="${hostId}">${islandContent}</script>`
);
}
getComponentPath() {
if (this.componentPath) {
return this.componentPath;
}
const componentPath = this.props["server:component-path"];
if (!componentPath) {
throw new Error(`Could not find server component path`);
}
this.componentPath = componentPath;
return componentPath;
}
getComponentExport() {
if (this.componentExport) {
return this.componentExport;
}
const componentExport = this.props["server:component-export"];
if (!componentExport) {
throw new Error(`Could not find server component export`);
}
this.componentExport = componentExport;
return componentExport;
}
async getHostId() {
if (!this.hostId) {
this.hostId = await crypto.randomUUID();
}
return this.hostId;
}
async getIslandContent() {
if (this.islandContent) {
return this.islandContent;
}
const componentPath = this.getComponentPath();
const componentExport = this.getComponentExport();
const componentId = this.result.serverIslandNameMap.get(componentPath);
if (!componentId) {
throw new Error(`Could not find server component name`);
}
for (const key2 of Object.keys(this.props)) {
if (internalProps.has(key2)) {
delete this.props[key2];
}
}
const renderedSlots = {};
for (const name in this.slots) {
if (name !== "fallback") {
const content = await renderSlotToString(this.result, this.slots[name]);
renderedSlots[name] = content.toString();
}
}
const key = await this.result.key;
const componentExportEncrypted = await encryptString(key, componentExport);
const propsEncrypted = Object.keys(this.props).length === 0 ? "" : await encryptString(key, JSON.stringify(this.props));
const slotsEncrypted = Object.keys(renderedSlots).length === 0 ? "" : await encryptString(key, JSON.stringify(renderedSlots));
const hostId = await this.getHostId();
const slash = this.result.base.endsWith("/") ? "" : "/";
let serverIslandUrl = `${this.result.base}${slash}_server-islands/${componentId}${this.result.trailingSlash === "always" ? "/" : ""}`;
const potentialSearchParams = createSearchParams(
componentExportEncrypted,
propsEncrypted,
slotsEncrypted
);
const useGETRequest = isWithinURLLimit(serverIslandUrl, potentialSearchParams);
if (useGETRequest) {
serverIslandUrl += "?" + potentialSearchParams.toString();
this.result._metadata.extraHead.push(
markHTMLString(
`<link rel="preload" as="fetch" href="${serverIslandUrl}" crossorigin="anonymous">`
)
);
}
const adapterHeaders = this.result.internalFetchHeaders || {};
const headersJson = safeJsonStringify(adapterHeaders);
const method = useGETRequest ? (
// GET request
`const headers = new Headers(${headersJson});
let response = await fetch('${serverIslandUrl}', { headers });`
) : (
// POST request
`let data = {
encryptedComponentExport: ${safeJsonStringify(componentExportEncrypted)},
encryptedProps: ${safeJsonStringify(propsEncrypted)},
encryptedSlots: ${safeJsonStringify(slotsEncrypted)},
};
const headers = new Headers({ 'Content-Type': 'application/json', ...${headersJson} });
let response = await fetch('${serverIslandUrl}', {
method: 'POST',
body: JSON.stringify(data),
headers,
});`
);
this.islandContent = `${method}replaceServerIsland('${hostId}', response);`;
return this.islandContent;
}
}
const renderServerIslandRuntime = () => {
return `<script>${SERVER_ISLAND_REPLACER}</script>`;
};
const SERVER_ISLAND_REPLACER = markHTMLString(
`async function replaceServerIsland(id, r) {
let s = document.querySelector(\`script[data-island-id="\${id}"]\`);
// If there's no matching script, or the request fails then return
if (!s || r.status !== 200 || r.headers.get('content-type')?.split(';')[0].trim() !== 'text/html') return;
// Load the HTML before modifying the DOM in case of errors
let html = await r.text();
// Remove any placeholder content before the island script
while (s.previousSibling && s.previousSibling.nodeType !== 8 && s.previousSibling.data !== '[if astro]>server-island-start<![endif]')
s.previousSibling.remove();
s.previousSibling?.remove();
// Insert the new HTML
s.before(document.createRange().createContextualFragment(html));
// Remove the script. Prior to v5.4.2, this was the trick to force rerun of scripts. Keeping it to minimize change to the existing behavior.
s.remove();
}`.split("\n").map((line) => line.trim()).filter((line) => line && !line.startsWith("//")).join(" ")
);
export {
ServerIslandComponent,
containsServerDirective,
renderServerIslandRuntime
};

View File

@@ -0,0 +1,29 @@
import type { SSRResult } from '../../../types/public/internal.js';
import { HTMLString } from '../escape.js';
import { renderTemplate } from './astro/render-template.js';
import { type RenderInstance } from './common.js';
import type { RenderInstruction } from './instruction.js';
type RenderTemplateResult = ReturnType<typeof renderTemplate>;
export type ComponentSlots = Record<string, ComponentSlotValue>;
export type ComponentSlotValue = (result: SSRResult) => RenderTemplateResult | Promise<RenderTemplateResult>;
declare const slotString: unique symbol;
export declare class SlotString extends HTMLString {
instructions: null | RenderInstruction[];
[slotString]: boolean;
constructor(content: string, instructions: null | RenderInstruction[]);
}
export declare function isSlotString(str: string): str is any;
/**
* Collects instructions from a SlotString into the target array.
* Returns the (possibly newly created) instructions array.
*/
export declare function mergeSlotInstructions(target: RenderInstruction[] | null, source: SlotString): RenderInstruction[] | null;
export declare function renderSlot(result: SSRResult, slotted: ComponentSlotValue | RenderTemplateResult, fallback?: ComponentSlotValue | RenderTemplateResult): RenderInstance;
export declare function renderSlotToString(result: SSRResult, slotted: ComponentSlotValue | RenderTemplateResult, fallback?: ComponentSlotValue | RenderTemplateResult): Promise<string>;
interface RenderSlotsResult {
slotInstructions: null | RenderInstruction[];
children: Record<string, string>;
}
export declare function renderSlots(result: SSRResult, slots?: ComponentSlots): Promise<RenderSlotsResult>;
export declare function createSlotValueFromString(content: string): ComponentSlotValue;
export {};

91
node_modules/astro/dist/runtime/server/render/slot.js generated vendored Normal file
View File

@@ -0,0 +1,91 @@
import { HTMLString, markHTMLString, unescapeHTML } from "../escape.js";
import { renderChild } from "./any.js";
import { renderTemplate } from "./astro/render-template.js";
import { chunkToString } from "./common.js";
const slotString = Symbol.for("astro:slot-string");
class SlotString extends HTMLString {
instructions;
[slotString];
constructor(content, instructions) {
super(content);
this.instructions = instructions;
this[slotString] = true;
}
}
function isSlotString(str) {
return !!str[slotString];
}
function mergeSlotInstructions(target, source) {
if (source.instructions?.length) {
target ??= [];
target.push(...source.instructions);
}
return target;
}
function renderSlot(result, slotted, fallback) {
if (!slotted && fallback) {
return renderSlot(result, fallback);
}
return {
async render(destination) {
await renderChild(destination, typeof slotted === "function" ? slotted(result) : slotted);
}
};
}
async function renderSlotToString(result, slotted, fallback) {
let content = "";
let instructions = null;
const temporaryDestination = {
write(chunk) {
if (chunk instanceof SlotString) {
content += chunk;
instructions = mergeSlotInstructions(instructions, chunk);
} else if (chunk instanceof Response) return;
else if (typeof chunk === "object" && "type" in chunk && typeof chunk.type === "string") {
if (instructions === null) {
instructions = [];
}
instructions.push(chunk);
} else {
content += chunkToString(result, chunk);
}
}
};
const renderInstance = renderSlot(result, slotted, fallback);
await renderInstance.render(temporaryDestination);
return markHTMLString(new SlotString(content, instructions));
}
async function renderSlots(result, slots = {}) {
let slotInstructions = null;
let children = {};
if (slots) {
await Promise.all(
Object.entries(slots).map(
([key, value]) => renderSlotToString(result, value).then((output) => {
if (output.instructions) {
if (slotInstructions === null) {
slotInstructions = [];
}
slotInstructions.push(...output.instructions);
}
children[key] = output;
})
)
);
}
return { slotInstructions, children };
}
function createSlotValueFromString(content) {
return function() {
return renderTemplate`${unescapeHTML(content)}`;
};
}
export {
SlotString,
createSlotValueFromString,
isSlotString,
mergeSlotInstructions,
renderSlot,
renderSlotToString,
renderSlots
};

View File

@@ -0,0 +1,4 @@
import type { StylesheetAsset } from '../../../core/app/types.js';
import type { SSRElement, SSRResult } from '../../../types/public/internal.js';
export declare function renderScriptElement({ props, children }: SSRElement): string;
export declare function renderUniqueStylesheet(result: SSRResult, sheet: StylesheetAsset): string | undefined;

21
node_modules/astro/dist/runtime/server/render/tags.js generated vendored Normal file
View File

@@ -0,0 +1,21 @@
import { renderElement } from "./util.js";
function renderScriptElement({ props, children }) {
return renderElement("script", {
props,
children
});
}
function renderUniqueStylesheet(result, sheet) {
if (sheet.type === "external") {
if (Array.from(result.styles).some((s) => s.props.href === sheet.src)) return "";
return renderElement("link", { props: { rel: "stylesheet", href: sheet.src }, children: "" });
}
if (sheet.type === "inline") {
if (Array.from(result.styles).some((s) => s.children.includes(sheet.content))) return "";
return renderElement("style", { props: {}, children: sheet.content });
}
}
export {
renderScriptElement,
renderUniqueStylesheet
};

View File

@@ -0,0 +1,46 @@
import type { SSRElement } from '../../../types/public/internal.js';
import type { RenderDestination, RenderFunction } from './common.js';
export declare const voidElementNames: RegExp;
export declare const toAttributeString: (value: any, shouldEscape?: boolean) => any;
export declare const toStyleString: (obj: Record<string, any>) => string;
export declare function defineScriptVars(vars: Record<any, any>): any;
export declare function formatList(values: string[]): string;
export declare function addAttribute(value: any, key: string, shouldEscape?: boolean, tagName?: string): any;
export declare function internalSpreadAttributes(values: Record<any, any>, shouldEscape: boolean | undefined, tagName: string): any;
export declare function renderElement(name: string, { props: _props, children }: SSRElement, shouldEscape?: boolean): string;
/**
* Executes the `bufferRenderFunction` to prerender it into a buffer destination, and return a promise
* with an object containing the `flush` function to flush the buffer to the final
* destination.
*
* @example
* ```ts
* // Render components in parallel ahead of time
* const finalRenders = [ComponentA, ComponentB].map((comp) => {
* return createBufferedRenderer(finalDestination, async (bufferDestination) => {
* await renderComponentToDestination(bufferDestination);
* });
* });
* // Render array of components serially
* for (const finalRender of finalRenders) {
* await finalRender.flush();
* }
* ```
*/
export declare function createBufferedRenderer(destination: RenderDestination, renderFunction: RenderFunction): RendererFlusher;
export interface RendererFlusher {
/**
* Flushes the current renderer to the underlying renderer.
*
* See example of `createBufferedRenderer` for usage.
*/
flush(): void | Promise<void>;
}
export declare const isNode: boolean;
export declare const isDeno: boolean;
export type PromiseWithResolvers<T> = {
promise: Promise<T>;
resolve: (value: T) => void;
reject: (reason?: any) => void;
};
export declare function promiseWithResolvers<T = any>(): PromiseWithResolvers<T>;

191
node_modules/astro/dist/runtime/server/render/util.js generated vendored Normal file
View File

@@ -0,0 +1,191 @@
import { clsx } from "clsx";
import { HTMLString, markHTMLString } from "../escape.js";
import { isPromise } from "../util.js";
const voidElementNames = /^(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/i;
const htmlBooleanAttributes = /^(?:allowfullscreen|async|autofocus|autoplay|checked|controls|default|defer|disabled|disablepictureinpicture|disableremoteplayback|formnovalidate|hidden|inert|loop|muted|nomodule|novalidate|open|playsinline|readonly|required|reversed|scoped|seamless|selected|itemscope)$/i;
const AMPERSAND_REGEX = /&/g;
const DOUBLE_QUOTE_REGEX = /"/g;
const STATIC_DIRECTIVES = /* @__PURE__ */ new Set(["set:html", "set:text"]);
const toIdent = (k) => k.trim().replace(/(?!^)\b\w|\s+|\W+/g, (match, index) => {
if (/\W/.test(match)) return "";
return index === 0 ? match : match.toUpperCase();
});
const toAttributeString = (value, shouldEscape = true) => shouldEscape ? String(value).replace(AMPERSAND_REGEX, "&#38;").replace(DOUBLE_QUOTE_REGEX, "&#34;") : value;
const kebab = (k) => k.toLowerCase() === k ? k : k.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
const toStyleString = (obj) => Object.entries(obj).filter(([_, v]) => typeof v === "string" && v.trim() || typeof v === "number").map(([k, v]) => {
if (k[0] !== "-" && k[1] !== "-") return `${kebab(k)}:${v}`;
return `${k}:${v}`;
}).join(";");
function defineScriptVars(vars) {
let output = "";
for (const [key, value] of Object.entries(vars)) {
output += `const ${toIdent(key)} = ${JSON.stringify(value)?.replace(
/<\/script>/g,
"\\x3C/script>"
)};
`;
}
return markHTMLString(output);
}
function formatList(values) {
if (values.length === 1) {
return values[0];
}
return `${values.slice(0, -1).join(", ")} or ${values[values.length - 1]}`;
}
function isCustomElement(tagName) {
return tagName.includes("-");
}
function handleBooleanAttribute(key, value, shouldEscape, tagName) {
if (tagName && isCustomElement(tagName)) {
return markHTMLString(` ${key}="${toAttributeString(value, shouldEscape)}"`);
}
return markHTMLString(value ? ` ${key}` : "");
}
function addAttribute(value, key, shouldEscape = true, tagName = "") {
if (value == null) {
return "";
}
if (STATIC_DIRECTIVES.has(key)) {
console.warn(`[astro] The "${key}" directive cannot be applied dynamically at runtime. It will not be rendered as an attribute.
Make sure to use the static attribute syntax (\`${key}={value}\`) instead of the dynamic spread syntax (\`{...{ "${key}": value }}\`).`);
return "";
}
if (key === "class:list") {
const listValue = toAttributeString(clsx(value), shouldEscape);
if (listValue === "") {
return "";
}
return markHTMLString(` ${key.slice(0, -5)}="${listValue}"`);
}
if (key === "style" && !(value instanceof HTMLString)) {
if (Array.isArray(value) && value.length === 2) {
return markHTMLString(
` ${key}="${toAttributeString(`${toStyleString(value[0])};${value[1]}`, shouldEscape)}"`
);
}
if (typeof value === "object") {
return markHTMLString(` ${key}="${toAttributeString(toStyleString(value), shouldEscape)}"`);
}
}
if (key === "className") {
return markHTMLString(` class="${toAttributeString(value, shouldEscape)}"`);
}
if (typeof value === "string" && value.includes("&") && isHttpUrl(value)) {
return markHTMLString(` ${key}="${toAttributeString(value, false)}"`);
}
if (htmlBooleanAttributes.test(key)) {
return handleBooleanAttribute(key, value, shouldEscape, tagName);
}
if (value === "") {
return markHTMLString(` ${key}`);
}
if (key === "popover" && typeof value === "boolean") {
return handleBooleanAttribute(key, value, shouldEscape, tagName);
}
if (key === "download" && typeof value === "boolean") {
return handleBooleanAttribute(key, value, shouldEscape, tagName);
}
return markHTMLString(` ${key}="${toAttributeString(value, shouldEscape)}"`);
}
function internalSpreadAttributes(values, shouldEscape = true, tagName) {
let output = "";
for (const [key, value] of Object.entries(values)) {
output += addAttribute(value, key, shouldEscape, tagName);
}
return markHTMLString(output);
}
function renderElement(name, { props: _props, children = "" }, shouldEscape = true) {
const { lang: _, "data-astro-id": astroId, "define:vars": defineVars, ...props } = _props;
if (defineVars) {
if (name === "style") {
delete props["is:global"];
delete props["is:scoped"];
}
if (name === "script") {
delete props.hoist;
children = defineScriptVars(defineVars) + "\n" + children;
}
}
if ((children == null || children == "") && voidElementNames.test(name)) {
return `<${name}${internalSpreadAttributes(props, shouldEscape, name)}>`;
}
return `<${name}${internalSpreadAttributes(props, shouldEscape, name)}>${children}</${name}>`;
}
const noop = () => {
};
class BufferedRenderer {
chunks = [];
renderPromise;
destination;
/**
* Determines whether buffer has been flushed
* to the final destination.
*/
flushed = false;
constructor(destination, renderFunction) {
this.destination = destination;
this.renderPromise = renderFunction(this);
if (isPromise(this.renderPromise)) {
Promise.resolve(this.renderPromise).catch(noop);
}
}
write(chunk) {
if (this.flushed) {
this.destination.write(chunk);
} else {
this.chunks.push(chunk);
}
}
flush() {
if (this.flushed) {
throw new Error("The render buffer has already been flushed.");
}
this.flushed = true;
for (const chunk of this.chunks) {
this.destination.write(chunk);
}
return this.renderPromise;
}
}
function createBufferedRenderer(destination, renderFunction) {
return new BufferedRenderer(destination, renderFunction);
}
const isNode = typeof process !== "undefined" && Object.prototype.toString.call(process) === "[object process]";
const isDeno = typeof Deno !== "undefined";
function promiseWithResolvers() {
let resolve, reject;
const promise = new Promise((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
});
return {
promise,
resolve,
reject
};
}
const VALID_PROTOCOLS = ["http:", "https:"];
function isHttpUrl(url) {
try {
const parsedUrl = new URL(url);
return VALID_PROTOCOLS.includes(parsedUrl.protocol);
} catch {
return false;
}
}
export {
addAttribute,
createBufferedRenderer,
defineScriptVars,
formatList,
internalSpreadAttributes,
isDeno,
isNode,
promiseWithResolvers,
renderElement,
toAttributeString,
toStyleString,
voidElementNames
};

5
node_modules/astro/dist/runtime/server/scripts.d.ts generated vendored Normal file
View File

@@ -0,0 +1,5 @@
import type { SSRResult } from '../../types/public/internal.js';
export declare function determineIfNeedsHydrationScript(result: SSRResult): boolean;
export declare function determinesIfNeedsDirectiveScript(result: SSRResult, directive: string): boolean;
export type PrescriptType = 'both' | 'directive';
export declare function getPrescripts(result: SSRResult, type: PrescriptType, directive: string): string;

37
node_modules/astro/dist/runtime/server/scripts.js generated vendored Normal file
View File

@@ -0,0 +1,37 @@
import islandScript from "./astro-island.prebuilt.js";
import islandScriptDev from "./astro-island.prebuilt-dev.js";
import { ISLAND_STYLES } from "./astro-island-styles.js";
function determineIfNeedsHydrationScript(result) {
if (result._metadata.hasHydrationScript) {
return false;
}
return result._metadata.hasHydrationScript = true;
}
function determinesIfNeedsDirectiveScript(result, 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;
}
function getPrescripts(result, type, directive) {
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>`;
}
}
export {
determineIfNeedsHydrationScript,
determinesIfNeedsDirectiveScript,
getPrescripts
};

View File

@@ -0,0 +1,2 @@
import type { AstroComponentMetadata } from '../../types/public/internal.js';
export declare function serializeProps(props: any, metadata: AstroComponentMetadata): string;

100
node_modules/astro/dist/runtime/server/serialize.js generated vendored Normal file
View File

@@ -0,0 +1,100 @@
const PROP_TYPE = {
Value: 0,
JSON: 1,
// Actually means Array
RegExp: 2,
Date: 3,
Map: 4,
Set: 5,
BigInt: 6,
URL: 7,
Uint8Array: 8,
Uint16Array: 9,
Uint32Array: 10,
Infinity: 11
};
function serializeArray(value, metadata = {}, parents = /* @__PURE__ */ new WeakSet()) {
if (parents.has(value)) {
throw new Error(`Cyclic reference detected while serializing props for <${metadata.displayName} client:${metadata.hydrate}>!
Cyclic references cannot be safely serialized for client-side usage. Please remove the cyclic reference.`);
}
parents.add(value);
const serialized = value.map((v) => {
return convertToSerializedForm(v, metadata, parents);
});
parents.delete(value);
return serialized;
}
function serializeObject(value, metadata = {}, parents = /* @__PURE__ */ new WeakSet()) {
if (parents.has(value)) {
throw new Error(`Cyclic reference detected while serializing props for <${metadata.displayName} client:${metadata.hydrate}>!
Cyclic references cannot be safely serialized for client-side usage. Please remove the cyclic reference.`);
}
parents.add(value);
const serialized = Object.fromEntries(
Object.entries(value).map(([k, v]) => {
return [k, convertToSerializedForm(v, metadata, parents)];
})
);
parents.delete(value);
return serialized;
}
function convertToSerializedForm(value, metadata = {}, parents = /* @__PURE__ */ new WeakSet()) {
const tag = Object.prototype.toString.call(value);
switch (tag) {
case "[object Date]": {
return [PROP_TYPE.Date, value.toISOString()];
}
case "[object RegExp]": {
return [PROP_TYPE.RegExp, value.source];
}
case "[object Map]": {
return [PROP_TYPE.Map, serializeArray(Array.from(value), metadata, parents)];
}
case "[object Set]": {
return [PROP_TYPE.Set, serializeArray(Array.from(value), metadata, parents)];
}
case "[object BigInt]": {
return [PROP_TYPE.BigInt, value.toString()];
}
case "[object URL]": {
return [PROP_TYPE.URL, value.toString()];
}
case "[object Array]": {
return [PROP_TYPE.JSON, serializeArray(value, metadata, parents)];
}
case "[object Uint8Array]": {
return [PROP_TYPE.Uint8Array, Array.from(value)];
}
case "[object Uint16Array]": {
return [PROP_TYPE.Uint16Array, Array.from(value)];
}
case "[object Uint32Array]": {
return [PROP_TYPE.Uint32Array, Array.from(value)];
}
default: {
if (value !== null && typeof value === "object") {
return [PROP_TYPE.Value, serializeObject(value, metadata, parents)];
}
if (value === Infinity) {
return [PROP_TYPE.Infinity, 1];
}
if (value === -Infinity) {
return [PROP_TYPE.Infinity, -1];
}
if (value === void 0) {
return [PROP_TYPE.Value];
}
return [PROP_TYPE.Value, value];
}
}
}
function serializeProps(props, metadata) {
const serialized = JSON.stringify(serializeObject(props, metadata));
return serialized;
}
export {
serializeProps
};

31
node_modules/astro/dist/runtime/server/shorthash.d.ts generated vendored Normal file
View File

@@ -0,0 +1,31 @@
/**
* shortdash - https://github.com/bibig/node-shorthash
*
* @license
*
* (The MIT License)
*
* Copyright (c) 2013 Bibig <bibig@me.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
export declare function shorthash(text: string): string;

61
node_modules/astro/dist/runtime/server/shorthash.js generated vendored Normal file
View File

@@ -0,0 +1,61 @@
/**
* shortdash - https://github.com/bibig/node-shorthash
*
* @license
*
* (The MIT License)
*
* Copyright (c) 2013 Bibig <bibig@me.com>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
const dictionary = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY";
const binary = dictionary.length;
function bitwise(str) {
let hash = 0;
if (str.length === 0) return hash;
for (let i = 0; i < str.length; i++) {
const ch = str.charCodeAt(i);
hash = (hash << 5) - hash + ch;
hash = hash & hash;
}
return hash;
}
function shorthash(text) {
let num;
let result = "";
let integer = bitwise(text);
const sign = integer < 0 ? "Z" : "";
integer = Math.abs(integer);
while (integer >= binary) {
num = integer % binary;
integer = Math.floor(integer / binary);
result = dictionary[num] + result;
}
if (integer > 0) {
result = dictionary[integer] + result;
}
return sign + result;
}
export {
shorthash
};

View File

@@ -0,0 +1,8 @@
import type { SSRResult } from '../../types/public/internal.js';
import type { TransitionAnimationPair, TransitionAnimationValue } from '../../types/public/view-transitions.js';
export declare function createTransitionScope(result: SSRResult, hash: string): string;
export declare function renderTransition(result: SSRResult, hash: string, animationName: TransitionAnimationValue | undefined, transitionName: string): string;
export declare function createAnimationScope(transitionName: string, animations: Record<string, TransitionAnimationPair>): {
scope: string;
styles: string;
};

180
node_modules/astro/dist/runtime/server/transition.js generated vendored Normal file
View File

@@ -0,0 +1,180 @@
import cssesc from "cssesc";
import { fade, slide } from "../../transitions/index.js";
import { markHTMLString } from "./escape.js";
const transitionNameMap = /* @__PURE__ */ new WeakMap();
function incrementTransitionNumber(result) {
let num = 1;
if (transitionNameMap.has(result)) {
num = transitionNameMap.get(result) + 1;
}
transitionNameMap.set(result, num);
return num;
}
function createTransitionScope(result, hash) {
const num = incrementTransitionNumber(result);
return `astro-${hash}-${num}`;
}
const getAnimations = (name) => {
if (name === "fade") return fade();
if (name === "slide") return slide();
if (typeof name === "object") return name;
};
const addPairs = (animations, stylesheet) => {
for (const [direction, images] of Object.entries(animations)) {
for (const [image, rules] of Object.entries(images)) {
stylesheet.addAnimationPair(direction, image, rules);
}
}
};
const reEncodeValidChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_".split("").reduce((v, c) => (v[c.charCodeAt(0)] = c, v), []);
const reEncodeInValidStart = "-0123456789_".split("").reduce((v, c) => (v[c.charCodeAt(0)] = c, v), []);
function reEncode(s) {
let result = "";
let codepoint;
for (let i = 0; i < s.length; i += (codepoint ?? 0) > 65535 ? 2 : 1) {
codepoint = s.codePointAt(i);
if (codepoint !== void 0) {
result += codepoint < 128 ? codepoint === 95 ? "__" : reEncodeValidChars[codepoint] ?? "_" + codepoint.toString(16).padStart(2, "0") : String.fromCodePoint(codepoint);
}
}
return reEncodeInValidStart[result.codePointAt(0) ?? 0] ? "_" + result : result;
}
function renderTransition(result, hash, animationName, transitionName) {
if (typeof (transitionName ?? "") !== "string") {
throw new Error(`Invalid transition name {${transitionName}}`);
}
if (!animationName) animationName = "fade";
const scope = createTransitionScope(result, hash);
const name = transitionName ? cssesc(reEncode(transitionName), { isIdentifier: true }) : scope;
const sheet = new ViewTransitionStyleSheet(scope, name);
const animations = getAnimations(animationName);
if (animations) {
addPairs(animations, sheet);
} else if (animationName === "none") {
sheet.addFallback("old", "animation: none; mix-blend-mode: normal;");
sheet.addModern("old", "animation: none; opacity: 0; mix-blend-mode: normal;");
sheet.addAnimationRaw("new", "animation: none; mix-blend-mode: normal;");
sheet.addModern("group", "animation: none");
}
const css = sheet.toString();
result._metadata.extraHead.push(markHTMLString(`<style>${css}</style>`));
return scope;
}
function createAnimationScope(transitionName, animations) {
const hash = Math.random().toString(36).slice(2, 8);
const scope = `astro-${hash}`;
const sheet = new ViewTransitionStyleSheet(scope, transitionName);
addPairs(animations, sheet);
return { scope, styles: sheet.toString().replaceAll('"', "") };
}
class ViewTransitionStyleSheet {
constructor(scope, name) {
this.scope = scope;
this.name = name;
}
modern = [];
fallback = [];
toString() {
const { scope, name } = this;
const [modern, fallback] = [this.modern, this.fallback].map((rules) => rules.join(""));
return [
`[data-astro-transition-scope="${scope}"] { view-transition-name: ${name}; }`,
this.layer(modern),
fallback
].join("");
}
layer(cssText) {
return cssText ? `@layer astro { ${cssText} }` : "";
}
addRule(target, cssText) {
this[target].push(cssText);
}
addAnimationRaw(image, animation) {
this.addModern(image, animation);
this.addFallback(image, animation);
}
addModern(image, animation) {
const { name } = this;
this.addRule("modern", `::view-transition-${image}(${name}) { ${animation} }`);
}
addFallback(image, animation) {
const { scope } = this;
this.addRule(
"fallback",
// Two selectors here, the second in case there is an animation on the root.
`[data-astro-transition-fallback="${image}"] [data-astro-transition-scope="${scope}"],
[data-astro-transition-fallback="${image}"][data-astro-transition-scope="${scope}"] { ${animation} }`
);
}
addAnimationPair(direction, image, rules) {
const { scope, name } = this;
const animation = stringifyAnimation(rules);
const prefix = direction === "backwards" ? `[data-astro-transition=back]` : direction === "forwards" ? "" : `[data-astro-transition=${direction}]`;
this.addRule("modern", `${prefix}::view-transition-${image}(${name}) { ${animation} }`);
this.addRule(
"fallback",
`${prefix}[data-astro-transition-fallback="${image}"] [data-astro-transition-scope="${scope}"],
${prefix}[data-astro-transition-fallback="${image}"][data-astro-transition-scope="${scope}"] { ${animation} }`
);
}
}
function addAnimationProperty(builder, prop, value) {
let arr = builder[prop];
if (Array.isArray(arr)) {
arr.push(value.toString());
} else {
builder[prop] = [value.toString()];
}
}
function animationBuilder() {
return {
toString() {
let out = "";
for (let k in this) {
let value = this[k];
if (Array.isArray(value)) {
out += `
${k}: ${value.join(", ")};`;
}
}
return out;
}
};
}
function stringifyAnimation(anim) {
if (Array.isArray(anim)) {
return stringifyAnimations(anim);
} else {
return stringifyAnimations([anim]);
}
}
function stringifyAnimations(anims) {
const builder = animationBuilder();
for (const anim of anims) {
if (anim.duration) {
addAnimationProperty(builder, "animation-duration", toTimeValue(anim.duration));
}
if (anim.easing) {
addAnimationProperty(builder, "animation-timing-function", anim.easing);
}
if (anim.direction) {
addAnimationProperty(builder, "animation-direction", anim.direction);
}
if (anim.delay) {
addAnimationProperty(builder, "animation-delay", anim.delay);
}
if (anim.fillMode) {
addAnimationProperty(builder, "animation-fill-mode", anim.fillMode);
}
addAnimationProperty(builder, "animation-name", anim.name);
}
return builder.toString();
}
function toTimeValue(num) {
return typeof num === "number" ? num + "ms" : num;
}
export {
createAnimationScope,
createTransitionScope,
renderTransition
};

2
node_modules/astro/dist/runtime/server/util.d.ts generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export declare function isPromise<T = any>(value: any): value is Promise<T>;
export declare function streamAsyncIterator(stream: ReadableStream): AsyncGenerator<any, void, unknown>;

19
node_modules/astro/dist/runtime/server/util.js generated vendored Normal file
View File

@@ -0,0 +1,19 @@
function isPromise(value) {
return !!value && typeof value === "object" && "then" in value && typeof value.then === "function";
}
async function* streamAsyncIterator(stream) {
const reader = stream.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) return;
yield value;
}
} finally {
reader.releaseLock();
}
}
export {
isPromise,
streamAsyncIterator
};