@ehfuse/forma 1.0.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/LICENSE +42 -0
- package/README.md +180 -0
- package/dist/contexts/GlobalFormContext.d.ts +66 -0
- package/dist/contexts/GlobalFormContext.d.ts.map +1 -0
- package/dist/contexts/GlobalFormContext.js +110 -0
- package/dist/contexts/GlobalFormContext.js.map +1 -0
- package/dist/core/FieldStore.d.ts +100 -0
- package/dist/core/FieldStore.d.ts.map +1 -0
- package/dist/core/FieldStore.js +264 -0
- package/dist/core/FieldStore.js.map +1 -0
- package/dist/core/index.d.ts +29 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +36 -0
- package/dist/core/index.js.map +1 -0
- package/dist/esm/contexts/GlobalFormContext.d.ts +66 -0
- package/dist/esm/contexts/GlobalFormContext.d.ts.map +1 -0
- package/dist/esm/contexts/GlobalFormContext.js +106 -0
- package/dist/esm/contexts/GlobalFormContext.js.map +1 -0
- package/dist/esm/core/FieldStore.d.ts +100 -0
- package/dist/esm/core/FieldStore.d.ts.map +1 -0
- package/dist/esm/core/FieldStore.js +260 -0
- package/dist/esm/core/FieldStore.js.map +1 -0
- package/dist/esm/core/index.d.ts +29 -0
- package/dist/esm/core/index.d.ts.map +1 -0
- package/dist/esm/core/index.js +32 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/hooks/useForm.d.ts +67 -0
- package/dist/esm/hooks/useForm.d.ts.map +1 -0
- package/dist/esm/hooks/useForm.js +287 -0
- package/dist/esm/hooks/useForm.js.map +1 -0
- package/dist/esm/hooks/useGlobalForm.d.ts +45 -0
- package/dist/esm/hooks/useGlobalForm.d.ts.map +1 -0
- package/dist/esm/hooks/useGlobalForm.js +61 -0
- package/dist/esm/hooks/useGlobalForm.js.map +1 -0
- package/dist/esm/hooks/useRegisterGlobalForm.d.ts +55 -0
- package/dist/esm/hooks/useRegisterGlobalForm.d.ts.map +1 -0
- package/dist/esm/hooks/useRegisterGlobalForm.js +64 -0
- package/dist/esm/hooks/useRegisterGlobalForm.js.map +1 -0
- package/dist/esm/index.d.ts +53 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +62 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types/form.d.ts +120 -0
- package/dist/esm/types/form.d.ts.map +1 -0
- package/dist/esm/types/form.js +29 -0
- package/dist/esm/types/form.js.map +1 -0
- package/dist/esm/types/globalForm.d.ts +265 -0
- package/dist/esm/types/globalForm.d.ts.map +1 -0
- package/dist/esm/types/globalForm.js +39 -0
- package/dist/esm/types/globalForm.js.map +1 -0
- package/dist/esm/types/index.d.ts +31 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +30 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/utils/dotNotation.d.ts +58 -0
- package/dist/esm/utils/dotNotation.d.ts.map +1 -0
- package/dist/esm/utils/dotNotation.js +100 -0
- package/dist/esm/utils/dotNotation.js.map +1 -0
- package/dist/esm/utils/index.d.ts +27 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +27 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/hooks/useForm.d.ts +67 -0
- package/dist/hooks/useForm.d.ts.map +1 -0
- package/dist/hooks/useForm.js +290 -0
- package/dist/hooks/useForm.js.map +1 -0
- package/dist/hooks/useGlobalForm.d.ts +45 -0
- package/dist/hooks/useGlobalForm.d.ts.map +1 -0
- package/dist/hooks/useGlobalForm.js +64 -0
- package/dist/hooks/useGlobalForm.js.map +1 -0
- package/dist/hooks/useRegisterGlobalForm.d.ts +55 -0
- package/dist/hooks/useRegisterGlobalForm.d.ts.map +1 -0
- package/dist/hooks/useRegisterGlobalForm.js +67 -0
- package/dist/hooks/useRegisterGlobalForm.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/types/form.d.ts +120 -0
- package/dist/types/form.d.ts.map +1 -0
- package/dist/types/form.js +30 -0
- package/dist/types/form.js.map +1 -0
- package/dist/types/globalForm.d.ts +265 -0
- package/dist/types/globalForm.d.ts.map +1 -0
- package/dist/types/globalForm.js +43 -0
- package/dist/types/globalForm.js.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +34 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/dotNotation.d.ts +58 -0
- package/dist/utils/dotNotation.d.ts.map +1 -0
- package/dist/utils/dotNotation.js +104 -0
- package/dist/utils/dotNotation.js.map +1 -0
- package/dist/utils/index.d.ts +27 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +32 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FieldStore.ts
|
|
3
|
+
*
|
|
4
|
+
* Forma - 개별 필드 상태 관리 핵심 클래스 / Core class for individual field state management
|
|
5
|
+
* 선택적 구독과 성능 최적화 지원 / Supports selective subscriptions and performance optimization
|
|
6
|
+
*
|
|
7
|
+
* @license MIT License
|
|
8
|
+
* @copyright 2025 KIM YOUNG JIN (Kim Young Jin)
|
|
9
|
+
* @author KIM YOUNG JIN (ehfuse@gmail.com)
|
|
10
|
+
*
|
|
11
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
12
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
13
|
+
* in the Software without restriction, including without limitation the rights
|
|
14
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
15
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
16
|
+
* furnished to do so, subject to the following conditions:
|
|
17
|
+
*
|
|
18
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
19
|
+
* copies or substantial portions of the Software.
|
|
20
|
+
*
|
|
21
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
22
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
23
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
24
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
25
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
26
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
27
|
+
* SOFTWARE.
|
|
28
|
+
*/
|
|
29
|
+
import { getNestedValue, setNestedValue } from "../utils/dotNotation";
|
|
30
|
+
/**
|
|
31
|
+
* 개별 필드 상태 관리 Store / Individual field state management store
|
|
32
|
+
* 선택적 구독과 성능 최적화를 위한 핵심 클래스
|
|
33
|
+
* Core class for selective subscriptions and performance optimization
|
|
34
|
+
*
|
|
35
|
+
* @template T 폼 데이터의 타입 / Form data type
|
|
36
|
+
*/
|
|
37
|
+
export class FieldStore {
|
|
38
|
+
constructor(initialValues) {
|
|
39
|
+
this.fields = new Map();
|
|
40
|
+
this.dotNotationListeners = new Map(); // Dot notation 구독자 / Dot notation subscribers
|
|
41
|
+
this.globalListeners = new Set();
|
|
42
|
+
this.initialValues = { ...initialValues };
|
|
43
|
+
// 초기값으로 필드 초기화 / Initialize fields with initial values
|
|
44
|
+
Object.keys(initialValues).forEach((key) => {
|
|
45
|
+
this.fields.set(key, {
|
|
46
|
+
value: initialValues[key],
|
|
47
|
+
listeners: new Set(),
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 특정 필드 값 가져오기 / Get specific field value
|
|
53
|
+
* Dot notation 지원 / Supports dot notation
|
|
54
|
+
* @param fieldName 필드명 또는 dot notation 경로 / Field name or dot notation path
|
|
55
|
+
* @returns 필드 값 / Field value
|
|
56
|
+
*/
|
|
57
|
+
getValue(fieldName) {
|
|
58
|
+
const fieldNameStr = fieldName;
|
|
59
|
+
// dot notation이 포함된 경우 중첩 객체 접근 / Access nested object for dot notation
|
|
60
|
+
if (fieldNameStr.includes(".")) {
|
|
61
|
+
const values = this.getValues();
|
|
62
|
+
return getNestedValue(values, fieldNameStr);
|
|
63
|
+
}
|
|
64
|
+
// 일반 필드 접근 / Regular field access
|
|
65
|
+
const field = this.fields.get(fieldName);
|
|
66
|
+
return field?.value;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 특정 필드 구독 / Subscribe to specific field
|
|
70
|
+
* Dot notation 지원 / Supports dot notation
|
|
71
|
+
* @param fieldName 필드명 또는 dot notation 경로 / Field name or dot notation path
|
|
72
|
+
* @param listener 변경 시 호출될 콜백 / Callback to call on change
|
|
73
|
+
* @returns 구독 해제 함수 / Unsubscribe function
|
|
74
|
+
*/
|
|
75
|
+
subscribe(fieldName, listener) {
|
|
76
|
+
const fieldNameStr = fieldName;
|
|
77
|
+
// dot notation이 포함된 경우 정확한 경로로 구독 / Subscribe to exact path for dot notation
|
|
78
|
+
if (fieldNameStr.includes(".")) {
|
|
79
|
+
let listeners = this.dotNotationListeners.get(fieldNameStr);
|
|
80
|
+
if (!listeners) {
|
|
81
|
+
listeners = new Set();
|
|
82
|
+
this.dotNotationListeners.set(fieldNameStr, listeners);
|
|
83
|
+
}
|
|
84
|
+
listeners.add(listener);
|
|
85
|
+
return () => {
|
|
86
|
+
const listeners = this.dotNotationListeners.get(fieldNameStr);
|
|
87
|
+
if (listeners) {
|
|
88
|
+
listeners.delete(listener);
|
|
89
|
+
if (listeners.size === 0) {
|
|
90
|
+
this.dotNotationListeners.delete(fieldNameStr);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// 일반 필드 구독 / Regular field subscription
|
|
96
|
+
let field = this.fields.get(fieldName);
|
|
97
|
+
if (!field) {
|
|
98
|
+
// 필드가 없으면 생성 / Create field if not exists
|
|
99
|
+
field = {
|
|
100
|
+
value: undefined,
|
|
101
|
+
listeners: new Set(),
|
|
102
|
+
};
|
|
103
|
+
this.fields.set(fieldName, field);
|
|
104
|
+
}
|
|
105
|
+
field.listeners.add(listener);
|
|
106
|
+
return () => {
|
|
107
|
+
field?.listeners.delete(listener);
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 전역 구독 / Global subscription
|
|
112
|
+
* isModified 등을 위해 사용 / Used for isModified etc.
|
|
113
|
+
* @param listener 변경 시 호출될 콜백 / Callback to call on change
|
|
114
|
+
* @returns 구독 해제 함수 / Unsubscribe function
|
|
115
|
+
*/
|
|
116
|
+
subscribeGlobal(listener) {
|
|
117
|
+
this.globalListeners.add(listener);
|
|
118
|
+
return () => {
|
|
119
|
+
this.globalListeners.delete(listener);
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 필드 값 설정 / Set field value
|
|
124
|
+
* Dot notation 지원 / Supports dot notation
|
|
125
|
+
* @param fieldName 필드명 또는 dot notation 경로 / Field name or dot notation path
|
|
126
|
+
* @param value 설정할 값 / Value to set
|
|
127
|
+
*/
|
|
128
|
+
setValue(fieldName, value) {
|
|
129
|
+
const fieldNameStr = fieldName;
|
|
130
|
+
// dot notation이 포함된 경우 / For dot notation
|
|
131
|
+
if (fieldNameStr.includes(".")) {
|
|
132
|
+
const rootField = fieldNameStr.split(".")[0];
|
|
133
|
+
const rootFieldStr = String(rootField);
|
|
134
|
+
const remainingPath = fieldNameStr.substring(rootFieldStr.length + 1);
|
|
135
|
+
let field = this.fields.get(rootField);
|
|
136
|
+
if (!field) {
|
|
137
|
+
field = {
|
|
138
|
+
value: {},
|
|
139
|
+
listeners: new Set(),
|
|
140
|
+
};
|
|
141
|
+
this.fields.set(rootField, field);
|
|
142
|
+
}
|
|
143
|
+
const newRootValue = setNestedValue(field.value || {}, remainingPath, value);
|
|
144
|
+
if (JSON.stringify(field.value) !== JSON.stringify(newRootValue)) {
|
|
145
|
+
field.value = newRootValue;
|
|
146
|
+
// 루트 필드 구독자들 알림 / Notify root field subscribers
|
|
147
|
+
field.listeners.forEach((listener) => {
|
|
148
|
+
listener();
|
|
149
|
+
});
|
|
150
|
+
// Dot notation 경로 구독자들 알림 / Notify dot notation path subscribers
|
|
151
|
+
this.dotNotationListeners.forEach((listeners, subscribedPath) => {
|
|
152
|
+
if (subscribedPath === fieldNameStr) {
|
|
153
|
+
listeners.forEach((listener) => listener());
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
// 전역 구독자들 알림 / Notify global subscribers
|
|
157
|
+
this.globalListeners.forEach((listener) => listener());
|
|
158
|
+
}
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
// 일반 필드 설정 / Regular field setting
|
|
162
|
+
let field = this.fields.get(fieldName);
|
|
163
|
+
if (!field) {
|
|
164
|
+
field = {
|
|
165
|
+
value: undefined,
|
|
166
|
+
listeners: new Set(),
|
|
167
|
+
};
|
|
168
|
+
this.fields.set(fieldName, field);
|
|
169
|
+
}
|
|
170
|
+
if (field.value !== value) {
|
|
171
|
+
field.value = value;
|
|
172
|
+
const fieldStr = fieldName;
|
|
173
|
+
// 해당 필드 구독자들 알림 / Notify field subscribers
|
|
174
|
+
field.listeners.forEach((listener) => {
|
|
175
|
+
listener();
|
|
176
|
+
});
|
|
177
|
+
// Dot notation 구독자들 알림 / Notify dot notation subscribers
|
|
178
|
+
this.dotNotationListeners.forEach((listeners, subscribedPath) => {
|
|
179
|
+
if (subscribedPath === fieldStr) {
|
|
180
|
+
listeners.forEach((listener) => listener());
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
// 전역 구독자들 알림 / Notify global subscribers
|
|
184
|
+
if (this.globalListeners.size > 0) {
|
|
185
|
+
this.globalListeners.forEach((listener) => listener());
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* 모든 값 가져오기 / Get all values
|
|
191
|
+
* @returns 모든 필드 값을 포함한 객체 / Object containing all field values
|
|
192
|
+
*/
|
|
193
|
+
getValues() {
|
|
194
|
+
const values = {};
|
|
195
|
+
this.fields.forEach((field, key) => {
|
|
196
|
+
// undefined 값을 null로 변환하여 API 전송 시 필드가 누락되지 않도록 함
|
|
197
|
+
// Convert undefined to null to prevent field omission during API transmission
|
|
198
|
+
values[key] = field.value === undefined ? null : field.value;
|
|
199
|
+
});
|
|
200
|
+
return values;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* 모든 값 설정 / Set all values
|
|
204
|
+
* @param newValues 설정할 값들 / Values to set
|
|
205
|
+
*/
|
|
206
|
+
setValues(newValues) {
|
|
207
|
+
Object.keys(newValues).forEach((key) => {
|
|
208
|
+
this.setValue(key, newValues[key]);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* 초기값 재설정 / Reset initial values
|
|
213
|
+
* @param newInitialValues 새로운 초기값 / New initial values
|
|
214
|
+
*/
|
|
215
|
+
setInitialValues(newInitialValues) {
|
|
216
|
+
this.initialValues = { ...newInitialValues };
|
|
217
|
+
// 기존 리스너를 보존하면서 값만 업데이트 / Update values while preserving existing listeners
|
|
218
|
+
Object.keys(newInitialValues).forEach((key) => {
|
|
219
|
+
const existingField = this.fields.get(key);
|
|
220
|
+
if (existingField) {
|
|
221
|
+
// 기존 필드가 있으면 값만 업데이트 / Update value only if field exists
|
|
222
|
+
existingField.value = newInitialValues[key];
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// 새 필드면 생성 / Create new field
|
|
226
|
+
this.fields.set(key, {
|
|
227
|
+
value: newInitialValues[key],
|
|
228
|
+
listeners: new Set(),
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
// 모든 리스너에게 알림 / Notify all listeners
|
|
233
|
+
this.fields.forEach((field) => {
|
|
234
|
+
field.listeners.forEach((listener) => listener());
|
|
235
|
+
});
|
|
236
|
+
this.globalListeners.forEach((listener) => listener());
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* 수정 여부 확인 / Check if modified
|
|
240
|
+
* @returns 초기값에서 변경되었는지 여부 / Whether changed from initial values
|
|
241
|
+
*/
|
|
242
|
+
isModified() {
|
|
243
|
+
const currentValues = this.getValues();
|
|
244
|
+
return (JSON.stringify(currentValues) !== JSON.stringify(this.initialValues));
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* 초기값으로 리셋 / Reset to initial values
|
|
248
|
+
*/
|
|
249
|
+
reset() {
|
|
250
|
+
this.setValues(this.initialValues);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* 리소스 정리 / Clean up resources
|
|
254
|
+
*/
|
|
255
|
+
destroy() {
|
|
256
|
+
this.fields.clear();
|
|
257
|
+
this.globalListeners.clear();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=FieldStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldStore.js","sourceRoot":"","sources":["../../../core/FieldStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/index.ts
|
|
3
|
+
*
|
|
4
|
+
* Forma - 핵심 클래스들 내보내기
|
|
5
|
+
*
|
|
6
|
+
* @license MIT License
|
|
7
|
+
* @copyright 2025 KIM YOUNG JIN (Kim Young Jin)
|
|
8
|
+
* @author KIM YOUNG JIN (ehfuse@gmail.com)
|
|
9
|
+
*
|
|
10
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
* in the Software without restriction, including without limitation the rights
|
|
13
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
* furnished to do so, subject to the following conditions:
|
|
16
|
+
*
|
|
17
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
* copies or substantial portions of the Software.
|
|
19
|
+
*
|
|
20
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
* SOFTWARE.
|
|
27
|
+
*/
|
|
28
|
+
export { FieldStore } from "./FieldStore";
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/index.ts
|
|
3
|
+
*
|
|
4
|
+
* Forma - 핵심 클래스들 내보내기
|
|
5
|
+
*
|
|
6
|
+
* @license MIT License
|
|
7
|
+
* @copyright 2025 KIM YOUNG JIN (Kim Young Jin)
|
|
8
|
+
* @author KIM YOUNG JIN (ehfuse@gmail.com)
|
|
9
|
+
*
|
|
10
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
* in the Software without restriction, including without limitation the rights
|
|
13
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
* furnished to do so, subject to the following conditions:
|
|
16
|
+
*
|
|
17
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
* copies or substantial portions of the Software.
|
|
19
|
+
*
|
|
20
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
* SOFTWARE.
|
|
27
|
+
*/
|
|
28
|
+
export { FieldStore } from "./FieldStore";
|
|
29
|
+
// 향후 추가될 핵심 클래스들
|
|
30
|
+
// export { FormValidator } from './FormValidator';
|
|
31
|
+
// export { FormStore } from './FormStore';
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,iBAAiB;AACjB,mDAAmD;AACnD,2CAA2C"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useForm.ts
|
|
3
|
+
*
|
|
4
|
+
* Forma - 고급 폼 상태 관리 훅 / Advanced form state management hook
|
|
5
|
+
* 개별 필드 구독과 성능 최적화를 제공하는 핵심 훅
|
|
6
|
+
* Core hook providing individual field subscriptions and performance optimization
|
|
7
|
+
*
|
|
8
|
+
* @license MIT License
|
|
9
|
+
* @copyright 2025 KIM YOUNG JIN (Kim Young Jin)
|
|
10
|
+
* @author KIM YOUNG JIN (ehfuse@gmail.com)
|
|
11
|
+
*
|
|
12
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
* in the Software without restriction, including without limitation the rights
|
|
15
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
* furnished to do so, subject to the following conditions:
|
|
18
|
+
*
|
|
19
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
* copies or substantial portions of the Software.
|
|
21
|
+
*
|
|
22
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
* SOFTWARE.
|
|
29
|
+
*/
|
|
30
|
+
import { FieldStore } from "../core/FieldStore";
|
|
31
|
+
import { FormChangeEvent, DatePickerChangeHandler, UseFormProps } from "../types/form";
|
|
32
|
+
import React from "react";
|
|
33
|
+
/**
|
|
34
|
+
* Forma 핵심 폼 관리 훅 / Forma core form management hook
|
|
35
|
+
*
|
|
36
|
+
* 고급 폼 상태 관리와 성능 최적화를 제공합니다
|
|
37
|
+
* Provides advanced form state management and performance optimization
|
|
38
|
+
*
|
|
39
|
+
* Features:
|
|
40
|
+
* - 개별 필드 구독으로 선택적 리렌더링 / Selective re-rendering with individual field subscriptions
|
|
41
|
+
* - Dot notation 지원으로 중첩 객체 처리 / Nested object handling with dot notation support
|
|
42
|
+
* - MUI 컴포넌트 완전 호환 / Full MUI component compatibility
|
|
43
|
+
* - TypeScript 완전 지원 / Complete TypeScript support
|
|
44
|
+
*
|
|
45
|
+
* @template T 폼 데이터의 타입 / Form data type
|
|
46
|
+
* @param props 폼 설정 옵션 / Form configuration options
|
|
47
|
+
* @returns 폼 관리 API 객체 / Form management API object
|
|
48
|
+
*/
|
|
49
|
+
export declare function useForm<T extends Record<string, any>>({ initialValues, onSubmit, onValidate, onComplete, _externalStore, }: UseFormProps<T>): {
|
|
50
|
+
isSubmitting: boolean;
|
|
51
|
+
isValidating: boolean;
|
|
52
|
+
isModified: boolean;
|
|
53
|
+
useFormValue: (fieldName: string) => unknown;
|
|
54
|
+
getFormValue: (fieldName: string) => any;
|
|
55
|
+
getFormValues: () => T;
|
|
56
|
+
setFormValue: (name: string, value: any) => void;
|
|
57
|
+
setFormValues: (newValues: Partial<T>) => void;
|
|
58
|
+
setInitialFormValues: (newInitialValues: T) => void;
|
|
59
|
+
handleFormChange: (e: FormChangeEvent) => void;
|
|
60
|
+
handleDatePickerChange: DatePickerChangeHandler;
|
|
61
|
+
submit: (e?: React.FormEvent) => Promise<boolean>;
|
|
62
|
+
resetForm: () => void;
|
|
63
|
+
validateForm: (valuesToValidate?: T) => Promise<boolean>;
|
|
64
|
+
values: T;
|
|
65
|
+
_store: FieldStore<T>;
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=useForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useForm.d.ts","sourceRoot":"","sources":["../../../hooks/useForm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACH,eAAe,EACf,uBAAuB,EACvB,YAAY,EACf,MAAM,eAAe,CAAC;AAEvB,OAAO,KAMN,MAAM,OAAO,CAAC;AA0Bf;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EACnD,aAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,EACV,cAAc,GACjB,EAAE,YAAY,CAAC,CAAC,CAAC;;;;8BAgKE,MAAM;8BAnBN,MAAM,KAAG,GAAG;yBASU,CAAC;yBAhD5B,MAAM,SAAS,GAAG;+BAmBb,OAAO,CAAC,CAAC,CAAC;6CAUH,CAAC;0BApFhB,eAAe;;iBAyJR,KAAK,CAAC,SAAS,KAAG,OAAO,CAAC,OAAO,CAAC;;sCA9BnB,CAAC;;;EA8GlC"}
|