@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.
Files changed (99) hide show
  1. package/LICENSE +42 -0
  2. package/README.md +180 -0
  3. package/dist/contexts/GlobalFormContext.d.ts +66 -0
  4. package/dist/contexts/GlobalFormContext.d.ts.map +1 -0
  5. package/dist/contexts/GlobalFormContext.js +110 -0
  6. package/dist/contexts/GlobalFormContext.js.map +1 -0
  7. package/dist/core/FieldStore.d.ts +100 -0
  8. package/dist/core/FieldStore.d.ts.map +1 -0
  9. package/dist/core/FieldStore.js +264 -0
  10. package/dist/core/FieldStore.js.map +1 -0
  11. package/dist/core/index.d.ts +29 -0
  12. package/dist/core/index.d.ts.map +1 -0
  13. package/dist/core/index.js +36 -0
  14. package/dist/core/index.js.map +1 -0
  15. package/dist/esm/contexts/GlobalFormContext.d.ts +66 -0
  16. package/dist/esm/contexts/GlobalFormContext.d.ts.map +1 -0
  17. package/dist/esm/contexts/GlobalFormContext.js +106 -0
  18. package/dist/esm/contexts/GlobalFormContext.js.map +1 -0
  19. package/dist/esm/core/FieldStore.d.ts +100 -0
  20. package/dist/esm/core/FieldStore.d.ts.map +1 -0
  21. package/dist/esm/core/FieldStore.js +260 -0
  22. package/dist/esm/core/FieldStore.js.map +1 -0
  23. package/dist/esm/core/index.d.ts +29 -0
  24. package/dist/esm/core/index.d.ts.map +1 -0
  25. package/dist/esm/core/index.js +32 -0
  26. package/dist/esm/core/index.js.map +1 -0
  27. package/dist/esm/hooks/useForm.d.ts +67 -0
  28. package/dist/esm/hooks/useForm.d.ts.map +1 -0
  29. package/dist/esm/hooks/useForm.js +287 -0
  30. package/dist/esm/hooks/useForm.js.map +1 -0
  31. package/dist/esm/hooks/useGlobalForm.d.ts +45 -0
  32. package/dist/esm/hooks/useGlobalForm.d.ts.map +1 -0
  33. package/dist/esm/hooks/useGlobalForm.js +61 -0
  34. package/dist/esm/hooks/useGlobalForm.js.map +1 -0
  35. package/dist/esm/hooks/useRegisterGlobalForm.d.ts +55 -0
  36. package/dist/esm/hooks/useRegisterGlobalForm.d.ts.map +1 -0
  37. package/dist/esm/hooks/useRegisterGlobalForm.js +64 -0
  38. package/dist/esm/hooks/useRegisterGlobalForm.js.map +1 -0
  39. package/dist/esm/index.d.ts +53 -0
  40. package/dist/esm/index.d.ts.map +1 -0
  41. package/dist/esm/index.js +62 -0
  42. package/dist/esm/index.js.map +1 -0
  43. package/dist/esm/types/form.d.ts +120 -0
  44. package/dist/esm/types/form.d.ts.map +1 -0
  45. package/dist/esm/types/form.js +29 -0
  46. package/dist/esm/types/form.js.map +1 -0
  47. package/dist/esm/types/globalForm.d.ts +265 -0
  48. package/dist/esm/types/globalForm.d.ts.map +1 -0
  49. package/dist/esm/types/globalForm.js +39 -0
  50. package/dist/esm/types/globalForm.js.map +1 -0
  51. package/dist/esm/types/index.d.ts +31 -0
  52. package/dist/esm/types/index.d.ts.map +1 -0
  53. package/dist/esm/types/index.js +30 -0
  54. package/dist/esm/types/index.js.map +1 -0
  55. package/dist/esm/utils/dotNotation.d.ts +58 -0
  56. package/dist/esm/utils/dotNotation.d.ts.map +1 -0
  57. package/dist/esm/utils/dotNotation.js +100 -0
  58. package/dist/esm/utils/dotNotation.js.map +1 -0
  59. package/dist/esm/utils/index.d.ts +27 -0
  60. package/dist/esm/utils/index.d.ts.map +1 -0
  61. package/dist/esm/utils/index.js +27 -0
  62. package/dist/esm/utils/index.js.map +1 -0
  63. package/dist/hooks/useForm.d.ts +67 -0
  64. package/dist/hooks/useForm.d.ts.map +1 -0
  65. package/dist/hooks/useForm.js +290 -0
  66. package/dist/hooks/useForm.js.map +1 -0
  67. package/dist/hooks/useGlobalForm.d.ts +45 -0
  68. package/dist/hooks/useGlobalForm.d.ts.map +1 -0
  69. package/dist/hooks/useGlobalForm.js +64 -0
  70. package/dist/hooks/useGlobalForm.js.map +1 -0
  71. package/dist/hooks/useRegisterGlobalForm.d.ts +55 -0
  72. package/dist/hooks/useRegisterGlobalForm.d.ts.map +1 -0
  73. package/dist/hooks/useRegisterGlobalForm.js +67 -0
  74. package/dist/hooks/useRegisterGlobalForm.js.map +1 -0
  75. package/dist/index.d.ts +53 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +73 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/types/form.d.ts +120 -0
  80. package/dist/types/form.d.ts.map +1 -0
  81. package/dist/types/form.js +30 -0
  82. package/dist/types/form.js.map +1 -0
  83. package/dist/types/globalForm.d.ts +265 -0
  84. package/dist/types/globalForm.d.ts.map +1 -0
  85. package/dist/types/globalForm.js +43 -0
  86. package/dist/types/globalForm.js.map +1 -0
  87. package/dist/types/index.d.ts +31 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/index.js +34 -0
  90. package/dist/types/index.js.map +1 -0
  91. package/dist/utils/dotNotation.d.ts +58 -0
  92. package/dist/utils/dotNotation.d.ts.map +1 -0
  93. package/dist/utils/dotNotation.js +104 -0
  94. package/dist/utils/dotNotation.js.map +1 -0
  95. package/dist/utils/index.d.ts +27 -0
  96. package/dist/utils/index.d.ts.map +1 -0
  97. package/dist/utils/index.js +32 -0
  98. package/dist/utils/index.js.map +1 -0
  99. 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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,OAAO,UAAU;IAOnB,YAAY,aAAgB;QANpB,WAAM,GACV,IAAI,GAAG,EAAE,CAAC;QACN,yBAAoB,GAAiC,IAAI,GAAG,EAAE,CAAC,CAAC,8CAA8C;QAE9G,oBAAe,GAAG,IAAI,GAAG,EAAc,CAAC;QAG5C,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;QAC1C,uDAAuD;QACvD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACjB,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC;gBACzB,SAAS,EAAE,IAAI,GAAG,EAAE;aACvB,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,SAA2B;QAChC,MAAM,YAAY,GAAG,SAAmB,CAAC;QAEzC,wEAAwE;QACxE,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,OAAO,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAChD,CAAC;QAED,kCAAkC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAoB,CAAC,CAAC;QACpD,OAAO,KAAK,EAAE,KAAK,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACH,SAAS,CAAC,SAA2B,EAAE,QAAoB;QACvD,MAAM,YAAY,GAAG,SAAmB,CAAC;QAEzC,6EAA6E;QAC7E,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;gBACtB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAC3D,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAExB,OAAO,GAAG,EAAE;gBACR,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAC9D,IAAI,SAAS,EAAE,CAAC;oBACZ,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAC3B,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;wBACvB,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBACnD,CAAC;gBACL,CAAC;YACL,CAAC,CAAC;QACN,CAAC;QAED,wCAAwC;QACxC,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAoB,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,0CAA0C;YAC1C,KAAK,GAAG;gBACJ,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,IAAI,GAAG,EAAE;aACvB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAoB,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACR,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACH,eAAe,CAAC,QAAoB;QAChC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,SAA2B,EAAE,KAAU;QAC5C,MAAM,YAAY,GAAG,SAAmB,CAAC;QAEzC,0CAA0C;QAC1C,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAY,CAAC;YACxD,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,aAAa,GAAG,YAAY,CAAC,SAAS,CACxC,YAAY,CAAC,MAAM,GAAG,CAAC,CAC1B,CAAC;YAEF,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,KAAK,GAAG;oBACJ,KAAK,EAAE,EAAE;oBACT,SAAS,EAAE,IAAI,GAAG,EAAE;iBACvB,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,YAAY,GAAG,cAAc,CAC/B,KAAK,CAAC,KAAK,IAAI,EAAE,EACjB,aAAa,EACb,KAAK,CACR,CAAC;YAEF,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/D,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC;gBAE3B,gDAAgD;gBAChD,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACjC,QAAQ,EAAE,CAAC;gBACf,CAAC,CAAC,CAAC;gBAEH,iEAAiE;gBACjE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAC7B,CAAC,SAAS,EAAE,cAAc,EAAE,EAAE;oBAC1B,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;wBAClC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAChD,CAAC;gBACL,CAAC,CACJ,CAAC;gBAEF,yCAAyC;gBACzC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO;QACX,CAAC;QAED,mCAAmC;QACnC,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAoB,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,KAAK,GAAG;gBACJ,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,IAAI,GAAG,EAAE;aACvB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAoB,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACxB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACpB,MAAM,QAAQ,GAAG,SAAmB,CAAC;YAErC,2CAA2C;YAC3C,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACjC,QAAQ,EAAE,CAAC;YACf,CAAC,CAAC,CAAC;YAEH,yDAAyD;YACzD,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,EAAE;gBAC5D,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;oBAC9B,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAChD,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,yCAAyC;YACzC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3D,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,SAAS;QACL,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/B,kDAAkD;YAClD,8EAA8E;YAC9E,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QACjE,CAAC,CAAC,CAAC;QACH,OAAO,MAAW,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,SAAqB;QAC3B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAc,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,gBAAmB;QAChC,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC;QAE7C,4EAA4E;QAC5E,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,aAAa,EAAE,CAAC;gBAChB,yDAAyD;gBACzD,aAAa,CAAC,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACJ,8BAA8B;gBAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;oBACjB,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC;oBAC5B,SAAS,EAAE,IAAI,GAAG,EAAE;iBACvB,CAAC,CAAC;YACP,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,qCAAqC;QACrC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1B,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,UAAU;QACN,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACvC,OAAO,CACH,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CACvE,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,OAAO;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;CACJ"}
@@ -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"}