From 8984cb33f72e0f0d560f7362f03de967914c426b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 05:22:40 +0000 Subject: [PATCH 1/5] Initial plan From 0295a13db9fecdc8fe61b2bcc23b21d88df15d39 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 05:28:51 +0000 Subject: [PATCH 2/5] Add easterEggUtil with generateHappy function (fix color bug) Co-authored-by: klmhyeonwoo <19422885+klmhyeonwoo@users.noreply.github.com> --- package.json | 5 ++ .../easterEggUtil/generateHappy/index.test.ts | 79 +++++++++++++++++++ package/easterEggUtil/generateHappy/index.ts | 32 ++++++++ package/easterEggUtil/index.ts | 1 + package/index.ts | 2 + 5 files changed, 119 insertions(+) create mode 100644 package/easterEggUtil/generateHappy/index.test.ts create mode 100644 package/easterEggUtil/generateHappy/index.ts create mode 100644 package/easterEggUtil/index.ts diff --git a/package.json b/package.json index c2e4dbe..3f1f9e8 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,11 @@ "types": "./dist/types/deviceUtil/index.d.ts", "require": "./dist/types/deviceUtil/index.js", "import": "./dist/types/deviceUtil/index.js" + }, + "./easterEggUtil": { + "types": "./dist/types/easterEggUtil/index.d.ts", + "require": "./dist/types/easterEggUtil/index.js", + "import": "./dist/types/easterEggUtil/index.js" } }, "scripts": { diff --git a/package/easterEggUtil/generateHappy/index.test.ts b/package/easterEggUtil/generateHappy/index.test.ts new file mode 100644 index 0000000..a4f3518 --- /dev/null +++ b/package/easterEggUtil/generateHappy/index.test.ts @@ -0,0 +1,79 @@ +import { describe, test, expect, vi, beforeEach, afterEach } from "vitest"; +import generateHappy from "."; + +describe("generateHappy", () => { + let consoleLogSpy: ReturnType; + + beforeEach(() => { + // console.log를 spy로 대체하여 호출 여부를 추적합니다. + consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => {}); + }); + + afterEach(() => { + // 각 테스트 후 spy를 복원합니다. + consoleLogSpy.mockRestore(); + }); + + test("사용자 정의 메시지가 없을 때 기본 메시지 중 하나를 반환해야 한다", () => { + const result = generateHappy(); + + const defaultMessages = [ + "Keep going — you're doing great! 💪", + "Small steps lead to big changes. 🌱", + "Today is a good day to smile. 😊", + "You're closer than you think. 🌈", + "Stay curious, stay kind. ✨", + "Progress, not perfection. 🚀", + "You make the code better. 💻❤️", + "Breathe. You're doing your best. 🌤️", + "Trust the process, enjoy the journey. 🛤️", + "Every bug fixed is a victory. 🐞🏆", + ]; + + expect(defaultMessages).toContain(result); + }); + + test("사용자 정의 메시지를 전달하면 해당 메시지를 반환해야 한다", () => { + const customMessage = "Custom happy message!"; + const result = generateHappy(customMessage); + + expect(result).toBe(customMessage); + }); + + test("console.log가 호출되어야 한다", () => { + generateHappy("Test message"); + + expect(consoleLogSpy).toHaveBeenCalledTimes(1); + }); + + test("console.log에 타임스탬프와 메시지가 포함되어야 한다", () => { + const testMessage = "Test message"; + generateHappy(testMessage); + + expect(consoleLogSpy).toHaveBeenCalled(); + const [firstArg] = consoleLogSpy.mock.calls[0]; + + // 첫 번째 인자에 타임스탬프와 메시지가 포함되어 있는지 확인 + expect(firstArg).toContain(testMessage); + expect(firstArg).toMatch(/\[\d{1,2}:\d{2}:\d{2}.*\]/); // 타임스탬프 형식 확인 + }); + + test("console.log에 올바른 스타일이 적용되어야 한다", () => { + generateHappy("Test message"); + + expect(consoleLogSpy).toHaveBeenCalled(); + const args = consoleLogSpy.mock.calls[0]; + + // 스타일 인자들이 올바르게 전달되었는지 확인 + expect(args[1]).toBe('color: #ff69b4; font-weight: bold;'); + expect(args[2]).toBe('color: #333; font-size: 14px;'); + }); + + test("여러 번 호출해도 정상적으로 동작해야 한다", () => { + generateHappy("Message 1"); + generateHappy("Message 2"); + generateHappy(); + + expect(consoleLogSpy).toHaveBeenCalledTimes(3); + }); +}); diff --git a/package/easterEggUtil/generateHappy/index.ts b/package/easterEggUtil/generateHappy/index.ts new file mode 100644 index 0000000..9eabda0 --- /dev/null +++ b/package/easterEggUtil/generateHappy/index.ts @@ -0,0 +1,32 @@ +/** + * 개발자에게 격려 메시지를 콘솔에 출력하는 함수입니다. + * @param message 출력할 사용자 정의 메시지 (선택 사항) + * @returns {string} 출력된 메시지 텍스트 + */ +export default function generateHappy(message?: string) { + const defaultMessages = [ + "Keep going — you're doing great! 💪", + "Small steps lead to big changes. 🌱", + "Today is a good day to smile. 😊", + "You're closer than you think. 🌈", + "Stay curious, stay kind. ✨", + "Progress, not perfection. 🚀", + "You make the code better. 💻❤️", + "Breathe. You're doing your best. 🌤️", + "Trust the process, enjoy the journey. 🛤️", + "Every bug fixed is a victory. 🐞🏆", + ]; + + const text = + message ?? + defaultMessages[Math.floor(Math.random() * defaultMessages.length)]; + const timestamp = new Date().toLocaleTimeString(); + + console.log( + `%c[${timestamp}] %c${text}`, + 'color: #ff69b4; font-weight: bold;', + 'color: #333; font-size: 14px;' + ); + + return text; +} diff --git a/package/easterEggUtil/index.ts b/package/easterEggUtil/index.ts new file mode 100644 index 0000000..adba2e9 --- /dev/null +++ b/package/easterEggUtil/index.ts @@ -0,0 +1 @@ +export { default as generateHappy } from "./generateHappy"; diff --git a/package/index.ts b/package/index.ts index 40a1131..f1d66de 100644 --- a/package/index.ts +++ b/package/index.ts @@ -9,6 +9,7 @@ export * as searchQueryUtil from "./searchQueryUtil"; export * as typeUtil from "./typeUtil"; export * as formatUtil from "./formatUtil"; export * as deviceUtil from "./deviceUtil"; +export * as easterEggUtil from "./easterEggUtil"; // 개별 함수에 대한 익스포트 진행 export * from "./stringUtil"; @@ -21,3 +22,4 @@ export * from "./searchQueryUtil"; export * from "./typeUtil"; export * from "./formatUtil"; export * from "./deviceUtil"; +export * from "./easterEggUtil"; From 6e550c8ce223f6b1c913963bfd368d0b0e38e7b0 Mon Sep 17 00:00:00 2001 From: klmhyeonwoo Date: Fri, 14 Nov 2025 14:32:54 +0900 Subject: [PATCH 3/5] Update package/easterEggUtil/generateHappy/index.ts --- package/easterEggUtil/generateHappy/index.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/package/easterEggUtil/generateHappy/index.ts b/package/easterEggUtil/generateHappy/index.ts index 9eabda0..bee6ffb 100644 --- a/package/easterEggUtil/generateHappy/index.ts +++ b/package/easterEggUtil/generateHappy/index.ts @@ -1,8 +1,3 @@ -/** - * 개발자에게 격려 메시지를 콘솔에 출력하는 함수입니다. - * @param message 출력할 사용자 정의 메시지 (선택 사항) - * @returns {string} 출력된 메시지 텍스트 - */ export default function generateHappy(message?: string) { const defaultMessages = [ "Keep going — you're doing great! 💪", From edacb53854c7a185dffc158e969bad044eb8b340 Mon Sep 17 00:00:00 2001 From: klmhyeonwoo Date: Fri, 14 Nov 2025 14:37:18 +0900 Subject: [PATCH 4/5] Update package/easterEggUtil/generateHappy/index.test.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../easterEggUtil/generateHappy/index.test.ts | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/package/easterEggUtil/generateHappy/index.test.ts b/package/easterEggUtil/generateHappy/index.test.ts index a4f3518..7d1e1f8 100644 --- a/package/easterEggUtil/generateHappy/index.test.ts +++ b/package/easterEggUtil/generateHappy/index.test.ts @@ -17,20 +17,9 @@ describe("generateHappy", () => { test("사용자 정의 메시지가 없을 때 기본 메시지 중 하나를 반환해야 한다", () => { const result = generateHappy(); - const defaultMessages = [ - "Keep going — you're doing great! 💪", - "Small steps lead to big changes. 🌱", - "Today is a good day to smile. 😊", - "You're closer than you think. 🌈", - "Stay curious, stay kind. ✨", - "Progress, not perfection. 🚀", - "You make the code better. 💻❤️", - "Breathe. You're doing your best. 🌤️", - "Trust the process, enjoy the journey. 🛤️", - "Every bug fixed is a victory. 🐞🏆", - ]; - - expect(defaultMessages).toContain(result); + // 기본 메시지 중 하나가 반환되는지 확인 (구체적인 메시지 배열을 하드코딩하지 않음) + expect(typeof result).toBe("string"); + expect(result.length).toBeGreaterThan(0); }); test("사용자 정의 메시지를 전달하면 해당 메시지를 반환해야 한다", () => { From 450637221daba6be61c844f5ad15ee32bb292cb3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 05:41:16 +0000 Subject: [PATCH 5/5] Add README documentation for generateHappy function Co-authored-by: klmhyeonwoo <19422885+klmhyeonwoo@users.noreply.github.com> --- README.md | 13 +- package/easterEggUtil/generateHappy/README.md | 134 ++++++++++++++++++ 2 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 package/easterEggUtil/generateHappy/README.md diff --git a/README.md b/README.md index 5422901..55e4300 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A comprehensive collection of TypeScript utility functions for modern web develo ## Features -- 🛠️ **Comprehensive**: String, object, cookie, number, validation, format, search query, device, type, storage and common utilities +- 🛠️ **Comprehensive**: String, object, cookie, number, validation, format, search query, device, type, storage, easter egg and common utilities - 📦 **Tree-shakable**: Import only what you need - 🔒 **Type-safe**: Full TypeScript support with type definitions - ⚡ **Lightweight**: Minimal dependencies and optimized for performance @@ -36,6 +36,7 @@ import { searchQueryUtil, typeUtil, deviceUtil, + easterEggUtil, } from "kr-corekit"; // String utilities @@ -109,6 +110,10 @@ const isNotPlain = typeUtil.isPlainObject(new Date()); // false // Device utilities const device = deviceUtil.getDevice(); // { isMobile: false, isTablet: false, isDesktop: true, isIOS: false, isAndroid: false } +// Easter Egg utilities - Encouraging messages for developers +easterEggUtil.generateHappy(); // [5:28:35 AM] Progress, not perfection. 🚀 +easterEggUtil.generateHappy("Custom message! 🎉"); // [5:28:35 AM] Custom message! 🎉 + // Cookie utilities cookieUtil.setCookie("theme", "dark"); const theme = cookieUtil.getCookie("theme"); @@ -125,12 +130,14 @@ For optimal bundle size, import only the functions you need: import { escapeHtml, unescapeHtml } from "kr-corekit"; import { sum, multiply } from "kr-corekit"; import { clearNullProperties, deepFreeze } from "kr-corekit"; +import { generateHappy } from "kr-corekit"; // Option 2: Import from specific utility modules (good tree-shaking) import { escapeHtml } from "kr-corekit/stringUtil"; import { sum } from "kr-corekit/numberUtil"; import { clearNullProperties } from "kr-corekit/objectUtil"; import { storage } from "kr-corekit/commonUtil"; +import { generateHappy } from "kr-corekit/easterEggUtil"; // Usage remains the same const escaped = escapeHtml("
Hello
"); @@ -228,6 +235,10 @@ storage.set("data", { key: "value" }); - `getDevice(): DeviceInfo` - Detects the user's device environment. Returns information about device type (mobile/tablet/desktop) and operating system (iOS/Android). Uses navigator.userAgent for detection and provides safe fallback for SSR environments. +### EasterEggUtil + +- `generateHappy(message?: string): string` - Displays encouraging messages to developers in the console with colorful styling and timestamps. Randomly selects from 10 motivational default messages or displays a custom message if provided. Returns the message text. Perfect for adding positivity to development workflows, celebrating test success, or boosting morale during debugging sessions. + ### CookieUtil - `setCookie(name: string, value: string, options?: object): void` - Sets a cookie diff --git a/package/easterEggUtil/generateHappy/README.md b/package/easterEggUtil/generateHappy/README.md new file mode 100644 index 0000000..f70b3ec --- /dev/null +++ b/package/easterEggUtil/generateHappy/README.md @@ -0,0 +1,134 @@ +# generateHappy() + +Display encouraging messages to developers in the console with colorful styling and timestamps. + +## Features + +- 🎨 **Styled Console Output**: Colorful messages with pink timestamps +- 🎲 **Random Messages**: 10 motivational default messages +- 💬 **Custom Messages**: Support for user-defined messages +- ⏰ **Timestamps**: Automatic timestamp on each message +- 🎉 **Developer Friendly**: Spread positivity while coding! + +## Usage + +### Basic Usage (Random Message) + +```typescript +import { generateHappy } from "kr-corekit"; + +// Displays a random encouraging message +generateHappy(); +// Console output: [5:28:35 AM] Progress, not perfection. 🚀 +``` + +### Custom Message + +```typescript +import { generateHappy } from "kr-corekit"; + +// Display your own encouraging message +const message = generateHappy("Great job on completing the feature! 🎉"); +console.log(message); // Returns: "Great job on completing the feature! 🎉" +``` + +### Tree-Shaking Import + +```typescript +// Import from specific module for better tree-shaking +import { generateHappy } from "kr-corekit/easterEggUtil"; + +generateHappy("Keep coding! 💻"); +``` + +## Default Messages + +The function randomly selects from these 10 encouraging messages: + +- "Keep going — you're doing great! 💪" +- "Small steps lead to big changes. 🌱" +- "Today is a good day to smile. 😊" +- "You're closer than you think. 🌈" +- "Stay curious, stay kind. ✨" +- "Progress, not perfection. 🚀" +- "You make the code better. 💻❤️" +- "Breathe. You're doing your best. 🌤️" +- "Trust the process, enjoy the journey. 🛤️" +- "Every bug fixed is a victory. 🐞🏆" + +## API + +### Parameters + +- `message?: string` - Optional custom message to display. If not provided, a random default message is used. + +### Returns + +- `string` - The message that was displayed in the console + +## Examples + +### In Development Scripts + +Add encouraging messages to your build or development scripts: + +```typescript +import { generateHappy } from "kr-corekit"; + +console.log("Starting development server..."); +generateHappy(); + +// Your server startup code... +``` + +### After Test Success + +Celebrate successful tests: + +```typescript +import { generateHappy } from "kr-corekit"; + +describe("My Tests", () => { + afterAll(() => { + generateHappy("All tests passed! 🎊"); + }); +}); +``` + +### During Debugging + +Add morale boosters during long debugging sessions: + +```typescript +import { generateHappy } from "kr-corekit"; + +function complexDebugFunction() { + // ... debugging code ... + + if (bugFixed) { + generateHappy("Bug squashed! 🐛✨"); + } +} +``` + +## Console Output + +The function outputs styled messages to the console with: +- **Pink timestamp** (`#ff69b4`) with bold font +- **Dark gray message** (`#333`) with 14px font size + +Example output: +``` +[5:28:35 AM] Progress, not perfection. 🚀 +``` + +## Notes + +- This is a fun utility to add positivity to your development workflow +- The function uses `console.log` with CSS styling (works in modern browsers) +- Safe to use in development and can be easily removed for production if needed +- The timestamp format depends on the user's locale settings + +## License + +MIT