@squiz/dx-json-schema-lib 1.21.1-alpha.9 → 1.22.1-alpha.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.
- package/.npm/_logs/2023-03-30T09_50_45_736Z-debug-0.log +37 -0
- package/lib/JsonValidationService.d.ts +1 -1
- package/lib/JsonValidationService.js +15 -5
- package/lib/JsonValidationService.js.map +1 -1
- package/lib/JsonValidationService.spec.js +444 -445
- package/lib/JsonValidationService.spec.js.map +1 -1
- package/lib/index.d.ts +6 -1
- package/lib/index.js +6 -1
- package/lib/index.js.map +1 -1
- package/lib/jsonTypeResolution/{arbitraryTypeResolution.d.ts → TypeResolver.d.ts} +7 -12
- package/lib/jsonTypeResolution/{arbitraryTypeResolution.js → TypeResolver.js} +17 -17
- package/lib/jsonTypeResolution/TypeResolver.js.map +1 -0
- package/lib/jsonTypeResolution/{arbitraryTypeResolution.spec.js → TypeResolver.spec.js} +12 -39
- package/lib/jsonTypeResolution/TypeResolver.spec.js.map +1 -0
- package/lib/jsonTypeResolution/TypeResolverBuilder.d.ts +12 -0
- package/lib/jsonTypeResolution/TypeResolverBuilder.js +32 -0
- package/lib/jsonTypeResolution/TypeResolverBuilder.js.map +1 -0
- package/lib/manifest/v1/DxContentMetaSchema.json +1 -1
- package/lib/manifest/v1/MatrixAssetSchema.json +28 -8
- package/lib/manifest/v1/v1.d.ts +10 -7
- package/lib/primitiveTypes/FormattedText.d.ts +8 -0
- package/lib/primitiveTypes/FormattedText.js +21 -0
- package/lib/primitiveTypes/FormattedText.js.map +1 -0
- package/lib/primitiveTypes/SquizImage.d.ts +26 -0
- package/lib/primitiveTypes/SquizImage.js +105 -0
- package/lib/primitiveTypes/SquizImage.js.map +1 -0
- package/lib/primitiveTypes/index.d.ts +2 -0
- package/lib/primitiveTypes/index.js +19 -0
- package/lib/primitiveTypes/index.js.map +1 -0
- package/lib/resolvableTypes/MatrixAsset.d.ts +9 -0
- package/lib/resolvableTypes/MatrixAsset.js +21 -0
- package/lib/resolvableTypes/MatrixAsset.js.map +1 -0
- package/lib/resolvableTypes/index.d.ts +1 -0
- package/lib/resolvableTypes/index.js +18 -0
- package/lib/resolvableTypes/index.js.map +1 -0
- package/package.json +5 -4
- package/src/JsonValidationService.spec.ts +585 -584
- package/src/JsonValidationService.ts +19 -9
- package/src/index.ts +8 -1
- package/src/jsonTypeResolution/{arbitraryTypeResolution.spec.ts → TypeResolver.spec.ts} +23 -70
- package/src/jsonTypeResolution/{arbitraryTypeResolution.ts → TypeResolver.ts} +27 -23
- package/src/jsonTypeResolution/TypeResolverBuilder.ts +43 -0
- package/src/manifest/v1/DxContentMetaSchema.json +1 -1
- package/src/manifest/v1/MatrixAssetSchema.json +28 -8
- package/src/manifest/v1/v1.ts +22 -9
- package/src/primitiveTypes/FormattedText.ts +24 -0
- package/src/primitiveTypes/SquizImage.ts +128 -0
- package/src/primitiveTypes/index.ts +2 -0
- package/src/resolvableTypes/MatrixAsset.ts +24 -0
- package/src/resolvableTypes/index.ts +1 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/.npm/_logs/2023-03-08T03_21_11_525Z-debug-0.log +0 -39
- package/lib/jsonTypeResolution/arbitraryTypeResolution.js.map +0 -1
- package/lib/jsonTypeResolution/arbitraryTypeResolution.spec.js.map +0 -1
- package/lib/jsonTypeResolution/index.d.ts +0 -76
- package/lib/jsonTypeResolution/index.js +0 -35
- package/lib/jsonTypeResolution/index.js.map +0 -1
- package/lib/jsonTypeResolution/primitiveTypes.d.ts +0 -10
- package/lib/jsonTypeResolution/primitiveTypes.js +0 -27
- package/lib/jsonTypeResolution/primitiveTypes.js.map +0 -1
- package/lib/jsonTypeResolution/resolvableTypes.d.ts +0 -12
- package/lib/jsonTypeResolution/resolvableTypes.js +0 -30
- package/lib/jsonTypeResolution/resolvableTypes.js.map +0 -1
- package/src/jsonTypeResolution/index.ts +0 -16
- package/src/jsonTypeResolution/primitiveTypes.ts +0 -32
- package/src/jsonTypeResolution/resolvableTypes.ts +0 -37
- /package/lib/jsonTypeResolution/{arbitraryTypeResolution.spec.d.ts → TypeResolver.spec.d.ts} +0 -0
@@ -8,7 +8,8 @@ const SchemaValidationError_1 = require("./errors/SchemaValidationError");
|
|
8
8
|
const validComponent_json_1 = __importDefault(require("./manifest/v1/__test__/schemas/validComponent.json"));
|
9
9
|
const validComponentJson_json_1 = __importDefault(require("./manifest/v1/__test__/schemas/validComponentJson.json"));
|
10
10
|
const inputStringWithFormat_json_1 = __importDefault(require("./manifest/v1/__test__/schemas/inputStringWithFormat.json"));
|
11
|
-
const
|
11
|
+
const TypeResolver_1 = require("./jsonTypeResolution/TypeResolver");
|
12
|
+
const primitiveTypes_1 = require("./primitiveTypes");
|
12
13
|
// eslint-disable-next-line @typescript-eslint/ban-types
|
13
14
|
function expectToThrowErrorMatchingTypeAndMessage(received, errorType, message) {
|
14
15
|
let error = null;
|
@@ -50,63 +51,7 @@ describe('JsonValidationService', () => {
|
|
50
51
|
expect(result).toBe(true);
|
51
52
|
});
|
52
53
|
});
|
53
|
-
describe('
|
54
|
-
it('should return true for a valid content schema', () => {
|
55
|
-
const contentSchema = {
|
56
|
-
type: 'object',
|
57
|
-
properties: {
|
58
|
-
'my-input': { type: 'number' },
|
59
|
-
},
|
60
|
-
required: ['my-input'],
|
61
|
-
};
|
62
|
-
const result = jsonValidationService.validateContentSchema(contentSchema);
|
63
|
-
expect(result).toBe(true);
|
64
|
-
});
|
65
|
-
it('should return false for an invalid content schema, where the required property is missed from a child object', () => {
|
66
|
-
const contentSchema = {
|
67
|
-
type: 'object',
|
68
|
-
properties: {
|
69
|
-
'my-input': {
|
70
|
-
type: 'object',
|
71
|
-
properties: {
|
72
|
-
'my-deep-input': { type: 'object' },
|
73
|
-
},
|
74
|
-
},
|
75
|
-
},
|
76
|
-
required: ['my-input'],
|
77
|
-
};
|
78
|
-
expectToThrowErrorMatchingTypeAndMessage(() => {
|
79
|
-
jsonValidationService.validateContentSchema(contentSchema);
|
80
|
-
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: The required property `required` is missing at `#/properties/my-input`');
|
81
|
-
});
|
82
|
-
it('should throw a SchemaValidationError for an invalid content schema, top level type must be object', () => {
|
83
|
-
const contentSchema = {
|
84
|
-
type: 'array',
|
85
|
-
items: {
|
86
|
-
type: 'object',
|
87
|
-
properties: {
|
88
|
-
'my-input': { type: 'number' },
|
89
|
-
},
|
90
|
-
required: ['my-input'],
|
91
|
-
},
|
92
|
-
};
|
93
|
-
expectToThrowErrorMatchingTypeAndMessage(() => {
|
94
|
-
jsonValidationService.validateContentSchema(contentSchema);
|
95
|
-
}, SchemaValidationError_1.SchemaValidationError, `failed validation: Expected value at \`#/type\` to be \`object\`, but value given is \`array\``);
|
96
|
-
});
|
97
|
-
it('should throw a SchemaValidationError for an invalid content schema missing the required property', () => {
|
98
|
-
const contentSchema = {
|
99
|
-
type: 'object',
|
100
|
-
properties: {
|
101
|
-
'my-input': { type: 'number' },
|
102
|
-
},
|
103
|
-
};
|
104
|
-
expectToThrowErrorMatchingTypeAndMessage(() => {
|
105
|
-
jsonValidationService.validateContentSchema(contentSchema);
|
106
|
-
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: The required property `required` is missing at `#`');
|
107
|
-
});
|
108
|
-
});
|
109
|
-
describe('validateComponentInput', () => {
|
54
|
+
describe('validateRenderInput', () => {
|
110
55
|
describe('matrix-asset-uri input', () => {
|
111
56
|
const functionInputSchema = {
|
112
57
|
type: 'object',
|
@@ -117,14 +62,14 @@ describe('JsonValidationService', () => {
|
|
117
62
|
};
|
118
63
|
it('should return true for valid a string with matrix-asset-uri format', () => {
|
119
64
|
const validMatrixAssetUri = 'matrix-asset://canary.uat.matrix.squiz.cloud/abc123';
|
120
|
-
expect(jsonValidationService.
|
65
|
+
expect(jsonValidationService.validateRenderInput(functionInputSchema, {
|
121
66
|
'matrix-asset': validMatrixAssetUri,
|
122
67
|
})).toEqual(true);
|
123
68
|
});
|
124
69
|
it('should throw error for invalid matrix-asset-uri format', () => {
|
125
70
|
const invalidMatrixAssetUri = 'not-valid://canary.uat.matrix.squiz.cloud//abc123';
|
126
71
|
expectToThrowErrorMatchingTypeAndMessage(() => {
|
127
|
-
jsonValidationService.
|
72
|
+
jsonValidationService.validateRenderInput(functionInputSchema, {
|
128
73
|
'matrix-asset': invalidMatrixAssetUri,
|
129
74
|
});
|
130
75
|
}, SchemaValidationError_1.SchemaValidationError, `failed validation: value "not-valid://canary.uat.matrix.squiz.cloud//abc123" isn't a valid matrix asset uri`);
|
@@ -132,7 +77,7 @@ describe('JsonValidationService', () => {
|
|
132
77
|
it('should throw error for invalid matrix-asset-uri type number', () => {
|
133
78
|
const invalidMatrixAssetUri = 1234;
|
134
79
|
expectToThrowErrorMatchingTypeAndMessage(() => {
|
135
|
-
jsonValidationService.
|
80
|
+
jsonValidationService.validateRenderInput(functionInputSchema, {
|
136
81
|
'matrix-asset': invalidMatrixAssetUri,
|
137
82
|
});
|
138
83
|
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: Expected `1234` (number) in `#/matrix-asset` to be of type `string`');
|
@@ -140,351 +85,12 @@ describe('JsonValidationService', () => {
|
|
140
85
|
it('should throw error for invalid matrix-asset-uri which does not contain correct number of parts', () => {
|
141
86
|
const invalidMatrixAssetUri = 'matrix://';
|
142
87
|
expectToThrowErrorMatchingTypeAndMessage(() => {
|
143
|
-
jsonValidationService.
|
88
|
+
jsonValidationService.validateRenderInput(functionInputSchema, {
|
144
89
|
'matrix-asset': invalidMatrixAssetUri,
|
145
90
|
});
|
146
91
|
}, SchemaValidationError_1.SchemaValidationError, `failed validation: value "matrix://" isn't a valid matrix asset uri`);
|
147
92
|
});
|
148
93
|
});
|
149
|
-
describe('FormattedText input', () => {
|
150
|
-
it('should handle type as an array', () => {
|
151
|
-
const functionInputSchema = {
|
152
|
-
type: 'object',
|
153
|
-
properties: {
|
154
|
-
'my-input': { type: ['number', 'string'] },
|
155
|
-
},
|
156
|
-
required: ['my-input'],
|
157
|
-
};
|
158
|
-
expect(jsonValidationService.validateComponentInput(functionInputSchema, {
|
159
|
-
'my-input': 'formattedText',
|
160
|
-
})).toEqual(true);
|
161
|
-
expect(jsonValidationService.validateComponentInput(functionInputSchema, {
|
162
|
-
'my-input': 123,
|
163
|
-
})).toEqual(true);
|
164
|
-
});
|
165
|
-
it('should handle type is an array of both string and FormattedText', () => {
|
166
|
-
const formattedText = [
|
167
|
-
{
|
168
|
-
tag: 'p',
|
169
|
-
type: 'tag',
|
170
|
-
children: [
|
171
|
-
{ type: 'text', value: 'This is some ' },
|
172
|
-
{ type: 'text', value: 'Link to asset 12345' },
|
173
|
-
{ type: 'text', value: ' with an image ' },
|
174
|
-
{ type: 'text', value: '.' },
|
175
|
-
],
|
176
|
-
},
|
177
|
-
];
|
178
|
-
const functionInputSchema = {
|
179
|
-
type: 'object',
|
180
|
-
properties: {
|
181
|
-
'my-input': { type: ['FormattedText', 'string'] },
|
182
|
-
},
|
183
|
-
required: ['my-input'],
|
184
|
-
};
|
185
|
-
expect(jsonValidationService.validateComponentInput(functionInputSchema, {
|
186
|
-
'my-input': formattedText,
|
187
|
-
})).toEqual(true);
|
188
|
-
expect(jsonValidationService.validateComponentInput(functionInputSchema, {
|
189
|
-
'my-input': 'hello',
|
190
|
-
})).toEqual(true);
|
191
|
-
});
|
192
|
-
it('should return true if input is formatted text', () => {
|
193
|
-
const functionInputSchema = {
|
194
|
-
type: 'object',
|
195
|
-
properties: {
|
196
|
-
'my-input': { type: 'FormattedText' },
|
197
|
-
},
|
198
|
-
required: ['my-input'],
|
199
|
-
};
|
200
|
-
const formattedText = [
|
201
|
-
{
|
202
|
-
tag: 'p',
|
203
|
-
type: 'tag',
|
204
|
-
children: [
|
205
|
-
{ type: 'text', value: 'This is some ' },
|
206
|
-
{ type: 'text', value: 'Link to asset 12345' },
|
207
|
-
{ type: 'text', value: ' with an image ' },
|
208
|
-
{ type: 'text', value: '.' },
|
209
|
-
],
|
210
|
-
},
|
211
|
-
];
|
212
|
-
const inputValue = {
|
213
|
-
'my-input': formattedText,
|
214
|
-
};
|
215
|
-
expect(jsonValidationService.validateComponentInput(functionInputSchema, inputValue)).toEqual(true);
|
216
|
-
});
|
217
|
-
it('should throw an error if the FormattedText input is not formatted text', () => {
|
218
|
-
const functionInputSchema = {
|
219
|
-
type: 'object',
|
220
|
-
properties: {
|
221
|
-
'my-input': { type: 'FormattedText' },
|
222
|
-
},
|
223
|
-
required: ['my-input'],
|
224
|
-
};
|
225
|
-
const inputValue = {
|
226
|
-
'my-input': 123,
|
227
|
-
};
|
228
|
-
expectToThrowErrorMatchingTypeAndMessage(() => {
|
229
|
-
jsonValidationService.validateComponentInput(functionInputSchema, inputValue);
|
230
|
-
}, SchemaValidationError_1.SchemaValidationError, `failed validation: Expected \`123\` (number) in \`#/my-input\` to be of type \`array\``);
|
231
|
-
});
|
232
|
-
it('should throw an error if the FormattedText input is invalid formatted text', () => {
|
233
|
-
const functionInputSchema = {
|
234
|
-
type: 'object',
|
235
|
-
properties: {
|
236
|
-
'my-input': { type: 'FormattedText' },
|
237
|
-
},
|
238
|
-
required: ['my-input'],
|
239
|
-
};
|
240
|
-
const inputValue = {
|
241
|
-
'my-input': {
|
242
|
-
something: 'aa',
|
243
|
-
},
|
244
|
-
};
|
245
|
-
expectToThrowErrorMatchingTypeAndMessage(() => {
|
246
|
-
jsonValidationService.validateComponentInput(functionInputSchema, inputValue);
|
247
|
-
}, SchemaValidationError_1.SchemaValidationError, `failed validation: Expected \`[object Object]\` (object) in \`#/my-input\` to be of type \`array\``);
|
248
|
-
});
|
249
|
-
it('should throw an error if the FormattedText input is invalid formatted text (deeply nested)', () => {
|
250
|
-
const functionInputSchema = {
|
251
|
-
type: 'object',
|
252
|
-
properties: {
|
253
|
-
'my-input': { type: 'FormattedText' },
|
254
|
-
},
|
255
|
-
required: ['my-input'],
|
256
|
-
};
|
257
|
-
const formattedText = [
|
258
|
-
{
|
259
|
-
tag: 'p',
|
260
|
-
type: 'tag',
|
261
|
-
children: [
|
262
|
-
{ type: 'text', value: 'This is some ' },
|
263
|
-
{ type: 'text', value: 'Link to asset 12345' },
|
264
|
-
{ type: 'text', value: ' with an image ' },
|
265
|
-
{ type: 'text', value: 123 },
|
266
|
-
{ type: 'text', value: '.' },
|
267
|
-
],
|
268
|
-
},
|
269
|
-
];
|
270
|
-
const inputValue = {
|
271
|
-
'my-input': formattedText,
|
272
|
-
};
|
273
|
-
expectToThrowErrorMatchingTypeAndMessage(() => {
|
274
|
-
jsonValidationService.validateComponentInput(functionInputSchema, inputValue);
|
275
|
-
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: Object at `#/my-input/0` does not match any schema');
|
276
|
-
});
|
277
|
-
it('should validate an array of formatted texts', () => {
|
278
|
-
const formattedText = [
|
279
|
-
{
|
280
|
-
tag: 'p',
|
281
|
-
type: 'tag',
|
282
|
-
children: [{ type: 'text', value: 'hello' }],
|
283
|
-
},
|
284
|
-
];
|
285
|
-
const schema = {
|
286
|
-
type: 'object',
|
287
|
-
properties: {
|
288
|
-
arr: {
|
289
|
-
type: 'array',
|
290
|
-
items: { type: 'FormattedText' },
|
291
|
-
},
|
292
|
-
},
|
293
|
-
};
|
294
|
-
const value = {
|
295
|
-
arr: [formattedText],
|
296
|
-
};
|
297
|
-
expect(jsonValidationService.validateComponentInput(schema, value)).toEqual(true);
|
298
|
-
});
|
299
|
-
it('should throw an error if the FormattedText input is invalid formatted text (deeply, deeply nested)', () => {
|
300
|
-
const formattedText = [
|
301
|
-
{
|
302
|
-
tag: 'p',
|
303
|
-
type: 'tag',
|
304
|
-
children: [{ type: 'text', value: 'hello' }],
|
305
|
-
},
|
306
|
-
];
|
307
|
-
const inputValue = {
|
308
|
-
'my-input': formattedText,
|
309
|
-
deep: {
|
310
|
-
arr: [
|
311
|
-
{
|
312
|
-
prop: formattedText,
|
313
|
-
formattedTextArray: [formattedText, formattedText, { bad: 'data' }],
|
314
|
-
},
|
315
|
-
],
|
316
|
-
},
|
317
|
-
};
|
318
|
-
const functionInputSchema = {
|
319
|
-
type: 'object',
|
320
|
-
properties: {
|
321
|
-
'my-input': { type: 'FormattedText' },
|
322
|
-
deep: {
|
323
|
-
type: 'object',
|
324
|
-
properties: {
|
325
|
-
arr: {
|
326
|
-
type: 'array',
|
327
|
-
items: {
|
328
|
-
type: 'object',
|
329
|
-
required: ['prop', 'formattedTextArray'],
|
330
|
-
properties: {
|
331
|
-
prop: 'FormattedText',
|
332
|
-
formattedTextArray: {
|
333
|
-
type: 'array',
|
334
|
-
items: {
|
335
|
-
type: 'FormattedText',
|
336
|
-
},
|
337
|
-
},
|
338
|
-
},
|
339
|
-
},
|
340
|
-
},
|
341
|
-
},
|
342
|
-
required: ['arr'],
|
343
|
-
},
|
344
|
-
},
|
345
|
-
required: ['my-input', 'deep'],
|
346
|
-
};
|
347
|
-
expectToThrowErrorMatchingTypeAndMessage(() => {
|
348
|
-
jsonValidationService.validateComponentInput(functionInputSchema, inputValue);
|
349
|
-
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: Expected `[object Object]` (object) in `#/deep/arr/0/formattedTextArray/2` to be of type `array`');
|
350
|
-
});
|
351
|
-
it('should validate a FormattedText value when the schema is a $ref', async () => {
|
352
|
-
const formattedText = [
|
353
|
-
{
|
354
|
-
tag: 'p',
|
355
|
-
type: 'tag',
|
356
|
-
children: [{ type: 'text', value: 'hello' }],
|
357
|
-
},
|
358
|
-
];
|
359
|
-
const schema = {
|
360
|
-
type: 'object',
|
361
|
-
properties: {
|
362
|
-
'my-input': { $ref: '#/definitions/FormattedText' },
|
363
|
-
},
|
364
|
-
definitions: {
|
365
|
-
FormattedText: { type: 'FormattedText' },
|
366
|
-
},
|
367
|
-
required: ['my-input'],
|
368
|
-
};
|
369
|
-
const value = {
|
370
|
-
'my-input': formattedText,
|
371
|
-
};
|
372
|
-
expect(jsonValidationService.validateComponentInput(schema, value)).toEqual(true);
|
373
|
-
});
|
374
|
-
it('should error when a FormattedText value is invalid when the schema is a $ref', async () => {
|
375
|
-
const schema = {
|
376
|
-
type: 'object',
|
377
|
-
properties: {
|
378
|
-
'my-input': { $ref: '#/definitions/FormattedText' },
|
379
|
-
},
|
380
|
-
definitions: {
|
381
|
-
FormattedText: { type: 'FormattedText' },
|
382
|
-
},
|
383
|
-
required: ['my-input'],
|
384
|
-
};
|
385
|
-
const value = {
|
386
|
-
'my-input': { bad: 'data' },
|
387
|
-
};
|
388
|
-
expectToThrowErrorMatchingTypeAndMessage(() => {
|
389
|
-
jsonValidationService.validateComponentInput(schema, value);
|
390
|
-
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: Expected `[object Object]` (object) in `#/my-input` to be of type `array`');
|
391
|
-
});
|
392
|
-
it('should validate a FormattedText value when the schema is a $ref to a $ref', async () => {
|
393
|
-
const formattedText = [
|
394
|
-
{
|
395
|
-
tag: 'p',
|
396
|
-
type: 'tag',
|
397
|
-
children: [{ type: 'text', value: 'hello' }],
|
398
|
-
},
|
399
|
-
];
|
400
|
-
const schema = {
|
401
|
-
type: 'object',
|
402
|
-
properties: {
|
403
|
-
'my-input': { $ref: '#/definitions/FormattedText' },
|
404
|
-
},
|
405
|
-
definitions: {
|
406
|
-
FormattedText: { $ref: '#/definitions/FormattedText2' },
|
407
|
-
FormattedText2: { type: 'FormattedText' },
|
408
|
-
},
|
409
|
-
required: ['my-input'],
|
410
|
-
};
|
411
|
-
const value = {
|
412
|
-
'my-input': formattedText,
|
413
|
-
};
|
414
|
-
expect(jsonValidationService.validateComponentInput(schema, value)).toEqual(true);
|
415
|
-
});
|
416
|
-
it('should validate a FormattedText value when the schema is in an if/then/else', async () => {
|
417
|
-
const formattedText = [
|
418
|
-
{
|
419
|
-
tag: 'p',
|
420
|
-
type: 'tag',
|
421
|
-
children: [{ type: 'text', value: 'hello' }],
|
422
|
-
},
|
423
|
-
];
|
424
|
-
const schema = {
|
425
|
-
type: 'object',
|
426
|
-
properties: {
|
427
|
-
'my-input': {
|
428
|
-
if: { type: 'string' },
|
429
|
-
then: { type: 'string' },
|
430
|
-
else: { type: 'FormattedText' },
|
431
|
-
},
|
432
|
-
},
|
433
|
-
required: ['my-input'],
|
434
|
-
};
|
435
|
-
const value = {
|
436
|
-
'my-input': formattedText,
|
437
|
-
};
|
438
|
-
expect(jsonValidationService.validateComponentInput(schema, value)).toEqual(true);
|
439
|
-
});
|
440
|
-
});
|
441
|
-
describe('standard inputs', () => {
|
442
|
-
const functionInputSchema = {
|
443
|
-
type: 'object',
|
444
|
-
properties: {
|
445
|
-
'my-input': { type: 'number' },
|
446
|
-
},
|
447
|
-
required: ['my-input'],
|
448
|
-
};
|
449
|
-
it('should return true for valid input values', () => {
|
450
|
-
const inputValue = {
|
451
|
-
'my-input': 123,
|
452
|
-
};
|
453
|
-
const result = jsonValidationService.validateComponentInput(functionInputSchema, inputValue);
|
454
|
-
expect(result).toBe(true);
|
455
|
-
});
|
456
|
-
it('should throw a SchemaValidationError for invalid input type', () => {
|
457
|
-
const inputValue = {
|
458
|
-
'my-input': '123',
|
459
|
-
};
|
460
|
-
expectToThrowErrorMatchingTypeAndMessage(() => {
|
461
|
-
jsonValidationService.validateComponentInput(functionInputSchema, inputValue);
|
462
|
-
}, SchemaValidationError_1.SchemaValidationError, `failed validation: Expected \`123\` (string) in \`#/my-input\` to be of type \`number\``);
|
463
|
-
});
|
464
|
-
it('should throw a SchemaValidationError for invalid input missing properties', () => {
|
465
|
-
const inputValue = {};
|
466
|
-
expectToThrowErrorMatchingTypeAndMessage(() => {
|
467
|
-
jsonValidationService.validateComponentInput(functionInputSchema, inputValue);
|
468
|
-
}, SchemaValidationError_1.SchemaValidationError, `failed validation: The required property \`my-input\` is missing at \`#\``);
|
469
|
-
});
|
470
|
-
it('should throw a SchemaValidationError with a truncated enum value list if there are more than 5 enum options', () => {
|
471
|
-
expectToThrowErrorMatchingTypeAndMessage(() => {
|
472
|
-
jsonValidationService.validateComponentInput({ type: 'object', properties: { enum: { type: 'string', enum: ['a', 'b', 'c', 'd', 'e', 'f', 'g'] } } }, { enum: 'z' });
|
473
|
-
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: Expected given value `z` in #/enum` to be one of `[a, b, c, d, e, ... 2 more]`');
|
474
|
-
});
|
475
|
-
// TODO DEVX-658
|
476
|
-
it.skip('should throw a SchemaValidationError for invalid input additional properties', () => {
|
477
|
-
const inputValue = {
|
478
|
-
'my-input': 123,
|
479
|
-
'my-input-2': 123,
|
480
|
-
};
|
481
|
-
expect(() => {
|
482
|
-
jsonValidationService.validateComponentInput(functionInputSchema, inputValue);
|
483
|
-
}).toThrowErrorMatchingInlineSnapshot();
|
484
|
-
});
|
485
|
-
});
|
486
|
-
});
|
487
|
-
describe('validateRenderInput', () => {
|
488
94
|
it('should validate a property with type FormattedText as string', () => {
|
489
95
|
const schema = {
|
490
96
|
type: 'object',
|
@@ -567,29 +173,426 @@ const defaultSchema = {
|
|
567
173
|
required: ['myProperty'],
|
568
174
|
};
|
569
175
|
function primitiveTypeFixture(title, schema = defaultSchema) {
|
570
|
-
return (0,
|
176
|
+
return (0, TypeResolver_1.PrimitiveType)({
|
571
177
|
...schema,
|
572
178
|
title,
|
573
179
|
});
|
574
180
|
}
|
575
181
|
function resolvableTypeFixture(title, schema = defaultSchema) {
|
576
|
-
return (0,
|
182
|
+
return (0, TypeResolver_1.ResolvableType)({
|
577
183
|
...schema,
|
578
184
|
title,
|
579
185
|
});
|
580
186
|
}
|
581
187
|
describe('JsonSchemaService', () => {
|
188
|
+
let jsonSchemaService;
|
189
|
+
beforeAll(() => {
|
190
|
+
const typeResolver = new TypeResolver_1.TypeResolver([primitiveTypes_1.FormattedTextType]);
|
191
|
+
jsonSchemaService = new JsonValidationService_1.JSONSchemaService(typeResolver, JsonValidationService_1.ComponentInputMetaSchema);
|
192
|
+
});
|
193
|
+
describe('validateContentSchema', () => {
|
194
|
+
it('should return true for a valid content schema', () => {
|
195
|
+
const contentSchema = {
|
196
|
+
type: 'object',
|
197
|
+
properties: {
|
198
|
+
'my-input': { type: 'number' },
|
199
|
+
},
|
200
|
+
required: ['my-input'],
|
201
|
+
};
|
202
|
+
const result = jsonSchemaService.validateInput(contentSchema);
|
203
|
+
expect(result).toBe(true);
|
204
|
+
});
|
205
|
+
it('should return false for an invalid content schema, where the required property is missed from a child object', () => {
|
206
|
+
const contentSchema = {
|
207
|
+
type: 'object',
|
208
|
+
properties: {
|
209
|
+
'my-input': {
|
210
|
+
type: 'object',
|
211
|
+
properties: {
|
212
|
+
'my-deep-input': { type: 'object' },
|
213
|
+
},
|
214
|
+
},
|
215
|
+
},
|
216
|
+
required: ['my-input'],
|
217
|
+
};
|
218
|
+
expectToThrowErrorMatchingTypeAndMessage(() => {
|
219
|
+
jsonSchemaService.validateInput(contentSchema);
|
220
|
+
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: The required property `required` is missing at `#/properties/my-input`');
|
221
|
+
});
|
222
|
+
it('should throw a SchemaValidationError for an invalid content schema, top level type must be object', () => {
|
223
|
+
const contentSchema = {
|
224
|
+
type: 'array',
|
225
|
+
items: {
|
226
|
+
type: 'object',
|
227
|
+
properties: {
|
228
|
+
'my-input': { type: 'number' },
|
229
|
+
},
|
230
|
+
required: ['my-input'],
|
231
|
+
},
|
232
|
+
};
|
233
|
+
expectToThrowErrorMatchingTypeAndMessage(() => {
|
234
|
+
jsonSchemaService.validateInput(contentSchema);
|
235
|
+
}, SchemaValidationError_1.SchemaValidationError, `failed validation: Expected value at \`#/type\` to be \`object\`, but value given is \`array\``);
|
236
|
+
});
|
237
|
+
it('should throw a SchemaValidationError for an invalid content schema missing the required property', () => {
|
238
|
+
const contentSchema = {
|
239
|
+
type: 'object',
|
240
|
+
properties: {
|
241
|
+
'my-input': { type: 'number' },
|
242
|
+
},
|
243
|
+
};
|
244
|
+
expectToThrowErrorMatchingTypeAndMessage(() => {
|
245
|
+
jsonSchemaService.validateInput(contentSchema);
|
246
|
+
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: The required property `required` is missing at `#`');
|
247
|
+
});
|
248
|
+
});
|
249
|
+
describe('FormattedText input', () => {
|
250
|
+
it('should handle type as an array', () => {
|
251
|
+
const functionInputSchema = {
|
252
|
+
type: 'object',
|
253
|
+
properties: {
|
254
|
+
'my-input': { type: ['number', 'string'] },
|
255
|
+
},
|
256
|
+
required: ['my-input'],
|
257
|
+
};
|
258
|
+
expect(jsonSchemaService.validateInput({
|
259
|
+
'my-input': 'formattedText',
|
260
|
+
}, functionInputSchema)).toEqual(true);
|
261
|
+
expect(jsonSchemaService.validateInput({
|
262
|
+
'my-input': 123,
|
263
|
+
}, functionInputSchema)).toEqual(true);
|
264
|
+
});
|
265
|
+
it.failing('should handle type is an array of both string and FormattedText', () => {
|
266
|
+
const formattedText = [
|
267
|
+
{
|
268
|
+
tag: 'p',
|
269
|
+
type: 'tag',
|
270
|
+
children: [
|
271
|
+
{ type: 'text', value: 'This is some ' },
|
272
|
+
{ type: 'text', value: 'Link to asset 12345' },
|
273
|
+
{ type: 'text', value: ' with an image ' },
|
274
|
+
{ type: 'text', value: '.' },
|
275
|
+
],
|
276
|
+
},
|
277
|
+
];
|
278
|
+
const functionInputSchema = {
|
279
|
+
type: 'object',
|
280
|
+
properties: {
|
281
|
+
'my-input': { type: ['FormattedText', 'string'] },
|
282
|
+
},
|
283
|
+
required: ['my-input'],
|
284
|
+
};
|
285
|
+
expect(jsonSchemaService.validateInput({
|
286
|
+
'my-input': formattedText,
|
287
|
+
}, functionInputSchema)).toEqual(true);
|
288
|
+
expect(jsonSchemaService.validateInput({
|
289
|
+
'my-input': 'hello',
|
290
|
+
}, functionInputSchema)).toEqual(true);
|
291
|
+
});
|
292
|
+
it('should return true if input is formatted text', () => {
|
293
|
+
const functionInputSchema = {
|
294
|
+
type: 'object',
|
295
|
+
properties: {
|
296
|
+
'my-input': { type: 'FormattedText' },
|
297
|
+
},
|
298
|
+
required: ['my-input'],
|
299
|
+
};
|
300
|
+
const formattedText = [
|
301
|
+
{
|
302
|
+
tag: 'p',
|
303
|
+
type: 'tag',
|
304
|
+
children: [
|
305
|
+
{ type: 'text', value: 'This is some ' },
|
306
|
+
{ type: 'text', value: 'Link to asset 12345' },
|
307
|
+
{ type: 'text', value: ' with an image ' },
|
308
|
+
{ type: 'text', value: '.' },
|
309
|
+
],
|
310
|
+
},
|
311
|
+
];
|
312
|
+
const inputValue = {
|
313
|
+
'my-input': formattedText,
|
314
|
+
};
|
315
|
+
expect(() => jsonSchemaService.validateInput(inputValue, functionInputSchema)).not.toThrow();
|
316
|
+
});
|
317
|
+
it('should throw an error if the FormattedText input is not formatted text', () => {
|
318
|
+
const functionInputSchema = {
|
319
|
+
type: 'object',
|
320
|
+
properties: {
|
321
|
+
'my-input': { type: 'FormattedText' },
|
322
|
+
},
|
323
|
+
required: ['my-input'],
|
324
|
+
};
|
325
|
+
const inputValue = {
|
326
|
+
'my-input': 123,
|
327
|
+
};
|
328
|
+
expectToThrowErrorMatchingTypeAndMessage(() => {
|
329
|
+
jsonSchemaService.validateInput(inputValue, functionInputSchema);
|
330
|
+
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: Value `123` in `#/my-input` does not match any given oneof schema');
|
331
|
+
});
|
332
|
+
it('should throw an error if the FormattedText input is invalid formatted text', () => {
|
333
|
+
const functionInputSchema = {
|
334
|
+
type: 'object',
|
335
|
+
properties: {
|
336
|
+
'my-input': { type: 'FormattedText' },
|
337
|
+
},
|
338
|
+
required: ['my-input'],
|
339
|
+
};
|
340
|
+
const inputValue = {
|
341
|
+
'my-input': {
|
342
|
+
something: 'aa',
|
343
|
+
},
|
344
|
+
};
|
345
|
+
expectToThrowErrorMatchingTypeAndMessage(() => {
|
346
|
+
jsonSchemaService.validateInput(inputValue, functionInputSchema);
|
347
|
+
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: Value `{"something":"aa"}` in `#/my-input` does not match any given oneof schema');
|
348
|
+
});
|
349
|
+
it('should throw an error if the FormattedText input is invalid formatted text (deeply nested)', () => {
|
350
|
+
const functionInputSchema = {
|
351
|
+
type: 'object',
|
352
|
+
properties: {
|
353
|
+
'my-input': { type: 'FormattedText' },
|
354
|
+
},
|
355
|
+
required: ['my-input'],
|
356
|
+
};
|
357
|
+
const formattedText = [
|
358
|
+
{
|
359
|
+
tag: 'p',
|
360
|
+
type: 'tag',
|
361
|
+
children: [
|
362
|
+
{ type: 'text', value: 'This is some ' },
|
363
|
+
{ type: 'text', value: 'Link to asset 12345' },
|
364
|
+
{ type: 'text', value: ' with an image ' },
|
365
|
+
{ type: 'text', value: 123 },
|
366
|
+
{ type: 'text', value: '.' },
|
367
|
+
],
|
368
|
+
},
|
369
|
+
];
|
370
|
+
const inputValue = {
|
371
|
+
'my-input': formattedText,
|
372
|
+
};
|
373
|
+
expectToThrowErrorMatchingTypeAndMessage(() => {
|
374
|
+
jsonSchemaService.validateInput(inputValue, functionInputSchema);
|
375
|
+
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: Value `[{"tag":"p","type":"tag","children":[{"type":"text","value":"This is some "},{"type":"text","value":"Link to asset 12345"},{"type":"text","value":" with an image "},{"type":"text","value":123},{"type":"text","value":"."}]}]` in `#/my-input` does not match any given oneof schema');
|
376
|
+
});
|
377
|
+
it('should validate an array of formatted texts', () => {
|
378
|
+
const formattedText = [
|
379
|
+
{
|
380
|
+
tag: 'p',
|
381
|
+
type: 'tag',
|
382
|
+
children: [{ type: 'text', value: 'hello' }],
|
383
|
+
},
|
384
|
+
];
|
385
|
+
const schema = {
|
386
|
+
type: 'object',
|
387
|
+
properties: {
|
388
|
+
arr: {
|
389
|
+
type: 'array',
|
390
|
+
items: { type: 'FormattedText' },
|
391
|
+
},
|
392
|
+
},
|
393
|
+
};
|
394
|
+
const value = {
|
395
|
+
arr: [formattedText],
|
396
|
+
};
|
397
|
+
expect(jsonSchemaService.validateInput(value, schema)).toEqual(true);
|
398
|
+
});
|
399
|
+
it('should throw an error if the FormattedText input is invalid formatted text (deeply, deeply nested)', () => {
|
400
|
+
const formattedText = [
|
401
|
+
{
|
402
|
+
tag: 'p',
|
403
|
+
type: 'tag',
|
404
|
+
children: [{ type: 'text', value: 'hello' }],
|
405
|
+
},
|
406
|
+
];
|
407
|
+
const inputValue = {
|
408
|
+
'my-input': formattedText,
|
409
|
+
deep: {
|
410
|
+
arr: [
|
411
|
+
{
|
412
|
+
prop: formattedText,
|
413
|
+
formattedTextArray: [formattedText, formattedText, { bad: 'data' }],
|
414
|
+
},
|
415
|
+
],
|
416
|
+
},
|
417
|
+
};
|
418
|
+
const functionInputSchema = {
|
419
|
+
type: 'object',
|
420
|
+
properties: {
|
421
|
+
'my-input': { type: 'FormattedText' },
|
422
|
+
deep: {
|
423
|
+
type: 'object',
|
424
|
+
properties: {
|
425
|
+
arr: {
|
426
|
+
type: 'array',
|
427
|
+
items: {
|
428
|
+
type: 'object',
|
429
|
+
required: ['prop', 'formattedTextArray'],
|
430
|
+
properties: {
|
431
|
+
prop: 'FormattedText',
|
432
|
+
formattedTextArray: {
|
433
|
+
type: 'array',
|
434
|
+
items: {
|
435
|
+
type: 'FormattedText',
|
436
|
+
},
|
437
|
+
},
|
438
|
+
},
|
439
|
+
},
|
440
|
+
},
|
441
|
+
},
|
442
|
+
required: ['arr'],
|
443
|
+
},
|
444
|
+
},
|
445
|
+
required: ['my-input', 'deep'],
|
446
|
+
};
|
447
|
+
expectToThrowErrorMatchingTypeAndMessage(() => {
|
448
|
+
jsonSchemaService.validateInput(inputValue, functionInputSchema);
|
449
|
+
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: Value `{"bad":"data"}` in `#/deep/arr/0/formattedTextArray/2` does not match any given oneof schema');
|
450
|
+
});
|
451
|
+
it('should validate a FormattedText value when the schema is a $ref', async () => {
|
452
|
+
const formattedText = [
|
453
|
+
{
|
454
|
+
tag: 'p',
|
455
|
+
type: 'tag',
|
456
|
+
children: [{ type: 'text', value: 'hello' }],
|
457
|
+
},
|
458
|
+
];
|
459
|
+
const schema = {
|
460
|
+
type: 'object',
|
461
|
+
properties: {
|
462
|
+
'my-input': { $ref: '#/definitions/FormattedText' },
|
463
|
+
},
|
464
|
+
definitions: {
|
465
|
+
FormattedText: { type: 'FormattedText' },
|
466
|
+
},
|
467
|
+
required: ['my-input'],
|
468
|
+
};
|
469
|
+
const value = {
|
470
|
+
'my-input': formattedText,
|
471
|
+
};
|
472
|
+
expect(jsonSchemaService.validateInput(value, schema)).toEqual(true);
|
473
|
+
});
|
474
|
+
it('should error when a FormattedText value is invalid when the schema is a $ref', async () => {
|
475
|
+
const schema = {
|
476
|
+
type: 'object',
|
477
|
+
properties: {
|
478
|
+
'my-input': { $ref: '#/definitions/FormattedText' },
|
479
|
+
},
|
480
|
+
definitions: {
|
481
|
+
FormattedText: { type: 'FormattedText' },
|
482
|
+
},
|
483
|
+
required: ['my-input'],
|
484
|
+
};
|
485
|
+
const value = {
|
486
|
+
'my-input': { bad: 'data' },
|
487
|
+
};
|
488
|
+
expectToThrowErrorMatchingTypeAndMessage(() => {
|
489
|
+
jsonSchemaService.validateInput(value, schema);
|
490
|
+
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: Value `{"bad":"data"}` in `#/my-input` does not match any given oneof schema');
|
491
|
+
});
|
492
|
+
it('should validate a FormattedText value when the schema is a $ref to a $ref', async () => {
|
493
|
+
const formattedText = [
|
494
|
+
{
|
495
|
+
tag: 'p',
|
496
|
+
type: 'tag',
|
497
|
+
children: [{ type: 'text', value: 'hello' }],
|
498
|
+
},
|
499
|
+
];
|
500
|
+
const schema = {
|
501
|
+
type: 'object',
|
502
|
+
properties: {
|
503
|
+
'my-input': { $ref: '#/definitions/FormattedText' },
|
504
|
+
},
|
505
|
+
definitions: {
|
506
|
+
FormattedText: { $ref: '#/definitions/FormattedText2' },
|
507
|
+
FormattedText2: { type: 'FormattedText' },
|
508
|
+
},
|
509
|
+
required: ['my-input'],
|
510
|
+
};
|
511
|
+
const value = {
|
512
|
+
'my-input': formattedText,
|
513
|
+
};
|
514
|
+
expect(jsonSchemaService.validateInput(value, schema)).toEqual(true);
|
515
|
+
});
|
516
|
+
it('should validate a FormattedText value when the schema is in an if/then/else', async () => {
|
517
|
+
const formattedText = [
|
518
|
+
{
|
519
|
+
tag: 'p',
|
520
|
+
type: 'tag',
|
521
|
+
children: [{ type: 'text', value: 'hello' }],
|
522
|
+
},
|
523
|
+
];
|
524
|
+
const schema = {
|
525
|
+
type: 'object',
|
526
|
+
properties: {
|
527
|
+
'my-input': {
|
528
|
+
if: { type: 'string' },
|
529
|
+
then: { type: 'string' },
|
530
|
+
else: { type: 'FormattedText' },
|
531
|
+
},
|
532
|
+
},
|
533
|
+
required: ['my-input'],
|
534
|
+
};
|
535
|
+
const value = {
|
536
|
+
'my-input': formattedText,
|
537
|
+
};
|
538
|
+
expect(jsonSchemaService.validateInput(value, schema)).toEqual(true);
|
539
|
+
});
|
540
|
+
});
|
541
|
+
describe('standard inputs', () => {
|
542
|
+
const functionInputSchema = {
|
543
|
+
type: 'object',
|
544
|
+
properties: {
|
545
|
+
'my-input': { type: 'number' },
|
546
|
+
},
|
547
|
+
required: ['my-input'],
|
548
|
+
};
|
549
|
+
it('should return true for valid input values', () => {
|
550
|
+
const inputValue = {
|
551
|
+
'my-input': 123,
|
552
|
+
};
|
553
|
+
const result = jsonSchemaService.validateInput(inputValue, functionInputSchema);
|
554
|
+
expect(result).toBe(true);
|
555
|
+
});
|
556
|
+
it('should throw a SchemaValidationError for invalid input type', () => {
|
557
|
+
const inputValue = {
|
558
|
+
'my-input': '123',
|
559
|
+
};
|
560
|
+
expectToThrowErrorMatchingTypeAndMessage(() => {
|
561
|
+
jsonSchemaService.validateInput(inputValue, functionInputSchema);
|
562
|
+
}, SchemaValidationError_1.SchemaValidationError, `failed validation: Expected \`123\` (string) in \`#/my-input\` to be of type \`number\``);
|
563
|
+
});
|
564
|
+
it('should throw a SchemaValidationError for invalid input missing properties', () => {
|
565
|
+
const inputValue = {};
|
566
|
+
expectToThrowErrorMatchingTypeAndMessage(() => {
|
567
|
+
jsonSchemaService.validateInput(inputValue, functionInputSchema);
|
568
|
+
}, SchemaValidationError_1.SchemaValidationError, `failed validation: The required property \`my-input\` is missing at \`#\``);
|
569
|
+
});
|
570
|
+
it('should throw a SchemaValidationError with a truncated enum value list if there are more than 5 enum options', () => {
|
571
|
+
expectToThrowErrorMatchingTypeAndMessage(() => {
|
572
|
+
jsonSchemaService.validateInput({ enum: 'z' }, { type: 'object', properties: { enum: { type: 'string', enum: ['a', 'b', 'c', 'd', 'e', 'f', 'g'] } } });
|
573
|
+
}, SchemaValidationError_1.SchemaValidationError, 'failed validation: Expected given value `z` in #/enum` to be one of `[a, b, c, d, e, ... 2 more]`');
|
574
|
+
});
|
575
|
+
// TODO DEVX-658
|
576
|
+
it.skip('should throw a SchemaValidationError for invalid input additional properties', () => {
|
577
|
+
const inputValue = {
|
578
|
+
'my-input': 123,
|
579
|
+
'my-input-2': 123,
|
580
|
+
};
|
581
|
+
expect(() => {
|
582
|
+
jsonSchemaService.validateInput(inputValue, functionInputSchema);
|
583
|
+
}).toThrowErrorMatchingInlineSnapshot();
|
584
|
+
});
|
585
|
+
});
|
582
586
|
describe('validateInput', () => {
|
583
587
|
it.each([String('123'), Number(123), [123]])('should validate any primitive type with its resolvable type %s', (propertyValue) => {
|
584
588
|
const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
|
585
|
-
const
|
586
|
-
|
587
|
-
|
588
|
-
MyResolvableNumber: resolvableTypeFixture('MyResolvableNumber', { type: 'number' }),
|
589
|
-
MyResolvableArray: resolvableTypeFixture('MyResolvableArray', { type: 'array' }),
|
590
|
-
}, {
|
589
|
+
const MyResolvableNumber = resolvableTypeFixture('MyResolvableNumber', { type: 'number' });
|
590
|
+
const MyResolvableArray = resolvableTypeFixture('MyResolvableArray', { type: 'array' });
|
591
|
+
const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new TypeResolver_1.TypeResolver([primitiveSchema], [MyResolvableNumber, MyResolvableArray], {
|
591
592
|
MyPrimitive: {
|
593
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
592
594
|
MyResolvableNumber: (value) => value.toString(),
|
595
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
593
596
|
MyResolvableArray: (value) => value.join(''),
|
594
597
|
},
|
595
598
|
}), JsonValidationService_1.ComponentInputMetaSchema);
|
@@ -597,14 +600,13 @@ describe('JsonSchemaService', () => {
|
|
597
600
|
});
|
598
601
|
it('should error when a primitive type is provided a value that cannot be resolved by its resolvable types', () => {
|
599
602
|
const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
|
600
|
-
const
|
601
|
-
|
602
|
-
|
603
|
-
MyResolvableNumber: resolvableTypeFixture('MyResolvableNumber', { type: 'number' }),
|
604
|
-
MyResolvableArray: resolvableTypeFixture('MyResolvableArray', { type: 'array' }),
|
605
|
-
}, {
|
603
|
+
const MyResolvableNumber = resolvableTypeFixture('MyResolvableNumber', { type: 'number' });
|
604
|
+
const MyResolvableArray = resolvableTypeFixture('MyResolvableArray', { type: 'array' });
|
605
|
+
const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new TypeResolver_1.TypeResolver([primitiveSchema], [MyResolvableNumber, MyResolvableArray], {
|
606
606
|
MyPrimitive: {
|
607
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
607
608
|
MyResolvableNumber: (value) => value.toString(),
|
609
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
608
610
|
MyResolvableArray: (value) => value.join(''),
|
609
611
|
},
|
610
612
|
}), JsonValidationService_1.ComponentInputMetaSchema);
|
@@ -614,14 +616,13 @@ describe('JsonSchemaService', () => {
|
|
614
616
|
});
|
615
617
|
it.each([String('123'), Number(123), [123]])('should validate a primitive type when defined as a ref with resolvable value %s', (propertyValue) => {
|
616
618
|
const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
|
617
|
-
const
|
618
|
-
|
619
|
-
|
620
|
-
MyResolvableNumber: resolvableTypeFixture('MyResolvableNumber', { type: 'number' }),
|
621
|
-
MyResolvableArray: resolvableTypeFixture('MyResolvableArray', { type: 'array' }),
|
622
|
-
}, {
|
619
|
+
const MyResolvableNumber = resolvableTypeFixture('MyResolvableNumber', { type: 'number' });
|
620
|
+
const MyResolvableArray = resolvableTypeFixture('MyResolvableArray', { type: 'array' });
|
621
|
+
const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new TypeResolver_1.TypeResolver([primitiveSchema], [MyResolvableNumber, MyResolvableArray], {
|
623
622
|
MyPrimitive: {
|
623
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
624
624
|
MyResolvableNumber: (value) => value.toString(),
|
625
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
625
626
|
MyResolvableArray: (value) => value.join(''),
|
626
627
|
},
|
627
628
|
}), JsonValidationService_1.ComponentInputMetaSchema);
|
@@ -633,13 +634,11 @@ describe('JsonSchemaService', () => {
|
|
633
634
|
});
|
634
635
|
it('should not validate on a primitive type against a resolvable type when a resolver is not defined', () => {
|
635
636
|
const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
|
636
|
-
const
|
637
|
-
|
638
|
-
|
639
|
-
MyResolvableNumber: resolvableTypeFixture('MyResolvableNumber', { type: 'number' }),
|
640
|
-
MyResolvableArray: resolvableTypeFixture('MyResolvableArray', { type: 'array' }),
|
641
|
-
}, {
|
637
|
+
const MyResolvableNumber = resolvableTypeFixture('MyResolvableNumber', { type: 'number' });
|
638
|
+
const MyResolvableArray = resolvableTypeFixture('MyResolvableArray', { type: 'array' });
|
639
|
+
const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new TypeResolver_1.TypeResolver([primitiveSchema], [MyResolvableNumber, MyResolvableArray], {
|
642
640
|
MyPrimitive: {
|
641
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
643
642
|
MyResolvableNumber: (value) => value.toString(),
|
644
643
|
},
|
645
644
|
}), JsonValidationService_1.ComponentInputMetaSchema);
|
@@ -649,24 +648,24 @@ describe('JsonSchemaService', () => {
|
|
649
648
|
});
|
650
649
|
it('should validate a primitive type against similar but different resolvable types', () => {
|
651
650
|
const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
|
652
|
-
const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new
|
653
|
-
|
654
|
-
}, {
|
655
|
-
MyResolvableSrcNumber: resolvableTypeFixture('MyResolvableSrcNumber', {
|
651
|
+
const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new TypeResolver_1.TypeResolver([primitiveSchema], [
|
652
|
+
resolvableTypeFixture('MyResolvableSrcNumber', {
|
656
653
|
type: 'object',
|
657
654
|
properties: {
|
658
655
|
src: { type: 'number' },
|
659
656
|
},
|
660
657
|
}),
|
661
|
-
|
658
|
+
resolvableTypeFixture('MyResolvableSrcString', {
|
662
659
|
type: 'object',
|
663
660
|
properties: {
|
664
661
|
src: { type: 'string' },
|
665
662
|
},
|
666
663
|
}),
|
667
|
-
|
664
|
+
], {
|
668
665
|
MyPrimitive: {
|
666
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
669
667
|
MyResolvableSrcNumber: (value) => value.src.toString(),
|
668
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
670
669
|
MyResolvableSrcString: (value) => value.src,
|
671
670
|
},
|
672
671
|
}), JsonValidationService_1.ComponentInputMetaSchema);
|
@@ -685,14 +684,14 @@ describe('JsonSchemaService', () => {
|
|
685
684
|
describe('resolveInput', () => {
|
686
685
|
it.each([String('123'), Number(123), [123]])('should resolve a primitive type from its resolvable type %s', async (resolvableValue) => {
|
687
686
|
const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
|
688
|
-
const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
MyResolvableArray: resolvableTypeFixture('MyResolvableArray', { type: 'array' }),
|
693
|
-
}, {
|
687
|
+
const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new TypeResolver_1.TypeResolver([primitiveSchema], [
|
688
|
+
resolvableTypeFixture('MyResolvableNumber', { type: 'number' }),
|
689
|
+
resolvableTypeFixture('MyResolvableArray', { type: 'array' }),
|
690
|
+
], {
|
694
691
|
MyPrimitive: {
|
692
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
695
693
|
MyResolvableNumber: (value) => value.toString(),
|
694
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
696
695
|
MyResolvableArray: (value) => value.join(''),
|
697
696
|
},
|
698
697
|
}), JsonValidationService_1.ComponentInputMetaSchema);
|
@@ -703,20 +702,20 @@ describe('JsonSchemaService', () => {
|
|
703
702
|
[{ src: 1132 }, '1132'],
|
704
703
|
])('should resolve a resolvable type %s against the correct resolver to %s', async (resolvableValue, output) => {
|
705
704
|
const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
|
706
|
-
const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new
|
707
|
-
|
708
|
-
}, {
|
709
|
-
MyResolvableSrcString: resolvableTypeFixture('MyResolvableSrcString', {
|
705
|
+
const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new TypeResolver_1.TypeResolver([primitiveSchema], [
|
706
|
+
resolvableTypeFixture('MyResolvableSrcString', {
|
710
707
|
type: 'object',
|
711
708
|
properties: { src: { type: 'string' } },
|
712
709
|
}),
|
713
|
-
|
710
|
+
resolvableTypeFixture('MyResolvableSrcNumber', {
|
714
711
|
type: 'object',
|
715
712
|
properties: { src: { type: 'number' } },
|
716
713
|
}),
|
717
|
-
|
714
|
+
], {
|
718
715
|
MyPrimitive: {
|
716
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
719
717
|
MyResolvableSrcNumber: (value) => value.src.toString(),
|
718
|
+
// @ts-expect-error - fixture is unknown but we know the actual shape
|
720
719
|
MyResolvableSrcString: (value) => value.src,
|
721
720
|
},
|
722
721
|
}), JsonValidationService_1.ComponentInputMetaSchema);
|