1
0
forked from baron/baron-sso
Files
baron-sso/common/config/vite.base.ts

68 lines
1.7 KiB
TypeScript

import { createRequire } from "node:module";
import path from "node:path";
import { fileURLToPath } from "node:url";
import react from "@vitejs/plugin-react";
import { defineConfig, type UserConfig } from "vite";
const require = createRequire(import.meta.url);
const commonWorkspaceDir = path.resolve(
path.dirname(fileURLToPath(import.meta.url)),
"..",
);
const appWorkspaceDir = path.resolve(process.cwd());
const reactPackageDir = path.dirname(require.resolve("react/package.json"));
const reactDomPackageDir = path.dirname(
require.resolve("react-dom/package.json"),
);
export const commonViteConfig: UserConfig = {
plugins: [react()],
resolve: {
// 공용 패키지에서 hook를 쓰는 컴포넌트를 가져올 때 React가 중복 로드되면
// dispatcher가 분리되어 useState/useEffect가 런타임에 깨질 수 있습니다.
alias: {
react: reactPackageDir,
"react-dom": reactDomPackageDir,
},
dedupe: ["react", "react-dom"],
},
build: {
emptyOutDir: true,
},
server: {
fs: {
allow: [appWorkspaceDir, commonWorkspaceDir, "/workspace/common"],
},
},
};
export function hostFromUrl(value: string | undefined) {
if (!value) return undefined;
try {
return new URL(value).hostname;
} catch {
return value;
}
}
export function getAllowedHosts(
defaultHosts: string[],
envUrl?: string,
envAllowedHosts?: string,
) {
return Array.from(
new Set(
[
...defaultHosts,
hostFromUrl(envUrl),
...(envAllowedHosts ?? "")
.split(",")
.map((host) => host.trim())
.filter(Boolean),
].filter((host): host is string => Boolean(host)),
),
);
}
export default defineConfig(commonViteConfig);