@squiz/dx-json-schema-lib 1.12.0-alpha.8 → 1.12.1-alpha.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. package/.npm/_logs/2023-02-27T04_50_27_819Z-debug-0.log +39 -0
  2. package/jest.config.ts +0 -6
  3. package/lib/JsonValidationService.d.ts +35 -0
  4. package/lib/JsonValidationService.js +127 -1
  5. package/lib/JsonValidationService.js.map +1 -1
  6. package/lib/JsonValidationService.spec.js +288 -0
  7. package/lib/JsonValidationService.spec.js.map +1 -1
  8. package/lib/errors/JsonResolutionError.d.ts +5 -0
  9. package/lib/errors/JsonResolutionError.js +12 -0
  10. package/lib/errors/JsonResolutionError.js.map +1 -0
  11. package/lib/index.d.ts +2 -0
  12. package/lib/index.js +2 -0
  13. package/lib/index.js.map +1 -1
  14. package/lib/jsonTypeResolution/arbitraryTypeResolution.d.ts +61 -0
  15. package/lib/jsonTypeResolution/arbitraryTypeResolution.js +61 -0
  16. package/lib/jsonTypeResolution/arbitraryTypeResolution.js.map +1 -0
  17. package/lib/jsonTypeResolution/arbitraryTypeResolution.spec.d.ts +1 -0
  18. package/lib/jsonTypeResolution/arbitraryTypeResolution.spec.js +100 -0
  19. package/lib/jsonTypeResolution/arbitraryTypeResolution.spec.js.map +1 -0
  20. package/lib/jsonTypeResolution/index.d.ts +76 -0
  21. package/lib/jsonTypeResolution/index.js +35 -0
  22. package/lib/jsonTypeResolution/index.js.map +1 -0
  23. package/lib/jsonTypeResolution/primitiveTypes.d.ts +10 -0
  24. package/lib/jsonTypeResolution/primitiveTypes.js +27 -0
  25. package/lib/jsonTypeResolution/primitiveTypes.js.map +1 -0
  26. package/lib/jsonTypeResolution/resolvableTypes.d.ts +12 -0
  27. package/lib/jsonTypeResolution/resolvableTypes.js +30 -0
  28. package/lib/jsonTypeResolution/resolvableTypes.js.map +1 -0
  29. package/lib/manifest/v1/v1.json +4 -3
  30. package/lib/manifest/v1/v1.spec.js +58 -0
  31. package/lib/manifest/v1/v1.spec.js.map +1 -1
  32. package/package.json +5 -4
  33. package/src/JsonValidationService.spec.ts +417 -1
  34. package/src/JsonValidationService.ts +154 -1
  35. package/src/errors/JsonResolutionError.ts +5 -0
  36. package/src/index.ts +3 -0
  37. package/src/jsonTypeResolution/arbitraryTypeResolution.spec.ts +134 -0
  38. package/src/jsonTypeResolution/arbitraryTypeResolution.ts +100 -0
  39. package/src/jsonTypeResolution/index.ts +16 -0
  40. package/src/jsonTypeResolution/primitiveTypes.ts +32 -0
  41. package/src/jsonTypeResolution/resolvableTypes.ts +37 -0
  42. package/src/manifest/v1/v1.json +4 -3
  43. package/src/manifest/v1/v1.spec.ts +96 -0
  44. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,39 @@
1
+ 0 verbose cli /usr/local/bin/node /usr/local/bin/npm
2
+ 1 info using npm@8.19.3
3
+ 2 info using node@v16.19.0
4
+ 3 timing npm:load:whichnode Completed in 0ms
5
+ 4 timing config:load:defaults Completed in 2ms
6
+ 5 timing config:load:file:/usr/local/lib/node_modules/npm/npmrc Completed in 1ms
7
+ 6 timing config:load:builtin Completed in 1ms
8
+ 7 timing config:load:cli Completed in 2ms
9
+ 8 timing config:load:env Completed in 1ms
10
+ 9 info found workspace root at /builds/developer-experience/cmp
11
+ 10 timing config:load:file:/builds/developer-experience/cmp/.npmrc Completed in 0ms
12
+ 11 timing config:load:project Completed in 23ms
13
+ 12 timing config:load:file:/root/.npmrc Completed in 1ms
14
+ 13 timing config:load:user Completed in 1ms
15
+ 14 timing config:load:file:/usr/local/etc/npmrc Completed in 0ms
16
+ 15 timing config:load:global Completed in 0ms
17
+ 16 timing config:load:validate Completed in 2ms
18
+ 17 timing config:load:credentials Completed in 1ms
19
+ 18 timing config:load:setEnvs Completed in 1ms
20
+ 19 timing config:load Completed in 34ms
21
+ 20 timing npm:load:configload Completed in 34ms
22
+ 21 timing npm:load:mkdirpcache Completed in 1ms
23
+ 22 timing npm:load:mkdirplogs Completed in 1ms
24
+ 23 verbose title npm run compile
25
+ 24 verbose argv "run" "compile" "--"
26
+ 25 timing npm:load:setTitle Completed in 2ms
27
+ 26 timing config:load:flatten Completed in 4ms
28
+ 27 timing npm:load:display Completed in 5ms
29
+ 28 verbose logfile logs-max:10 dir:/builds/developer-experience/cmp/packages/dx-json-schema-lib/.npm/_logs
30
+ 29 verbose logfile /builds/developer-experience/cmp/packages/dx-json-schema-lib/.npm/_logs/2023-02-27T04_50_27_819Z-debug-0.log
31
+ 30 timing npm:load:logFile Completed in 4ms
32
+ 31 timing npm:load:timers Completed in 0ms
33
+ 32 timing npm:load:configScope Completed in 0ms
34
+ 33 timing npm:load Completed in 48ms
35
+ 34 silly logfile done cleaning log files
36
+ 35 timing command:run Completed in 8196ms
37
+ 36 verbose exit 0
38
+ 37 timing npm Completed in 8253ms
39
+ 38 info ok
package/jest.config.ts CHANGED
@@ -17,12 +17,6 @@ const config: Config = {
17
17
  '.*\\.integration\\.spec\\.ts$',
18
18
  ],
19
19
  maxWorkers: 1,
20
-
21
- globals: {
22
- 'ts-jest': {
23
- diagnostics: false,
24
- },
25
- },
26
20
  };
27
21
 
28
22
  export default config;
@@ -1,8 +1,43 @@
1
+ import { Input } from '@sagold/json-query';
1
2
  import { JSONSchema, Draft } from 'json-schema-library';
3
+ import { AnyPrimitiveType, AnyResolvableType, TypeResolver } from './jsonTypeResolution/arbitraryTypeResolution';
2
4
  export declare const ComponentInputSchema: Draft;
5
+ export declare const RenderInputSchema: Draft;
6
+ export declare const ComponentInputMetaSchema: MetaSchemaInput;
7
+ export declare const RenderInputMetaSchema: MetaSchemaInput;
8
+ export declare const ManifestV1MetaSchema: MetaSchemaInput;
9
+ interface MetaSchemaInput {
10
+ root: JSONSchema;
11
+ remotes?: Record<string, JSONSchema>;
12
+ }
13
+ /**
14
+ * A service that can be used to validate and resolve JSON against a schema.
15
+ */
16
+ export declare class JSONSchemaService<P extends AnyPrimitiveType, R extends AnyResolvableType> {
17
+ private typeResolver;
18
+ schema: Draft;
19
+ constructor(typeResolver: TypeResolver<P, R>, metaSchema: MetaSchemaInput);
20
+ private doResolveRef;
21
+ /**
22
+ * Validate an input value against a specified schema
23
+ * @throws {SchemaValidationError} if the input is invalid
24
+ * @returns true if the input is valid
25
+ */
26
+ validateInput(input: unknown, inputSchema?: JSONSchema): true | never;
27
+ private processValidationResult;
28
+ /**
29
+ * Resolve an input object by replacing all resolvable shapes with their resolved values
30
+ * @param input any input object which matches the input schema
31
+ * @param inputSchema a JSONSchema which provides type information about the input object
32
+ * @returns the input object with all resolvable shapes resolved
33
+ */
34
+ resolveInput(input: Input, inputSchema: JSONSchema): Promise<Input>;
35
+ }
3
36
  export declare class JsonValidationService {
4
37
  validateManifest(manifest: unknown, version: 'v1'): true;
5
38
  validateContentSchema(contentSchema: JSONSchema): true;
6
39
  validateComponentInput(functionInputSchema: JSONSchema, inputValue: unknown): true;
40
+ validateRenderInput(functionInputSchema: JSONSchema, inputValue: unknown): true;
7
41
  private processValidationResult;
8
42
  }
43
+ export {};
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.JsonValidationService = exports.ComponentInputSchema = void 0;
6
+ exports.JsonValidationService = exports.JSONSchemaService = exports.ManifestV1MetaSchema = exports.RenderInputMetaSchema = exports.ComponentInputMetaSchema = exports.RenderInputSchema = exports.ComponentInputSchema = void 0;
7
+ const json_query_1 = __importDefault(require("@sagold/json-query"));
7
8
  const DxComponentInputSchema_json_1 = __importDefault(require("./manifest/v1/DxComponentInputSchema.json"));
8
9
  const DxComponentIcons_json_1 = __importDefault(require("./manifest/v1/DxComponentIcons.json"));
9
10
  const DxContentMetaSchema_json_1 = __importDefault(require("./manifest/v1/DxContentMetaSchema.json"));
@@ -13,6 +14,7 @@ const v1_json_1 = __importDefault(require("./manifest/v1/v1.json"));
13
14
  const SchemaValidationError_1 = require("./errors/SchemaValidationError");
14
15
  const json_schema_library_1 = require("json-schema-library");
15
16
  const json_schema_library_2 = require("json-schema-library");
17
+ const JsonResolutionError_1 = require("./errors/JsonResolutionError");
16
18
  const defaultConfig = {
17
19
  ...json_schema_library_2.draft07Config,
18
20
  errors: {
@@ -78,12 +80,131 @@ exports.ComponentInputSchema = new json_schema_library_1.Draft({
78
80
  },
79
81
  }, DxComponentInputSchema_json_1.default);
80
82
  exports.ComponentInputSchema.addRemoteSchema('DxComponentInputSchema.json/DxContentMetaSchema.json', DxContentMetaSchema_json_1.default);
83
+ exports.RenderInputSchema = new json_schema_library_1.Draft({
84
+ ...defaultConfig,
85
+ resolveRef(schema, rootSchema) {
86
+ const resolvedSchema = json_schema_library_2.draft07Config.resolveRef(schema, rootSchema);
87
+ if (!resolvedSchema) {
88
+ return resolvedSchema;
89
+ }
90
+ if (resolvedSchema.type === 'FormattedText') {
91
+ return { type: 'string' };
92
+ }
93
+ else if (Array.isArray(resolvedSchema.type) && resolvedSchema.type.includes('FormattedText')) {
94
+ return {
95
+ ...schema,
96
+ type: resolvedSchema.type.filter((t) => t !== 'FormattedText').concat('string'),
97
+ };
98
+ }
99
+ else {
100
+ return resolvedSchema;
101
+ }
102
+ },
103
+ });
81
104
  const v1Schema = new json_schema_library_1.Draft07(v1_json_1.default, defaultConfig);
82
105
  v1Schema.addRemoteSchema('DxComponentInputSchema.json/DxContentMetaSchema.json', DxContentMetaSchema_json_1.default);
83
106
  v1Schema.addRemoteSchema('/DxComponentInputSchema.json', exports.ComponentInputSchema.getSchema());
84
107
  v1Schema.addRemoteSchema('/DxComponentIcons.json', DxComponentIcons_json_1.default);
85
108
  v1Schema.addRemoteSchema('http://json-schema.org/draft-07/schema', Draft_07_json_1.default);
86
109
  v1Schema.addRemoteSchema('http://json-schema.org/draft-07/schema#', Draft_07_json_1.default);
110
+ exports.ComponentInputMetaSchema = {
111
+ root: DxComponentInputSchema_json_1.default,
112
+ remotes: {
113
+ 'DxComponentInputSchema.json/DxContentMetaSchema.json': DxContentMetaSchema_json_1.default,
114
+ },
115
+ };
116
+ exports.RenderInputMetaSchema = {
117
+ root: Draft_07_json_1.default,
118
+ };
119
+ exports.ManifestV1MetaSchema = {
120
+ root: v1_json_1.default,
121
+ remotes: {
122
+ 'DxComponentInputSchema.json/DxContentMetaSchema.json': DxContentMetaSchema_json_1.default,
123
+ '/DxComponentInputSchema.json': DxComponentInputSchema_json_1.default,
124
+ '/DxComponentIcons.json': DxComponentIcons_json_1.default,
125
+ 'http://json-schema.org/draft-07/schema': Draft_07_json_1.default,
126
+ 'http://json-schema.org/draft-07/schema#': Draft_07_json_1.default,
127
+ },
128
+ };
129
+ /**
130
+ * A service that can be used to validate and resolve JSON against a schema.
131
+ */
132
+ class JSONSchemaService {
133
+ constructor(typeResolver, metaSchema) {
134
+ this.typeResolver = typeResolver;
135
+ this.schema = new json_schema_library_1.Draft({
136
+ ...defaultConfig,
137
+ resolveRef: (schema, rootSchema) => this.doResolveRef(schema, rootSchema),
138
+ }, metaSchema.root);
139
+ for (const [key, value] of Object.entries(metaSchema.remotes || {})) {
140
+ this.schema.addRemoteSchema(key, value);
141
+ }
142
+ }
143
+ doResolveRef(schema, rootSchema) {
144
+ const initialRef = json_schema_library_2.draft07Config.resolveRef(schema, rootSchema);
145
+ if (!initialRef)
146
+ return initialRef;
147
+ if (!this.typeResolver.isPrimitiveType(initialRef.type))
148
+ return initialRef;
149
+ return this.typeResolver.getValidationSchemaForPrimitive(initialRef.type);
150
+ }
151
+ /**
152
+ * Validate an input value against a specified schema
153
+ * @throws {SchemaValidationError} if the input is invalid
154
+ * @returns true if the input is valid
155
+ */
156
+ validateInput(input, inputSchema = this.schema.rootSchema) {
157
+ inputSchema = this.schema.compileSchema(inputSchema);
158
+ const errors = this.schema.validate(input, inputSchema);
159
+ return this.processValidationResult(errors);
160
+ }
161
+ processValidationResult(errors) {
162
+ if (errors.length > 0) {
163
+ throw new SchemaValidationError_1.SchemaValidationError(errors.map((a) => a.message).join(',\n'));
164
+ }
165
+ return true;
166
+ }
167
+ /**
168
+ * Resolve an input object by replacing all resolvable shapes with their resolved values
169
+ * @param input any input object which matches the input schema
170
+ * @param inputSchema a JSONSchema which provides type information about the input object
171
+ * @returns the input object with all resolvable shapes resolved
172
+ */
173
+ async resolveInput(input, inputSchema) {
174
+ const setters = [];
175
+ this.schema.each(input, (schema, value, pointer) => {
176
+ // First we check for if value is a resolvable shape
177
+ if (!this.typeResolver.isResolvableSchema(schema))
178
+ return;
179
+ // If its a resolvable schema, it should exist in a oneOf array with other schemas
180
+ // Including a primitive schema
181
+ const allPossibleSchemas = schema.oneOfSchema.oneOf;
182
+ if ((0, json_schema_library_1.isJSONError)(allPossibleSchemas))
183
+ return;
184
+ const primitiveSchema = allPossibleSchemas.find((schema) => this.typeResolver.isPrimitiveSchema(schema));
185
+ if (!primitiveSchema)
186
+ return;
187
+ const resolver = this.typeResolver.tryGetResolver(primitiveSchema, schema);
188
+ if (!resolver)
189
+ return;
190
+ const setResolvedData = Promise.resolve()
191
+ .then(() => resolver(value))
192
+ .then((resolvedData) => (item) => json_query_1.default.set(item, pointer, resolvedData))
193
+ .catch((e) => Promise.reject(new JsonResolutionError_1.JsonResolutionError(e, pointer, value)));
194
+ setters.push(setResolvedData);
195
+ }, inputSchema);
196
+ const potentialResolutionErrors = [];
197
+ for (const resolveResult of await Promise.allSettled(setters)) {
198
+ if (resolveResult.status === 'rejected') {
199
+ potentialResolutionErrors.push(resolveResult.reason);
200
+ continue;
201
+ }
202
+ input = resolveResult.value(input);
203
+ }
204
+ return input;
205
+ }
206
+ }
207
+ exports.JSONSchemaService = JSONSchemaService;
87
208
  class JsonValidationService {
88
209
  validateManifest(manifest, version) {
89
210
  switch (version) {
@@ -103,6 +224,11 @@ class JsonValidationService {
103
224
  const errors = exports.ComponentInputSchema.validate(inputValue, inputSchema);
104
225
  return this.processValidationResult(errors);
105
226
  }
227
+ validateRenderInput(functionInputSchema, inputValue) {
228
+ const inputSchema = exports.RenderInputSchema.compileSchema(functionInputSchema);
229
+ const errors = exports.RenderInputSchema.validate(inputValue, inputSchema);
230
+ return this.processValidationResult(errors);
231
+ }
106
232
  processValidationResult(errors) {
107
233
  if (errors.length > 0) {
108
234
  throw new SchemaValidationError_1.SchemaValidationError(errors.map((a) => a.message).join(',\n'));
@@ -1 +1 @@
1
- {"version":3,"file":"JsonValidationService.js","sourceRoot":"","sources":["../src/JsonValidationService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JsonValidationService.js","sourceRoot":"","sources":["../src/JsonValidationService.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ const JsonValidationService_1 = require("./JsonValidationService");
7
7
  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
+ const arbitraryTypeResolution_1 = require("./jsonTypeResolution/arbitraryTypeResolution");
10
11
  // eslint-disable-next-line @typescript-eslint/ban-types
11
12
  function expectToThrowErrorMatchingTypeAndMessage(received, errorType, message) {
12
13
  let error = null;
@@ -344,6 +345,54 @@ describe('JsonValidationService', () => {
344
345
  jsonValidationService.validateComponentInput(schema, value);
345
346
  }, SchemaValidationError_1.SchemaValidationError, 'failed validation: Expected `[object Object]` (object) in `#/my-input` to be of type `array`');
346
347
  });
348
+ it('should validate a FormattedText value when the schema is a $ref to a $ref', async () => {
349
+ const formattedText = [
350
+ {
351
+ tag: 'p',
352
+ type: 'tag',
353
+ children: [{ type: 'text', value: 'hello' }],
354
+ },
355
+ ];
356
+ const schema = {
357
+ type: 'object',
358
+ properties: {
359
+ 'my-input': { $ref: '#/definitions/FormattedText' },
360
+ },
361
+ definitions: {
362
+ FormattedText: { $ref: '#/definitions/FormattedText2' },
363
+ FormattedText2: { type: 'FormattedText' },
364
+ },
365
+ required: ['my-input'],
366
+ };
367
+ const value = {
368
+ 'my-input': formattedText,
369
+ };
370
+ expect(jsonValidationService.validateComponentInput(schema, value)).toEqual(true);
371
+ });
372
+ it('should validate a FormattedText value when the schema is in an if/then/else', async () => {
373
+ const formattedText = [
374
+ {
375
+ tag: 'p',
376
+ type: 'tag',
377
+ children: [{ type: 'text', value: 'hello' }],
378
+ },
379
+ ];
380
+ const schema = {
381
+ type: 'object',
382
+ properties: {
383
+ 'my-input': {
384
+ if: { type: 'string' },
385
+ then: { type: 'string' },
386
+ else: { type: 'FormattedText' },
387
+ },
388
+ },
389
+ required: ['my-input'],
390
+ };
391
+ const value = {
392
+ 'my-input': formattedText,
393
+ };
394
+ expect(jsonValidationService.validateComponentInput(schema, value)).toEqual(true);
395
+ });
347
396
  });
348
397
  describe('standard inputs', () => {
349
398
  const functionInputSchema = {
@@ -391,5 +440,244 @@ describe('JsonValidationService', () => {
391
440
  });
392
441
  });
393
442
  });
443
+ describe('validateRenderInput', () => {
444
+ it('should validate a property with type FormattedText as string', () => {
445
+ const schema = {
446
+ type: 'object',
447
+ properties: {
448
+ 'my-input': { type: 'FormattedText' },
449
+ },
450
+ required: ['my-input'],
451
+ };
452
+ const value = {
453
+ 'my-input': 'hello',
454
+ };
455
+ expect(jsonValidationService.validateRenderInput(schema, value)).toEqual(true);
456
+ });
457
+ it('should error when a property with type FormattedText is provided a valid FormattedText value', () => {
458
+ const schema = {
459
+ type: 'object',
460
+ properties: {
461
+ 'my-input': { type: 'FormattedText' },
462
+ },
463
+ required: ['my-input'],
464
+ };
465
+ const value = {
466
+ 'my-input': [{ type: 'text', value: 'hello' }],
467
+ };
468
+ expectToThrowErrorMatchingTypeAndMessage(() => {
469
+ jsonValidationService.validateRenderInput(schema, value);
470
+ }, SchemaValidationError_1.SchemaValidationError, 'failed validation: Expected `[object Object]` (array) in `#/my-input` to be of type `string`');
471
+ });
472
+ it('should validate a property with type FormattedText within an if/then/else as string', () => {
473
+ const schema = {
474
+ type: 'object',
475
+ properties: {
476
+ 'my-input': {
477
+ type: 'object',
478
+ properties: {
479
+ prop: { type: 'string' },
480
+ },
481
+ required: ['prop'],
482
+ if: { properties: { prop: { const: 'a' } } },
483
+ then: {
484
+ properties: {
485
+ text: { type: 'FormattedText' },
486
+ },
487
+ required: ['text'],
488
+ },
489
+ else: {
490
+ properties: {
491
+ text: { type: 'array', items: { type: 'FormattedText' } },
492
+ },
493
+ required: ['text'],
494
+ },
495
+ },
496
+ },
497
+ required: ['my-input'],
498
+ };
499
+ const value = {
500
+ 'my-input': {
501
+ prop: 'a',
502
+ text: 'hello',
503
+ },
504
+ };
505
+ expect(jsonValidationService.validateRenderInput(schema, value)).toEqual(true);
506
+ const otherValue = {
507
+ 'my-input': {
508
+ prop: 'b',
509
+ text: ['my', 'formatted', 'text'],
510
+ },
511
+ };
512
+ expect(jsonValidationService.validateRenderInput(schema, otherValue)).toEqual(true);
513
+ });
514
+ });
515
+ });
516
+ const defaultSchema = {
517
+ type: 'object',
518
+ properties: {
519
+ myProperty: {
520
+ type: 'string',
521
+ },
522
+ },
523
+ required: ['myProperty'],
524
+ };
525
+ function primitiveTypeFixture(title, schema = defaultSchema) {
526
+ return (0, arbitraryTypeResolution_1.PrimitiveType)({
527
+ ...schema,
528
+ title,
529
+ });
530
+ }
531
+ function resolvableTypeFixture(title, schema = defaultSchema) {
532
+ return (0, arbitraryTypeResolution_1.ResolvableType)({
533
+ ...schema,
534
+ title,
535
+ });
536
+ }
537
+ describe('JsonSchemaService', () => {
538
+ describe('validateInput', () => {
539
+ it.each([String('123'), Number(123), [123]])('should validate any primitive type with its resolvable type %s', (propertyValue) => {
540
+ const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
541
+ const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new arbitraryTypeResolution_1.TypeResolver({
542
+ MyPrimitive: primitiveSchema,
543
+ }, {
544
+ MyResolvableNumber: resolvableTypeFixture('MyResolvableNumber', { type: 'number' }),
545
+ MyResolvableArray: resolvableTypeFixture('MyResolvableArray', { type: 'array' }),
546
+ }, {
547
+ MyPrimitive: {
548
+ MyResolvableNumber: (value) => value.toString(),
549
+ MyResolvableArray: (value) => value.join(''),
550
+ },
551
+ }), JsonValidationService_1.ComponentInputMetaSchema);
552
+ expect(jsonSchemaService.validateInput({ myProperty: propertyValue }, { type: 'object', properties: { myProperty: { type: 'MyPrimitive' } } })).toEqual(true);
553
+ });
554
+ it('should error when a primitive type is provided a value that cannot be resolved by its resolvable types', () => {
555
+ const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
556
+ const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new arbitraryTypeResolution_1.TypeResolver({
557
+ MyPrimitive: primitiveSchema,
558
+ }, {
559
+ MyResolvableNumber: resolvableTypeFixture('MyResolvableNumber', { type: 'number' }),
560
+ MyResolvableArray: resolvableTypeFixture('MyResolvableArray', { type: 'array' }),
561
+ }, {
562
+ MyPrimitive: {
563
+ MyResolvableNumber: (value) => value.toString(),
564
+ MyResolvableArray: (value) => value.join(''),
565
+ },
566
+ }), JsonValidationService_1.ComponentInputMetaSchema);
567
+ expect(() => {
568
+ jsonSchemaService.validateInput({ myProperty: true }, { type: 'object', properties: { myProperty: { type: 'MyPrimitive' } } });
569
+ }).toThrowError();
570
+ });
571
+ it.each([String('123'), Number(123), [123]])('should validate a primitive type when defined as a ref with resolvable value %s', (propertyValue) => {
572
+ const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
573
+ const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new arbitraryTypeResolution_1.TypeResolver({
574
+ MyPrimitive: primitiveSchema,
575
+ }, {
576
+ MyResolvableNumber: resolvableTypeFixture('MyResolvableNumber', { type: 'number' }),
577
+ MyResolvableArray: resolvableTypeFixture('MyResolvableArray', { type: 'array' }),
578
+ }, {
579
+ MyPrimitive: {
580
+ MyResolvableNumber: (value) => value.toString(),
581
+ MyResolvableArray: (value) => value.join(''),
582
+ },
583
+ }), JsonValidationService_1.ComponentInputMetaSchema);
584
+ expect(jsonSchemaService.validateInput({ myProperty: propertyValue }, {
585
+ type: 'object',
586
+ properties: { myProperty: { $ref: '#/definitions/Ref' } },
587
+ definitions: { Ref: { type: 'MyPrimitive' } },
588
+ })).toEqual(true);
589
+ });
590
+ it('should not validate on a primitive type against a resolvable type when a resolver is not defined', () => {
591
+ const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
592
+ const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new arbitraryTypeResolution_1.TypeResolver({
593
+ MyPrimitive: primitiveSchema,
594
+ }, {
595
+ MyResolvableNumber: resolvableTypeFixture('MyResolvableNumber', { type: 'number' }),
596
+ MyResolvableArray: resolvableTypeFixture('MyResolvableArray', { type: 'array' }),
597
+ }, {
598
+ MyPrimitive: {
599
+ MyResolvableNumber: (value) => value.toString(),
600
+ },
601
+ }), JsonValidationService_1.ComponentInputMetaSchema);
602
+ expect(() => {
603
+ jsonSchemaService.validateInput({ myProperty: [123] }, { type: 'object', properties: { myProperty: { type: 'MyPrimitive' } } });
604
+ }).toThrowError();
605
+ });
606
+ it('should validate a primitive type against similar but different resolvable types', () => {
607
+ const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
608
+ const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new arbitraryTypeResolution_1.TypeResolver({
609
+ MyPrimitive: primitiveSchema,
610
+ }, {
611
+ MyResolvableSrcNumber: resolvableTypeFixture('MyResolvableSrcNumber', {
612
+ type: 'object',
613
+ properties: {
614
+ src: { type: 'number' },
615
+ },
616
+ }),
617
+ MyResolvableSrcString: resolvableTypeFixture('MyResolvableSrcString', {
618
+ type: 'object',
619
+ properties: {
620
+ src: { type: 'string' },
621
+ },
622
+ }),
623
+ }, {
624
+ MyPrimitive: {
625
+ MyResolvableSrcNumber: (value) => value.src.toString(),
626
+ MyResolvableSrcString: (value) => value.src,
627
+ },
628
+ }), JsonValidationService_1.ComponentInputMetaSchema);
629
+ expect(jsonSchemaService.validateInput({
630
+ myProperty: {
631
+ src: 123,
632
+ },
633
+ }, { type: 'object', properties: { myProperty: { type: 'MyPrimitive' } } })).toEqual(true);
634
+ expect(jsonSchemaService.validateInput({
635
+ myProperty: {
636
+ src: '123',
637
+ },
638
+ }, { type: 'object', properties: { myProperty: { type: 'MyPrimitive' } } })).toEqual(true);
639
+ });
640
+ });
641
+ describe('resolveInput', () => {
642
+ it.each([String('123'), Number(123), [123]])('should resolve a primitive type from its resolvable type %s', async (resolvableValue) => {
643
+ const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
644
+ const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new arbitraryTypeResolution_1.TypeResolver({
645
+ MyPrimitive: primitiveSchema,
646
+ }, {
647
+ MyResolvableNumber: resolvableTypeFixture('MyResolvableNumber', { type: 'number' }),
648
+ MyResolvableArray: resolvableTypeFixture('MyResolvableArray', { type: 'array' }),
649
+ }, {
650
+ MyPrimitive: {
651
+ MyResolvableNumber: (value) => value.toString(),
652
+ MyResolvableArray: (value) => value.join(''),
653
+ },
654
+ }), JsonValidationService_1.ComponentInputMetaSchema);
655
+ await expect(jsonSchemaService.resolveInput({ myProperty: resolvableValue }, { type: 'object', properties: { myProperty: { type: 'MyPrimitive' } } })).resolves.toEqual({ myProperty: '123' });
656
+ });
657
+ it.each([
658
+ [{ src: 'MyString' }, 'MyString'],
659
+ [{ src: 1132 }, '1132'],
660
+ ])('should resolve a resolvable type %s against the correct resolver to %s', async (resolvableValue, output) => {
661
+ const primitiveSchema = primitiveTypeFixture('MyPrimitive', { type: 'string' });
662
+ const jsonSchemaService = new JsonValidationService_1.JSONSchemaService(new arbitraryTypeResolution_1.TypeResolver({
663
+ MyPrimitive: primitiveSchema,
664
+ }, {
665
+ MyResolvableSrcString: resolvableTypeFixture('MyResolvableSrcString', {
666
+ type: 'object',
667
+ properties: { src: { type: 'string' } },
668
+ }),
669
+ MyResolvableSrcNumber: resolvableTypeFixture('MyResolvableSrcNumber', {
670
+ type: 'object',
671
+ properties: { src: { type: 'number' } },
672
+ }),
673
+ }, {
674
+ MyPrimitive: {
675
+ MyResolvableSrcNumber: (value) => value.src.toString(),
676
+ MyResolvableSrcString: (value) => value.src,
677
+ },
678
+ }), JsonValidationService_1.ComponentInputMetaSchema);
679
+ await expect(jsonSchemaService.resolveInput({ myProperty: resolvableValue }, { type: 'object', properties: { myProperty: { type: 'MyPrimitive' } } })).resolves.toEqual({ myProperty: output });
680
+ });
681
+ });
394
682
  });
395
683
  //# sourceMappingURL=JsonValidationService.spec.js.map