goodchuck-utils 1.7.1 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/dev/FormDevTools/FormDevTools.d.ts +88 -24
- package/dist/components/dev/FormDevTools/FormDevTools.d.ts.map +1 -1
- package/dist/components/dev/FormDevTools/FormDevTools.js +297 -56
- package/dist/components/dev/FormDevTools/styles.d.ts +2 -0
- package/dist/components/dev/FormDevTools/styles.d.ts.map +1 -1
- package/dist/components/dev/FormDevTools/styles.js +21 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/mock/form.d.ts +41 -0
- package/dist/mock/form.d.ts.map +1 -0
- package/dist/mock/form.js +195 -0
- package/dist/mock/generators.d.ts +112 -0
- package/dist/mock/generators.d.ts.map +1 -0
- package/dist/mock/generators.js +195 -0
- package/dist/mock/index.d.ts +8 -0
- package/dist/mock/index.d.ts.map +1 -0
- package/dist/mock/index.js +9 -0
- package/dist/number/format.d.ts +116 -0
- package/dist/number/format.d.ts.map +1 -0
- package/dist/number/format.js +165 -0
- package/dist/number/index.d.ts +7 -0
- package/dist/number/index.d.ts.map +1 -0
- package/dist/number/index.js +7 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4,6 +4,10 @@ export * from './date';
|
|
|
4
4
|
export * from './form';
|
|
5
5
|
// String utilities
|
|
6
6
|
export * from './string';
|
|
7
|
+
// Number utilities
|
|
8
|
+
export * from './number';
|
|
9
|
+
// Mock data utilities
|
|
10
|
+
export * from './mock';
|
|
7
11
|
// React Hooks (import separately: 'goodchuck-utils/hooks')
|
|
8
12
|
// Note: Hooks are not exported from main entry to avoid React dependency for non-React users
|
|
9
13
|
// export * from './hooks';
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Form Mock Data Generator
|
|
3
|
+
*
|
|
4
|
+
* 폼 필드 타입에 맞는 mock 데이터 자동 생성
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 폼 스키마로부터 mock 데이터 생성
|
|
8
|
+
* @param schema - 폼 스키마 (필드명과 타입 정보)
|
|
9
|
+
* @param count - 생성할 데이터 개수 (기본값: 1)
|
|
10
|
+
* @returns 생성된 mock 데이터 배열
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* generateFormMockData({
|
|
14
|
+
* name: { type: 'text' },
|
|
15
|
+
* email: { type: 'email' },
|
|
16
|
+
* age: { type: 'number', min: 18, max: 80 }
|
|
17
|
+
* }) // [{ name: "김민수", email: "user123@example.com", age: 25 }]
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* generateFormMockData({
|
|
21
|
+
* username: 'text',
|
|
22
|
+
* email: 'email',
|
|
23
|
+
* phone: 'tel'
|
|
24
|
+
* }, 5) // 5개의 mock 데이터 배열
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateFormMockData(schema: Record<string, any>, count?: number): Record<string, any>[];
|
|
27
|
+
/**
|
|
28
|
+
* react-hook-form의 defaultValues로부터 mock 데이터 생성
|
|
29
|
+
* @param defaultValues - react-hook-form의 defaultValues
|
|
30
|
+
* @param count - 생성할 데이터 개수 (기본값: 1)
|
|
31
|
+
* @returns 생성된 mock 데이터 배열
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* generateFromDefaultValues({
|
|
35
|
+
* username: '',
|
|
36
|
+
* email: '',
|
|
37
|
+
* age: 0
|
|
38
|
+
* }) // [{ username: "johnsmith", email: "user123@example.com", age: 25 }]
|
|
39
|
+
*/
|
|
40
|
+
export declare function generateFromDefaultValues(defaultValues: Record<string, any>, count?: number): Record<string, any>[];
|
|
41
|
+
//# sourceMappingURL=form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/mock/form.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4GH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,KAAK,GAAE,MAAU,GAChB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAiCvB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,KAAK,GAAE,MAAU,GAChB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAuBvB"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Form Mock Data Generator
|
|
3
|
+
*
|
|
4
|
+
* 폼 필드 타입에 맞는 mock 데이터 자동 생성
|
|
5
|
+
*/
|
|
6
|
+
import { generateKoreanName, generateEnglishName, generateEmail, generatePhoneNumber, generateAddress, generateDate, generateNumber, generateKoreanText, generateBoolean, generateFromArray, } from './generators';
|
|
7
|
+
/**
|
|
8
|
+
* 필드 타입별 mock 데이터 생성 맵핑
|
|
9
|
+
*/
|
|
10
|
+
const fieldTypeMap = {
|
|
11
|
+
// 이름 관련
|
|
12
|
+
name: () => generateKoreanName(),
|
|
13
|
+
username: () => generateEnglishName().toLowerCase().replace(/\s/g, ''),
|
|
14
|
+
fullName: () => generateKoreanName(),
|
|
15
|
+
firstName: () => generateKoreanName().substring(1),
|
|
16
|
+
lastName: () => generateKoreanName().substring(0, 1),
|
|
17
|
+
// 연락처 관련
|
|
18
|
+
email: (fieldName) => generateEmail(),
|
|
19
|
+
phone: () => generatePhoneNumber(),
|
|
20
|
+
phoneNumber: () => generatePhoneNumber(),
|
|
21
|
+
mobile: () => generatePhoneNumber(),
|
|
22
|
+
tel: () => generatePhoneNumber(),
|
|
23
|
+
// 주소 관련
|
|
24
|
+
address: () => generateAddress(),
|
|
25
|
+
zipCode: () => String(generateNumber(10000, 99999)),
|
|
26
|
+
postalCode: () => String(generateNumber(10000, 99999)),
|
|
27
|
+
// 날짜 관련
|
|
28
|
+
date: () => generateDate(),
|
|
29
|
+
birthDate: () => generateDate('1950-01-01', '2010-12-31'),
|
|
30
|
+
birthday: () => generateDate('1950-01-01', '2010-12-31'),
|
|
31
|
+
// 숫자 관련
|
|
32
|
+
age: () => generateNumber(18, 80),
|
|
33
|
+
price: () => generateNumber(1000, 1000000),
|
|
34
|
+
amount: () => generateNumber(1, 1000),
|
|
35
|
+
quantity: () => generateNumber(1, 100),
|
|
36
|
+
count: () => generateNumber(0, 100),
|
|
37
|
+
// 텍스트 관련
|
|
38
|
+
title: () => generateKoreanText(10),
|
|
39
|
+
content: () => generateKoreanText(50),
|
|
40
|
+
description: () => generateKoreanText(30),
|
|
41
|
+
message: () => generateKoreanText(20),
|
|
42
|
+
comment: () => generateKoreanText(15),
|
|
43
|
+
note: () => generateKoreanText(20),
|
|
44
|
+
// 불린 관련
|
|
45
|
+
isActive: () => generateBoolean(),
|
|
46
|
+
enabled: () => generateBoolean(),
|
|
47
|
+
checked: () => generateBoolean(),
|
|
48
|
+
agree: () => generateBoolean(),
|
|
49
|
+
accept: () => generateBoolean(),
|
|
50
|
+
// 기본값
|
|
51
|
+
default: (fieldName) => {
|
|
52
|
+
// 필드명에 따라 추론
|
|
53
|
+
const lowerName = fieldName.toLowerCase();
|
|
54
|
+
if (lowerName.includes('email'))
|
|
55
|
+
return generateEmail();
|
|
56
|
+
if (lowerName.includes('phone') || lowerName.includes('tel') || lowerName.includes('mobile'))
|
|
57
|
+
return generatePhoneNumber();
|
|
58
|
+
if (lowerName.includes('name'))
|
|
59
|
+
return generateKoreanName();
|
|
60
|
+
if (lowerName.includes('address'))
|
|
61
|
+
return generateAddress();
|
|
62
|
+
if (lowerName.includes('date') || lowerName.includes('birth'))
|
|
63
|
+
return generateDate();
|
|
64
|
+
if (lowerName.includes('age') || lowerName.includes('count') || lowerName.includes('quantity'))
|
|
65
|
+
return generateNumber(1, 100);
|
|
66
|
+
if (lowerName.includes('price') || lowerName.includes('amount') || lowerName.includes('cost'))
|
|
67
|
+
return generateNumber(1000, 100000);
|
|
68
|
+
if (lowerName.includes('is') || lowerName.includes('has') || lowerName.includes('can'))
|
|
69
|
+
return generateBoolean();
|
|
70
|
+
return generateKoreanText(10);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* 필드 타입을 추론하여 mock 데이터 생성
|
|
75
|
+
* @param fieldName - 필드 이름
|
|
76
|
+
* @param fieldType - 필드 타입 (선택)
|
|
77
|
+
* @param options - 추가 옵션
|
|
78
|
+
* @returns 생성된 mock 데이터
|
|
79
|
+
*/
|
|
80
|
+
function inferAndGenerate(fieldName, fieldType, options) {
|
|
81
|
+
const lowerName = fieldName.toLowerCase();
|
|
82
|
+
const lowerType = fieldType?.toLowerCase() || '';
|
|
83
|
+
// 타입 기반 생성
|
|
84
|
+
if (lowerType.includes('email'))
|
|
85
|
+
return generateEmail();
|
|
86
|
+
if (lowerType.includes('tel') || lowerType.includes('phone'))
|
|
87
|
+
return generatePhoneNumber();
|
|
88
|
+
if (lowerType.includes('date'))
|
|
89
|
+
return generateDate();
|
|
90
|
+
if (lowerType.includes('number') || lowerType.includes('int'))
|
|
91
|
+
return generateNumber(options?.min, options?.max);
|
|
92
|
+
if (lowerType.includes('boolean') || lowerType.includes('bool'))
|
|
93
|
+
return generateBoolean();
|
|
94
|
+
if (lowerType.includes('text') || lowerType.includes('string')) {
|
|
95
|
+
return options?.maxLength ? generateKoreanText(Math.min(options.maxLength, 50)) : generateKoreanText(10);
|
|
96
|
+
}
|
|
97
|
+
// 필드명 기반 생성
|
|
98
|
+
const generator = fieldTypeMap[lowerName] || fieldTypeMap.default;
|
|
99
|
+
return generator(fieldName, options);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 폼 스키마로부터 mock 데이터 생성
|
|
103
|
+
* @param schema - 폼 스키마 (필드명과 타입 정보)
|
|
104
|
+
* @param count - 생성할 데이터 개수 (기본값: 1)
|
|
105
|
+
* @returns 생성된 mock 데이터 배열
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* generateFormMockData({
|
|
109
|
+
* name: { type: 'text' },
|
|
110
|
+
* email: { type: 'email' },
|
|
111
|
+
* age: { type: 'number', min: 18, max: 80 }
|
|
112
|
+
* }) // [{ name: "김민수", email: "user123@example.com", age: 25 }]
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* generateFormMockData({
|
|
116
|
+
* username: 'text',
|
|
117
|
+
* email: 'email',
|
|
118
|
+
* phone: 'tel'
|
|
119
|
+
* }, 5) // 5개의 mock 데이터 배열
|
|
120
|
+
*/
|
|
121
|
+
export function generateFormMockData(schema, count = 1) {
|
|
122
|
+
const results = [];
|
|
123
|
+
for (let i = 0; i < count; i++) {
|
|
124
|
+
const data = {};
|
|
125
|
+
for (const [fieldName, fieldConfig] of Object.entries(schema)) {
|
|
126
|
+
if (typeof fieldConfig === 'string') {
|
|
127
|
+
// 간단한 타입 문자열인 경우
|
|
128
|
+
data[fieldName] = inferAndGenerate(fieldName, fieldConfig);
|
|
129
|
+
}
|
|
130
|
+
else if (typeof fieldConfig === 'object' && fieldConfig !== null) {
|
|
131
|
+
// 객체 형태인 경우
|
|
132
|
+
if (fieldConfig.type) {
|
|
133
|
+
data[fieldName] = inferAndGenerate(fieldName, fieldConfig.type, fieldConfig);
|
|
134
|
+
}
|
|
135
|
+
else if (fieldConfig.enum) {
|
|
136
|
+
// enum 값이 있는 경우
|
|
137
|
+
data[fieldName] = generateFromArray(fieldConfig.enum);
|
|
138
|
+
}
|
|
139
|
+
else if (fieldConfig.default !== undefined) {
|
|
140
|
+
// default 값이 있는 경우
|
|
141
|
+
data[fieldName] = fieldConfig.default;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
data[fieldName] = inferAndGenerate(fieldName, undefined, fieldConfig);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// 그 외의 경우 필드명으로 추론
|
|
149
|
+
data[fieldName] = inferAndGenerate(fieldName);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
results.push(data);
|
|
153
|
+
}
|
|
154
|
+
return results;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* react-hook-form의 defaultValues로부터 mock 데이터 생성
|
|
158
|
+
* @param defaultValues - react-hook-form의 defaultValues
|
|
159
|
+
* @param count - 생성할 데이터 개수 (기본값: 1)
|
|
160
|
+
* @returns 생성된 mock 데이터 배열
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* generateFromDefaultValues({
|
|
164
|
+
* username: '',
|
|
165
|
+
* email: '',
|
|
166
|
+
* age: 0
|
|
167
|
+
* }) // [{ username: "johnsmith", email: "user123@example.com", age: 25 }]
|
|
168
|
+
*/
|
|
169
|
+
export function generateFromDefaultValues(defaultValues, count = 1) {
|
|
170
|
+
const schema = {};
|
|
171
|
+
// defaultValues의 타입을 추론하여 schema 생성
|
|
172
|
+
for (const [fieldName, defaultValue] of Object.entries(defaultValues)) {
|
|
173
|
+
if (typeof defaultValue === 'string') {
|
|
174
|
+
if (defaultValue === '') {
|
|
175
|
+
schema[fieldName] = { type: 'text' };
|
|
176
|
+
}
|
|
177
|
+
else if (defaultValue.includes('@')) {
|
|
178
|
+
schema[fieldName] = { type: 'email' };
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
schema[fieldName] = { type: 'text', default: defaultValue };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else if (typeof defaultValue === 'number') {
|
|
185
|
+
schema[fieldName] = { type: 'number', default: defaultValue };
|
|
186
|
+
}
|
|
187
|
+
else if (typeof defaultValue === 'boolean') {
|
|
188
|
+
schema[fieldName] = { type: 'boolean', default: defaultValue };
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
schema[fieldName] = { type: 'text' };
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return generateFormMockData(schema, count);
|
|
195
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Data Generators
|
|
3
|
+
*
|
|
4
|
+
* 폼 필드 타입에 맞는 mock 데이터 생성 유틸리티
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 한국어 이름 생성
|
|
8
|
+
* @param gender - 성별 ('male' | 'female' | 'random', 기본값: 'random')
|
|
9
|
+
* @returns 한국어 이름
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* generateKoreanName() // "김민수"
|
|
13
|
+
* generateKoreanName('female') // "이지은"
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateKoreanName(gender?: 'male' | 'female' | 'random'): string;
|
|
16
|
+
/**
|
|
17
|
+
* 영어 이름 생성
|
|
18
|
+
* @param gender - 성별 ('male' | 'female' | 'random', 기본값: 'random')
|
|
19
|
+
* @returns 영어 이름
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* generateEnglishName() // "John Smith"
|
|
23
|
+
* generateEnglishName('female') // "Emily Johnson"
|
|
24
|
+
*/
|
|
25
|
+
export declare function generateEnglishName(gender?: 'male' | 'female' | 'random'): string;
|
|
26
|
+
/**
|
|
27
|
+
* 이메일 생성
|
|
28
|
+
* @param name - 이름 (선택, 없으면 랜덤 생성)
|
|
29
|
+
* @param domain - 도메인 (기본값: 'example.com')
|
|
30
|
+
* @returns 이메일 주소
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* generateEmail() // "user123@example.com"
|
|
34
|
+
* generateEmail('홍길동') // "honggildong@example.com"
|
|
35
|
+
*/
|
|
36
|
+
export declare function generateEmail(name?: string, domain?: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* 전화번호 생성 (한국 형식)
|
|
39
|
+
* @returns 전화번호 (010-1234-5678 형식)
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* generatePhoneNumber() // "010-1234-5678"
|
|
43
|
+
*/
|
|
44
|
+
export declare function generatePhoneNumber(): string;
|
|
45
|
+
/**
|
|
46
|
+
* 주소 생성 (한국 형식)
|
|
47
|
+
* @returns 한국 주소
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* generateAddress() // "서울특별시 강남구 테헤란로 123"
|
|
51
|
+
*/
|
|
52
|
+
export declare function generateAddress(): string;
|
|
53
|
+
/**
|
|
54
|
+
* 날짜 생성 (범위 내)
|
|
55
|
+
* @param startDate - 시작 날짜 (기본값: 1년 전)
|
|
56
|
+
* @param endDate - 종료 날짜 (기본값: 오늘)
|
|
57
|
+
* @returns 날짜 문자열 (YYYY-MM-DD)
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* generateDate() // "2023-06-15"
|
|
61
|
+
* generateDate('2024-01-01', '2024-12-31') // "2024-08-20"
|
|
62
|
+
*/
|
|
63
|
+
export declare function generateDate(startDate?: string, endDate?: string): string;
|
|
64
|
+
/**
|
|
65
|
+
* 숫자 생성 (범위 내)
|
|
66
|
+
* @param min - 최소값 (기본값: 0)
|
|
67
|
+
* @param max - 최대값 (기본값: 100)
|
|
68
|
+
* @returns 랜덤 숫자
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* generateNumber() // 42
|
|
72
|
+
* generateNumber(1, 10) // 7
|
|
73
|
+
*/
|
|
74
|
+
export declare function generateNumber(min?: number, max?: number): number;
|
|
75
|
+
/**
|
|
76
|
+
* 텍스트 생성 (한글)
|
|
77
|
+
* @param length - 길이 (기본값: 10)
|
|
78
|
+
* @returns 랜덤 한글 텍스트
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* generateKoreanText() // "안녕하세요반갑습니다"
|
|
82
|
+
* generateKoreanText(5) // "테스트데이터"
|
|
83
|
+
*/
|
|
84
|
+
export declare function generateKoreanText(length?: number): string;
|
|
85
|
+
/**
|
|
86
|
+
* 텍스트 생성 (영문)
|
|
87
|
+
* @param length - 길이 (기본값: 10)
|
|
88
|
+
* @returns 랜덤 영문 텍스트
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* generateEnglishText() // "loremipsum"
|
|
92
|
+
* generateEnglishText(5) // "testd"
|
|
93
|
+
*/
|
|
94
|
+
export declare function generateEnglishText(length?: number): string;
|
|
95
|
+
/**
|
|
96
|
+
* 불린 값 생성
|
|
97
|
+
* @returns 랜덤 boolean
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* generateBoolean() // true
|
|
101
|
+
*/
|
|
102
|
+
export declare function generateBoolean(): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* 배열에서 랜덤 선택
|
|
105
|
+
* @param array - 선택할 배열
|
|
106
|
+
* @returns 랜덤으로 선택된 요소
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* generateFromArray(['red', 'blue', 'green']) // "blue"
|
|
110
|
+
*/
|
|
111
|
+
export declare function generateFromArray<T>(array: T[]): T;
|
|
112
|
+
//# sourceMappingURL=generators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../src/mock/generators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,MAAM,GAAG,QAAQ,GAAG,QAAmB,GAAG,MAAM,CAY1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,MAAM,GAAG,QAAQ,GAAG,QAAmB,GAAG,MAAM,CAY3F;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,GAAE,MAAsB,GAAG,MAAM,CAqBnF;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAM5C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAWxC;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAWzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAU,EAAE,GAAG,GAAE,MAAY,GAAG,MAAM,CAEzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAO9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAO/D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAElD"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Data Generators
|
|
3
|
+
*
|
|
4
|
+
* 폼 필드 타입에 맞는 mock 데이터 생성 유틸리티
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 한국어 이름 생성
|
|
8
|
+
* @param gender - 성별 ('male' | 'female' | 'random', 기본값: 'random')
|
|
9
|
+
* @returns 한국어 이름
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* generateKoreanName() // "김민수"
|
|
13
|
+
* generateKoreanName('female') // "이지은"
|
|
14
|
+
*/
|
|
15
|
+
export function generateKoreanName(gender = 'random') {
|
|
16
|
+
const surnames = ['김', '이', '박', '최', '정', '강', '조', '윤', '장', '임', '한', '오', '서', '신', '권', '황', '안', '송', '전', '홍'];
|
|
17
|
+
const maleNames = ['민수', '준호', '성호', '지훈', '현우', '동현', '민준', '건우', '준영', '상우', '영수', '성민', '준혁', '태현', '승현'];
|
|
18
|
+
const femaleNames = ['지은', '수진', '미영', '혜진', '은지', '서연', '민지', '예은', '지원', '유진', '소영', '지현', '수빈', '하은', '서윤'];
|
|
19
|
+
const surname = surnames[Math.floor(Math.random() * surnames.length)];
|
|
20
|
+
const selectedGender = gender === 'random' ? (Math.random() > 0.5 ? 'male' : 'female') : gender;
|
|
21
|
+
const name = selectedGender === 'male'
|
|
22
|
+
? maleNames[Math.floor(Math.random() * maleNames.length)]
|
|
23
|
+
: femaleNames[Math.floor(Math.random() * femaleNames.length)];
|
|
24
|
+
return `${surname}${name}`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 영어 이름 생성
|
|
28
|
+
* @param gender - 성별 ('male' | 'female' | 'random', 기본값: 'random')
|
|
29
|
+
* @returns 영어 이름
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* generateEnglishName() // "John Smith"
|
|
33
|
+
* generateEnglishName('female') // "Emily Johnson"
|
|
34
|
+
*/
|
|
35
|
+
export function generateEnglishName(gender = 'random') {
|
|
36
|
+
const maleFirstNames = ['James', 'John', 'Robert', 'Michael', 'William', 'David', 'Richard', 'Joseph', 'Thomas', 'Christopher'];
|
|
37
|
+
const femaleFirstNames = ['Mary', 'Patricia', 'Jennifer', 'Linda', 'Elizabeth', 'Barbara', 'Susan', 'Jessica', 'Sarah', 'Karen'];
|
|
38
|
+
const lastNames = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis', 'Rodriguez', 'Martinez'];
|
|
39
|
+
const selectedGender = gender === 'random' ? (Math.random() > 0.5 ? 'male' : 'female') : gender;
|
|
40
|
+
const firstName = selectedGender === 'male'
|
|
41
|
+
? maleFirstNames[Math.floor(Math.random() * maleFirstNames.length)]
|
|
42
|
+
: femaleFirstNames[Math.floor(Math.random() * femaleFirstNames.length)];
|
|
43
|
+
const lastName = lastNames[Math.floor(Math.random() * lastNames.length)];
|
|
44
|
+
return `${firstName} ${lastName}`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 이메일 생성
|
|
48
|
+
* @param name - 이름 (선택, 없으면 랜덤 생성)
|
|
49
|
+
* @param domain - 도메인 (기본값: 'example.com')
|
|
50
|
+
* @returns 이메일 주소
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* generateEmail() // "user123@example.com"
|
|
54
|
+
* generateEmail('홍길동') // "honggildong@example.com"
|
|
55
|
+
*/
|
|
56
|
+
export function generateEmail(name, domain = 'example.com') {
|
|
57
|
+
if (name) {
|
|
58
|
+
// 한글 이름을 영문으로 변환 (간단한 변환)
|
|
59
|
+
const nameMap = {
|
|
60
|
+
'김': 'kim', '이': 'lee', '박': 'park', '최': 'choi', '정': 'jung',
|
|
61
|
+
'강': 'kang', '조': 'cho', '윤': 'yoon', '장': 'jang', '임': 'lim'
|
|
62
|
+
};
|
|
63
|
+
let emailName = name.toLowerCase()
|
|
64
|
+
.replace(/[가-힣]/g, (char) => {
|
|
65
|
+
// 간단한 로마자 변환 (실제로는 더 복잡한 변환이 필요)
|
|
66
|
+
return nameMap[char] || 'user';
|
|
67
|
+
})
|
|
68
|
+
.replace(/[^a-z0-9]/g, '')
|
|
69
|
+
.substring(0, 20) || 'user';
|
|
70
|
+
if (emailName.length < 3)
|
|
71
|
+
emailName = 'user';
|
|
72
|
+
return `${emailName}${Math.floor(Math.random() * 1000)}@${domain}`;
|
|
73
|
+
}
|
|
74
|
+
const randomString = Math.random().toString(36).substring(2, 10);
|
|
75
|
+
return `${randomString}@${domain}`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 전화번호 생성 (한국 형식)
|
|
79
|
+
* @returns 전화번호 (010-1234-5678 형식)
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* generatePhoneNumber() // "010-1234-5678"
|
|
83
|
+
*/
|
|
84
|
+
export function generatePhoneNumber() {
|
|
85
|
+
const prefixes = ['010', '011', '016', '017', '018', '019'];
|
|
86
|
+
const prefix = prefixes[Math.floor(Math.random() * prefixes.length)];
|
|
87
|
+
const middle = Math.floor(Math.random() * 9000) + 1000;
|
|
88
|
+
const last = Math.floor(Math.random() * 9000) + 1000;
|
|
89
|
+
return `${prefix}-${middle}-${last}`;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 주소 생성 (한국 형식)
|
|
93
|
+
* @returns 한국 주소
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* generateAddress() // "서울특별시 강남구 테헤란로 123"
|
|
97
|
+
*/
|
|
98
|
+
export function generateAddress() {
|
|
99
|
+
const cities = ['서울특별시', '부산광역시', '대구광역시', '인천광역시', '광주광역시', '대전광역시', '울산광역시'];
|
|
100
|
+
const districts = ['강남구', '강동구', '강북구', '강서구', '관악구', '광진구', '구로구', '금천구', '노원구', '도봉구'];
|
|
101
|
+
const streets = ['테헤란로', '강남대로', '서초대로', '올림픽대로', '반포대로', '한강대로', '을지로', '종로', '명동길', '이태원로'];
|
|
102
|
+
const city = cities[Math.floor(Math.random() * cities.length)];
|
|
103
|
+
const district = districts[Math.floor(Math.random() * districts.length)];
|
|
104
|
+
const street = streets[Math.floor(Math.random() * streets.length)];
|
|
105
|
+
const number = Math.floor(Math.random() * 999) + 1;
|
|
106
|
+
return `${city} ${district} ${street} ${number}`;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 날짜 생성 (범위 내)
|
|
110
|
+
* @param startDate - 시작 날짜 (기본값: 1년 전)
|
|
111
|
+
* @param endDate - 종료 날짜 (기본값: 오늘)
|
|
112
|
+
* @returns 날짜 문자열 (YYYY-MM-DD)
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* generateDate() // "2023-06-15"
|
|
116
|
+
* generateDate('2024-01-01', '2024-12-31') // "2024-08-20"
|
|
117
|
+
*/
|
|
118
|
+
export function generateDate(startDate, endDate) {
|
|
119
|
+
const start = startDate ? new Date(startDate).getTime() : Date.now() - 365 * 24 * 60 * 60 * 1000;
|
|
120
|
+
const end = endDate ? new Date(endDate).getTime() : Date.now();
|
|
121
|
+
const randomTime = start + Math.random() * (end - start);
|
|
122
|
+
const date = new Date(randomTime);
|
|
123
|
+
const year = date.getFullYear();
|
|
124
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
125
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
126
|
+
return `${year}-${month}-${day}`;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 숫자 생성 (범위 내)
|
|
130
|
+
* @param min - 최소값 (기본값: 0)
|
|
131
|
+
* @param max - 최대값 (기본값: 100)
|
|
132
|
+
* @returns 랜덤 숫자
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* generateNumber() // 42
|
|
136
|
+
* generateNumber(1, 10) // 7
|
|
137
|
+
*/
|
|
138
|
+
export function generateNumber(min = 0, max = 100) {
|
|
139
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 텍스트 생성 (한글)
|
|
143
|
+
* @param length - 길이 (기본값: 10)
|
|
144
|
+
* @returns 랜덤 한글 텍스트
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* generateKoreanText() // "안녕하세요반갑습니다"
|
|
148
|
+
* generateKoreanText(5) // "테스트데이터"
|
|
149
|
+
*/
|
|
150
|
+
export function generateKoreanText(length = 10) {
|
|
151
|
+
const chars = '가나다라마바사아자차카타파하거너더러머버서어저처커터퍼허고노도로모보소오조초코토포호구누두루무부수우주추쿠투푸후그느드르므브스으즈츠크트프흐기니디리미비시이지치키티피히';
|
|
152
|
+
let result = '';
|
|
153
|
+
for (let i = 0; i < length; i++) {
|
|
154
|
+
result += chars[Math.floor(Math.random() * chars.length)];
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 텍스트 생성 (영문)
|
|
160
|
+
* @param length - 길이 (기본값: 10)
|
|
161
|
+
* @returns 랜덤 영문 텍스트
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* generateEnglishText() // "loremipsum"
|
|
165
|
+
* generateEnglishText(5) // "testd"
|
|
166
|
+
*/
|
|
167
|
+
export function generateEnglishText(length = 10) {
|
|
168
|
+
const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
169
|
+
let result = '';
|
|
170
|
+
for (let i = 0; i < length; i++) {
|
|
171
|
+
result += chars[Math.floor(Math.random() * chars.length)];
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 불린 값 생성
|
|
177
|
+
* @returns 랜덤 boolean
|
|
178
|
+
*
|
|
179
|
+
* @example
|
|
180
|
+
* generateBoolean() // true
|
|
181
|
+
*/
|
|
182
|
+
export function generateBoolean() {
|
|
183
|
+
return Math.random() > 0.5;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* 배열에서 랜덤 선택
|
|
187
|
+
* @param array - 선택할 배열
|
|
188
|
+
* @returns 랜덤으로 선택된 요소
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* generateFromArray(['red', 'blue', 'green']) // "blue"
|
|
192
|
+
*/
|
|
193
|
+
export function generateFromArray(array) {
|
|
194
|
+
return array[Math.floor(Math.random() * array.length)];
|
|
195
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mock/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,cAAc,CAAC;AAG7B,cAAc,QAAQ,CAAC"}
|