@strictly/react-form 0.0.8 → 0.0.9
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/.out/core/mobx/field_adapter_builder.d.ts +4 -0
- package/.out/core/mobx/field_adapter_builder.js +31 -0
- package/.out/core/mobx/hooks.d.ts +2 -2
- package/.out/core/mobx/hooks.js +1 -1
- package/.out/field_converters/chain_field_converter.js +3 -3
- package/.out/mantine/error_renderer.d.ts +7 -3
- package/.out/tsconfig.tsbuildinfo +1 -1
- package/.out/types/specs/{error_type_of_field.tests.js → error_of_field.tests.js} +1 -1
- package/.turbo/turbo-build.log +8 -8
- package/.turbo/turbo-check-types.log +1 -1
- package/.turbo/turbo-release$colon$exports.log +1 -1
- package/core/mobx/field_adapter_builder.ts +71 -0
- package/core/mobx/hooks.ts +2 -2
- package/dist/index.cjs +57 -23
- package/dist/index.d.cts +13 -8
- package/dist/index.d.ts +13 -8
- package/dist/index.js +56 -23
- package/field_converters/chain_field_converter.ts +3 -3
- package/mantine/error_renderer.ts +12 -3
- package/package.json +1 -1
- package/types/specs/{error_type_of_field.tests.ts → error_of_field.tests.ts} +1 -1
- /package/.out/types/specs/{error_type_of_field.tests.d.ts → error_of_field.tests.d.ts} +0 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -7,12 +7,12 @@ $ tsup
|
|
|
7
7
|
[34mCLI[39m Target: esnext
|
|
8
8
|
[34mCJS[39m Build start
|
|
9
9
|
[34mESM[39m Build start
|
|
10
|
-
[32mCJS[39m [1mdist/index.cjs [22m[
|
|
11
|
-
[32mCJS[39m ⚡️ Build success in
|
|
12
|
-
[32mESM[39m [1mdist/index.js [22m[
|
|
13
|
-
[32mESM[39m ⚡️ Build success in
|
|
10
|
+
[32mCJS[39m [1mdist/index.cjs [22m[32m51.55 KB[39m
|
|
11
|
+
[32mCJS[39m ⚡️ Build success in 120ms
|
|
12
|
+
[32mESM[39m [1mdist/index.js [22m[32m47.61 KB[39m
|
|
13
|
+
[32mESM[39m ⚡️ Build success in 121ms
|
|
14
14
|
[34mDTS[39m Build start
|
|
15
|
-
[32mDTS[39m ⚡️ Build success in
|
|
16
|
-
[32mDTS[39m [1mdist/index.d.cts [22m[
|
|
17
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[
|
|
18
|
-
Done in
|
|
15
|
+
[32mDTS[39m ⚡️ Build success in 10031ms
|
|
16
|
+
[32mDTS[39m [1mdist/index.d.cts [22m[32m37.40 KB[39m
|
|
17
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m37.40 KB[39m
|
|
18
|
+
Done in 11.07s.
|
|
@@ -7,12 +7,14 @@ import {
|
|
|
7
7
|
unreliableIdentityConverter,
|
|
8
8
|
} from 'field_converters/identity_converter'
|
|
9
9
|
import { MaybeIdentityConverter } from 'field_converters/maybe_identity_converter'
|
|
10
|
+
import { TrimmingStringConverter } from 'field_converters/trimming_string_converter'
|
|
10
11
|
import { prototypingFieldValueFactory } from 'field_value_factories/prototyping_field_value_factory'
|
|
11
12
|
import {
|
|
12
13
|
type AnnotatedFieldConverter,
|
|
13
14
|
type FieldValueFactory,
|
|
14
15
|
type TwoWayFieldConverter,
|
|
15
16
|
type TwoWayFieldConverterWithValueFactory,
|
|
17
|
+
UnreliableFieldConversionType,
|
|
16
18
|
type UnreliableFieldConverter,
|
|
17
19
|
} from 'types/field_converters'
|
|
18
20
|
import { type FieldAdapter } from './field_adapter'
|
|
@@ -82,6 +84,65 @@ class FieldAdapterBuilder<
|
|
|
82
84
|
)
|
|
83
85
|
}
|
|
84
86
|
|
|
87
|
+
nullable(): FieldAdapterBuilder<
|
|
88
|
+
From | null,
|
|
89
|
+
To | null,
|
|
90
|
+
E,
|
|
91
|
+
ValuePath,
|
|
92
|
+
Context
|
|
93
|
+
> {
|
|
94
|
+
return this.or(null)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
optional(): FieldAdapterBuilder<
|
|
98
|
+
From | undefined,
|
|
99
|
+
To | undefined,
|
|
100
|
+
E,
|
|
101
|
+
ValuePath,
|
|
102
|
+
Context
|
|
103
|
+
> {
|
|
104
|
+
return this.or(undefined)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private or<V>(proto: V): FieldAdapterBuilder<
|
|
108
|
+
From | V,
|
|
109
|
+
To | V,
|
|
110
|
+
E,
|
|
111
|
+
ValuePath,
|
|
112
|
+
Context
|
|
113
|
+
> {
|
|
114
|
+
function isFrom(v: From | V): v is From {
|
|
115
|
+
return v !== proto
|
|
116
|
+
}
|
|
117
|
+
function isTo(v: To | V): v is To {
|
|
118
|
+
return v !== proto
|
|
119
|
+
}
|
|
120
|
+
return new FieldAdapterBuilder<
|
|
121
|
+
From | V,
|
|
122
|
+
To | V,
|
|
123
|
+
E,
|
|
124
|
+
ValuePath,
|
|
125
|
+
Context
|
|
126
|
+
>(
|
|
127
|
+
(v, valuePath, context) =>
|
|
128
|
+
isFrom(v)
|
|
129
|
+
? this.convert(v, valuePath, context)
|
|
130
|
+
: {
|
|
131
|
+
value: v,
|
|
132
|
+
readonly: false,
|
|
133
|
+
required: false,
|
|
134
|
+
},
|
|
135
|
+
this.create,
|
|
136
|
+
(v, valuePath, context) =>
|
|
137
|
+
isTo(v) && this.revert
|
|
138
|
+
? this.revert(v, valuePath, context)
|
|
139
|
+
: {
|
|
140
|
+
type: UnreliableFieldConversionType.Success,
|
|
141
|
+
value: proto,
|
|
142
|
+
},
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
|
|
85
146
|
withIdentity(isFrom: (from: To | From) => from is From): FieldAdapterBuilder<
|
|
86
147
|
From,
|
|
87
148
|
To | From,
|
|
@@ -263,6 +324,16 @@ export function identityAdapter<
|
|
|
263
324
|
)
|
|
264
325
|
}
|
|
265
326
|
|
|
327
|
+
export function trimmingStringAdapter<
|
|
328
|
+
ValuePath extends string,
|
|
329
|
+
Context,
|
|
330
|
+
>() {
|
|
331
|
+
return adapterFromTwoWayConverter<string, string, never, ValuePath, Context>(
|
|
332
|
+
new TrimmingStringConverter<ValuePath, Context>(),
|
|
333
|
+
prototypingFieldValueFactory<string, ValuePath, Context>(''),
|
|
334
|
+
)
|
|
335
|
+
}
|
|
336
|
+
|
|
266
337
|
export function listAdapter<
|
|
267
338
|
E,
|
|
268
339
|
ValuePath extends string,
|
package/core/mobx/hooks.ts
CHANGED
|
@@ -31,10 +31,10 @@ export function useDefaultMobxFormHooks<P extends FormPresenter<any, any, any, a
|
|
|
31
31
|
}: {
|
|
32
32
|
onValidFieldSubmit?: <Path extends ValuePathsOfPresenter<P>>(model: ModelOfPresenter<P>, valuePath: Path) => void,
|
|
33
33
|
onValidFormSubmit?: (model: ModelOfPresenter<P>, value: ValueOfPresenter<P>) => void,
|
|
34
|
-
},
|
|
34
|
+
} = {},
|
|
35
35
|
): {
|
|
36
36
|
model: ModelOfPresenter<P>,
|
|
37
|
-
onFormSubmit?: (
|
|
37
|
+
onFormSubmit?: () => void,
|
|
38
38
|
} & Omit<FieldsViewProps<ModelOfPresenter<P>['fields']>, 'fields'> {
|
|
39
39
|
const model = useMemo(function () {
|
|
40
40
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
package/dist/index.cjs
CHANGED
|
@@ -45,6 +45,7 @@ __export(index_exports, {
|
|
|
45
45
|
mergeValidators: () => mergeValidators,
|
|
46
46
|
prototypingFieldValueFactory: () => prototypingFieldValueFactory,
|
|
47
47
|
subFormFieldAdapters: () => subFormFieldAdapters,
|
|
48
|
+
trimmingStringAdapter: () => trimmingStringAdapter,
|
|
48
49
|
useDefaultMobxFormHooks: () => useDefaultMobxFormHooks,
|
|
49
50
|
useMantineFormFields: () => useMantineFormFields,
|
|
50
51
|
usePartialComponent: () => usePartialComponent,
|
|
@@ -105,18 +106,18 @@ function chainAnnotatedFieldConverter(from, to) {
|
|
|
105
106
|
return function(value, valuePath, context) {
|
|
106
107
|
const {
|
|
107
108
|
required: intermediateRequired,
|
|
108
|
-
readonly:
|
|
109
|
+
readonly: intermediateReadonly,
|
|
109
110
|
value: intermediateValue
|
|
110
111
|
} = from(value, valuePath, context);
|
|
111
112
|
const {
|
|
112
113
|
required: finalRequired,
|
|
113
|
-
readonly:
|
|
114
|
+
readonly: finalReadonly,
|
|
114
115
|
value: finalValue
|
|
115
116
|
} = to(intermediateValue, valuePath, context);
|
|
116
117
|
return {
|
|
117
118
|
value: finalValue,
|
|
118
119
|
required: intermediateRequired || finalRequired,
|
|
119
|
-
readonly:
|
|
120
|
+
readonly: intermediateReadonly || finalReadonly
|
|
120
121
|
};
|
|
121
122
|
};
|
|
122
123
|
}
|
|
@@ -155,6 +156,25 @@ var MaybeIdentityConverter = class {
|
|
|
155
156
|
}
|
|
156
157
|
};
|
|
157
158
|
|
|
159
|
+
// field_converters/trimming_string_converter.ts
|
|
160
|
+
var TrimmingStringConverter = class {
|
|
161
|
+
constructor() {
|
|
162
|
+
}
|
|
163
|
+
convert(to) {
|
|
164
|
+
return {
|
|
165
|
+
value: to.trim(),
|
|
166
|
+
required: false,
|
|
167
|
+
readonly: false
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
revert(from) {
|
|
171
|
+
return {
|
|
172
|
+
type: 0 /* Success */,
|
|
173
|
+
value: from.trim()
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
|
|
158
178
|
// field_value_factories/prototyping_field_value_factory.ts
|
|
159
179
|
function prototypingFieldValueFactory(prototype) {
|
|
160
180
|
return function() {
|
|
@@ -189,6 +209,32 @@ var FieldAdapterBuilder = class _FieldAdapterBuilder {
|
|
|
189
209
|
reverter
|
|
190
210
|
);
|
|
191
211
|
}
|
|
212
|
+
nullable() {
|
|
213
|
+
return this.or(null);
|
|
214
|
+
}
|
|
215
|
+
optional() {
|
|
216
|
+
return this.or(void 0);
|
|
217
|
+
}
|
|
218
|
+
or(proto) {
|
|
219
|
+
function isFrom(v) {
|
|
220
|
+
return v !== proto;
|
|
221
|
+
}
|
|
222
|
+
function isTo(v) {
|
|
223
|
+
return v !== proto;
|
|
224
|
+
}
|
|
225
|
+
return new _FieldAdapterBuilder(
|
|
226
|
+
(v, valuePath, context) => isFrom(v) ? this.convert(v, valuePath, context) : {
|
|
227
|
+
value: v,
|
|
228
|
+
readonly: false,
|
|
229
|
+
required: false
|
|
230
|
+
},
|
|
231
|
+
this.create,
|
|
232
|
+
(v, valuePath, context) => isTo(v) && this.revert ? this.revert(v, valuePath, context) : {
|
|
233
|
+
type: 0 /* Success */,
|
|
234
|
+
value: proto
|
|
235
|
+
}
|
|
236
|
+
);
|
|
237
|
+
}
|
|
192
238
|
withIdentity(isFrom) {
|
|
193
239
|
const identityConverter = new MaybeIdentityConverter({
|
|
194
240
|
convert: this.convert,
|
|
@@ -226,6 +272,12 @@ function identityAdapter(prototype, required) {
|
|
|
226
272
|
unreliableIdentityConverter()
|
|
227
273
|
);
|
|
228
274
|
}
|
|
275
|
+
function trimmingStringAdapter() {
|
|
276
|
+
return adapterFromTwoWayConverter(
|
|
277
|
+
new TrimmingStringConverter(),
|
|
278
|
+
prototypingFieldValueFactory("")
|
|
279
|
+
);
|
|
280
|
+
}
|
|
229
281
|
function listAdapter() {
|
|
230
282
|
return new FieldAdapterBuilder(
|
|
231
283
|
annotatedIdentityConverter(false),
|
|
@@ -693,7 +745,7 @@ var import_react = require("react");
|
|
|
693
745
|
function useDefaultMobxFormHooks(presenter, value, {
|
|
694
746
|
onValidFieldSubmit,
|
|
695
747
|
onValidFormSubmit
|
|
696
|
-
}) {
|
|
748
|
+
} = {}) {
|
|
697
749
|
const model = (0, import_react.useMemo)(function() {
|
|
698
750
|
return presenter.createModel(value);
|
|
699
751
|
}, [
|
|
@@ -1025,25 +1077,6 @@ var SelectStringConverter = class extends AbstractSelectValueTypeConverter {
|
|
|
1025
1077
|
}
|
|
1026
1078
|
};
|
|
1027
1079
|
|
|
1028
|
-
// field_converters/trimming_string_converter.ts
|
|
1029
|
-
var TrimmingStringConverter = class {
|
|
1030
|
-
constructor() {
|
|
1031
|
-
}
|
|
1032
|
-
convert(to) {
|
|
1033
|
-
return {
|
|
1034
|
-
value: to.trim(),
|
|
1035
|
-
required: false,
|
|
1036
|
-
readonly: false
|
|
1037
|
-
};
|
|
1038
|
-
}
|
|
1039
|
-
revert(from) {
|
|
1040
|
-
return {
|
|
1041
|
-
type: 0 /* Success */,
|
|
1042
|
-
value: from.trim()
|
|
1043
|
-
};
|
|
1044
|
-
}
|
|
1045
|
-
};
|
|
1046
|
-
|
|
1047
1080
|
// field_converters/validating_converter.ts
|
|
1048
1081
|
var import_define6 = require("@strictly/define");
|
|
1049
1082
|
function validatingConverter(validators = []) {
|
|
@@ -1783,6 +1816,7 @@ function mergeValidators(validators1, validators2) {
|
|
|
1783
1816
|
mergeValidators,
|
|
1784
1817
|
prototypingFieldValueFactory,
|
|
1785
1818
|
subFormFieldAdapters,
|
|
1819
|
+
trimmingStringAdapter,
|
|
1786
1820
|
useDefaultMobxFormHooks,
|
|
1787
1821
|
useMantineFormFields,
|
|
1788
1822
|
usePartialComponent,
|
package/dist/index.d.cts
CHANGED
|
@@ -58,6 +58,9 @@ declare class FieldAdapterBuilder<From, To, E, ValuePath extends string, Context
|
|
|
58
58
|
constructor(convert: AnnotatedFieldConverter<From, To, ValuePath, Context>, create: FieldValueFactory<From, ValuePath, Context>, revert?: UnreliableFieldConverter<To, From, E, ValuePath, Context> | undefined);
|
|
59
59
|
chain<To2, E2 = E>(converter: AnnotatedFieldConverter<To, To2, ValuePath, Context>, reverter?: UnreliableFieldConverter<To2, To, E2, ValuePath, Context>): FieldAdapterBuilder<From, To2, E | E2, ValuePath, Context>;
|
|
60
60
|
withReverter(reverter: UnreliableFieldConverter<To, From, E, ValuePath, Context>): FieldAdapterBuilder<From, To, E, ValuePath, Context>;
|
|
61
|
+
nullable(): FieldAdapterBuilder<From | null, To | null, E, ValuePath, Context>;
|
|
62
|
+
optional(): FieldAdapterBuilder<From | undefined, To | undefined, E, ValuePath, Context>;
|
|
63
|
+
private or;
|
|
61
64
|
withIdentity(isFrom: (from: To | From) => from is From): FieldAdapterBuilder<From, To | From, E, ValuePath, Context>;
|
|
62
65
|
get narrow(): FieldAdapter<From, To, E, ValuePath, Context>;
|
|
63
66
|
}
|
|
@@ -68,6 +71,7 @@ declare function adapterFromTwoWayConverter<From, To, E, ValuePath extends strin
|
|
|
68
71
|
declare function adapterFromPrototype<From, To, ValuePath extends string, Context>(converter: AnnotatedFieldConverter<From, To, ValuePath, Context>, prototype: From): FieldAdapterBuilder<From, To, never, ValuePath, Context>;
|
|
69
72
|
declare function adapterFromPrototype<From, To, E, ValuePath extends string, Context>(converter: TwoWayFieldConverter<From, To, E, ValuePath, Context>, prototype: From): FieldAdapterBuilder<From, To, E, ValuePath, Context>;
|
|
70
73
|
declare function identityAdapter<V, ValuePath extends string, Context>(prototype: V, required?: boolean): FieldAdapterBuilder<V, V, never, ValuePath, Context>;
|
|
74
|
+
declare function trimmingStringAdapter<ValuePath extends string, Context>(): FieldAdapterBuilder<string, string, never, ValuePath, Context>;
|
|
71
75
|
declare function listAdapter<E, ValuePath extends string, Context>(): FieldAdapterBuilder<readonly E[], readonly E[], never, ValuePath, Context>;
|
|
72
76
|
|
|
73
77
|
type FieldAdaptersOfValues<FlattenedValues extends Readonly<Record<string, any>>, TypePathsToValuePaths extends Readonly<Record<keyof FlattenedValues, string>> = Readonly<Record<keyof FlattenedValues, any>>, Context = any> = {
|
|
@@ -181,12 +185,12 @@ type FormFieldsOfPresenter<Presenter extends FormPresenter<any, any, any, any>>
|
|
|
181
185
|
|
|
182
186
|
type ValueOfPresenter<P extends FormPresenter<any, any, any, any>> = P extends FormPresenter<infer T, any, any, any> ? ValueOfType<ReadonlyTypeOfType<T>> : never;
|
|
183
187
|
type ModelOfPresenter<P extends FormPresenter<any, any, any, any>> = ReturnType<P['createModel']>;
|
|
184
|
-
declare function useDefaultMobxFormHooks<P extends FormPresenter<any, any, any, any>>(presenter: P, value: ValueOfPresenter<P>, { onValidFieldSubmit, onValidFormSubmit, }
|
|
188
|
+
declare function useDefaultMobxFormHooks<P extends FormPresenter<any, any, any, any>>(presenter: P, value: ValueOfPresenter<P>, { onValidFieldSubmit, onValidFormSubmit, }?: {
|
|
185
189
|
onValidFieldSubmit?: <Path extends ValuePathsOfPresenter<P>>(model: ModelOfPresenter<P>, valuePath: Path) => void;
|
|
186
190
|
onValidFormSubmit?: (model: ModelOfPresenter<P>, value: ValueOfPresenter<P>) => void;
|
|
187
191
|
}): {
|
|
188
192
|
model: ModelOfPresenter<P>;
|
|
189
|
-
onFormSubmit?: (
|
|
193
|
+
onFormSubmit?: () => void;
|
|
190
194
|
} & Omit<FieldsViewProps<ModelOfPresenter<P>['fields']>, 'fields'>;
|
|
191
195
|
|
|
192
196
|
type MergedOfFieldAdaptersWithTwoWayConverter<FieldAdapters extends Readonly<Record<string, FieldAdapter>>, E, Context> = {
|
|
@@ -269,11 +273,14 @@ declare function validatingConverter<V, E, ValuePath extends string, Context>(va
|
|
|
269
273
|
|
|
270
274
|
declare function prototypingFieldValueFactory<V, ValuePath extends string, Context>(prototype: V): FieldValueFactory<V, ValuePath, Context>;
|
|
271
275
|
|
|
272
|
-
type
|
|
276
|
+
type ErrorOfField<F extends Field> = F extends Field<infer _V, infer E> ? E : never;
|
|
277
|
+
|
|
278
|
+
type InternalErrorRendererProps<E> = {
|
|
273
279
|
error: E;
|
|
274
280
|
};
|
|
275
|
-
type
|
|
276
|
-
|
|
281
|
+
type ErrorRendererProps<F extends Fields, K extends keyof Fields> = InternalErrorRendererProps<ErrorOfField<F[K]>>;
|
|
282
|
+
type ErrorRenderer<E = any> = ComponentType<InternalErrorRendererProps<E>>;
|
|
283
|
+
declare function DefaultErrorRenderer({ error, }: InternalErrorRendererProps<any>): string;
|
|
277
284
|
|
|
278
285
|
type ValueTypeOfField<F extends Field> = F extends Field<infer V> ? V : never;
|
|
279
286
|
|
|
@@ -285,8 +292,6 @@ type BooleanFieldsOfFields<F extends Fields> = {
|
|
|
285
292
|
[K in keyof F as ValueTypeOfField<F[K]> extends boolean ? K : never]: F[K];
|
|
286
293
|
};
|
|
287
294
|
|
|
288
|
-
type ErrorOfField<F extends Field> = F extends Field<infer _V, infer E> ? E : never;
|
|
289
|
-
|
|
290
295
|
type ListFieldsOfFields<F extends Fields> = {
|
|
291
296
|
[K in keyof F as ValueTypeOfField<F[K]> extends readonly any[] ? K : never]: F[K];
|
|
292
297
|
};
|
|
@@ -413,4 +418,4 @@ type MergedOfValidators<Validators1 extends Partial<Readonly<Record<Keys, Valida
|
|
|
413
418
|
type MergedOfValidator<Validator1 extends Validator, Validator2 extends Validator> = Validator1 extends Validator<infer V, infer E1, infer P, infer C> ? Validator2 extends Validator<V, infer E2, P, C> ? Validator<V, E1 | E2, P, C> : never : never;
|
|
414
419
|
declare function mergeValidators<Validators1 extends Partial<Readonly<Record<Keys, Validator>>>, Validators2 extends Partial<Readonly<Record<Keys, Validator>>>, Keys extends string = Extract<keyof Validators1 | keyof Validators2, string>>(validators1: Validators1, validators2: Validators2): MergedOfValidators<Validators1, Validators2, Keys>;
|
|
415
420
|
|
|
416
|
-
export { AbstractSelectValueTypeConverter, type AnnotatedFieldConversion, type AnnotatedFieldConverter, type Annotation, DefaultErrorRenderer, type ErrorOfField, type ErrorOfFieldAdapter, type ErrorRenderer, type ErrorRendererProps, type Field, type FieldAdapter, type FieldAdaptersOfValues, type FieldValueFactory, type Fields, type FieldsViewProps, type FlattenedAdaptersOfFields, type FlattenedConvertedFieldsOf, type FlattenedTypePathsToAdaptersOf, type FormFieldsOfFieldAdapters, type FormFieldsOfPresenter, FormModel, FormPresenter, type FormProps, type FromOfFieldAdapter, IntegerToStringConverter, type MergedOfFieldAdaptersWithTwoWayConverter, type MergedOfFieldAdaptersWithValidators, type MergedOfValidator, type MergedOfValidators, NullableToBooleanConverter, type PartialComponent, SelectDiscriminatedUnionConverter, SelectLiteralConverter, SelectStringConverter, type ToOfFieldAdapter, type ToValueOfPresenterValuePath, TrimmingStringConverter, type TwoWayFieldConverter, type TwoWayFieldConverterWithValueFactory, type UnreliableFieldConversion, UnreliableFieldConversionType, type UnreliableFieldConverter, type UnsafePartialComponent, type ValuePathOfFieldAdapter, type ValuePathsOfPresenter, type ValuePathsToAdaptersOf, adapter, adapterFromPrototype, adapterFromTwoWayConverter, createPartialComponent, createPartialObserverComponent, createSimplePartialComponent, createUnsafePartialObserverComponent, identityAdapter, listAdapter, mergeAdaptersWithValidators, mergeFieldAdaptersWithTwoWayConverter, mergeValidators, prototypingFieldValueFactory, subFormFieldAdapters, useDefaultMobxFormHooks, useMantineFormFields, usePartialComponent, usePartialObserverComponent, validatingConverter };
|
|
421
|
+
export { AbstractSelectValueTypeConverter, type AnnotatedFieldConversion, type AnnotatedFieldConverter, type Annotation, DefaultErrorRenderer, type ErrorOfField, type ErrorOfFieldAdapter, type ErrorRenderer, type ErrorRendererProps, type Field, type FieldAdapter, type FieldAdaptersOfValues, type FieldValueFactory, type Fields, type FieldsViewProps, type FlattenedAdaptersOfFields, type FlattenedConvertedFieldsOf, type FlattenedTypePathsToAdaptersOf, type FormFieldsOfFieldAdapters, type FormFieldsOfPresenter, FormModel, FormPresenter, type FormProps, type FromOfFieldAdapter, IntegerToStringConverter, type MergedOfFieldAdaptersWithTwoWayConverter, type MergedOfFieldAdaptersWithValidators, type MergedOfValidator, type MergedOfValidators, NullableToBooleanConverter, type PartialComponent, SelectDiscriminatedUnionConverter, SelectLiteralConverter, SelectStringConverter, type ToOfFieldAdapter, type ToValueOfPresenterValuePath, TrimmingStringConverter, type TwoWayFieldConverter, type TwoWayFieldConverterWithValueFactory, type UnreliableFieldConversion, UnreliableFieldConversionType, type UnreliableFieldConverter, type UnsafePartialComponent, type ValuePathOfFieldAdapter, type ValuePathsOfPresenter, type ValuePathsToAdaptersOf, adapter, adapterFromPrototype, adapterFromTwoWayConverter, createPartialComponent, createPartialObserverComponent, createSimplePartialComponent, createUnsafePartialObserverComponent, identityAdapter, listAdapter, mergeAdaptersWithValidators, mergeFieldAdaptersWithTwoWayConverter, mergeValidators, prototypingFieldValueFactory, subFormFieldAdapters, trimmingStringAdapter, useDefaultMobxFormHooks, useMantineFormFields, usePartialComponent, usePartialObserverComponent, validatingConverter };
|
package/dist/index.d.ts
CHANGED
|
@@ -58,6 +58,9 @@ declare class FieldAdapterBuilder<From, To, E, ValuePath extends string, Context
|
|
|
58
58
|
constructor(convert: AnnotatedFieldConverter<From, To, ValuePath, Context>, create: FieldValueFactory<From, ValuePath, Context>, revert?: UnreliableFieldConverter<To, From, E, ValuePath, Context> | undefined);
|
|
59
59
|
chain<To2, E2 = E>(converter: AnnotatedFieldConverter<To, To2, ValuePath, Context>, reverter?: UnreliableFieldConverter<To2, To, E2, ValuePath, Context>): FieldAdapterBuilder<From, To2, E | E2, ValuePath, Context>;
|
|
60
60
|
withReverter(reverter: UnreliableFieldConverter<To, From, E, ValuePath, Context>): FieldAdapterBuilder<From, To, E, ValuePath, Context>;
|
|
61
|
+
nullable(): FieldAdapterBuilder<From | null, To | null, E, ValuePath, Context>;
|
|
62
|
+
optional(): FieldAdapterBuilder<From | undefined, To | undefined, E, ValuePath, Context>;
|
|
63
|
+
private or;
|
|
61
64
|
withIdentity(isFrom: (from: To | From) => from is From): FieldAdapterBuilder<From, To | From, E, ValuePath, Context>;
|
|
62
65
|
get narrow(): FieldAdapter<From, To, E, ValuePath, Context>;
|
|
63
66
|
}
|
|
@@ -68,6 +71,7 @@ declare function adapterFromTwoWayConverter<From, To, E, ValuePath extends strin
|
|
|
68
71
|
declare function adapterFromPrototype<From, To, ValuePath extends string, Context>(converter: AnnotatedFieldConverter<From, To, ValuePath, Context>, prototype: From): FieldAdapterBuilder<From, To, never, ValuePath, Context>;
|
|
69
72
|
declare function adapterFromPrototype<From, To, E, ValuePath extends string, Context>(converter: TwoWayFieldConverter<From, To, E, ValuePath, Context>, prototype: From): FieldAdapterBuilder<From, To, E, ValuePath, Context>;
|
|
70
73
|
declare function identityAdapter<V, ValuePath extends string, Context>(prototype: V, required?: boolean): FieldAdapterBuilder<V, V, never, ValuePath, Context>;
|
|
74
|
+
declare function trimmingStringAdapter<ValuePath extends string, Context>(): FieldAdapterBuilder<string, string, never, ValuePath, Context>;
|
|
71
75
|
declare function listAdapter<E, ValuePath extends string, Context>(): FieldAdapterBuilder<readonly E[], readonly E[], never, ValuePath, Context>;
|
|
72
76
|
|
|
73
77
|
type FieldAdaptersOfValues<FlattenedValues extends Readonly<Record<string, any>>, TypePathsToValuePaths extends Readonly<Record<keyof FlattenedValues, string>> = Readonly<Record<keyof FlattenedValues, any>>, Context = any> = {
|
|
@@ -181,12 +185,12 @@ type FormFieldsOfPresenter<Presenter extends FormPresenter<any, any, any, any>>
|
|
|
181
185
|
|
|
182
186
|
type ValueOfPresenter<P extends FormPresenter<any, any, any, any>> = P extends FormPresenter<infer T, any, any, any> ? ValueOfType<ReadonlyTypeOfType<T>> : never;
|
|
183
187
|
type ModelOfPresenter<P extends FormPresenter<any, any, any, any>> = ReturnType<P['createModel']>;
|
|
184
|
-
declare function useDefaultMobxFormHooks<P extends FormPresenter<any, any, any, any>>(presenter: P, value: ValueOfPresenter<P>, { onValidFieldSubmit, onValidFormSubmit, }
|
|
188
|
+
declare function useDefaultMobxFormHooks<P extends FormPresenter<any, any, any, any>>(presenter: P, value: ValueOfPresenter<P>, { onValidFieldSubmit, onValidFormSubmit, }?: {
|
|
185
189
|
onValidFieldSubmit?: <Path extends ValuePathsOfPresenter<P>>(model: ModelOfPresenter<P>, valuePath: Path) => void;
|
|
186
190
|
onValidFormSubmit?: (model: ModelOfPresenter<P>, value: ValueOfPresenter<P>) => void;
|
|
187
191
|
}): {
|
|
188
192
|
model: ModelOfPresenter<P>;
|
|
189
|
-
onFormSubmit?: (
|
|
193
|
+
onFormSubmit?: () => void;
|
|
190
194
|
} & Omit<FieldsViewProps<ModelOfPresenter<P>['fields']>, 'fields'>;
|
|
191
195
|
|
|
192
196
|
type MergedOfFieldAdaptersWithTwoWayConverter<FieldAdapters extends Readonly<Record<string, FieldAdapter>>, E, Context> = {
|
|
@@ -269,11 +273,14 @@ declare function validatingConverter<V, E, ValuePath extends string, Context>(va
|
|
|
269
273
|
|
|
270
274
|
declare function prototypingFieldValueFactory<V, ValuePath extends string, Context>(prototype: V): FieldValueFactory<V, ValuePath, Context>;
|
|
271
275
|
|
|
272
|
-
type
|
|
276
|
+
type ErrorOfField<F extends Field> = F extends Field<infer _V, infer E> ? E : never;
|
|
277
|
+
|
|
278
|
+
type InternalErrorRendererProps<E> = {
|
|
273
279
|
error: E;
|
|
274
280
|
};
|
|
275
|
-
type
|
|
276
|
-
|
|
281
|
+
type ErrorRendererProps<F extends Fields, K extends keyof Fields> = InternalErrorRendererProps<ErrorOfField<F[K]>>;
|
|
282
|
+
type ErrorRenderer<E = any> = ComponentType<InternalErrorRendererProps<E>>;
|
|
283
|
+
declare function DefaultErrorRenderer({ error, }: InternalErrorRendererProps<any>): string;
|
|
277
284
|
|
|
278
285
|
type ValueTypeOfField<F extends Field> = F extends Field<infer V> ? V : never;
|
|
279
286
|
|
|
@@ -285,8 +292,6 @@ type BooleanFieldsOfFields<F extends Fields> = {
|
|
|
285
292
|
[K in keyof F as ValueTypeOfField<F[K]> extends boolean ? K : never]: F[K];
|
|
286
293
|
};
|
|
287
294
|
|
|
288
|
-
type ErrorOfField<F extends Field> = F extends Field<infer _V, infer E> ? E : never;
|
|
289
|
-
|
|
290
295
|
type ListFieldsOfFields<F extends Fields> = {
|
|
291
296
|
[K in keyof F as ValueTypeOfField<F[K]> extends readonly any[] ? K : never]: F[K];
|
|
292
297
|
};
|
|
@@ -413,4 +418,4 @@ type MergedOfValidators<Validators1 extends Partial<Readonly<Record<Keys, Valida
|
|
|
413
418
|
type MergedOfValidator<Validator1 extends Validator, Validator2 extends Validator> = Validator1 extends Validator<infer V, infer E1, infer P, infer C> ? Validator2 extends Validator<V, infer E2, P, C> ? Validator<V, E1 | E2, P, C> : never : never;
|
|
414
419
|
declare function mergeValidators<Validators1 extends Partial<Readonly<Record<Keys, Validator>>>, Validators2 extends Partial<Readonly<Record<Keys, Validator>>>, Keys extends string = Extract<keyof Validators1 | keyof Validators2, string>>(validators1: Validators1, validators2: Validators2): MergedOfValidators<Validators1, Validators2, Keys>;
|
|
415
420
|
|
|
416
|
-
export { AbstractSelectValueTypeConverter, type AnnotatedFieldConversion, type AnnotatedFieldConverter, type Annotation, DefaultErrorRenderer, type ErrorOfField, type ErrorOfFieldAdapter, type ErrorRenderer, type ErrorRendererProps, type Field, type FieldAdapter, type FieldAdaptersOfValues, type FieldValueFactory, type Fields, type FieldsViewProps, type FlattenedAdaptersOfFields, type FlattenedConvertedFieldsOf, type FlattenedTypePathsToAdaptersOf, type FormFieldsOfFieldAdapters, type FormFieldsOfPresenter, FormModel, FormPresenter, type FormProps, type FromOfFieldAdapter, IntegerToStringConverter, type MergedOfFieldAdaptersWithTwoWayConverter, type MergedOfFieldAdaptersWithValidators, type MergedOfValidator, type MergedOfValidators, NullableToBooleanConverter, type PartialComponent, SelectDiscriminatedUnionConverter, SelectLiteralConverter, SelectStringConverter, type ToOfFieldAdapter, type ToValueOfPresenterValuePath, TrimmingStringConverter, type TwoWayFieldConverter, type TwoWayFieldConverterWithValueFactory, type UnreliableFieldConversion, UnreliableFieldConversionType, type UnreliableFieldConverter, type UnsafePartialComponent, type ValuePathOfFieldAdapter, type ValuePathsOfPresenter, type ValuePathsToAdaptersOf, adapter, adapterFromPrototype, adapterFromTwoWayConverter, createPartialComponent, createPartialObserverComponent, createSimplePartialComponent, createUnsafePartialObserverComponent, identityAdapter, listAdapter, mergeAdaptersWithValidators, mergeFieldAdaptersWithTwoWayConverter, mergeValidators, prototypingFieldValueFactory, subFormFieldAdapters, useDefaultMobxFormHooks, useMantineFormFields, usePartialComponent, usePartialObserverComponent, validatingConverter };
|
|
421
|
+
export { AbstractSelectValueTypeConverter, type AnnotatedFieldConversion, type AnnotatedFieldConverter, type Annotation, DefaultErrorRenderer, type ErrorOfField, type ErrorOfFieldAdapter, type ErrorRenderer, type ErrorRendererProps, type Field, type FieldAdapter, type FieldAdaptersOfValues, type FieldValueFactory, type Fields, type FieldsViewProps, type FlattenedAdaptersOfFields, type FlattenedConvertedFieldsOf, type FlattenedTypePathsToAdaptersOf, type FormFieldsOfFieldAdapters, type FormFieldsOfPresenter, FormModel, FormPresenter, type FormProps, type FromOfFieldAdapter, IntegerToStringConverter, type MergedOfFieldAdaptersWithTwoWayConverter, type MergedOfFieldAdaptersWithValidators, type MergedOfValidator, type MergedOfValidators, NullableToBooleanConverter, type PartialComponent, SelectDiscriminatedUnionConverter, SelectLiteralConverter, SelectStringConverter, type ToOfFieldAdapter, type ToValueOfPresenterValuePath, TrimmingStringConverter, type TwoWayFieldConverter, type TwoWayFieldConverterWithValueFactory, type UnreliableFieldConversion, UnreliableFieldConversionType, type UnreliableFieldConverter, type UnsafePartialComponent, type ValuePathOfFieldAdapter, type ValuePathsOfPresenter, type ValuePathsToAdaptersOf, adapter, adapterFromPrototype, adapterFromTwoWayConverter, createPartialComponent, createPartialObserverComponent, createSimplePartialComponent, createUnsafePartialObserverComponent, identityAdapter, listAdapter, mergeAdaptersWithValidators, mergeFieldAdaptersWithTwoWayConverter, mergeValidators, prototypingFieldValueFactory, subFormFieldAdapters, trimmingStringAdapter, useDefaultMobxFormHooks, useMantineFormFields, usePartialComponent, usePartialObserverComponent, validatingConverter };
|
package/dist/index.js
CHANGED
|
@@ -52,18 +52,18 @@ function chainAnnotatedFieldConverter(from, to) {
|
|
|
52
52
|
return function(value, valuePath, context) {
|
|
53
53
|
const {
|
|
54
54
|
required: intermediateRequired,
|
|
55
|
-
readonly:
|
|
55
|
+
readonly: intermediateReadonly,
|
|
56
56
|
value: intermediateValue
|
|
57
57
|
} = from(value, valuePath, context);
|
|
58
58
|
const {
|
|
59
59
|
required: finalRequired,
|
|
60
|
-
readonly:
|
|
60
|
+
readonly: finalReadonly,
|
|
61
61
|
value: finalValue
|
|
62
62
|
} = to(intermediateValue, valuePath, context);
|
|
63
63
|
return {
|
|
64
64
|
value: finalValue,
|
|
65
65
|
required: intermediateRequired || finalRequired,
|
|
66
|
-
readonly:
|
|
66
|
+
readonly: intermediateReadonly || finalReadonly
|
|
67
67
|
};
|
|
68
68
|
};
|
|
69
69
|
}
|
|
@@ -102,6 +102,25 @@ var MaybeIdentityConverter = class {
|
|
|
102
102
|
}
|
|
103
103
|
};
|
|
104
104
|
|
|
105
|
+
// field_converters/trimming_string_converter.ts
|
|
106
|
+
var TrimmingStringConverter = class {
|
|
107
|
+
constructor() {
|
|
108
|
+
}
|
|
109
|
+
convert(to) {
|
|
110
|
+
return {
|
|
111
|
+
value: to.trim(),
|
|
112
|
+
required: false,
|
|
113
|
+
readonly: false
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
revert(from) {
|
|
117
|
+
return {
|
|
118
|
+
type: 0 /* Success */,
|
|
119
|
+
value: from.trim()
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
105
124
|
// field_value_factories/prototyping_field_value_factory.ts
|
|
106
125
|
function prototypingFieldValueFactory(prototype) {
|
|
107
126
|
return function() {
|
|
@@ -136,6 +155,32 @@ var FieldAdapterBuilder = class _FieldAdapterBuilder {
|
|
|
136
155
|
reverter
|
|
137
156
|
);
|
|
138
157
|
}
|
|
158
|
+
nullable() {
|
|
159
|
+
return this.or(null);
|
|
160
|
+
}
|
|
161
|
+
optional() {
|
|
162
|
+
return this.or(void 0);
|
|
163
|
+
}
|
|
164
|
+
or(proto) {
|
|
165
|
+
function isFrom(v) {
|
|
166
|
+
return v !== proto;
|
|
167
|
+
}
|
|
168
|
+
function isTo(v) {
|
|
169
|
+
return v !== proto;
|
|
170
|
+
}
|
|
171
|
+
return new _FieldAdapterBuilder(
|
|
172
|
+
(v, valuePath, context) => isFrom(v) ? this.convert(v, valuePath, context) : {
|
|
173
|
+
value: v,
|
|
174
|
+
readonly: false,
|
|
175
|
+
required: false
|
|
176
|
+
},
|
|
177
|
+
this.create,
|
|
178
|
+
(v, valuePath, context) => isTo(v) && this.revert ? this.revert(v, valuePath, context) : {
|
|
179
|
+
type: 0 /* Success */,
|
|
180
|
+
value: proto
|
|
181
|
+
}
|
|
182
|
+
);
|
|
183
|
+
}
|
|
139
184
|
withIdentity(isFrom) {
|
|
140
185
|
const identityConverter = new MaybeIdentityConverter({
|
|
141
186
|
convert: this.convert,
|
|
@@ -173,6 +218,12 @@ function identityAdapter(prototype, required) {
|
|
|
173
218
|
unreliableIdentityConverter()
|
|
174
219
|
);
|
|
175
220
|
}
|
|
221
|
+
function trimmingStringAdapter() {
|
|
222
|
+
return adapterFromTwoWayConverter(
|
|
223
|
+
new TrimmingStringConverter(),
|
|
224
|
+
prototypingFieldValueFactory("")
|
|
225
|
+
);
|
|
226
|
+
}
|
|
176
227
|
function listAdapter() {
|
|
177
228
|
return new FieldAdapterBuilder(
|
|
178
229
|
annotatedIdentityConverter(false),
|
|
@@ -663,7 +714,7 @@ import {
|
|
|
663
714
|
function useDefaultMobxFormHooks(presenter, value, {
|
|
664
715
|
onValidFieldSubmit,
|
|
665
716
|
onValidFormSubmit
|
|
666
|
-
}) {
|
|
717
|
+
} = {}) {
|
|
667
718
|
const model = useMemo(function() {
|
|
668
719
|
return presenter.createModel(value);
|
|
669
720
|
}, [
|
|
@@ -1006,25 +1057,6 @@ var SelectStringConverter = class extends AbstractSelectValueTypeConverter {
|
|
|
1006
1057
|
}
|
|
1007
1058
|
};
|
|
1008
1059
|
|
|
1009
|
-
// field_converters/trimming_string_converter.ts
|
|
1010
|
-
var TrimmingStringConverter = class {
|
|
1011
|
-
constructor() {
|
|
1012
|
-
}
|
|
1013
|
-
convert(to) {
|
|
1014
|
-
return {
|
|
1015
|
-
value: to.trim(),
|
|
1016
|
-
required: false,
|
|
1017
|
-
readonly: false
|
|
1018
|
-
};
|
|
1019
|
-
}
|
|
1020
|
-
revert(from) {
|
|
1021
|
-
return {
|
|
1022
|
-
type: 0 /* Success */,
|
|
1023
|
-
value: from.trim()
|
|
1024
|
-
};
|
|
1025
|
-
}
|
|
1026
|
-
};
|
|
1027
|
-
|
|
1028
1060
|
// field_converters/validating_converter.ts
|
|
1029
1061
|
import {
|
|
1030
1062
|
validate as validate2
|
|
@@ -1787,6 +1819,7 @@ export {
|
|
|
1787
1819
|
mergeValidators,
|
|
1788
1820
|
prototypingFieldValueFactory,
|
|
1789
1821
|
subFormFieldAdapters,
|
|
1822
|
+
trimmingStringAdapter,
|
|
1790
1823
|
useDefaultMobxFormHooks,
|
|
1791
1824
|
useMantineFormFields,
|
|
1792
1825
|
usePartialComponent,
|
|
@@ -71,18 +71,18 @@ export function chainAnnotatedFieldConverter<
|
|
|
71
71
|
return function (value: From, valuePath: ValuePath, context: Context): AnnotatedFieldConversion {
|
|
72
72
|
const {
|
|
73
73
|
required: intermediateRequired,
|
|
74
|
-
readonly:
|
|
74
|
+
readonly: intermediateReadonly,
|
|
75
75
|
value: intermediateValue,
|
|
76
76
|
} = from(value, valuePath, context)
|
|
77
77
|
const {
|
|
78
78
|
required: finalRequired,
|
|
79
|
-
readonly:
|
|
79
|
+
readonly: finalReadonly,
|
|
80
80
|
value: finalValue,
|
|
81
81
|
} = to(intermediateValue, valuePath, context)
|
|
82
82
|
return {
|
|
83
83
|
value: finalValue,
|
|
84
84
|
required: intermediateRequired || finalRequired,
|
|
85
|
-
readonly:
|
|
85
|
+
readonly: intermediateReadonly || finalReadonly,
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
}
|
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
import { type ComponentType } from 'react'
|
|
2
|
+
import { type ErrorOfField } from 'types/error_of_field'
|
|
3
|
+
import { type Fields } from 'types/field'
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
type InternalErrorRendererProps<E> = {
|
|
4
6
|
error: E,
|
|
5
7
|
}
|
|
6
8
|
|
|
9
|
+
export type ErrorRendererProps<
|
|
10
|
+
F extends Fields,
|
|
11
|
+
K extends keyof Fields,
|
|
12
|
+
> = InternalErrorRendererProps<
|
|
13
|
+
ErrorOfField<F[K]>
|
|
14
|
+
>
|
|
15
|
+
|
|
7
16
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
-
export type ErrorRenderer<E = any> = ComponentType<
|
|
17
|
+
export type ErrorRenderer<E = any> = ComponentType<InternalErrorRendererProps<E>>
|
|
9
18
|
|
|
10
19
|
export function DefaultErrorRenderer({
|
|
11
20
|
error,
|
|
12
21
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
-
}:
|
|
22
|
+
}: InternalErrorRendererProps<any>) {
|
|
14
23
|
return JSON.stringify(error)
|
|
15
24
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type ErrorOfField } from 'types/error_of_field'
|
|
2
2
|
import { type Field } from 'types/field'
|
|
3
3
|
|
|
4
|
-
describe('
|
|
4
|
+
describe('ErrorOfField', function () {
|
|
5
5
|
it('equals expected type', function () {
|
|
6
6
|
const e = Symbol()
|
|
7
7
|
type E = typeof e
|
|
File without changes
|