astro-ghostcms/.pnpm-store/v3/files/ea/78363fa777ebb645d4c7f52c654...

132 lines
4.4 KiB
Plaintext

import { getTopLevelPages, walkParentInfos } from "../core/build/graph.js";
import { getAstroMetadata } from "../vite-plugin-astro/index.js";
const injectExp = /(?:^\/\/|\/\/!)\s*astro-head-inject/;
function configHeadVitePlugin() {
let server;
function propagateMetadata(id, prop, value, seen = /* @__PURE__ */ new Set()) {
if (seen.has(id))
return;
seen.add(id);
const mod = server.moduleGraph.getModuleById(id);
const info = this.getModuleInfo(id);
if (info?.meta.astro) {
const astroMetadata = getAstroMetadata(info);
if (astroMetadata) {
Reflect.set(astroMetadata, prop, value);
}
}
for (const parent of mod?.importers || []) {
if (parent.id) {
propagateMetadata.call(this, parent.id, prop, value, seen);
}
}
}
return {
name: "astro:head-metadata",
enforce: "pre",
apply: "serve",
configureServer(_server) {
server = _server;
},
resolveId(source, importer) {
if (importer) {
return this.resolve(source, importer, { skipSelf: true }).then((result) => {
if (result) {
let info = this.getModuleInfo(result.id);
const astro = info && getAstroMetadata(info);
if (astro) {
if (astro.propagation === "self" || astro.propagation === "in-tree") {
propagateMetadata.call(this, importer, "propagation", "in-tree");
}
if (astro.containsHead) {
propagateMetadata.call(this, importer, "containsHead", true);
}
}
}
return result;
});
}
},
transform(source, id) {
if (!server) {
return;
}
let info = this.getModuleInfo(id);
if (info && getAstroMetadata(info)?.containsHead) {
propagateMetadata.call(this, id, "containsHead", true);
}
if (info && getAstroMetadata(info)?.propagation === "self") {
const mod = server.moduleGraph.getModuleById(id);
for (const parent of mod?.importers ?? []) {
if (parent.id) {
propagateMetadata.call(this, parent.id, "propagation", "in-tree");
}
}
}
if (injectExp.test(source)) {
propagateMetadata.call(this, id, "propagation", "in-tree");
}
}
};
}
function astroHeadBuildPlugin(internals) {
return {
targets: ["server"],
hooks: {
"build:before"() {
return {
vitePlugin: {
name: "astro:head-metadata-build",
generateBundle(_opts, bundle) {
const map = internals.componentMetadata;
function getOrCreateMetadata(id) {
if (map.has(id))
return map.get(id);
const metadata = {
propagation: "none",
containsHead: false
};
map.set(id, metadata);
return metadata;
}
for (const [, output] of Object.entries(bundle)) {
if (output.type !== "chunk")
continue;
for (const [id, mod] of Object.entries(output.modules)) {
const modinfo = this.getModuleInfo(id);
if (modinfo) {
const meta = getAstroMetadata(modinfo);
if (meta?.containsHead) {
for (const [pageInfo] of getTopLevelPages(id, this)) {
let metadata = getOrCreateMetadata(pageInfo.id);
metadata.containsHead = true;
}
}
if (meta?.propagation === "self") {
for (const [info] of walkParentInfos(id, this)) {
let metadata = getOrCreateMetadata(info.id);
if (metadata.propagation !== "self") {
metadata.propagation = "in-tree";
}
}
}
}
if (mod.code && injectExp.test(mod.code)) {
for (const [info] of walkParentInfos(id, this)) {
getOrCreateMetadata(info.id).propagation = "in-tree";
}
}
}
}
}
}
};
}
}
};
}
export {
astroHeadBuildPlugin,
configHeadVitePlugin as default
};