139 lines
4.0 KiB
JavaScript
139 lines
4.0 KiB
JavaScript
import { AstroError, AstroErrorData } from "../core/errors/index.js";
|
|
import { SERIALIZED_MANIFEST_ID } from "./serialized.js";
|
|
import { ASTRO_VITE_ENVIRONMENT_NAMES } from "../core/constants.js";
|
|
import { fromRoutingStrategy, toFallbackType, toRoutingStrategy } from "../core/app/common.js";
|
|
const VIRTUAL_SERVER_ID = "astro:config/server";
|
|
const RESOLVED_VIRTUAL_SERVER_ID = "\0" + VIRTUAL_SERVER_ID;
|
|
const VIRTUAL_CLIENT_ID = "astro:config/client";
|
|
const RESOLVED_VIRTUAL_CLIENT_ID = "\0" + VIRTUAL_CLIENT_ID;
|
|
function virtualModulePlugin({ settings }) {
|
|
const config = settings.config;
|
|
let i18nCode = "const i18n = undefined;";
|
|
if (config.i18n) {
|
|
const strategy = toRoutingStrategy(config.i18n.routing, config.i18n.domains);
|
|
const fallbackType = toFallbackType(config.i18n.routing);
|
|
const routing = fromRoutingStrategy(strategy, fallbackType);
|
|
i18nCode = `const i18n = {
|
|
defaultLocale: ${JSON.stringify(config.i18n.defaultLocale)},
|
|
locales: ${JSON.stringify(config.i18n.locales)},
|
|
routing: ${JSON.stringify(routing)},
|
|
fallback: ${JSON.stringify(config.i18n.fallback)}
|
|
};`;
|
|
}
|
|
let imageCode = "const image = undefined;";
|
|
if (config.image) {
|
|
imageCode = `const image = {
|
|
objectFit: ${JSON.stringify(config.image.objectFit)},
|
|
objectPosition: ${JSON.stringify(config.image.objectPosition)},
|
|
layout: ${JSON.stringify(config.image.layout)},
|
|
};`;
|
|
}
|
|
const clientConfigCode = `
|
|
${i18nCode}
|
|
${imageCode}
|
|
const base = ${JSON.stringify(config.base)};
|
|
const trailingSlash = ${JSON.stringify(config.trailingSlash)};
|
|
const site = ${JSON.stringify(config.site)};
|
|
const compressHTML = ${JSON.stringify(config.compressHTML)};
|
|
const build = {
|
|
format: ${JSON.stringify(config.build.format)},
|
|
};
|
|
|
|
export { base, i18n, trailingSlash, site, compressHTML, build, image };
|
|
`;
|
|
return {
|
|
name: "astro-manifest-plugin",
|
|
resolveId: {
|
|
filter: {
|
|
id: new RegExp(`^(${VIRTUAL_SERVER_ID}|${VIRTUAL_CLIENT_ID})$`)
|
|
},
|
|
handler(id) {
|
|
if (id === VIRTUAL_SERVER_ID) {
|
|
return RESOLVED_VIRTUAL_SERVER_ID;
|
|
}
|
|
if (id === VIRTUAL_CLIENT_ID) {
|
|
return RESOLVED_VIRTUAL_CLIENT_ID;
|
|
}
|
|
}
|
|
},
|
|
load: {
|
|
filter: {
|
|
id: new RegExp(`^(${RESOLVED_VIRTUAL_SERVER_ID}|${RESOLVED_VIRTUAL_CLIENT_ID})$`)
|
|
},
|
|
handler(id) {
|
|
if (id === RESOLVED_VIRTUAL_CLIENT_ID) {
|
|
return { code: clientConfigCode };
|
|
}
|
|
if (id === RESOLVED_VIRTUAL_SERVER_ID) {
|
|
if (this.environment.name === ASTRO_VITE_ENVIRONMENT_NAMES.client) {
|
|
throw new AstroError({
|
|
...AstroErrorData.ServerOnlyModule,
|
|
message: AstroErrorData.ServerOnlyModule.message(VIRTUAL_SERVER_ID)
|
|
});
|
|
}
|
|
const code = `
|
|
import { manifest } from '${SERIALIZED_MANIFEST_ID}'
|
|
import { fromRoutingStrategy } from "astro/app";
|
|
|
|
let i18n = undefined;
|
|
if (manifest.i18n) {
|
|
i18n = {
|
|
defaultLocale: manifest.i18n.defaultLocale,
|
|
locales: manifest.i18n.locales,
|
|
routing: fromRoutingStrategy(manifest.i18n.strategy, manifest.i18n.fallbackType),
|
|
fallback: manifest.i18n.fallback,
|
|
domains: manifest.i18n.domains,
|
|
};
|
|
}
|
|
|
|
let image = undefined;
|
|
if (manifest.image) {
|
|
image = {
|
|
objectFit: manifest.image.objectFit,
|
|
objectPosition: manifest.image.objectPosition,
|
|
layout: manifest.image.layout,
|
|
};
|
|
}
|
|
|
|
const base = manifest.base;
|
|
const build = {
|
|
server: new URL(manifest.buildServerDir),
|
|
client: new URL(manifest.buildClientDir),
|
|
format: manifest.buildFormat,
|
|
};
|
|
|
|
const cacheDir = new URL(manifest.cacheDir);
|
|
const outDir = new URL(manifest.outDir);
|
|
const publicDir = new URL(manifest.publicDir);
|
|
const srcDir = new URL(manifest.srcDir);
|
|
const root = new URL(manifest.rootDir);
|
|
const trailingSlash = manifest.trailingSlash;
|
|
const site = manifest.site;
|
|
const compressHTML = manifest.compressHTML;
|
|
|
|
export {
|
|
base,
|
|
build,
|
|
cacheDir,
|
|
outDir,
|
|
publicDir,
|
|
srcDir,
|
|
root,
|
|
trailingSlash,
|
|
site,
|
|
compressHTML,
|
|
i18n,
|
|
image,
|
|
};
|
|
|
|
`;
|
|
return { code };
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
export {
|
|
virtualModulePlugin as default
|
|
};
|