Skip to content

dani1552/prefix-enum

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

28 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

prefix-enum

npm version TypeScript License: ISC

prefix-enum์€ ์นดํ…Œ๊ณ ๋ฆฌ ๊ธฐ๋ฐ˜ prefix ๊ทœ์น™์„ ํ†ตํ•ด ๊ณ ์œ ํ•œ enum ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” TypeScript ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ enum ๊ทธ๋ฃน์„ ํ†ตํ•ฉํ•˜๊ณ  ํฌ๋งท์„ ์ž๋™ ์ •๊ทœํ™”ํ•˜์—ฌ ์ค‘๋ณต ์ถฉ๋Œ ยท ํฌ๋งท ๋ถˆ์ผ์น˜ ยท ๋ณต์žกํ•œ ๋งคํ•‘ ๋กœ์ง์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.


Purpose

์‹ค์ œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ๋‹ค์–‘ํ•œ 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 ์ง์ ‘ ์ง€์›
  • ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ณด์žฅ ๋ฐ ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜ ๊ฐ์ง€

Main features

๊ธฐ๋Šฅ ์„ค๋ช…
Prefix ๊ธฐ๋ฐ˜ ๊ณ ์œ ํ•œ ํ‚ค ์ƒ์„ฑ SMOKING_TRYING_TO_QUIT, DRINKING_TRYING_TO_QUIT
Key ํฌ๋งท ์ž๋™ ์ •๊ทœํ™” ๋ชจ๋“  ์ž…๋ ฅ ํฌ๋งท์„ SNAKE_CASE๋กœ ํ†ต์ผ
์—ฌ๋Ÿฌ enum ๊ทธ๋ฃน ํ†ตํ•ฉ buildKeywordMap์œผ๋กœ ์ž๋™ ๋ณ‘ํ•ฉ ๋ฐ ์ค‘๋ณต ๊ฒ€์‚ฌ
TypeScript enum ์ง€์› enum ๊ฐ์ฒด ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ
ํƒ€์ž… ์•ˆ์ „์„ฑ strict ํƒ€์ž… ์ฒดํฌ, ์ž๋™์™„์„ฑ, ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜ ๊ฐ์ง€
๋งคํ•‘ ์‹คํŒจ ์˜ต์…˜ fallback, strict, debug ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ์ง€์›

Install

npm install prefix-enum
# or
pnpm add prefix-enum
# or
yarn add prefix-enum

Basic usage example

import { 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"); // "๊ธˆ์ฃผ์ค‘"

TypeScript enum usage examples

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"]; // ์‚ฌ์šฉ ๊ฐ€๋Šฅ

API

prefixEnum(category, definitions, options?)

์นดํ…Œ๊ณ ๋ฆฌ 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"

buildKeywordMap(sources | enumGroups, options?)

์—ฌ๋Ÿฌ PrefixEnumResult ๋˜๋Š” enum ๊ทธ๋ฃน ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์˜ ๋งคํ•‘ ํ…Œ์ด๋ธ”๋กœ ์กฐ๋ฆฝํ•ฉ๋‹ˆ๋‹ค.

const map = buildKeywordMap({
  SMOKING: SmokingEnum,
  DRINKING: DrinkingEnum,
});

getKeywordLabel(source, key, options?)

๋งคํ•‘๋œ ๋ผ๋ฒจ์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์˜ต์…˜์— ๋”ฐ๋ผ fallback/strict ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

getKeywordLabel(map, "SMOKING_TRYING_TO_QUIT"); // "๊ธˆ์—ฐ์ค‘"
getKeywordLabel(map, "UNKNOWN_KEY", { fallback: "์•Œ ์ˆ˜ ์—†์Œ" }); // fallback ๋ฐ˜ํ™˜
getKeywordLabel(map, "UNKNOWN_KEY", { strict: true }); // Error throw

normalizeCategory(category)

์นดํ…Œ๊ณ ๋ฆฌ ๋ฌธ์ž์—ด์„ ๋Œ€๋ฌธ์ž SNAKE_CASE๋กœ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค.

normalizeCategory("preferredPeople"); // "PREFERRED_PEOPLE"
normalizeCategory("preferred-people"); // "PREFERRED_PEOPLE"

Options

์˜ต์…˜ ์„ค๋ช…
fallback ํ‚ค ์กฐํšŒ ์‹คํŒจ ์‹œ ๊ธฐ๋ณธ ํ…์ŠคํŠธ ๋ฐ˜ํ™˜
strict ๋งคํ•‘ ์‹คํŒจ ์‹œ ์ฆ‰์‹œ ์˜ค๋ฅ˜ throw
debug ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
formatLabel ๋ผ๋ฒจ ์ƒ์„ฑ ์ปค์Šคํ…€ formatter

Project structure

prefix-enum/
โ”œโ”€โ”€ src/
โ”œโ”€โ”€ tests/
โ”œโ”€โ”€ dist/
โ”œโ”€โ”€ tsconfig.json
โ”œโ”€โ”€ tsup.config.ts
โ””โ”€โ”€ vitest.config.ts
  • Zero dependencies
  • TypeScript strict mode
  • ํ…Œ์ŠคํŠธ ์ค‘์‹ฌ ์„ค๊ณ„ (Vitest)
  • ESM / CJS / ํƒ€์ž… ์ •์˜ ์ œ๊ณต

CI & Testing

  • PR๊ณผ main/master push ์‹œ .github/workflows/ci.yml GitHub Actions๊ฐ€ pnpm lint, pnpm test, pnpm build๋ฅผ Node.js 18.x / 20.x ํ™˜๊ฒฝ์—์„œ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ์—์„œ๋„ ๋™์ผํ•œ ํ’ˆ์งˆ ์ ๊ฒ€์„ ์œ„ํ•ด ์•„๋ž˜ ๋ช…๋ น์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
pnpm install
pnpm lint
pnpm test
pnpm build

License

ISC License Copyright (c)

GitHub Repository: https://github.com/dani1552/prefix-enum
Issues: https://github.com/dani1552/prefix-enum/issues

About

๐Ÿ“ Safe enum key generator

Resources

License

Stars

Watchers

Forks

Packages

No packages published