nitropage
Version:
A free and open source, extensible visual page builder based on SolidStart.
69 lines (59 loc) • 1.6 kB
text/typescript
import { Blueprint, InitConfigParams, NPConfig } from "#../types";
import { NONE_BLUEPRINT_ID } from "#lib/constants.js";
import { startTransition } from "solid-js";
import { produce } from "solid-js/store";
import { initBlueprint } from "./blueprint";
export const createConfig = function (params: NPConfig) {
const blueprints = params.blueprints();
const parent = () => {
if (!lastCtx) {
return;
}
startTransition(() => {
initConfig(
{
...lastCtx,
configParams: parent,
},
true,
);
});
};
parent.pageRoot = params.pageRoot;
parent.blueprints = () => blueprints;
return parent;
};
let lastCtx: InitConfigParams;
export async function initConfig(ctx: InitConfigParams, allBlueprints = false) {
if (import.meta.env.DEV) {
lastCtx = ctx;
}
ctx.setConfig(
produce((d) => {
d.page = ctx.configParams.pageRoot;
d.getBlueprints = ctx.configParams.blueprints;
}),
);
if (allBlueprints) {
const blueprints = ctx.configParams.blueprints();
const files = Object.keys(blueprints);
await Promise.all(
files.map((f) => initBlueprint(f, ctx.config, ctx.setConfig)),
);
if (import.meta.env.DEV) {
console.info(
"init config - loaded blueprints:",
Object.keys(ctx.config.blueprints),
);
}
}
ctx.setConfig("blueprints", NONE_BLUEPRINT_ID, {
id: NONE_BLUEPRINT_ID,
title: () => "None",
category: "misc",
data: {},
component: () => [],
slots: {},
} satisfies Blueprint);
return ctx.config;
}