@mantine-vue/form 1.1.1

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/esm/index.mjs ADDED
@@ -0,0 +1,521 @@
1
+ import { computed, inject, provide, ref, toRaw } from "vue";
2
+ //#region src/paths.ts
3
+ function getPath(path, values) {
4
+ return String(path).split(".").reduce((acc, key) => acc == null ? acc : acc[key], values);
5
+ }
6
+ function setPath(path, value, values) {
7
+ const keys = String(path).split(".");
8
+ const result = JSON.parse(JSON.stringify(values));
9
+ let cursor = result;
10
+ keys.slice(0, -1).forEach((key) => {
11
+ if (cursor[key] === void 0) cursor[key] = {};
12
+ cursor = cursor[key];
13
+ });
14
+ cursor[keys[keys.length - 1]] = value;
15
+ return result;
16
+ }
17
+ function insertPath(path, item, index, values) {
18
+ const currentValue = getPath(path, values);
19
+ if (!Array.isArray(currentValue)) return values;
20
+ const cloned = [...currentValue];
21
+ const position = index === void 0 ? cloned.length : Math.min(Math.max(index, 0), cloned.length);
22
+ cloned.splice(position, 0, item);
23
+ return setPath(path, cloned, values);
24
+ }
25
+ function removePath(path, index, values) {
26
+ const currentValue = getPath(path, values);
27
+ if (!Array.isArray(currentValue)) return values;
28
+ const cloned = [...currentValue];
29
+ cloned.splice(index, 1);
30
+ return setPath(path, cloned, values);
31
+ }
32
+ function replacePath(path, item, index, values) {
33
+ const currentValue = getPath(path, values);
34
+ if (!Array.isArray(currentValue)) return values;
35
+ const cloned = [...currentValue];
36
+ cloned[index] = item;
37
+ return setPath(path, cloned, values);
38
+ }
39
+ function reorderPath(path, { from, to }, values) {
40
+ const currentValue = getPath(path, values);
41
+ if (!Array.isArray(currentValue)) return values;
42
+ const cloned = [...currentValue];
43
+ const item = cloned.splice(from, 1)[0];
44
+ cloned.splice(to, 0, item);
45
+ return setPath(path, cloned, values);
46
+ }
47
+ function getDataPath(name, path) {
48
+ return name ? `${name}-${String(path)}` : String(path);
49
+ }
50
+ //#endregion
51
+ //#region src/validators.ts
52
+ function filterErrors(errors) {
53
+ if (errors === null || typeof errors !== "object") return {};
54
+ return Object.keys(errors).reduce((acc, key) => {
55
+ const errorValue = errors[key];
56
+ if (errorValue !== void 0 && errorValue !== null && errorValue !== false) acc[key] = errorValue;
57
+ return acc;
58
+ }, {});
59
+ }
60
+ function hasLength(payload, error = true) {
61
+ return (value) => {
62
+ if (payload.min !== void 0 && value.length < payload.min) return error;
63
+ if (payload.max !== void 0 && value.length > payload.max) return error;
64
+ return null;
65
+ };
66
+ }
67
+ function isNotEmpty(error = true) {
68
+ return (value) => {
69
+ if (Array.isArray(value)) return value.length > 0 ? null : error;
70
+ return value !== null && value !== void 0 && String(value).trim().length > 0 ? null : error;
71
+ };
72
+ }
73
+ function matches(regexp, error = true) {
74
+ return (value) => regexp.test(value) ? null : error;
75
+ }
76
+ function isEmail(error = true) {
77
+ return matches(/^\S+@\S+$/i, error);
78
+ }
79
+ function isInRange(payload, error = true) {
80
+ return (value) => {
81
+ if (payload.min !== void 0 && value < payload.min) return error;
82
+ if (payload.max !== void 0 && value > payload.max) return error;
83
+ return null;
84
+ };
85
+ }
86
+ function matchesField(path, error = true) {
87
+ return (value, values) => value === getPath(path, values) ? null : error;
88
+ }
89
+ function isNotEmptyHtml(error = true) {
90
+ return (value) => {
91
+ const div = typeof document !== "undefined" ? document.createElement("div") : null;
92
+ if (!div) return value && value.replace(/<[^>]*>/g, "").trim().length > 0 ? null : error;
93
+ div.innerHTML = value;
94
+ return div.textContent?.trim() ? null : error;
95
+ };
96
+ }
97
+ function isJsonString(error = true) {
98
+ return (value) => {
99
+ try {
100
+ JSON.parse(value);
101
+ return null;
102
+ } catch {
103
+ return error;
104
+ }
105
+ };
106
+ }
107
+ var formRootRule = Symbol("root-rule");
108
+ function validateRulesRecord(rules, values, path = "", errors = {}) {
109
+ if (typeof rules !== "object" || rules === null) return errors;
110
+ return Reflect.ownKeys(rules).reduce((acc, ruleKey) => {
111
+ const rule = rules[ruleKey];
112
+ if (ruleKey === formRootRule) {
113
+ acc[path] = rule(path ? getPath(path, values) : values, values, path);
114
+ return acc;
115
+ }
116
+ const rulePath = `${path === "" ? "" : `${path}.`}${String(ruleKey)}`;
117
+ const value = getPath(rulePath, values);
118
+ let arrayValidation = false;
119
+ if (typeof rule === "function") acc[rulePath] = rule(value, values, rulePath);
120
+ if (typeof rule === "object" && Array.isArray(value)) {
121
+ arrayValidation = true;
122
+ value.forEach((_item, index) => validateRulesRecord(rule, values, `${rulePath}.${index}`, acc));
123
+ if (formRootRule in rule) acc[rulePath] = rule[formRootRule](value, values, rulePath);
124
+ }
125
+ if (typeof rule === "object" && typeof value === "object" && value !== null) {
126
+ if (!arrayValidation) validateRulesRecord(rule, values, rulePath, acc);
127
+ if (formRootRule in rule) acc[rulePath] = rule[formRootRule](value, values, rulePath);
128
+ }
129
+ return acc;
130
+ }, errors);
131
+ }
132
+ function validateValues(rules, values) {
133
+ if (!rules) return {
134
+ hasErrors: false,
135
+ errors: {}
136
+ };
137
+ const errors = filterErrors(typeof rules === "function" ? rules(values) : validateRulesRecord(rules, values));
138
+ return {
139
+ hasErrors: Object.keys(errors).length > 0,
140
+ errors
141
+ };
142
+ }
143
+ function validateFieldValue(path, rules, values) {
144
+ const error = validateValues(rules, values).errors[String(path)];
145
+ return {
146
+ hasError: error !== void 0,
147
+ error
148
+ };
149
+ }
150
+ function schemaResolver(schema) {
151
+ return (values) => {
152
+ const result = schema.safeParse(values);
153
+ if (result.success) return {};
154
+ return result.error.issues.reduce((acc, issue) => {
155
+ acc[issue.path.join(".")] = issue.message;
156
+ return acc;
157
+ }, {});
158
+ };
159
+ }
160
+ var zodResolver = schemaResolver;
161
+ var yupResolver = schemaResolver;
162
+ var superstructResolver = schemaResolver;
163
+ var joiResolver = schemaResolver;
164
+ //#endregion
165
+ //#region src/use-form.ts
166
+ function clone(value) {
167
+ return JSON.parse(JSON.stringify(toRaw(value ?? {})));
168
+ }
169
+ function isEqual(a, b) {
170
+ return JSON.stringify(toRaw(a)) === JSON.stringify(toRaw(b));
171
+ }
172
+ function shouldValidate(path, rule) {
173
+ if (Array.isArray(rule)) return rule.includes(String(path));
174
+ return Boolean(rule);
175
+ }
176
+ function getStatus(status, path) {
177
+ const paths = Object.keys(status);
178
+ if (typeof path === "string") {
179
+ const nestedPaths = paths.filter((statusPath) => statusPath.startsWith(`${path}.`));
180
+ return status[path] || nestedPaths.some((statusPath) => status[statusPath]) || false;
181
+ }
182
+ return paths.some((statusPath) => status[statusPath]);
183
+ }
184
+ function clearListState(path, state) {
185
+ if (typeof path !== "string") return state;
186
+ return Object.keys(state).reduce((acc, key) => {
187
+ if (!key.startsWith(`${path}.`)) acc[key] = state[key];
188
+ return acc;
189
+ }, {});
190
+ }
191
+ function changeErrorIndices(path, index, errors, change) {
192
+ if (typeof path !== "string" || index === void 0) return errors;
193
+ const pathRegex = new RegExp(`^${path.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\.(\\d+)(.*)$`);
194
+ return Object.keys(errors).reduce((acc, key) => {
195
+ const match = key.match(pathRegex);
196
+ if (!match) {
197
+ acc[key] = errors[key];
198
+ return acc;
199
+ }
200
+ const itemIndex = Number(match[1]);
201
+ if (change === -1 && itemIndex === index) return acc;
202
+ const nextIndex = itemIndex >= index ? itemIndex + change : itemIndex;
203
+ acc[`${path}.${nextIndex}${match[2]}`] = errors[key];
204
+ return acc;
205
+ }, {});
206
+ }
207
+ function reorderErrors(path, payload, errors) {
208
+ if (typeof path !== "string") return errors;
209
+ const pathRegex = new RegExp(`^${path.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\.(\\d+)(.*)$`);
210
+ return Object.keys(errors).reduce((acc, key) => {
211
+ const match = key.match(pathRegex);
212
+ if (!match) {
213
+ acc[key] = errors[key];
214
+ return acc;
215
+ }
216
+ const itemIndex = Number(match[1]);
217
+ let nextIndex = itemIndex;
218
+ if (itemIndex === payload.from) nextIndex = payload.to;
219
+ else if (payload.from < payload.to && itemIndex > payload.from && itemIndex <= payload.to) nextIndex = itemIndex - 1;
220
+ else if (payload.from > payload.to && itemIndex >= payload.to && itemIndex < payload.from) nextIndex = itemIndex + 1;
221
+ acc[`${path}.${nextIndex}${match[2]}`] = errors[key];
222
+ return acc;
223
+ }, {});
224
+ }
225
+ function getInputValue(input, type) {
226
+ if (typeof input === "function") return input;
227
+ const target = input?.currentTarget ?? input?.target;
228
+ if (target) {
229
+ if (type === "checkbox" || target.type === "checkbox") return target.checked;
230
+ return target.value;
231
+ }
232
+ return input;
233
+ }
234
+ function useForm({ name, mode = "controlled", initialValues, initialErrors = {}, initialDirty = {}, initialTouched = {}, clearInputErrorOnChange = true, validateInputOnChange = false, validateInputOnBlur = false, validate: rules, transformValues = ((values) => values), onValuesChange, enhanceGetInputProps, onSubmitPreventDefault = "always", touchTrigger = "change", cascadeUpdates = false } = {}) {
235
+ const initialSnapshot = ref(clone(initialValues ?? {}));
236
+ const values = ref(clone(initialSnapshot.value));
237
+ const errors = ref({ ...initialErrors });
238
+ const touched = ref({ ...initialTouched });
239
+ const dirty = ref({ ...initialDirty });
240
+ const initialized = ref(false);
241
+ const submitting = ref(false);
242
+ const formKey = ref(0);
243
+ const fieldKeys = ref({});
244
+ const watchers = /* @__PURE__ */ new Map();
245
+ const notifyWatchers = (previous, updated = values.value, changedPath) => {
246
+ watchers.forEach((subscribers, path) => {
247
+ if (changedPath && !cascadeUpdates && path !== String(changedPath)) return;
248
+ if (changedPath && cascadeUpdates && path !== String(changedPath) && !path.startsWith(`${String(changedPath)}.`) && !String(changedPath).startsWith(`${path}.`)) return;
249
+ const previousValue = getPath(path, previous);
250
+ const value = getPath(path, updated);
251
+ if (previousValue !== value) subscribers.forEach((subscriber) => subscriber({
252
+ previousValue,
253
+ value,
254
+ touched: api.isTouched(path),
255
+ dirty: api.isDirty(path)
256
+ }));
257
+ });
258
+ };
259
+ const handleValuesChange = (previous, changedPath) => {
260
+ onValuesChange?.(values.value, previous);
261
+ notifyWatchers(previous, values.value, changedPath);
262
+ };
263
+ const setValues = (nextValues) => {
264
+ const previous = clone(values.value);
265
+ const patch = typeof nextValues === "function" ? nextValues(values.value) : nextValues;
266
+ values.value = {
267
+ ...values.value,
268
+ ...patch
269
+ };
270
+ if (clearInputErrorOnChange) errors.value = {};
271
+ if (mode === "uncontrolled") formKey.value += 1;
272
+ handleValuesChange(previous);
273
+ };
274
+ const setFieldValue = (path, value, options = {}) => {
275
+ const currentValue = getPath(path, values.value);
276
+ const resolvedValue = typeof value === "function" ? value(currentValue) : value;
277
+ if (currentValue === resolvedValue) return;
278
+ const previous = clone(values.value);
279
+ values.value = setPath(path, resolvedValue, values.value);
280
+ dirty.value = {
281
+ ...clearListState(path, dirty.value),
282
+ [String(path)]: !isEqual(resolvedValue, getPath(path, initialSnapshot.value))
283
+ };
284
+ if (touchTrigger === "change") touched.value[String(path)] = true;
285
+ if (clearInputErrorOnChange) delete errors.value[String(path)];
286
+ if (shouldValidate(path, validateInputOnChange)) {
287
+ const result = validateFieldValue(path, rules, values.value);
288
+ if (result.hasError) errors.value[String(path)] = result.error;
289
+ }
290
+ if (mode === "uncontrolled" && options.forceUpdate !== false) fieldKeys.value[String(path)] = (fieldKeys.value[String(path)] ?? 0) + 1;
291
+ handleValuesChange(previous, path);
292
+ };
293
+ const reset = () => {
294
+ const previous = clone(values.value);
295
+ values.value = clone(initialSnapshot.value);
296
+ errors.value = {};
297
+ touched.value = {};
298
+ dirty.value = {};
299
+ formKey.value += 1;
300
+ handleValuesChange(previous);
301
+ };
302
+ const resetField = (path) => {
303
+ const initialValue = getPath(path, initialSnapshot.value);
304
+ if (typeof initialValue === "undefined") return;
305
+ setFieldValue(path, initialValue);
306
+ delete touched.value[String(path)];
307
+ delete dirty.value[String(path)];
308
+ };
309
+ const validate = () => {
310
+ const result = validateValues(rules, values.value);
311
+ errors.value = result.errors;
312
+ return result;
313
+ };
314
+ const validateField = (path) => {
315
+ const result = validateFieldValue(path, rules, values.value);
316
+ if (result.hasError) errors.value[String(path)] = result.error;
317
+ else delete errors.value[String(path)];
318
+ return result;
319
+ };
320
+ const getInputProps = (path, { type = "input", withError = true, withFocus = type !== "radio", value: radioValue } = {}) => {
321
+ const currentValue = getPath(path, values.value);
322
+ const payload = { "data-path": getDataPath(name, path) };
323
+ if (withError) payload.error = errors.value[String(path)];
324
+ const onChange = (eventOrValue) => setFieldValue(path, getInputValue(eventOrValue, type), { forceUpdate: false });
325
+ payload.onChange = onChange;
326
+ payload.onInput = onChange;
327
+ if (type === "checkbox") payload[mode === "controlled" ? "checked" : "defaultChecked"] = currentValue;
328
+ else if (type === "radio") {
329
+ payload.checked = currentValue === radioValue;
330
+ payload.value = radioValue;
331
+ } else payload[mode === "controlled" ? "value" : "defaultValue"] = currentValue;
332
+ if (withFocus) {
333
+ payload.onFocus = () => {
334
+ touched.value[String(path)] = true;
335
+ };
336
+ payload.onBlur = () => {
337
+ if (shouldValidate(path, validateInputOnBlur)) validateField(path);
338
+ };
339
+ }
340
+ return Object.assign(payload, enhanceGetInputProps?.({
341
+ inputProps: payload,
342
+ field: path,
343
+ options: {
344
+ type,
345
+ withError,
346
+ withFocus,
347
+ value: radioValue
348
+ },
349
+ form: api
350
+ }));
351
+ };
352
+ const api = {
353
+ watch: (path, subscriber) => {
354
+ const key = String(path);
355
+ const subscribers = watchers.get(key) ?? /* @__PURE__ */ new Set();
356
+ subscribers.add(subscriber);
357
+ watchers.set(key, subscribers);
358
+ return () => {
359
+ const current = watchers.get(key);
360
+ current?.delete(subscriber);
361
+ if (current?.size === 0) watchers.delete(key);
362
+ };
363
+ },
364
+ values,
365
+ initialized,
366
+ errors,
367
+ touched,
368
+ dirty,
369
+ submitting,
370
+ getValues: () => values.value,
371
+ getInitialValues: () => initialSnapshot.value,
372
+ setInitialValues: (nextValues) => {
373
+ initialSnapshot.value = clone(nextValues);
374
+ },
375
+ setValues,
376
+ setFieldValue,
377
+ reset,
378
+ onReset: (event) => {
379
+ event?.preventDefault();
380
+ reset();
381
+ },
382
+ resetField,
383
+ initialize: (nextValues) => {
384
+ if (initialized.value) return;
385
+ const previous = clone(values.value);
386
+ initialSnapshot.value = clone(nextValues);
387
+ values.value = clone(nextValues);
388
+ initialized.value = true;
389
+ if (mode === "uncontrolled") formKey.value += 1;
390
+ handleValuesChange(previous);
391
+ },
392
+ setSubmitting: (nextSubmitting) => {
393
+ submitting.value = typeof nextSubmitting === "function" ? nextSubmitting(submitting.value) : nextSubmitting;
394
+ },
395
+ setErrors: (nextErrors) => {
396
+ errors.value = typeof nextErrors === "function" ? nextErrors(errors.value) : nextErrors;
397
+ },
398
+ setFieldError: (path, error) => {
399
+ errors.value[String(path)] = error;
400
+ },
401
+ clearFieldError: (path) => {
402
+ delete errors.value[String(path)];
403
+ },
404
+ clearErrors: () => {
405
+ errors.value = {};
406
+ },
407
+ setTouched: (nextTouched) => {
408
+ touched.value = typeof nextTouched === "function" ? nextTouched(touched.value) : nextTouched;
409
+ },
410
+ setDirty: (nextDirty) => {
411
+ dirty.value = typeof nextDirty === "function" ? nextDirty(dirty.value) : nextDirty;
412
+ },
413
+ resetTouched: () => {
414
+ touched.value = {};
415
+ },
416
+ resetDirty: (nextValues) => {
417
+ initialSnapshot.value = nextValues ? {
418
+ ...values.value,
419
+ ...clone(nextValues)
420
+ } : clone(values.value);
421
+ dirty.value = {};
422
+ },
423
+ getTouched: () => touched.value,
424
+ getDirty: () => dirty.value,
425
+ isTouched: (path) => path ? getStatus(touched.value, String(path)) : Object.values(touched.value).some(Boolean),
426
+ isDirty: (path) => {
427
+ if (path) {
428
+ const overriddenValue = getPath(path, dirty.value);
429
+ if (typeof overriddenValue === "boolean") return overriddenValue;
430
+ return !isEqual(getPath(path, values.value), getPath(path, initialSnapshot.value));
431
+ }
432
+ return Object.keys(dirty.value).length > 0 ? getStatus(dirty.value) : !isEqual(values.value, initialSnapshot.value);
433
+ },
434
+ reorderListItem: (path, payload) => {
435
+ const previous = clone(values.value);
436
+ dirty.value = clearListState(path, dirty.value);
437
+ errors.value = reorderErrors(path, payload, errors.value);
438
+ values.value = reorderPath(path, payload, values.value);
439
+ handleValuesChange(previous, path);
440
+ },
441
+ insertListItem: (path, item, index) => {
442
+ const previous = clone(values.value);
443
+ dirty.value = clearListState(path, dirty.value);
444
+ errors.value = changeErrorIndices(path, index, errors.value, 1);
445
+ values.value = insertPath(path, item, index, values.value);
446
+ handleValuesChange(previous, path);
447
+ },
448
+ removeListItem: (path, index) => {
449
+ const previous = clone(values.value);
450
+ dirty.value = clearListState(path, dirty.value);
451
+ errors.value = changeErrorIndices(path, index, errors.value, -1);
452
+ values.value = removePath(path, index, values.value);
453
+ handleValuesChange(previous, path);
454
+ },
455
+ replaceListItem: (path, index, item) => {
456
+ const previous = clone(values.value);
457
+ dirty.value = clearListState(path, dirty.value);
458
+ values.value = replacePath(path, item, index, values.value);
459
+ handleValuesChange(previous, path);
460
+ },
461
+ validate,
462
+ validateField,
463
+ isValid: (path) => path ? !validateFieldValue(path, rules, values.value).hasError : !validateValues(rules, values.value).hasErrors,
464
+ getInputProps,
465
+ onSubmit: (submit, validationFailure) => (event) => {
466
+ if (onSubmitPreventDefault === "always") event?.preventDefault();
467
+ const result = validate();
468
+ if (result.hasErrors) {
469
+ if (onSubmitPreventDefault === "validation-failed") event?.preventDefault();
470
+ validationFailure?.(result.errors, values.value, event);
471
+ return;
472
+ }
473
+ const submitResult = submit(transformValues(values.value), event);
474
+ if (submitResult instanceof Promise) submitResult.finally(() => {
475
+ submitting.value = false;
476
+ });
477
+ else submitting.value = false;
478
+ },
479
+ getTransformedValues: (input) => transformValues(input ?? values.value),
480
+ key: (path) => `${formKey.value}-${String(path)}-${fieldKeys.value[String(path)] ?? 0}`,
481
+ getInputNode: (path) => typeof document === "undefined" ? null : document.querySelector(`[data-path="${getDataPath(name, path)}"]`)
482
+ };
483
+ return api;
484
+ }
485
+ //#endregion
486
+ //#region src/FormProvider.ts
487
+ function createFormContext() {
488
+ const key = Symbol("MantineVueFormContext");
489
+ const FormProvider = (form) => provide(key, form);
490
+ const useFormContext = () => {
491
+ const ctx = inject(key, null);
492
+ if (!ctx) throw new Error("[@mantine-vue/form] FormProvider was not found in tree");
493
+ return ctx;
494
+ };
495
+ return [
496
+ FormProvider,
497
+ useFormContext,
498
+ key
499
+ ];
500
+ }
501
+ //#endregion
502
+ //#region src/use-field.ts
503
+ function useField({ form, path }) {
504
+ return {
505
+ value: computed({
506
+ get: () => form.getInputProps(path).value,
507
+ set: (value) => form.setFieldValue(path, value)
508
+ }),
509
+ error: computed(() => form.errors.value[String(path)]),
510
+ touched: computed(() => form.isTouched(path)),
511
+ dirty: computed(() => form.isDirty(path)),
512
+ getInputProps: () => form.getInputProps(path)
513
+ };
514
+ }
515
+ //#endregion
516
+ //#region src/index.ts
517
+ var FORM_INDEX = "__mantine-form-index__";
518
+ //#endregion
519
+ export { FORM_INDEX, createFormContext, formRootRule, getDataPath, getPath, hasLength, insertPath, isEmail, isInRange, isJsonString, isNotEmpty, isNotEmptyHtml, joiResolver, matches, matchesField, removePath, reorderPath, replacePath, schemaResolver, setPath, superstructResolver, useField, useForm, validateFieldValue, validateValues, yupResolver, zodResolver };
520
+
521
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/paths.ts","../src/validators.ts","../src/use-form.ts","../src/FormProvider.ts","../src/use-field.ts","../src/index.ts"],"sourcesContent":["export function getPath(path: PropertyKey, values: Record<PropertyKey, any>) {\n return String(path)\n .split('.')\n .reduce((acc, key) => (acc == null ? acc : acc[key]), values)\n}\n\nexport function setPath(path: PropertyKey, value: any, values: Record<PropertyKey, any>) {\n const keys = String(path).split('.')\n const result = JSON.parse(JSON.stringify(values))\n let cursor: any = result\n\n keys.slice(0, -1).forEach((key) => {\n if (cursor[key] === undefined) {\n cursor[key] = {}\n }\n cursor = cursor[key]\n })\n\n cursor[keys[keys.length - 1]] = value\n return result\n}\n\nexport function insertPath(\n path: PropertyKey,\n item: any,\n index: number | undefined,\n values: Record<PropertyKey, any>,\n) {\n const currentValue = getPath(path, values)\n\n if (!Array.isArray(currentValue)) {\n return values\n }\n\n const cloned = [...currentValue]\n const position = index === undefined ? cloned.length : Math.min(Math.max(index, 0), cloned.length)\n cloned.splice(position, 0, item)\n\n return setPath(path, cloned, values)\n}\n\nexport function removePath(path: PropertyKey, index: number, values: Record<PropertyKey, any>) {\n const currentValue = getPath(path, values)\n\n if (!Array.isArray(currentValue)) {\n return values\n }\n\n const cloned = [...currentValue]\n cloned.splice(index, 1)\n\n return setPath(path, cloned, values)\n}\n\nexport function replacePath(\n path: PropertyKey,\n item: any,\n index: number,\n values: Record<PropertyKey, any>,\n) {\n const currentValue = getPath(path, values)\n\n if (!Array.isArray(currentValue)) {\n return values\n }\n\n const cloned = [...currentValue]\n cloned[index] = item\n\n return setPath(path, cloned, values)\n}\n\ninterface ReorderPayload {\n from: number\n to: number\n}\n\nexport function reorderPath(\n path: PropertyKey,\n { from, to }: ReorderPayload,\n values: Record<PropertyKey, any>,\n) {\n const currentValue = getPath(path, values)\n\n if (!Array.isArray(currentValue)) {\n return values\n }\n\n const cloned = [...currentValue]\n const item = cloned.splice(from, 1)[0]\n cloned.splice(to, 0, item)\n\n return setPath(path, cloned, values)\n}\n\nexport function getDataPath(name: string | undefined, path: PropertyKey) {\n return name ? `${name}-${String(path)}` : String(path)\n}\n","import { getPath } from './paths'\nimport type { FormErrors, FormRule, FormRulesRecord } from './types'\n\nfunction filterErrors(errors: FormErrors): FormErrors {\n if (errors === null || typeof errors !== 'object') {\n return {}\n }\n\n return Object.keys(errors).reduce<FormErrors>((acc, key) => {\n const errorValue = errors[key]\n\n if (errorValue !== undefined && errorValue !== null && errorValue !== false) {\n acc[key] = errorValue\n }\n\n return acc\n }, {})\n}\n\nexport function hasLength(payload: { min?: number; max?: number }, error: any = true) {\n return (value: string | unknown[]) => {\n if (payload.min !== undefined && value.length < payload.min) {\n return error\n }\n\n if (payload.max !== undefined && value.length > payload.max) {\n return error\n }\n\n return null\n }\n}\n\nexport function isNotEmpty(error: any = true) {\n return (value: unknown) => {\n if (Array.isArray(value)) {\n return value.length > 0 ? null : error\n }\n\n return value !== null && value !== undefined && String(value).trim().length > 0 ? null : error\n }\n}\n\nexport function matches(regexp: RegExp, error: any = true) {\n return (value: string) => (regexp.test(value) ? null : error)\n}\n\nexport function isEmail(error: any = true) {\n return matches(/^\\S+@\\S+$/i, error)\n}\n\nexport function isInRange(payload: { min?: number; max?: number }, error: any = true) {\n return (value: number) => {\n if (payload.min !== undefined && value < payload.min) {\n return error\n }\n\n if (payload.max !== undefined && value > payload.max) {\n return error\n }\n\n return null\n }\n}\n\nexport function matchesField(path: string, error: any = true) {\n return (value: unknown, values: Record<string, any>) =>\n value === getPath(path, values) ? null : error\n}\n\nexport function isNotEmptyHtml(error: any = true) {\n return (value: string) => {\n const div = typeof document !== 'undefined' ? document.createElement('div') : null\n if (!div) {\n return value && value.replace(/<[^>]*>/g, '').trim().length > 0 ? null : error\n }\n\n div.innerHTML = value\n return div.textContent?.trim() ? null : error\n }\n}\n\nexport function isJsonString(error: any = true) {\n return (value: string) => {\n try {\n JSON.parse(value)\n return null\n } catch {\n return error\n }\n }\n}\n\nexport const formRootRule = Symbol('root-rule')\n\nfunction validateRulesRecord<Values>(\n rules: FormRulesRecord<Values> | undefined,\n values: Values,\n path = '',\n errors: FormErrors = {},\n) {\n if (typeof rules !== 'object' || rules === null) {\n return errors\n }\n\n return Reflect.ownKeys(rules).reduce<FormErrors>((acc, ruleKey) => {\n const rule = (rules as any)[ruleKey] as FormRule<any, Values>\n\n if (ruleKey === formRootRule) {\n acc[path] = (rule as any)(path ? getPath(path, values as any) : values, values, path)\n return acc\n }\n\n const rulePath = `${path === '' ? '' : `${path}.`}${String(ruleKey)}`\n const value = getPath(rulePath, values as any)\n let arrayValidation = false\n\n if (typeof rule === 'function') {\n acc[rulePath] = rule(value, values, rulePath)\n }\n\n if (typeof rule === 'object' && Array.isArray(value)) {\n arrayValidation = true\n value.forEach((_item, index) =>\n validateRulesRecord(rule, values, `${rulePath}.${index}`, acc),\n )\n\n if (formRootRule in rule) {\n acc[rulePath] = (rule as any)[formRootRule](value, values, rulePath)\n }\n }\n\n if (typeof rule === 'object' && typeof value === 'object' && value !== null) {\n if (!arrayValidation) {\n validateRulesRecord(rule, values, rulePath, acc)\n }\n\n if (formRootRule in rule) {\n acc[rulePath] = (rule as any)[formRootRule](value, values, rulePath)\n }\n }\n\n return acc\n }, errors)\n}\n\nexport function validateValues<Values extends Record<string, any>>(\n rules: FormRulesRecord<Values> | ((values: Values) => FormErrors) | undefined,\n values: Values,\n) {\n if (!rules) {\n return { hasErrors: false, errors: {} }\n }\n\n const errors = filterErrors(\n typeof rules === 'function' ? rules(values) : validateRulesRecord(rules, values),\n )\n\n return { hasErrors: Object.keys(errors).length > 0, errors }\n}\n\nexport function validateFieldValue<Values extends Record<string, any>>(\n path: PropertyKey,\n rules: FormRulesRecord<Values> | ((values: Values) => FormErrors) | undefined,\n values: Values,\n) {\n const results = validateValues(rules, values)\n const error = results.errors[String(path)]\n\n return { hasError: error !== undefined, error }\n}\n\nexport function schemaResolver<T>(schema: { safeParse: (value: T) => any }) {\n return (values: T) => {\n const result = schema.safeParse(values)\n if (result.success) {\n return {}\n }\n\n return result.error.issues.reduce((acc: FormErrors, issue: any) => {\n acc[issue.path.join('.')] = issue.message\n return acc\n }, {})\n }\n}\n\nexport const zodResolver = schemaResolver\nexport const yupResolver = schemaResolver\nexport const superstructResolver = schemaResolver\nexport const joiResolver = schemaResolver\n","import { ref, toRaw, type Ref } from 'vue'\nimport {\n getDataPath,\n getPath,\n insertPath,\n removePath,\n reorderPath,\n replacePath,\n setPath,\n} from './paths'\nimport { validateFieldValue, validateValues } from './validators'\nimport type { FormErrors, FormStatus, UseFormInput, UseFormReturnType } from './types'\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(toRaw(value ?? {}))) as T\n}\n\nfunction isEqual(a: unknown, b: unknown) {\n return JSON.stringify(toRaw(a)) === JSON.stringify(toRaw(b))\n}\n\nfunction shouldValidate(path: PropertyKey, rule: boolean | string[] | undefined) {\n if (Array.isArray(rule)) {\n return rule.includes(String(path))\n }\n\n return Boolean(rule)\n}\n\nfunction getStatus(status: FormStatus, path?: unknown) {\n const paths = Object.keys(status)\n\n if (typeof path === 'string') {\n const nestedPaths = paths.filter((statusPath) => statusPath.startsWith(`${path}.`))\n return status[path] || nestedPaths.some((statusPath) => status[statusPath]) || false\n }\n\n return paths.some((statusPath) => status[statusPath])\n}\n\nfunction clearListState(path: PropertyKey, state: FormStatus) {\n if (typeof path !== 'string') {\n return state\n }\n\n return Object.keys(state).reduce<FormStatus>((acc, key) => {\n if (!key.startsWith(`${path}.`)) {\n acc[key] = state[key]\n }\n\n return acc\n }, {})\n}\n\nfunction changeErrorIndices(\n path: PropertyKey,\n index: number | undefined,\n errors: FormErrors,\n change: 1 | -1,\n) {\n if (typeof path !== 'string' || index === undefined) {\n return errors\n }\n\n const pathRegex = new RegExp(`^${path.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\.(\\\\d+)(.*)$`)\n\n return Object.keys(errors).reduce<FormErrors>((acc, key) => {\n const match = key.match(pathRegex)\n if (!match) {\n acc[key] = errors[key]\n return acc\n }\n\n const itemIndex = Number(match[1])\n if (change === -1 && itemIndex === index) {\n return acc\n }\n\n const nextIndex = itemIndex >= index ? itemIndex + change : itemIndex\n acc[`${path}.${nextIndex}${match[2]}`] = errors[key]\n return acc\n }, {})\n}\n\nfunction reorderErrors(\n path: PropertyKey,\n payload: { from: number; to: number },\n errors: FormErrors,\n) {\n if (typeof path !== 'string') {\n return errors\n }\n\n const pathRegex = new RegExp(`^${path.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\.(\\\\d+)(.*)$`)\n\n return Object.keys(errors).reduce<FormErrors>((acc, key) => {\n const match = key.match(pathRegex)\n if (!match) {\n acc[key] = errors[key]\n return acc\n }\n\n const itemIndex = Number(match[1])\n let nextIndex = itemIndex\n\n if (itemIndex === payload.from) {\n nextIndex = payload.to\n } else if (payload.from < payload.to && itemIndex > payload.from && itemIndex <= payload.to) {\n nextIndex = itemIndex - 1\n } else if (payload.from > payload.to && itemIndex >= payload.to && itemIndex < payload.from) {\n nextIndex = itemIndex + 1\n }\n\n acc[`${path}.${nextIndex}${match[2]}`] = errors[key]\n return acc\n }, {})\n}\n\nfunction getInputValue(input: any, type: 'input' | 'checkbox' | 'radio') {\n if (typeof input === 'function') {\n return input\n }\n\n const target = input?.currentTarget ?? input?.target\n\n if (target) {\n if (type === 'checkbox' || target.type === 'checkbox') {\n return target.checked\n }\n\n return target.value\n }\n\n return input\n}\n\nexport function useForm<\n Values extends Record<string, any> = Record<string, any>,\n TransformedValues = Values,\n>({\n name,\n mode = 'controlled',\n initialValues,\n initialErrors = {},\n initialDirty = {},\n initialTouched = {},\n clearInputErrorOnChange = true,\n validateInputOnChange = false,\n validateInputOnBlur = false,\n validate: rules,\n transformValues = ((values: Values) => values) as any,\n onValuesChange,\n enhanceGetInputProps,\n onSubmitPreventDefault = 'always',\n touchTrigger = 'change',\n cascadeUpdates = false,\n}: UseFormInput<Values, TransformedValues> = {}): UseFormReturnType<Values, TransformedValues> {\n const initialSnapshot = ref(clone(initialValues ?? ({} as Values))) as Ref<Values>\n const values = ref(clone(initialSnapshot.value)) as Ref<Values>\n const errors = ref({ ...initialErrors }) as Ref<FormErrors>\n const touched = ref({ ...initialTouched }) as Ref<FormStatus>\n const dirty = ref({ ...initialDirty }) as Ref<FormStatus>\n const initialized = ref(false)\n const submitting = ref(false)\n const formKey = ref(0)\n const fieldKeys = ref<Record<string, number>>({})\n const watchers = new Map<string, Set<(input: any) => void>>()\n\n const notifyWatchers = (previous: Values, updated = values.value, changedPath?: PropertyKey) => {\n watchers.forEach((subscribers, path) => {\n if (changedPath && !cascadeUpdates && path !== String(changedPath)) {\n return\n }\n\n if (\n changedPath &&\n cascadeUpdates &&\n path !== String(changedPath) &&\n !path.startsWith(`${String(changedPath)}.`) &&\n !String(changedPath).startsWith(`${path}.`)\n ) {\n return\n }\n\n const previousValue = getPath(path, previous)\n const value = getPath(path, updated)\n\n if (previousValue !== value) {\n subscribers.forEach((subscriber) =>\n subscriber({\n previousValue,\n value,\n touched: api.isTouched(path),\n dirty: api.isDirty(path),\n }),\n )\n }\n })\n }\n\n const handleValuesChange = (previous: Values, changedPath?: PropertyKey) => {\n onValuesChange?.(values.value, previous)\n notifyWatchers(previous, values.value, changedPath)\n }\n\n const setValues = (nextValues: Partial<Values> | ((values: Values) => Partial<Values>)) => {\n const previous = clone(values.value)\n const patch = typeof nextValues === 'function' ? nextValues(values.value) : nextValues\n values.value = { ...values.value, ...(patch as any) }\n\n if (clearInputErrorOnChange) {\n errors.value = {}\n }\n\n if (mode === 'uncontrolled') {\n formKey.value += 1\n }\n\n handleValuesChange(previous)\n }\n\n const setFieldValue = (\n path: keyof Values | string,\n value: any,\n options: { forceUpdate?: boolean } = {},\n ) => {\n const currentValue = getPath(path, values.value)\n const resolvedValue = typeof value === 'function' ? value(currentValue) : value\n\n if (currentValue === resolvedValue) {\n return\n }\n\n const previous = clone(values.value)\n values.value = setPath(path, resolvedValue, values.value) as Values\n dirty.value = {\n ...clearListState(path, dirty.value),\n [String(path)]: !isEqual(resolvedValue, getPath(path, initialSnapshot.value)),\n }\n\n if (touchTrigger === 'change') {\n touched.value[String(path)] = true\n }\n\n if (clearInputErrorOnChange) {\n delete errors.value[String(path)]\n }\n\n if (shouldValidate(path, validateInputOnChange)) {\n const result = validateFieldValue(path, rules, values.value)\n if (result.hasError) {\n errors.value[String(path)] = result.error\n }\n }\n\n if (mode === 'uncontrolled' && options.forceUpdate !== false) {\n fieldKeys.value[String(path)] = (fieldKeys.value[String(path)] ?? 0) + 1\n }\n\n handleValuesChange(previous, path)\n }\n\n const reset = () => {\n const previous = clone(values.value)\n values.value = clone(initialSnapshot.value)\n errors.value = {}\n touched.value = {}\n dirty.value = {}\n formKey.value += 1\n handleValuesChange(previous)\n }\n\n const resetField = (path: keyof Values | string) => {\n const initialValue = getPath(path, initialSnapshot.value)\n if (typeof initialValue === 'undefined') {\n return\n }\n\n setFieldValue(path, initialValue)\n delete touched.value[String(path)]\n delete dirty.value[String(path)]\n }\n\n const validate = () => {\n const result = validateValues(rules, values.value)\n errors.value = result.errors\n return result\n }\n\n const validateField = (path: keyof Values | string) => {\n const result = validateFieldValue(path, rules, values.value)\n\n if (result.hasError) {\n errors.value[String(path)] = result.error\n } else {\n delete errors.value[String(path)]\n }\n\n return result\n }\n\n const getInputProps = (\n path: keyof Values | string,\n { type = 'input', withError = true, withFocus = type !== 'radio', value: radioValue }: any = {},\n ) => {\n const currentValue = getPath(path, values.value)\n const payload: Record<string, any> = {\n 'data-path': getDataPath(name, path),\n }\n\n if (withError) {\n payload.error = errors.value[String(path)]\n }\n\n const onChange = (eventOrValue: any) =>\n setFieldValue(path, getInputValue(eventOrValue, type), { forceUpdate: false })\n\n payload.onChange = onChange\n payload.onInput = onChange\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = currentValue\n } else if (type === 'radio') {\n payload.checked = currentValue === radioValue\n payload.value = radioValue\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = currentValue\n }\n\n if (withFocus) {\n payload.onFocus = () => {\n touched.value[String(path)] = true\n }\n payload.onBlur = () => {\n if (shouldValidate(path, validateInputOnBlur)) {\n validateField(path)\n }\n }\n }\n\n return Object.assign(\n payload,\n enhanceGetInputProps?.({\n inputProps: payload,\n field: path,\n options: { type, withError, withFocus, value: radioValue },\n form: api,\n }),\n )\n }\n\n const api: UseFormReturnType<Values, TransformedValues> = {\n watch: (path, subscriber) => {\n const key = String(path)\n const subscribers = watchers.get(key) ?? new Set()\n subscribers.add(subscriber)\n watchers.set(key, subscribers)\n\n return () => {\n const current = watchers.get(key)\n current?.delete(subscriber)\n if (current?.size === 0) {\n watchers.delete(key)\n }\n }\n },\n values,\n initialized,\n errors,\n touched,\n dirty,\n submitting,\n getValues: () => values.value,\n getInitialValues: () => initialSnapshot.value,\n setInitialValues: (nextValues) => {\n initialSnapshot.value = clone(nextValues)\n },\n setValues,\n setFieldValue,\n reset,\n onReset: (event?: Event) => {\n event?.preventDefault()\n reset()\n },\n resetField,\n initialize: (nextValues) => {\n if (initialized.value) {\n return\n }\n\n const previous = clone(values.value)\n initialSnapshot.value = clone(nextValues)\n values.value = clone(nextValues)\n initialized.value = true\n if (mode === 'uncontrolled') {\n formKey.value += 1\n }\n handleValuesChange(previous)\n },\n setSubmitting: (nextSubmitting) => {\n submitting.value =\n typeof nextSubmitting === 'function' ? nextSubmitting(submitting.value) : nextSubmitting\n },\n setErrors: (nextErrors) => {\n errors.value = typeof nextErrors === 'function' ? nextErrors(errors.value) : nextErrors\n },\n setFieldError: (path, error) => {\n errors.value[String(path)] = error\n },\n clearFieldError: (path) => {\n delete errors.value[String(path)]\n },\n clearErrors: () => {\n errors.value = {}\n },\n setTouched: (nextTouched) => {\n touched.value = typeof nextTouched === 'function' ? nextTouched(touched.value) : nextTouched\n },\n setDirty: (nextDirty) => {\n dirty.value = typeof nextDirty === 'function' ? nextDirty(dirty.value) : nextDirty\n },\n resetTouched: () => {\n touched.value = {}\n },\n resetDirty: (nextValues) => {\n initialSnapshot.value = nextValues\n ? ({ ...values.value, ...clone(nextValues) } as Values)\n : clone(values.value)\n dirty.value = {}\n },\n getTouched: () => touched.value,\n getDirty: () => dirty.value,\n isTouched: (path) =>\n path ? getStatus(touched.value, String(path)) : Object.values(touched.value).some(Boolean),\n isDirty: (path) => {\n if (path) {\n const overriddenValue = getPath(path, dirty.value)\n\n if (typeof overriddenValue === 'boolean') {\n return overriddenValue\n }\n\n return !isEqual(getPath(path, values.value), getPath(path, initialSnapshot.value))\n }\n\n return Object.keys(dirty.value).length > 0\n ? getStatus(dirty.value)\n : !isEqual(values.value, initialSnapshot.value)\n },\n reorderListItem: (path, payload) => {\n const previous = clone(values.value)\n dirty.value = clearListState(path, dirty.value)\n errors.value = reorderErrors(path, payload, errors.value)\n values.value = reorderPath(path, payload, values.value) as Values\n handleValuesChange(previous, path)\n },\n insertListItem: (path, item, index) => {\n const previous = clone(values.value)\n dirty.value = clearListState(path, dirty.value)\n errors.value = changeErrorIndices(path, index, errors.value, 1)\n values.value = insertPath(path, item, index, values.value) as Values\n handleValuesChange(previous, path)\n },\n removeListItem: (path, index) => {\n const previous = clone(values.value)\n dirty.value = clearListState(path, dirty.value)\n errors.value = changeErrorIndices(path, index, errors.value, -1)\n values.value = removePath(path, index, values.value) as Values\n handleValuesChange(previous, path)\n },\n replaceListItem: (path, index, item) => {\n const previous = clone(values.value)\n dirty.value = clearListState(path, dirty.value)\n values.value = replacePath(path, item, index, values.value) as Values\n handleValuesChange(previous, path)\n },\n validate,\n validateField,\n isValid: (path) =>\n path\n ? !validateFieldValue(path, rules, values.value).hasError\n : !validateValues(rules, values.value).hasErrors,\n getInputProps,\n onSubmit: (submit, validationFailure) => (event?: Event) => {\n if (onSubmitPreventDefault === 'always') {\n event?.preventDefault()\n }\n\n const result = validate()\n if (result.hasErrors) {\n if (onSubmitPreventDefault === 'validation-failed') {\n event?.preventDefault()\n }\n\n validationFailure?.(result.errors, values.value, event)\n return\n }\n\n const submitResult = submit(transformValues(values.value), event)\n if (submitResult instanceof Promise) {\n submitResult.finally(() => {\n submitting.value = false\n })\n } else {\n submitting.value = false\n }\n },\n getTransformedValues: (input) => transformValues(input ?? values.value),\n key: (path) => `${formKey.value}-${String(path)}-${fieldKeys.value[String(path)] ?? 0}`,\n getInputNode: (path) =>\n typeof document === 'undefined'\n ? null\n : document.querySelector(`[data-path=\"${getDataPath(name, path)}\"]`),\n }\n\n return api\n}\n","import { inject, provide, type InjectionKey } from 'vue'\nimport type { UseFormReturnType } from './types'\n\nexport function createFormContext<Values extends Record<string, any>>() {\n const key = Symbol('MantineVueFormContext') as InjectionKey<UseFormReturnType<Values>>\n\n const FormProvider = (form: UseFormReturnType<Values>) => provide(key, form)\n const useFormContext = () => {\n const ctx = inject(key, null)\n\n if (!ctx) {\n throw new Error('[@mantine-vue/form] FormProvider was not found in tree')\n }\n\n return ctx\n }\n\n return [FormProvider, useFormContext, key] as const\n}\n","import { computed } from 'vue'\nimport type { UseFormReturnType } from './types'\n\nexport interface UseFieldInput<Values extends Record<string, any>> {\n form: UseFormReturnType<Values>\n path: keyof Values | string\n}\n\nexport function useField<Values extends Record<string, any>>({\n form,\n path,\n}: UseFieldInput<Values>) {\n return {\n value: computed({\n get: () => form.getInputProps(path).value,\n set: (value) => form.setFieldValue(path, value),\n }),\n error: computed(() => form.errors.value[String(path)]),\n touched: computed(() => form.isTouched(path)),\n dirty: computed(() => form.isDirty(path)),\n getInputProps: () => form.getInputProps(path),\n }\n}\n","export * from './types'\nexport * from './paths'\nexport * from './validators'\nexport * from './use-form'\nexport * from './FormProvider'\nexport * from './use-field'\n\nexport const FORM_INDEX = '__mantine-form-index__'\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type InjectionKey } from 'vue';
2
+ import type { UseFormReturnType } from './types';
3
+ export declare function createFormContext<Values extends Record<string, any>>(): readonly [(form: UseFormReturnType<Values>) => void, () => UseFormReturnType<Values, Values>, InjectionKey<UseFormReturnType<Values, Values>>];
@@ -0,0 +1,7 @@
1
+ export * from './types';
2
+ export * from './paths';
3
+ export * from './validators';
4
+ export * from './use-form';
5
+ export * from './FormProvider';
6
+ export * from './use-field';
7
+ export declare const FORM_INDEX = "__mantine-form-index__";
package/lib/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export * from './types';
2
+ export * from './paths';
3
+ export * from './validators';
4
+ export * from './use-form';
5
+ export * from './FormProvider';
6
+ export * from './use-field';
7
+ export declare const FORM_INDEX = "__mantine-form-index__";
package/lib/paths.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export declare function getPath(path: PropertyKey, values: Record<PropertyKey, any>): Record<PropertyKey, any>;
2
+ export declare function setPath(path: PropertyKey, value: any, values: Record<PropertyKey, any>): any;
3
+ export declare function insertPath(path: PropertyKey, item: any, index: number | undefined, values: Record<PropertyKey, any>): any;
4
+ export declare function removePath(path: PropertyKey, index: number, values: Record<PropertyKey, any>): any;
5
+ export declare function replacePath(path: PropertyKey, item: any, index: number, values: Record<PropertyKey, any>): any;
6
+ interface ReorderPayload {
7
+ from: number;
8
+ to: number;
9
+ }
10
+ export declare function reorderPath(path: PropertyKey, { from, to }: ReorderPayload, values: Record<PropertyKey, any>): any;
11
+ export declare function getDataPath(name: string | undefined, path: PropertyKey): string;
12
+ export {};