feature-form 0.0.43 → 0.0.45
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/cjs/create-form.js +227 -1
- package/dist/cjs/create-form.js.map +1 -0
- package/dist/cjs/form-field/create-form-field-validation-context.js +28 -1
- package/dist/cjs/form-field/create-form-field-validation-context.js.map +1 -0
- package/dist/cjs/form-field/create-form-field.js +117 -1
- package/dist/cjs/form-field/create-form-field.js.map +1 -0
- package/dist/cjs/form-field/create-status.js +24 -1
- package/dist/cjs/form-field/create-status.js.map +1 -0
- package/dist/cjs/form-field/is-form-field-status.js +8 -1
- package/dist/cjs/form-field/is-form-field-status.js.map +1 -0
- package/dist/cjs/form-field/is-form-field.js +8 -1
- package/dist/cjs/form-field/is-form-field.js.map +1 -0
- package/dist/cjs/helper/from-validator.js +24 -1
- package/dist/cjs/helper/from-validator.js.map +1 -0
- package/dist/cjs/helper/has-form-changed.js +14 -1
- package/dist/cjs/helper/has-form-changed.js.map +1 -0
- package/dist/cjs/helper/reset-form-submitted.js +13 -1
- package/dist/cjs/helper/reset-form-submitted.js.map +1 -0
- package/dist/cjs/index.js +36 -1
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/is-form-with-features.js +8 -1
- package/dist/cjs/is-form-with-features.js.map +1 -0
- package/dist/cjs/types/form-field.js +19 -1
- package/dist/cjs/types/form-field.js.map +1 -0
- package/dist/esm/create-form.js +225 -1
- package/dist/esm/create-form.js.map +1 -0
- package/dist/esm/form-field/create-form-field-validation-context.js +26 -1
- package/dist/esm/form-field/create-form-field-validation-context.js.map +1 -0
- package/dist/esm/form-field/create-form-field.js +115 -1
- package/dist/esm/form-field/create-form-field.js.map +1 -0
- package/dist/esm/form-field/create-status.js +22 -1
- package/dist/esm/form-field/create-status.js.map +1 -0
- package/dist/esm/form-field/is-form-field-status.js +6 -1
- package/dist/esm/form-field/is-form-field-status.js.map +1 -0
- package/dist/esm/form-field/is-form-field.js +6 -1
- package/dist/esm/form-field/is-form-field.js.map +1 -0
- package/dist/esm/helper/from-validator.js +22 -1
- package/dist/esm/helper/from-validator.js.map +1 -0
- package/dist/esm/helper/has-form-changed.js +12 -1
- package/dist/esm/helper/has-form-changed.js.map +1 -0
- package/dist/esm/helper/reset-form-submitted.js +11 -1
- package/dist/esm/helper/reset-form-submitted.js.map +1 -0
- package/dist/esm/index.js +12 -1
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/is-form-with-features.js +6 -1
- package/dist/esm/is-form-with-features.js.map +1 -0
- package/dist/esm/types/form-field.js +16 -1
- package/dist/esm/types/form-field.js.map +1 -0
- package/dist/types/create-form.d.ts +1 -0
- package/dist/types/create-form.d.ts.map +1 -0
- package/dist/types/form-field/create-form-field-validation-context.d.ts +1 -0
- package/dist/types/form-field/create-form-field-validation-context.d.ts.map +1 -0
- package/dist/types/form-field/create-form-field.d.ts +1 -0
- package/dist/types/form-field/create-form-field.d.ts.map +1 -0
- package/dist/types/form-field/create-status.d.ts +1 -0
- package/dist/types/form-field/create-status.d.ts.map +1 -0
- package/dist/types/form-field/index.d.ts +1 -0
- package/dist/types/form-field/index.d.ts.map +1 -0
- package/dist/types/form-field/is-form-field-status.d.ts +1 -0
- package/dist/types/form-field/is-form-field-status.d.ts.map +1 -0
- package/dist/types/form-field/is-form-field.d.ts +1 -0
- package/dist/types/form-field/is-form-field.d.ts.map +1 -0
- package/dist/types/helper/from-validator.d.ts +1 -0
- package/dist/types/helper/from-validator.d.ts.map +1 -0
- package/dist/types/helper/has-form-changed.d.ts +1 -0
- package/dist/types/helper/has-form-changed.d.ts.map +1 -0
- package/dist/types/helper/index.d.ts +1 -0
- package/dist/types/helper/index.d.ts.map +1 -0
- package/dist/types/helper/reset-form-submitted.d.ts +1 -0
- package/dist/types/helper/reset-form-submitted.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/is-form-with-features.d.ts +1 -0
- package/dist/types/is-form-with-features.d.ts.map +1 -0
- package/dist/types/types/features.d.ts +1 -0
- package/dist/types/types/features.d.ts.map +1 -0
- package/dist/types/types/form-field.d.ts +1 -0
- package/dist/types/types/form-field.d.ts.map +1 -0
- package/dist/types/types/form.d.ts +1 -0
- package/dist/types/types/form.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/package.json +10 -9
package/dist/cjs/create-form.js
CHANGED
|
@@ -1 +1,227 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@blgc/utils');
|
|
4
|
+
var featureState = require('feature-state');
|
|
5
|
+
var createFormField = require('./form-field/create-form-field.js');
|
|
6
|
+
var isFormField = require('./form-field/is-form-field.js');
|
|
7
|
+
var formField = require('./types/form-field.js');
|
|
8
|
+
|
|
9
|
+
var __defProp = Object.defineProperty;
|
|
10
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
13
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
14
|
+
var __spreadValues = (a, b) => {
|
|
15
|
+
for (var prop in b || (b = {}))
|
|
16
|
+
if (__hasOwnProp.call(b, prop))
|
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
|
18
|
+
if (__getOwnPropSymbols)
|
|
19
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
20
|
+
if (__propIsEnum.call(b, prop))
|
|
21
|
+
__defNormalProp(a, prop, b[prop]);
|
|
22
|
+
}
|
|
23
|
+
return a;
|
|
24
|
+
};
|
|
25
|
+
var __async = (__this, __arguments, generator) => {
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
var fulfilled = (value) => {
|
|
28
|
+
try {
|
|
29
|
+
step(generator.next(value));
|
|
30
|
+
} catch (e) {
|
|
31
|
+
reject(e);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
var rejected = (value) => {
|
|
35
|
+
try {
|
|
36
|
+
step(generator.throw(value));
|
|
37
|
+
} catch (e) {
|
|
38
|
+
reject(e);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
42
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
function createForm(config) {
|
|
46
|
+
const {
|
|
47
|
+
fields,
|
|
48
|
+
collectErrorMode = "firstError",
|
|
49
|
+
disabled = false,
|
|
50
|
+
validateMode = utils.bitwiseFlag(formField.FormFieldValidateMode.OnSubmit),
|
|
51
|
+
reValidateMode = utils.bitwiseFlag(formField.FormFieldReValidateMode.OnBlur),
|
|
52
|
+
onValidSubmit,
|
|
53
|
+
onInvalidSubmit,
|
|
54
|
+
notifyOnStatusChange = true
|
|
55
|
+
} = config;
|
|
56
|
+
const form = {
|
|
57
|
+
_features: [],
|
|
58
|
+
_config: {
|
|
59
|
+
disabled
|
|
60
|
+
},
|
|
61
|
+
_validSubmitCallbacks: onValidSubmit != null ? [onValidSubmit] : [],
|
|
62
|
+
_invalidSubmitCallbacks: onInvalidSubmit != null ? [onInvalidSubmit] : [],
|
|
63
|
+
fields: Object.fromEntries(
|
|
64
|
+
Object.entries(fields).map(
|
|
65
|
+
([fieldKey, field]) => {
|
|
66
|
+
var _a2, _b, _c, _d;
|
|
67
|
+
return [
|
|
68
|
+
fieldKey,
|
|
69
|
+
isFormField.isFormField(field) ? field : createFormField.createFormField(field.defaultValue, {
|
|
70
|
+
key: fieldKey,
|
|
71
|
+
validator: field.validator,
|
|
72
|
+
collectErrorMode: (_a2 = field.collectErrorMode) != null ? _a2 : collectErrorMode,
|
|
73
|
+
validateMode: (_b = field.validateMode) != null ? _b : validateMode,
|
|
74
|
+
reValidateMode: (_c = field.reValidateMode) != null ? _c : reValidateMode,
|
|
75
|
+
editable: (_d = field.editable) != null ? _d : true,
|
|
76
|
+
notifyOnStatusChange
|
|
77
|
+
})
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
),
|
|
82
|
+
isValid: featureState.createState(false),
|
|
83
|
+
isValidating: featureState.createState(false),
|
|
84
|
+
isSubmitted: featureState.createState(false),
|
|
85
|
+
isSubmitting: featureState.createState(false),
|
|
86
|
+
init() {
|
|
87
|
+
for (const field of Object.values(this.fields)) {
|
|
88
|
+
field.status.listen(
|
|
89
|
+
() => __async(this, null, function* () {
|
|
90
|
+
yield this._revalidate(true);
|
|
91
|
+
}),
|
|
92
|
+
{ key: "form_revalidate" }
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
delete this.init;
|
|
96
|
+
return this;
|
|
97
|
+
},
|
|
98
|
+
_revalidate(cached = false) {
|
|
99
|
+
return __async(this, null, function* () {
|
|
100
|
+
const formFields = Object.values(this.fields);
|
|
101
|
+
if (!cached) {
|
|
102
|
+
this.isValidating.set(true);
|
|
103
|
+
yield Promise.all(formFields.map((formField) => formField.validate()));
|
|
104
|
+
this.isValidating.set(false);
|
|
105
|
+
}
|
|
106
|
+
this.isValid.set(formFields.every((formField) => formField.isValid()));
|
|
107
|
+
return this.isValid.get();
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
submit() {
|
|
111
|
+
return __async(this, arguments, function* (options = {}) {
|
|
112
|
+
const {
|
|
113
|
+
context,
|
|
114
|
+
assignToInitial = false,
|
|
115
|
+
onInvalidSubmit: _onInvalidSubmit,
|
|
116
|
+
onValidSubmit: _onValidSubmit,
|
|
117
|
+
postSubmitCallback
|
|
118
|
+
} = options;
|
|
119
|
+
this.isSubmitting.set(true);
|
|
120
|
+
const validationPromises = [];
|
|
121
|
+
for (const formField$1 of Object.values(
|
|
122
|
+
this.fields
|
|
123
|
+
)) {
|
|
124
|
+
formField$1.isSubmitting.set(true);
|
|
125
|
+
if (formField$1.isSubmitted.get() && formField$1._config.reValidateMode.has(formField.FormFieldReValidateMode.OnSubmit) || !formField$1.isSubmitted.get() && formField$1._config.validateMode.has(formField.FormFieldValidateMode.OnSubmit)) {
|
|
126
|
+
validationPromises.push(formField$1.validate());
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
yield Promise.all(validationPromises);
|
|
130
|
+
this._revalidate(true);
|
|
131
|
+
const data = this.getValidData();
|
|
132
|
+
const submitCallbackPromises = [];
|
|
133
|
+
if (data != null) {
|
|
134
|
+
for (const callback of this._validSubmitCallbacks) {
|
|
135
|
+
submitCallbackPromises.push(callback(data, context));
|
|
136
|
+
}
|
|
137
|
+
if (typeof _onValidSubmit === "function") {
|
|
138
|
+
submitCallbackPromises.push(_onValidSubmit(data, context));
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
const errors = this.getErrors();
|
|
142
|
+
for (const callback of this._invalidSubmitCallbacks) {
|
|
143
|
+
submitCallbackPromises.push(callback(errors, context));
|
|
144
|
+
}
|
|
145
|
+
if (typeof _onInvalidSubmit === "function") {
|
|
146
|
+
submitCallbackPromises.push(_onInvalidSubmit(errors, context));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
let submitCallbackData = null;
|
|
150
|
+
if (postSubmitCallback != null) {
|
|
151
|
+
submitCallbackData = (yield Promise.all(submitCallbackPromises)).reduce((acc, result) => {
|
|
152
|
+
if (result != null && typeof result === "object") {
|
|
153
|
+
return __spreadValues(__spreadValues({}, acc), result);
|
|
154
|
+
}
|
|
155
|
+
return acc;
|
|
156
|
+
}, {});
|
|
157
|
+
} else {
|
|
158
|
+
yield Promise.all(submitCallbackPromises);
|
|
159
|
+
}
|
|
160
|
+
for (const [fieldKey, formField] of Object.entries(this.fields)) {
|
|
161
|
+
if (data != null && Object.prototype.hasOwnProperty.call(data, fieldKey)) {
|
|
162
|
+
if (assignToInitial) {
|
|
163
|
+
formField._intialValue = utils.deepCopy(data[fieldKey]);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
formField.isSubmitted.set(true);
|
|
167
|
+
formField.isSubmitting.set(false);
|
|
168
|
+
}
|
|
169
|
+
this.isSubmitted.set(true);
|
|
170
|
+
this.isSubmitting.set(false);
|
|
171
|
+
postSubmitCallback == null ? void 0 : postSubmitCallback(this, submitCallbackData != null ? submitCallbackData : {});
|
|
172
|
+
return this.isValid.get();
|
|
173
|
+
});
|
|
174
|
+
},
|
|
175
|
+
validate() {
|
|
176
|
+
return __async(this, null, function* () {
|
|
177
|
+
return this._revalidate(false);
|
|
178
|
+
});
|
|
179
|
+
},
|
|
180
|
+
getField(fieldKey) {
|
|
181
|
+
return this.fields[fieldKey];
|
|
182
|
+
},
|
|
183
|
+
getValidData() {
|
|
184
|
+
if (!this.isValid.get()) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
const preparedData = {};
|
|
188
|
+
for (const [fieldKey, formField] of Object.entries(this.fields)) {
|
|
189
|
+
preparedData[fieldKey] = formField.get();
|
|
190
|
+
}
|
|
191
|
+
return preparedData;
|
|
192
|
+
},
|
|
193
|
+
getErrors() {
|
|
194
|
+
const errors = {};
|
|
195
|
+
for (const [fieldKey, formField] of Object.entries(this.fields)) {
|
|
196
|
+
switch (formField.status._v.type) {
|
|
197
|
+
case "INVALID":
|
|
198
|
+
errors[fieldKey] = formField.status._v.errors;
|
|
199
|
+
break;
|
|
200
|
+
case "UNVALIDATED":
|
|
201
|
+
errors[fieldKey] = [
|
|
202
|
+
{
|
|
203
|
+
code: "unvalidated",
|
|
204
|
+
message: `${fieldKey.toString()} was not yet validated!`,
|
|
205
|
+
path: fieldKey
|
|
206
|
+
}
|
|
207
|
+
];
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return errors;
|
|
212
|
+
},
|
|
213
|
+
reset() {
|
|
214
|
+
for (const formField of Object.values(
|
|
215
|
+
this.fields
|
|
216
|
+
)) {
|
|
217
|
+
formField.reset();
|
|
218
|
+
}
|
|
219
|
+
this.isSubmitted.set(false);
|
|
220
|
+
this._revalidate(true);
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
return form.init();
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
exports.createForm = createForm;
|
|
227
|
+
//# sourceMappingURL=create-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-form.js","sources":["../../src/create-form.ts"],"sourcesContent":["import { TWithInit } from '@blgc/types/features';\nimport { type TEntries } from '@blgc/types/utils';\nimport { bitwiseFlag, deepCopy, type BitwiseFlag } from '@blgc/utils';\nimport { createState } from 'feature-state';\nimport { TCollectErrorMode } from 'validation-adapter';\nimport { createFormField, isFormField } from './form-field';\nimport {\n\tFormFieldReValidateMode,\n\tFormFieldValidateMode,\n\tTFormField,\n\ttype TForm,\n\ttype TFormConfig,\n\ttype TFormData,\n\ttype TFormFields,\n\ttype TFormFieldStateConfig,\n\ttype TFormFieldValidator,\n\ttype TInvalidFormFieldError,\n\ttype TInvalidFormFieldErrors,\n\ttype TInvalidSubmitCallback,\n\ttype TSubmitCallbackResponse,\n\ttype TValidSubmitCallback\n} from './types';\n\nexport function createForm<GFormData extends TFormData>(\n\tconfig: TCreateFormConfig<GFormData>\n): TForm<GFormData, []> {\n\tconst {\n\t\tfields,\n\t\tcollectErrorMode = 'firstError',\n\t\tdisabled = false,\n\t\tvalidateMode = bitwiseFlag(FormFieldValidateMode.OnSubmit),\n\t\treValidateMode = bitwiseFlag(FormFieldReValidateMode.OnBlur),\n\t\tonValidSubmit,\n\t\tonInvalidSubmit,\n\t\tnotifyOnStatusChange = true\n\t} = config;\n\n\tconst form: TWithInit<TForm<GFormData, []>> = {\n\t\t_features: [],\n\t\t_config: {\n\t\t\tdisabled\n\t\t},\n\t\t_validSubmitCallbacks: onValidSubmit != null ? [onValidSubmit] : [],\n\t\t_invalidSubmitCallbacks: onInvalidSubmit != null ? [onInvalidSubmit] : [],\n\t\tfields: Object.fromEntries(\n\t\t\tObject.entries(fields).map(\n\t\t\t\t([fieldKey, field]: [\n\t\t\t\t\tstring,\n\t\t\t\t\tTCreateFormConfigFormField<unknown> | TFormField<unknown>\n\t\t\t\t]) => [\n\t\t\t\t\tfieldKey,\n\t\t\t\t\tisFormField(field)\n\t\t\t\t\t\t? field\n\t\t\t\t\t\t: createFormField(field.defaultValue, {\n\t\t\t\t\t\t\t\tkey: fieldKey,\n\t\t\t\t\t\t\t\tvalidator: field.validator,\n\t\t\t\t\t\t\t\tcollectErrorMode: field.collectErrorMode ?? collectErrorMode,\n\t\t\t\t\t\t\t\tvalidateMode: field.validateMode ?? validateMode,\n\t\t\t\t\t\t\t\treValidateMode: field.reValidateMode ?? reValidateMode,\n\t\t\t\t\t\t\t\teditable: field.editable ?? true,\n\t\t\t\t\t\t\t\tnotifyOnStatusChange\n\t\t\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t)\n\t\t) as TFormFields<GFormData>,\n\t\tisValid: createState(false),\n\t\tisValidating: createState(false),\n\t\tisSubmitted: createState(false),\n\t\tisSubmitting: createState(false),\n\t\tinit(this: TForm<GFormData, []>) {\n\t\t\t// Revalidate form on status change\n\t\t\tfor (const field of Object.values(this.fields) as TFormFields<GFormData>[keyof GFormData][]) {\n\t\t\t\tfield.status.listen(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tawait this._revalidate(true);\n\t\t\t\t\t},\n\t\t\t\t\t{ key: 'form_revalidate' }\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// @ts-expect-error -- Remove init method after initialization\n\t\t\tdelete this.init;\n\t\t\treturn this;\n\t\t},\n\t\tasync _revalidate(this: TForm<GFormData, []>, cached = false) {\n\t\t\tconst formFields = Object.values(this.fields) as TFormFields<GFormData>[keyof GFormData][];\n\n\t\t\tif (!cached) {\n\t\t\t\tthis.isValidating.set(true);\n\t\t\t\tawait Promise.all(formFields.map((formField) => formField.validate()));\n\t\t\t\tthis.isValidating.set(false);\n\t\t\t}\n\n\t\t\tthis.isValid.set(formFields.every((formField) => formField.isValid()));\n\t\t\treturn this.isValid.get();\n\t\t},\n\t\tasync submit(this: TForm<GFormData, []>, options = {}) {\n\t\t\tconst {\n\t\t\t\tcontext,\n\t\t\t\tassignToInitial = false,\n\t\t\t\tonInvalidSubmit: _onInvalidSubmit,\n\t\t\t\tonValidSubmit: _onValidSubmit,\n\t\t\t\tpostSubmitCallback\n\t\t\t} = options;\n\t\t\tthis.isSubmitting.set(true);\n\n\t\t\t// Validate form fields\n\t\t\tconst validationPromises: Promise<boolean>[] = [];\n\t\t\tfor (const formField of Object.values(\n\t\t\t\tthis.fields\n\t\t\t) as TFormFields<GFormData>[keyof GFormData][]) {\n\t\t\t\tformField.isSubmitting.set(true);\n\t\t\t\tif (\n\t\t\t\t\t(formField.isSubmitted.get() &&\n\t\t\t\t\t\tformField._config.reValidateMode.has(FormFieldReValidateMode.OnSubmit)) ||\n\t\t\t\t\t(!formField.isSubmitted.get() &&\n\t\t\t\t\t\tformField._config.validateMode.has(FormFieldValidateMode.OnSubmit))\n\t\t\t\t) {\n\t\t\t\t\tvalidationPromises.push(formField.validate());\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait Promise.all(validationPromises);\n\n\t\t\t// Note: We can't rely on the form field status listener to revalidate the form on time\n\t\t\t// since the state queue is processed asynchronously\n\t\t\tthis._revalidate(true);\n\n\t\t\t// Execute submit callbacks\n\t\t\tconst data = this.getValidData();\n\t\t\tconst submitCallbackPromises: TSubmitCallbackResponse[] = [];\n\t\t\tif (data != null) {\n\t\t\t\tfor (const callback of this._validSubmitCallbacks) {\n\t\t\t\t\tsubmitCallbackPromises.push(callback(data, context));\n\t\t\t\t}\n\t\t\t\tif (typeof _onValidSubmit === 'function') {\n\t\t\t\t\tsubmitCallbackPromises.push(_onValidSubmit(data, context));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst errors = this.getErrors();\n\t\t\t\tfor (const callback of this._invalidSubmitCallbacks) {\n\t\t\t\t\tsubmitCallbackPromises.push(callback(errors, context));\n\t\t\t\t}\n\t\t\t\tif (typeof _onInvalidSubmit === 'function') {\n\t\t\t\t\tsubmitCallbackPromises.push(_onInvalidSubmit(errors, context));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet submitCallbackData: Record<string, unknown> | null = null;\n\t\t\tif (postSubmitCallback != null) {\n\t\t\t\tsubmitCallbackData = (await Promise.all(submitCallbackPromises)).reduce((acc, result) => {\n\t\t\t\t\tif (result != null && typeof result === 'object') {\n\t\t\t\t\t\treturn { ...acc, ...result };\n\t\t\t\t\t}\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {}) as Record<string, unknown>;\n\t\t\t} else {\n\t\t\t\tawait Promise.all(submitCallbackPromises);\n\t\t\t}\n\n\t\t\t// Update form field states\n\t\t\tfor (const [fieldKey, formField] of Object.entries(this.fields) as TEntries<\n\t\t\t\tTFormFields<GFormData>\n\t\t\t>) {\n\t\t\t\tif (data != null && Object.prototype.hasOwnProperty.call(data, fieldKey)) {\n\t\t\t\t\tif (assignToInitial) {\n\t\t\t\t\t\tformField._intialValue = deepCopy(data[fieldKey]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tformField.isSubmitted.set(true);\n\t\t\t\tformField.isSubmitting.set(false);\n\t\t\t}\n\n\t\t\tthis.isSubmitted.set(true);\n\t\t\tthis.isSubmitting.set(false);\n\n\t\t\tpostSubmitCallback?.(this, submitCallbackData ?? {});\n\t\t\treturn this.isValid.get();\n\t\t},\n\t\tasync validate(this: TForm<GFormData, []>) {\n\t\t\treturn this._revalidate(false);\n\t\t},\n\t\tgetField(this: TForm<GFormData, []>, fieldKey) {\n\t\t\treturn this.fields[fieldKey];\n\t\t},\n\t\tgetValidData(this: TForm<GFormData, []>) {\n\t\t\tif (!this.isValid.get()) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// @ts-expect-error - Filled below\n\t\t\tconst preparedData: Readonly<GFormData> = {};\n\n\t\t\tfor (const [fieldKey, formField] of Object.entries(this.fields) as TEntries<\n\t\t\t\tTFormFields<GFormData>\n\t\t\t>) {\n\t\t\t\t// @ts-expect-error - GFormFields is based on GFormData and the keys should be identical\n\t\t\t\tpreparedData[fieldKey] = formField.get();\n\t\t\t}\n\n\t\t\treturn preparedData;\n\t\t},\n\t\tgetErrors(this: TForm<GFormData, []>) {\n\t\t\tconst errors: TInvalidFormFieldErrors<GFormData> = {};\n\n\t\t\tfor (const [fieldKey, formField] of Object.entries(this.fields) as TEntries<\n\t\t\t\tTFormFields<GFormData>\n\t\t\t>) {\n\t\t\t\tswitch (formField.status._v.type) {\n\t\t\t\t\tcase 'INVALID':\n\t\t\t\t\t\terrors[fieldKey] = formField.status._v.errors;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'UNVALIDATED':\n\t\t\t\t\t\terrors[fieldKey] = [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'unvalidated',\n\t\t\t\t\t\t\t\tmessage: `${fieldKey.toString()} was not yet validated!`,\n\t\t\t\t\t\t\t\tpath: fieldKey\n\t\t\t\t\t\t\t} as TInvalidFormFieldError\n\t\t\t\t\t\t];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn errors;\n\t\t},\n\t\treset(this: TForm<GFormData, []>) {\n\t\t\tfor (const formField of Object.values(\n\t\t\t\tthis.fields\n\t\t\t) as TFormFields<GFormData>[keyof GFormData][]) {\n\t\t\t\tformField.reset();\n\t\t\t}\n\t\t\tthis.isSubmitted.set(false);\n\t\t\tthis._revalidate(true);\n\t\t}\n\t};\n\n\treturn form.init();\n}\n\nexport interface TCreateFormConfig<GFormData extends TFormData> extends Partial<TFormConfig> {\n\t/**\n\t * Form fields\n\t */\n\tfields: TCreateFormConfigFormFields<GFormData>;\n\t/**\n\t * Error collection mode. 'firstError' gathers only the first error per field, 'all' gathers all errors.\n\t */\n\tcollectErrorMode?: TCollectErrorMode;\n\t/**\n\t * Validation strategy **before** submitting.\n\t */\n\tvalidateMode?: BitwiseFlag<FormFieldValidateMode>;\n\t/**\n\t * Validation strategy **after** submitting.\n\t */\n\treValidateMode?: BitwiseFlag<FormFieldReValidateMode>;\n\t/**\n\t * Whether to notify the form field if its status has changed\n\t */\n\tnotifyOnStatusChange?: boolean;\n\n\tonInvalidSubmit?: TInvalidSubmitCallback<GFormData>;\n\tonValidSubmit?: TValidSubmitCallback<GFormData>;\n}\n\nexport type TCreateFormConfigFormFields<GFormData extends TFormData> = {\n\t[Key in keyof GFormData]: TCreateFormConfigFormField<GFormData[Key]> | TFormField<GFormData[Key]>;\n};\n\nexport interface TCreateFormConfigFormField<GValue> extends Partial<TFormFieldStateConfig> {\n\tdefaultValue?: GValue;\n\tvalidator?: TFormFieldValidator<GValue>;\n}\n"],"names":["bitwiseFlag","FormFieldValidateMode","FormFieldReValidateMode","isFormField","createFormField","createState","formField","deepCopy"],"mappings":"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"}
|
|
@@ -1 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function createFormFieldValidationContext(formField) {
|
|
4
|
+
return {
|
|
5
|
+
config: {
|
|
6
|
+
collectErrorMode: formField._config.collectErrorMode,
|
|
7
|
+
name: formField.key
|
|
8
|
+
},
|
|
9
|
+
value: formField.get(),
|
|
10
|
+
isValue(v) {
|
|
11
|
+
return true;
|
|
12
|
+
},
|
|
13
|
+
hasError() {
|
|
14
|
+
var _a;
|
|
15
|
+
return ((_a = formField.status._nextValue) == null ? void 0 : _a.type) === "INVALID";
|
|
16
|
+
},
|
|
17
|
+
registerError(error) {
|
|
18
|
+
formField.status.registerNextError({
|
|
19
|
+
code: error.code,
|
|
20
|
+
message: error.message,
|
|
21
|
+
path: error.path
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.createFormFieldValidationContext = createFormFieldValidationContext;
|
|
28
|
+
//# sourceMappingURL=create-form-field-validation-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-form-field-validation-context.js","sources":["../../../src/form-field/create-form-field-validation-context.ts"],"sourcesContent":["import { type TFormField, type TFormFieldValidationContext } from '../types';\n\nexport function createFormFieldValidationContext<GValue>(\n\tformField: TFormField<GValue>\n): TFormFieldValidationContext<GValue> {\n\treturn {\n\t\tconfig: {\n\t\t\tcollectErrorMode: formField._config.collectErrorMode,\n\t\t\tname: formField.key\n\t\t},\n\t\tvalue: formField.get() as Readonly<GValue>,\n\t\tisValue(v): v is GValue {\n\t\t\treturn true;\n\t\t},\n\t\thasError() {\n\t\t\treturn formField.status._nextValue?.type === 'INVALID';\n\t\t},\n\t\tregisterError(error) {\n\t\t\tformField.status.registerNextError({\n\t\t\t\tcode: error.code,\n\t\t\t\tmessage: error.message,\n\t\t\t\tpath: error.path\n\t\t\t});\n\t\t}\n\t};\n}\n"],"names":[],"mappings":";;AACO,SAAS,gCAAgC,CAAC,SAAS,EAAE;AAC5D,EAAE,OAAO;AACT,IAAI,MAAM,EAAE;AACZ,MAAM,gBAAgB,EAAE,SAAS,CAAC,OAAO,CAAC,gBAAgB;AAC1D,MAAM,IAAI,EAAE,SAAS,CAAC;AACtB,KAAK;AACL,IAAI,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE;AAC1B,IAAI,OAAO,CAAC,CAAC,EAAE;AACf,MAAM,OAAO,IAAI;AACjB,KAAK;AACL,IAAI,QAAQ,GAAG;AACf,MAAM,IAAI,EAAE;AACZ,MAAM,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,MAAM,SAAS;AAC1F,KAAK;AACL,IAAI,aAAa,CAAC,KAAK,EAAE;AACzB,MAAM,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;AACzC,QAAQ,IAAI,EAAE,KAAK,CAAC,IAAI;AACxB,QAAQ,OAAO,EAAE,KAAK,CAAC,OAAO;AAC9B,QAAQ,IAAI,EAAE,KAAK,CAAC;AACpB,OAAO,CAAC;AACR;AACA,GAAG;AACH;;;;"}
|
|
@@ -1 +1,117 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@blgc/utils');
|
|
4
|
+
var featureState = require('feature-state');
|
|
5
|
+
var validationAdapter = require('validation-adapter');
|
|
6
|
+
var formField = require('../types/form-field.js');
|
|
7
|
+
var createFormFieldValidationContext = require('./create-form-field-validation-context.js');
|
|
8
|
+
var createStatus = require('./create-status.js');
|
|
9
|
+
|
|
10
|
+
var __async = (__this, __arguments, generator) => {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
var fulfilled = (value) => {
|
|
13
|
+
try {
|
|
14
|
+
step(generator.next(value));
|
|
15
|
+
} catch (e) {
|
|
16
|
+
reject(e);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
var rejected = (value) => {
|
|
20
|
+
try {
|
|
21
|
+
step(generator.throw(value));
|
|
22
|
+
} catch (e) {
|
|
23
|
+
reject(e);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
27
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
function createFormField(initialValue, config) {
|
|
31
|
+
const {
|
|
32
|
+
key,
|
|
33
|
+
validator = validationAdapter.createValidator([]),
|
|
34
|
+
editable = true,
|
|
35
|
+
reValidateMode = utils.bitwiseFlag(formField.FormFieldReValidateMode.OnBlur),
|
|
36
|
+
validateMode = utils.bitwiseFlag(formField.FormFieldValidateMode.OnSubmit),
|
|
37
|
+
collectErrorMode = "firstError",
|
|
38
|
+
notifyOnStatusChange = true
|
|
39
|
+
} = config;
|
|
40
|
+
const baseState = featureState.createState(initialValue);
|
|
41
|
+
const formFieldFeature = {
|
|
42
|
+
_config: {
|
|
43
|
+
editable,
|
|
44
|
+
validateMode,
|
|
45
|
+
reValidateMode,
|
|
46
|
+
collectErrorMode
|
|
47
|
+
},
|
|
48
|
+
_intialValue: utils.deepCopy(baseState._v),
|
|
49
|
+
_validator: validator,
|
|
50
|
+
key,
|
|
51
|
+
isTouched: featureState.createState(false),
|
|
52
|
+
isSubmitted: featureState.createState(false),
|
|
53
|
+
isSubmitting: featureState.createState(false),
|
|
54
|
+
isValidating: featureState.createState(false),
|
|
55
|
+
status: createStatus.createStatus({ type: "UNVALIDATED" }),
|
|
56
|
+
validate() {
|
|
57
|
+
return __async(this, null, function* () {
|
|
58
|
+
const validationContext = createFormFieldValidationContext.createFormFieldValidationContext(this);
|
|
59
|
+
this.isValidating.set(true);
|
|
60
|
+
yield this._validator.validate(validationContext);
|
|
61
|
+
this.isValidating.set(false);
|
|
62
|
+
if (this.status._nextValue == null) {
|
|
63
|
+
this.status.set({ type: "VALID" });
|
|
64
|
+
} else {
|
|
65
|
+
this.status.set(this.status._nextValue);
|
|
66
|
+
}
|
|
67
|
+
this.status._nextValue = void 0;
|
|
68
|
+
return this.status.get().type === "VALID";
|
|
69
|
+
});
|
|
70
|
+
},
|
|
71
|
+
isValid() {
|
|
72
|
+
return this.status.get().type === "VALID";
|
|
73
|
+
},
|
|
74
|
+
blur() {
|
|
75
|
+
if (this.isSubmitted.get() && this._config.reValidateMode.has(formField.FormFieldReValidateMode.OnBlur) || !this.isSubmitted.get() && (this._config.validateMode.has(formField.FormFieldValidateMode.OnBlur) || this._config.validateMode.has(formField.FormFieldValidateMode.OnTouched) && !this.isTouched.get())) {
|
|
76
|
+
void this.validate();
|
|
77
|
+
}
|
|
78
|
+
this.isTouched.set(true);
|
|
79
|
+
},
|
|
80
|
+
reset() {
|
|
81
|
+
this.set(this._intialValue, { listenerContext: { source: "form-field_reset" } });
|
|
82
|
+
this.isTouched.set(false);
|
|
83
|
+
this.isSubmitted.set(false);
|
|
84
|
+
this.isSubmitting.set(false);
|
|
85
|
+
this.status.set({ type: "UNVALIDATED" });
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const formField$1 = Object.assign(baseState, formFieldFeature, {
|
|
89
|
+
init({ notifyOnStatusChange: notifyOnStatusChange2 }) {
|
|
90
|
+
if (notifyOnStatusChange2) {
|
|
91
|
+
this.status.listen(
|
|
92
|
+
(data) => {
|
|
93
|
+
baseState._notify({
|
|
94
|
+
listenerContext: { source: "form-field_status-change", status: data.value }
|
|
95
|
+
});
|
|
96
|
+
},
|
|
97
|
+
{ key: "form-field_status-change" }
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
this.listen(
|
|
101
|
+
() => __async(this, null, function* () {
|
|
102
|
+
if (this.isSubmitted.get() && this._config.reValidateMode.has(formField.FormFieldReValidateMode.OnChange) || !this.isSubmitted.get() && this._config.validateMode.has(formField.FormFieldValidateMode.OnChange) || this._config.validateMode.has(formField.FormFieldValidateMode.OnTouched) && this.isTouched.get()) {
|
|
103
|
+
yield this.validate();
|
|
104
|
+
}
|
|
105
|
+
}),
|
|
106
|
+
{ key: "form-field_validate" }
|
|
107
|
+
);
|
|
108
|
+
delete this.init;
|
|
109
|
+
return this;
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
formField$1._features.push("form-field");
|
|
113
|
+
return formField$1.init({ notifyOnStatusChange });
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
exports.createFormField = createFormField;
|
|
117
|
+
//# sourceMappingURL=create-form-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-form-field.js","sources":["../../../src/form-field/create-form-field.ts"],"sourcesContent":["import { TWithInit } from '@blgc/types/features';\nimport { bitwiseFlag, deepCopy } from '@blgc/utils';\nimport { createState } from 'feature-state';\nimport { createValidator } from 'validation-adapter';\nimport {\n\tFormFieldReValidateMode,\n\tFormFieldValidateMode,\n\ttype TFormField,\n\ttype TFormFieldStateConfig,\n\ttype TFormFieldStateFeature,\n\ttype TFormFieldValidator\n} from '../types';\nimport { createFormFieldValidationContext } from './create-form-field-validation-context';\nimport { createStatus } from './create-status';\n\nexport function createFormField<GValue>(\n\tinitialValue: GValue | undefined,\n\tconfig: TCreateFormFieldConfig<GValue>\n): TFormField<GValue> {\n\tconst {\n\t\tkey,\n\t\tvalidator = createValidator([]),\n\t\teditable = true,\n\t\treValidateMode = bitwiseFlag(FormFieldReValidateMode.OnBlur),\n\t\tvalidateMode = bitwiseFlag(FormFieldValidateMode.OnSubmit),\n\t\tcollectErrorMode = 'firstError',\n\t\tnotifyOnStatusChange = true\n\t} = config;\n\tconst baseState = createState(initialValue);\n\n\tconst formFieldFeature: TFormFieldStateFeature<GValue>['api'] = {\n\t\t_config: {\n\t\t\teditable,\n\t\t\tvalidateMode,\n\t\t\treValidateMode,\n\t\t\tcollectErrorMode\n\t\t},\n\t\t_intialValue: deepCopy(baseState._v),\n\t\t_validator: validator,\n\t\tkey,\n\t\tisTouched: createState(false),\n\t\tisSubmitted: createState(false),\n\t\tisSubmitting: createState(false),\n\t\tisValidating: createState(false),\n\t\tstatus: createStatus({ type: 'UNVALIDATED' }),\n\t\tasync validate(this: TFormField<GValue>) {\n\t\t\tconst validationContext = createFormFieldValidationContext(this);\n\n\t\t\tthis.isValidating.set(true);\n\t\t\tawait this._validator.validate(validationContext);\n\t\t\tthis.isValidating.set(false);\n\n\t\t\t// If no error was registered we assume its valid\n\t\t\tif (this.status._nextValue == null) {\n\t\t\t\tthis.status.set({ type: 'VALID' });\n\t\t\t} else {\n\t\t\t\tthis.status.set(this.status._nextValue);\n\t\t\t}\n\n\t\t\tthis.status._nextValue = undefined;\n\n\t\t\treturn this.status.get().type === 'VALID';\n\t\t},\n\t\tisValid(this: TFormField<GValue>) {\n\t\t\treturn this.status.get().type === 'VALID';\n\t\t},\n\t\tblur(this: TFormField<GValue>) {\n\t\t\tif (\n\t\t\t\t(this.isSubmitted.get() &&\n\t\t\t\t\tthis._config.reValidateMode.has(FormFieldReValidateMode.OnBlur)) ||\n\t\t\t\t(!this.isSubmitted.get() &&\n\t\t\t\t\t(this._config.validateMode.has(FormFieldValidateMode.OnBlur) ||\n\t\t\t\t\t\t(this._config.validateMode.has(FormFieldValidateMode.OnTouched) &&\n\t\t\t\t\t\t\t!this.isTouched.get())))\n\t\t\t) {\n\t\t\t\tvoid this.validate();\n\t\t\t}\n\n\t\t\tthis.isTouched.set(true);\n\t\t},\n\t\treset(this: TFormField<GValue>) {\n\t\t\tthis.set(this._intialValue, { listenerContext: { source: 'form-field_reset' } });\n\t\t\tthis.isTouched.set(false);\n\t\t\tthis.isSubmitted.set(false);\n\t\t\tthis.isSubmitting.set(false);\n\t\t\tthis.status.set({ type: 'UNVALIDATED' });\n\t\t}\n\t};\n\n\t// Extend the base state with the form field feature\n\tconst formField = Object.assign(baseState, formFieldFeature, {\n\t\tinit(this: TFormField<GValue>, { notifyOnStatusChange }: TInitFormFieldConfig) {\n\t\t\t// Notify form field listeners if status has changed\n\t\t\tif (notifyOnStatusChange) {\n\t\t\t\tthis.status.listen(\n\t\t\t\t\t(data) => {\n\t\t\t\t\t\tbaseState._notify({\n\t\t\t\t\t\t\tlistenerContext: { source: 'form-field_status-change', status: data.value }\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\t{ key: 'form-field_status-change' }\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Validate on change\n\t\t\tthis.listen(\n\t\t\t\tasync () => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(this.isSubmitted.get() &&\n\t\t\t\t\t\t\tthis._config.reValidateMode.has(FormFieldReValidateMode.OnChange)) ||\n\t\t\t\t\t\t(!this.isSubmitted.get() &&\n\t\t\t\t\t\t\tthis._config.validateMode.has(FormFieldValidateMode.OnChange)) ||\n\t\t\t\t\t\t(this._config.validateMode.has(FormFieldValidateMode.OnTouched) && this.isTouched.get())\n\t\t\t\t\t) {\n\t\t\t\t\t\tawait this.validate();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{ key: 'form-field_validate' }\n\t\t\t);\n\n\t\t\t// @ts-expect-error -- Remove init method after initialization\n\t\t\tdelete this.init;\n\t\t\treturn this;\n\t\t}\n\t}) as TWithInit<TFormField<GValue>, TInitFormFieldConfig>;\n\tformField._features.push('form-field');\n\n\treturn formField.init({ notifyOnStatusChange });\n}\n\nexport interface TCreateFormFieldConfig<GValue> extends Partial<TFormFieldStateConfig> {\n\tkey: string;\n\tvalidator?: TFormFieldValidator<GValue>;\n\tnotifyOnStatusChange?: boolean;\n}\n\ninterface TInitFormFieldConfig {\n\tnotifyOnStatusChange?: boolean;\n}\n"],"names":["createValidator","bitwiseFlag","FormFieldReValidateMode","FormFieldValidateMode","createState","deepCopy","createStatus","createFormFieldValidationContext","formField"],"mappings":"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"}
|
|
@@ -1 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var featureState = require('feature-state');
|
|
4
|
+
|
|
5
|
+
function createStatus(initialValue) {
|
|
6
|
+
const baseState = featureState.createState(initialValue);
|
|
7
|
+
const formFieldStatusFeature = {
|
|
8
|
+
_nextValue: void 0,
|
|
9
|
+
registerNextError(error) {
|
|
10
|
+
var _a;
|
|
11
|
+
if (((_a = this._nextValue) == null ? void 0 : _a.type) === "INVALID") {
|
|
12
|
+
this._nextValue.errors.push(error);
|
|
13
|
+
} else {
|
|
14
|
+
this._nextValue = { type: "INVALID", errors: [error] };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const formFieldStatus = Object.assign(baseState, formFieldStatusFeature);
|
|
19
|
+
formFieldStatus._features.push("form-field-status");
|
|
20
|
+
return formFieldStatus;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
exports.createStatus = createStatus;
|
|
24
|
+
//# sourceMappingURL=create-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-status.js","sources":["../../../src/form-field/create-status.ts"],"sourcesContent":["import { createState } from 'feature-state';\nimport {\n\tTFormFielStatusStateFeature,\n\ttype TFormFieldStatus,\n\ttype TFormFieldStatusValue\n} from '../types';\n\nexport function createStatus(initialValue: TFormFieldStatusValue): TFormFieldStatus {\n\tconst baseState = createState(initialValue);\n\n\tconst formFieldStatusFeature: TFormFielStatusStateFeature['api'] = {\n\t\t_nextValue: undefined,\n\t\tregisterNextError(this: TFormFieldStatus, error) {\n\t\t\tif (this._nextValue?.type === 'INVALID') {\n\t\t\t\tthis._nextValue.errors.push(error);\n\t\t\t} else {\n\t\t\t\tthis._nextValue = { type: 'INVALID', errors: [error] };\n\t\t\t}\n\t\t}\n\t};\n\n\t// Extend the base state with the form field status feature\n\tconst formFieldStatus = Object.assign(baseState, formFieldStatusFeature) as TFormFieldStatus;\n\tformFieldStatus._features.push('form-field-status');\n\n\treturn formFieldStatus;\n}\n"],"names":["createState"],"mappings":";;;;AAEO,SAAS,YAAY,CAAC,YAAY,EAAE;AAC3C,EAAE,MAAM,SAAS,GAAGA,wBAAW,CAAC,YAAY,CAAC;AAC7C,EAAE,MAAM,sBAAsB,GAAG;AACjC,IAAI,UAAU,EAAE,MAAM;AACtB,IAAI,iBAAiB,CAAC,KAAK,EAAE;AAC7B,MAAM,IAAI,EAAE;AACZ,MAAM,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,KAAK,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,MAAM,SAAS,EAAE;AAC7E,QAAQ,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1C,OAAO,MAAM;AACb,QAAQ,IAAI,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE;AAC9D;AACA;AACA,GAAG;AACH,EAAE,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;AAC1E,EAAE,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC;AACrD,EAAE,OAAO,eAAe;AACxB;;;;"}
|
|
@@ -1 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function isFormFieldStatus(value) {
|
|
4
|
+
return typeof value === "object" && value != null && "_features" in value && Array.isArray(value._features) && value._features.includes("form-field-status");
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
exports.isFormFieldStatus = isFormFieldStatus;
|
|
8
|
+
//# sourceMappingURL=is-form-field-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-form-field-status.js","sources":["../../../src/form-field/is-form-field-status.ts"],"sourcesContent":["import { TFormFieldStatus } from '../types';\n\nexport function isFormFieldStatus(value: unknown): value is TFormFieldStatus {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue != null &&\n\t\t'_features' in value &&\n\t\tArray.isArray(value._features) &&\n\t\tvalue._features.includes('form-field-status')\n\t);\n}\n"],"names":[],"mappings":";;AACO,SAAS,iBAAiB,CAAC,KAAK,EAAE;AACzC,EAAE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,WAAW,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC;AAC9J;;;;"}
|
|
@@ -1 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function isFormField(value) {
|
|
4
|
+
return typeof value === "object" && value != null && "_features" in value && Array.isArray(value._features) && value._features.includes("form-field");
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
exports.isFormField = isFormField;
|
|
8
|
+
//# sourceMappingURL=is-form-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-form-field.js","sources":["../../../src/form-field/is-form-field.ts"],"sourcesContent":["import { type TFormField } from '../types';\n\nexport function isFormField<GValue = unknown>(value: unknown): value is TFormField<GValue> {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue != null &&\n\t\t'_features' in value &&\n\t\tArray.isArray(value._features) &&\n\t\tvalue._features.includes('form-field')\n\t);\n}\n"],"names":[],"mappings":";;AACO,SAAS,WAAW,CAAC,KAAK,EAAE;AACnC,EAAE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,WAAW,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;AACvJ;;;;"}
|
|
@@ -1 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
function fromValidator(validator, config) {
|
|
20
|
+
return __spreadValues({ validator }, config);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
exports.fromValidator = fromValidator;
|
|
24
|
+
//# sourceMappingURL=from-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from-validator.js","sources":["../../../src/helper/from-validator.ts"],"sourcesContent":["import { type TCreateFormConfigFormField } from '../create-form';\nimport { type TFormFieldValidator } from '../types';\n\n// Helper function to make type inference work\n// https://github.com/microsoft/TypeScript/issues/26242\nexport function fromValidator<GValue>(\n\tvalidator: TFormFieldValidator<GValue>,\n\tconfig: Omit<TCreateFormConfigFormField<GValue>, 'validator'>\n): TCreateFormConfigFormField<GValue> {\n\treturn { validator, ...config };\n}\n"],"names":[],"mappings":";;AACA,IAAI,SAAS,GAAG,MAAM,CAAC,cAAc;AACrC,IAAI,mBAAmB,GAAG,MAAM,CAAC,qBAAqB;AACtD,IAAI,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc;AAClD,IAAI,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,oBAAoB;AACxD,IAAI,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,KAAK,GAAG,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK;AAC/J,IAAI,cAAc,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK;AAC/B,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;AAChC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AAClC,MAAM,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACvC,EAAE,IAAI,mBAAmB;AACzB,IAAI,KAAK,IAAI,IAAI,IAAI,mBAAmB,CAAC,CAAC,CAAC,EAAE;AAC7C,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AACpC,QAAQ,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACzC;AACA,EAAE,OAAO,CAAC;AACV,CAAC;AACM,SAAS,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE;AACjD,EAAE,OAAO,cAAc,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAC9C;;;;"}
|
|
@@ -1 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function hasFormChanged(form) {
|
|
4
|
+
var _a, _b;
|
|
5
|
+
for (const key in form.fields) {
|
|
6
|
+
if (((_a = form.fields[key]) == null ? void 0 : _a.get()) !== ((_b = form.fields[key]) == null ? void 0 : _b._intialValue)) {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
exports.hasFormChanged = hasFormChanged;
|
|
14
|
+
//# sourceMappingURL=has-form-changed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"has-form-changed.js","sources":["../../../src/helper/has-form-changed.ts"],"sourcesContent":["import { type TForm } from '../types';\n\nexport function hasFormChanged(form: TForm<any, any>): boolean {\n\tfor (const key in form.fields) {\n\t\tif (form.fields[key]?.get() !== form.fields[key]?._intialValue) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n"],"names":[],"mappings":";;AACO,SAAS,cAAc,CAAC,IAAI,EAAE;AACrC,EAAE,IAAI,EAAE,EAAE,EAAE;AACZ,EAAE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE;AACjC,IAAI,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE;AAChI,MAAM,OAAO,IAAI;AACjB;AACA;AACA,EAAE,OAAO,KAAK;AACd;;;;"}
|
|
@@ -1 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function resetFormSubmitted(form) {
|
|
4
|
+
form.isSubmitted.set(false);
|
|
5
|
+
form.isSubmitting.set(false);
|
|
6
|
+
for (const formField of Object.values(form.fields)) {
|
|
7
|
+
formField.isSubmitted.set(false);
|
|
8
|
+
formField.isSubmitting.set(false);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
exports.resetFormSubmitted = resetFormSubmitted;
|
|
13
|
+
//# sourceMappingURL=reset-form-submitted.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset-form-submitted.js","sources":["../../../src/helper/reset-form-submitted.ts"],"sourcesContent":["import { type TForm } from '../types';\n\nexport function resetFormSubmitted(form: TForm<any, any>): void {\n\tform.isSubmitted.set(false);\n\tform.isSubmitting.set(false);\n\tfor (const formField of Object.values(form.fields)) {\n\t\tformField.isSubmitted.set(false);\n\t\tformField.isSubmitting.set(false);\n\t}\n}\n"],"names":[],"mappings":";;AACO,SAAS,kBAAkB,CAAC,IAAI,EAAE;AACzC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,EAAE,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACtD,IAAI,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,IAAI,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AACrC;AACA;;;;"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -1 +1,36 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@blgc/utils');
|
|
4
|
+
var createForm = require('./create-form.js');
|
|
5
|
+
var createFormField = require('./form-field/create-form-field.js');
|
|
6
|
+
var createStatus = require('./form-field/create-status.js');
|
|
7
|
+
var isFormField = require('./form-field/is-form-field.js');
|
|
8
|
+
var isFormFieldStatus = require('./form-field/is-form-field-status.js');
|
|
9
|
+
var fromValidator = require('./helper/from-validator.js');
|
|
10
|
+
var hasFormChanged = require('./helper/has-form-changed.js');
|
|
11
|
+
var resetFormSubmitted = require('./helper/reset-form-submitted.js');
|
|
12
|
+
var isFormWithFeatures = require('./is-form-with-features.js');
|
|
13
|
+
var formField = require('./types/form-field.js');
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
Object.defineProperty(exports, "BitwiseFlag", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return utils.BitwiseFlag; }
|
|
20
|
+
});
|
|
21
|
+
Object.defineProperty(exports, "bitwiseFlag", {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () { return utils.bitwiseFlag; }
|
|
24
|
+
});
|
|
25
|
+
exports.createForm = createForm.createForm;
|
|
26
|
+
exports.createFormField = createFormField.createFormField;
|
|
27
|
+
exports.createStatus = createStatus.createStatus;
|
|
28
|
+
exports.isFormField = isFormField.isFormField;
|
|
29
|
+
exports.isFormFieldStatus = isFormFieldStatus.isFormFieldStatus;
|
|
30
|
+
exports.fromValidator = fromValidator.fromValidator;
|
|
31
|
+
exports.hasFormChanged = hasFormChanged.hasFormChanged;
|
|
32
|
+
exports.resetFormSubmitted = resetFormSubmitted.resetFormSubmitted;
|
|
33
|
+
exports.isFormWithFeatures = isFormWithFeatures.isFormWithFeatures;
|
|
34
|
+
exports.FormFieldReValidateMode = formField.FormFieldReValidateMode;
|
|
35
|
+
exports.FormFieldValidateMode = formField.FormFieldValidateMode;
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|