diff --git a/apps/common/features/.gitignore b/apps/common/features/.gitignore index e8d8437ee..b660a552e 100644 --- a/apps/common/features/.gitignore +++ b/apps/common/features/.gitignore @@ -37,4 +37,5 @@ yarn-error.log* *.tsbuildinfo next-env.d.ts -.env* \ No newline at end of file +.env* +__ENV__.js \ No newline at end of file diff --git a/apps/common/features/cli.js b/apps/common/features/cli.js new file mode 100644 index 000000000..9f165f497 --- /dev/null +++ b/apps/common/features/cli.js @@ -0,0 +1,44 @@ +import { findUp } from "find-up"; +import { config } from "dotenv"; +import fs from "fs"; +import yargs from "yargs"; +import { hideBin } from "yargs/helpers"; + +async function parseDotenv(nodeEnv) { + const envFilePath = await findUp(`.env.${nodeEnv}`); + + const parsedEnv = config({ path: envFilePath }).parsed || {}; + + return parsedEnv; +} + +function writeEnv(parsedEnv) { + const scriptFilePath = `${fs.realpathSync(process.cwd())}/public/__ENV__.js`; + + fs.writeFileSync( + scriptFilePath, + `window.__ENV__ = ${JSON.stringify(parsedEnv)}`, + ); +} + +yargs(hideBin(process.argv)) + .command( + "next-env", + "Create Next.js runtime environment js", + function builder(y) { + return y.option("env", { + alias: "e", + type: "string", + description: "Environment name(ex: development, production)", + }); + }, + async function handler(args) { + const nodeEnv = args.e || args.env || "development"; + + const parsedEnv = await parseDotenv(nodeEnv); // dotenv 파싱 + writeEnv(parsedEnv); // 환경 변수 스크립트 파일 생성 + + return parsedEnv; + }, + ) + .parse(); diff --git a/apps/common/features/package.json b/apps/common/features/package.json index 64051045c..8b62e9ffa 100644 --- a/apps/common/features/package.json +++ b/apps/common/features/package.json @@ -1,11 +1,12 @@ { "name": "features", "version": "0.1.0", + "type": "module", "private": true, "scripts": { - "dev": "next dev -p 13000", + "dev": "node cli.js next-env -e ${NODE_ENV:-development} && next dev -p 13000", "build": "next build", - "start": "next start -p 13000", + "start": "node cli.js next-env -e ${NODE_ENV:-production} && next start -p 13000", "lint": "next lint" }, "dependencies": { @@ -27,6 +28,8 @@ "axios": "^1.8.1", "chart.js": "^4.4.8", "dayjs": "^1.11.13", + "dotenv": "^17.2.1", + "find-up": "^7.0.0", "js-cookie": "^3.0.5", "next": "15.3.0", "next-themes": "^0.4.6", @@ -44,6 +47,7 @@ "@types/js-cookie": "^3.0.6", "@types/node": "^22.13.1", "@types/webpack": "^5.28.5", + "@types/yargs": "^17.0.33", "eslint": "^9", "eslint-config-next": "15.1.7", "postcss": "^8", diff --git a/apps/common/features/src/app/index.tsx b/apps/common/features/src/app/index.tsx index 692b55ef0..eb6e75d00 100644 --- a/apps/common/features/src/app/index.tsx +++ b/apps/common/features/src/app/index.tsx @@ -4,12 +4,16 @@ import "@fontsource-variable/noto-sans-kr"; import { AppProvider } from "./providers"; import { cookies } from "next/headers"; +import Script from "next/script"; const App = async ({ children }: Readonly<{ children: React.ReactNode }>) => { const theme = (await cookies()).get("site-theme-key"); return ( + +