@paroicms/server
Version:
The ParoiCMS server
86 lines • 3.72 kB
JavaScript
import { initialiseSitePlugins } from "../plugin-loader/init-plugins.js";
import { createEmptyLocalizedTranslations, mergeL10nDepth2, } from "./read-locales.js";
import { readSiteSchemaLibrary } from "./site-schema-lib-reader.js";
const libByDirectories = new Map();
export async function prepareLib(options) {
const { commonSchemaLib, languages, ...pluginOptions } = options;
const plugins = await initialiseSitePlugins(pluginOptions);
const allParsedSchema = [...commonSchemaLib.defaultLib];
for (const plugin of plugins) {
for (const dir of plugin.initData.siteSchemaLibraryDirectories) {
let cached = libByDirectories.get(dir);
if (!cached) {
cached = await readSiteSchemaLibrary(dir);
libByDirectories.set(dir, cached);
}
allParsedSchema.push(...cached);
}
}
const result = {
common: commonSchemaLib.common,
plugins: new Map(plugins.map((p) => [p.pluginName, p])),
schema: {
fieldTypes: {},
nodeTypes: {},
mediaPolicies: {},
},
l10n: createEmptyLocalizedTranslations(languages),
};
for (const parsed of allParsedSchema) {
const { module, l10n } = parsed;
if (parsed.module.imageQualityPolicy) {
if (result.schema.imageQualityPolicy) {
throw new Error("duplicated 'imageQualityPolicy' in site-schema");
}
result.schema.imageQualityPolicy = parsed.module.imageQualityPolicy;
}
for (const item of module.fieldTypes ?? []) {
const qualifiedName = item.plugin ? `${item.name}[${item.plugin}]` : item.name;
if (result.schema.fieldTypes[qualifiedName]) {
throw new Error(`duplicate site field '${qualifiedName}'`);
}
result.schema.fieldTypes[qualifiedName] = item;
}
for (const item of module.nodeTypes ?? []) {
const typeName = item.kind === "site" ? "_site" : item.typeName;
if (result.schema.nodeTypes[typeName]) {
throw new Error(`duplicate node type '${typeName}'`);
}
result.schema.nodeTypes[typeName] = item;
}
for (const item of module.mediaPolicies ?? []) {
if (typeof item === "string")
continue;
if (result.schema.mediaPolicies[item.policyName]) {
throw new Error(`duplicate media policy '${item.policyName}'`);
}
result.schema.mediaPolicies[item.policyName] = item;
}
const qualifiedL10n = qualifyFieldNamesInL10n(l10n, module.fieldTypes ?? []);
mergeL10nDepth2(qualifiedL10n, result.l10n);
}
return result;
}
function qualifyFieldNamesInL10n(l10n, fieldTypes) {
const plainToQualified = new Map();
for (const fieldType of fieldTypes) {
const qualifiedName = fieldType.plugin
? `${fieldType.name}[${fieldType.plugin}]`
: fieldType.name;
plainToQualified.set(fieldType.name, qualifiedName);
}
const transformed = {};
for (const [language, data] of Object.entries(l10n)) {
transformed[language] = { ...data };
if (data.fieldTypes) {
const transformedFieldTypes = {};
for (const [plainName, fieldData] of Object.entries(data.fieldTypes)) {
const qualifiedName = plainToQualified.get(plainName) ?? plainName;
transformedFieldTypes[qualifiedName] = fieldData;
}
transformed[language].fieldTypes = transformedFieldTypes;
}
}
return transformed;
}
//# sourceMappingURL=schema-lib.js.map