@sprucelabs/schema 29.4.60 → 30.0.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 (117) hide show
  1. package/build/.spruce/schemas/fields/fieldClassMap.d.ts +2 -2
  2. package/build/.spruce/schemas/fields/fieldClassMap.js +3 -3
  3. package/build/AbstractEntity.js +1 -0
  4. package/build/AbstractSchemaTest.js +1 -0
  5. package/build/DynamicSchemaEntityImplementation.js +4 -3
  6. package/build/StaticSchemaEntityImpl.js +23 -13
  7. package/build/errors/SpruceError.js +3 -4
  8. package/build/errors/ValidateErrorMessageFormatter.js +11 -8
  9. package/build/esm/.spruce/schemas/fields/fieldClassMap.d.ts +2 -2
  10. package/build/esm/.spruce/schemas/fields/fieldClassMap.js +3 -3
  11. package/build/esm/StaticSchemaEntityImpl.js +6 -2
  12. package/build/esm/errors/ValidateErrorMessageFormatter.js +5 -1
  13. package/build/esm/fields/AddressField.d.ts +1 -1
  14. package/build/esm/fields/AddressField.js +3 -4
  15. package/build/esm/fields/BooleanField.d.ts +1 -1
  16. package/build/esm/fields/BooleanField.js +3 -4
  17. package/build/esm/fields/DateField.d.ts +1 -1
  18. package/build/esm/fields/DateField.js +3 -4
  19. package/build/esm/fields/DateTimeField.d.ts +1 -1
  20. package/build/esm/fields/DateTimeField.js +3 -4
  21. package/build/esm/fields/DirectoryField.d.ts +1 -1
  22. package/build/esm/fields/DirectoryField.js +9 -7
  23. package/build/esm/fields/DurationField.d.ts +1 -1
  24. package/build/esm/fields/DurationField.js +5 -5
  25. package/build/esm/fields/EmailField.d.ts +1 -1
  26. package/build/esm/fields/EmailField.js +3 -4
  27. package/build/esm/fields/FileField.d.ts +1 -1
  28. package/build/esm/fields/FileField.js +3 -4
  29. package/build/esm/fields/IdField.d.ts +1 -1
  30. package/build/esm/fields/IdField.js +3 -4
  31. package/build/esm/fields/ImageField.d.ts +1 -1
  32. package/build/esm/fields/ImageField.js +3 -4
  33. package/build/esm/fields/NumberField.d.ts +1 -1
  34. package/build/esm/fields/NumberField.js +3 -4
  35. package/build/esm/fields/PhoneField.d.ts +1 -1
  36. package/build/esm/fields/PhoneField.js +3 -4
  37. package/build/esm/fields/RawField.d.ts +1 -1
  38. package/build/esm/fields/RawField.js +3 -4
  39. package/build/esm/fields/SchemaField.d.ts +1 -1
  40. package/build/esm/fields/SchemaField.js +23 -13
  41. package/build/esm/fields/SchemaField.types.d.ts +2 -2
  42. package/build/esm/fields/SelectField.d.ts +1 -1
  43. package/build/esm/fields/SelectField.js +3 -4
  44. package/build/esm/fields/TextField.d.ts +1 -1
  45. package/build/esm/fields/TextField.js +7 -5
  46. package/build/esm/fields/field.static.types.d.ts +2 -4
  47. package/build/esm/schemas.static.types.d.ts +3 -10
  48. package/build/esm/tests/validationErrorAssert.utility.d.ts +2 -2
  49. package/build/esm/types/utilities.types.d.ts +4 -4
  50. package/build/esm/utilities/KeyMapper.js +0 -3
  51. package/build/esm/utilities/cloneDeep.js +2 -1
  52. package/build/esm/utilities/formatPhoneNumber.js +4 -2
  53. package/build/esm/utilities/mapFieldErrorsToParameterErrors.js +3 -1
  54. package/build/esm/utilities/registerFieldType.js +1 -3
  55. package/build/esm/utilities/validateSchemaValues.js +1 -3
  56. package/build/fields/AbstractField.js +7 -2
  57. package/build/fields/AddressField.d.ts +1 -1
  58. package/build/fields/AddressField.js +1 -3
  59. package/build/fields/BooleanField.d.ts +1 -1
  60. package/build/fields/BooleanField.js +1 -3
  61. package/build/fields/DateField.d.ts +1 -1
  62. package/build/fields/DateField.js +1 -3
  63. package/build/fields/DateTimeField.d.ts +1 -1
  64. package/build/fields/DateTimeField.js +2 -5
  65. package/build/fields/DirectoryField.d.ts +1 -1
  66. package/build/fields/DirectoryField.js +8 -7
  67. package/build/fields/DurationField.d.ts +1 -1
  68. package/build/fields/DurationField.js +4 -6
  69. package/build/fields/EmailField.d.ts +1 -1
  70. package/build/fields/EmailField.js +1 -3
  71. package/build/fields/FileField.d.ts +1 -1
  72. package/build/fields/FileField.js +3 -6
  73. package/build/fields/IdField.d.ts +1 -1
  74. package/build/fields/IdField.js +1 -3
  75. package/build/fields/ImageField.d.ts +1 -1
  76. package/build/fields/ImageField.js +3 -7
  77. package/build/fields/NumberField.d.ts +1 -1
  78. package/build/fields/NumberField.js +1 -3
  79. package/build/fields/PhoneField.d.ts +1 -1
  80. package/build/fields/PhoneField.js +1 -3
  81. package/build/fields/RawField.d.ts +1 -1
  82. package/build/fields/RawField.js +1 -3
  83. package/build/fields/SchemaField.d.ts +1 -1
  84. package/build/fields/SchemaField.js +28 -16
  85. package/build/fields/SchemaField.types.d.ts +2 -2
  86. package/build/fields/SelectField.d.ts +1 -1
  87. package/build/fields/SelectField.js +1 -3
  88. package/build/fields/TextField.d.ts +1 -1
  89. package/build/fields/TextField.js +6 -6
  90. package/build/fields/field.static.types.d.ts +2 -4
  91. package/build/schemas.static.types.d.ts +3 -10
  92. package/build/singletons/SchemaRegistry.js +4 -6
  93. package/build/tests/AbstractDateFieldTest.js +2 -0
  94. package/build/tests/validationErrorAssert.utility.d.ts +2 -2
  95. package/build/tests/validationErrorAssert.utility.js +2 -3
  96. package/build/types/utilities.types.d.ts +4 -4
  97. package/build/utilities/KeyMapper.js +3 -7
  98. package/build/utilities/areSchemasTheSame.js +2 -3
  99. package/build/utilities/assertOptions.js +1 -1
  100. package/build/utilities/cloneDeep.js +3 -3
  101. package/build/utilities/cloneDeepPreservingInstances.js +1 -2
  102. package/build/utilities/defaultSchemaValues.js +4 -1
  103. package/build/utilities/dropFields.js +3 -1
  104. package/build/utilities/dropPrivateFields.js +3 -1
  105. package/build/utilities/formatPhoneNumber.js +6 -5
  106. package/build/utilities/getFields.js +1 -2
  107. package/build/utilities/isSchemaValid.js +1 -1
  108. package/build/utilities/makeFieldsOptional.js +4 -1
  109. package/build/utilities/mapFieldErrorsToParameterErrors.js +15 -4
  110. package/build/utilities/normalizeFieldValue.js +13 -16
  111. package/build/utilities/normalizePartialSchemaValues.js +4 -1
  112. package/build/utilities/normalizeSchemaValues.js +5 -13
  113. package/build/utilities/registerFieldType.js +15 -6
  114. package/build/utilities/selectChoicesToHash.js +1 -2
  115. package/build/utilities/validateSchema.js +1 -2
  116. package/build/utilities/validateSchemaValues.js +2 -15
  117. package/package.json +11 -11
@@ -6,9 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const SpruceError_1 = __importDefault(require("../errors/SpruceError"));
7
7
  const AbstractField_1 = __importDefault(require("./AbstractField"));
8
8
  class DirectoryField extends AbstractField_1.default {
9
- static get description() {
10
- return 'A way to select entire directories once!';
11
- }
9
+ static description = 'A way to select entire directories once!';
12
10
  static generateTemplateDetails(options) {
13
11
  const { definition } = options;
14
12
  return {
@@ -16,9 +14,11 @@ class DirectoryField extends AbstractField_1.default {
16
14
  };
17
15
  }
18
16
  toValueType(value, options) {
19
- const stringValue = typeof value === 'string' || value.toString ? value.toString() : undefined;
17
+ const stringValue = typeof value === 'string' || value.toString
18
+ ? value.toString()
19
+ : undefined;
20
20
  let path;
21
- const relativeTo = options === null || options === void 0 ? void 0 : options.relativeTo;
21
+ const relativeTo = options?.relativeTo;
22
22
  if (stringValue) {
23
23
  path = stringValue;
24
24
  }
@@ -35,9 +35,10 @@ class DirectoryField extends AbstractField_1.default {
35
35
  });
36
36
  }
37
37
  if (path && relativeTo) {
38
- // eslint-disable-next-line @typescript-eslint/no-var-requires
39
38
  const pathUtil = require('path');
40
- path = pathUtil.relative(relativeTo, path) || path;
39
+ path =
40
+ pathUtil.relative(relativeTo, path) ||
41
+ path;
41
42
  }
42
43
  return { path };
43
44
  }
@@ -7,7 +7,7 @@ import { TextFieldDefinition } from './TextField.types';
7
7
  export declare function reduceDurationToMs(duration: Partial<DurationFieldValue>): number;
8
8
  export declare function buildDuration(value: string | number | Partial<DurationFieldValue>): DurationFieldValue;
9
9
  export default class DurationField extends AbstractField<DurationFieldDefinition> {
10
- static get description(): string;
10
+ static readonly description = "A span of time represented in { hours, minutes, seconds, ms }";
11
11
  static generateTemplateDetails(options: FieldTemplateDetailOptions<DurationFieldDefinition>): FieldTemplateDetails;
12
12
  validate(value: any, _?: ValidateOptions<TextFieldDefinition>): FieldError[];
13
13
  toValueType(value: any): DurationFieldValue;
@@ -27,7 +27,8 @@ function buildDuration(value) {
27
27
  else if (typeof value === 'object') {
28
28
  totalMs += typeof value.ms === 'number' ? value.ms : 0;
29
29
  totalMs += typeof value.seconds === 'number' ? value.seconds * 1000 : 0;
30
- totalMs += typeof value.minutes === 'number' ? value.minutes * 1000 * 60 : 0;
30
+ totalMs +=
31
+ typeof value.minutes === 'number' ? value.minutes * 1000 * 60 : 0;
31
32
  totalMs +=
32
33
  typeof value.hours === 'number' ? value.hours * 1000 * 60 * 60 : 0;
33
34
  }
@@ -48,16 +49,13 @@ function buildDuration(value) {
48
49
  }
49
50
  exports.buildDuration = buildDuration;
50
51
  class DurationField extends AbstractField_1.default {
51
- static get description() {
52
- return 'A span of time represented in { hours, minutes, seconds, ms }';
53
- }
52
+ static description = 'A span of time represented in { hours, minutes, seconds, ms }';
54
53
  static generateTemplateDetails(options) {
55
54
  return {
56
55
  valueType: `${options.importAs}.DurationFieldValue${options.definition.isArray ? '[]' : ''}`,
57
56
  };
58
57
  }
59
58
  validate(value, _) {
60
- var _a;
61
59
  const errors = [];
62
60
  try {
63
61
  buildDuration(value);
@@ -67,7 +65,7 @@ class DurationField extends AbstractField_1.default {
67
65
  code: 'INVALID_PARAMETER',
68
66
  name: this.name,
69
67
  originalError: err,
70
- friendlyMessage: (_a = err.options) === null || _a === void 0 ? void 0 : _a.friendlyMessage,
68
+ friendlyMessage: err.options?.friendlyMessage,
71
69
  });
72
70
  }
73
71
  return errors;
@@ -3,7 +3,7 @@ import AbstractField from './AbstractField';
3
3
  import { EmailFieldDefinition } from './EmailField.types';
4
4
  import { ValidateOptions } from './field.static.types';
5
5
  export default class EmailField extends AbstractField<EmailFieldDefinition> {
6
- static get description(): string;
6
+ static readonly description = "Email support.";
7
7
  static generateTemplateDetails(options: FieldTemplateDetailOptions<EmailFieldDefinition>): FieldTemplateDetails;
8
8
  validate(value: any, options?: ValidateOptions<EmailFieldDefinition>): import("..").FieldError[];
9
9
  }
@@ -29,9 +29,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const EmailValidator = __importStar(require("email-validator"));
30
30
  const AbstractField_1 = __importDefault(require("./AbstractField"));
31
31
  class EmailField extends AbstractField_1.default {
32
- static get description() {
33
- return 'Email support.';
34
- }
32
+ static description = 'Email support.';
35
33
  static generateTemplateDetails(options) {
36
34
  return {
37
35
  valueType: `string${options.definition.isArray ? '[]' : ''}`,
@@ -4,7 +4,7 @@ import AbstractField from './AbstractField';
4
4
  import { ToValueTypeOptions, ValidateOptions } from './field.static.types';
5
5
  import { FileFieldDefinition, FileFieldValue } from './FileField.types';
6
6
  export default class FileField extends AbstractField<FileFieldDefinition> {
7
- static get description(): string;
7
+ static readonly description = "A way to handle files. Supports mime-type lookups.";
8
8
  static generateTemplateDetails(options: FieldTemplateDetailOptions<FileFieldDefinition>): FieldTemplateDetails;
9
9
  validate(value: FileFieldValue, _?: ValidateOptions<FileFieldDefinition>): FieldError[];
10
10
  toValueType<C extends boolean>(value: any, _options?: ToValueTypeOptions<FileFieldDefinition, C>): FileFieldValue;
@@ -5,18 +5,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const AbstractField_1 = __importDefault(require("./AbstractField"));
7
7
  class FileField extends AbstractField_1.default {
8
- static get description() {
9
- return 'A way to handle files. Supports mime-type lookups.';
10
- }
8
+ static description = 'A way to handle files. Supports mime-type lookups.';
11
9
  static generateTemplateDetails(options) {
12
10
  return {
13
11
  valueType: `${options.importAs}.FileFieldValue${options.definition.isArray ? '[]' : ''}`,
14
12
  };
15
13
  }
16
14
  validate(value, _) {
17
- var _a, _b, _c;
18
15
  const errors = super.validate(value);
19
- const acceptableTypes = (_b = (_a = this.definition.options) === null || _a === void 0 ? void 0 : _a.acceptableTypes) !== null && _b !== void 0 ? _b : [];
16
+ const acceptableTypes = this.definition.options?.acceptableTypes ?? [];
20
17
  if (value &&
21
18
  !value.base64 &&
22
19
  acceptableTypes[0] !== '*' &&
@@ -24,7 +21,7 @@ class FileField extends AbstractField_1.default {
24
21
  errors.push({
25
22
  code: 'INVALID_PARAMETER',
26
23
  name: this.name,
27
- friendlyMessage: `You sent a '${value.type}' to '${(_c = this.label) !== null && _c !== void 0 ? _c : this.name}' and it only accepts '${acceptableTypes.join("', '")}'.`,
24
+ friendlyMessage: `You sent a '${value.type}' to '${this.label ?? this.name}' and it only accepts '${acceptableTypes.join("', '")}'.`,
28
25
  });
29
26
  }
30
27
  return errors;
@@ -2,7 +2,7 @@ import { FieldTemplateDetailOptions, FieldTemplateDetails } from '../types/templ
2
2
  import AbstractField from './AbstractField';
3
3
  import { IdFieldDefinition } from './IdField.types';
4
4
  export default class IdField extends AbstractField<IdFieldDefinition> {
5
- static get description(): string;
5
+ static readonly description = "A unique identifier field.";
6
6
  static generateTemplateDetails(options: FieldTemplateDetailOptions<IdFieldDefinition>): FieldTemplateDetails;
7
7
  toValueType(value: any): string;
8
8
  }
@@ -5,9 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const AbstractField_1 = __importDefault(require("./AbstractField"));
7
7
  class IdField extends AbstractField_1.default {
8
- static get description() {
9
- return 'A unique identifier field.';
10
- }
8
+ static description = 'A unique identifier field.';
11
9
  static generateTemplateDetails(options) {
12
10
  return {
13
11
  valueType: `string${options.definition.isArray ? '[]' : ''}`,
@@ -3,7 +3,7 @@ import AbstractField from './AbstractField';
3
3
  import { ImageFieldDefinition } from './ImageField.types';
4
4
  export default class ImageField extends AbstractField<ImageFieldDefinition> {
5
5
  static generateTemplateDetails(options: FieldTemplateDetailOptions<ImageFieldDefinition>): FieldTemplateDetails;
6
- static get description(): string;
6
+ static readonly description = "Images of various sizes!";
7
7
  validate(value: any): import("..").FieldError[];
8
8
  private getRequiredSizes;
9
9
  }
@@ -12,11 +12,8 @@ class ImageField extends AbstractField_1.default {
12
12
  valueType: `${importAs}.ImageFieldValue${definition.isArray ? '[]' : ''}`,
13
13
  };
14
14
  }
15
- static get description() {
16
- return 'Images of various sizes!';
17
- }
15
+ static description = 'Images of various sizes!';
18
16
  validate(value) {
19
- var _a;
20
17
  const errors = super.validate(value);
21
18
  if (value && errors.length === 0 && !value.base64) {
22
19
  let sizes = this.getRequiredSizes();
@@ -32,15 +29,14 @@ class ImageField extends AbstractField_1.default {
32
29
  errors.push({
33
30
  code: 'INVALID_PARAMETER',
34
31
  name: this.name,
35
- friendlyMessage: `You need to supply the remaining sizes to upload an image to ${(_a = this.label) !== null && _a !== void 0 ? _a : this.name}: '${missing.join("', '")}'`,
32
+ friendlyMessage: `You need to supply the remaining sizes to upload an image to ${this.label ?? this.name}: '${missing.join("', '")}'`,
36
33
  });
37
34
  }
38
35
  }
39
36
  return errors;
40
37
  }
41
38
  getRequiredSizes() {
42
- var _a, _b;
43
- let sizes = (_b = (_a = this.definition.options) === null || _a === void 0 ? void 0 : _a.requiredSizes) !== null && _b !== void 0 ? _b : [];
39
+ let sizes = this.definition.options?.requiredSizes ?? [];
44
40
  if (sizes[0] === '*') {
45
41
  sizes = ImageField_types_1.requiredImageSizes.filter((s) => s !== '*');
46
42
  }
@@ -3,7 +3,7 @@ import { FieldTemplateDetailOptions, FieldTemplateDetails } from '../types/templ
3
3
  import AbstractField from './AbstractField';
4
4
  import { NumberFieldDefinition } from './NumberField.types';
5
5
  export default class NumberField extends AbstractField<NumberFieldDefinition> {
6
- static get description(): string;
6
+ static readonly description = "Handles all types of numbers with min/max and clamp support";
7
7
  static generateTemplateDetails(options: FieldTemplateDetailOptions<NumberFieldDefinition>): FieldTemplateDetails;
8
8
  toValueType(value: any): number;
9
9
  private buildNaNError;
@@ -6,9 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const SpruceError_1 = __importDefault(require("../errors/SpruceError"));
7
7
  const AbstractField_1 = __importDefault(require("./AbstractField"));
8
8
  class NumberField extends AbstractField_1.default {
9
- static get description() {
10
- return 'Handles all types of numbers with min/max and clamp support';
11
- }
9
+ static description = 'Handles all types of numbers with min/max and clamp support';
12
10
  static generateTemplateDetails(options) {
13
11
  return {
14
12
  valueType: `number${options.definition.isArray ? '[]' : ''}`,
@@ -3,7 +3,7 @@ import AbstractField from './AbstractField';
3
3
  import { ValidateOptions } from './field.static.types';
4
4
  import { PhoneFieldDefinition } from './PhoneField.types';
5
5
  export default class PhoneField extends AbstractField<PhoneFieldDefinition> {
6
- static get description(): string;
6
+ static readonly description = "Takes anything close to a phone number and formats it. Also great at validating numbers.";
7
7
  static generateTemplateDetails(options: FieldTemplateDetailOptions<PhoneFieldDefinition>): FieldTemplateDetails;
8
8
  toValueType(value: any): string;
9
9
  validate(value: any, options?: ValidateOptions<PhoneFieldDefinition>): import("..").FieldError[];
@@ -29,9 +29,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const formatPhoneNumber_1 = __importStar(require("../utilities/formatPhoneNumber"));
30
30
  const AbstractField_1 = __importDefault(require("./AbstractField"));
31
31
  class PhoneField extends AbstractField_1.default {
32
- static get description() {
33
- return 'Takes anything close to a phone number and formats it. Also great at validating numbers.';
34
- }
32
+ static description = 'Takes anything close to a phone number and formats it. Also great at validating numbers.';
35
33
  static generateTemplateDetails(options) {
36
34
  return {
37
35
  valueType: `string${options.definition.isArray ? '[]' : ''}`,
@@ -2,6 +2,6 @@ import { FieldTemplateDetailOptions, FieldTemplateDetails } from '../types/templ
2
2
  import AbstractField from './AbstractField';
3
3
  import { RawFieldDefinition } from './RawField.types';
4
4
  export default class RawField extends AbstractField<RawFieldDefinition> {
5
- static get description(): string;
5
+ static readonly description = "Set an interface directly.";
6
6
  static generateTemplateDetails(options: FieldTemplateDetailOptions<RawFieldDefinition>): FieldTemplateDetails;
7
7
  }
@@ -5,9 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const AbstractField_1 = __importDefault(require("./AbstractField"));
7
7
  class RawField extends AbstractField_1.default {
8
- static get description() {
9
- return 'Set an interface directly.';
10
- }
8
+ static description = 'Set an interface directly.';
11
9
  static generateTemplateDetails(options) {
12
10
  return {
13
11
  valueType: `(${options.definition.options.valueType})${options.definition.isArray ? '[]' : ''}`,
@@ -5,7 +5,7 @@ import AbstractField from './AbstractField';
5
5
  import { ValidateOptions, ToValueTypeOptions, FieldDefinitionValueType } from './field.static.types';
6
6
  import { SchemaFieldFieldDefinition } from './SchemaField.types';
7
7
  export default class SchemaField<F extends SchemaFieldFieldDefinition = SchemaFieldFieldDefinition> extends AbstractField<F> {
8
- static get description(): string;
8
+ static readonly description = "A way to map relationships.";
9
9
  static mapFieldDefinitionToSchemasOrIdsWithVersion(field: SchemaFieldFieldDefinition): (SchemaIdWithVersion | Schema)[];
10
10
  static mapFieldDefinitionToSchemaIdsWithVersion(field: SchemaFieldFieldDefinition): SchemaIdWithVersion[];
11
11
  static generateTypeDetails(): {
@@ -14,9 +14,7 @@ const normalizeSchemaToIdWithVersion_1 = __importDefault(require("../utilities/n
14
14
  const validateSchema_1 = __importDefault(require("../utilities/validateSchema"));
15
15
  const AbstractField_1 = __importDefault(require("./AbstractField"));
16
16
  class SchemaField extends AbstractField_1.default {
17
- static get description() {
18
- return 'A way to map relationships.';
19
- }
17
+ static description = 'A way to map relationships.';
20
18
  static mapFieldDefinitionToSchemasOrIdsWithVersion(field) {
21
19
  const { options } = field;
22
20
  const schemasOrIds = [
@@ -75,7 +73,7 @@ class SchemaField extends AbstractField_1.default {
75
73
  if (!item.namespace) {
76
74
  throwInvalidReferenceError(item);
77
75
  }
78
- return item.namespace.toLowerCase() === namespace.toLowerCase();
76
+ return (item.namespace.toLowerCase() === namespace.toLowerCase());
79
77
  });
80
78
  }
81
79
  let matchedTemplateItem;
@@ -102,7 +100,8 @@ class SchemaField extends AbstractField_1.default {
102
100
  valueType = `${globalNamespace}.${matchedTemplateItem.namespace}${version ? `.${version}` : ''}${renderAs === template_types_1.TemplateRenderAs.Type
103
101
  ? `.${matchedTemplateItem.namePascal + typeSuffix}`
104
102
  : `.${matchedTemplateItem.namePascal}Schema`}`;
105
- if (renderAs === template_types_1.TemplateRenderAs.Type && idsWithVersion.length > 1) {
103
+ if (renderAs === template_types_1.TemplateRenderAs.Type &&
104
+ idsWithVersion.length > 1) {
106
105
  valueType = `{ schemaId: '${id}'${version ? `, version: '${version}'` : ''}, values: ${valueType} }`;
107
106
  }
108
107
  }
@@ -115,7 +114,7 @@ class SchemaField extends AbstractField_1.default {
115
114
  throw new SpruceError_1.default({
116
115
  code: 'SCHEMA_NOT_FOUND',
117
116
  schemaId: id,
118
- friendlyMessage: `Template generation failed. I could not find a schema that was being referenced. I was looking for a schema with the id of '${id}' and namespace '${namespace !== null && namespace !== void 0 ? namespace : '**missing**'}'.`,
117
+ friendlyMessage: `Template generation failed. I could not find a schema that was being referenced. I was looking for a schema with the id of '${id}' and namespace '${namespace ?? '**missing**'}'.`,
119
118
  });
120
119
  }
121
120
  });
@@ -124,11 +123,14 @@ class SchemaField extends AbstractField_1.default {
124
123
  valueType =
125
124
  unions.length === 1
126
125
  ? unions[0].valueType
127
- : '[' + unions.map((item) => item.valueType).join(', ') + ']';
126
+ : '[' +
127
+ unions.map((item) => item.valueType).join(', ') +
128
+ ']';
128
129
  }
129
130
  else {
130
131
  valueType = unions.map((item) => item.valueType).join(' | ');
131
- valueType = `${(definition.isArray || renderAs === template_types_1.TemplateRenderAs.SchemaType) &&
132
+ valueType = `${(definition.isArray ||
133
+ renderAs === template_types_1.TemplateRenderAs.SchemaType) &&
132
134
  unions.length > 1
133
135
  ? `(${valueType})`
134
136
  : `${valueType}`}${(definition.isArray && renderAs === template_types_1.TemplateRenderAs.Type) ||
@@ -154,7 +156,6 @@ class SchemaField extends AbstractField_1.default {
154
156
  return schemas;
155
157
  }
156
158
  validate(value, options) {
157
- var _a;
158
159
  const errors = super.validate(value, options);
159
160
  // do not validate schemas by default, very heavy and only needed when explicitly asked to
160
161
  if (value instanceof AbstractEntity_1.default) {
@@ -176,7 +177,7 @@ class SchemaField extends AbstractField_1.default {
176
177
  errors.push({
177
178
  code: 'INVALID_PARAMETER',
178
179
  name: this.name,
179
- friendlyMessage: `${(_a = this.label) !== null && _a !== void 0 ? _a : this.name} must be an object!`,
180
+ friendlyMessage: `${this.label ?? this.name} must be an object!`,
180
181
  });
181
182
  }
182
183
  else {
@@ -209,7 +210,8 @@ class SchemaField extends AbstractField_1.default {
209
210
  name: this.name,
210
211
  label: this.label,
211
212
  code: 'INVALID_PARAMETER',
212
- friendlyMessage: 'You need to add `values` to the value of ' + this.name,
213
+ friendlyMessage: 'You need to add `values` to the value of ' +
214
+ this.name,
213
215
  });
214
216
  }
215
217
  else if (!schemaId) {
@@ -217,17 +219,21 @@ class SchemaField extends AbstractField_1.default {
217
219
  name: this.name,
218
220
  label: this.label,
219
221
  code: 'INVALID_PARAMETER',
220
- friendlyMessage: 'You need to add `schemaId` to the value of ' + this.name,
222
+ friendlyMessage: 'You need to add `schemaId` to the value of ' +
223
+ this.name,
221
224
  });
222
225
  }
223
226
  else {
224
- const matchSchema = schemas.find((schema) => schema.id === schemaId && schema.version === version);
227
+ const matchSchema = schemas.find((schema) => schema.id === schemaId &&
228
+ schema.version === version);
225
229
  if (!matchSchema) {
226
230
  errors.push({
227
231
  name: this.name,
228
232
  label: this.label,
229
233
  code: 'INVALID_PARAMETER',
230
- friendlyMessage: `Could not find a schema by id '${schemaId}'${version ? ` and version '${version}'` : ' with no version'}.`,
234
+ friendlyMessage: `Could not find a schema by id '${schemaId}'${version
235
+ ? ` and version '${version}'`
236
+ : ' with no version'}.`,
231
237
  });
232
238
  }
233
239
  else {
@@ -272,7 +278,9 @@ class SchemaField extends AbstractField_1.default {
272
278
  }
273
279
  const { createEntityInstances, schemasById: schemasById = {} } = options || {};
274
280
  // try and pull the schema definition from the options and by id
275
- const destinationSchemas = SchemaField.mapFieldDefinitionToSchemas(this.definition, { schemasById });
281
+ const destinationSchemas = SchemaField.mapFieldDefinitionToSchemas(this.definition, {
282
+ schemasById,
283
+ });
276
284
  const isUnion = destinationSchemas.length > 1;
277
285
  let instance;
278
286
  if (value instanceof AbstractEntity_1.default) {
@@ -315,7 +323,11 @@ class SchemaField extends AbstractField_1.default {
315
323
  if (createEntityInstances) {
316
324
  return instance;
317
325
  }
318
- const getValueOptions = Object.assign(Object.assign({ validate: false }, options), { fields: undefined });
326
+ const getValueOptions = {
327
+ validate: false,
328
+ ...options,
329
+ fields: undefined,
330
+ };
319
331
  if (isUnion) {
320
332
  return {
321
333
  schemaId: instance.schemaId,
@@ -15,14 +15,14 @@ export interface SchemaFieldOptions {
15
15
  /** Dropped in after the type. Used to generate generics, like <T> */
16
16
  typeSuffix?: string;
17
17
  }
18
- export type SchemaFieldUnion<S extends Array<Schema>, CreateEntityInstances extends boolean = false> = {
18
+ export type SchemaFieldUnion<S extends Schema[], CreateEntityInstances extends boolean = false> = {
19
19
  [K in keyof S]: S[K] extends Schema ? CreateEntityInstances extends true ? StaticSchemaEntity<S[K]> : {
20
20
  schemaId: S[K]['id'];
21
21
  version?: S[K]['version'];
22
22
  values: SchemaValues<S[K]>;
23
23
  } : any;
24
24
  };
25
- export type SchemaFieldValueTypeMapper<F extends SchemaFieldFieldDefinition, CreateEntityInstances extends boolean = false, ShouldIncludeNullAndUndefinedFields extends boolean = false> = F['options']['schemas'] extends Array<Schema> ? IsArrayNoUnpack<SchemaFieldUnion<F['options']['schemas'], CreateEntityInstances>[number], F['isArray']> : F['options']['schema'] extends Schema ? CreateEntityInstances extends true ? IsArray<StaticSchemaEntity<F['options']['schema']>, F['isArray']> : IsArray<SchemaValues<F['options']['schema'], false, true, ShouldIncludeNullAndUndefinedFields>, F['isArray']> : any;
25
+ export type SchemaFieldValueTypeMapper<F extends SchemaFieldFieldDefinition, CreateEntityInstances extends boolean = false, ShouldIncludeNullAndUndefinedFields extends boolean = false> = F['options']['schemas'] extends Schema[] ? IsArrayNoUnpack<SchemaFieldUnion<F['options']['schemas'], CreateEntityInstances>[number], F['isArray']> : F['options']['schema'] extends Schema ? CreateEntityInstances extends true ? IsArray<StaticSchemaEntity<F['options']['schema']>, F['isArray']> : IsArray<SchemaValues<F['options']['schema'], false, true, ShouldIncludeNullAndUndefinedFields>, F['isArray']> : any;
26
26
  export type SchemaFieldFieldDefinition = FieldDefinition<Record<string, any>, Record<string, any>, SchemaFieldValueUnion[], SchemaFieldValueUnion[]> & {
27
27
  /** * .Schema go team! */
28
28
  type: 'schema';
@@ -3,7 +3,7 @@ import { FieldTemplateDetailOptions, FieldTemplateDetails } from '../types/templ
3
3
  import AbstractField from './AbstractField';
4
4
  import { SelectFieldDefinition, SelectChoice } from './SelectField.types';
5
5
  export default class SelectField<T extends SelectFieldDefinition = SelectFieldDefinition> extends AbstractField<T> {
6
- static get description(): string;
6
+ static readonly description = "Stored as string, lets user select between available options.";
7
7
  constructor(name: string, definition: T);
8
8
  static generateTypeDetails(): {
9
9
  valueTypeMapper: string;
@@ -6,9 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const selectChoicesToHash_1 = require("../utilities/selectChoicesToHash");
7
7
  const AbstractField_1 = __importDefault(require("./AbstractField"));
8
8
  class SelectField extends AbstractField_1.default {
9
- static get description() {
10
- return 'Stored as string, lets user select between available options.';
11
- }
9
+ static description = 'Stored as string, lets user select between available options.';
12
10
  constructor(name, definition) {
13
11
  super(name, definition);
14
12
  if (!definition.options || !definition.options.choices) {
@@ -4,7 +4,7 @@ import AbstractField from './AbstractField';
4
4
  import { ToValueTypeOptions, ValidateOptions } from './field.static.types';
5
5
  import { TextFieldDefinition } from './TextField.types';
6
6
  export default class TextField extends AbstractField<TextFieldDefinition> {
7
- static get description(): string;
7
+ static readonly description = "A text field. Converts non-strings into strings by calling toString(). Size set by options.";
8
8
  static generateTemplateDetails(options: FieldTemplateDetailOptions<TextFieldDefinition>): FieldTemplateDetails;
9
9
  validate(value: any, options: ValidateOptions<TextFieldDefinition>): FieldError[];
10
10
  toValueType<C extends boolean>(value: any, options?: ToValueTypeOptions<TextFieldDefinition, C>): string;
@@ -6,9 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const SpruceError_1 = __importDefault(require("../errors/SpruceError"));
7
7
  const AbstractField_1 = __importDefault(require("./AbstractField"));
8
8
  class TextField extends AbstractField_1.default {
9
- static get description() {
10
- return 'A text field. Converts non-strings into strings by calling toString(). Size set by options.';
11
- }
9
+ static description = 'A text field. Converts non-strings into strings by calling toString(). Size set by options.';
12
10
  static generateTemplateDetails(options) {
13
11
  const { definition } = options;
14
12
  return {
@@ -37,10 +35,9 @@ class TextField extends AbstractField_1.default {
37
35
  return errors;
38
36
  }
39
37
  toValueType(value, options) {
40
- var _a;
41
38
  let transformed = this.convertToString(value);
42
39
  if (typeof transformed === 'string') {
43
- const maxLength = (_a = options === null || options === void 0 ? void 0 : options.maxLength) !== null && _a !== void 0 ? _a : 0;
40
+ const maxLength = options?.maxLength ?? 0;
44
41
  if (maxLength > 0 && transformed.length > maxLength) {
45
42
  transformed = transformed.substr(0, maxLength);
46
43
  }
@@ -64,7 +61,10 @@ class TextField extends AbstractField_1.default {
64
61
  convertToString(value) {
65
62
  return typeof value === 'string'
66
63
  ? value
67
- : typeof value === 'number' && value && value.toString && value.toString();
64
+ : typeof value === 'number' &&
65
+ value &&
66
+ value.toString &&
67
+ value.toString();
68
68
  }
69
69
  }
70
70
  exports.default = TextField;
@@ -2,10 +2,8 @@ import { FieldDefinitions, FieldMap, FieldValueTypeGeneratorMap } from "./../.sp
2
2
  import { FieldError } from '../errors/options.types';
3
3
  import { Schema, SchemaFieldsByName, SchemaValues, StaticSchemaEntity } from '../schemas.static.types';
4
4
  import { Unpack, IsArray, IsRequired } from '../types/utilities.types';
5
- export interface SchemasById {
6
- [id: string]: Schema[];
7
- }
8
- export type SchemaFieldUnion<S extends Array<Schema>, CreateEntityInstances extends boolean = false> = {
5
+ export type SchemasById = Record<string, Schema[]>;
6
+ export type SchemaFieldUnion<S extends Schema[], CreateEntityInstances extends boolean = false> = {
9
7
  [K in keyof S]: S[K] extends Schema ? CreateEntityInstances extends true ? StaticSchemaEntity<S[K]> : {
10
8
  schemaId: S[K]['id'];
11
9
  version?: S[K]['version'];
@@ -39,9 +39,7 @@ export interface DynamicSchemaEntityByName<ISchema extends Schema, OurField exte
39
39
  validate(options?: DynamicSchemaValidateOptions): void;
40
40
  isValid(options?: DynamicSchemaValidateOptions): boolean;
41
41
  }
42
- export interface SchemaFieldsByName {
43
- [fieldName: string]: FieldDefinitions;
44
- }
42
+ export type SchemaFieldsByName = Record<string, FieldDefinitions>;
45
43
  export interface Schema {
46
44
  id: string;
47
45
  name?: string;
@@ -70,18 +68,13 @@ export type SchemaAllValues<S extends Schema, CreateEntityInstances extends bool
70
68
  export type StaticSchemaAllValues<S extends Schema, CreateEntityInstances extends boolean = false> = {
71
69
  [K in SchemaFieldNames<S>]-?: SchemaFieldValueType<S, K, CreateEntityInstances>;
72
70
  };
73
- export type DynamicSchemaAllValues<S extends Schema, CreateEntityInstances extends boolean = false> = {
74
- [dynamicKey: string]: S['dynamicFieldSignature'] extends FieldDefinitions ? FieldDefinitionValueType<S['dynamicFieldSignature'], CreateEntityInstances> : never;
75
- };
71
+ export type DynamicSchemaAllValues<S extends Schema, CreateEntityInstances extends boolean = false> = Record<string, S['dynamicFieldSignature'] extends FieldDefinitions ? FieldDefinitionValueType<S['dynamicFieldSignature'], CreateEntityInstances> : never>;
76
72
  export type SchemaPartialValues<S extends Schema, CreateEntityInstances extends boolean = false> = IsDynamicSchema<S> extends true ? DynamicSchemaPartialValues<S, CreateEntityInstances> : StaticSchemaPartialValues<S, CreateEntityInstances>;
77
73
  export type StaticSchemaPartialValues<T extends Schema, CreateEntityInstances extends boolean = false> = {
78
74
  [K in SchemaFieldNames<T>]?: SchemaFieldValueType<T, K, CreateEntityInstances> | undefined | null;
79
75
  };
80
- export type DynamicSchemaPartialValues<S extends Schema, CreateEntityInstances extends boolean = false> = Partial<{
81
- [dynamicField: string]: S['dynamicFieldSignature'] extends FieldDefinitions ? FieldDefinitionValueType<S['dynamicFieldSignature'], CreateEntityInstances> | undefined | null : never;
82
- }>;
76
+ export type DynamicSchemaPartialValues<S extends Schema, CreateEntityInstances extends boolean = false> = Partial<Record<string, S['dynamicFieldSignature'] extends FieldDefinitions ? FieldDefinitionValueType<S['dynamicFieldSignature'], CreateEntityInstances> | undefined | null : never>>;
83
77
  export type SchemaStaticValues<T extends Schema, CreateEntityInstances extends boolean = false, K extends SchemaOptionalFieldNames<T> = SchemaOptionalFieldNames<T>, V extends SchemaAllValues<T, CreateEntityInstances> = SchemaAllValues<T, CreateEntityInstances>> = Omit<V, K> & Partial<Pick<V, K>>;
84
- export type SchemaValues_OLD<S extends Schema, CreateEntityInstances extends boolean = false> = IsDynamicSchema<S> extends true ? DynamicSchemaAllValues<S> : SchemaStaticValues<S, CreateEntityInstances>;
85
78
  export type IsDynamicSchema<S extends Schema> = S['dynamicFieldSignature'] extends FieldDefinitions ? true : false;
86
79
  export type SchemaDefaultValues<S extends Schema, CreateEntityInstances extends boolean = false, K extends SchemaFieldNamesWithDefaultValue<S> = SchemaFieldNamesWithDefaultValue<S>, V extends SchemaAllValues<S, CreateEntityInstances> = SchemaAllValues<S, CreateEntityInstances>> = {
87
80
  [F in K]: NonNullable<V[F]>;
@@ -6,9 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const SpruceError_1 = __importDefault(require("../errors/SpruceError"));
7
7
  const validateSchema_1 = __importDefault(require("../utilities/validateSchema"));
8
8
  class SchemaRegistry {
9
- constructor() {
10
- this.schemasById = {};
11
- }
9
+ schemasById = {};
10
+ static instance;
12
11
  static getInstance() {
13
12
  if (!this.instance) {
14
13
  this.instance = new SchemaRegistry();
@@ -84,9 +83,8 @@ class SchemaRegistry {
84
83
  return true;
85
84
  }
86
85
  forgetSchema(id, version) {
87
- var _a, _b;
88
- this.schemasById[id] = (_a = this.schemasById[id]) === null || _a === void 0 ? void 0 : _a.filter((schema) => !(schema.id === id && schema.version === version));
89
- if (((_b = this.schemasById[id]) === null || _b === void 0 ? void 0 : _b.length) === 0) {
86
+ this.schemasById[id] = this.schemasById[id]?.filter((schema) => !(schema.id === id && schema.version === version));
87
+ if (this.schemasById[id]?.length === 0) {
90
88
  delete this.schemasById[id];
91
89
  }
92
90
  }
@@ -8,6 +8,8 @@ const __1 = require("..");
8
8
  const AbstractSchemaTest_1 = __importDefault(require("../AbstractSchemaTest"));
9
9
  const SchemaEntityFactory_1 = __importDefault(require("../factories/SchemaEntityFactory"));
10
10
  class AbstractDateFieldTest extends AbstractSchemaTest_1.default {
11
+ static schema;
12
+ static entity;
11
13
  static async beforeEach() {
12
14
  await super.beforeEach();
13
15
  this.entity = SchemaEntityFactory_1.default.Entity(this.schema);
@@ -1,8 +1,8 @@
1
- type ValidationErrorAssertOptions = {
1
+ interface ValidationErrorAssertOptions {
2
2
  missing?: string[];
3
3
  invalid?: string[];
4
4
  unexpected?: string[];
5
- };
5
+ }
6
6
  export type ValidationErrorAssertOptionsKey = keyof ValidationErrorAssertOptions;
7
7
  declare const validationErrorAssert: {
8
8
  assertError(error: any, options: ValidationErrorAssertOptions): void;