@squiz/dx-json-schema-lib 1.79.0 → 1.80.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/CHANGELOG.md +6 -0
- package/jest.config.ts +13 -2
- package/lib/JsonSchemaService.d.ts +34 -0
- package/lib/JsonSchemaService.js +140 -0
- package/lib/JsonSchemaService.js.map +1 -0
- package/lib/JsonSchemaService.spec.d.ts +1 -0
- package/lib/JsonSchemaService.spec.js +1807 -0
- package/lib/JsonSchemaService.spec.js.map +1 -0
- package/lib/JsonValidationService.d.ts +11 -33
- package/lib/JsonValidationService.js +43 -194
- package/lib/JsonValidationService.js.map +1 -1
- package/lib/JsonValidationService.spec.js +19 -1800
- package/lib/JsonValidationService.spec.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/jsonTypeResolution/TypeResolver.d.ts +0 -1
- package/lib/jsonTypeResolution/TypeResolver.js +0 -3
- package/lib/jsonTypeResolution/TypeResolver.js.map +1 -1
- package/lib/jsonTypeResolution/TypeResolver.spec.js +10 -0
- package/lib/jsonTypeResolution/TypeResolver.spec.js.map +1 -1
- package/lib/manifest/v1/DxComponentInputSchema.spec.js +18 -0
- package/lib/manifest/v1/DxComponentInputSchema.spec.js.map +1 -1
- package/lib/manifest/v1/DxContentMetaSchema.json +24 -32
- package/lib/manifest/v1/JobV1.d.ts +23 -18
- package/lib/manifest/v1/__test__/schemas/invalidUiMetadata.json +31 -0
- package/lib/manifest/v1/v1.d.ts +23 -18
- package/lib/manifest/v1/v1.spec.js +3 -66
- package/lib/manifest/v1/v1.spec.js.map +1 -1
- package/lib/processValidationResult.d.ts +2 -0
- package/lib/processValidationResult.js +24 -0
- package/lib/processValidationResult.js.map +1 -0
- package/lib/validators/customKeywordValidators.d.ts +2 -0
- package/lib/validators/customKeywordValidators.js +47 -0
- package/lib/validators/customKeywordValidators.js.map +1 -0
- package/lib/validators/customKeywordValidators.spec.d.ts +1 -0
- package/lib/validators/customKeywordValidators.spec.js +100 -0
- package/lib/validators/customKeywordValidators.spec.js.map +1 -0
- package/package.json +1 -1
- package/src/JsonSchemaService.spec.ts +2198 -0
- package/src/JsonSchemaService.ts +159 -0
- package/src/JsonValidationService.spec.ts +26 -2195
- package/src/JsonValidationService.ts +64 -226
- package/src/index.ts +1 -0
- package/src/jsonTypeResolution/TypeResolver.spec.ts +12 -0
- package/src/jsonTypeResolution/TypeResolver.ts +0 -4
- package/src/manifest/v1/DxComponentInputSchema.spec.ts +21 -0
- package/src/manifest/v1/DxContentMetaSchema.json +24 -32
- package/src/manifest/v1/JobV1.ts +23 -23
- package/src/manifest/v1/__test__/schemas/invalidUiMetadata.json +31 -0
- package/src/manifest/v1/v1.spec.ts +3 -73
- package/src/manifest/v1/v1.ts +23 -23
- package/src/processValidationResult.ts +20 -0
- package/src/validators/customKeywordValidators.spec.ts +171 -0
- package/src/validators/customKeywordValidators.ts +53 -0
- package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,24 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.processValidationResult = void 0;
|
4
|
+
const SchemaValidationError_1 = require("./errors/SchemaValidationError");
|
5
|
+
function processValidationResult(errors) {
|
6
|
+
if (errors.length > 0) {
|
7
|
+
const ValidationDataMap = errors.reduce((acc, error) => {
|
8
|
+
var _a;
|
9
|
+
const pointer = (_a = error === null || error === void 0 ? void 0 : error.data) === null || _a === void 0 ? void 0 : _a.pointer;
|
10
|
+
const validationData = {
|
11
|
+
message: error.message,
|
12
|
+
data: error.data,
|
13
|
+
};
|
14
|
+
Object.keys(acc).includes(pointer) && Array.isArray(acc[pointer])
|
15
|
+
? acc[pointer].push(validationData)
|
16
|
+
: (acc[pointer] = [validationData]);
|
17
|
+
return acc;
|
18
|
+
}, {});
|
19
|
+
throw new SchemaValidationError_1.SchemaValidationError(errors.map((a) => a.message).join(',\n'), undefined, ValidationDataMap);
|
20
|
+
}
|
21
|
+
return true;
|
22
|
+
}
|
23
|
+
exports.processValidationResult = processValidationResult;
|
24
|
+
//# sourceMappingURL=processValidationResult.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"processValidationResult.js","sourceRoot":"","sources":["../src/processValidationResult.ts"],"names":[],"mappings":";;;AACA,0EAA0G;AAE1G,SAAgB,uBAAuB,CAAC,MAAmB;IACzD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QACrB,MAAM,iBAAiB,GAAsB,MAAM,CAAC,MAAM,CAAC,CAAC,GAAsB,EAAE,KAAgB,EAAE,EAAE;;YACtG,MAAM,OAAO,GAAG,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,0CAAE,OAAO,CAAC;YACrC,MAAM,cAAc,GAAmB;gBACrC,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC/D,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;gBACnC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;YACtC,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,IAAI,6CAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;KACzG;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAhBD,0DAgBC"}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.customKeywordValidators = void 0;
|
4
|
+
exports.customKeywordValidators = {
|
5
|
+
'ui:metadata': (core, schema, value, pointer) => {
|
6
|
+
const fieldValue = value;
|
7
|
+
const uiMetadata = fieldValue['ui:metadata'];
|
8
|
+
if (uiMetadata === null || uiMetadata === void 0 ? void 0 : uiMetadata.quickOption) {
|
9
|
+
if (!fieldValue.enum) {
|
10
|
+
const error = {
|
11
|
+
name: 'uiMetadataError',
|
12
|
+
code: 'uiMetadata-error',
|
13
|
+
type: 'error',
|
14
|
+
message: `ui:metadata property quickOption is only valid for enum based properties.`,
|
15
|
+
data: { expected: 'enum', pointer: pointer, received: typeof value, value: value },
|
16
|
+
};
|
17
|
+
return [error];
|
18
|
+
}
|
19
|
+
}
|
20
|
+
if (uiMetadata === null || uiMetadata === void 0 ? void 0 : uiMetadata.enumWidget) {
|
21
|
+
if (!fieldValue.enum) {
|
22
|
+
const error = {
|
23
|
+
name: 'uiMetadataError',
|
24
|
+
code: 'uiMetadata-error',
|
25
|
+
type: 'error',
|
26
|
+
message: `ui:metadata property enumWidget is only valid for enum based properties.`,
|
27
|
+
data: { expected: 'enum', pointer: pointer, received: typeof value, value: value },
|
28
|
+
};
|
29
|
+
return [error];
|
30
|
+
}
|
31
|
+
}
|
32
|
+
if (uiMetadata === null || uiMetadata === void 0 ? void 0 : uiMetadata.collapsedByDefault) {
|
33
|
+
if (fieldValue.type !== 'object') {
|
34
|
+
const error = {
|
35
|
+
name: 'uiMetadataError',
|
36
|
+
code: 'uiMetadata-error',
|
37
|
+
type: 'error',
|
38
|
+
message: `ui:metadata property collapsedByDefault is only valid for object properties.`,
|
39
|
+
data: { expected: 'object', pointer: pointer, received: typeof value, value: value },
|
40
|
+
};
|
41
|
+
return [error];
|
42
|
+
}
|
43
|
+
}
|
44
|
+
return undefined;
|
45
|
+
},
|
46
|
+
};
|
47
|
+
//# sourceMappingURL=customKeywordValidators.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"customKeywordValidators.js","sourceRoot":"","sources":["../../src/validators/customKeywordValidators.ts"],"names":[],"mappings":";;;AAGa,QAAA,uBAAuB,GAGhC;IACF,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAA2B,EAAE;QACvE,MAAM,UAAU,GAAG,KAA6B,CAAC;QACjD,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;QAE7C,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAW,EAAE;YAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;gBACpB,MAAM,KAAK,GAAc;oBACvB,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,2EAA2E;oBACpF,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;iBACnF,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,CAAC;aAChB;SACF;QAED,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,UAAU,EAAE;YAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;gBACpB,MAAM,KAAK,GAAc;oBACvB,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,0EAA0E;oBACnF,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;iBACnF,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,CAAC;aAChB;SACF;QAED,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,kBAAkB,EAAE;YAClC,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAChC,MAAM,KAAK,GAAc;oBACvB,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,8EAA8E;oBACvF,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;iBACrF,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,CAAC;aAChB;SACF;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,100 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const customKeywordValidators_1 = require("./customKeywordValidators");
|
4
|
+
describe('customKeywordValidators', () => {
|
5
|
+
describe('ui:metadata', () => {
|
6
|
+
it('no ui:metadata is valid', () => {
|
7
|
+
const result = customKeywordValidators_1.customKeywordValidators['ui:metadata'](
|
8
|
+
// eslint-disable-next-line
|
9
|
+
// @ts-ignore - the null properties aren't used in this keyword validation
|
10
|
+
null, null, {}, '#/functions/0/input/properties/users-contact');
|
11
|
+
expect(result).toBe(undefined);
|
12
|
+
});
|
13
|
+
it('no quickOption without enum is valid', () => {
|
14
|
+
const result = customKeywordValidators_1.customKeywordValidators['ui:metadata'](
|
15
|
+
// eslint-disable-next-line
|
16
|
+
// @ts-ignore - the null properties aren't used in this keyword validation
|
17
|
+
null, null, { 'ui:metadata': {} }, '#/functions/0/input/properties/users-contact');
|
18
|
+
expect(result).toBe(undefined);
|
19
|
+
});
|
20
|
+
it('quickOption is valid on enum', () => {
|
21
|
+
const result = customKeywordValidators_1.customKeywordValidators['ui:metadata'](
|
22
|
+
// eslint-disable-next-line
|
23
|
+
// @ts-ignore - the null properties aren't used in this keyword validation
|
24
|
+
null, null, { enum: ['north', 'south'], 'ui:metadata': { quickOption: true } }, '#/functions/0/input/properties/users-contact');
|
25
|
+
expect(result).toBe(undefined);
|
26
|
+
});
|
27
|
+
it('quickOption:false is valid without enum', () => {
|
28
|
+
const result = customKeywordValidators_1.customKeywordValidators['ui:metadata'](
|
29
|
+
// eslint-disable-next-line
|
30
|
+
// @ts-ignore - the null properties aren't used in this keyword validation
|
31
|
+
null, null, { 'ui:metadata': { quickOption: false } }, '#/functions/0/input/properties/users-contact');
|
32
|
+
expect(result).toBe(undefined);
|
33
|
+
});
|
34
|
+
it('quickOption:false is valid with enum', () => {
|
35
|
+
const result = customKeywordValidators_1.customKeywordValidators['ui:metadata'](
|
36
|
+
// eslint-disable-next-line
|
37
|
+
// @ts-ignore - the null properties aren't used in this keyword validation
|
38
|
+
null, null, { enum: ['north', 'south'], 'ui:metadata': { quickOption: false } }, '#/functions/0/input/properties/users-contact');
|
39
|
+
expect(result).toBe(undefined);
|
40
|
+
});
|
41
|
+
it('quickOption:true is not valid without enum', () => {
|
42
|
+
const result = customKeywordValidators_1.customKeywordValidators['ui:metadata'](
|
43
|
+
// eslint-disable-next-line
|
44
|
+
// @ts-ignore - the null properties aren't used in this keyword validation
|
45
|
+
null, null, { 'ui:metadata': { quickOption: true } }, '#/functions/0/input/properties/users-contact');
|
46
|
+
const error = Array.isArray(result) ? result[0] : result;
|
47
|
+
expect(result).not.toEqual(undefined);
|
48
|
+
expect(error).toEqual(expect.objectContaining({
|
49
|
+
name: 'uiMetadataError',
|
50
|
+
code: 'uiMetadata-error',
|
51
|
+
type: 'error',
|
52
|
+
}));
|
53
|
+
});
|
54
|
+
it('quickOption:true is valid with empty enum', () => {
|
55
|
+
// Enums being empty is a separate JSON schema rule / validation issue
|
56
|
+
const result = customKeywordValidators_1.customKeywordValidators['ui:metadata'](
|
57
|
+
// eslint-disable-next-line
|
58
|
+
// @ts-ignore - the null properties aren't used in this keyword validation
|
59
|
+
null, null, { enum: [], 'ui:metadata': { quickOption: true } }, '#/functions/0/input/properties/users-contact');
|
60
|
+
expect(result).toEqual(undefined);
|
61
|
+
});
|
62
|
+
it.each(['radio', 'dropdown'])('enumWidget:%s is valid with enum', (enumWidget) => {
|
63
|
+
const result = customKeywordValidators_1.customKeywordValidators['ui:metadata'](
|
64
|
+
// eslint-disable-next-line
|
65
|
+
// @ts-ignore - the null properties aren't used in this keyword validation
|
66
|
+
null, null, { enum: [], 'ui:metadata': { enumWidget } }, '#/functions/0/input/properties/users-contact');
|
67
|
+
expect(result).toEqual(undefined);
|
68
|
+
});
|
69
|
+
it('enumWidget is invalid without enum', () => {
|
70
|
+
const result = customKeywordValidators_1.customKeywordValidators['ui:metadata'](
|
71
|
+
// eslint-disable-next-line
|
72
|
+
// @ts-ignore - the null properties aren't used in this keyword validation
|
73
|
+
null, null, { 'ui:metadata': { enumWidget: 'radio' } }, '#/functions/0/input/properties/users-contact');
|
74
|
+
expect(result).toContainEqual(expect.objectContaining({
|
75
|
+
name: 'uiMetadataError',
|
76
|
+
code: 'uiMetadata-error',
|
77
|
+
type: 'error',
|
78
|
+
}));
|
79
|
+
});
|
80
|
+
it('collapsedByDefault is valid with object property', () => {
|
81
|
+
const result = customKeywordValidators_1.customKeywordValidators['ui:metadata'](
|
82
|
+
// eslint-disable-next-line
|
83
|
+
// @ts-ignore - the null properties aren't used in this keyword validation
|
84
|
+
null, null, { type: 'object', 'ui:metadata': { collapsedByDefault: true } }, '#/functions/0/input/properties/users-contact');
|
85
|
+
expect(result).toEqual(undefined);
|
86
|
+
});
|
87
|
+
it('collapsedByDefault is invalid for non-object properties', () => {
|
88
|
+
const result = customKeywordValidators_1.customKeywordValidators['ui:metadata'](
|
89
|
+
// eslint-disable-next-line
|
90
|
+
// @ts-ignore - the null properties aren't used in this keyword validation
|
91
|
+
null, null, { type: 'string', 'ui:metadata': { collapsedByDefault: true } }, '#/functions/0/input/properties/users-contact');
|
92
|
+
expect(result).toContainEqual(expect.objectContaining({
|
93
|
+
name: 'uiMetadataError',
|
94
|
+
code: 'uiMetadata-error',
|
95
|
+
type: 'error',
|
96
|
+
}));
|
97
|
+
});
|
98
|
+
});
|
99
|
+
});
|
100
|
+
//# sourceMappingURL=customKeywordValidators.spec.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"customKeywordValidators.spec.js","sourceRoot":"","sources":["../../src/validators/customKeywordValidators.spec.ts"],"names":[],"mappings":"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"}
|