@paroicms/site-generator-plugin
Version:
ParoiCMS Site Generator Plugin
96 lines (95 loc) • 4.19 kB
JavaScript
import { generateSlug } from "@paroicms/public-anywhere-lib";
import { randomUUID } from "node:crypto";
import { mkdir, writeFile } from "node:fs/promises";
import { join } from "node:path";
import { loadStep, readStepSchema } from "../../db/db-read.queries.js";
import { insertStep, saveGeneratedSiteStep, } from "../../db/db-write.queries.js";
import { fillSiteWithFakeContent } from "../fake-content-generator/create-database-with-fake-content.js";
import { safeCallStep } from "../lib/session-utils.js";
import { createTheme } from "./theme-creator.js";
export async function generateSite(ctx, input) {
const { service, logger, sitesDir, packConf: { packName }, } = ctx;
const { fromStepNumber, withSampleData } = input;
const stepHandle = await insertStep(ctx, {
kind: "generateSite",
status: "pending",
currentActivity: "generatingSite",
});
const { l10n, siteSchema, localizedValues } = await readStepSchema(ctx, fromStepNumber);
const siteId = randomUUID();
logger.info(`Generating site: ${siteId}…`);
const siteDir = join(sitesDir, siteId);
await mkdir(siteDir);
await writeFile(join(siteDir, "site-schema.json"), JSON.stringify(siteSchema, null, 2), "utf-8");
for (const [language, l10nData] of Object.entries(l10n)) {
await writeFile(join(siteDir, `site-schema.l10n.${language}.json`), JSON.stringify(l10nData, null, 2), "utf-8");
}
await writeFile(join(siteDir, "package.json"), JSON.stringify(getPackageJsonContent({
siteTitle: localizedValues.siteTitle.en ??
Object.values(localizedValues.siteTitle)[0] ??
"new-website",
}), null, 2), "utf-8");
await createTheme(ctx, siteDir, siteSchema);
const regSite = await service.connector.registerNewSite({
packName,
siteDir,
domain: siteId,
version: "0.0.0",
});
const account = {
kind: "local",
email: `${siteId}@yopmail.com`,
name: "Admin",
password: Math.random().toString(36).substring(2, 6), // 4 random lowercase characters,
};
await ctx.service.connector.createAccount(regSite.fqdn, account, { asContactEmail: true });
const { siteUrl } = regSite;
const values = {
status: withSampleData ? "pending" : "completed",
siteId,
siteUrl,
localizedValues,
loginEmail: account.email,
loginPassword: account.password,
};
await saveGeneratedSiteStep(ctx, stepHandle, values);
if (withSampleData) {
safeCallStep(ctx, stepHandle, () => fillSiteWithFakeContent(ctx, stepHandle, { regSite, localizedValues }));
}
return await loadStep(ctx, stepHandle.stepNumber);
}
function getPackageJsonContent(options) {
return {
name: generateSlug(options.siteTitle),
version: "0.0.0",
private: true,
type: "module",
scripts: {
start: "paroicms | npm run _pino-pretty",
"start:dev": "nodemon --watch 'site-schema*.json' --watch config.json",
clear: "rimraf theme/assets/css/*",
build: "npm run scss",
dev: "concurrently -n 'node,scss' -c 'yellow.bold,magenta.bold' 'npm run start:dev' 'npm run scss:watch'",
scss: "npm run _scss -- --no-source-map --style=compressed",
"scss:watch": "npm run _scss && npm run _scss -- --watch",
_scss: "sass theme/assets/scss/theme.scss theme/assets/css/theme.css",
"_pino-pretty": "pino-pretty -U false -x 'stats:25' -X 'stats:grey' -t 'yyyy-mm-dd HH:MM:ss.l' -i 'hostname,pid,fqdn'",
},
dependencies: {
"@paroicms/contact-form-plugin": "*",
"@paroicms/content-loading-plugin": "*",
"@paroicms/internal-link-plugin": "*",
"@paroicms/public-menu-plugin": "*",
"@paroicms/quill-editor-plugin": "*",
"@paroicms/video-plugin": "*",
"@paroicms/server": "*",
},
devDependencies: {
concurrently: "~9.1.2",
nodemon: "~3.1.9",
"pino-pretty": "~13.0.0",
rimraf: "~6.0.1",
sass: "~1.83.4",
},
};
}