UNPKG

@paroicms/site-generator-plugin

Version:

ParoiCMS Site Generator Plugin

96 lines (95 loc) 4.19 kB
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", }, }; }