prefix-enum์ ์นดํ
๊ณ ๋ฆฌ ๊ธฐ๋ฐ prefix ๊ท์น์ ํตํด ๊ณ ์ ํ enum ํค๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ TypeScript ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ์ฌ๋ฌ enum ๊ทธ๋ฃน์ ํตํฉํ๊ณ ํฌ๋งท์ ์๋ ์ ๊ทํํ์ฌ ์ค๋ณต ์ถฉ๋ ยท ํฌ๋งท ๋ถ์ผ์น ยท ๋ณต์กํ ๋งคํ ๋ก์ง์ ํด๊ฒฐํฉ๋๋ค.
์ค์ ์๋น์ค ํ๊ฒฝ์์ ๋ค์ํ enum์ ํตํฉํ์ฌ ์ฌ์ฉํ ๋ ๋ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค:
[Next.js] ์ค๋ณต ENUM ๊ฐ ์ถฉ๋๋ก ์ธํด ๋ฐ์ํ ํค์๋ ๋งคํ ์ค๋ฅ ํด๊ฒฐํ๊ธฐ
[Next.js] ENUM ํค์๋ ๋งคํ ์คํจ๋ก ์ธํด ๋ฐ์ํ ํ๊ธ ๋ณํ ์ค๋ฅ ํด๊ฒฐํ๊ธฐ
- ์๋ก ๋ค๋ฅธ ์นดํ
๊ณ ๋ฆฌ์์ ๋์ผํ ํค(
TRYING_TO_QUIT) ์ฌ์ฉ์ผ๋ก ์ธํ ์ถฉ๋ - API ์๋ต(
preferredPeople)๊ณผ enum ํค(PREFERRED_PEOPLE_RELIABLE) ํฌ๋งท ๋ถ์ผ์น - ์ฌ๋ฌ enum ๊ทธ๋ฃน์ ๋ณํฉํ ๋ ์๋ ๊ด๋ฆฌ ๊ณผ์ ์์ ์ค๋ฅ ๋ฐ์
- ํ๋ก ํธ/๋ฐฑ/ํด๋ผ์ด์ธํธ ๊ฐ ๋์ผํ ๊ท์น ์ ์ง ์ด๋ ค์
prefix-enum์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค:
- ์นดํ ๊ณ ๋ฆฌ prefix ๊ธฐ๋ฐ ๋ ๋ฆฝ์ ์ธ ํค ์์ฑ
- camelCase / PascalCase / kebab-case / snake_case ์๋ ๋ณํ
- ์ฌ๋ฌ enum ๊ทธ๋ฃน์ ํ๋์ map์ผ๋ก ํตํฉ
- TypeScript enum ์ง์ ์ง์
- ํ์ ์์ ์ฑ ๋ณด์ฅ ๋ฐ ์ปดํ์ผ ํ์ ์ค๋ฅ ๊ฐ์ง
| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| Prefix ๊ธฐ๋ฐ ๊ณ ์ ํ ํค ์์ฑ | SMOKING_TRYING_TO_QUIT, DRINKING_TRYING_TO_QUIT |
| Key ํฌ๋งท ์๋ ์ ๊ทํ | ๋ชจ๋ ์
๋ ฅ ํฌ๋งท์ SNAKE_CASE๋ก ํต์ผ |
| ์ฌ๋ฌ enum ๊ทธ๋ฃน ํตํฉ | buildKeywordMap์ผ๋ก ์๋ ๋ณํฉ ๋ฐ ์ค๋ณต ๊ฒ์ฌ |
| TypeScript enum ์ง์ | enum ๊ฐ์ฒด ๊ทธ๋๋ก ์ ๋ฌ ๊ฐ๋ฅ |
| ํ์ ์์ ์ฑ | strict ํ์ ์ฒดํฌ, ์๋์์ฑ, ์ปดํ์ผ ํ์ ์ค๋ฅ ๊ฐ์ง |
| ๋งคํ ์คํจ ์ต์ | fallback, strict, debug ์ฒ๋ฆฌ ๋ฐฉ์ ์ง์ |
npm install prefix-enum
# or
pnpm add prefix-enum
# or
yarn add prefix-enumimport { prefixEnum, buildKeywordMap, getKeywordLabel } from "prefix-enum";
const smoking = prefixEnum("SMOKING", {
TRYING_TO_QUIT: "๊ธ์ฐ์ค",
NEVER: "๋นํก์ฐ",
});
const drinking = prefixEnum("DRINKING", {
TRYING_TO_QUIT: "๊ธ์ฃผ์ค",
NEVER: "๋น์์ฃผ",
});
const keywordMap = buildKeywordMap([smoking, drinking]);
getKeywordLabel(keywordMap, "SMOKING_TRYING_TO_QUIT"); // "๊ธ์ฐ์ค"
getKeywordLabel(keywordMap, "DRINKING_TRYING_TO_QUIT"); // "๊ธ์ฃผ์ค"enum SmokingEnum {
TRYING_TO_QUIT = "TRYING_TO_QUIT",
NEVER = "NEVER",
}
enum DrinkingEnum {
TRYING_TO_QUIT = "TRYING_TO_QUIT",
NEVER = "NEVER",
}
const map = buildKeywordMap({
SMOKING: SmokingEnum,
DRINKING: DrinkingEnum,
});
map["SMOKING_TRYING_TO_QUIT"]; // ์ฌ์ฉ ๊ฐ๋ฅ์นดํ ๊ณ ๋ฆฌ prefix๊ฐ ์ ์ฉ๋ ๊ณ ์ ํค์ ๋ผ๋ฒจ ๋งคํ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
const result = prefixEnum("userRole", {
admin: "Admin User",
member: "Member User",
});
result.keys.admin; // "USER_ROLE_ADMIN"
result.map["USER_ROLE_ADMIN"].label; // "Admin User"์ฌ๋ฌ PrefixEnumResult ๋๋ enum ๊ทธ๋ฃน ๊ฐ์ฒด๋ฅผ ํ๋์ ๋งคํ ํ ์ด๋ธ๋ก ์กฐ๋ฆฝํฉ๋๋ค.
const map = buildKeywordMap({
SMOKING: SmokingEnum,
DRINKING: DrinkingEnum,
});๋งคํ๋ ๋ผ๋ฒจ์ ๋ฐํํ๊ฑฐ๋ ์ต์ ์ ๋ฐ๋ผ fallback/strict ์ฒ๋ฆฌํฉ๋๋ค.
getKeywordLabel(map, "SMOKING_TRYING_TO_QUIT"); // "๊ธ์ฐ์ค"
getKeywordLabel(map, "UNKNOWN_KEY", { fallback: "์ ์ ์์" }); // fallback ๋ฐํ
getKeywordLabel(map, "UNKNOWN_KEY", { strict: true }); // Error throw์นดํ ๊ณ ๋ฆฌ ๋ฌธ์์ด์ ๋๋ฌธ์ SNAKE_CASE๋ก ์ ๊ทํํฉ๋๋ค.
normalizeCategory("preferredPeople"); // "PREFERRED_PEOPLE"
normalizeCategory("preferred-people"); // "PREFERRED_PEOPLE"| ์ต์ | ์ค๋ช |
|---|---|
fallback |
ํค ์กฐํ ์คํจ ์ ๊ธฐ๋ณธ ํ ์คํธ ๋ฐํ |
strict |
๋งคํ ์คํจ ์ ์ฆ์ ์ค๋ฅ throw |
debug |
๊ฒฝ๊ณ ๋ฉ์์ง ์ถ๋ ฅ |
formatLabel |
๋ผ๋ฒจ ์์ฑ ์ปค์คํ formatter |
prefix-enum/
โโโ src/
โโโ tests/
โโโ dist/
โโโ tsconfig.json
โโโ tsup.config.ts
โโโ vitest.config.ts
- Zero dependencies
- TypeScript strict mode
- ํ ์คํธ ์ค์ฌ ์ค๊ณ (Vitest)
- ESM / CJS / ํ์ ์ ์ ์ ๊ณต
- PR๊ณผ main/master push ์
.github/workflows/ci.ymlGitHub Actions๊ฐpnpm lint,pnpm test,pnpm build๋ฅผ Node.js 18.x / 20.x ํ๊ฒฝ์์ ์๋์ผ๋ก ์คํํฉ๋๋ค. - ๋ก์ปฌ์์๋ ๋์ผํ ํ์ง ์ ๊ฒ์ ์ํด ์๋ ๋ช ๋ น์ ๊ถ์ฅํฉ๋๋ค.
pnpm install
pnpm lint
pnpm test
pnpm buildISC License Copyright (c)
GitHub Repository: https://github.com/dani1552/prefix-enum
Issues: https://github.com/dani1552/prefix-enum/issues