@sprucelabs/schema 32.3.2 → 32.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/SchemaTypesRenderer.js +3 -3
- package/build/esm/SchemaTypesRenderer.js +3 -3
- package/build/esm/fields/RawField.js +16 -1
- package/build/esm/fields/SchemaField.d.ts +1 -0
- package/build/esm/fields/SchemaField.js +63 -62
- package/build/fields/RawField.js +16 -1
- package/build/fields/SchemaField.d.ts +1 -0
- package/build/fields/SchemaField.js +63 -62
- package/package.json +1 -1
|
@@ -48,8 +48,8 @@ ${body}}`;
|
|
|
48
48
|
if (isRequired) {
|
|
49
49
|
validateTags.push('required');
|
|
50
50
|
}
|
|
51
|
-
if (minArrayLength !== undefined) {
|
|
52
|
-
validateTags.push(`min=${minArrayLength}`);
|
|
51
|
+
if ((isArray && isRequired) || minArrayLength !== undefined) {
|
|
52
|
+
validateTags.push(`min=${minArrayLength ?? 1}`);
|
|
53
53
|
}
|
|
54
54
|
if (!isRequired) {
|
|
55
55
|
fieldLine += ',omitempty"';
|
|
@@ -75,7 +75,7 @@ ${body}}`;
|
|
|
75
75
|
comment = `// ${schema.name}`;
|
|
76
76
|
}
|
|
77
77
|
if (schema.description) {
|
|
78
|
-
comment +=
|
|
78
|
+
comment += `${schema.name ? ': ' : '// '}${schema.description}`;
|
|
79
79
|
}
|
|
80
80
|
return comment;
|
|
81
81
|
}
|
|
@@ -43,8 +43,8 @@ ${body}}`;
|
|
|
43
43
|
if (isRequired) {
|
|
44
44
|
validateTags.push('required');
|
|
45
45
|
}
|
|
46
|
-
if (minArrayLength !== undefined) {
|
|
47
|
-
validateTags.push(`min=${minArrayLength}`);
|
|
46
|
+
if ((isArray && isRequired) || minArrayLength !== undefined) {
|
|
47
|
+
validateTags.push(`min=${minArrayLength !== null && minArrayLength !== void 0 ? minArrayLength : 1}`);
|
|
48
48
|
}
|
|
49
49
|
if (!isRequired) {
|
|
50
50
|
fieldLine += ',omitempty"';
|
|
@@ -70,7 +70,7 @@ ${body}}`;
|
|
|
70
70
|
comment = `// ${schema.name}`;
|
|
71
71
|
}
|
|
72
72
|
if (schema.description) {
|
|
73
|
-
comment +=
|
|
73
|
+
comment += `${schema.name ? ': ' : '// '}${schema.description}`;
|
|
74
74
|
}
|
|
75
75
|
return comment;
|
|
76
76
|
}
|
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
import AbstractField from './AbstractField.js';
|
|
2
2
|
class RawField extends AbstractField {
|
|
3
3
|
static generateTemplateDetails(options) {
|
|
4
|
+
const { definition, language } = options;
|
|
5
|
+
const { isArray } = definition;
|
|
6
|
+
const { options: fieldOptions } = definition;
|
|
7
|
+
const { valueType } = fieldOptions;
|
|
8
|
+
const arrayNotation = isArray ? '[]' : '';
|
|
9
|
+
let resolvedType = valueType;
|
|
10
|
+
if (language === 'go') {
|
|
11
|
+
const goType = valueType === 'Record<string, any>'
|
|
12
|
+
? 'map[string]interface{}'
|
|
13
|
+
: 'interface{}';
|
|
14
|
+
resolvedType = `${arrayNotation}${goType}`;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
resolvedType = `${arrayNotation}${valueType}`;
|
|
18
|
+
}
|
|
4
19
|
return {
|
|
5
|
-
valueType:
|
|
20
|
+
valueType: resolvedType,
|
|
6
21
|
};
|
|
7
22
|
}
|
|
8
23
|
}
|
|
@@ -12,6 +12,7 @@ export default class SchemaField<F extends SchemaFieldFieldDefinition = SchemaFi
|
|
|
12
12
|
valueTypeMapper: string;
|
|
13
13
|
};
|
|
14
14
|
static generateTemplateDetails(options: FieldTemplateDetailOptions<SchemaFieldFieldDefinition>): FieldTemplateDetails;
|
|
15
|
+
private static findSchemaInTemplateItems;
|
|
15
16
|
private static mapFieldDefinitionToSchemas;
|
|
16
17
|
validate(value: any, options?: ValidateOptions<SchemaFieldFieldDefinition>): FieldError[];
|
|
17
18
|
private Schema;
|
|
@@ -49,68 +49,33 @@ class SchemaField extends AbstractField {
|
|
|
49
49
|
}
|
|
50
50
|
static generateTemplateDetails(options) {
|
|
51
51
|
const { templateItems, renderAs, definition, globalNamespace, language, } = options;
|
|
52
|
+
const { isArray } = definition;
|
|
52
53
|
const { typeSuffix = '' } = definition.options;
|
|
53
|
-
const idsWithVersion =
|
|
54
|
+
const idsWithVersion = this.mapFieldDefinitionToSchemaIdsWithVersion(definition);
|
|
54
55
|
const unions = [];
|
|
55
56
|
idsWithVersion.forEach((idWithVersion) => {
|
|
56
|
-
const {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
return item.id.toLowerCase() === id.toLowerCase();
|
|
62
|
-
});
|
|
63
|
-
if (namespace) {
|
|
64
|
-
allMatches = allMatches.filter((item) => {
|
|
65
|
-
if (!item.namespace) {
|
|
66
|
-
throwInvalidReferenceError(item);
|
|
67
|
-
}
|
|
68
|
-
return (item.namespace.toLowerCase() === namespace.toLowerCase());
|
|
69
|
-
});
|
|
57
|
+
const { version } = idWithVersion;
|
|
58
|
+
const { namePascal, namespace, id, nameCamel, schema } = this.findSchemaInTemplateItems(idWithVersion, templateItems);
|
|
59
|
+
let valueType;
|
|
60
|
+
if (language === 'go') {
|
|
61
|
+
valueType = `${namespace}${namePascal}`;
|
|
70
62
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
matchedTemplateItem = allMatches[0];
|
|
63
|
+
else if (renderAs === TemplateRenderAs.Value) {
|
|
64
|
+
valueType = `${nameCamel}Schema${schema.version ? `_${schema.version}` : ''}`;
|
|
74
65
|
}
|
|
75
66
|
else {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
67
|
+
valueType = `${globalNamespace}.${namespace}${version ? `.${version}` : ''}${renderAs === TemplateRenderAs.Type
|
|
68
|
+
? `.${namePascal + typeSuffix}`
|
|
69
|
+
: `.${namePascal}Schema`}`;
|
|
70
|
+
if (renderAs === TemplateRenderAs.Type &&
|
|
71
|
+
idsWithVersion.length > 1) {
|
|
72
|
+
valueType = `{ id: '${id}', values: ${valueType} }`;
|
|
82
73
|
}
|
|
83
74
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
valueType = `*${namespace}${namePascal}`;
|
|
89
|
-
}
|
|
90
|
-
else if (renderAs === TemplateRenderAs.Value) {
|
|
91
|
-
valueType = `${nameCamel}Schema${schema.version ? `_${schema.version}` : ''}`;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
valueType = `${globalNamespace}.${namespace}${version ? `.${version}` : ''}${renderAs === TemplateRenderAs.Type
|
|
95
|
-
? `.${namePascal + typeSuffix}`
|
|
96
|
-
: `.${namePascal}Schema`}`;
|
|
97
|
-
if (renderAs === TemplateRenderAs.Type &&
|
|
98
|
-
idsWithVersion.length > 1) {
|
|
99
|
-
valueType = `{ id: '${id}', values: ${valueType} }`;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
unions.push({
|
|
103
|
-
schemaId: id,
|
|
104
|
-
valueType,
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
throw new SpruceError({
|
|
109
|
-
code: 'SCHEMA_NOT_FOUND',
|
|
110
|
-
schemaId: id,
|
|
111
|
-
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**'}'.`,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
75
|
+
unions.push({
|
|
76
|
+
schemaId: id,
|
|
77
|
+
valueType,
|
|
78
|
+
});
|
|
114
79
|
});
|
|
115
80
|
let valueType;
|
|
116
81
|
if (renderAs === TemplateRenderAs.Value) {
|
|
@@ -123,19 +88,55 @@ class SchemaField extends AbstractField {
|
|
|
123
88
|
}
|
|
124
89
|
else {
|
|
125
90
|
valueType = unions.map((item) => item.valueType).join(' | ');
|
|
126
|
-
|
|
127
|
-
renderAs === TemplateRenderAs.SchemaType)
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
91
|
+
const shouldRenderAsArray = (isArray && renderAs === TemplateRenderAs.Type) ||
|
|
92
|
+
(unions.length > 1 && renderAs === TemplateRenderAs.SchemaType);
|
|
93
|
+
const arrayNotation = shouldRenderAsArray ? '[]' : '';
|
|
94
|
+
if (language === 'go') {
|
|
95
|
+
valueType = `*${arrayNotation}${valueType}`;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
valueType = `${shouldRenderAsArray && unions.length > 1
|
|
99
|
+
? `(${valueType})`
|
|
100
|
+
: `${valueType}`}${arrayNotation}`;
|
|
101
|
+
}
|
|
134
102
|
}
|
|
135
103
|
return {
|
|
136
104
|
valueType,
|
|
137
105
|
};
|
|
138
106
|
}
|
|
107
|
+
static findSchemaInTemplateItems(idWithVersion, templateItems) {
|
|
108
|
+
const { id, namespace, version } = idWithVersion;
|
|
109
|
+
let allMatches = templateItems.filter((item) => {
|
|
110
|
+
if (!item.id) {
|
|
111
|
+
throwInvalidReferenceError(item);
|
|
112
|
+
}
|
|
113
|
+
return item.id.toLowerCase() === id.toLowerCase();
|
|
114
|
+
});
|
|
115
|
+
if (namespace) {
|
|
116
|
+
allMatches = allMatches.filter((item) => {
|
|
117
|
+
if (!item.namespace) {
|
|
118
|
+
throwInvalidReferenceError(item);
|
|
119
|
+
}
|
|
120
|
+
return item.namespace.toLowerCase() === namespace.toLowerCase();
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (allMatches.length === 0) {
|
|
124
|
+
throw new SpruceError({
|
|
125
|
+
code: 'SCHEMA_NOT_FOUND',
|
|
126
|
+
schemaId: id,
|
|
127
|
+
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**'}'.`,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
let matchedTemplateItem;
|
|
131
|
+
matchedTemplateItem = allMatches.find((d) => d.schema.version === version);
|
|
132
|
+
if (!matchedTemplateItem) {
|
|
133
|
+
throw new SpruceError({
|
|
134
|
+
code: 'VERSION_NOT_FOUND',
|
|
135
|
+
schemaId: id,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return matchedTemplateItem;
|
|
139
|
+
}
|
|
139
140
|
static mapFieldDefinitionToSchemas(definition, options) {
|
|
140
141
|
const { schemasById: schemasById = {} } = options || {};
|
|
141
142
|
const schemasOrIds = SchemaField.mapFieldDefinitionToSchemasOrIdsWithVersion(definition);
|
package/build/fields/RawField.js
CHANGED
|
@@ -6,8 +6,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const AbstractField_1 = __importDefault(require("./AbstractField"));
|
|
7
7
|
class RawField extends AbstractField_1.default {
|
|
8
8
|
static generateTemplateDetails(options) {
|
|
9
|
+
const { definition, language } = options;
|
|
10
|
+
const { isArray } = definition;
|
|
11
|
+
const { options: fieldOptions } = definition;
|
|
12
|
+
const { valueType } = fieldOptions;
|
|
13
|
+
const arrayNotation = isArray ? '[]' : '';
|
|
14
|
+
let resolvedType = valueType;
|
|
15
|
+
if (language === 'go') {
|
|
16
|
+
const goType = valueType === 'Record<string, any>'
|
|
17
|
+
? 'map[string]interface{}'
|
|
18
|
+
: 'interface{}';
|
|
19
|
+
resolvedType = `${arrayNotation}${goType}`;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
resolvedType = `${arrayNotation}${valueType}`;
|
|
23
|
+
}
|
|
9
24
|
return {
|
|
10
|
-
valueType:
|
|
25
|
+
valueType: resolvedType,
|
|
11
26
|
};
|
|
12
27
|
}
|
|
13
28
|
}
|
|
@@ -12,6 +12,7 @@ export default class SchemaField<F extends SchemaFieldFieldDefinition = SchemaFi
|
|
|
12
12
|
valueTypeMapper: string;
|
|
13
13
|
};
|
|
14
14
|
static generateTemplateDetails(options: FieldTemplateDetailOptions<SchemaFieldFieldDefinition>): FieldTemplateDetails;
|
|
15
|
+
private static findSchemaInTemplateItems;
|
|
15
16
|
private static mapFieldDefinitionToSchemas;
|
|
16
17
|
validate(value: any, options?: ValidateOptions<SchemaFieldFieldDefinition>): FieldError[];
|
|
17
18
|
private Schema;
|
|
@@ -54,68 +54,33 @@ class SchemaField extends AbstractField_1.default {
|
|
|
54
54
|
}
|
|
55
55
|
static generateTemplateDetails(options) {
|
|
56
56
|
const { templateItems, renderAs, definition, globalNamespace, language, } = options;
|
|
57
|
+
const { isArray } = definition;
|
|
57
58
|
const { typeSuffix = '' } = definition.options;
|
|
58
|
-
const idsWithVersion =
|
|
59
|
+
const idsWithVersion = this.mapFieldDefinitionToSchemaIdsWithVersion(definition);
|
|
59
60
|
const unions = [];
|
|
60
61
|
idsWithVersion.forEach((idWithVersion) => {
|
|
61
|
-
const {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
return item.id.toLowerCase() === id.toLowerCase();
|
|
67
|
-
});
|
|
68
|
-
if (namespace) {
|
|
69
|
-
allMatches = allMatches.filter((item) => {
|
|
70
|
-
if (!item.namespace) {
|
|
71
|
-
throwInvalidReferenceError(item);
|
|
72
|
-
}
|
|
73
|
-
return (item.namespace.toLowerCase() === namespace.toLowerCase());
|
|
74
|
-
});
|
|
62
|
+
const { version } = idWithVersion;
|
|
63
|
+
const { namePascal, namespace, id, nameCamel, schema } = this.findSchemaInTemplateItems(idWithVersion, templateItems);
|
|
64
|
+
let valueType;
|
|
65
|
+
if (language === 'go') {
|
|
66
|
+
valueType = `${namespace}${namePascal}`;
|
|
75
67
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
matchedTemplateItem = allMatches[0];
|
|
68
|
+
else if (renderAs === template_types_1.TemplateRenderAs.Value) {
|
|
69
|
+
valueType = `${nameCamel}Schema${schema.version ? `_${schema.version}` : ''}`;
|
|
79
70
|
}
|
|
80
71
|
else {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
72
|
+
valueType = `${globalNamespace}.${namespace}${version ? `.${version}` : ''}${renderAs === template_types_1.TemplateRenderAs.Type
|
|
73
|
+
? `.${namePascal + typeSuffix}`
|
|
74
|
+
: `.${namePascal}Schema`}`;
|
|
75
|
+
if (renderAs === template_types_1.TemplateRenderAs.Type &&
|
|
76
|
+
idsWithVersion.length > 1) {
|
|
77
|
+
valueType = `{ id: '${id}', values: ${valueType} }`;
|
|
87
78
|
}
|
|
88
79
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
valueType = `*${namespace}${namePascal}`;
|
|
94
|
-
}
|
|
95
|
-
else if (renderAs === template_types_1.TemplateRenderAs.Value) {
|
|
96
|
-
valueType = `${nameCamel}Schema${schema.version ? `_${schema.version}` : ''}`;
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
valueType = `${globalNamespace}.${namespace}${version ? `.${version}` : ''}${renderAs === template_types_1.TemplateRenderAs.Type
|
|
100
|
-
? `.${namePascal + typeSuffix}`
|
|
101
|
-
: `.${namePascal}Schema`}`;
|
|
102
|
-
if (renderAs === template_types_1.TemplateRenderAs.Type &&
|
|
103
|
-
idsWithVersion.length > 1) {
|
|
104
|
-
valueType = `{ id: '${id}', values: ${valueType} }`;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
unions.push({
|
|
108
|
-
schemaId: id,
|
|
109
|
-
valueType,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
throw new SpruceError_1.default({
|
|
114
|
-
code: 'SCHEMA_NOT_FOUND',
|
|
115
|
-
schemaId: id,
|
|
116
|
-
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**'}'.`,
|
|
117
|
-
});
|
|
118
|
-
}
|
|
80
|
+
unions.push({
|
|
81
|
+
schemaId: id,
|
|
82
|
+
valueType,
|
|
83
|
+
});
|
|
119
84
|
});
|
|
120
85
|
let valueType;
|
|
121
86
|
if (renderAs === template_types_1.TemplateRenderAs.Value) {
|
|
@@ -128,19 +93,55 @@ class SchemaField extends AbstractField_1.default {
|
|
|
128
93
|
}
|
|
129
94
|
else {
|
|
130
95
|
valueType = unions.map((item) => item.valueType).join(' | ');
|
|
131
|
-
|
|
132
|
-
renderAs === template_types_1.TemplateRenderAs.SchemaType)
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
96
|
+
const shouldRenderAsArray = (isArray && renderAs === template_types_1.TemplateRenderAs.Type) ||
|
|
97
|
+
(unions.length > 1 && renderAs === template_types_1.TemplateRenderAs.SchemaType);
|
|
98
|
+
const arrayNotation = shouldRenderAsArray ? '[]' : '';
|
|
99
|
+
if (language === 'go') {
|
|
100
|
+
valueType = `*${arrayNotation}${valueType}`;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
valueType = `${shouldRenderAsArray && unions.length > 1
|
|
104
|
+
? `(${valueType})`
|
|
105
|
+
: `${valueType}`}${arrayNotation}`;
|
|
106
|
+
}
|
|
139
107
|
}
|
|
140
108
|
return {
|
|
141
109
|
valueType,
|
|
142
110
|
};
|
|
143
111
|
}
|
|
112
|
+
static findSchemaInTemplateItems(idWithVersion, templateItems) {
|
|
113
|
+
const { id, namespace, version } = idWithVersion;
|
|
114
|
+
let allMatches = templateItems.filter((item) => {
|
|
115
|
+
if (!item.id) {
|
|
116
|
+
throwInvalidReferenceError(item);
|
|
117
|
+
}
|
|
118
|
+
return item.id.toLowerCase() === id.toLowerCase();
|
|
119
|
+
});
|
|
120
|
+
if (namespace) {
|
|
121
|
+
allMatches = allMatches.filter((item) => {
|
|
122
|
+
if (!item.namespace) {
|
|
123
|
+
throwInvalidReferenceError(item);
|
|
124
|
+
}
|
|
125
|
+
return item.namespace.toLowerCase() === namespace.toLowerCase();
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
if (allMatches.length === 0) {
|
|
129
|
+
throw new SpruceError_1.default({
|
|
130
|
+
code: 'SCHEMA_NOT_FOUND',
|
|
131
|
+
schemaId: id,
|
|
132
|
+
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**'}'.`,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
let matchedTemplateItem;
|
|
136
|
+
matchedTemplateItem = allMatches.find((d) => d.schema.version === version);
|
|
137
|
+
if (!matchedTemplateItem) {
|
|
138
|
+
throw new SpruceError_1.default({
|
|
139
|
+
code: 'VERSION_NOT_FOUND',
|
|
140
|
+
schemaId: id,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return matchedTemplateItem;
|
|
144
|
+
}
|
|
144
145
|
static mapFieldDefinitionToSchemas(definition, options) {
|
|
145
146
|
const { schemasById: schemasById = {} } = options || {};
|
|
146
147
|
const schemasOrIds = SchemaField.mapFieldDefinitionToSchemasOrIdsWithVersion(definition);
|