nitropage
Version:
A free and open source, extensible visual page builder based on SolidStart.
130 lines (118 loc) • 4.11 kB
text/typescript
import type { SolidStartInlineConfig } from "@solidjs/start/config";
import { defineConfig as defineConfig_ } from "@solidjs/start/config";
import { uniq } from "es-toolkit";
import lazyPlusPlugin from "solid-lazy-plus/vite";
import { mergeConfig } from "vite";
import { runtimePath } from "../lib/server/path";
import { initVinxiReload, manualChunks, resolveCwd } from "./lib";
import { solidRealmsPatchPlugin } from "./solidRealmsPatch";
type Result = ReturnType<typeof defineConfig_>;
// Inspiration: https://github.com/mattrax/Mattrax/blob/04a5f5a18f0b9a6b9ef7455a55f63943b84e18ea/apps/web/app.config.ts#L61
export const defineConfig = (opts: SolidStartInlineConfig): Result => {
const { vite, ...optsRest } = opts;
const { plugins: serverPlugins, ...serverRest } = (optsRest.server ??= {});
const isBuild = process.env.NODE_ENV === "production";
const isMonoRepo = import.meta.url.endsWith(
"packages/nitropage/dist/start/start.js",
);
if (!isBuild) {
initVinxiReload();
}
return defineConfig_({
middleware: resolveCwd(runtimePath, "middleware.ts"),
vite(params: any) {
const { router } = params;
const user = vite
? typeof vite === "function"
? vite(params)
: vite
: {};
const noOptimize = ["nitropage", "@npio/server"];
let internalLibraries = [
"@lufrai/quill",
"isobject",
"@paralleldrive/cuid2",
];
if (!isMonoRepo) {
internalLibraries = internalLibraries.map((v) => `nitropage > ` + v);
}
const optimizeOnClient = ["clsx", ...internalLibraries];
const solidLibraries = [
"@corvu/resizable",
"@kobalte/core",
"@modular-forms/solid",
"corvu",
"fela-plugin-multiple-selectors",
"fela-plugin-prefixer",
"serfu",
"solid-lazy-plus",
];
const serverLibraries = ["bcrypt", "fsevents", "minio", "sharp"];
const serverBundleLibraries = isBuild ? ["dotenv"] : [];
const userOutput = user.build?.rollupOptions?.output;
if (userOutput && !Array.isArray(userOutput) && userOutput.manualChunks) {
console.warn(
"Custom manualChunks is currently not supported and will be disabled!",
);
delete userOutput.manualChunks;
}
const merged = mergeConfig(
{
build: {
assetsInlineLimit: (path: any) => {
if (path.match(/\.(j|t)sx?$/)) {
return false;
}
return;
},
rollupOptions: {
output: {
manualChunks,
},
},
},
resolve: {
alias: {
"#client": resolveCwd(
runtimePath,
router === "client"
? "client.config.hot.ts"
: "client.config.tsx",
),
},
},
plugins: [solidRealmsPatchPlugin(), lazyPlusPlugin({ router })],
optimizeDeps: {
include: optimizeOnClient,
exclude: uniq([
...noOptimize,
...solidLibraries,
...serverLibraries,
]),
},
ssr: {
external: uniq([...serverLibraries, ...optimizeOnClient]),
noExternal: uniq([...serverBundleLibraries, ...solidLibraries]),
},
},
user,
);
return merged;
},
...optsRest,
server: {
plugins: serverPlugins ?? [resolveCwd(runtimePath, "plugin.ts")],
compressPublicAssets: false,
esbuild: {
options: {
// Building projects outside of the monorepo fails without this
// Nitro doesn't transpile typescript files in dependencies imported by plugins
// https://github.com/nitrojs/nitro/blob/231c516e866a43c7e437e651c97ac14218ce1300/src/rollup/plugins/esbuild.ts#L42
exclude: [/node_modules(?!\/(.pnpm\/)?(nitropage|@npio))/],
target: "esnext",
},
},
...serverRest,
},
});
};