@sprucelabs/schema 29.4.59 → 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 +12 -12
@@ -4,16 +4,16 @@ import DateField from '../../../fields/DateField';
4
4
  import DateTimeField from '../../../fields/DateTimeField';
5
5
  import DirectoryField from '../../../fields/DirectoryField';
6
6
  import DurationField from '../../../fields/DurationField';
7
+ import EmailField from '../../../fields/EmailField';
7
8
  import FileField from '../../../fields/FileField';
8
9
  import IdField from '../../../fields/IdField';
10
+ import ImageField from '../../../fields/ImageField';
9
11
  import NumberField from '../../../fields/NumberField';
10
12
  import PhoneField from '../../../fields/PhoneField';
11
13
  import RawField from '../../../fields/RawField';
12
14
  import SchemaField from '../../../fields/SchemaField';
13
15
  import SelectField from '../../../fields/SelectField';
14
16
  import TextField from '../../../fields/TextField';
15
- import EmailField from '../../../fields/EmailField';
16
- import ImageField from '../../../fields/ImageField';
17
17
  declare const fieldClassMap: {
18
18
  readonly boolean: typeof BooleanField;
19
19
  readonly select: typeof SelectField;
@@ -9,16 +9,16 @@ const DateField_1 = __importDefault(require("../../../fields/DateField"));
9
9
  const DateTimeField_1 = __importDefault(require("../../../fields/DateTimeField"));
10
10
  const DirectoryField_1 = __importDefault(require("../../../fields/DirectoryField"));
11
11
  const DurationField_1 = __importDefault(require("../../../fields/DurationField"));
12
+ const EmailField_1 = __importDefault(require("../../../fields/EmailField"));
12
13
  const FileField_1 = __importDefault(require("../../../fields/FileField"));
13
14
  const IdField_1 = __importDefault(require("../../../fields/IdField"));
15
+ const ImageField_1 = __importDefault(require("../../../fields/ImageField"));
14
16
  const NumberField_1 = __importDefault(require("../../../fields/NumberField"));
15
17
  const PhoneField_1 = __importDefault(require("../../../fields/PhoneField"));
16
18
  const RawField_1 = __importDefault(require("../../../fields/RawField"));
17
19
  const SchemaField_1 = __importDefault(require("../../../fields/SchemaField"));
18
20
  const SelectField_1 = __importDefault(require("../../../fields/SelectField"));
19
21
  const TextField_1 = __importDefault(require("../../../fields/TextField"));
20
- const EmailField_1 = __importDefault(require("../../../fields/EmailField"));
21
- const ImageField_1 = __importDefault(require("../../../fields/ImageField"));
22
22
  const fieldClassMap = {
23
23
  boolean: BooleanField_1.default,
24
24
  select: SelectField_1.default,
@@ -35,6 +35,6 @@ const fieldClassMap = {
35
35
  date: DateField_1.default,
36
36
  directory: DirectoryField_1.default,
37
37
  email: EmailField_1.default,
38
- image: ImageField_1.default
38
+ image: ImageField_1.default,
39
39
  };
40
40
  exports.default = fieldClassMap;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  class AbstractEntity {
4
+ schema;
4
5
  get schemaId() {
5
6
  return this.schema.id;
6
7
  }
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const test_utils_1 = __importDefault(require("@sprucelabs/test-utils"));
7
7
  const _1 = require(".");
8
8
  class AbstractSchemaTest extends test_utils_1.default {
9
+ static registry;
9
10
  static async beforeEach() {
10
11
  await super.beforeEach();
11
12
  this.registry = _1.SchemaRegistry.getInstance();
@@ -8,9 +8,10 @@ const SpruceError_1 = __importDefault(require("./errors/SpruceError"));
8
8
  const FieldFactory_1 = __importDefault(require("./factories/FieldFactory"));
9
9
  const normalizeFieldValue_1 = __importDefault(require("./utilities/normalizeFieldValue"));
10
10
  class DynamicSchemaEntityImplementation extends AbstractEntity_1.default {
11
+ values = {};
12
+ dynamicField;
11
13
  constructor(schema, values) {
12
14
  super(schema);
13
- this.values = {};
14
15
  if (!schema.dynamicFieldSignature) {
15
16
  throw new Error(`DynamicSchemaEntity only works with with schemas with dynamicFieldSignature set.`);
16
17
  }
@@ -51,7 +52,7 @@ class DynamicSchemaEntityImplementation extends AbstractEntity_1.default {
51
52
  this.validate(options);
52
53
  return true;
53
54
  }
54
- catch (_a) {
55
+ catch {
55
56
  return false;
56
57
  }
57
58
  }
@@ -70,7 +71,7 @@ class DynamicSchemaEntityImplementation extends AbstractEntity_1.default {
70
71
  return values;
71
72
  }
72
73
  setValues(values) {
73
- this.values = Object.assign(Object.assign({}, this.values), values);
74
+ this.values = { ...this.values, ...values };
74
75
  return this;
75
76
  }
76
77
  getNamedFields(options = {}) {
@@ -32,13 +32,19 @@ const FieldFactory_1 = __importDefault(require("./factories/FieldFactory"));
32
32
  const cloneDeepPreservingInstances_1 = __importDefault(require("./utilities/cloneDeepPreservingInstances"));
33
33
  const normalizeFieldValue_1 = __importStar(require("./utilities/normalizeFieldValue"));
34
34
  class StaticSchemaEntityImpl extends AbstractEntity_1.default {
35
+ static enableDuplicateCheckWhenTracking = true;
36
+ schema;
37
+ values = {};
38
+ fields;
35
39
  constructor(schema, values) {
36
40
  super(schema);
37
- this.values = {};
38
41
  this.schema = schema;
39
42
  this.fields = {};
40
43
  this.buildFields();
41
- const v = Object.assign(Object.assign({}, this.values), values);
44
+ const v = {
45
+ ...this.values,
46
+ ...values,
47
+ };
42
48
  this.values = (0, cloneDeepPreservingInstances_1.default)(v);
43
49
  }
44
50
  buildFields() {
@@ -56,13 +62,17 @@ class StaticSchemaEntityImpl extends AbstractEntity_1.default {
56
62
  });
57
63
  }
58
64
  normalizeValue(forField, value, options) {
59
- var _a, _b;
60
65
  const field = this.fields[forField];
61
- const overrideOptions = Object.assign(Object.assign({}, (options !== null && options !== void 0 ? options : {})), ((_b = (_a = options === null || options === void 0 ? void 0 : options.byField) === null || _a === void 0 ? void 0 : _a[forField]) !== null && _b !== void 0 ? _b : {}));
66
+ const overrideOptions = {
67
+ ...(options ?? {}),
68
+ ...(options?.byField?.[forField] ?? {}),
69
+ };
62
70
  return (0, normalizeFieldValue_1.default)(this.schemaId, this.name, {}, field, value, overrideOptions);
63
71
  }
64
72
  get(fieldName, options = {}) {
65
- const value = this.values[fieldName] !== undefined ? this.values[fieldName] : undefined;
73
+ const value = this.values[fieldName] !== undefined
74
+ ? this.values[fieldName]
75
+ : undefined;
66
76
  return this.normalizeValue(fieldName, value, options);
67
77
  }
68
78
  set(fieldName, value, options = {}) {
@@ -75,7 +85,7 @@ class StaticSchemaEntityImpl extends AbstractEntity_1.default {
75
85
  this.validate(options);
76
86
  return true;
77
87
  }
78
- catch (_a) {
88
+ catch {
79
89
  return false;
80
90
  }
81
91
  }
@@ -105,23 +115,24 @@ class StaticSchemaEntityImpl extends AbstractEntity_1.default {
105
115
  });
106
116
  }
107
117
  this.getNamedFields(options).forEach((namedField) => {
108
- var _a, _b, _c, _d;
109
118
  const { name, field } = namedField;
110
119
  let valueAsArray = (0, normalizeFieldValue_1.normalizeValueToArray)(this.values[name]);
111
120
  if (field.isRequired &&
112
121
  field.isArray &&
113
122
  (!this.values[name] ||
114
- valueAsArray.length < ((_a = field.minArrayLength) !== null && _a !== void 0 ? _a : 1))) {
123
+ valueAsArray.length < (field.minArrayLength ?? 1))) {
115
124
  errors.push({
116
- code: !this.values[name] ? 'MISSING_PARAMETER' : 'INVALID_PARAMETER',
125
+ code: !this.values[name]
126
+ ? 'MISSING_PARAMETER'
127
+ : 'INVALID_PARAMETER',
117
128
  name,
118
129
  friendlyMessage: !this.values[name]
119
- ? `'${(_b = field.label) !== null && _b !== void 0 ? _b : field.name}' is required!`
120
- : `'${(_c = field.label) !== null && _c !== void 0 ? _c : field.name}' must have at least ${field.minArrayLength} value${field.minArrayLength === 1 ? '' : 's'}. I found ${valueAsArray.length}!`,
130
+ ? `'${field.label ?? field.name}' is required!`
131
+ : `'${field.label ?? field.name}' must have at least ${field.minArrayLength} value${field.minArrayLength === 1 ? '' : 's'}. I found ${valueAsArray.length}!`,
121
132
  });
122
133
  }
123
134
  else {
124
- if ((!field.isArray || ((_d = field.minArrayLength) !== null && _d !== void 0 ? _d : 0) > 0) &&
135
+ if ((!field.isArray || (field.minArrayLength ?? 0) > 0) &&
125
136
  valueAsArray.length === 0) {
126
137
  valueAsArray = [undefined];
127
138
  }
@@ -195,5 +206,4 @@ class StaticSchemaEntityImpl extends AbstractEntity_1.default {
195
206
  return namedFields;
196
207
  }
197
208
  }
198
- StaticSchemaEntityImpl.enableDuplicateCheckWhenTracking = true;
199
209
  exports.default = StaticSchemaEntityImpl;
@@ -7,13 +7,12 @@ const error_1 = __importDefault(require("@sprucelabs/error"));
7
7
  const ValidateErrorMessageFormatter_1 = require("./ValidateErrorMessageFormatter");
8
8
  class SpruceError extends error_1.default {
9
9
  friendlyMessage() {
10
- var _a;
11
10
  const { options } = this;
12
11
  if (options.friendlyMessage) {
13
12
  return options.friendlyMessage;
14
13
  }
15
14
  let message;
16
- switch (options === null || options === void 0 ? void 0 : options.code) {
15
+ switch (options?.code) {
17
16
  case 'DUPLICATE_SCHEMA':
18
17
  message = `Duplicate schema -> '${this.buildSchemaName(options)}'.`;
19
18
  break;
@@ -22,7 +21,7 @@ class SpruceError extends error_1.default {
22
21
  break;
23
22
  case 'TRANSFORMATION_ERROR':
24
23
  message = '';
25
- (_a = options.errors) === null || _a === void 0 ? void 0 : _a.forEach((error) => {
24
+ options.errors?.forEach((error) => {
26
25
  message += `Error on ${error.name}:\n`;
27
26
  if (error.originalError) {
28
27
  message += ` ${error.originalError.message}`;
@@ -65,7 +64,7 @@ class SpruceError extends error_1.default {
65
64
  return message;
66
65
  }
67
66
  renderParametersWithFriendlyMessages(parameters, friendlyMessages) {
68
- const friendly = (friendlyMessages !== null && friendlyMessages !== void 0 ? friendlyMessages : parameters)
67
+ const friendly = (friendlyMessages ?? parameters)
69
68
  .filter((m) => !!m)
70
69
  .map((m) => `${m}`)
71
70
  .join('\n');
@@ -6,15 +6,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ValidateErrorMessageFormatter = void 0;
7
7
  const SpruceError_1 = __importDefault(require("./SpruceError"));
8
8
  class ValidateErrorMessageFormatter {
9
+ error;
9
10
  constructor(error) {
10
- var _a;
11
11
  if (!error) {
12
12
  throw new SpruceError_1.default({
13
13
  code: 'MISSING_PARAMETERS',
14
14
  parameters: ['error'],
15
15
  });
16
16
  }
17
- else if (((_a = error.options) === null || _a === void 0 ? void 0 : _a.code) !== 'VALIDATION_FAILED') {
17
+ else if (error.options?.code !== 'VALIDATION_FAILED') {
18
18
  throw new SpruceError_1.default({
19
19
  code: 'INVALID_PARAMETERS',
20
20
  parameters: ['error'],
@@ -28,9 +28,13 @@ class ValidateErrorMessageFormatter {
28
28
  let count = countOption;
29
29
  const lines = [];
30
30
  const name = this.renderFieldName(fieldError, namePrefix);
31
- if (fieldError === null || fieldError === void 0 ? void 0 : fieldError.errors) {
31
+ if (fieldError?.errors) {
32
32
  for (const error of fieldError.errors) {
33
- lines.push(this.renderError({ fieldError: error, count, namePrefix: name }));
33
+ lines.push(this.renderError({
34
+ fieldError: error,
35
+ count,
36
+ namePrefix: name,
37
+ }));
34
38
  count++;
35
39
  }
36
40
  }
@@ -71,16 +75,15 @@ class ValidateErrorMessageFormatter {
71
75
  return count;
72
76
  }
73
77
  renderSchemaName(shouldUseReadableNames = false) {
74
- var _a;
75
78
  return shouldUseReadableNames
76
- ? (_a = this.error.options.schemaName) !== null && _a !== void 0 ? _a : this.error.options.schemaId
79
+ ? this.error.options.schemaName ?? this.error.options.schemaId
77
80
  : this.error.options.schemaId;
78
81
  }
79
82
  render(options) {
80
83
  const totalErrors = this.getTotalErrors();
81
- let message = (options === null || options === void 0 ? void 0 : options.shouldRenderHeadline) === false
84
+ let message = options?.shouldRenderHeadline === false
82
85
  ? ''
83
- : `'${this.renderSchemaName(options === null || options === void 0 ? void 0 : options.shouldUseReadableNames)}' has ${totalErrors} error${totalErrors === 1 ? '' : 's'}!\n\n`;
86
+ : `'${this.renderSchemaName(options?.shouldUseReadableNames)}' has ${totalErrors} error${totalErrors === 1 ? '' : 's'}!\n\n`;
84
87
  const errors = this.error.options.errors;
85
88
  let count = 1;
86
89
  const lines = [];
@@ -4,16 +4,16 @@ import DateField from '../../../fields/DateField';
4
4
  import DateTimeField from '../../../fields/DateTimeField';
5
5
  import DirectoryField from '../../../fields/DirectoryField';
6
6
  import DurationField from '../../../fields/DurationField';
7
+ import EmailField from '../../../fields/EmailField';
7
8
  import FileField from '../../../fields/FileField';
8
9
  import IdField from '../../../fields/IdField';
10
+ import ImageField from '../../../fields/ImageField';
9
11
  import NumberField from '../../../fields/NumberField';
10
12
  import PhoneField from '../../../fields/PhoneField';
11
13
  import RawField from '../../../fields/RawField';
12
14
  import SchemaField from '../../../fields/SchemaField';
13
15
  import SelectField from '../../../fields/SelectField';
14
16
  import TextField from '../../../fields/TextField';
15
- import EmailField from '../../../fields/EmailField';
16
- import ImageField from '../../../fields/ImageField';
17
17
  declare const fieldClassMap: {
18
18
  readonly boolean: typeof BooleanField;
19
19
  readonly select: typeof SelectField;
@@ -4,16 +4,16 @@ import DateField from '../../../fields/DateField.js';
4
4
  import DateTimeField from '../../../fields/DateTimeField.js';
5
5
  import DirectoryField from '../../../fields/DirectoryField.js';
6
6
  import DurationField from '../../../fields/DurationField.js';
7
+ import EmailField from '../../../fields/EmailField.js';
7
8
  import FileField from '../../../fields/FileField.js';
8
9
  import IdField from '../../../fields/IdField.js';
10
+ import ImageField from '../../../fields/ImageField.js';
9
11
  import NumberField from '../../../fields/NumberField.js';
10
12
  import PhoneField from '../../../fields/PhoneField.js';
11
13
  import RawField from '../../../fields/RawField.js';
12
14
  import SchemaField from '../../../fields/SchemaField.js';
13
15
  import SelectField from '../../../fields/SelectField.js';
14
16
  import TextField from '../../../fields/TextField.js';
15
- import EmailField from '../../../fields/EmailField.js';
16
- import ImageField from '../../../fields/ImageField.js';
17
17
  const fieldClassMap = {
18
18
  boolean: BooleanField,
19
19
  select: SelectField,
@@ -30,6 +30,6 @@ const fieldClassMap = {
30
30
  date: DateField,
31
31
  directory: DirectoryField,
32
32
  email: EmailField,
33
- image: ImageField
33
+ image: ImageField,
34
34
  };
35
35
  export default fieldClassMap;
@@ -34,7 +34,9 @@ class StaticSchemaEntityImpl extends AbstractEntity {
34
34
  return normalizeFieldValue(this.schemaId, this.name, {}, field, value, overrideOptions);
35
35
  }
36
36
  get(fieldName, options = {}) {
37
- const value = this.values[fieldName] !== undefined ? this.values[fieldName] : undefined;
37
+ const value = this.values[fieldName] !== undefined
38
+ ? this.values[fieldName]
39
+ : undefined;
38
40
  return this.normalizeValue(fieldName, value, options);
39
41
  }
40
42
  set(fieldName, value, options = {}) {
@@ -85,7 +87,9 @@ class StaticSchemaEntityImpl extends AbstractEntity {
85
87
  (!this.values[name] ||
86
88
  valueAsArray.length < ((_a = field.minArrayLength) !== null && _a !== void 0 ? _a : 1))) {
87
89
  errors.push({
88
- code: !this.values[name] ? 'MISSING_PARAMETER' : 'INVALID_PARAMETER',
90
+ code: !this.values[name]
91
+ ? 'MISSING_PARAMETER'
92
+ : 'INVALID_PARAMETER',
89
93
  name,
90
94
  friendlyMessage: !this.values[name]
91
95
  ? `'${(_b = field.label) !== null && _b !== void 0 ? _b : field.name}' is required!`
@@ -24,7 +24,11 @@ export class ValidateErrorMessageFormatter {
24
24
  const name = this.renderFieldName(fieldError, namePrefix);
25
25
  if (fieldError === null || fieldError === void 0 ? void 0 : fieldError.errors) {
26
26
  for (const error of fieldError.errors) {
27
- lines.push(this.renderError({ fieldError: error, count, namePrefix: name }));
27
+ lines.push(this.renderError({
28
+ fieldError: error,
29
+ count,
30
+ namePrefix: name,
31
+ }));
28
32
  count++;
29
33
  }
30
34
  }
@@ -2,6 +2,6 @@ import { FieldTemplateDetailOptions, FieldTemplateDetails } from '../types/templ
2
2
  import AbstractField from './AbstractField';
3
3
  import { AddressFieldDefinition } from './AddressField.types';
4
4
  export default class AddressField extends AbstractField<AddressFieldDefinition> {
5
- static get description(): string;
5
+ static readonly description = "An address with geocoding ability *coming soon*";
6
6
  static generateTemplateDetails(options: FieldTemplateDetailOptions<AddressFieldDefinition>): FieldTemplateDetails;
7
7
  }
@@ -1,11 +1,10 @@
1
1
  import AbstractField from './AbstractField.js';
2
- export default class AddressField extends AbstractField {
3
- static get description() {
4
- return 'An address with geocoding ability *coming soon*';
5
- }
2
+ class AddressField extends AbstractField {
6
3
  static generateTemplateDetails(options) {
7
4
  return {
8
5
  valueType: `${options.importAs}.AddressFieldValue${options.definition.isArray ? '[]' : ''}`,
9
6
  };
10
7
  }
11
8
  }
9
+ AddressField.description = 'An address with geocoding ability *coming soon*';
10
+ export default AddressField;
@@ -2,7 +2,7 @@ import { FieldTemplateDetailOptions, FieldTemplateDetails } from '../types/templ
2
2
  import AbstractField from './AbstractField';
3
3
  import { BooleanFieldDefinition } from './BooleanField.types';
4
4
  export default class BooleanField extends AbstractField<BooleanFieldDefinition> {
5
- static get description(): string;
5
+ static readonly description = "A true/false. Converts false string to false, all other strings to true.";
6
6
  static generateTemplateDetails(options: FieldTemplateDetailOptions<BooleanFieldDefinition>): FieldTemplateDetails;
7
7
  /** * Turn everything into a string */
8
8
  toValueType(value: any): boolean;
@@ -1,8 +1,5 @@
1
1
  import AbstractField from './AbstractField.js';
2
- export default class BooleanField extends AbstractField {
3
- static get description() {
4
- return 'A true/false. Converts false string to false, all other strings to true.';
5
- }
2
+ class BooleanField extends AbstractField {
6
3
  static generateTemplateDetails(options) {
7
4
  return {
8
5
  valueType: `boolean${options.definition.isArray ? '[]' : ''}`,
@@ -19,3 +16,5 @@ export default class BooleanField extends AbstractField {
19
16
  return !!value;
20
17
  }
21
18
  }
19
+ BooleanField.description = 'A true/false. Converts false string to false, all other strings to true.';
20
+ export default BooleanField;
@@ -4,7 +4,7 @@ import AbstractField from './AbstractField';
4
4
  import { DateFieldDefinition } from './DateField.types';
5
5
  import { ValidateOptions } from './field.static.types';
6
6
  export default class DateField extends AbstractField<DateFieldDefinition> {
7
- static get description(): string;
7
+ static readonly description = "Date and time support.";
8
8
  static generateTemplateDetails(options: FieldTemplateDetailOptions<DateFieldDefinition>): FieldTemplateDetails;
9
9
  validate(value: any, options?: ValidateOptions<DateFieldDefinition>): FieldError[];
10
10
  toValueType(value: any): any;
@@ -1,10 +1,7 @@
1
1
  import getStartOfDay from '../utilities/getStartOfDay.js';
2
2
  import isUndefinedOrNull from '../utilities/isUndefinedOrNull.js';
3
3
  import AbstractField from './AbstractField.js';
4
- export default class DateField extends AbstractField {
5
- static get description() {
6
- return 'Date and time support.';
7
- }
4
+ class DateField extends AbstractField {
8
5
  static generateTemplateDetails(options) {
9
6
  return {
10
7
  valueType: `${options.importAs}.DateFieldValue${options.definition.isArray ? '[]' : ''}`,
@@ -25,6 +22,8 @@ export default class DateField extends AbstractField {
25
22
  return value ? getStartOfDay(+value) : value;
26
23
  }
27
24
  }
25
+ DateField.description = 'Date and time support.';
26
+ export default DateField;
28
27
  export function validateDateValue(options) {
29
28
  const { value, isRequired, name } = options;
30
29
  if (isUndefinedOrNull(value) && !isRequired) {
@@ -4,7 +4,7 @@ import AbstractField from './AbstractField';
4
4
  import { DateTimeFieldDefinition } from './DateTimeField.types';
5
5
  import { ValidateOptions } from './field.static.types';
6
6
  export default class DateTimeField extends AbstractField<DateTimeFieldDefinition> {
7
- static get description(): string;
7
+ static readonly description = "Date and time support.";
8
8
  static generateTemplateDetails(options: FieldTemplateDetailOptions<DateTimeFieldDefinition>): FieldTemplateDetails;
9
9
  validate(value: any, options?: ValidateOptions<DateTimeFieldDefinition>): FieldError[];
10
10
  toValueType(value: any): any;
@@ -1,9 +1,6 @@
1
1
  import AbstractField from './AbstractField.js';
2
2
  import { validateDateValue } from './DateField.js';
3
- export default class DateTimeField extends AbstractField {
4
- static get description() {
5
- return 'Date and time support.';
6
- }
3
+ class DateTimeField extends AbstractField {
7
4
  static generateTemplateDetails(options) {
8
5
  return {
9
6
  valueType: `${options.importAs}.DateTimeFieldValue${options.definition.isArray ? '[]' : ''}`,
@@ -35,3 +32,5 @@ export default class DateTimeField extends AbstractField {
35
32
  return normalized ? +normalized : normalized;
36
33
  }
37
34
  }
35
+ DateTimeField.description = 'Date and time support.';
36
+ export default DateTimeField;
@@ -3,7 +3,7 @@ import AbstractField from './AbstractField';
3
3
  import { DirectoryFieldDefinition, DirectoryFieldValue } from './DirectoryField.types';
4
4
  import { ToValueTypeOptions } from './field.static.types';
5
5
  export default class DirectoryField extends AbstractField<DirectoryFieldDefinition> {
6
- static get description(): string;
6
+ static readonly description = "A way to select entire directories once!";
7
7
  static generateTemplateDetails(options: FieldTemplateDetailOptions<DirectoryFieldDefinition>): FieldTemplateDetails;
8
8
  toValueType<C extends boolean>(value: any, options?: ToValueTypeOptions<DirectoryFieldDefinition, C>): DirectoryFieldValue;
9
9
  }
@@ -1,9 +1,6 @@
1
1
  import SpruceError from '../errors/SpruceError.js';
2
2
  import AbstractField from './AbstractField.js';
3
- export default class DirectoryField extends AbstractField {
4
- static get description() {
5
- return 'A way to select entire directories once!';
6
- }
3
+ class DirectoryField extends AbstractField {
7
4
  static generateTemplateDetails(options) {
8
5
  const { definition } = options;
9
6
  return {
@@ -11,7 +8,9 @@ export default class DirectoryField extends AbstractField {
11
8
  };
12
9
  }
13
10
  toValueType(value, options) {
14
- const stringValue = typeof value === 'string' || value.toString ? value.toString() : undefined;
11
+ const stringValue = typeof value === 'string' || value.toString
12
+ ? value.toString()
13
+ : undefined;
15
14
  let path;
16
15
  const relativeTo = options === null || options === void 0 ? void 0 : options.relativeTo;
17
16
  if (stringValue) {
@@ -30,10 +29,13 @@ export default class DirectoryField extends AbstractField {
30
29
  });
31
30
  }
32
31
  if (path && relativeTo) {
33
- // eslint-disable-next-line @typescript-eslint/no-var-requires
34
32
  const pathUtil = require('path');
35
- path = pathUtil.relative(relativeTo, path) || path;
33
+ path =
34
+ pathUtil.relative(relativeTo, path) ||
35
+ path;
36
36
  }
37
37
  return { path };
38
38
  }
39
39
  }
40
+ DirectoryField.description = 'A way to select entire directories once!';
41
+ export default DirectoryField;
@@ -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;
@@ -20,7 +20,8 @@ export function buildDuration(value) {
20
20
  else if (typeof value === 'object') {
21
21
  totalMs += typeof value.ms === 'number' ? value.ms : 0;
22
22
  totalMs += typeof value.seconds === 'number' ? value.seconds * 1000 : 0;
23
- totalMs += typeof value.minutes === 'number' ? value.minutes * 1000 * 60 : 0;
23
+ totalMs +=
24
+ typeof value.minutes === 'number' ? value.minutes * 1000 * 60 : 0;
24
25
  totalMs +=
25
26
  typeof value.hours === 'number' ? value.hours * 1000 * 60 * 60 : 0;
26
27
  }
@@ -39,10 +40,7 @@ export function buildDuration(value) {
39
40
  const hours = (totalMs - minutes) / 60;
40
41
  return { hours, minutes, seconds, ms };
41
42
  }
42
- export default class DurationField extends AbstractField {
43
- static get description() {
44
- return 'A span of time represented in { hours, minutes, seconds, ms }';
45
- }
43
+ class DurationField extends AbstractField {
46
44
  static generateTemplateDetails(options) {
47
45
  return {
48
46
  valueType: `${options.importAs}.DurationFieldValue${options.definition.isArray ? '[]' : ''}`,
@@ -68,3 +66,5 @@ export default class DurationField extends AbstractField {
68
66
  return buildDuration(value);
69
67
  }
70
68
  }
69
+ DurationField.description = 'A span of time represented in { hours, minutes, seconds, ms }';
70
+ export default DurationField;
@@ -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
  }
@@ -1,9 +1,6 @@
1
1
  import * as EmailValidator from 'email-validator';
2
2
  import AbstractField from './AbstractField.js';
3
- export default class EmailField extends AbstractField {
4
- static get description() {
5
- return 'Email support.';
6
- }
3
+ class EmailField extends AbstractField {
7
4
  static generateTemplateDetails(options) {
8
5
  return {
9
6
  valueType: `string${options.definition.isArray ? '[]' : ''}`,
@@ -17,3 +14,5 @@ export default class EmailField extends AbstractField {
17
14
  return errors;
18
15
  }
19
16
  }
17
+ EmailField.description = 'Email support.';
18
+ export default EmailField;
@@ -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;
@@ -1,8 +1,5 @@
1
1
  import AbstractField from './AbstractField.js';
2
- export default class FileField extends AbstractField {
3
- static get description() {
4
- return 'A way to handle files. Supports mime-type lookups.';
5
- }
2
+ class FileField extends AbstractField {
6
3
  static generateTemplateDetails(options) {
7
4
  return {
8
5
  valueType: `${options.importAs}.FileFieldValue${options.definition.isArray ? '[]' : ''}`,
@@ -28,3 +25,5 @@ export default class FileField extends AbstractField {
28
25
  return value;
29
26
  }
30
27
  }
28
+ FileField.description = 'A way to handle files. Supports mime-type lookups.';
29
+ export default FileField;
@@ -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
  }
@@ -1,8 +1,5 @@
1
1
  import AbstractField from './AbstractField.js';
2
- export default class IdField extends AbstractField {
3
- static get description() {
4
- return 'A unique identifier field.';
5
- }
2
+ class IdField extends AbstractField {
6
3
  static generateTemplateDetails(options) {
7
4
  return {
8
5
  valueType: `string${options.definition.isArray ? '[]' : ''}`,
@@ -12,3 +9,5 @@ export default class IdField extends AbstractField {
12
9
  return `${value}`;
13
10
  }
14
11
  }
12
+ IdField.description = 'A unique identifier field.';
13
+ export default IdField;