@plone/registry
Version:
Add-on and configuration registry for Plone and for JavaScript and TypeScript-based apps.
79 lines (77 loc) • 2.52 kB
JavaScript
// src/addon-registry/create-addons-loader-server.ts
import fs from "fs";
import path from "path";
import cryptoRandomString from "crypto-random-string";
var titleCase = (w) => w.slice(0, 1).toUpperCase() + w.slice(1, w.length);
function nameFromPackage(name) {
name = name.replace(/[@~./\\:\s]/gi, "") || cryptoRandomString({ length: 10, characters: "abcdefghijk" });
return name.split("-").map((w, i) => i > 0 ? titleCase(w) : w).join("");
}
function getAddonsLoaderCode(addons, addonsInfo) {
const parts = [
`/*
Don't change this file manually.
It is autogenerated by @plone/registry.
Instead, change the "addons" registration in the app.
*/
`
];
const serverEnabled = new Set(
(addonsInfo || []).filter((p) => p?.name && p?.hasServerConfig).map((p) => p.name)
);
const importStmts = [];
const loaderIdents = [];
let counter = 0;
addons.forEach((addonConfigString) => {
const [pkgName, extraFns] = addonConfigString.split(":");
if (!serverEnabled.has(pkgName)) return;
const defaultImport = nameFromPackage(pkgName);
const extras = (extraFns ? extraFns.split(",") : []).map(
(name) => [name, `${name}${counter++}`]
);
const namedImport = extras.length ? `, { ${extras.map(([n, alias]) => `${n} as ${alias}`).join(", ")} }` : "";
importStmts.push(
`import ${defaultImport}${namedImport} from '${pkgName}/config/server';
`
);
loaderIdents.push(defaultImport, ...extras.map(([, alias]) => alias));
});
parts.push(...importStmts);
parts.push(
`
const safeWrapper = (func) => (config) => {
const res = func(config);
if (typeof res === 'undefined') {
throw new Error("Configuration function doesn't return config");
}
return res;
};
const load = (config) => {
const addonLoaders = [${loaderIdents.join(", ")}];
if (!addonLoaders.every((el) => typeof el === 'function')) {
throw new TypeError(
'Each addon has to provide a function applying its configuration to the projects configuration.',
);
}
return addonLoaders.reduce((acc, apply) => safeWrapper(apply)(acc), config);
};
export default load;
`
);
return parts.join("");
}
function createAddonsServerLoader(addons, addonsInfo) {
const addonsLoaderPath = path.join(
process.cwd(),
".plone",
"registry.loader.server.js"
);
const code = getAddonsLoaderCode(addons, addonsInfo);
fs.writeFileSync(addonsLoaderPath, code);
return addonsLoaderPath;
}
export {
createAddonsServerLoader,
getAddonsLoaderCode,
nameFromPackage
};