@oscarpalmer/jhunal 0.16.0 → 0.18.0

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 (40) hide show
  1. package/dist/constants.d.mts +28 -15
  2. package/dist/constants.mjs +31 -14
  3. package/dist/helpers.d.mts +8 -1
  4. package/dist/helpers.mjs +68 -3
  5. package/dist/index.d.mts +283 -262
  6. package/dist/index.mjs +189 -56
  7. package/dist/models/infer.model.d.mts +66 -0
  8. package/dist/models/infer.model.mjs +1 -0
  9. package/dist/models/misc.model.d.mts +153 -0
  10. package/dist/models/misc.model.mjs +1 -0
  11. package/dist/models/schema.plain.model.d.mts +92 -0
  12. package/dist/models/schema.plain.model.mjs +1 -0
  13. package/dist/models/schema.typed.model.d.mts +96 -0
  14. package/dist/models/schema.typed.model.mjs +1 -0
  15. package/dist/models/transform.model.d.mts +59 -0
  16. package/dist/models/transform.model.mjs +1 -0
  17. package/dist/models/validation.model.d.mts +81 -0
  18. package/dist/models/validation.model.mjs +21 -0
  19. package/dist/schematic.d.mts +20 -6
  20. package/dist/schematic.mjs +7 -12
  21. package/dist/validation/property.validation.d.mts +1 -1
  22. package/dist/validation/property.validation.mjs +21 -17
  23. package/dist/validation/value.validation.d.mts +2 -2
  24. package/dist/validation/value.validation.mjs +63 -11
  25. package/package.json +3 -3
  26. package/src/constants.ts +84 -18
  27. package/src/helpers.ts +162 -4
  28. package/src/index.ts +3 -1
  29. package/src/models/infer.model.ts +105 -0
  30. package/src/models/misc.model.ts +212 -0
  31. package/src/models/schema.plain.model.ts +110 -0
  32. package/src/models/schema.typed.model.ts +109 -0
  33. package/src/models/transform.model.ts +85 -0
  34. package/src/models/validation.model.ts +123 -0
  35. package/src/schematic.ts +29 -18
  36. package/src/validation/property.validation.ts +46 -36
  37. package/src/validation/value.validation.ts +115 -15
  38. package/dist/models.d.mts +0 -507
  39. package/dist/models.mjs +0 -18
  40. package/src/models.ts +0 -691
@@ -1,27 +1,40 @@
1
- import { Values } from "./models.mjs";
1
+ import { ReportingType } from "./models/validation.model.mjs";
2
+ import { Values } from "./models/misc.model.mjs";
2
3
 
3
4
  //#region src/constants.d.ts
4
- declare const ERROR_NAME = "SchematicError";
5
- declare const EXPRESSION_PROPERTY: RegExp;
6
5
  declare const MESSAGE_CONSTRUCTOR = "Expected a constructor function";
7
- declare const MESSAGE_SCHEMA_INVALID_EMPTY = "Schema must have at least one property";
8
- declare const MESSAGE_SCHEMA_INVALID_PROPERTY_DISALLOWED = "'<key>.<property>' property is not allowed for schemas in $type";
9
- declare const MESSAGE_SCHEMA_INVALID_PROPERTY_REQUIRED = "'<>.$required' property must be a boolean";
10
- declare const MESSAGE_SCHEMA_INVALID_PROPERTY_TYPE = "'<>' property must be of a valid type";
11
- declare const MESSAGE_SCHEMA_INVALID_TYPE = "Schema must be an object";
12
- declare const MESSAGE_VALIDATOR_INVALID_KEY = "Validator '<>' does not exist";
13
- declare const MESSAGE_VALIDATOR_INVALID_TYPE = "Validators must be an object";
14
- declare const MESSAGE_VALIDATOR_INVALID_VALUE = "Validator '<>' must be a function or an array of functions";
6
+ declare const NAME_SCHEMATIC = "Schematic";
7
+ declare const NAME_ERROR_SCHEMATIC = "SchematicError";
8
+ declare const NAME_ERROR_VALIDATION = "ValidationError";
15
9
  declare const PROPERTY_REQUIRED = "$required";
10
+ declare const PROPERTY_SCHEMATIC = "$schematic";
16
11
  declare const PROPERTY_TYPE = "$type";
17
12
  declare const PROPERTY_VALIDATORS = "$validators";
18
- declare const SCHEMATIC_NAME = "$schematic";
13
+ declare const VALIDATION_MESSAGE_INVALID_INPUT = "Expected 'object' as input but received <>";
14
+ declare const VALIDATION_MESSAGE_INVALID_REQUIRED = "Expected <> for required property '<>'";
15
+ declare const VALIDATION_MESSAGE_INVALID_TYPE = "Expected <> for '<>' but received <>";
16
+ declare const VALIDATION_MESSAGE_INVALID_VALUE = "Value does not satisfy validator for '<>' and type '<>'";
17
+ declare const VALIDATION_MESSAGE_INVALID_VALUE_SUFFIX = " at index <>";
18
+ declare const REPORTING_ALL: ReportingType;
19
+ declare const REPORTING_FIRST: ReportingType;
20
+ declare const REPORTING_NONE: ReportingType;
21
+ declare const REPORTING_THROW: ReportingType;
22
+ declare const REPORTING_TYPES: Set<ReportingType>;
23
+ declare const SCHEMATIC_MESSAGE_SCHEMA_INVALID_EMPTY = "Schema must have at least one property";
24
+ declare const SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_DISALLOWED = "'<>.<>' property is not allowed for schemas in $type";
25
+ declare const SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_NULLABLE = "'<>' property must not be 'null' or 'undefined'";
26
+ declare const SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_REQUIRED = "'<>.$required' property must be a boolean";
27
+ declare const SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_TYPE = "'<>' property must be of a valid type";
28
+ declare const SCHEMATIC_MESSAGE_SCHEMA_INVALID_TYPE = "Schema must be an object";
29
+ declare const SCHEMATIC_MESSAGE_VALIDATOR_INVALID_KEY = "Validator '<>' does not exist";
30
+ declare const SCHEMATIC_MESSAGE_VALIDATOR_INVALID_TYPE = "Validators must be an object";
31
+ declare const SCHEMATIC_MESSAGE_VALIDATOR_INVALID_VALUE = "Validator '<>' must be a function or an array of functions";
19
32
  declare const TEMPLATE_PATTERN = "<>";
20
- declare const TEMPLATE_PATTERN_KEY = "<key>";
21
- declare const TEMPLATE_PATTERN_PROPERTY = "<property>";
33
+ declare const TYPE_ARRAY = "array";
34
+ declare const TYPE_NULL = "null";
22
35
  declare const TYPE_OBJECT = "object";
23
36
  declare const TYPE_UNDEFINED = "undefined";
24
37
  declare const VALIDATABLE_TYPES: Set<keyof Values>;
25
38
  declare const TYPE_ALL: Set<keyof Values>;
26
39
  //#endregion
27
- export { ERROR_NAME, EXPRESSION_PROPERTY, MESSAGE_CONSTRUCTOR, MESSAGE_SCHEMA_INVALID_EMPTY, MESSAGE_SCHEMA_INVALID_PROPERTY_DISALLOWED, MESSAGE_SCHEMA_INVALID_PROPERTY_REQUIRED, MESSAGE_SCHEMA_INVALID_PROPERTY_TYPE, MESSAGE_SCHEMA_INVALID_TYPE, MESSAGE_VALIDATOR_INVALID_KEY, MESSAGE_VALIDATOR_INVALID_TYPE, MESSAGE_VALIDATOR_INVALID_VALUE, PROPERTY_REQUIRED, PROPERTY_TYPE, PROPERTY_VALIDATORS, SCHEMATIC_NAME, TEMPLATE_PATTERN, TEMPLATE_PATTERN_KEY, TEMPLATE_PATTERN_PROPERTY, TYPE_ALL, TYPE_OBJECT, TYPE_UNDEFINED, VALIDATABLE_TYPES };
40
+ export { MESSAGE_CONSTRUCTOR, NAME_ERROR_SCHEMATIC, NAME_ERROR_VALIDATION, NAME_SCHEMATIC, PROPERTY_REQUIRED, PROPERTY_SCHEMATIC, PROPERTY_TYPE, PROPERTY_VALIDATORS, REPORTING_ALL, REPORTING_FIRST, REPORTING_NONE, REPORTING_THROW, REPORTING_TYPES, SCHEMATIC_MESSAGE_SCHEMA_INVALID_EMPTY, SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_DISALLOWED, SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_NULLABLE, SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_REQUIRED, SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_TYPE, SCHEMATIC_MESSAGE_SCHEMA_INVALID_TYPE, SCHEMATIC_MESSAGE_VALIDATOR_INVALID_KEY, SCHEMATIC_MESSAGE_VALIDATOR_INVALID_TYPE, SCHEMATIC_MESSAGE_VALIDATOR_INVALID_VALUE, TEMPLATE_PATTERN, TYPE_ALL, TYPE_ARRAY, TYPE_NULL, TYPE_OBJECT, TYPE_UNDEFINED, VALIDATABLE_TYPES, VALIDATION_MESSAGE_INVALID_INPUT, VALIDATION_MESSAGE_INVALID_REQUIRED, VALIDATION_MESSAGE_INVALID_TYPE, VALIDATION_MESSAGE_INVALID_VALUE, VALIDATION_MESSAGE_INVALID_VALUE_SUFFIX };
@@ -1,22 +1,39 @@
1
1
  //#region src/constants.ts
2
- const ERROR_NAME = "SchematicError";
3
- const EXPRESSION_PROPERTY = /(^|\.)\$(required|type|validators)(\.|$)/;
4
2
  const MESSAGE_CONSTRUCTOR = "Expected a constructor function";
5
- const MESSAGE_SCHEMA_INVALID_EMPTY = "Schema must have at least one property";
6
- const MESSAGE_SCHEMA_INVALID_PROPERTY_DISALLOWED = "'<key>.<property>' property is not allowed for schemas in $type";
7
- const MESSAGE_SCHEMA_INVALID_PROPERTY_REQUIRED = "'<>.$required' property must be a boolean";
8
- const MESSAGE_SCHEMA_INVALID_PROPERTY_TYPE = "'<>' property must be of a valid type";
9
- const MESSAGE_SCHEMA_INVALID_TYPE = "Schema must be an object";
10
- const MESSAGE_VALIDATOR_INVALID_KEY = "Validator '<>' does not exist";
11
- const MESSAGE_VALIDATOR_INVALID_TYPE = "Validators must be an object";
12
- const MESSAGE_VALIDATOR_INVALID_VALUE = "Validator '<>' must be a function or an array of functions";
3
+ const NAME_SCHEMATIC = "Schematic";
4
+ const NAME_ERROR_SCHEMATIC = "SchematicError";
5
+ const NAME_ERROR_VALIDATION = "ValidationError";
13
6
  const PROPERTY_REQUIRED = "$required";
7
+ const PROPERTY_SCHEMATIC = "$schematic";
14
8
  const PROPERTY_TYPE = "$type";
15
9
  const PROPERTY_VALIDATORS = "$validators";
16
- const SCHEMATIC_NAME = "$schematic";
10
+ const VALIDATION_MESSAGE_INVALID_INPUT = "Expected 'object' as input but received <>";
11
+ const VALIDATION_MESSAGE_INVALID_REQUIRED = "Expected <> for required property '<>'";
12
+ const VALIDATION_MESSAGE_INVALID_TYPE = "Expected <> for '<>' but received <>";
13
+ const VALIDATION_MESSAGE_INVALID_VALUE = "Value does not satisfy validator for '<>' and type '<>'";
14
+ const VALIDATION_MESSAGE_INVALID_VALUE_SUFFIX = " at index <>";
15
+ const REPORTING_ALL = "all";
16
+ const REPORTING_FIRST = "first";
17
+ const REPORTING_NONE = "none";
18
+ const REPORTING_THROW = "throw";
19
+ const REPORTING_TYPES = new Set([
20
+ "all",
21
+ REPORTING_FIRST,
22
+ REPORTING_NONE,
23
+ REPORTING_THROW
24
+ ]);
25
+ const SCHEMATIC_MESSAGE_SCHEMA_INVALID_EMPTY = "Schema must have at least one property";
26
+ const SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_DISALLOWED = "'<>.<>' property is not allowed for schemas in $type";
27
+ const SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_NULLABLE = "'<>' property must not be 'null' or 'undefined'";
28
+ const SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_REQUIRED = "'<>.$required' property must be a boolean";
29
+ const SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_TYPE = "'<>' property must be of a valid type";
30
+ const SCHEMATIC_MESSAGE_SCHEMA_INVALID_TYPE = "Schema must be an object";
31
+ const SCHEMATIC_MESSAGE_VALIDATOR_INVALID_KEY = "Validator '<>' does not exist";
32
+ const SCHEMATIC_MESSAGE_VALIDATOR_INVALID_TYPE = "Validators must be an object";
33
+ const SCHEMATIC_MESSAGE_VALIDATOR_INVALID_VALUE = "Validator '<>' must be a function or an array of functions";
17
34
  const TEMPLATE_PATTERN = "<>";
18
- const TEMPLATE_PATTERN_KEY = "<key>";
19
- const TEMPLATE_PATTERN_PROPERTY = "<property>";
35
+ const TYPE_ARRAY = "array";
36
+ const TYPE_NULL = "null";
20
37
  const TYPE_OBJECT = "object";
21
38
  const TYPE_UNDEFINED = "undefined";
22
39
  const VALIDATABLE_TYPES = new Set([
@@ -36,4 +53,4 @@ const TYPE_ALL = new Set([
36
53
  TYPE_UNDEFINED
37
54
  ]);
38
55
  //#endregion
39
- export { ERROR_NAME, EXPRESSION_PROPERTY, MESSAGE_CONSTRUCTOR, MESSAGE_SCHEMA_INVALID_EMPTY, MESSAGE_SCHEMA_INVALID_PROPERTY_DISALLOWED, MESSAGE_SCHEMA_INVALID_PROPERTY_REQUIRED, MESSAGE_SCHEMA_INVALID_PROPERTY_TYPE, MESSAGE_SCHEMA_INVALID_TYPE, MESSAGE_VALIDATOR_INVALID_KEY, MESSAGE_VALIDATOR_INVALID_TYPE, MESSAGE_VALIDATOR_INVALID_VALUE, PROPERTY_REQUIRED, PROPERTY_TYPE, PROPERTY_VALIDATORS, SCHEMATIC_NAME, TEMPLATE_PATTERN, TEMPLATE_PATTERN_KEY, TEMPLATE_PATTERN_PROPERTY, TYPE_ALL, TYPE_OBJECT, TYPE_UNDEFINED, VALIDATABLE_TYPES };
56
+ export { MESSAGE_CONSTRUCTOR, NAME_ERROR_SCHEMATIC, NAME_ERROR_VALIDATION, NAME_SCHEMATIC, PROPERTY_REQUIRED, PROPERTY_SCHEMATIC, PROPERTY_TYPE, PROPERTY_VALIDATORS, REPORTING_ALL, REPORTING_FIRST, REPORTING_NONE, REPORTING_THROW, REPORTING_TYPES, SCHEMATIC_MESSAGE_SCHEMA_INVALID_EMPTY, SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_DISALLOWED, SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_NULLABLE, SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_REQUIRED, SCHEMATIC_MESSAGE_SCHEMA_INVALID_PROPERTY_TYPE, SCHEMATIC_MESSAGE_SCHEMA_INVALID_TYPE, SCHEMATIC_MESSAGE_VALIDATOR_INVALID_KEY, SCHEMATIC_MESSAGE_VALIDATOR_INVALID_TYPE, SCHEMATIC_MESSAGE_VALIDATOR_INVALID_VALUE, TEMPLATE_PATTERN, TYPE_ALL, TYPE_ARRAY, TYPE_NULL, TYPE_OBJECT, TYPE_UNDEFINED, VALIDATABLE_TYPES, VALIDATION_MESSAGE_INVALID_INPUT, VALIDATION_MESSAGE_INVALID_REQUIRED, VALIDATION_MESSAGE_INVALID_TYPE, VALIDATION_MESSAGE_INVALID_VALUE, VALIDATION_MESSAGE_INVALID_VALUE_SUFFIX };
@@ -1,7 +1,14 @@
1
+ import { ReportingInformation, ValidatedProperty } from "./models/validation.model.mjs";
1
2
  import { Schematic } from "./schematic.mjs";
3
+ import { ValueName } from "./models/misc.model.mjs";
2
4
  import { Constructor } from "@oscarpalmer/atoms/models";
3
5
 
4
6
  //#region src/helpers.d.ts
7
+ declare function getInvalidInputMessage(actual: unknown): string;
8
+ declare function getInvalidMissingMessage(property: ValidatedProperty): string;
9
+ declare function getInvalidTypeMessage(property: ValidatedProperty, actual: unknown): string;
10
+ declare function getInvalidValidatorMessage(property: ValidatedProperty, type: ValueName, index: number, length: number): string;
11
+ declare function getReporting(value: unknown): ReportingInformation;
5
12
  /**
6
13
  * Creates a validator function for a given constructor
7
14
  * @param constructor - Constructor to check against
@@ -16,4 +23,4 @@ declare function instanceOf<Instance>(constructor: Constructor<Instance>): (valu
16
23
  */
17
24
  declare function isSchematic(value: unknown): value is Schematic<never>;
18
25
  //#endregion
19
- export { instanceOf, isSchematic };
26
+ export { getInvalidInputMessage, getInvalidMissingMessage, getInvalidTypeMessage, getInvalidValidatorMessage, getReporting, instanceOf, isSchematic };
package/dist/helpers.mjs CHANGED
@@ -1,6 +1,53 @@
1
- import { MESSAGE_CONSTRUCTOR } from "./constants.mjs";
2
- import { isConstructor } from "@oscarpalmer/atoms/is";
1
+ import { MESSAGE_CONSTRUCTOR, NAME_SCHEMATIC, REPORTING_FIRST, REPORTING_NONE, REPORTING_THROW, REPORTING_TYPES, TYPE_ARRAY, TYPE_NULL, TYPE_OBJECT, TYPE_UNDEFINED, VALIDATION_MESSAGE_INVALID_INPUT, VALIDATION_MESSAGE_INVALID_REQUIRED, VALIDATION_MESSAGE_INVALID_TYPE, VALIDATION_MESSAGE_INVALID_VALUE, VALIDATION_MESSAGE_INVALID_VALUE_SUFFIX } from "./constants.mjs";
2
+ import { isConstructor, isPlainObject } from "@oscarpalmer/atoms/is";
3
3
  //#region src/helpers.ts
4
+ function getInvalidInputMessage(actual) {
5
+ return VALIDATION_MESSAGE_INVALID_INPUT.replace("<>", getValueType(actual));
6
+ }
7
+ function getInvalidMissingMessage(property) {
8
+ let message = VALIDATION_MESSAGE_INVALID_REQUIRED.replace("<>", renderTypes(property.types));
9
+ message = message.replace("<>", property.key.full);
10
+ return message;
11
+ }
12
+ function getInvalidTypeMessage(property, actual) {
13
+ let message = VALIDATION_MESSAGE_INVALID_TYPE.replace("<>", renderTypes(property.types));
14
+ message = message.replace("<>", property.key.full);
15
+ message = message.replace("<>", getValueType(actual));
16
+ return message;
17
+ }
18
+ function getInvalidValidatorMessage(property, type, index, length) {
19
+ let message = VALIDATION_MESSAGE_INVALID_VALUE.replace("<>", property.key.full);
20
+ message = message.replace("<>", type);
21
+ if (length > 1) message += VALIDATION_MESSAGE_INVALID_VALUE_SUFFIX.replace("<>", String(index));
22
+ return message;
23
+ }
24
+ function getPropertyType(original) {
25
+ if (typeof original === "function") return "a validated value";
26
+ if (Array.isArray(original)) return `'${TYPE_OBJECT}'`;
27
+ if (isSchematic(original)) return `a ${NAME_SCHEMATIC}`;
28
+ return `'${String(original)}'`;
29
+ }
30
+ function getReporting(value) {
31
+ const type = REPORTING_TYPES.has(value) ? value : REPORTING_NONE;
32
+ return {
33
+ ["all"]: type === "all",
34
+ [REPORTING_FIRST]: type === REPORTING_FIRST,
35
+ [REPORTING_NONE]: type === REPORTING_NONE,
36
+ [REPORTING_THROW]: type === REPORTING_THROW
37
+ };
38
+ }
39
+ function getValueType(value) {
40
+ const valueType = typeof value;
41
+ switch (true) {
42
+ case value === null: return `'${TYPE_NULL}'`;
43
+ case value === void 0: return `'${TYPE_UNDEFINED}'`;
44
+ case valueType !== TYPE_OBJECT: return `'${valueType}'`;
45
+ case Array.isArray(value): return `'${TYPE_ARRAY}'`;
46
+ case isPlainObject(value): return `'${TYPE_OBJECT}'`;
47
+ case isSchematic(value): return `a ${NAME_SCHEMATIC}`;
48
+ default: return value.constructor.name;
49
+ }
50
+ }
4
51
  /**
5
52
  * Creates a validator function for a given constructor
6
53
  * @param constructor - Constructor to check against
@@ -21,5 +68,23 @@ function instanceOf(constructor) {
21
68
  function isSchematic(value) {
22
69
  return typeof value === "object" && value !== null && "$schematic" in value && value["$schematic"] === true;
23
70
  }
71
+ function renderTypes(types) {
72
+ const unique = /* @__PURE__ */ new Set();
73
+ const parts = [];
74
+ for (let index = 0; index < types.length; index += 1) {
75
+ const rendered = getPropertyType(types[index]);
76
+ if (unique.has(rendered)) continue;
77
+ unique.add(rendered);
78
+ parts.push(rendered);
79
+ }
80
+ const { length } = parts;
81
+ let rendered = "";
82
+ for (let index = 0; index < length; index += 1) {
83
+ rendered += parts[index];
84
+ if (index < length - 2) rendered += ", ";
85
+ else if (index === length - 2) rendered += parts.length > 2 ? ", or " : " or ";
86
+ }
87
+ return rendered;
88
+ }
24
89
  //#endregion
25
- export { instanceOf, isSchematic };
90
+ export { getInvalidInputMessage, getInvalidMissingMessage, getInvalidTypeMessage, getInvalidValidatorMessage, getReporting, instanceOf, isSchematic };