Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ A comprehensive collection of TypeScript utility functions for modern web develo

## Features

- 🛠️ **Comprehensive**: String, object, cookie, number, validation, and common utilities
- 🛠️ **Comprehensive**: String, object, cookie, number, validation, format, 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
Expand All @@ -30,6 +30,7 @@ import {
numberUtil,
validationUtil,
commonUtil,
formatUtil,
} from "kr-corekit";

// String utilities
Expand Down Expand Up @@ -69,6 +70,8 @@ await commonUtil.sleep(1000); // Pauses execution for 1 second
// Cookie utilities
cookieUtil.setCookie("theme", "dark");
const theme = cookieUtil.getCookie("theme");
// Format utilities
const formattedPhone = formatUtil.formatPhoneNumber("01012345678"); // "010-1234-5678"
```

## API Reference
Expand All @@ -90,6 +93,10 @@ const theme = cookieUtil.getCookie("theme");
- `subtract(...numbers: number[]): number` - Calculates subtraction of numbers
- `multiply(...numbers: number[]): number` - Calculates multiplication of numbers

### FormatUtil

- `formatPhoneNumber(phone: string): string` - Formats a phone number string to a standard format (e.g., "010-1234-5678")

### ValidationUtil

- `checkEmail(email: string): boolean` - Validates email format
Expand Down
71 changes: 71 additions & 0 deletions package/formatUtil/formatPhoneNumber/index.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import { describe, expect, test } from "vitest";
import formatPhoneNumber from ".";

describe("formatPhoneNumber", () => {
describe("휴대폰 번호", () => {
test("11자리 휴대폰 번호에 하이픈을 올바르게 추가한다 (010)", () => {
expect(formatPhoneNumber("01012345678")).toBe("010-1234-5678");
});

test("11자리 휴대폰 번호에 하이픈을 올바르게 추가한다 (011)", () => {
expect(formatPhoneNumber("01198765432")).toBe("011-9876-5432");
});

test("중간에 공백이나 하이픈이 있어도 숫자를 제외하고 올바르게 처리한다", () => {
expect(formatPhoneNumber("010-1234 5678")).toBe("010-1234-5678");
});
});

describe("지역번호", () => {
test("서울 지역번호(02) 9자리에 하이픈을 올바르게 추가한다", () => {
expect(formatPhoneNumber("021234567")).toBe("02-123-4567");
});

test("서울 지역번호(02) 10자리에 하이픈을 올바르게 추가한다", () => {
expect(formatPhoneNumber("0212345678")).toBe("02-1234-5678");
});

test("서울 외 지역번호(031) 10자리에 하이픈을 올바르게 추가한다", () => {
expect(formatPhoneNumber("0311234567")).toBe("031-123-4567");
});

test("서울 외 지역번호(054) 10자리에 하이픈을 올바르게 추가한다", () => {
expect(formatPhoneNumber("0541234567")).toBe("054-123-4567");
});
});

describe("대표번호", () => {
test("8자리 대표번호(1588)에 하이픈을 올바르게 추가한다", () => {
expect(formatPhoneNumber("15881234")).toBe("1588-1234");
});

test("8자리 대표번호(1670)에 하이픈을 올바르게 추가한다", () => {
expect(formatPhoneNumber("16709876")).toBe("1670-9876");
});
});

describe("예외 케이스", () => {
test("빈 문자열을 입력하면 빈 문자열을 반환한다", () => {
expect(formatPhoneNumber("")).toBe("");
});

test("null 또는 undefined를 입력하면 빈 문자열을 반환한다", () => {
// @ts-ignore
expect(formatPhoneNumber(null)).toBe("");
// @ts-ignore
expect(formatPhoneNumber(undefined)).toBe("");
});

test("숫자가 아닌 문자가 포함된 경우, 해당 문자를 제거하고 포맷팅한다", () => {
expect(formatPhoneNumber("010-abcd-1234-efg-5678")).toBe("010-1234-5678");
});

test("어떤 형식에도 맞지 않는 짧은 길이라면 숫자만 반환한다", () => {
expect(formatPhoneNumber("12345")).toBe("12345");
});

test("어떤 형식에도 맞지 않는 긴 길이라면 숫자만 반환한다", () => {
expect(formatPhoneNumber("0101234567890")).toBe("0101234567890");
});
});
});
51 changes: 51 additions & 0 deletions package/formatUtil/formatPhoneNumber/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// 전화번호 형식 규칙을 데이터로 정의합니다.
const formatRules = [
// 서울 지역번호 (02) - 9자리
{
prefix: "02",
length: 9,
format: /(\d{2})(\d{3})(\d{4})/,
replacement: "$1-$2-$3",
},
// 서울 지역번호 (02) - 10자리
{
prefix: "02",
length: 10,
format: /(\d{2})(\d{4})(\d{4})/,
replacement: "$1-$2-$3",
},
// 8자리 대표번호 (1588, 1670 등)
{
length: 8,
format: /(\d{4})(\d{4})/,
replacement: "$1-$2",
},
// 일반 지역번호 (031, 054 등)
{
length: 10,
format: /(\d{3})(\d{3})(\d{4})/,
replacement: "$1-$2-$3",
},
// 휴대폰 번호
{
length: 11,
format: /(\d{3})(\d{4})(\d{4})/,
replacement: "$1-$2-$3",
},
];

export default function formatPhoneNumber(phoneNumber: string): string {
if (!phoneNumber) return "";

const digitsOnly = phoneNumber.replace(/\D/g, "");

const matched = formatRules.find(
(rule) =>
(!rule.prefix || digitsOnly.startsWith(rule.prefix)) &&
digitsOnly.length === rule.length
);

return matched
? digitsOnly.replace(matched.format, matched.replacement)
: digitsOnly;
}
1 change: 1 addition & 0 deletions package/formatUtil/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default as formatPhoneNumber } from "./formatPhoneNumber";
Loading