@sprucelabs/schema 32.3.1 → 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.d.ts +3 -1
- package/build/SchemaTypesRenderer.js +14 -7
- package/build/esm/SchemaTypesRenderer.d.ts +3 -1
- package/build/esm/SchemaTypesRenderer.js +14 -7
- package/build/esm/fields/RawField.js +16 -1
- package/build/esm/fields/SchemaField.d.ts +1 -0
- package/build/esm/fields/SchemaField.js +64 -61
- package/build/fields/RawField.js +16 -1
- package/build/fields/SchemaField.d.ts +1 -0
- package/build/fields/SchemaField.js +64 -61
- package/package.json +1 -1
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Schema } from './schemas.static.types';
|
|
2
|
-
import { TemplateLanguage } from './types/template.types';
|
|
2
|
+
import { SchemaTemplateItem, TemplateLanguage } from './types/template.types';
|
|
3
3
|
export default class SchemaTypesRenderer {
|
|
4
4
|
static Renderer(): SchemaTypesRenderer;
|
|
5
5
|
render(schema: Schema, options: {
|
|
6
6
|
language: TemplateLanguage;
|
|
7
|
+
schemaTemplateItems: SchemaTemplateItem[];
|
|
7
8
|
}): string;
|
|
9
|
+
private renderName;
|
|
8
10
|
private renderField;
|
|
9
11
|
private renderComment;
|
|
10
12
|
private ucFirst;
|
|
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const fields_1 = require("./fields");
|
|
7
|
+
const template_types_1 = require("./types/template.types");
|
|
7
8
|
const assertOptions_1 = __importDefault(require("./utilities/assertOptions"));
|
|
8
9
|
class SchemaTypesRenderer {
|
|
9
10
|
static Renderer() {
|
|
@@ -11,24 +12,30 @@ class SchemaTypesRenderer {
|
|
|
11
12
|
}
|
|
12
13
|
render(schema, options) {
|
|
13
14
|
(0, assertOptions_1.default)({ schema, options }, ['schema', 'options']);
|
|
14
|
-
const { id, fields } = schema;
|
|
15
|
-
const
|
|
15
|
+
const { id, fields, namespace } = schema;
|
|
16
|
+
const { schemaTemplateItems } = options;
|
|
17
|
+
const name = this.renderName(id, namespace);
|
|
16
18
|
const comment = this.renderComment(schema);
|
|
17
19
|
let body = '';
|
|
18
20
|
for (const [key, field] of Object.entries(fields ?? {})) {
|
|
19
|
-
let fieldLine = this.renderField(field, key);
|
|
21
|
+
let fieldLine = this.renderField(field, key, schemaTemplateItems);
|
|
20
22
|
body += fieldLine;
|
|
21
23
|
}
|
|
22
24
|
return `${comment ? `${comment}\n` : ''}type ${name} struct {
|
|
23
25
|
${body}}`;
|
|
24
26
|
}
|
|
25
|
-
|
|
27
|
+
renderName(id, namespace) {
|
|
28
|
+
return `${namespace ? `${namespace}` : ''}${this.ucFirst(id)}`;
|
|
29
|
+
}
|
|
30
|
+
renderField(field, key, schemaTemplateItems = []) {
|
|
26
31
|
const FieldClass = fields_1.fieldClassMap[field.type];
|
|
27
32
|
const { valueType, validation } = FieldClass.generateTemplateDetails({
|
|
28
33
|
//@ts-ignore
|
|
29
34
|
definition: field,
|
|
30
35
|
language: 'go',
|
|
31
36
|
importAs: 'SpruceSchema',
|
|
37
|
+
templateItems: schemaTemplateItems,
|
|
38
|
+
renderAs: template_types_1.TemplateRenderAs.Type,
|
|
32
39
|
});
|
|
33
40
|
const { hint, isRequired, minArrayLength, isArray } = field;
|
|
34
41
|
let fieldLine = '';
|
|
@@ -41,8 +48,8 @@ ${body}}`;
|
|
|
41
48
|
if (isRequired) {
|
|
42
49
|
validateTags.push('required');
|
|
43
50
|
}
|
|
44
|
-
if (minArrayLength !== undefined) {
|
|
45
|
-
validateTags.push(`min=${minArrayLength}`);
|
|
51
|
+
if ((isArray && isRequired) || minArrayLength !== undefined) {
|
|
52
|
+
validateTags.push(`min=${minArrayLength ?? 1}`);
|
|
46
53
|
}
|
|
47
54
|
if (!isRequired) {
|
|
48
55
|
fieldLine += ',omitempty"';
|
|
@@ -68,7 +75,7 @@ ${body}}`;
|
|
|
68
75
|
comment = `// ${schema.name}`;
|
|
69
76
|
}
|
|
70
77
|
if (schema.description) {
|
|
71
|
-
comment +=
|
|
78
|
+
comment += `${schema.name ? ': ' : '// '}${schema.description}`;
|
|
72
79
|
}
|
|
73
80
|
return comment;
|
|
74
81
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Schema } from './schemas.static.types';
|
|
2
|
-
import { TemplateLanguage } from './types/template.types';
|
|
2
|
+
import { SchemaTemplateItem, TemplateLanguage } from './types/template.types';
|
|
3
3
|
export default class SchemaTypesRenderer {
|
|
4
4
|
static Renderer(): SchemaTypesRenderer;
|
|
5
5
|
render(schema: Schema, options: {
|
|
6
6
|
language: TemplateLanguage;
|
|
7
|
+
schemaTemplateItems: SchemaTemplateItem[];
|
|
7
8
|
}): string;
|
|
9
|
+
private renderName;
|
|
8
10
|
private renderField;
|
|
9
11
|
private renderComment;
|
|
10
12
|
private ucFirst;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { fieldClassMap } from './fields/index.js';
|
|
2
|
+
import { TemplateRenderAs, } from './types/template.types.js';
|
|
2
3
|
import assertOptions from './utilities/assertOptions.js';
|
|
3
4
|
export default class SchemaTypesRenderer {
|
|
4
5
|
static Renderer() {
|
|
@@ -6,24 +7,30 @@ export default class SchemaTypesRenderer {
|
|
|
6
7
|
}
|
|
7
8
|
render(schema, options) {
|
|
8
9
|
assertOptions({ schema, options }, ['schema', 'options']);
|
|
9
|
-
const { id, fields } = schema;
|
|
10
|
-
const
|
|
10
|
+
const { id, fields, namespace } = schema;
|
|
11
|
+
const { schemaTemplateItems } = options;
|
|
12
|
+
const name = this.renderName(id, namespace);
|
|
11
13
|
const comment = this.renderComment(schema);
|
|
12
14
|
let body = '';
|
|
13
15
|
for (const [key, field] of Object.entries(fields !== null && fields !== void 0 ? fields : {})) {
|
|
14
|
-
let fieldLine = this.renderField(field, key);
|
|
16
|
+
let fieldLine = this.renderField(field, key, schemaTemplateItems);
|
|
15
17
|
body += fieldLine;
|
|
16
18
|
}
|
|
17
19
|
return `${comment ? `${comment}\n` : ''}type ${name} struct {
|
|
18
20
|
${body}}`;
|
|
19
21
|
}
|
|
20
|
-
|
|
22
|
+
renderName(id, namespace) {
|
|
23
|
+
return `${namespace ? `${namespace}` : ''}${this.ucFirst(id)}`;
|
|
24
|
+
}
|
|
25
|
+
renderField(field, key, schemaTemplateItems = []) {
|
|
21
26
|
const FieldClass = fieldClassMap[field.type];
|
|
22
27
|
const { valueType, validation } = FieldClass.generateTemplateDetails({
|
|
23
28
|
//@ts-ignore
|
|
24
29
|
definition: field,
|
|
25
30
|
language: 'go',
|
|
26
31
|
importAs: 'SpruceSchema',
|
|
32
|
+
templateItems: schemaTemplateItems,
|
|
33
|
+
renderAs: TemplateRenderAs.Type,
|
|
27
34
|
});
|
|
28
35
|
const { hint, isRequired, minArrayLength, isArray } = field;
|
|
29
36
|
let fieldLine = '';
|
|
@@ -36,8 +43,8 @@ ${body}}`;
|
|
|
36
43
|
if (isRequired) {
|
|
37
44
|
validateTags.push('required');
|
|
38
45
|
}
|
|
39
|
-
if (minArrayLength !== undefined) {
|
|
40
|
-
validateTags.push(`min=${minArrayLength}`);
|
|
46
|
+
if ((isArray && isRequired) || minArrayLength !== undefined) {
|
|
47
|
+
validateTags.push(`min=${minArrayLength !== null && minArrayLength !== void 0 ? minArrayLength : 1}`);
|
|
41
48
|
}
|
|
42
49
|
if (!isRequired) {
|
|
43
50
|
fieldLine += ',omitempty"';
|
|
@@ -63,7 +70,7 @@ ${body}}`;
|
|
|
63
70
|
comment = `// ${schema.name}`;
|
|
64
71
|
}
|
|
65
72
|
if (schema.description) {
|
|
66
|
-
comment +=
|
|
73
|
+
comment += `${schema.name ? ': ' : '// '}${schema.description}`;
|
|
67
74
|
}
|
|
68
75
|
return comment;
|
|
69
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;
|
|
@@ -48,67 +48,34 @@ class SchemaField extends AbstractField {
|
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
static generateTemplateDetails(options) {
|
|
51
|
-
const { templateItems, renderAs, definition, globalNamespace } = options;
|
|
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
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
if (matchedTemplateItem) {
|
|
85
|
-
let valueType;
|
|
86
|
-
if (renderAs === TemplateRenderAs.Value) {
|
|
87
|
-
valueType = `${matchedTemplateItem.nameCamel}Schema${matchedTemplateItem.schema.version
|
|
88
|
-
? `_${matchedTemplateItem.schema.version}`
|
|
89
|
-
: ''}`;
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
valueType = `${globalNamespace}.${matchedTemplateItem.namespace}${version ? `.${version}` : ''}${renderAs === TemplateRenderAs.Type
|
|
93
|
-
? `.${matchedTemplateItem.namePascal + typeSuffix}`
|
|
94
|
-
: `.${matchedTemplateItem.namePascal}Schema`}`;
|
|
95
|
-
if (renderAs === TemplateRenderAs.Type &&
|
|
96
|
-
idsWithVersion.length > 1) {
|
|
97
|
-
valueType = `{ id: '${id}', values: ${valueType} }`;
|
|
98
|
-
}
|
|
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} }`;
|
|
99
73
|
}
|
|
100
|
-
unions.push({
|
|
101
|
-
schemaId: matchedTemplateItem.id,
|
|
102
|
-
valueType,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
throw new SpruceError({
|
|
107
|
-
code: 'SCHEMA_NOT_FOUND',
|
|
108
|
-
schemaId: id,
|
|
109
|
-
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**'}'.`,
|
|
110
|
-
});
|
|
111
74
|
}
|
|
75
|
+
unions.push({
|
|
76
|
+
schemaId: id,
|
|
77
|
+
valueType,
|
|
78
|
+
});
|
|
112
79
|
});
|
|
113
80
|
let valueType;
|
|
114
81
|
if (renderAs === TemplateRenderAs.Value) {
|
|
@@ -121,19 +88,55 @@ class SchemaField extends AbstractField {
|
|
|
121
88
|
}
|
|
122
89
|
else {
|
|
123
90
|
valueType = unions.map((item) => item.valueType).join(' | ');
|
|
124
|
-
|
|
125
|
-
renderAs === TemplateRenderAs.SchemaType)
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
+
}
|
|
132
102
|
}
|
|
133
103
|
return {
|
|
134
104
|
valueType,
|
|
135
105
|
};
|
|
136
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
|
+
}
|
|
137
140
|
static mapFieldDefinitionToSchemas(definition, options) {
|
|
138
141
|
const { schemasById: schemasById = {} } = options || {};
|
|
139
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;
|
|
@@ -53,67 +53,34 @@ class SchemaField extends AbstractField_1.default {
|
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
55
|
static generateTemplateDetails(options) {
|
|
56
|
-
const { templateItems, renderAs, definition, globalNamespace } = options;
|
|
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
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
if (matchedTemplateItem) {
|
|
90
|
-
let valueType;
|
|
91
|
-
if (renderAs === template_types_1.TemplateRenderAs.Value) {
|
|
92
|
-
valueType = `${matchedTemplateItem.nameCamel}Schema${matchedTemplateItem.schema.version
|
|
93
|
-
? `_${matchedTemplateItem.schema.version}`
|
|
94
|
-
: ''}`;
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
valueType = `${globalNamespace}.${matchedTemplateItem.namespace}${version ? `.${version}` : ''}${renderAs === template_types_1.TemplateRenderAs.Type
|
|
98
|
-
? `.${matchedTemplateItem.namePascal + typeSuffix}`
|
|
99
|
-
: `.${matchedTemplateItem.namePascal}Schema`}`;
|
|
100
|
-
if (renderAs === template_types_1.TemplateRenderAs.Type &&
|
|
101
|
-
idsWithVersion.length > 1) {
|
|
102
|
-
valueType = `{ id: '${id}', values: ${valueType} }`;
|
|
103
|
-
}
|
|
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} }`;
|
|
104
78
|
}
|
|
105
|
-
unions.push({
|
|
106
|
-
schemaId: matchedTemplateItem.id,
|
|
107
|
-
valueType,
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
throw new SpruceError_1.default({
|
|
112
|
-
code: 'SCHEMA_NOT_FOUND',
|
|
113
|
-
schemaId: id,
|
|
114
|
-
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**'}'.`,
|
|
115
|
-
});
|
|
116
79
|
}
|
|
80
|
+
unions.push({
|
|
81
|
+
schemaId: id,
|
|
82
|
+
valueType,
|
|
83
|
+
});
|
|
117
84
|
});
|
|
118
85
|
let valueType;
|
|
119
86
|
if (renderAs === template_types_1.TemplateRenderAs.Value) {
|
|
@@ -126,19 +93,55 @@ class SchemaField extends AbstractField_1.default {
|
|
|
126
93
|
}
|
|
127
94
|
else {
|
|
128
95
|
valueType = unions.map((item) => item.valueType).join(' | ');
|
|
129
|
-
|
|
130
|
-
renderAs === template_types_1.TemplateRenderAs.SchemaType)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
+
}
|
|
137
107
|
}
|
|
138
108
|
return {
|
|
139
109
|
valueType,
|
|
140
110
|
};
|
|
141
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
|
+
}
|
|
142
145
|
static mapFieldDefinitionToSchemas(definition, options) {
|
|
143
146
|
const { schemasById: schemasById = {} } = options || {};
|
|
144
147
|
const schemasOrIds = SchemaField.mapFieldDefinitionToSchemasOrIdsWithVersion(definition);
|