@strictly/react-form 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/.eslintrc.cjs +26 -0
  2. package/.out/.storybook/main.d.ts +3 -0
  3. package/.out/.storybook/main.js +32 -0
  4. package/.out/.storybook/preview.d.ts +4 -0
  5. package/.out/.storybook/preview.js +20 -0
  6. package/.out/.vitest/install_deterministic_random.d.ts +2 -0
  7. package/.out/.vitest/install_deterministic_random.js +15 -0
  8. package/.out/.vitest/install_storybook_preview.d.ts +1 -0
  9. package/.out/.vitest/install_storybook_preview.js +7 -0
  10. package/.out/.vitest/match_media.d.ts +1 -0
  11. package/.out/.vitest/match_media.js +5 -0
  12. package/.out/.vitest/resize_observer.d.ts +1 -0
  13. package/.out/.vitest/resize_observer.js +4 -0
  14. package/.out/core/mobx/field_adapter.d.ts +9 -0
  15. package/.out/core/mobx/field_adapter.js +1 -0
  16. package/.out/core/mobx/field_adapter_builder.d.ts +22 -0
  17. package/.out/core/mobx/field_adapter_builder.js +56 -0
  18. package/.out/core/mobx/flattened_adapters_of_fields.d.ts +9 -0
  19. package/.out/core/mobx/flattened_adapters_of_fields.js +1 -0
  20. package/.out/core/mobx/flattened_list_type_defs_of.d.ts +8 -0
  21. package/.out/core/mobx/flattened_list_type_defs_of.js +1 -0
  22. package/.out/core/mobx/form_presenter.d.ts +61 -0
  23. package/.out/core/mobx/form_presenter.js +425 -0
  24. package/.out/core/mobx/specs/flattened_adapters_of_fields.tests.d.ts +1 -0
  25. package/.out/core/mobx/specs/flattened_adapters_of_fields.tests.js +13 -0
  26. package/.out/core/mobx/specs/flattened_list_type_defs_of.tests.d.ts +1 -0
  27. package/.out/core/mobx/specs/flattened_list_type_defs_of.tests.js +16 -0
  28. package/.out/core/mobx/specs/form_presenter.tests.d.ts +1 -0
  29. package/.out/core/mobx/specs/form_presenter.tests.js +697 -0
  30. package/.out/core/mobx/types.d.ts +19 -0
  31. package/.out/core/mobx/types.js +1 -0
  32. package/.out/core/props.d.ts +12 -0
  33. package/.out/core/props.js +1 -0
  34. package/.out/field_converters/chain_field_converter.d.ts +3 -0
  35. package/.out/field_converters/chain_field_converter.js +46 -0
  36. package/.out/field_converters/identity_converter.d.ts +3 -0
  37. package/.out/field_converters/identity_converter.js +14 -0
  38. package/.out/field_converters/integer_to_string_converter.d.ts +7 -0
  39. package/.out/field_converters/integer_to_string_converter.js +26 -0
  40. package/.out/field_converters/list_converter.d.ts +2 -0
  41. package/.out/field_converters/list_converter.js +8 -0
  42. package/.out/field_converters/maybe_identity_converter.d.ts +8 -0
  43. package/.out/field_converters/maybe_identity_converter.js +15 -0
  44. package/.out/field_converters/nullable_to_boolean_converter.d.ts +11 -0
  45. package/.out/field_converters/nullable_to_boolean_converter.js +31 -0
  46. package/.out/field_converters/select_value_type_converter.d.ts +23 -0
  47. package/.out/field_converters/select_value_type_converter.js +60 -0
  48. package/.out/field_converters/trimming_string_converter.d.ts +6 -0
  49. package/.out/field_converters/trimming_string_converter.js +14 -0
  50. package/.out/field_converters/validating_converter.d.ts +3 -0
  51. package/.out/field_converters/validating_converter.js +21 -0
  52. package/.out/field_validators/minimum_string_length_field_validator.d.ts +2 -0
  53. package/.out/field_validators/minimum_string_length_field_validator.js +8 -0
  54. package/.out/field_value_factories/prototyping_field_value_factory.d.ts +2 -0
  55. package/.out/field_value_factories/prototyping_field_value_factory.js +5 -0
  56. package/.out/index.d.ts +16 -0
  57. package/.out/index.js +16 -0
  58. package/.out/mantine/create_checkbox.d.ts +9 -0
  59. package/.out/mantine/create_checkbox.js +37 -0
  60. package/.out/mantine/create_list.d.ts +15 -0
  61. package/.out/mantine/create_list.js +16 -0
  62. package/.out/mantine/create_pill.d.ts +7 -0
  63. package/.out/mantine/create_pill.js +15 -0
  64. package/.out/mantine/create_radio.d.ts +8 -0
  65. package/.out/mantine/create_radio.js +10 -0
  66. package/.out/mantine/create_radio_group.d.ts +9 -0
  67. package/.out/mantine/create_radio_group.js +34 -0
  68. package/.out/mantine/create_text_input.d.ts +19 -0
  69. package/.out/mantine/create_text_input.js +38 -0
  70. package/.out/mantine/create_value_input.d.ts +17 -0
  71. package/.out/mantine/create_value_input.js +38 -0
  72. package/.out/mantine/hooks.d.ts +56 -0
  73. package/.out/mantine/hooks.js +135 -0
  74. package/.out/mantine/specs/checkbox_constants.d.ts +1 -0
  75. package/.out/mantine/specs/checkbox_constants.js +1 -0
  76. package/.out/mantine/specs/checkbox_hooks.stories.d.ts +13 -0
  77. package/.out/mantine/specs/checkbox_hooks.stories.js +63 -0
  78. package/.out/mantine/specs/checkbox_hooks.tests.d.ts +1 -0
  79. package/.out/mantine/specs/checkbox_hooks.tests.js +74 -0
  80. package/.out/mantine/specs/list_hooks.stories.d.ts +11 -0
  81. package/.out/mantine/specs/list_hooks.stories.js +48 -0
  82. package/.out/mantine/specs/list_hooks.tests.d.ts +1 -0
  83. package/.out/mantine/specs/list_hooks.tests.js +12 -0
  84. package/.out/mantine/specs/radio_group_constants.d.ts +4 -0
  85. package/.out/mantine/specs/radio_group_constants.js +11 -0
  86. package/.out/mantine/specs/radio_group_hooks.stories.d.ts +14 -0
  87. package/.out/mantine/specs/radio_group_hooks.stories.js +68 -0
  88. package/.out/mantine/specs/radio_group_hooks.tests.d.ts +1 -0
  89. package/.out/mantine/specs/radio_group_hooks.tests.js +62 -0
  90. package/.out/mantine/specs/select_hooks.stories.d.ts +12 -0
  91. package/.out/mantine/specs/select_hooks.stories.js +57 -0
  92. package/.out/mantine/specs/select_hooks.tests.d.ts +1 -0
  93. package/.out/mantine/specs/select_hooks.tests.js +12 -0
  94. package/.out/mantine/specs/select_hooks_constant.d.ts +1 -0
  95. package/.out/mantine/specs/select_hooks_constant.js +1 -0
  96. package/.out/mantine/specs/text_input_constants.d.ts +1 -0
  97. package/.out/mantine/specs/text_input_constants.js +1 -0
  98. package/.out/mantine/specs/text_input_hooks.stories.d.ts +21 -0
  99. package/.out/mantine/specs/text_input_hooks.stories.js +88 -0
  100. package/.out/mantine/specs/text_input_hooks.tests.d.ts +1 -0
  101. package/.out/mantine/specs/text_input_hooks.tests.js +79 -0
  102. package/.out/mantine/specs/value_input_constants.d.ts +2 -0
  103. package/.out/mantine/specs/value_input_constants.js +2 -0
  104. package/.out/mantine/specs/value_input_hooks.stories.d.ts +23 -0
  105. package/.out/mantine/specs/value_input_hooks.stories.js +124 -0
  106. package/.out/mantine/specs/value_input_hooks.tests.d.ts +1 -0
  107. package/.out/mantine/specs/value_input_hooks.tests.js +12 -0
  108. package/.out/mantine/types.d.ts +11 -0
  109. package/.out/mantine/types.js +1 -0
  110. package/.out/tsconfig.json +27 -0
  111. package/.out/tsconfig.tsbuildinfo +1 -0
  112. package/.out/tsup.config.d.ts +3 -0
  113. package/.out/tsup.config.js +12 -0
  114. package/.out/types/all_fields_of_fields.d.ts +5 -0
  115. package/.out/types/all_fields_of_fields.js +1 -0
  116. package/.out/types/boolean_fields_of_fields.d.ts +5 -0
  117. package/.out/types/boolean_fields_of_fields.js +1 -0
  118. package/.out/types/error_type_of_field.d.ts +2 -0
  119. package/.out/types/error_type_of_field.js +1 -0
  120. package/.out/types/field.d.ts +7 -0
  121. package/.out/types/field.js +1 -0
  122. package/.out/types/field_converters.d.ts +29 -0
  123. package/.out/types/field_converters.js +5 -0
  124. package/.out/types/field_validator.d.ts +3 -0
  125. package/.out/types/field_validator.js +1 -0
  126. package/.out/types/flattened_form_fields_of.d.ts +9 -0
  127. package/.out/types/flattened_form_fields_of.js +1 -0
  128. package/.out/types/list_fields_of_fields.d.ts +5 -0
  129. package/.out/types/list_fields_of_fields.js +1 -0
  130. package/.out/types/specs/boolean_fields_of_fields.tests.d.ts +1 -0
  131. package/.out/types/specs/boolean_fields_of_fields.tests.js +11 -0
  132. package/.out/types/specs/error_type_of_field.tests.d.ts +1 -0
  133. package/.out/types/specs/error_type_of_field.tests.js +7 -0
  134. package/.out/types/specs/flattened_form_fields_of.tests.d.ts +1 -0
  135. package/.out/types/specs/flattened_form_fields_of.tests.js +13 -0
  136. package/.out/types/specs/string_fields_of_fields.tests.d.ts +1 -0
  137. package/.out/types/specs/string_fields_of_fields.tests.js +19 -0
  138. package/.out/types/specs/value_type_of_field.tests.d.ts +1 -0
  139. package/.out/types/specs/value_type_of_field.tests.js +7 -0
  140. package/.out/types/string_fields_of_fields.d.ts +5 -0
  141. package/.out/types/string_fields_of_fields.js +1 -0
  142. package/.out/types/value_type_of_field.d.ts +2 -0
  143. package/.out/types/value_type_of_field.js +1 -0
  144. package/.out/util/partial.d.ts +11 -0
  145. package/.out/util/partial.js +74 -0
  146. package/.out/vitest.workspace.d.ts +2 -0
  147. package/.out/vitest.workspace.js +22 -0
  148. package/.storybook/main.ts +40 -0
  149. package/.storybook/preview.tsx +28 -0
  150. package/.storybook/vite.config.mts +38 -0
  151. package/.turbo/turbo-build.log +18 -0
  152. package/.turbo/turbo-check-types.log +3 -0
  153. package/.turbo/turbo-release$colon$exports.log +3 -0
  154. package/.vitest/install_deterministic_random.ts +17 -0
  155. package/.vitest/install_storybook_preview.ts +9 -0
  156. package/.vitest/match_media.ts +7 -0
  157. package/.vitest/resize_observer.ts +5 -0
  158. package/README.md +2 -0
  159. package/core/mobx/field_adapter.ts +32 -0
  160. package/core/mobx/field_adapter_builder.ts +313 -0
  161. package/core/mobx/flattened_adapters_of_fields.ts +35 -0
  162. package/core/mobx/flattened_list_type_defs_of.ts +17 -0
  163. package/core/mobx/form_presenter.ts +705 -0
  164. package/core/mobx/specs/flattened_adapters_of_fields.tests.ts +72 -0
  165. package/core/mobx/specs/flattened_list_type_defs_of.tests.ts +35 -0
  166. package/core/mobx/specs/form_presenter.tests.ts +989 -0
  167. package/core/mobx/types.ts +54 -0
  168. package/core/props.ts +21 -0
  169. package/dist/index.cjs +11479 -0
  170. package/dist/index.d.cts +345 -0
  171. package/dist/index.d.ts +345 -0
  172. package/dist/index.js +11486 -0
  173. package/field_converters/chain_field_converter.ts +74 -0
  174. package/field_converters/identity_converter.ts +39 -0
  175. package/field_converters/integer_to_string_converter.ts +32 -0
  176. package/field_converters/list_converter.ts +15 -0
  177. package/field_converters/maybe_identity_converter.ts +23 -0
  178. package/field_converters/nullable_to_boolean_converter.ts +56 -0
  179. package/field_converters/select_value_type_converter.ts +141 -0
  180. package/field_converters/trimming_string_converter.ts +23 -0
  181. package/field_converters/validating_converter.ts +35 -0
  182. package/field_validators/minimum_string_length_field_validator.ts +13 -0
  183. package/field_value_factories/prototyping_field_value_factory.ts +11 -0
  184. package/index.ts +16 -0
  185. package/mantine/create_checkbox.tsx +79 -0
  186. package/mantine/create_list.tsx +58 -0
  187. package/mantine/create_pill.tsx +43 -0
  188. package/mantine/create_radio.tsx +36 -0
  189. package/mantine/create_radio_group.tsx +71 -0
  190. package/mantine/create_text_input.tsx +80 -0
  191. package/mantine/create_value_input.tsx +81 -0
  192. package/mantine/hooks.tsx +394 -0
  193. package/mantine/specs/__snapshots__/check_box_hooks.tests.tsx.snap +227 -0
  194. package/mantine/specs/__snapshots__/checkbox_hooks.tests.tsx.snap +227 -0
  195. package/mantine/specs/__snapshots__/list_hooks.tests.tsx.snap +68 -0
  196. package/mantine/specs/__snapshots__/radio_group_hooks.tests.tsx.snap +695 -0
  197. package/mantine/specs/__snapshots__/select_hooks.tests.tsx.snap +225 -0
  198. package/mantine/specs/__snapshots__/text_input_hooks.tests.tsx.snap +202 -0
  199. package/mantine/specs/__snapshots__/value_input_hooks.tests.tsx.snap +613 -0
  200. package/mantine/specs/checkbox_constants.ts +1 -0
  201. package/mantine/specs/checkbox_hooks.stories.tsx +79 -0
  202. package/mantine/specs/checkbox_hooks.tests.tsx +100 -0
  203. package/mantine/specs/list_hooks.stories.tsx +83 -0
  204. package/mantine/specs/list_hooks.tests.tsx +15 -0
  205. package/mantine/specs/radio_group_constants.ts +12 -0
  206. package/mantine/specs/radio_group_hooks.stories.tsx +103 -0
  207. package/mantine/specs/radio_group_hooks.tests.tsx +92 -0
  208. package/mantine/specs/select_hooks.stories.tsx +77 -0
  209. package/mantine/specs/select_hooks.tests.tsx +14 -0
  210. package/mantine/specs/select_hooks_constant.ts +1 -0
  211. package/mantine/specs/text_input_constants.ts +1 -0
  212. package/mantine/specs/text_input_hooks.stories.tsx +124 -0
  213. package/mantine/specs/text_input_hooks.tests.tsx +106 -0
  214. package/mantine/specs/value_input_constants.ts +2 -0
  215. package/mantine/specs/value_input_hooks.stories.tsx +182 -0
  216. package/mantine/specs/value_input_hooks.tests.tsx +14 -0
  217. package/mantine/types.ts +13 -0
  218. package/package.exports.json +18 -0
  219. package/package.json +74 -0
  220. package/tsconfig.build.json +13 -0
  221. package/tsconfig.json +27 -0
  222. package/tsup.config.ts +16 -0
  223. package/types/all_fields_of_fields.ts +9 -0
  224. package/types/boolean_fields_of_fields.ts +8 -0
  225. package/types/error_type_of_field.ts +3 -0
  226. package/types/field.ts +9 -0
  227. package/types/field_converters.ts +64 -0
  228. package/types/field_validator.ts +7 -0
  229. package/types/flattened_form_fields_of.ts +16 -0
  230. package/types/list_fields_of_fields.ts +7 -0
  231. package/types/specs/boolean_fields_of_fields.tests.ts +23 -0
  232. package/types/specs/error_type_of_field.tests.ts +10 -0
  233. package/types/specs/flattened_form_fields_of.tests.ts +43 -0
  234. package/types/specs/string_fields_of_fields.tests.ts +40 -0
  235. package/types/specs/value_type_of_field.tests.ts +10 -0
  236. package/types/string_fields_of_fields.ts +6 -0
  237. package/types/value_type_of_field.ts +3 -0
  238. package/util/partial.tsx +200 -0
  239. package/vitest.workspace.ts +26 -0
@@ -0,0 +1,313 @@
1
+ import {
2
+ chainFieldConverter,
3
+ chainSafeFieldConverter,
4
+ } from 'field_converters/chain_field_converter'
5
+ import {
6
+ identityConverter,
7
+ safeIdentityConverter,
8
+ } from 'field_converters/identity_converter'
9
+ import { listConverter } from 'field_converters/list_converter'
10
+ import { MaybeIdentityConverter } from 'field_converters/maybe_identity_converter'
11
+ import {
12
+ validatingConverter,
13
+ } from 'field_converters/validating_converter'
14
+ import { prototypingFieldValueFactory } from 'field_value_factories/prototyping_field_value_factory'
15
+ import {
16
+ type FieldConverter,
17
+ type FieldValueFactory,
18
+ type SafeFieldConverter,
19
+ type TwoWayFieldConverter,
20
+ type TwoWayFieldConverterWithValueFactory,
21
+ } from 'types/field_converters'
22
+ import { type FieldValidator } from 'types/field_validator'
23
+
24
+ class FieldAdapterBuilder<
25
+ From,
26
+ To,
27
+ E,
28
+ ValuePath extends string,
29
+ Context,
30
+ > {
31
+ constructor(
32
+ readonly convert: SafeFieldConverter<From, To, ValuePath, Context>,
33
+ readonly create: FieldValueFactory<From, ValuePath, Context>,
34
+ readonly revert?: FieldConverter<To, From, E, ValuePath, Context>,
35
+ ) {
36
+ }
37
+
38
+ validateFrom<
39
+ E2,
40
+ >(...validators: readonly FieldValidator<
41
+ From,
42
+ E2,
43
+ ValuePath,
44
+ Context
45
+ >[]): FieldAdapterBuilder<
46
+ From,
47
+ To,
48
+ E | E2,
49
+ ValuePath,
50
+ Context
51
+ > {
52
+ return new FieldAdapterBuilder(
53
+ this.convert,
54
+ this.create,
55
+ this.revert && chainFieldConverter(
56
+ this.revert,
57
+ validatingConverter(validators),
58
+ ),
59
+ )
60
+ }
61
+
62
+ validateTo<
63
+ E2,
64
+ >(...validators: readonly FieldValidator<
65
+ To,
66
+ E2,
67
+ ValuePath,
68
+ Context
69
+ >[]): FieldAdapterBuilder<
70
+ From,
71
+ To,
72
+ E | E2,
73
+ ValuePath,
74
+ Context
75
+ > {
76
+ return new FieldAdapterBuilder(
77
+ this.convert,
78
+ this.create,
79
+ this.revert && chainFieldConverter(
80
+ validatingConverter(validators),
81
+ this.revert,
82
+ ),
83
+ )
84
+ }
85
+
86
+ chain<To2, E2 = E>(
87
+ converter: SafeFieldConverter<To, To2, ValuePath, Context>,
88
+ reverter?: FieldConverter<To2, To, E2, ValuePath, Context>,
89
+ ): FieldAdapterBuilder<From, To2, E | E2, ValuePath, Context> {
90
+ return new FieldAdapterBuilder(
91
+ chainSafeFieldConverter<
92
+ From,
93
+ To,
94
+ To2,
95
+ ValuePath,
96
+ Context
97
+ >(
98
+ this.convert,
99
+ converter,
100
+ ),
101
+ this.create,
102
+ this.revert && reverter && chainFieldConverter<
103
+ To2,
104
+ To,
105
+ From,
106
+ E2,
107
+ E,
108
+ ValuePath,
109
+ Context
110
+ >(
111
+ reverter,
112
+ this.revert,
113
+ ),
114
+ )
115
+ }
116
+
117
+ withReverter(reverter: FieldConverter<
118
+ To,
119
+ From,
120
+ E,
121
+ ValuePath,
122
+ Context
123
+ >): FieldAdapterBuilder<
124
+ From,
125
+ To,
126
+ E,
127
+ ValuePath,
128
+ Context
129
+ > {
130
+ return new FieldAdapterBuilder(
131
+ this.convert,
132
+ this.create,
133
+ reverter,
134
+ )
135
+ }
136
+
137
+ withIdentity(isFrom: (from: To | From) => from is From): FieldAdapterBuilder<
138
+ From,
139
+ To | From,
140
+ E,
141
+ ValuePath,
142
+ Context
143
+ > {
144
+ const identityConverter = new MaybeIdentityConverter<From, To, E, ValuePath, Context>({
145
+ convert: this.convert,
146
+ // should never get called if null
147
+ revert: this.revert!,
148
+ }, isFrom)
149
+ return new FieldAdapterBuilder(
150
+ identityConverter.convert.bind(identityConverter),
151
+ this.create,
152
+ this.revert && identityConverter.revert.bind(identityConverter),
153
+ )
154
+ }
155
+ }
156
+
157
+ export function adapter<
158
+ From,
159
+ To,
160
+ ValuePath extends string,
161
+ Context,
162
+ >(
163
+ converter: SafeFieldConverter<From, To, ValuePath, Context>,
164
+ valueFactory: FieldValueFactory<From, ValuePath, Context>,
165
+ ): FieldAdapterBuilder<From, To, never, ValuePath, Context>
166
+ export function adapter<
167
+ From,
168
+ To,
169
+ E,
170
+ ValuePath extends string,
171
+ Context,
172
+ >(
173
+ converter: SafeFieldConverter<From, To, ValuePath, Context>,
174
+ valueFactory: FieldValueFactory<From, ValuePath, Context>,
175
+ reverter: FieldConverter<To, From, E, ValuePath, Context>,
176
+ ): FieldAdapterBuilder<From, To, E, ValuePath, Context>
177
+ export function adapter<
178
+ From,
179
+ To,
180
+ E,
181
+ ValuePath extends string,
182
+ Context,
183
+ >(
184
+ converter: SafeFieldConverter<From, To, ValuePath, Context>,
185
+ valueFactory: FieldValueFactory<From, ValuePath, Context>,
186
+ reverter?: FieldConverter<To, From, E, ValuePath, Context>,
187
+ ): FieldAdapterBuilder<From, To, E, ValuePath, Context> {
188
+ return new FieldAdapterBuilder(converter, valueFactory, reverter)
189
+ }
190
+
191
+ export function adapterFromTwoWayConverter<
192
+ From,
193
+ To,
194
+ E,
195
+ ValuePath extends string,
196
+ Context,
197
+ >(
198
+ converter: TwoWayFieldConverter<From, To, E, ValuePath, Context>,
199
+ valueFactory: FieldValueFactory<From, ValuePath, Context>,
200
+ ): FieldAdapterBuilder<From, To, E, ValuePath, Context>
201
+ export function adapterFromTwoWayConverter<
202
+ From,
203
+ To,
204
+ E,
205
+ ValuePath extends string,
206
+ Context,
207
+ >(converter: TwoWayFieldConverterWithValueFactory<
208
+ From,
209
+ To,
210
+ E,
211
+ ValuePath,
212
+ Context
213
+ >): FieldAdapterBuilder<
214
+ From,
215
+ To,
216
+ E,
217
+ ValuePath,
218
+ Context
219
+ >
220
+ export function adapterFromTwoWayConverter<
221
+ From,
222
+ To,
223
+ E,
224
+ ValuePath extends string,
225
+ Context,
226
+ >(
227
+ converter: TwoWayFieldConverter<
228
+ From,
229
+ To,
230
+ E,
231
+ ValuePath,
232
+ Context
233
+ > | TwoWayFieldConverterWithValueFactory<
234
+ From,
235
+ To,
236
+ E,
237
+ ValuePath,
238
+ Context
239
+ >,
240
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
241
+ valueFactory: FieldValueFactory<From, ValuePath, Context> = (converter as TwoWayFieldConverterWithValueFactory<
242
+ From,
243
+ To,
244
+ E,
245
+ ValuePath,
246
+ Context
247
+ >).create.bind(converter),
248
+ ): FieldAdapterBuilder<From, To, E, ValuePath, Context> {
249
+ return new FieldAdapterBuilder(
250
+ converter.convert.bind(converter),
251
+ valueFactory,
252
+ converter.revert.bind(converter),
253
+ )
254
+ }
255
+
256
+ export function adapterFromPrototype<
257
+ From,
258
+ To,
259
+ ValuePath extends string,
260
+ Context,
261
+ >(
262
+ converter: SafeFieldConverter<From, To, ValuePath, Context>,
263
+ prototype: From,
264
+ ): FieldAdapterBuilder<From, To, never, ValuePath, Context>
265
+ export function adapterFromPrototype<
266
+ From,
267
+ To,
268
+ E,
269
+ ValuePath extends string,
270
+ Context,
271
+ >(
272
+ converter: TwoWayFieldConverter<From, To, E, ValuePath, Context>,
273
+ prototype: From,
274
+ ): FieldAdapterBuilder<From, To, E, ValuePath, Context>
275
+ export function adapterFromPrototype<
276
+ From,
277
+ To,
278
+ E,
279
+ ValuePath extends string,
280
+ Context,
281
+ >(
282
+ converter: SafeFieldConverter<From, To, ValuePath, Context> | TwoWayFieldConverter<From, To, E, ValuePath, Context>,
283
+ prototype: From,
284
+ ): FieldAdapterBuilder<From, To, E, ValuePath, Context> {
285
+ const factory = prototypingFieldValueFactory<From, ValuePath, Context>(prototype)
286
+ return typeof converter === 'function'
287
+ ? new FieldAdapterBuilder(converter, factory)
288
+ : new FieldAdapterBuilder(converter.convert.bind(converter), factory, converter.revert.bind(converter))
289
+ }
290
+
291
+ export function identityAdapter<
292
+ V,
293
+ ValuePath extends string,
294
+ Context,
295
+ >(prototype: V) {
296
+ return new FieldAdapterBuilder(
297
+ safeIdentityConverter<V, ValuePath, Context>(),
298
+ prototypingFieldValueFactory(prototype),
299
+ identityConverter<V, ValuePath, Context>(),
300
+ )
301
+ }
302
+
303
+ export function listAdapter<
304
+ E,
305
+ K extends string,
306
+ ValuePath extends string,
307
+ Context,
308
+ >() {
309
+ return new FieldAdapterBuilder<readonly E[], readonly K[], never, ValuePath, Context>(
310
+ listConverter<E, K, ValuePath, Context>(),
311
+ prototypingFieldValueFactory<readonly E[], ValuePath, Context>([]),
312
+ )
313
+ }
@@ -0,0 +1,35 @@
1
+ import {
2
+ type ReadonlyTypeDefOf,
3
+ type Type,
4
+ type ValueTypeOf,
5
+ } from '@strictly/define'
6
+ import { type FieldAdapter } from 'core/mobx/field_adapter'
7
+ import {
8
+ type SimplifyDeep,
9
+ type ValueOf,
10
+ } from 'type-fest'
11
+ import { type Field } from 'types/field'
12
+
13
+ export type FlattenedAdaptersOfFields<
14
+ ValuePathsToTypePaths extends Readonly<Record<string, string>>,
15
+ FlattenedTypeDefs extends Partial<Readonly<Record<ValueOf<ValuePathsToTypePaths>, Type>>>,
16
+ FormFields extends Partial<Readonly<Record<keyof ValuePathsToTypePaths, Field>>>,
17
+ > = SimplifyDeep<{
18
+ readonly [
19
+ K in keyof ValuePathsToTypePaths as FormFields[K] extends Field ? ValuePathsToTypePaths[K] : never
20
+ ]: AdapterOfField<
21
+ NonNullable<FormFields[K]>,
22
+ FlattenedTypeDefs[ValuePathsToTypePaths[K]],
23
+ K
24
+ >
25
+ }>
26
+
27
+ type AdapterOfField<
28
+ F extends Field,
29
+ T extends Type | undefined,
30
+ ValuePath extends string | number | symbol,
31
+ > = ValuePath extends string
32
+ ? F extends Field<infer V, infer E> ? undefined extends T ? FieldAdapter<V, V, E, ValuePath>
33
+ : FieldAdapter<ValueTypeOf<ReadonlyTypeDefOf<NonNullable<T>>>, V, E, ValuePath>
34
+ : never
35
+ : never
@@ -0,0 +1,17 @@
1
+ import {
2
+ type FlattenedTypeDefsOf,
3
+ type ListTypeDef,
4
+ type Type,
5
+ } from '@strictly/define'
6
+ import { type SimplifyDeep } from 'type-fest'
7
+
8
+ export type ListJsonPathsOf<T extends Type> = keyof FlattenedListTypeDefsOf<T>
9
+
10
+ export type FlattenedListTypeDefsOf<T extends Type> = FlattenedListTypeDefsOfFlattened<
11
+ // SimplifyDeep is necessary here otherwise FlattenedListTypeDefsOfFlattened will complain about infinite depth
12
+ SimplifyDeep<FlattenedTypeDefsOf<T, null>>
13
+ >
14
+
15
+ type FlattenedListTypeDefsOfFlattened<T extends Readonly<Record<string, Type>>> = {
16
+ [K in keyof T as T[K]['definition'] extends ListTypeDef ? K : never]: T[K]
17
+ }