nitropage
Version:
A free and open source, extensible visual page builder based on SolidStart.
150 lines (135 loc) • 3.98 kB
text/typescript
import "dotenv/config";
import { omitBy, uniq } from "es-toolkit";
import pc from "picocolors";
import { merge } from "../../utils/object/merge";
import { fallbackSize } from "../media";
import {
ServerConfig,
ServerConfigOptions,
setServerConfig,
useServerConfig,
} from "./config";
import initFilesystem from "./filesystem";
import initDatabase, { useDatabase } from "./prisma";
import { env } from "./util/env";
import { cliLogo } from "./util/logo";
const thumbnailSize = 96;
const faviconSizes = [16, 32, 48, 167, 180, 192];
const metaImageSizes = [1200];
const systemSizes = [
...faviconSizes,
...metaImageSizes,
thumbnailSize,
fallbackSize,
];
const systemAspectRatios = ["1/1", "2/1", "4/3", "16/9"];
export const initialize = (
config: () => ServerConfigOptions,
options = {
cli: false,
},
) => {
if (useServerConfig()) return;
setServerConfig(() => {
const userConfig = config();
const defaultConfig: ServerConfig = {
auth: {
salt: env("NP_AUTH_SALT") ?? "change_this",
cookie: {
maxAge: env.number("NP_AUTH_COOKIE_MAXAGE") ?? 86400,
},
password:
env("NP_AUTH_PASSWORD") ?? "this_must_be_at_least_32_characters",
},
filesystem: {
defaultDriver: "s3",
drivers: {
local: {
baseUrl: "/uploads/",
publicPath: ".data/storage/public",
privatePath: ".data/storage/private",
},
s3: omitBy(
{
endpoint: env("NP_FILESYSTEM_S3_ENDPOINT")!,
accessKey: env("NP_FILESYSTEM_S3_ACCESS_KEY")!,
secretKey: env("NP_FILESYSTEM_S3_SECRET_KEY")!,
publicUrl: env("NP_FILESYSTEM_S3_PUBLIC_URL"),
port: env.number("NP_FILESYSTEM_S3_PORT"),
useSSL: env.boolean("NP_FILESYSTEM_S3_SSL"),
publicBucket: env("NP_FILESYSTEM_S3_PUBLIC_BUCKET"),
privateBucket: env("NP_FILESYSTEM_S3_PRIVATE_BUCKET"),
},
(v) => v === undefined,
) as any,
},
},
image: {
aspectRatios: [],
sizes: [],
maxAge: 365 * 24 * 60 * 60,
quality: 90,
placeholder: {
name: "np-placeholder.webp",
},
},
};
const conf = merge(defaultConfig, userConfig) as ServerConfig;
if (
!(
conf.filesystem.drivers.s3?.endpoint &&
conf.filesystem.drivers.s3?.accessKey &&
conf.filesystem.drivers.s3?.secretKey
)
) {
delete conf.filesystem.drivers.s3;
}
if (!conf.filesystem.drivers[conf.filesystem.defaultDriver]) {
conf.filesystem.defaultDriver = Object.keys(
conf.filesystem.drivers,
)[0] as any;
}
conf.image.sizes = uniq([...conf.image.sizes, ...systemSizes]).sort(
(a, b) => a - b,
);
conf.image.aspectRatios = uniq([
...systemAspectRatios,
...conf.image.aspectRatios,
]);
return conf;
});
initDatabase();
if (options.cli) {
return;
}
initFilesystem();
showWelcome();
};
const showWelcome = async () => {
const db = useDatabase();
const user = await db.nitroUser.findFirst();
if (user) return;
const prodUrl = "https://your.domain/admin";
const devUrl = `http://localhost:${process.env["PORT"] ?? 3000}/admin`;
const mainUrl = import.meta.env?.PROD ? prodUrl : devUrl;
console.log("");
console.log(pc.magentaBright(cliLogo()));
console.log("");
console.log(
pc.magentaBright(`${pc.bold(pc.italic(`WELCOME TO NITROPAGE`))}`),
);
console.log(pc.magentaBright(`${pc.dim("--------------------")}`));
console.log(
pc.magentaBright(
`Open your browser and navigate to ${pc.underline(mainUrl)} to get started.`,
),
);
if (import.meta.env?.PROD) {
console.log(
pc.magentaBright(
`└ ${pc.italic(`Running locally? Try ${pc.underline(devUrl)}.`)}`,
),
);
}
console.log("");
};