UNPKG

nitropage

Version:

A free and open source, extensible visual page builder based on SolidStart.

150 lines (135 loc) 3.98 kB
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(""); };