@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.
@@ -1,4 +1,4 @@
1
- describe('ErrorTypeOfField', function () {
1
+ describe('ErrorOfField', function () {
2
2
  it('equals expected type', function () {
3
3
  const e = Symbol();
4
4
  expectTypeOf().toEqualTypeOf();
@@ -7,12 +7,12 @@ $ tsup
7
7
  CLI Target: esnext
8
8
  CJS Build start
9
9
  ESM Build start
10
- CJS dist/index.cjs 50.73 KB
11
- CJS ⚡️ Build success in 112ms
12
- ESM dist/index.js 46.84 KB
13
- ESM ⚡️ Build success in 113ms
10
+ CJS dist/index.cjs 51.55 KB
11
+ CJS ⚡️ Build success in 120ms
12
+ ESM dist/index.js 47.61 KB
13
+ ESM ⚡️ Build success in 121ms
14
14
  DTS Build start
15
- DTS ⚡️ Build success in 9662ms
16
- DTS dist/index.d.cts 36.94 KB
17
- DTS dist/index.d.ts 36.94 KB
18
- Done in 10.73s.
15
+ DTS ⚡️ Build success in 10031ms
16
+ DTS dist/index.d.cts 37.40 KB
17
+ DTS dist/index.d.ts 37.40 KB
18
+ Done in 11.07s.
@@ -1,3 +1,3 @@
1
1
  yarn run v1.22.22
2
2
  $ tsc
3
- Done in 7.38s.
3
+ Done in 7.61s.
@@ -1,3 +1,3 @@
1
1
  yarn run v1.22.22
2
2
  $ json -f package.json -f package.exports.json --merge > package.release.json
3
- Done in 0.13s.
3
+ Done in 0.12s.
@@ -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,
@@ -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?: (value: ValueOfPresenter<P>) => void,
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: intermediateDisabled,
109
+ readonly: intermediateReadonly,
109
110
  value: intermediateValue
110
111
  } = from(value, valuePath, context);
111
112
  const {
112
113
  required: finalRequired,
113
- readonly: finalDisabled,
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: intermediateDisabled || finalDisabled
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?: (value: ValueOfPresenter<P>) => void;
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 ErrorRendererProps<E> = {
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 ErrorRenderer<E = any> = ComponentType<ErrorRendererProps<E>>;
276
- declare function DefaultErrorRenderer({ error, }: ErrorRendererProps<any>): string;
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?: (value: ValueOfPresenter<P>) => void;
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 ErrorRendererProps<E> = {
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 ErrorRenderer<E = any> = ComponentType<ErrorRendererProps<E>>;
276
- declare function DefaultErrorRenderer({ error, }: ErrorRendererProps<any>): string;
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: intermediateDisabled,
55
+ readonly: intermediateReadonly,
56
56
  value: intermediateValue
57
57
  } = from(value, valuePath, context);
58
58
  const {
59
59
  required: finalRequired,
60
- readonly: finalDisabled,
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: intermediateDisabled || finalDisabled
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: intermediateDisabled,
74
+ readonly: intermediateReadonly,
75
75
  value: intermediateValue,
76
76
  } = from(value, valuePath, context)
77
77
  const {
78
78
  required: finalRequired,
79
- readonly: finalDisabled,
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: intermediateDisabled || finalDisabled,
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
- export type ErrorRendererProps<E> = {
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<ErrorRendererProps<E>>
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
- }: ErrorRendererProps<any>) {
22
+ }: InternalErrorRendererProps<any>) {
14
23
  return JSON.stringify(error)
15
24
  }
package/package.json CHANGED
@@ -70,7 +70,7 @@
70
70
  "test:watch": "vitest"
71
71
  },
72
72
  "type": "module",
73
- "version": "0.0.8",
73
+ "version": "0.0.9",
74
74
  "exports": {
75
75
  ".": {
76
76
  "import": {
@@ -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('ErrorTypeOfField', function () {
4
+ describe('ErrorOfField', function () {
5
5
  it('equals expected type', function () {
6
6
  const e = Symbol()
7
7
  type E = typeof e