@blastlabs/utils 1.11.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.
Files changed (137) hide show
  1. package/README.md +267 -0
  2. package/dist/components/dev/ApiLogger.d.ts +136 -0
  3. package/dist/components/dev/ApiLogger.d.ts.map +1 -0
  4. package/dist/components/dev/ApiLogger.js +408 -0
  5. package/dist/components/dev/DevPanel.d.ts +32 -0
  6. package/dist/components/dev/DevPanel.d.ts.map +1 -0
  7. package/dist/components/dev/DevPanel.js +196 -0
  8. package/dist/components/dev/FormDevTools/FormDevTools.d.ts +136 -0
  9. package/dist/components/dev/FormDevTools/FormDevTools.d.ts.map +1 -0
  10. package/dist/components/dev/FormDevTools/FormDevTools.js +442 -0
  11. package/dist/components/dev/FormDevTools/index.d.ts +3 -0
  12. package/dist/components/dev/FormDevTools/index.d.ts.map +1 -0
  13. package/dist/components/dev/FormDevTools/index.js +1 -0
  14. package/dist/components/dev/FormDevTools/styles.d.ts +45 -0
  15. package/dist/components/dev/FormDevTools/styles.d.ts.map +1 -0
  16. package/dist/components/dev/FormDevTools/styles.js +197 -0
  17. package/dist/components/dev/IdSelector.d.ts +50 -0
  18. package/dist/components/dev/IdSelector.d.ts.map +1 -0
  19. package/dist/components/dev/IdSelector.js +129 -0
  20. package/dist/components/dev/WindowSizeDisplay.d.ts +44 -0
  21. package/dist/components/dev/WindowSizeDisplay.d.ts.map +1 -0
  22. package/dist/components/dev/WindowSizeDisplay.js +74 -0
  23. package/dist/components/dev/ZIndexDebugger.d.ts +32 -0
  24. package/dist/components/dev/ZIndexDebugger.d.ts.map +1 -0
  25. package/dist/components/dev/ZIndexDebugger.js +184 -0
  26. package/dist/components/dev/index.d.ts +15 -0
  27. package/dist/components/dev/index.d.ts.map +1 -0
  28. package/dist/components/dev/index.js +12 -0
  29. package/dist/components/index.d.ts +8 -0
  30. package/dist/components/index.d.ts.map +1 -0
  31. package/dist/components/index.js +7 -0
  32. package/dist/date/index.d.ts +64 -0
  33. package/dist/date/index.d.ts.map +1 -0
  34. package/dist/date/index.js +92 -0
  35. package/dist/date/index.test.d.ts +2 -0
  36. package/dist/date/index.test.d.ts.map +1 -0
  37. package/dist/date/index.test.js +166 -0
  38. package/dist/form/__tests__/formatter.test.d.ts +2 -0
  39. package/dist/form/__tests__/formatter.test.d.ts.map +1 -0
  40. package/dist/form/__tests__/formatter.test.js +74 -0
  41. package/dist/form/__tests__/helpers.test.d.ts +2 -0
  42. package/dist/form/__tests__/helpers.test.d.ts.map +1 -0
  43. package/dist/form/__tests__/helpers.test.js +42 -0
  44. package/dist/form/__tests__/validation.test.d.ts +2 -0
  45. package/dist/form/__tests__/validation.test.d.ts.map +1 -0
  46. package/dist/form/__tests__/validation.test.js +67 -0
  47. package/dist/form/formatter.d.ts +34 -0
  48. package/dist/form/formatter.d.ts.map +1 -0
  49. package/dist/form/formatter.js +76 -0
  50. package/dist/form/helpers.d.ts +16 -0
  51. package/dist/form/helpers.d.ts.map +1 -0
  52. package/dist/form/helpers.js +34 -0
  53. package/dist/form/index.d.ts +9 -0
  54. package/dist/form/index.d.ts.map +1 -0
  55. package/dist/form/index.js +11 -0
  56. package/dist/form/validation.d.ts +33 -0
  57. package/dist/form/validation.d.ts.map +1 -0
  58. package/dist/form/validation.js +56 -0
  59. package/dist/hooks/index.d.ts +19 -0
  60. package/dist/hooks/index.d.ts.map +1 -0
  61. package/dist/hooks/index.js +23 -0
  62. package/dist/hooks/useClickOutside.d.ts +49 -0
  63. package/dist/hooks/useClickOutside.d.ts.map +1 -0
  64. package/dist/hooks/useClickOutside.js +94 -0
  65. package/dist/hooks/useCopyToClipboard.d.ts +67 -0
  66. package/dist/hooks/useCopyToClipboard.d.ts.map +1 -0
  67. package/dist/hooks/useCopyToClipboard.js +79 -0
  68. package/dist/hooks/useDebounce.d.ts +47 -0
  69. package/dist/hooks/useDebounce.d.ts.map +1 -0
  70. package/dist/hooks/useDebounce.js +60 -0
  71. package/dist/hooks/useEventListener.d.ts +79 -0
  72. package/dist/hooks/useEventListener.d.ts.map +1 -0
  73. package/dist/hooks/useEventListener.js +33 -0
  74. package/dist/hooks/useIntersectionObserver.d.ts +109 -0
  75. package/dist/hooks/useIntersectionObserver.d.ts.map +1 -0
  76. package/dist/hooks/useIntersectionObserver.js +128 -0
  77. package/dist/hooks/useLocalStorage.d.ts +19 -0
  78. package/dist/hooks/useLocalStorage.d.ts.map +1 -0
  79. package/dist/hooks/useLocalStorage.js +91 -0
  80. package/dist/hooks/useMediaQuery.d.ts +56 -0
  81. package/dist/hooks/useMediaQuery.d.ts.map +1 -0
  82. package/dist/hooks/useMediaQuery.js +104 -0
  83. package/dist/hooks/usePrevious.d.ts +58 -0
  84. package/dist/hooks/usePrevious.d.ts.map +1 -0
  85. package/dist/hooks/usePrevious.js +67 -0
  86. package/dist/hooks/useSessionStorage.d.ts +19 -0
  87. package/dist/hooks/useSessionStorage.d.ts.map +1 -0
  88. package/dist/hooks/useSessionStorage.js +85 -0
  89. package/dist/hooks/useThrottle.d.ts +57 -0
  90. package/dist/hooks/useThrottle.d.ts.map +1 -0
  91. package/dist/hooks/useThrottle.js +80 -0
  92. package/dist/hooks/useToggle.d.ts +49 -0
  93. package/dist/hooks/useToggle.d.ts.map +1 -0
  94. package/dist/hooks/useToggle.js +56 -0
  95. package/dist/hooks/useWindowSize.d.ts +58 -0
  96. package/dist/hooks/useWindowSize.d.ts.map +1 -0
  97. package/dist/hooks/useWindowSize.js +79 -0
  98. package/dist/index.d.ts +6 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +17 -0
  101. package/dist/mock/form.d.ts +41 -0
  102. package/dist/mock/form.d.ts.map +1 -0
  103. package/dist/mock/form.js +195 -0
  104. package/dist/mock/generators.d.ts +112 -0
  105. package/dist/mock/generators.d.ts.map +1 -0
  106. package/dist/mock/generators.js +195 -0
  107. package/dist/mock/index.d.ts +8 -0
  108. package/dist/mock/index.d.ts.map +1 -0
  109. package/dist/mock/index.js +9 -0
  110. package/dist/number/format.d.ts +116 -0
  111. package/dist/number/format.d.ts.map +1 -0
  112. package/dist/number/format.js +165 -0
  113. package/dist/number/index.d.ts +7 -0
  114. package/dist/number/index.d.ts.map +1 -0
  115. package/dist/number/index.js +7 -0
  116. package/dist/string/__tests__/case.test.d.ts +2 -0
  117. package/dist/string/__tests__/case.test.d.ts.map +1 -0
  118. package/dist/string/__tests__/case.test.js +61 -0
  119. package/dist/string/__tests__/manipulation.test.d.ts +2 -0
  120. package/dist/string/__tests__/manipulation.test.d.ts.map +1 -0
  121. package/dist/string/__tests__/manipulation.test.js +109 -0
  122. package/dist/string/__tests__/validation.test.d.ts +2 -0
  123. package/dist/string/__tests__/validation.test.d.ts.map +1 -0
  124. package/dist/string/__tests__/validation.test.js +101 -0
  125. package/dist/string/case.d.ts +42 -0
  126. package/dist/string/case.d.ts.map +1 -0
  127. package/dist/string/case.js +71 -0
  128. package/dist/string/index.d.ts +9 -0
  129. package/dist/string/index.d.ts.map +1 -0
  130. package/dist/string/index.js +11 -0
  131. package/dist/string/manipulation.d.ts +61 -0
  132. package/dist/string/manipulation.d.ts.map +1 -0
  133. package/dist/string/manipulation.js +106 -0
  134. package/dist/string/validation.d.ts +79 -0
  135. package/dist/string/validation.d.ts.map +1 -0
  136. package/dist/string/validation.js +115 -0
  137. package/package.json +86 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 윈도우 크기 정보
3
+ */
4
+ export interface WindowSize {
5
+ /** 윈도우 너비 (픽셀) */
6
+ width: number;
7
+ /** 윈도우 높이 (픽셀) */
8
+ height: number;
9
+ }
10
+ /**
11
+ * 윈도우 크기를 추적하는 hook
12
+ *
13
+ * @returns 윈도우의 현재 너비와 높이
14
+ *
15
+ * @example
16
+ * // 기본 사용
17
+ * function ResponsiveComponent() {
18
+ * const { width, height } = useWindowSize();
19
+ *
20
+ * return (
21
+ * <div>
22
+ * Window size: {width} x {height}
23
+ * </div>
24
+ * );
25
+ * }
26
+ *
27
+ * @example
28
+ * // 반응형 레이아웃
29
+ * function AdaptiveLayout() {
30
+ * const { width } = useWindowSize();
31
+ *
32
+ * if (width < 768) {
33
+ * return <MobileLayout />;
34
+ * } else if (width < 1024) {
35
+ * return <TabletLayout />;
36
+ * } else {
37
+ * return <DesktopLayout />;
38
+ * }
39
+ * }
40
+ *
41
+ * @example
42
+ * // 캔버스 크기 조정
43
+ * function Canvas() {
44
+ * const { width, height } = useWindowSize();
45
+ * const canvasRef = useRef<HTMLCanvasElement>(null);
46
+ *
47
+ * useEffect(() => {
48
+ * if (canvasRef.current) {
49
+ * canvasRef.current.width = width;
50
+ * canvasRef.current.height = height;
51
+ * }
52
+ * }, [width, height]);
53
+ *
54
+ * return <canvas ref={canvasRef} />;
55
+ * }
56
+ */
57
+ export declare function useWindowSize(): WindowSize;
58
+ //# sourceMappingURL=useWindowSize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWindowSize.d.ts","sourceRoot":"","sources":["../../src/hooks/useWindowSize.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAoC1C"}
@@ -0,0 +1,79 @@
1
+ import { useState, useEffect } from 'react';
2
+ /**
3
+ * 윈도우 크기를 추적하는 hook
4
+ *
5
+ * @returns 윈도우의 현재 너비와 높이
6
+ *
7
+ * @example
8
+ * // 기본 사용
9
+ * function ResponsiveComponent() {
10
+ * const { width, height } = useWindowSize();
11
+ *
12
+ * return (
13
+ * <div>
14
+ * Window size: {width} x {height}
15
+ * </div>
16
+ * );
17
+ * }
18
+ *
19
+ * @example
20
+ * // 반응형 레이아웃
21
+ * function AdaptiveLayout() {
22
+ * const { width } = useWindowSize();
23
+ *
24
+ * if (width < 768) {
25
+ * return <MobileLayout />;
26
+ * } else if (width < 1024) {
27
+ * return <TabletLayout />;
28
+ * } else {
29
+ * return <DesktopLayout />;
30
+ * }
31
+ * }
32
+ *
33
+ * @example
34
+ * // 캔버스 크기 조정
35
+ * function Canvas() {
36
+ * const { width, height } = useWindowSize();
37
+ * const canvasRef = useRef<HTMLCanvasElement>(null);
38
+ *
39
+ * useEffect(() => {
40
+ * if (canvasRef.current) {
41
+ * canvasRef.current.width = width;
42
+ * canvasRef.current.height = height;
43
+ * }
44
+ * }, [width, height]);
45
+ *
46
+ * return <canvas ref={canvasRef} />;
47
+ * }
48
+ */
49
+ export function useWindowSize() {
50
+ // SSR 환경에서는 기본값 사용
51
+ const [windowSize, setWindowSize] = useState(() => {
52
+ if (typeof window === 'undefined') {
53
+ return { width: 0, height: 0 };
54
+ }
55
+ return {
56
+ width: window.innerWidth,
57
+ height: window.innerHeight,
58
+ };
59
+ });
60
+ useEffect(() => {
61
+ // SSR 환경에서는 이벤트 리스너 추가하지 않음
62
+ if (typeof window === 'undefined') {
63
+ return;
64
+ }
65
+ const handleResize = () => {
66
+ setWindowSize({
67
+ width: window.innerWidth,
68
+ height: window.innerHeight,
69
+ });
70
+ };
71
+ // 초기 크기 설정
72
+ handleResize();
73
+ window.addEventListener('resize', handleResize);
74
+ return () => {
75
+ window.removeEventListener('resize', handleResize);
76
+ };
77
+ }, []);
78
+ return windowSize;
79
+ }
@@ -0,0 +1,6 @@
1
+ export * from './date';
2
+ export * from './form';
3
+ export * from './string';
4
+ export * from './number';
5
+ export * from './mock';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,QAAQ,CAAC;AAGvB,cAAc,QAAQ,CAAC;AAGvB,cAAc,UAAU,CAAC;AAGzB,cAAc,UAAU,CAAC;AAGzB,cAAc,QAAQ,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ // Date utilities
2
+ export * from './date';
3
+ // Form utilities
4
+ export * from './form';
5
+ // String utilities
6
+ export * from './string';
7
+ // Number utilities
8
+ export * from './number';
9
+ // Mock data utilities
10
+ export * from './mock';
11
+ // React Hooks (import separately: 'goodchuck-utils/hooks')
12
+ // Note: Hooks are not exported from main entry to avoid React dependency for non-React users
13
+ // export * from './hooks';
14
+ // Array utilities (placeholder for future)
15
+ // export * from './array';
16
+ // Object utilities (placeholder for future)
17
+ // export * from './object';
@@ -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"}