@tanstack/form-core 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/build/legacy/FieldApi.cjs +285 -0
  2. package/build/legacy/FieldApi.cjs.map +1 -0
  3. package/build/legacy/FieldApi.d.cts +3 -0
  4. package/build/legacy/FieldApi.d.ts +3 -0
  5. package/build/legacy/FieldApi.js +252 -0
  6. package/build/legacy/FieldApi.js.map +1 -0
  7. package/build/legacy/FormApi.cjs +257 -0
  8. package/build/legacy/FormApi.cjs.map +1 -0
  9. package/build/legacy/FormApi.d.cts +3 -0
  10. package/build/legacy/FormApi.d.ts +3 -0
  11. package/build/legacy/FormApi.js +234 -0
  12. package/build/legacy/FormApi.js.map +1 -0
  13. package/build/legacy/chunk-4QZDOMDG.js +19 -0
  14. package/build/legacy/chunk-4QZDOMDG.js.map +1 -0
  15. package/build/legacy/index.cjs +29 -0
  16. package/build/legacy/index.cjs.map +1 -0
  17. package/build/legacy/index.d.cts +172 -0
  18. package/build/legacy/index.d.ts +172 -0
  19. package/build/legacy/index.js +5 -0
  20. package/build/legacy/index.js.map +1 -0
  21. package/build/legacy/utils.cjs +103 -0
  22. package/build/legacy/utils.cjs.map +1 -0
  23. package/build/legacy/utils.d.cts +33 -0
  24. package/build/legacy/utils.d.ts +33 -0
  25. package/build/legacy/utils.js +77 -0
  26. package/build/legacy/utils.js.map +1 -0
  27. package/build/modern/FieldApi.cjs +267 -0
  28. package/build/modern/FieldApi.cjs.map +1 -0
  29. package/build/modern/FieldApi.d.cts +3 -0
  30. package/build/modern/FieldApi.d.ts +3 -0
  31. package/build/modern/FieldApi.js +242 -0
  32. package/build/modern/FieldApi.js.map +1 -0
  33. package/build/modern/FormApi.cjs +251 -0
  34. package/build/modern/FormApi.cjs.map +1 -0
  35. package/build/modern/FormApi.d.cts +3 -0
  36. package/build/modern/FormApi.d.ts +3 -0
  37. package/build/modern/FormApi.js +226 -0
  38. package/build/modern/FormApi.js.map +1 -0
  39. package/build/modern/index.cjs +29 -0
  40. package/build/modern/index.cjs.map +1 -0
  41. package/build/modern/index.d.cts +172 -0
  42. package/build/modern/index.d.ts +172 -0
  43. package/build/modern/index.js +5 -0
  44. package/build/modern/index.js.map +1 -0
  45. package/build/modern/utils.cjs +103 -0
  46. package/build/modern/utils.cjs.map +1 -0
  47. package/build/modern/utils.d.cts +33 -0
  48. package/build/modern/utils.d.ts +33 -0
  49. package/build/modern/utils.js +75 -0
  50. package/build/modern/utils.js.map +1 -0
  51. package/package.json +1 -1
  52. package/src/FieldApi.ts +62 -48
@@ -0,0 +1,172 @@
1
+ import { Store } from '@tanstack/store';
2
+ import { DeepKeys, DeepValue, Updater } from './utils.cjs';
3
+ export { Narrow, Pretty, RequiredByKey, UpdaterFn, functionalUpdate, getBy, isNonEmptyArray, setBy } from './utils.cjs';
4
+
5
+ type FormOptions<TData> = {
6
+ defaultValues?: TData;
7
+ defaultState?: Partial<FormState<TData>>;
8
+ asyncDebounceMs?: number;
9
+ onMount?: (values: TData, formApi: FormApi<TData>) => ValidationError;
10
+ onMountAsync?: (values: TData, formApi: FormApi<TData>) => ValidationError | Promise<ValidationError>;
11
+ onMountAsyncDebounceMs?: number;
12
+ onChange?: (values: TData, formApi: FormApi<TData>) => ValidationError;
13
+ onChangeAsync?: (values: TData, formApi: FormApi<TData>) => ValidationError | Promise<ValidationError>;
14
+ onChangeAsyncDebounceMs?: number;
15
+ onBlur?: (values: TData, formApi: FormApi<TData>) => ValidationError;
16
+ onBlurAsync?: (values: TData, formApi: FormApi<TData>) => ValidationError | Promise<ValidationError>;
17
+ onBlurAsyncDebounceMs?: number;
18
+ onSubmit?: (values: TData, formApi: FormApi<TData>) => any | Promise<any>;
19
+ onSubmitInvalid?: (values: TData, formApi: FormApi<TData>) => void;
20
+ };
21
+ type FieldInfo<TFormData> = {
22
+ instances: Record<string, FieldApi<any, TFormData>>;
23
+ } & ValidationMeta;
24
+ type ValidationMeta = {
25
+ validationCount?: number;
26
+ validationAsyncCount?: number;
27
+ validationPromise?: Promise<ValidationError[]>;
28
+ validationResolve?: (errors: ValidationError[]) => void;
29
+ validationReject?: (errors: unknown) => void;
30
+ };
31
+ type ValidationError = undefined | false | null | string;
32
+ type ValidationErrorMapKeys = `on${Capitalize<ValidationCause>}`;
33
+ type ValidationErrorMap = {
34
+ [K in ValidationErrorMapKeys]?: ValidationError;
35
+ };
36
+ type FormState<TData> = {
37
+ values: TData;
38
+ isFormValidating: boolean;
39
+ formValidationCount: number;
40
+ isFormValid: boolean;
41
+ formError?: ValidationError;
42
+ fieldMeta: Record<DeepKeys<TData>, FieldMeta>;
43
+ isFieldsValidating: boolean;
44
+ isFieldsValid: boolean;
45
+ isSubmitting: boolean;
46
+ isTouched: boolean;
47
+ isSubmitted: boolean;
48
+ isValidating: boolean;
49
+ isValid: boolean;
50
+ canSubmit: boolean;
51
+ submissionAttempts: number;
52
+ };
53
+ declare class FormApi<TFormData> {
54
+ options: FormOptions<TFormData>;
55
+ store: Store<FormState<TFormData>>;
56
+ state: FormState<TFormData>;
57
+ fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>>;
58
+ fieldName?: string;
59
+ validationMeta: ValidationMeta;
60
+ constructor(opts?: FormOptions<TFormData>);
61
+ update: (options?: FormOptions<TFormData>) => void;
62
+ reset: () => void;
63
+ validateAllFields: (cause: ValidationCause) => Promise<ValidationError[][]>;
64
+ handleSubmit: () => Promise<void>;
65
+ getFieldValue: <TField extends DeepKeys<TFormData>>(field: TField) => DeepValue<TFormData, TField>;
66
+ getFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField) => FieldMeta | undefined;
67
+ getFieldInfo: <TField extends DeepKeys<TFormData>>(field: TField) => Record<DeepKeys<TFormData>, FieldInfo<TFormData>>[TField];
68
+ setFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<FieldMeta>) => void;
69
+ setFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<DeepValue<TFormData, TField>>, opts?: {
70
+ touch?: boolean;
71
+ }) => void;
72
+ pushFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, value: DeepValue<TFormData, TField>[number], opts?: {
73
+ touch?: boolean;
74
+ }) => void;
75
+ insertFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, value: DeepValue<TFormData, TField>[number], opts?: {
76
+ touch?: boolean;
77
+ }) => void;
78
+ removeFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, opts?: {
79
+ touch?: boolean;
80
+ }) => void;
81
+ swapFieldValues: <TField extends DeepKeys<TFormData>>(field: TField, index1: number, index2: number) => void;
82
+ }
83
+
84
+ type ValidationCause = 'change' | 'blur' | 'submit' | 'mount';
85
+ type ValidateFn<TData, TFormData> = (value: TData, fieldApi: FieldApi<TData, TFormData>) => ValidationError;
86
+ type ValidateAsyncFn<TData, TFormData> = (value: TData, fieldApi: FieldApi<TData, TFormData>) => ValidationError | Promise<ValidationError>;
87
+ interface FieldOptions<_TData, TFormData,
88
+ /**
89
+ * This allows us to restrict the name to only be a valid field name while
90
+ * also assigning it to a generic
91
+ */
92
+ TName = unknown extends TFormData ? string : DeepKeys<TFormData>,
93
+ /**
94
+ * If TData is unknown, we can use the TName generic to determine the type
95
+ */
96
+ TData = unknown extends _TData ? DeepValue<TFormData, TName> : _TData> {
97
+ name: TName;
98
+ index?: TData extends any[] ? number : never;
99
+ defaultValue?: TData;
100
+ asyncDebounceMs?: number;
101
+ asyncAlways?: boolean;
102
+ onMount?: (formApi: FieldApi<TData, TFormData>) => void;
103
+ onChange?: ValidateFn<TData, TFormData>;
104
+ onChangeAsync?: ValidateAsyncFn<TData, TFormData>;
105
+ onChangeAsyncDebounceMs?: number;
106
+ onBlur?: ValidateFn<TData, TFormData>;
107
+ onBlurAsync?: ValidateAsyncFn<TData, TFormData>;
108
+ onBlurAsyncDebounceMs?: number;
109
+ onSubmitAsync?: ValidateAsyncFn<TData, TFormData>;
110
+ defaultMeta?: Partial<FieldMeta>;
111
+ }
112
+ interface FieldApiOptions<_TData, TFormData,
113
+ /**
114
+ * This allows us to restrict the name to only be a valid field name while
115
+ * also assigning it to a generic
116
+ */
117
+ TName = unknown extends TFormData ? string : DeepKeys<TFormData>,
118
+ /**
119
+ * If TData is unknown, we can use the TName generic to determine the type
120
+ */
121
+ TData = unknown extends _TData ? DeepValue<TFormData, TName> : _TData> extends FieldOptions<_TData, TFormData, TName, TData> {
122
+ form: FormApi<TFormData>;
123
+ }
124
+ type FieldMeta = {
125
+ isTouched: boolean;
126
+ touchedErrors: ValidationError[];
127
+ errors: ValidationError[];
128
+ errorMap: ValidationErrorMap;
129
+ isValidating: boolean;
130
+ };
131
+ type FieldState<TData> = {
132
+ value: TData;
133
+ meta: FieldMeta;
134
+ };
135
+ type GetTData<TData, TFormData, Opts extends FieldApiOptions<TData, TFormData>> = Opts extends FieldApiOptions<infer _TData, infer _TFormData, infer _TName, infer RealTData> ? RealTData : never;
136
+ declare class FieldApi<_TData, TFormData, Opts extends FieldApiOptions<_TData, TFormData> = FieldApiOptions<_TData, TFormData>, TData extends GetTData<_TData, TFormData, Opts> = GetTData<_TData, TFormData, Opts>> {
137
+ #private;
138
+ uid: number;
139
+ form: Opts['form'];
140
+ name: DeepKeys<TFormData>;
141
+ options: Opts;
142
+ store: Store<FieldState<TData>>;
143
+ state: FieldState<TData>;
144
+ prevState: FieldState<TData>;
145
+ constructor(opts: Opts & {
146
+ form: FormApi<TFormData>;
147
+ });
148
+ mount: () => () => void;
149
+ update: (opts: FieldApiOptions<TData, TFormData>) => void;
150
+ getValue: () => TData;
151
+ setValue: (updater: Updater<TData>, options?: {
152
+ touch?: boolean;
153
+ notify?: boolean;
154
+ }) => void;
155
+ _getMeta: () => FieldMeta | undefined;
156
+ getMeta: () => FieldMeta;
157
+ setMeta: (updater: Updater<FieldMeta>) => void;
158
+ getInfo: () => Record<DeepKeys<TFormData>, FieldInfo<TFormData>>[DeepKeys<TFormData>];
159
+ pushValue: (value: TData extends any[] ? TData[number] : never) => void;
160
+ insertValue: (index: number, value: TData extends any[] ? TData[number] : never) => void;
161
+ removeValue: (index: number) => void;
162
+ swapValues: (aIndex: number, bIndex: number) => void;
163
+ getSubField: <TName extends DeepKeys<TData>>(name: TName) => FieldApi<DeepValue<TData, TName>, TFormData, FieldApiOptions<DeepValue<TData, TName>, TFormData, unknown extends TFormData ? string : DeepKeys<TFormData>, unknown extends DeepValue<TData, TName> ? DeepValue<TFormData, unknown extends TFormData ? string : DeepKeys<TFormData>> : DeepValue<TData, TName>>, unknown extends DeepValue<TData, TName> ? DeepValue<TFormData, unknown extends TFormData ? string : DeepKeys<TFormData>> : DeepValue<TData, TName>>;
164
+ validateSync: (value: TData | undefined, cause: ValidationCause) => void;
165
+ cancelValidateAsync: () => void;
166
+ validateAsync: (value: TData | undefined, cause: ValidationCause) => Promise<ValidationError[]>;
167
+ validate: (cause: ValidationCause, value?: TData) => ValidationError[] | Promise<ValidationError[]>;
168
+ handleChange: (updater: Updater<TData>) => void;
169
+ handleBlur: () => void;
170
+ }
171
+
172
+ export { DeepKeys, DeepValue, FieldApi, FieldApiOptions, FieldInfo, FieldMeta, FieldOptions, FieldState, FormApi, FormOptions, FormState, Updater, ValidationCause, ValidationError, ValidationErrorMap, ValidationErrorMapKeys, ValidationMeta };
@@ -0,0 +1,172 @@
1
+ import { Store } from '@tanstack/store';
2
+ import { DeepKeys, DeepValue, Updater } from './utils.js';
3
+ export { Narrow, Pretty, RequiredByKey, UpdaterFn, functionalUpdate, getBy, isNonEmptyArray, setBy } from './utils.js';
4
+
5
+ type FormOptions<TData> = {
6
+ defaultValues?: TData;
7
+ defaultState?: Partial<FormState<TData>>;
8
+ asyncDebounceMs?: number;
9
+ onMount?: (values: TData, formApi: FormApi<TData>) => ValidationError;
10
+ onMountAsync?: (values: TData, formApi: FormApi<TData>) => ValidationError | Promise<ValidationError>;
11
+ onMountAsyncDebounceMs?: number;
12
+ onChange?: (values: TData, formApi: FormApi<TData>) => ValidationError;
13
+ onChangeAsync?: (values: TData, formApi: FormApi<TData>) => ValidationError | Promise<ValidationError>;
14
+ onChangeAsyncDebounceMs?: number;
15
+ onBlur?: (values: TData, formApi: FormApi<TData>) => ValidationError;
16
+ onBlurAsync?: (values: TData, formApi: FormApi<TData>) => ValidationError | Promise<ValidationError>;
17
+ onBlurAsyncDebounceMs?: number;
18
+ onSubmit?: (values: TData, formApi: FormApi<TData>) => any | Promise<any>;
19
+ onSubmitInvalid?: (values: TData, formApi: FormApi<TData>) => void;
20
+ };
21
+ type FieldInfo<TFormData> = {
22
+ instances: Record<string, FieldApi<any, TFormData>>;
23
+ } & ValidationMeta;
24
+ type ValidationMeta = {
25
+ validationCount?: number;
26
+ validationAsyncCount?: number;
27
+ validationPromise?: Promise<ValidationError[]>;
28
+ validationResolve?: (errors: ValidationError[]) => void;
29
+ validationReject?: (errors: unknown) => void;
30
+ };
31
+ type ValidationError = undefined | false | null | string;
32
+ type ValidationErrorMapKeys = `on${Capitalize<ValidationCause>}`;
33
+ type ValidationErrorMap = {
34
+ [K in ValidationErrorMapKeys]?: ValidationError;
35
+ };
36
+ type FormState<TData> = {
37
+ values: TData;
38
+ isFormValidating: boolean;
39
+ formValidationCount: number;
40
+ isFormValid: boolean;
41
+ formError?: ValidationError;
42
+ fieldMeta: Record<DeepKeys<TData>, FieldMeta>;
43
+ isFieldsValidating: boolean;
44
+ isFieldsValid: boolean;
45
+ isSubmitting: boolean;
46
+ isTouched: boolean;
47
+ isSubmitted: boolean;
48
+ isValidating: boolean;
49
+ isValid: boolean;
50
+ canSubmit: boolean;
51
+ submissionAttempts: number;
52
+ };
53
+ declare class FormApi<TFormData> {
54
+ options: FormOptions<TFormData>;
55
+ store: Store<FormState<TFormData>>;
56
+ state: FormState<TFormData>;
57
+ fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>>;
58
+ fieldName?: string;
59
+ validationMeta: ValidationMeta;
60
+ constructor(opts?: FormOptions<TFormData>);
61
+ update: (options?: FormOptions<TFormData>) => void;
62
+ reset: () => void;
63
+ validateAllFields: (cause: ValidationCause) => Promise<ValidationError[][]>;
64
+ handleSubmit: () => Promise<void>;
65
+ getFieldValue: <TField extends DeepKeys<TFormData>>(field: TField) => DeepValue<TFormData, TField>;
66
+ getFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField) => FieldMeta | undefined;
67
+ getFieldInfo: <TField extends DeepKeys<TFormData>>(field: TField) => Record<DeepKeys<TFormData>, FieldInfo<TFormData>>[TField];
68
+ setFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<FieldMeta>) => void;
69
+ setFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<DeepValue<TFormData, TField>>, opts?: {
70
+ touch?: boolean;
71
+ }) => void;
72
+ pushFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, value: DeepValue<TFormData, TField>[number], opts?: {
73
+ touch?: boolean;
74
+ }) => void;
75
+ insertFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, value: DeepValue<TFormData, TField>[number], opts?: {
76
+ touch?: boolean;
77
+ }) => void;
78
+ removeFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, opts?: {
79
+ touch?: boolean;
80
+ }) => void;
81
+ swapFieldValues: <TField extends DeepKeys<TFormData>>(field: TField, index1: number, index2: number) => void;
82
+ }
83
+
84
+ type ValidationCause = 'change' | 'blur' | 'submit' | 'mount';
85
+ type ValidateFn<TData, TFormData> = (value: TData, fieldApi: FieldApi<TData, TFormData>) => ValidationError;
86
+ type ValidateAsyncFn<TData, TFormData> = (value: TData, fieldApi: FieldApi<TData, TFormData>) => ValidationError | Promise<ValidationError>;
87
+ interface FieldOptions<_TData, TFormData,
88
+ /**
89
+ * This allows us to restrict the name to only be a valid field name while
90
+ * also assigning it to a generic
91
+ */
92
+ TName = unknown extends TFormData ? string : DeepKeys<TFormData>,
93
+ /**
94
+ * If TData is unknown, we can use the TName generic to determine the type
95
+ */
96
+ TData = unknown extends _TData ? DeepValue<TFormData, TName> : _TData> {
97
+ name: TName;
98
+ index?: TData extends any[] ? number : never;
99
+ defaultValue?: TData;
100
+ asyncDebounceMs?: number;
101
+ asyncAlways?: boolean;
102
+ onMount?: (formApi: FieldApi<TData, TFormData>) => void;
103
+ onChange?: ValidateFn<TData, TFormData>;
104
+ onChangeAsync?: ValidateAsyncFn<TData, TFormData>;
105
+ onChangeAsyncDebounceMs?: number;
106
+ onBlur?: ValidateFn<TData, TFormData>;
107
+ onBlurAsync?: ValidateAsyncFn<TData, TFormData>;
108
+ onBlurAsyncDebounceMs?: number;
109
+ onSubmitAsync?: ValidateAsyncFn<TData, TFormData>;
110
+ defaultMeta?: Partial<FieldMeta>;
111
+ }
112
+ interface FieldApiOptions<_TData, TFormData,
113
+ /**
114
+ * This allows us to restrict the name to only be a valid field name while
115
+ * also assigning it to a generic
116
+ */
117
+ TName = unknown extends TFormData ? string : DeepKeys<TFormData>,
118
+ /**
119
+ * If TData is unknown, we can use the TName generic to determine the type
120
+ */
121
+ TData = unknown extends _TData ? DeepValue<TFormData, TName> : _TData> extends FieldOptions<_TData, TFormData, TName, TData> {
122
+ form: FormApi<TFormData>;
123
+ }
124
+ type FieldMeta = {
125
+ isTouched: boolean;
126
+ touchedErrors: ValidationError[];
127
+ errors: ValidationError[];
128
+ errorMap: ValidationErrorMap;
129
+ isValidating: boolean;
130
+ };
131
+ type FieldState<TData> = {
132
+ value: TData;
133
+ meta: FieldMeta;
134
+ };
135
+ type GetTData<TData, TFormData, Opts extends FieldApiOptions<TData, TFormData>> = Opts extends FieldApiOptions<infer _TData, infer _TFormData, infer _TName, infer RealTData> ? RealTData : never;
136
+ declare class FieldApi<_TData, TFormData, Opts extends FieldApiOptions<_TData, TFormData> = FieldApiOptions<_TData, TFormData>, TData extends GetTData<_TData, TFormData, Opts> = GetTData<_TData, TFormData, Opts>> {
137
+ #private;
138
+ uid: number;
139
+ form: Opts['form'];
140
+ name: DeepKeys<TFormData>;
141
+ options: Opts;
142
+ store: Store<FieldState<TData>>;
143
+ state: FieldState<TData>;
144
+ prevState: FieldState<TData>;
145
+ constructor(opts: Opts & {
146
+ form: FormApi<TFormData>;
147
+ });
148
+ mount: () => () => void;
149
+ update: (opts: FieldApiOptions<TData, TFormData>) => void;
150
+ getValue: () => TData;
151
+ setValue: (updater: Updater<TData>, options?: {
152
+ touch?: boolean;
153
+ notify?: boolean;
154
+ }) => void;
155
+ _getMeta: () => FieldMeta | undefined;
156
+ getMeta: () => FieldMeta;
157
+ setMeta: (updater: Updater<FieldMeta>) => void;
158
+ getInfo: () => Record<DeepKeys<TFormData>, FieldInfo<TFormData>>[DeepKeys<TFormData>];
159
+ pushValue: (value: TData extends any[] ? TData[number] : never) => void;
160
+ insertValue: (index: number, value: TData extends any[] ? TData[number] : never) => void;
161
+ removeValue: (index: number) => void;
162
+ swapValues: (aIndex: number, bIndex: number) => void;
163
+ getSubField: <TName extends DeepKeys<TData>>(name: TName) => FieldApi<DeepValue<TData, TName>, TFormData, FieldApiOptions<DeepValue<TData, TName>, TFormData, unknown extends TFormData ? string : DeepKeys<TFormData>, unknown extends DeepValue<TData, TName> ? DeepValue<TFormData, unknown extends TFormData ? string : DeepKeys<TFormData>> : DeepValue<TData, TName>>, unknown extends DeepValue<TData, TName> ? DeepValue<TFormData, unknown extends TFormData ? string : DeepKeys<TFormData>> : DeepValue<TData, TName>>;
164
+ validateSync: (value: TData | undefined, cause: ValidationCause) => void;
165
+ cancelValidateAsync: () => void;
166
+ validateAsync: (value: TData | undefined, cause: ValidationCause) => Promise<ValidationError[]>;
167
+ validate: (cause: ValidationCause, value?: TData) => ValidationError[] | Promise<ValidationError[]>;
168
+ handleChange: (updater: Updater<TData>) => void;
169
+ handleBlur: () => void;
170
+ }
171
+
172
+ export { DeepKeys, DeepValue, FieldApi, FieldApiOptions, FieldInfo, FieldMeta, FieldOptions, FieldState, FormApi, FormOptions, FormState, Updater, ValidationCause, ValidationError, ValidationErrorMap, ValidationErrorMapKeys, ValidationMeta };
@@ -0,0 +1,5 @@
1
+ // src/index.ts
2
+ export * from "./FormApi.js";
3
+ export * from "./FieldApi.js";
4
+ export * from "./utils.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export * from './FormApi'\nexport * from './FieldApi'\nexport * from './utils'\n"],"mappings":";AAAA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/utils.ts
21
+ var utils_exports = {};
22
+ __export(utils_exports, {
23
+ functionalUpdate: () => functionalUpdate,
24
+ getBy: () => getBy,
25
+ isNonEmptyArray: () => isNonEmptyArray,
26
+ setBy: () => setBy
27
+ });
28
+ module.exports = __toCommonJS(utils_exports);
29
+ function functionalUpdate(updater, input) {
30
+ return typeof updater === "function" ? updater(input) : updater;
31
+ }
32
+ function getBy(obj, path) {
33
+ const pathArray = makePathArray(path);
34
+ const pathObj = pathArray;
35
+ return pathObj.reduce((current, pathPart) => {
36
+ if (typeof current !== "undefined") {
37
+ return current[pathPart];
38
+ }
39
+ return void 0;
40
+ }, obj);
41
+ }
42
+ function setBy(obj, _path, updater) {
43
+ const path = makePathArray(_path);
44
+ function doSet(parent) {
45
+ if (!path.length) {
46
+ return functionalUpdate(updater, parent);
47
+ }
48
+ const key = path.shift();
49
+ if (typeof key === "string") {
50
+ if (typeof parent === "object") {
51
+ return {
52
+ ...parent,
53
+ [key]: doSet(parent[key])
54
+ };
55
+ }
56
+ return {
57
+ [key]: doSet()
58
+ };
59
+ }
60
+ if (typeof key === "number") {
61
+ if (Array.isArray(parent)) {
62
+ const prefix = parent.slice(0, key);
63
+ return [
64
+ ...prefix.length ? prefix : new Array(key),
65
+ doSet(parent[key]),
66
+ ...parent.slice(key + 1)
67
+ ];
68
+ }
69
+ return [...new Array(key), doSet()];
70
+ }
71
+ throw new Error("Uh oh!");
72
+ }
73
+ return doSet(obj);
74
+ }
75
+ var reFindNumbers0 = /^(\d*)$/gm;
76
+ var reFindNumbers1 = /\.(\d*)\./gm;
77
+ var reFindNumbers2 = /^(\d*)\./gm;
78
+ var reFindNumbers3 = /\.(\d*$)/gm;
79
+ var reFindMultiplePeriods = /\.{2,}/gm;
80
+ var intPrefix = "__int__";
81
+ var intReplace = `${intPrefix}$1`;
82
+ function makePathArray(str) {
83
+ if (typeof str !== "string") {
84
+ throw new Error("Path must be a string.");
85
+ }
86
+ return str.replace("[", ".").replace("]", "").replace(reFindNumbers0, intReplace).replace(reFindNumbers1, `.${intReplace}.`).replace(reFindNumbers2, `${intReplace}.`).replace(reFindNumbers3, `.${intReplace}`).replace(reFindMultiplePeriods, ".").split(".").map((d) => {
87
+ if (d.indexOf(intPrefix) === 0) {
88
+ return parseInt(d.substring(intPrefix.length), 10);
89
+ }
90
+ return d;
91
+ });
92
+ }
93
+ function isNonEmptyArray(obj) {
94
+ return !(Array.isArray(obj) && obj.length === 0);
95
+ }
96
+ // Annotate the CommonJS export names for ESM import in node:
97
+ 0 && (module.exports = {
98
+ functionalUpdate,
99
+ getBy,
100
+ isNonEmptyArray,
101
+ setBy
102
+ });
103
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["export type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput\n\nexport type Updater<TInput, TOutput = TInput> =\n | TOutput\n | UpdaterFn<TInput, TOutput>\n\nexport function functionalUpdate<TInput, TOutput = TInput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as UpdaterFn<TInput, TOutput>)(input)\n : updater\n}\n\n/**\n * Get a value from an object using a path, including dot notation.\n */\nexport function getBy(obj: any, path: any) {\n const pathArray = makePathArray(path)\n const pathObj = pathArray\n return pathObj.reduce((current: any, pathPart: any) => {\n if (typeof current !== 'undefined') {\n return current[pathPart]\n }\n return undefined\n }, obj)\n}\n\n/**\n * Set a value on an object using a path, including dot notation.\n */\nexport function setBy(obj: any, _path: any, updater: Updater<any>) {\n const path = makePathArray(_path)\n\n function doSet(parent?: any): any {\n if (!path.length) {\n return functionalUpdate(updater, parent)\n }\n\n const key = path.shift()\n\n if (typeof key === 'string') {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doSet(parent[key]),\n }\n }\n return {\n [key]: doSet(),\n }\n }\n\n if (typeof key === 'number') {\n if (Array.isArray(parent)) {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doSet(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n return [...new Array(key), doSet()]\n }\n\n throw new Error('Uh oh!')\n }\n\n return doSet(obj)\n}\n\nconst reFindNumbers0 = /^(\\d*)$/gm\nconst reFindNumbers1 = /\\.(\\d*)\\./gm\nconst reFindNumbers2 = /^(\\d*)\\./gm\nconst reFindNumbers3 = /\\.(\\d*$)/gm\nconst reFindMultiplePeriods = /\\.{2,}/gm\n\nconst intPrefix = '__int__'\nconst intReplace = `${intPrefix}$1`\n\nfunction makePathArray(str: string) {\n if (typeof str !== 'string') {\n throw new Error('Path must be a string.')\n }\n\n return str\n .replace('[', '.')\n .replace(']', '')\n .replace(reFindNumbers0, intReplace)\n .replace(reFindNumbers1, `.${intReplace}.`)\n .replace(reFindNumbers2, `${intReplace}.`)\n .replace(reFindNumbers3, `.${intReplace}`)\n .replace(reFindMultiplePeriods, '.')\n .split('.')\n .map((d) => {\n if (d.indexOf(intPrefix) === 0) {\n return parseInt(d.substring(intPrefix.length), 10)\n }\n return d\n })\n}\n\nexport function isNonEmptyArray(obj: any) {\n return !(Array.isArray(obj) && obj.length === 0)\n}\n\nexport type RequiredByKey<T, K extends keyof T> = Omit<T, K> &\n Required<Pick<T, K>>\n\ntype ComputeRange<\n N extends number,\n Result extends Array<unknown> = [],\n> = Result['length'] extends N\n ? Result\n : ComputeRange<N, [...Result, Result['length']]>\ntype Index40 = ComputeRange<40>[number]\n\n// Is this type a tuple?\ntype IsTuple<T> = T extends readonly any[] & { length: infer Length }\n ? Length extends Index40\n ? T\n : never\n : never\n\n// If this type is a tuple, what indices are allowed?\ntype AllowedIndexes<\n Tuple extends ReadonlyArray<any>,\n Keys extends number = never,\n> = Tuple extends readonly []\n ? Keys\n : Tuple extends readonly [infer _, ...infer Tail]\n ? AllowedIndexes<Tail, Keys | Tail['length']>\n : Keys\n\nexport type DeepKeys<T> = unknown extends T\n ? keyof T\n : object extends T\n ? string\n : T extends readonly any[] & IsTuple<T>\n ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>>\n : T extends any[]\n ? DeepKeys<T[number]>\n : T extends Date\n ? never\n : T extends object\n ? (keyof T & string) | DeepKeysPrefix<T, keyof T>\n : never\n\ntype DeepKeysPrefix<T, TPrefix> = TPrefix extends keyof T & (number | string)\n ? `${TPrefix}.${DeepKeys<T[TPrefix]> & string}`\n : never\n\nexport type DeepValue<T, TProp> = T extends Record<string | number, any>\n ? TProp extends `${infer TBranch}.${infer TDeepProp}`\n ? DeepValue<T[TBranch], TDeepProp>\n : T[TProp & string]\n : never\n\ntype Narrowable = string | number | bigint | boolean\n\ntype NarrowRaw<A> =\n | (A extends [] ? [] : never)\n | (A extends Narrowable ? A : never)\n | {\n [K in keyof A]: A[K] extends Function ? A[K] : NarrowRaw<A[K]>\n }\n\nexport type Narrow<A> = Try<A, [], NarrowRaw<A>>\n\ntype Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch\n\n// Hack to get TypeScript to show simplified types in error messages\nexport type Pretty<T> = { [K in keyof T]: T[K] } & {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,SAAS,iBACd,SACA,OACS;AACT,SAAO,OAAO,YAAY,aACrB,QAAuC,KAAK,IAC7C;AACN;AAKO,SAAS,MAAM,KAAU,MAAW;AACzC,QAAM,YAAY,cAAc,IAAI;AACpC,QAAM,UAAU;AAChB,SAAO,QAAQ,OAAO,CAAC,SAAc,aAAkB;AACrD,QAAI,OAAO,YAAY,aAAa;AAClC,aAAO,QAAQ,QAAQ;AAAA,IACzB;AACA,WAAO;AAAA,EACT,GAAG,GAAG;AACR;AAKO,SAAS,MAAM,KAAU,OAAY,SAAuB;AACjE,QAAM,OAAO,cAAc,KAAK;AAEhC,WAAS,MAAM,QAAmB;AAChC,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAO,iBAAiB,SAAS,MAAM;AAAA,IACzC;AAEA,UAAM,MAAM,KAAK,MAAM;AAEvB,QAAI,OAAO,QAAQ,UAAU;AAC3B,UAAI,OAAO,WAAW,UAAU;AAC9B,eAAO;AAAA,UACL,GAAG;AAAA,UACH,CAAC,GAAG,GAAG,MAAM,OAAO,GAAG,CAAC;AAAA,QAC1B;AAAA,MACF;AACA,aAAO;AAAA,QACL,CAAC,GAAG,GAAG,MAAM;AAAA,MACf;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,UAAU;AAC3B,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,cAAM,SAAS,OAAO,MAAM,GAAG,GAAG;AAClC,eAAO;AAAA,UACL,GAAI,OAAO,SAAS,SAAS,IAAI,MAAM,GAAG;AAAA,UAC1C,MAAM,OAAO,GAAG,CAAC;AAAA,UACjB,GAAG,OAAO,MAAM,MAAM,CAAC;AAAA,QACzB;AAAA,MACF;AACA,aAAO,CAAC,GAAG,IAAI,MAAM,GAAG,GAAG,MAAM,CAAC;AAAA,IACpC;AAEA,UAAM,IAAI,MAAM,QAAQ;AAAA,EAC1B;AAEA,SAAO,MAAM,GAAG;AAClB;AAEA,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,wBAAwB;AAE9B,IAAM,YAAY;AAClB,IAAM,aAAa,GAAG,SAAS;AAE/B,SAAS,cAAc,KAAa;AAClC,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,SAAO,IACJ,QAAQ,KAAK,GAAG,EAChB,QAAQ,KAAK,EAAE,EACf,QAAQ,gBAAgB,UAAU,EAClC,QAAQ,gBAAgB,IAAI,UAAU,GAAG,EACzC,QAAQ,gBAAgB,GAAG,UAAU,GAAG,EACxC,QAAQ,gBAAgB,IAAI,UAAU,EAAE,EACxC,QAAQ,uBAAuB,GAAG,EAClC,MAAM,GAAG,EACT,IAAI,CAAC,MAAM;AACV,QAAI,EAAE,QAAQ,SAAS,MAAM,GAAG;AAC9B,aAAO,SAAS,EAAE,UAAU,UAAU,MAAM,GAAG,EAAE;AAAA,IACnD;AACA,WAAO;AAAA,EACT,CAAC;AACL;AAEO,SAAS,gBAAgB,KAAU;AACxC,SAAO,EAAE,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW;AAChD;","names":[]}
@@ -0,0 +1,33 @@
1
+ type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput;
2
+ type Updater<TInput, TOutput = TInput> = TOutput | UpdaterFn<TInput, TOutput>;
3
+ declare function functionalUpdate<TInput, TOutput = TInput>(updater: Updater<TInput, TOutput>, input: TInput): TOutput;
4
+ /**
5
+ * Get a value from an object using a path, including dot notation.
6
+ */
7
+ declare function getBy(obj: any, path: any): any;
8
+ /**
9
+ * Set a value on an object using a path, including dot notation.
10
+ */
11
+ declare function setBy(obj: any, _path: any, updater: Updater<any>): any;
12
+ declare function isNonEmptyArray(obj: any): boolean;
13
+ type RequiredByKey<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
14
+ type ComputeRange<N extends number, Result extends Array<unknown> = []> = Result['length'] extends N ? Result : ComputeRange<N, [...Result, Result['length']]>;
15
+ type Index40 = ComputeRange<40>[number];
16
+ type IsTuple<T> = T extends readonly any[] & {
17
+ length: infer Length;
18
+ } ? Length extends Index40 ? T : never : never;
19
+ type AllowedIndexes<Tuple extends ReadonlyArray<any>, Keys extends number = never> = Tuple extends readonly [] ? Keys : Tuple extends readonly [infer _, ...infer Tail] ? AllowedIndexes<Tail, Keys | Tail['length']> : Keys;
20
+ type DeepKeys<T> = unknown extends T ? keyof T : object extends T ? string : T extends readonly any[] & IsTuple<T> ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>> : T extends any[] ? DeepKeys<T[number]> : T extends Date ? never : T extends object ? (keyof T & string) | DeepKeysPrefix<T, keyof T> : never;
21
+ type DeepKeysPrefix<T, TPrefix> = TPrefix extends keyof T & (number | string) ? `${TPrefix}.${DeepKeys<T[TPrefix]> & string}` : never;
22
+ type DeepValue<T, TProp> = T extends Record<string | number, any> ? TProp extends `${infer TBranch}.${infer TDeepProp}` ? DeepValue<T[TBranch], TDeepProp> : T[TProp & string] : never;
23
+ type Narrowable = string | number | bigint | boolean;
24
+ type NarrowRaw<A> = (A extends [] ? [] : never) | (A extends Narrowable ? A : never) | {
25
+ [K in keyof A]: A[K] extends Function ? A[K] : NarrowRaw<A[K]>;
26
+ };
27
+ type Narrow<A> = Try<A, [], NarrowRaw<A>>;
28
+ type Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch;
29
+ type Pretty<T> = {
30
+ [K in keyof T]: T[K];
31
+ } & {};
32
+
33
+ export { DeepKeys, DeepValue, Narrow, Pretty, RequiredByKey, Updater, UpdaterFn, functionalUpdate, getBy, isNonEmptyArray, setBy };
@@ -0,0 +1,33 @@
1
+ type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput;
2
+ type Updater<TInput, TOutput = TInput> = TOutput | UpdaterFn<TInput, TOutput>;
3
+ declare function functionalUpdate<TInput, TOutput = TInput>(updater: Updater<TInput, TOutput>, input: TInput): TOutput;
4
+ /**
5
+ * Get a value from an object using a path, including dot notation.
6
+ */
7
+ declare function getBy(obj: any, path: any): any;
8
+ /**
9
+ * Set a value on an object using a path, including dot notation.
10
+ */
11
+ declare function setBy(obj: any, _path: any, updater: Updater<any>): any;
12
+ declare function isNonEmptyArray(obj: any): boolean;
13
+ type RequiredByKey<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
14
+ type ComputeRange<N extends number, Result extends Array<unknown> = []> = Result['length'] extends N ? Result : ComputeRange<N, [...Result, Result['length']]>;
15
+ type Index40 = ComputeRange<40>[number];
16
+ type IsTuple<T> = T extends readonly any[] & {
17
+ length: infer Length;
18
+ } ? Length extends Index40 ? T : never : never;
19
+ type AllowedIndexes<Tuple extends ReadonlyArray<any>, Keys extends number = never> = Tuple extends readonly [] ? Keys : Tuple extends readonly [infer _, ...infer Tail] ? AllowedIndexes<Tail, Keys | Tail['length']> : Keys;
20
+ type DeepKeys<T> = unknown extends T ? keyof T : object extends T ? string : T extends readonly any[] & IsTuple<T> ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>> : T extends any[] ? DeepKeys<T[number]> : T extends Date ? never : T extends object ? (keyof T & string) | DeepKeysPrefix<T, keyof T> : never;
21
+ type DeepKeysPrefix<T, TPrefix> = TPrefix extends keyof T & (number | string) ? `${TPrefix}.${DeepKeys<T[TPrefix]> & string}` : never;
22
+ type DeepValue<T, TProp> = T extends Record<string | number, any> ? TProp extends `${infer TBranch}.${infer TDeepProp}` ? DeepValue<T[TBranch], TDeepProp> : T[TProp & string] : never;
23
+ type Narrowable = string | number | bigint | boolean;
24
+ type NarrowRaw<A> = (A extends [] ? [] : never) | (A extends Narrowable ? A : never) | {
25
+ [K in keyof A]: A[K] extends Function ? A[K] : NarrowRaw<A[K]>;
26
+ };
27
+ type Narrow<A> = Try<A, [], NarrowRaw<A>>;
28
+ type Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch;
29
+ type Pretty<T> = {
30
+ [K in keyof T]: T[K];
31
+ } & {};
32
+
33
+ export { DeepKeys, DeepValue, Narrow, Pretty, RequiredByKey, Updater, UpdaterFn, functionalUpdate, getBy, isNonEmptyArray, setBy };
@@ -0,0 +1,77 @@
1
+ import "./chunk-4QZDOMDG.js";
2
+
3
+ // src/utils.ts
4
+ function functionalUpdate(updater, input) {
5
+ return typeof updater === "function" ? updater(input) : updater;
6
+ }
7
+ function getBy(obj, path) {
8
+ const pathArray = makePathArray(path);
9
+ const pathObj = pathArray;
10
+ return pathObj.reduce((current, pathPart) => {
11
+ if (typeof current !== "undefined") {
12
+ return current[pathPart];
13
+ }
14
+ return void 0;
15
+ }, obj);
16
+ }
17
+ function setBy(obj, _path, updater) {
18
+ const path = makePathArray(_path);
19
+ function doSet(parent) {
20
+ if (!path.length) {
21
+ return functionalUpdate(updater, parent);
22
+ }
23
+ const key = path.shift();
24
+ if (typeof key === "string") {
25
+ if (typeof parent === "object") {
26
+ return {
27
+ ...parent,
28
+ [key]: doSet(parent[key])
29
+ };
30
+ }
31
+ return {
32
+ [key]: doSet()
33
+ };
34
+ }
35
+ if (typeof key === "number") {
36
+ if (Array.isArray(parent)) {
37
+ const prefix = parent.slice(0, key);
38
+ return [
39
+ ...prefix.length ? prefix : new Array(key),
40
+ doSet(parent[key]),
41
+ ...parent.slice(key + 1)
42
+ ];
43
+ }
44
+ return [...new Array(key), doSet()];
45
+ }
46
+ throw new Error("Uh oh!");
47
+ }
48
+ return doSet(obj);
49
+ }
50
+ var reFindNumbers0 = /^(\d*)$/gm;
51
+ var reFindNumbers1 = /\.(\d*)\./gm;
52
+ var reFindNumbers2 = /^(\d*)\./gm;
53
+ var reFindNumbers3 = /\.(\d*$)/gm;
54
+ var reFindMultiplePeriods = /\.{2,}/gm;
55
+ var intPrefix = "__int__";
56
+ var intReplace = `${intPrefix}$1`;
57
+ function makePathArray(str) {
58
+ if (typeof str !== "string") {
59
+ throw new Error("Path must be a string.");
60
+ }
61
+ return str.replace("[", ".").replace("]", "").replace(reFindNumbers0, intReplace).replace(reFindNumbers1, `.${intReplace}.`).replace(reFindNumbers2, `${intReplace}.`).replace(reFindNumbers3, `.${intReplace}`).replace(reFindMultiplePeriods, ".").split(".").map((d) => {
62
+ if (d.indexOf(intPrefix) === 0) {
63
+ return parseInt(d.substring(intPrefix.length), 10);
64
+ }
65
+ return d;
66
+ });
67
+ }
68
+ function isNonEmptyArray(obj) {
69
+ return !(Array.isArray(obj) && obj.length === 0);
70
+ }
71
+ export {
72
+ functionalUpdate,
73
+ getBy,
74
+ isNonEmptyArray,
75
+ setBy
76
+ };
77
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["export type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput\n\nexport type Updater<TInput, TOutput = TInput> =\n | TOutput\n | UpdaterFn<TInput, TOutput>\n\nexport function functionalUpdate<TInput, TOutput = TInput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as UpdaterFn<TInput, TOutput>)(input)\n : updater\n}\n\n/**\n * Get a value from an object using a path, including dot notation.\n */\nexport function getBy(obj: any, path: any) {\n const pathArray = makePathArray(path)\n const pathObj = pathArray\n return pathObj.reduce((current: any, pathPart: any) => {\n if (typeof current !== 'undefined') {\n return current[pathPart]\n }\n return undefined\n }, obj)\n}\n\n/**\n * Set a value on an object using a path, including dot notation.\n */\nexport function setBy(obj: any, _path: any, updater: Updater<any>) {\n const path = makePathArray(_path)\n\n function doSet(parent?: any): any {\n if (!path.length) {\n return functionalUpdate(updater, parent)\n }\n\n const key = path.shift()\n\n if (typeof key === 'string') {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doSet(parent[key]),\n }\n }\n return {\n [key]: doSet(),\n }\n }\n\n if (typeof key === 'number') {\n if (Array.isArray(parent)) {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doSet(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n return [...new Array(key), doSet()]\n }\n\n throw new Error('Uh oh!')\n }\n\n return doSet(obj)\n}\n\nconst reFindNumbers0 = /^(\\d*)$/gm\nconst reFindNumbers1 = /\\.(\\d*)\\./gm\nconst reFindNumbers2 = /^(\\d*)\\./gm\nconst reFindNumbers3 = /\\.(\\d*$)/gm\nconst reFindMultiplePeriods = /\\.{2,}/gm\n\nconst intPrefix = '__int__'\nconst intReplace = `${intPrefix}$1`\n\nfunction makePathArray(str: string) {\n if (typeof str !== 'string') {\n throw new Error('Path must be a string.')\n }\n\n return str\n .replace('[', '.')\n .replace(']', '')\n .replace(reFindNumbers0, intReplace)\n .replace(reFindNumbers1, `.${intReplace}.`)\n .replace(reFindNumbers2, `${intReplace}.`)\n .replace(reFindNumbers3, `.${intReplace}`)\n .replace(reFindMultiplePeriods, '.')\n .split('.')\n .map((d) => {\n if (d.indexOf(intPrefix) === 0) {\n return parseInt(d.substring(intPrefix.length), 10)\n }\n return d\n })\n}\n\nexport function isNonEmptyArray(obj: any) {\n return !(Array.isArray(obj) && obj.length === 0)\n}\n\nexport type RequiredByKey<T, K extends keyof T> = Omit<T, K> &\n Required<Pick<T, K>>\n\ntype ComputeRange<\n N extends number,\n Result extends Array<unknown> = [],\n> = Result['length'] extends N\n ? Result\n : ComputeRange<N, [...Result, Result['length']]>\ntype Index40 = ComputeRange<40>[number]\n\n// Is this type a tuple?\ntype IsTuple<T> = T extends readonly any[] & { length: infer Length }\n ? Length extends Index40\n ? T\n : never\n : never\n\n// If this type is a tuple, what indices are allowed?\ntype AllowedIndexes<\n Tuple extends ReadonlyArray<any>,\n Keys extends number = never,\n> = Tuple extends readonly []\n ? Keys\n : Tuple extends readonly [infer _, ...infer Tail]\n ? AllowedIndexes<Tail, Keys | Tail['length']>\n : Keys\n\nexport type DeepKeys<T> = unknown extends T\n ? keyof T\n : object extends T\n ? string\n : T extends readonly any[] & IsTuple<T>\n ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>>\n : T extends any[]\n ? DeepKeys<T[number]>\n : T extends Date\n ? never\n : T extends object\n ? (keyof T & string) | DeepKeysPrefix<T, keyof T>\n : never\n\ntype DeepKeysPrefix<T, TPrefix> = TPrefix extends keyof T & (number | string)\n ? `${TPrefix}.${DeepKeys<T[TPrefix]> & string}`\n : never\n\nexport type DeepValue<T, TProp> = T extends Record<string | number, any>\n ? TProp extends `${infer TBranch}.${infer TDeepProp}`\n ? DeepValue<T[TBranch], TDeepProp>\n : T[TProp & string]\n : never\n\ntype Narrowable = string | number | bigint | boolean\n\ntype NarrowRaw<A> =\n | (A extends [] ? [] : never)\n | (A extends Narrowable ? A : never)\n | {\n [K in keyof A]: A[K] extends Function ? A[K] : NarrowRaw<A[K]>\n }\n\nexport type Narrow<A> = Try<A, [], NarrowRaw<A>>\n\ntype Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch\n\n// Hack to get TypeScript to show simplified types in error messages\nexport type Pretty<T> = { [K in keyof T]: T[K] } & {}\n"],"mappings":";;;AAMO,SAAS,iBACd,SACA,OACS;AACT,SAAO,OAAO,YAAY,aACrB,QAAuC,KAAK,IAC7C;AACN;AAKO,SAAS,MAAM,KAAU,MAAW;AACzC,QAAM,YAAY,cAAc,IAAI;AACpC,QAAM,UAAU;AAChB,SAAO,QAAQ,OAAO,CAAC,SAAc,aAAkB;AACrD,QAAI,OAAO,YAAY,aAAa;AAClC,aAAO,QAAQ,QAAQ;AAAA,IACzB;AACA,WAAO;AAAA,EACT,GAAG,GAAG;AACR;AAKO,SAAS,MAAM,KAAU,OAAY,SAAuB;AACjE,QAAM,OAAO,cAAc,KAAK;AAEhC,WAAS,MAAM,QAAmB;AAChC,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAO,iBAAiB,SAAS,MAAM;AAAA,IACzC;AAEA,UAAM,MAAM,KAAK,MAAM;AAEvB,QAAI,OAAO,QAAQ,UAAU;AAC3B,UAAI,OAAO,WAAW,UAAU;AAC9B,eAAO;AAAA,UACL,GAAG;AAAA,UACH,CAAC,GAAG,GAAG,MAAM,OAAO,GAAG,CAAC;AAAA,QAC1B;AAAA,MACF;AACA,aAAO;AAAA,QACL,CAAC,GAAG,GAAG,MAAM;AAAA,MACf;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,UAAU;AAC3B,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,cAAM,SAAS,OAAO,MAAM,GAAG,GAAG;AAClC,eAAO;AAAA,UACL,GAAI,OAAO,SAAS,SAAS,IAAI,MAAM,GAAG;AAAA,UAC1C,MAAM,OAAO,GAAG,CAAC;AAAA,UACjB,GAAG,OAAO,MAAM,MAAM,CAAC;AAAA,QACzB;AAAA,MACF;AACA,aAAO,CAAC,GAAG,IAAI,MAAM,GAAG,GAAG,MAAM,CAAC;AAAA,IACpC;AAEA,UAAM,IAAI,MAAM,QAAQ;AAAA,EAC1B;AAEA,SAAO,MAAM,GAAG;AAClB;AAEA,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,wBAAwB;AAE9B,IAAM,YAAY;AAClB,IAAM,aAAa,GAAG,SAAS;AAE/B,SAAS,cAAc,KAAa;AAClC,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,SAAO,IACJ,QAAQ,KAAK,GAAG,EAChB,QAAQ,KAAK,EAAE,EACf,QAAQ,gBAAgB,UAAU,EAClC,QAAQ,gBAAgB,IAAI,UAAU,GAAG,EACzC,QAAQ,gBAAgB,GAAG,UAAU,GAAG,EACxC,QAAQ,gBAAgB,IAAI,UAAU,EAAE,EACxC,QAAQ,uBAAuB,GAAG,EAClC,MAAM,GAAG,EACT,IAAI,CAAC,MAAM;AACV,QAAI,EAAE,QAAQ,SAAS,MAAM,GAAG;AAC9B,aAAO,SAAS,EAAE,UAAU,UAAU,MAAM,GAAG,EAAE;AAAA,IACnD;AACA,WAAO;AAAA,EACT,CAAC;AACL;AAEO,SAAS,gBAAgB,KAAU;AACxC,SAAO,EAAE,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW;AAChD;","names":[]}