starving-orange
Version:
Random nickname generator combining Korean adjectives and fruits
289 lines (283 loc) • 6.74 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
const adjectives = [
"배고픈",
"상냥한",
"무서운",
"겁먹은",
"용감한",
"친절한",
"귀여운",
"달콤한",
"신비한",
"활발한",
"조용한",
"차분한",
"유쾌한",
"따뜻한",
"시원한",
"날카로운",
"호기심많은",
"놀라운",
"똑똑한",
"유머러스한",
"발빠른",
"손이큰",
"코가큰",
"눈부신",
"애교많은",
"간지러운",
"매력적인",
"기분좋은",
"산뜻한",
"상쾌한",
"반짝이는",
"깜찍한",
"포근한",
"부드러운",
"시크한",
"멋진",
"화려한",
"우아한",
"당당한",
"자신감있는",
"여유로운",
"세련된",
"감성적인",
"로맨틱한",
"환상적인",
"꿈꾸는",
"열정적인",
"에너제틱한",
"생기있는",
"긍정적인",
"낙천적인",
"순수한",
"깔끔한",
"단정한",
];
const fruits = [
"귤",
"사과",
"키위",
"수박",
"딸기",
"바나나",
"포도",
"복숭아",
"배",
"자두",
"체리",
"망고",
"오렌지",
"레몬",
"라임",
"자몽",
"멜론",
"참외",
"대추",
"감",
"석류",
"용과",
"두리안",
"리치",
"무화과",
"살구",
"매실",
"모과",
"산딸기",
"오디",
"다래",
"감귤",
"유자",
"한라봉",
"청귤",
"천혜향",
"레드향",
"구아바",
"앵두",
"머스캣",
"청포도",
"거봉",
"참다래",
"크랜베리",
"블루베리",
"라즈베리",
"블랙베리",
"코코넛",
"아보카도",
];
const vegetables = [
"토마토",
"오이",
"호박",
"가지",
"파프리카",
"시금치",
"상추",
"양배추",
"브로콜리",
"당근",
"고구마",
"감자",
"옥수수",
"완두콩",
"무",
"배추",
"콩나물",
"도라지",
"더덕",
"마늘",
"양파",
"대파",
"생강",
"우엉",
"도토리",
"미나리",
"깻잎",
"청경채",
];
// 과일과 야채를 합쳐서 전체 명사 배열 생성
const nouns = [...fruits, ...vegetables];
/**
* 간단한 시드 기반 랜덤 생성기
*/
class SeededRandom {
constructor(seed = Math.random() * 1000000) {
this.seed = seed % 2147483647;
if (this.seed <= 0)
this.seed += 2147483646;
}
next() {
this.seed = (this.seed * 16807) % 2147483647;
return (this.seed - 1) / 2147483646;
}
}
/**
* 배열에서 랜덤하게 하나의 요소를 선택합니다.
*/
function getRandomElement(array, random) {
const index = Math.floor(random.next() * array.length);
return array[index];
}
/**
* 한글 형용사와 명사를 조합한 랜덤 닉네임을 생성합니다.
*
* @param options 닉네임 생성 옵션
* @returns 생성된 닉네임 정보
*
* @example
* ```typescript
* import { generateNickname } from 'starving-orange';
*
* 1. 기본 사용법 (띄어쓰기 있음)
* const result = generateNickname();
* console.log(result.nickname); // "배고픈 귤"
*
* 2. 띄어쓰기 없는 닉네임
* const noSpaceResult = generateNickname({ noSpacing: true });
* console.log(noSpaceResult.nickname); // "배고픈귤"
*
* 3. 커스텀 옵션 사용
* const customResult = generateNickname({
* customAdjectives: ["멋진", "귀여운"],
* customNouns: ["딸기", "바나나"],
* seed: 12345,
* noSpacing: true
* });
* ```
*/
function generateNickname(options = {}) {
const { customAdjectives = adjectives, customNouns = nouns, seed, noSpacing = false, } = options;
if (customAdjectives.length === 0) {
throw new Error("형용사 배열이 비어있습니다.");
}
if (customNouns.length === 0) {
throw new Error("명사 배열이 비어있습니다.");
}
const random = new SeededRandom(seed);
const adjective = getRandomElement(customAdjectives, random);
const noun = getRandomElement(customNouns, random);
const separator = noSpacing ? "" : " ";
return {
nickname: `${adjective}${separator}${noun}`,
adjective,
noun,
};
}
/**
* 여러 개의 닉네임을 한번에 생성합니다.
*
* @param count 생성할 닉네임 개수
* @param options 닉네임 생성 옵션
* @returns 생성된 닉네임 정보 배열
*
* @example
* ```typescript
* import { generateMultipleNicknames } from 'starving-orange';
*
* const results = generateMultipleNicknames(5);
* results.forEach(result => {
* console.log(result.nickname);
* });
* ```
*/
function generateMultipleNicknames(count, options = {}) {
if (count <= 0) {
throw new Error("개수는 1 이상이어야 합니다.");
}
const results = [];
for (let i = 0; i < count; i++) {
// 각 닉네임마다 다른 시드 사용 (옵션에 시드가 지정된 경우 기반으로)
const seedForThisNickname = options.seed ? options.seed + i : undefined;
results.push(generateNickname({
...options,
seed: seedForThisNickname,
}));
}
return results;
}
/**
* 사용 가능한 형용사 목록을 반환합니다.
*/
function getAvailableAdjectives() {
return [...adjectives];
}
/**
* 사용 가능한 명사 목록을 반환합니다.
*/
function getAvailableNouns() {
return [...nouns];
}
/**
* 사용 가능한 과일 목록을 반환합니다.
* @deprecated 대신 getAvailableNouns()를 사용하세요.
*/
function getAvailableFruits() {
return [...fruits];
}
/**
* 사용 가능한 야채 목록을 반환합니다.
*/
function getAvailableVegetables() {
return [...vegetables];
}
/**
* 가능한 닉네임 조합의 총 개수를 반환합니다.
*/
function getTotalCombinations(options = {}) {
const { customAdjectives = adjectives, customNouns = nouns } = options;
return customAdjectives.length * customNouns.length;
}
exports.adjectives = adjectives;
exports.default = generateNickname;
exports.fruits = fruits;
exports.generateMultipleNicknames = generateMultipleNicknames;
exports.generateNickname = generateNickname;
exports.getAvailableAdjectives = getAvailableAdjectives;
exports.getAvailableFruits = getAvailableFruits;
exports.getAvailableNouns = getAvailableNouns;
exports.getAvailableVegetables = getAvailableVegetables;
exports.getTotalCombinations = getTotalCombinations;
exports.nouns = nouns;
exports.vegetables = vegetables;