@strictly/define 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/.out/index.d.ts +17 -11
  2. package/.out/index.js +17 -11
  3. package/.out/transformers/copies/copy.d.ts +3 -3
  4. package/.out/transformers/copies/copy_to.d.ts +3 -3
  5. package/.out/transformers/copies/copy_to.js +4 -0
  6. package/.out/transformers/copies/mobx_copy.d.ts +4 -4
  7. package/.out/transformers/copies/mobx_copy.js +1 -1
  8. package/.out/transformers/copies/specs/copy_to.tests.js +8 -8
  9. package/.out/transformers/copies/specs/mobx_copy.tests.js +1 -1
  10. package/.out/transformers/flatteners/flatten_accessors_of_type.d.ts +5 -0
  11. package/.out/transformers/flatteners/flatten_accessors_of_type.js +11 -0
  12. package/.out/transformers/flatteners/flatten_json_value_to_type_paths_of.d.ts +2 -2
  13. package/.out/transformers/flatteners/flatten_json_value_to_type_paths_of.js +2 -2
  14. package/.out/transformers/flatteners/{flatten_type_def_to.d.ts → flatten_type_to.d.ts} +1 -1
  15. package/.out/transformers/flatteners/{flatten_type_def_to.js → flatten_type_to.js} +1 -1
  16. package/.out/transformers/flatteners/{flatten_type_defs_of.d.ts → flatten_types_of_type.d.ts} +1 -1
  17. package/.out/transformers/flatteners/flatten_types_of_type.js +7 -0
  18. package/.out/transformers/flatteners/flatten_validation_errors_of_type.d.ts +22 -0
  19. package/.out/transformers/flatteners/flatten_validation_errors_of_type.js +10 -0
  20. package/.out/transformers/flatteners/flatten_validators_of_validating_type.d.ts +4 -0
  21. package/.out/transformers/flatteners/flatten_validators_of_validating_type.js +17 -0
  22. package/.out/transformers/flatteners/{flatten_value_type_to.d.ts → flatten_value_to.d.ts} +4 -4
  23. package/.out/transformers/flatteners/{flatten_value_type_to.js → flatten_value_to.js} +7 -2
  24. package/.out/transformers/flatteners/flatten_values_of_type.d.ts +3 -0
  25. package/.out/transformers/flatteners/flatten_values_of_type.js +7 -0
  26. package/.out/transformers/flatteners/specs/{flatten_accessors_of.tests.js → flatten_accessors_of_type.tests.js} +5 -6
  27. package/.out/transformers/flatteners/specs/flatten_json_value_to_type_paths_of.tests.js +6 -6
  28. package/.out/transformers/flatteners/specs/{flatten_type_def_to.tests.js → flatten_type_to.tests.js} +15 -13
  29. package/.out/transformers/flatteners/specs/flatten_types_of_type.tests.js +18 -0
  30. package/.out/transformers/flatteners/specs/flatten_validation_errors_of_type.tests.js +25 -0
  31. package/.out/transformers/flatteners/specs/{flatten_value_type_to.tests.js → flatten_value_to.tests.js} +81 -58
  32. package/.out/transformers/flatteners/specs/{flatten_value_types_of.tests.js → flatten_values_of_type.tests.js} +4 -4
  33. package/.out/transformers/flatteners/specs/value_path_to_type_path.tests.js +5 -3
  34. package/.out/transformers/flatteners/value_path_to_type_path.d.ts +1 -1
  35. package/.out/tsconfig.tsbuildinfo +1 -1
  36. package/.out/types/builders.d.ts +55 -29
  37. package/.out/types/builders.js +116 -32
  38. package/.out/types/definitions.d.ts +1 -1
  39. package/.out/types/flattened_accessors_of_type.d.ts +9 -0
  40. package/.out/types/{flattened_type_defs_of.d.ts → flattened_types_of_type.d.ts} +9 -6
  41. package/.out/types/flattened_types_of_validating_type.d.ts +25 -0
  42. package/.out/types/flattened_validators_of_validating_type.d.ts +10 -0
  43. package/.out/types/flattened_values_of_type.d.ts +6 -0
  44. package/.out/types/{mobx_value_type_of.d.ts → mobx_value_of_type.d.ts} +2 -2
  45. package/.out/types/{partial_type_def_of.d.ts → partial_type_of_type.d.ts} +1 -1
  46. package/.out/types/path_of.d.ts +1 -0
  47. package/.out/types/{json_paths_of.d.ts → paths_of_type.d.ts} +5 -5
  48. package/.out/types/readonly_type_of_type.d.ts +29 -0
  49. package/.out/types/specs/builder.tests.js +73 -23
  50. package/.out/types/specs/{flattened_accessors_of.tests.js → flattened_accessors_of_type.tests.js} +1 -1
  51. package/.out/types/specs/{flattened_type_defs_of.tests.js → flattened_types_of_type.tests.js} +22 -15
  52. package/.out/types/specs/flattened_validators_of_validating_type.tests.js +24 -0
  53. package/.out/types/specs/flattened_values_of_type.tests.js +18 -0
  54. package/.out/types/specs/{partial_type_def_of.tests.js → partial_type_of_type.tests.js} +4 -4
  55. package/.out/types/specs/{json_paths_of.tests.js → paths_of_type.tests.js} +19 -19
  56. package/.out/types/specs/{readonly_type_def_of.tests.js → readonly_type_of_type.tests.js} +6 -6
  57. package/.out/types/specs/type_of_type.tests.d.ts +1 -0
  58. package/.out/types/specs/type_of_type.tests.js +27 -0
  59. package/.out/types/specs/value_of_type.tests.d.ts +1 -0
  60. package/.out/types/specs/{value_type_of.tests.js → value_of_type.tests.js} +1 -1
  61. package/.out/types/specs/value_to_type_paths_of_type.tests.d.ts +1 -0
  62. package/.out/types/specs/{value_to_type_paths_of.tests.js → value_to_type_paths_of_type.tests.js} +9 -9
  63. package/.out/types/specs/value_types_of_discriminated_union.tests.js +2 -2
  64. package/.out/types/strict_definitions.d.ts +2 -2
  65. package/.out/types/type_of_type.d.ts +49 -0
  66. package/.out/types/type_of_type.js +70 -0
  67. package/.out/types/validating_definitions.d.ts +49 -0
  68. package/.out/types/validating_definitions.js +1 -0
  69. package/.out/types/validating_type_def_with_error.d.ts +55 -0
  70. package/.out/types/validating_type_def_with_error.js +1 -0
  71. package/.out/types/value_of_type.d.ts +24 -0
  72. package/.out/types/value_of_type.js +1 -0
  73. package/.out/types/{value_to_type_paths_of.d.ts → value_to_type_paths_of_type.d.ts} +13 -13
  74. package/.out/types/value_to_type_paths_of_type.js +1 -0
  75. package/.out/types/value_types_of_discriminated_union.d.ts +5 -4
  76. package/.out/validation/errors_of_validators.d.ts +4 -0
  77. package/.out/validation/errors_of_validators.js +1 -0
  78. package/.out/validation/specs/errors_of_validators.tests.d.ts +1 -0
  79. package/.out/validation/specs/errors_of_validators.tests.js +9 -0
  80. package/.out/validation/specs/validators_of_values.tests.d.ts +1 -0
  81. package/.out/validation/specs/validators_of_values.tests.js +21 -0
  82. package/.out/validation/validator.d.ts +21 -0
  83. package/.out/validation/validator.js +26 -0
  84. package/.out/validation/validators/defined_validator.d.ts +10 -0
  85. package/.out/validation/validators/defined_validator.js +18 -0
  86. package/.out/validation/validators/minimum_string_length_validator.d.ts +16 -0
  87. package/.out/validation/validators/minimum_string_length_validator.js +23 -0
  88. package/.out/validation/validators_of_values.d.ts +4 -0
  89. package/.out/validation/validators_of_values.js +1 -0
  90. package/.turbo/turbo-build.log +9 -9
  91. package/.turbo/turbo-check-types.log +1 -1
  92. package/.turbo/turbo-release$colon$exports.log +1 -1
  93. package/README.md +16 -2
  94. package/dist/index.cjs +364 -76
  95. package/dist/index.d.cts +365 -114
  96. package/dist/index.d.ts +365 -114
  97. package/dist/index.js +355 -73
  98. package/index.ts +17 -11
  99. package/package.json +11 -3
  100. package/transformers/copies/copy.ts +4 -4
  101. package/transformers/copies/copy_to.ts +11 -7
  102. package/transformers/copies/mobx_copy.ts +6 -6
  103. package/transformers/copies/specs/copy_to.tests.ts +8 -8
  104. package/transformers/copies/specs/mobx_copy.tests.ts +3 -3
  105. package/transformers/flatteners/{flatten_accessors_of.ts → flatten_accessors_of_type.ts} +10 -10
  106. package/transformers/flatteners/flatten_json_value_to_type_paths_of.ts +5 -5
  107. package/transformers/flatteners/{flatten_type_def_to.ts → flatten_type_to.ts} +1 -1
  108. package/transformers/flatteners/{flatten_type_defs_of.ts → flatten_types_of_type.ts} +3 -3
  109. package/transformers/flatteners/flatten_validation_errors_of_type.ts +93 -0
  110. package/transformers/flatteners/flatten_validators_of_validating_type.ts +32 -0
  111. package/transformers/flatteners/{flatten_value_type_to.ts → flatten_value_to.ts} +12 -7
  112. package/transformers/flatteners/{flatten_value_types_of.ts → flatten_values_of_type.ts} +6 -6
  113. package/transformers/flatteners/specs/{flatten_accessors_of.tests.ts → flatten_accessors_of_type.tests.ts} +10 -11
  114. package/transformers/flatteners/specs/flatten_json_value_to_type_paths_of.tests.ts +6 -6
  115. package/transformers/flatteners/specs/{flatten_type_def_to.tests.ts → flatten_type_to.tests.ts} +15 -13
  116. package/transformers/flatteners/specs/flatten_types_of_type.tests.ts +27 -0
  117. package/transformers/flatteners/specs/flatten_validation_errors_of_type.tests.ts +48 -0
  118. package/transformers/flatteners/specs/{flatten_value_type_to.tests.ts → flatten_value_to.tests.ts} +124 -91
  119. package/transformers/flatteners/specs/{flatten_value_types_of.tests.ts → flatten_values_of_type.tests.ts} +4 -4
  120. package/transformers/flatteners/specs/value_path_to_type_path.tests.ts +20 -18
  121. package/transformers/flatteners/value_path_to_type_path.ts +4 -4
  122. package/types/builders.ts +239 -71
  123. package/types/definitions.ts +2 -2
  124. package/types/{flattened_accessors_of.ts → flattened_accessors_of_type.ts} +3 -3
  125. package/types/{flattened_type_defs_of.ts → flattened_types_of_type.ts} +22 -12
  126. package/types/flattened_types_of_validating_type.ts +152 -0
  127. package/types/flattened_validators_of_validating_type.ts +33 -0
  128. package/types/flattened_values_of_type.ts +11 -0
  129. package/types/{mobx_value_type_of.ts → mobx_value_of_type.ts} +2 -2
  130. package/types/{partial_type_def_of.ts → partial_type_of_type.ts} +3 -1
  131. package/types/{json_path_of.ts → path_of.ts} +1 -1
  132. package/types/{json_paths_of.ts → paths_of_type.ts} +5 -5
  133. package/types/readonly_type_of_type.ts +54 -0
  134. package/types/specs/builder.tests.ts +205 -54
  135. package/types/specs/{flattened_accessors_of.tests.ts → flattened_accessors_of_type.tests.ts} +3 -3
  136. package/types/specs/{flattened_type_defs_of.tests.ts → flattened_types_of_type.tests.ts} +82 -34
  137. package/types/specs/flattened_validators_of_validating_type.tests.ts +47 -0
  138. package/types/specs/flattened_values_of_type.tests.ts +39 -0
  139. package/types/specs/{partial_type_def_of.tests.ts → partial_type_of_type.tests.ts} +11 -11
  140. package/types/specs/{json_paths_of.tests.ts → paths_of_type.tests.ts} +47 -47
  141. package/types/specs/{readonly_type_def_of.tests.ts → readonly_type_of_type.tests.ts} +14 -14
  142. package/types/specs/type_of_type.tests.ts +60 -0
  143. package/types/specs/{value_type_of.tests.ts → value_of_type.tests.ts} +15 -15
  144. package/types/specs/{value_to_type_paths_of.tests.ts → value_to_type_paths_of_type.tests.ts} +26 -25
  145. package/types/specs/value_types_of_discriminated_union.tests.ts +6 -6
  146. package/types/strict_definitions.ts +3 -3
  147. package/types/type_of_type.ts +178 -0
  148. package/types/validating_definitions.ts +109 -0
  149. package/types/validating_type_def_with_error.ts +93 -0
  150. package/types/value_of_type.ts +84 -0
  151. package/types/{value_to_type_paths_of.ts → value_to_type_paths_of_type.ts} +30 -29
  152. package/types/value_types_of_discriminated_union.ts +4 -3
  153. package/validation/errors_of_validators.ts +10 -0
  154. package/validation/specs/errors_of_validators.tests.ts +20 -0
  155. package/validation/specs/validators_of_values.tests.ts +68 -0
  156. package/validation/validator.ts +103 -0
  157. package/validation/validators/defined_validator.ts +22 -0
  158. package/validation/validators/minimum_string_length_validator.ts +36 -0
  159. package/validation/validators_of_values.ts +17 -0
  160. package/.out/transformers/flatteners/flatten_accessors_of.d.ts +0 -5
  161. package/.out/transformers/flatteners/flatten_accessors_of.js +0 -11
  162. package/.out/transformers/flatteners/flatten_type_defs_of.js +0 -7
  163. package/.out/transformers/flatteners/flatten_value_types_of.d.ts +0 -3
  164. package/.out/transformers/flatteners/flatten_value_types_of.js +0 -7
  165. package/.out/transformers/flatteners/specs/flatten_type_defs_of.tests.js +0 -17
  166. package/.out/types/flattened_accessors_of.d.ts +0 -9
  167. package/.out/types/flattened_value_types_of.d.ts +0 -6
  168. package/.out/types/json_path_of.d.ts +0 -1
  169. package/.out/types/readonly_type_def_of.d.ts +0 -29
  170. package/.out/types/specs/flattened_value_types_of.tests.js +0 -11
  171. package/.out/types/value_type_of.d.ts +0 -24
  172. package/transformers/flatteners/specs/flatten_type_defs_of.tests.ts +0 -26
  173. package/types/flattened_value_types_of.ts +0 -11
  174. package/types/readonly_type_def_of.ts +0 -53
  175. package/types/specs/flattened_value_types_of.tests.ts +0 -21
  176. package/types/value_type_of.ts +0 -84
  177. /package/.out/transformers/flatteners/specs/{flatten_accessors_of.tests.d.ts → flatten_accessors_of_type.tests.d.ts} +0 -0
  178. /package/.out/transformers/flatteners/specs/{flatten_type_def_to.tests.d.ts → flatten_type_to.tests.d.ts} +0 -0
  179. /package/.out/transformers/flatteners/specs/{flatten_type_defs_of.tests.d.ts → flatten_types_of_type.tests.d.ts} +0 -0
  180. /package/.out/transformers/flatteners/specs/{flatten_value_type_to.tests.d.ts → flatten_validation_errors_of_type.tests.d.ts} +0 -0
  181. /package/.out/transformers/flatteners/specs/{flatten_value_types_of.tests.d.ts → flatten_value_to.tests.d.ts} +0 -0
  182. /package/.out/{types/flattened_accessors_of.js → transformers/flatteners/specs/flatten_values_of_type.tests.d.ts} +0 -0
  183. /package/.out/types/{flattened_type_defs_of.js → flattened_accessors_of_type.js} +0 -0
  184. /package/.out/types/{flattened_value_types_of.js → flattened_types_of_type.js} +0 -0
  185. /package/.out/types/{json_path_of.js → flattened_types_of_validating_type.js} +0 -0
  186. /package/.out/types/{json_paths_of.js → flattened_validators_of_validating_type.js} +0 -0
  187. /package/.out/types/{partial_type_def_of.js → flattened_values_of_type.js} +0 -0
  188. /package/.out/types/{mobx_value_type_of.js → mobx_value_of_type.js} +0 -0
  189. /package/.out/types/{readonly_type_def_of.js → partial_type_of_type.js} +0 -0
  190. /package/.out/types/{specs/flattened_accessors_of.tests.d.ts → path_of.js} +0 -0
  191. /package/.out/types/{specs/flattened_type_defs_of.tests.d.ts → paths_of_type.js} +0 -0
  192. /package/.out/types/{specs/flattened_value_types_of.tests.d.ts → readonly_type_of_type.js} +0 -0
  193. /package/.out/types/specs/{json_paths_of.tests.d.ts → flattened_accessors_of_type.tests.d.ts} +0 -0
  194. /package/.out/types/specs/{partial_type_def_of.tests.d.ts → flattened_types_of_type.tests.d.ts} +0 -0
  195. /package/.out/types/specs/{readonly_type_def_of.tests.d.ts → flattened_validators_of_validating_type.tests.d.ts} +0 -0
  196. /package/.out/types/specs/{value_to_type_paths_of.tests.d.ts → flattened_values_of_type.tests.d.ts} +0 -0
  197. /package/.out/types/specs/{value_type_of.tests.d.ts → partial_type_of_type.tests.d.ts} +0 -0
  198. /package/.out/types/{value_to_type_paths_of.js → specs/paths_of_type.tests.d.ts} +0 -0
  199. /package/.out/types/{value_type_of.js → specs/readonly_type_of_type.tests.d.ts} +0 -0
package/dist/index.js CHANGED
@@ -25,6 +25,9 @@ function copyTo({ definition }, value, copier) {
25
25
  );
26
26
  }
27
27
  function internalCopyTo(definition, value, copier) {
28
+ if (value === void 0) {
29
+ return void 0;
30
+ }
28
31
  switch (definition.type) {
29
32
  case 1 /* Literal */:
30
33
  return copyLiteral(
@@ -155,7 +158,7 @@ import {
155
158
  observable
156
159
  } from "mobx";
157
160
 
158
- // transformers/flatteners/flatten_value_type_to.ts
161
+ // transformers/flatteners/flatten_value_to.ts
159
162
  import {
160
163
  reduce as reduce2,
161
164
  UnreachableError as UnreachableError2
@@ -177,8 +180,8 @@ function jsonPathPop(path) {
177
180
  ];
178
181
  }
179
182
 
180
- // transformers/flatteners/flatten_value_type_to.ts
181
- function flattenValueTypeTo({ definition }, v, setter, mapper) {
183
+ // transformers/flatteners/flatten_value_to.ts
184
+ function flattenValueTo({ definition }, v, setter, mapper2) {
182
185
  const r = {};
183
186
  internalFlattenValue(
184
187
  "$",
@@ -186,32 +189,35 @@ function flattenValueTypeTo({ definition }, v, setter, mapper) {
186
189
  definition,
187
190
  v,
188
191
  setter,
189
- mapper,
192
+ mapper2,
190
193
  r
191
194
  );
192
195
  return r;
193
196
  }
194
- function internalFlattenValue(valuePath, typePath, typeDef, v, setter, mapper, r) {
195
- r[valuePath] = mapper(typeDef, v, setter, typePath, valuePath);
196
- return internalFlattenValueChildren(valuePath, typePath, "", typeDef, v, mapper, r);
197
+ function internalFlattenValue(valuePath, typePath, typeDef, v, setter, mapper2, r) {
198
+ r[valuePath] = mapper2(typeDef, v, setter, typePath, valuePath);
199
+ if (v !== void 0) {
200
+ return internalFlattenValueChildren(valuePath, typePath, "", typeDef, v, mapper2, r);
201
+ }
202
+ return r;
197
203
  }
198
- function internalFlattenValueChildren(valuePath, typePath, qualifier, typeDef, v, mapper, r) {
204
+ function internalFlattenValueChildren(valuePath, typePath, qualifier, typeDef, v, mapper2, r) {
199
205
  switch (typeDef.type) {
200
206
  case 1 /* Literal */:
201
207
  return r;
202
208
  case 2 /* List */:
203
- return internalFlattenListChildren(valuePath, typePath, typeDef, v, mapper, r);
209
+ return internalFlattenListChildren(valuePath, typePath, typeDef, v, mapper2, r);
204
210
  case 3 /* Record */:
205
- return internalFlattenRecordChildren(valuePath, typePath, typeDef, v, mapper, r);
211
+ return internalFlattenRecordChildren(valuePath, typePath, typeDef, v, mapper2, r);
206
212
  case 4 /* Object */:
207
- return internalFlattenObjectChildren(valuePath, typePath, qualifier, typeDef, v, mapper, r);
213
+ return internalFlattenObjectChildren(valuePath, typePath, qualifier, typeDef, v, mapper2, r);
208
214
  case 5 /* Union */:
209
- return internalFlattenUnionChildren(valuePath, typePath, qualifier, typeDef, v, mapper, r);
215
+ return internalFlattenUnionChildren(valuePath, typePath, qualifier, typeDef, v, mapper2, r);
210
216
  default:
211
217
  throw new UnreachableError2(typeDef);
212
218
  }
213
219
  }
214
- function internalFlattenListChildren(valuePath, typePath, { elements }, v, mapper, r) {
220
+ function internalFlattenListChildren(valuePath, typePath, { elements }, v, mapper2, r) {
215
221
  const newTypePath = jsonPath(typePath, "*");
216
222
  return v.reduce(function(r2, e, i) {
217
223
  return internalFlattenValue(
@@ -222,12 +228,12 @@ function internalFlattenListChildren(valuePath, typePath, { elements }, v, mappe
222
228
  (e2) => {
223
229
  v[i] = e2;
224
230
  },
225
- mapper,
231
+ mapper2,
226
232
  r2
227
233
  );
228
234
  }, r);
229
235
  }
230
- function internalFlattenRecordChildren(valuePath, typePath, { valueTypeDef }, v, mapper, r) {
236
+ function internalFlattenRecordChildren(valuePath, typePath, { valueTypeDef }, v, mapper2, r) {
231
237
  const newTypePath = jsonPath(typePath, "*");
232
238
  return reduce2(
233
239
  v,
@@ -240,14 +246,14 @@ function internalFlattenRecordChildren(valuePath, typePath, { valueTypeDef }, v,
240
246
  (value2) => {
241
247
  v[k] = value2;
242
248
  },
243
- mapper,
249
+ mapper2,
244
250
  r2
245
251
  );
246
252
  },
247
253
  r
248
254
  );
249
255
  }
250
- function internalFlattenObjectChildren(valuePath, typePath, qualifier, { fields }, v, mapper, r) {
256
+ function internalFlattenObjectChildren(valuePath, typePath, qualifier, { fields }, v, mapper2, r) {
251
257
  return reduce2(
252
258
  fields,
253
259
  function(r2, k, fieldTypeDef) {
@@ -260,14 +266,14 @@ function internalFlattenObjectChildren(valuePath, typePath, qualifier, { fields
260
266
  (value) => {
261
267
  v[k] = value;
262
268
  },
263
- mapper,
269
+ mapper2,
264
270
  r2
265
271
  );
266
272
  },
267
273
  r
268
274
  );
269
275
  }
270
- function internalFlattenUnionChildren(valuePath, typePath, qualifier, typeDef, v, mapper, r) {
276
+ function internalFlattenUnionChildren(valuePath, typePath, qualifier, typeDef, v, mapper2, r) {
271
277
  const childTypeDef = getUnionTypeDef(typeDef, v);
272
278
  const newQualifier = typeDef.discriminator != null ? `${qualifier}${v[typeDef.discriminator]}:` : qualifier;
273
279
  return internalFlattenValueChildren(
@@ -276,7 +282,7 @@ function internalFlattenUnionChildren(valuePath, typePath, qualifier, typeDef, v
276
282
  newQualifier,
277
283
  childTypeDef,
278
284
  v,
279
- mapper,
285
+ mapper2,
280
286
  r
281
287
  );
282
288
  }
@@ -346,15 +352,15 @@ function mobxCopy(t, proto) {
346
352
  return copyTo(t, proto, observeValue);
347
353
  }
348
354
 
349
- // transformers/flatteners/flatten_accessors_of.ts
355
+ // transformers/flatteners/flatten_accessors_of_type.ts
350
356
  function mapAccessor(_t, value, set) {
351
357
  return {
352
358
  value,
353
359
  set
354
360
  };
355
361
  }
356
- function flattenAccessorsOf(t, value, setValue) {
357
- return flattenValueTypeTo(
362
+ function flattenAccessorsOfType(t, value, setValue) {
363
+ return flattenValueTo(
358
364
  t,
359
365
  value,
360
366
  setValue,
@@ -367,7 +373,7 @@ function mapTypePaths(_t, _value, _set, typePath) {
367
373
  return typePath;
368
374
  }
369
375
  function flattenJsonValueToTypePathsOf(t, value) {
370
- return flattenValueTypeTo(
376
+ return flattenValueTo(
371
377
  t,
372
378
  value,
373
379
  function() {
@@ -376,17 +382,17 @@ function flattenJsonValueToTypePathsOf(t, value) {
376
382
  );
377
383
  }
378
384
 
379
- // transformers/flatteners/flatten_type_def_to.ts
385
+ // transformers/flatteners/flatten_type_to.ts
380
386
  import {
381
387
  reduce as reduce4,
382
388
  UnreachableError as UnreachableError4
383
389
  } from "@strictly/base";
384
- function flattenTypeDefTo({ definition }, mapper) {
390
+ function flattenTypeTo({ definition }, mapper2) {
385
391
  const typeDefs = internalFlattenTypeDef("$", definition, {});
386
392
  return reduce4(
387
393
  typeDefs,
388
394
  function(acc, key, typeDef) {
389
- acc[key] = mapper(typeDef);
395
+ acc[key] = mapper2(typeDef);
390
396
  return acc;
391
397
  },
392
398
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
@@ -450,9 +456,9 @@ function internalFlattenUnionTypeDefChildren(path, qualifier, {
450
456
  );
451
457
  }
452
458
 
453
- // transformers/flatteners/flatten_type_defs_of.ts
454
- function flattenTypeDefsOf(t) {
455
- return flattenTypeDefTo(
459
+ // transformers/flatteners/flatten_types_of_type.ts
460
+ function flattenTypesOfType(t) {
461
+ return flattenTypeTo(
456
462
  t,
457
463
  function(definition) {
458
464
  return { definition };
@@ -460,6 +466,41 @@ function flattenTypeDefsOf(t) {
460
466
  );
461
467
  }
462
468
 
469
+ // transformers/flatteners/flatten_validators_of_validating_type.ts
470
+ function flattenValidatorsOfValidatingType(type) {
471
+ return flattenTypeTo(type, function(definition) {
472
+ const {
473
+ rule,
474
+ readonly,
475
+ required
476
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
477
+ } = definition;
478
+ return {
479
+ annotations: function() {
480
+ return {
481
+ readonly,
482
+ required
483
+ };
484
+ },
485
+ validate: rule
486
+ };
487
+ });
488
+ }
489
+
490
+ // transformers/flatteners/flatten_values_of_type.ts
491
+ function mapper(_t, v) {
492
+ return v;
493
+ }
494
+ function flattenValuesOfType(typeDef, value) {
495
+ return flattenValueTo(
496
+ typeDef,
497
+ value,
498
+ () => {
499
+ },
500
+ mapper
501
+ );
502
+ }
503
+
463
504
  // transformers/flatteners/value_path_to_type_path.ts
464
505
  import {
465
506
  assertEqual,
@@ -599,77 +640,225 @@ function internalJsonValuePathToTypePath(typeDef, valueSteps, allowMissingPaths,
599
640
  }
600
641
  }
601
642
 
643
+ // types/type_of_type.ts
644
+ import {
645
+ map as map2,
646
+ UnreachableError as UnreachableError6
647
+ } from "@strictly/base";
648
+ function typeOfType({ definition }) {
649
+ return {
650
+ definition: typeDefOfTypeDef(definition)
651
+ };
652
+ }
653
+ function typeDefOfTypeDef(t) {
654
+ switch (t.type) {
655
+ case 1 /* Literal */:
656
+ return typeDefOfLiteralTypeDef(t);
657
+ case 2 /* List */:
658
+ return typeDefOfListTypeDef(t);
659
+ case 3 /* Record */:
660
+ return typeDefOfRecordTypeDef(t);
661
+ case 4 /* Object */:
662
+ return typeDefOfObjectTypeDef(t);
663
+ case 5 /* Union */:
664
+ return typeDefOfUnionTypeDef(t);
665
+ default:
666
+ throw new UnreachableError6(t);
667
+ }
668
+ }
669
+ function typeDefOfLiteralTypeDef({
670
+ type,
671
+ valuePrototype
672
+ }) {
673
+ return {
674
+ type,
675
+ valuePrototype
676
+ };
677
+ }
678
+ function typeDefOfListTypeDef({
679
+ type,
680
+ elements
681
+ }) {
682
+ return {
683
+ type,
684
+ elements: typeDefOfTypeDef(elements)
685
+ };
686
+ }
687
+ function typeDefOfRecordTypeDef({
688
+ type,
689
+ keyPrototype,
690
+ valueTypeDef
691
+ }) {
692
+ return {
693
+ type,
694
+ keyPrototype,
695
+ valueTypeDef: typeDefOfTypeDef(valueTypeDef)
696
+ };
697
+ }
698
+ function typeDefOfObjectTypeDef({
699
+ type,
700
+ fields
701
+ }) {
702
+ return {
703
+ type,
704
+ fields: map2(fields, function(_k, v) {
705
+ return typeDefOfTypeDef(v);
706
+ })
707
+ };
708
+ }
709
+ function typeDefOfUnionTypeDef({
710
+ type,
711
+ discriminator,
712
+ unions
713
+ }) {
714
+ return {
715
+ type,
716
+ discriminator,
717
+ unions: map2(unions, function(_k, v) {
718
+ return typeDefOfTypeDef(v);
719
+ })
720
+ };
721
+ }
722
+
602
723
  // types/builders.ts
603
- var TypeDefBuilder = class {
724
+ function emptyRule() {
725
+ return null;
726
+ }
727
+ var TypeDefBuilder = class _TypeDefBuilder {
604
728
  constructor(definition) {
605
729
  this.definition = definition;
606
730
  }
607
- // returns just the relevant types, which can help typescript
608
- // from complaining about infinitely deep data structures
731
+ enforce(rule) {
732
+ return new _TypeDefBuilder(
733
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
734
+ {
735
+ ...this.definition,
736
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
737
+ rule: (value) => {
738
+ return this.definition.rule(value) || rule(value);
739
+ }
740
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
741
+ }
742
+ );
743
+ }
744
+ required(rule) {
745
+ return new _TypeDefBuilder(
746
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
747
+ {
748
+ ...this.definition,
749
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
750
+ rule: (v) => {
751
+ return this.definition.rule(v) || rule?.(v);
752
+ },
753
+ required: true
754
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
755
+ }
756
+ );
757
+ }
758
+ readonly() {
759
+ return new _TypeDefBuilder(
760
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
761
+ {
762
+ ...this.definition,
763
+ readonly: true
764
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
765
+ }
766
+ );
767
+ }
768
+ // should only be used in tests requiring Types, client code should be happy with validating types
769
+ // eslint-disable-next-line @typescript-eslint/naming-convention
770
+ get _type() {
771
+ return typeOfType(this);
772
+ }
609
773
  get narrow() {
610
774
  return {
611
775
  definition: this.definition
776
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
612
777
  };
613
778
  }
614
779
  };
615
- var LiteralTypeDefBuilder = class extends TypeDefBuilder {
616
- };
617
- var ListTypeDefBuilder = class extends TypeDefBuilder {
618
- readonly() {
619
- return this;
780
+ var ListTypeDefBuilder = class _ListTypeDefBuilder extends TypeDefBuilder {
781
+ readonlyElements() {
782
+ return new _ListTypeDefBuilder({
783
+ ...this.definition,
784
+ elements: {
785
+ ...this.definition.elements,
786
+ readonly: true
787
+ }
788
+ });
620
789
  }
621
790
  };
622
- var RecordTypeDefBuilder = class extends TypeDefBuilder {
623
- partial() {
791
+ var RecordTypeDefBuilder = class _RecordTypeDefBuilder extends TypeDefBuilder {
792
+ partialKeys() {
624
793
  return this;
625
794
  }
626
- readonly() {
627
- return this;
795
+ readonlyKeys() {
796
+ return new _RecordTypeDefBuilder({
797
+ ...this.definition,
798
+ valueTypeDef: {
799
+ ...this.definition.valueTypeDef,
800
+ readonly: true
801
+ }
802
+ });
628
803
  }
629
804
  };
630
805
  var ObjectTypeDefBuilder = class _ObjectTypeDefBuilder extends TypeDefBuilder {
631
- set(name, { definition: typeDef }) {
632
- const newFields = {
633
- [name]: typeDef
634
- };
806
+ field(name, { definition }, rule) {
635
807
  return new _ObjectTypeDefBuilder({
636
- type: 4 /* Object */,
808
+ ...this.definition,
809
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
637
810
  fields: {
638
811
  ...this.definition.fields,
639
- ...newFields
812
+ [name]: {
813
+ ...definition,
814
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
815
+ rule: function(v) {
816
+ return definition.rule(v) || rule?.(v);
817
+ },
818
+ required: true
819
+ }
640
820
  }
641
821
  });
642
822
  }
643
- setReadonly(name, { definition: typeDef }) {
823
+ readonlyField(name, { definition }) {
644
824
  const newFields = {
645
- [name]: typeDef
825
+ [name]: {
826
+ ...definition,
827
+ required: true,
828
+ readonly: true
829
+ }
646
830
  };
647
831
  return new _ObjectTypeDefBuilder({
648
- type: 4 /* Object */,
832
+ ...this.definition,
649
833
  fields: {
650
834
  ...this.definition.fields,
651
835
  ...newFields
652
836
  }
653
837
  });
654
838
  }
655
- setOptional(name, { definition: typeDef }) {
839
+ optionalField(name, { definition }) {
656
840
  const newFields = {
657
- [name]: typeDef
841
+ [name]: {
842
+ ...definition
843
+ }
658
844
  };
659
845
  return new _ObjectTypeDefBuilder({
660
- type: 4 /* Object */,
846
+ ...this.definition,
661
847
  fields: {
662
848
  ...this.definition.fields,
663
849
  ...newFields
664
850
  }
665
851
  });
666
852
  }
667
- setReadonlyOptional(name, { definition: typeDef }) {
853
+ readonlyOptionalField(name, { definition }) {
668
854
  const newFields = {
669
- [name]: typeDef
855
+ [name]: {
856
+ ...definition,
857
+ readonly: true
858
+ }
670
859
  };
671
860
  return new _ObjectTypeDefBuilder({
672
- type: 4 /* Object */,
861
+ ...this.definition,
673
862
  fields: {
674
863
  ...this.definition.fields,
675
864
  ...newFields
@@ -678,17 +867,15 @@ var ObjectTypeDefBuilder = class _ObjectTypeDefBuilder extends TypeDefBuilder {
678
867
  }
679
868
  };
680
869
  var UnionTypeDefBuilder = class _UnionTypeDefBuilder extends TypeDefBuilder {
681
- add(k, {
870
+ or(k, {
682
871
  definition: typeDef
683
872
  }) {
684
873
  const {
685
- discriminator,
686
874
  unions
687
875
  } = this.definition;
688
876
  return new _UnionTypeDefBuilder(
689
877
  {
690
- type: 5 /* Union */,
691
- discriminator,
878
+ ...this.definition,
692
879
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
693
880
  unions: {
694
881
  ...unions,
@@ -699,9 +886,12 @@ var UnionTypeDefBuilder = class _UnionTypeDefBuilder extends TypeDefBuilder {
699
886
  }
700
887
  };
701
888
  function literal(value) {
702
- return new LiteralTypeDefBuilder({
889
+ return new TypeDefBuilder({
703
890
  type: 1 /* Literal */,
704
- valuePrototype: value
891
+ valuePrototype: value,
892
+ rule: emptyRule,
893
+ readonly: false,
894
+ required: false
705
895
  });
706
896
  }
707
897
  var stringType = literal();
@@ -716,28 +906,40 @@ function nullable(nonNullable) {
716
906
  unions: {
717
907
  ["0"]: nonNullable.definition,
718
908
  ["1"]: nullType.definition
719
- }
909
+ },
910
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
911
+ rule: emptyRule,
912
+ readonly: false,
913
+ required: false
720
914
  }
721
915
  );
722
916
  }
723
917
  function list(elements) {
724
918
  return new ListTypeDefBuilder({
725
919
  type: 2 /* List */,
726
- elements: elements.definition
920
+ elements: elements.definition,
921
+ rule: emptyRule,
922
+ readonly: false,
923
+ required: false
727
924
  });
728
925
  }
729
- function record({ definition: typeDef }) {
926
+ function record({ definition: valueTypeDef }) {
730
927
  return new RecordTypeDefBuilder({
731
928
  type: 3 /* Record */,
732
- // eslint-disable-next-line no-undefined
733
929
  keyPrototype: void 0,
734
- valueTypeDef: typeDef
930
+ valueTypeDef,
931
+ rule: emptyRule,
932
+ readonly: false,
933
+ required: false
735
934
  });
736
935
  }
737
936
  function object() {
738
937
  return new ObjectTypeDefBuilder({
739
938
  type: 4 /* Object */,
740
- fields: {}
939
+ fields: {},
940
+ rule: emptyRule,
941
+ readonly: false,
942
+ required: false
741
943
  });
742
944
  }
743
945
  function union(discriminator) {
@@ -746,19 +948,98 @@ function union(discriminator) {
746
948
  type: 5 /* Union */,
747
949
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
748
950
  discriminator: discriminator ?? null,
749
- unions: {}
951
+ unions: {},
952
+ rule: emptyRule,
953
+ readonly: false,
954
+ required: false
750
955
  }
751
956
  );
752
957
  }
958
+
959
+ // validation/validator.ts
960
+ function isFunctionalValidator(v) {
961
+ return typeof v === "function";
962
+ }
963
+ function isAnnotatedValidator(v) {
964
+ return typeof v !== "function";
965
+ }
966
+ function validate(validator, v, valuePath, context) {
967
+ if (isAnnotatedValidator(validator)) {
968
+ return validator.validate(v, valuePath, context);
969
+ } else {
970
+ return validator(v, valuePath, context);
971
+ }
972
+ }
973
+ function annotations(validator, valuePath, context) {
974
+ if (isAnnotatedValidator(validator)) {
975
+ return validator.annotations(valuePath, context);
976
+ } else {
977
+ return {
978
+ required: false,
979
+ readonly: false
980
+ };
981
+ }
982
+ }
983
+
984
+ // validation/validators/defined_validator.ts
985
+ var DefinedValidator = class {
986
+ constructor(error) {
987
+ this.error = error;
988
+ }
989
+ validate(v) {
990
+ if (v == null) {
991
+ return this.error;
992
+ }
993
+ return null;
994
+ }
995
+ annotations() {
996
+ return {
997
+ required: true,
998
+ readonly: false
999
+ };
1000
+ }
1001
+ };
1002
+
1003
+ // validation/validators/minimum_string_length_validator.ts
1004
+ var MinimumStringLengthValidationErrorType = "minimum_string_length";
1005
+ var MinimumStringLengthValidator = class {
1006
+ constructor(minimumLength) {
1007
+ this.minimumLength = minimumLength;
1008
+ }
1009
+ validate(value) {
1010
+ if (value.length < this.minimumLength) {
1011
+ return {
1012
+ type: MinimumStringLengthValidationErrorType,
1013
+ minimumLength: this.minimumLength,
1014
+ receivedLength: value.length
1015
+ };
1016
+ }
1017
+ return null;
1018
+ }
1019
+ annotations() {
1020
+ return {
1021
+ required: true,
1022
+ readonly: false
1023
+ };
1024
+ }
1025
+ };
753
1026
  export {
1027
+ DefinedValidator,
1028
+ MinimumStringLengthValidationErrorType,
1029
+ MinimumStringLengthValidator,
754
1030
  TypeDefType,
1031
+ annotations,
755
1032
  booleanType,
756
1033
  copy,
757
- flattenAccessorsOf,
1034
+ flattenAccessorsOfType,
758
1035
  flattenJsonValueToTypePathsOf,
759
- flattenTypeDefsOf,
760
- flattenValueTypeTo,
1036
+ flattenTypesOfType,
1037
+ flattenValidatorsOfValidatingType,
1038
+ flattenValueTo,
1039
+ flattenValuesOfType,
761
1040
  getUnionTypeDef,
1041
+ isAnnotatedValidator,
1042
+ isFunctionalValidator,
762
1043
  jsonPath,
763
1044
  jsonPathPop,
764
1045
  list,
@@ -771,5 +1052,6 @@ export {
771
1052
  record,
772
1053
  stringType,
773
1054
  union,
1055
+ validate,
774
1056
  valuePathToTypePath
775
1057
  };