@squiz/dx-json-schema-lib 1.21.1-alpha.2 → 1.21.1-alpha.20
Sign up to get free protection for your applications and to get access to all the features.
- package/.npm/_logs/2023-03-16T10_16_41_384Z-debug-0.log +37 -0
- package/lib/JsonValidationService.d.ts +1 -1
- package/lib/JsonValidationService.js +23 -5
- package/lib/JsonValidationService.js.map +1 -1
- package/lib/JsonValidationService.spec.js +469 -426
- 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 +117 -2
- package/lib/manifest/v1/MatrixAssetSchema.json +390 -0
- package/lib/manifest/v1/__test__/schemas/inputStringWithFormat.json +29 -0
- package/lib/manifest/v1/subSchemas.d.ts +2 -1
- package/lib/manifest/v1/subSchemas.js +3 -1
- package/lib/manifest/v1/subSchemas.js.map +1 -1
- package/lib/manifest/v1/v1.d.ts +405 -4
- package/lib/manifest/v1/v1.json +48 -0
- 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/lib/validators/customFormatValidators.d.ts +2 -0
- package/lib/validators/customFormatValidators.js +14 -0
- package/lib/validators/customFormatValidators.js.map +1 -0
- package/lib/validators/utils/matrixAssetValidator.d.ts +2 -0
- package/lib/validators/utils/matrixAssetValidator.js +11 -0
- package/lib/validators/utils/matrixAssetValidator.js.map +1 -0
- package/lib/validators/utils/matrixAssetValidator.spec.d.ts +1 -0
- package/lib/validators/utils/matrixAssetValidator.spec.js +43 -0
- package/lib/validators/utils/matrixAssetValidator.spec.js.map +1 -0
- package/package.json +5 -4
- package/src/JsonValidationService.spec.ts +596 -533
- package/src/JsonValidationService.ts +28 -10
- 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 +117 -2
- package/src/manifest/v1/MatrixAssetSchema.json +391 -0
- package/src/manifest/v1/__test__/schemas/inputStringWithFormat.json +29 -0
- package/src/manifest/v1/subSchemas.ts +2 -1
- package/src/manifest/v1/v1.json +48 -0
- package/src/manifest/v1/v1.ts +657 -6
- 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/src/validators/customFormatValidators.ts +15 -0
- package/src/validators/utils/matrixAssetValidator.spec.ts +49 -0
- package/src/validators/utils/matrixAssetValidator.ts +8 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/.npm/_logs/2023-03-02T03_26_09_372Z-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
@@ -3,24 +3,30 @@ import JSONQuery, { Input } from '@sagold/json-query';
|
|
3
3
|
import DxComponentInputSchema from './manifest/v1/DxComponentInputSchema.json';
|
4
4
|
import DxComponentIcons from './manifest/v1/DxComponentIcons.json';
|
5
5
|
import DxContentMetaSchema from './manifest/v1/DxContentMetaSchema.json';
|
6
|
+
import MatrixAssetSchema from './manifest/v1/MatrixAssetSchema.json';
|
7
|
+
|
6
8
|
import Draft07Schema from './manifest/v1/Draft-07.json';
|
7
9
|
|
8
10
|
import FormattedText from './formatted-text/v1/formattedText.json';
|
9
11
|
|
10
12
|
import v1 from './manifest/v1/v1.json';
|
11
13
|
import { SchemaValidationError } from './errors/SchemaValidationError';
|
12
|
-
import { Draft07, JSONError, JSONSchema, Draft, DraftConfig
|
14
|
+
import { Draft07, JSONError, JSONSchema, Draft, DraftConfig } from 'json-schema-library';
|
13
15
|
|
14
16
|
import { draft07Config } from 'json-schema-library';
|
15
17
|
import { MANIFEST_MODELS } from '.';
|
16
|
-
import {
|
18
|
+
import { customFormatValidators } from './validators/customFormatValidators';
|
19
|
+
import { AnyPrimitiveType, AnyResolvableType, TypeResolver } from './jsonTypeResolution/TypeResolver';
|
17
20
|
import { JsonResolutionError } from './errors/JsonResolutionError';
|
18
21
|
|
19
22
|
const defaultConfig: DraftConfig = {
|
20
23
|
...draft07Config,
|
24
|
+
validateFormat: {
|
25
|
+
...draft07Config.validateFormat,
|
26
|
+
...customFormatValidators,
|
27
|
+
},
|
21
28
|
errors: {
|
22
29
|
...draft07Config.errors,
|
23
|
-
|
24
30
|
enumError(data) {
|
25
31
|
let values = '[]';
|
26
32
|
|
@@ -119,6 +125,7 @@ const v1Schema = new Draft07(v1, defaultConfig);
|
|
119
125
|
v1Schema.addRemoteSchema('DxComponentInputSchema.json/DxContentMetaSchema.json', DxContentMetaSchema);
|
120
126
|
v1Schema.addRemoteSchema('/DxComponentInputSchema.json', ComponentInputSchema.getSchema());
|
121
127
|
v1Schema.addRemoteSchema('/DxComponentIcons.json', DxComponentIcons);
|
128
|
+
v1Schema.addRemoteSchema('/MatrixAssetSchema.json', MatrixAssetSchema);
|
122
129
|
v1Schema.addRemoteSchema('http://json-schema.org/draft-07/schema', Draft07Schema);
|
123
130
|
v1Schema.addRemoteSchema('http://json-schema.org/draft-07/schema#', Draft07Schema);
|
124
131
|
|
@@ -139,6 +146,7 @@ export const ManifestV1MetaSchema: MetaSchemaInput = {
|
|
139
146
|
'DxComponentInputSchema.json/DxContentMetaSchema.json': DxContentMetaSchema,
|
140
147
|
'/DxComponentInputSchema.json': DxComponentInputSchema,
|
141
148
|
'/DxComponentIcons.json': DxComponentIcons,
|
149
|
+
'/MatrixAssetSchema.json': MatrixAssetSchema,
|
142
150
|
'http://json-schema.org/draft-07/schema': Draft07Schema,
|
143
151
|
'http://json-schema.org/draft-07/schema#': Draft07Schema,
|
144
152
|
},
|
@@ -158,6 +166,8 @@ export class JSONSchemaService<P extends AnyPrimitiveType, R extends AnyResolvab
|
|
158
166
|
{
|
159
167
|
...defaultConfig,
|
160
168
|
resolveRef: (schema, rootSchema) => this.doResolveRef(schema, rootSchema),
|
169
|
+
validate: (core, data, schema, pointer) => defaultConfig.validate(core, data, schema, pointer),
|
170
|
+
resolveOneOf: (core, data, schema, pointer) => defaultConfig.resolveOneOf(core, data, schema, pointer),
|
161
171
|
},
|
162
172
|
metaSchema.root,
|
163
173
|
);
|
@@ -165,15 +175,25 @@ export class JSONSchemaService<P extends AnyPrimitiveType, R extends AnyResolvab
|
|
165
175
|
for (const [key, value] of Object.entries(metaSchema.remotes || {})) {
|
166
176
|
this.schema.addRemoteSchema(key, value);
|
167
177
|
}
|
178
|
+
|
179
|
+
for (const schema of this.typeResolver.validationSchemaDefinitions) {
|
180
|
+
// Please find a better way of doing this.
|
181
|
+
this.schema.addRemoteSchema(`/${schema.title}.json`, schema as JSONSchema);
|
182
|
+
this.schema.addRemoteSchema(`#/${schema.title}.json`, schema as JSONSchema);
|
183
|
+
}
|
168
184
|
}
|
169
185
|
|
170
186
|
private doResolveRef(schema: JSONSchema, rootSchema: JSONSchema): JSONSchema {
|
171
187
|
const initialRef = draft07Config.resolveRef(schema, rootSchema);
|
172
|
-
|
173
188
|
if (!initialRef) return initialRef;
|
174
189
|
if (!this.typeResolver.isPrimitiveType(initialRef.type)) return initialRef;
|
175
190
|
|
176
|
-
|
191
|
+
const validationSchemas = this.typeResolver.getValidationSchemaForPrimitive(initialRef.type);
|
192
|
+
// All validation schemas are pre-compiled as remote schemas and are referenced below
|
193
|
+
const fullValidationSchema = {
|
194
|
+
oneOf: validationSchemas.map((schema) => ({ $ref: `${schema.title}.json` })),
|
195
|
+
};
|
196
|
+
return this.schema.compileSchema(fullValidationSchema);
|
177
197
|
}
|
178
198
|
|
179
199
|
/**
|
@@ -210,12 +230,10 @@ export class JSONSchemaService<P extends AnyPrimitiveType, R extends AnyResolvab
|
|
210
230
|
if (!this.typeResolver.isResolvableSchema(schema)) return;
|
211
231
|
// If its a resolvable schema, it should exist in a oneOf array with other schemas
|
212
232
|
// Including a primitive schema
|
213
|
-
const
|
214
|
-
|
215
|
-
|
216
|
-
const primitiveSchema = allPossibleSchemas.find((schema): schema is P =>
|
217
|
-
this.typeResolver.isPrimitiveSchema(schema),
|
233
|
+
const allPossibleSchemaTitles: Array<string> = schema.oneOfSchema.oneOf.map((o: JSONSchema) =>
|
234
|
+
o.$ref.replace('.json', ''),
|
218
235
|
);
|
236
|
+
const primitiveSchema = allPossibleSchemaTitles.find((title) => this.typeResolver.isPrimitiveType(title));
|
219
237
|
if (!primitiveSchema) return;
|
220
238
|
|
221
239
|
const resolver = this.typeResolver.tryGetResolver(primitiveSchema, schema);
|
package/src/index.ts
CHANGED
@@ -11,4 +11,11 @@ export * from './JsonValidationService';
|
|
11
11
|
export * from './errors/SchemaValidationError';
|
12
12
|
export * from './errors/JsonResolutionError';
|
13
13
|
|
14
|
-
export * from './
|
14
|
+
export * from './validators/utils/matrixAssetValidator';
|
15
|
+
|
16
|
+
export * from './validators/utils/matrixAssetValidator';
|
17
|
+
|
18
|
+
export * from './jsonTypeResolution/TypeResolver';
|
19
|
+
export * from './jsonTypeResolution/TypeResolverBuilder';
|
20
|
+
export * from './primitiveTypes';
|
21
|
+
export * from './resolvableTypes';
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { JSONSchema } from 'json-schema-library';
|
2
|
-
import { PrimitiveType, ResolvableType, TypeResolver } from './
|
2
|
+
import { PrimitiveType, ResolvableType, TypeResolver } from './TypeResolver';
|
3
3
|
|
4
4
|
const defaultSchema: JSONSchema = {
|
5
5
|
type: 'object',
|
@@ -28,64 +28,33 @@ describe('getValidationSchemaForPrimitive', () => {
|
|
28
28
|
it('should return only the primitive schema when no resolvers are defined', () => {
|
29
29
|
const primitiveType = primitiveTypeFixture('MyPrimitive');
|
30
30
|
const resolvableType = resolvableTypeFixture('MyResolvable');
|
31
|
-
const resolver = new TypeResolver(
|
32
|
-
{
|
33
|
-
MyPrimitive: primitiveType,
|
34
|
-
},
|
35
|
-
{
|
36
|
-
MyResolvable: resolvableType,
|
37
|
-
},
|
38
|
-
{},
|
39
|
-
);
|
31
|
+
const resolver = new TypeResolver([primitiveType], [resolvableType], {});
|
40
32
|
|
41
|
-
expect(resolver.getValidationSchemaForPrimitive('MyPrimitive')).toEqual(
|
42
|
-
oneOf: [primitiveType],
|
43
|
-
});
|
33
|
+
expect(resolver.getValidationSchemaForPrimitive('MyPrimitive')).toEqual([primitiveType]);
|
44
34
|
});
|
45
35
|
|
46
36
|
it('should return the primitive schema and the resolvable schema when a resolver is defined', () => {
|
47
37
|
const primitiveType = primitiveTypeFixture('MyPrimitive');
|
48
38
|
const resolvableType = resolvableTypeFixture('MyResolvable');
|
49
|
-
const resolver = new TypeResolver(
|
50
|
-
{
|
51
|
-
|
52
|
-
},
|
53
|
-
{
|
54
|
-
MyResolvable: resolvableType,
|
39
|
+
const resolver = new TypeResolver([primitiveType], [resolvableType], {
|
40
|
+
MyPrimitive: {
|
41
|
+
MyResolvable: () => null,
|
55
42
|
},
|
56
|
-
{
|
57
|
-
MyPrimitive: {
|
58
|
-
MyResolvable: () => null,
|
59
|
-
},
|
60
|
-
},
|
61
|
-
);
|
62
|
-
|
63
|
-
expect(resolver.getValidationSchemaForPrimitive('MyPrimitive')).toEqual({
|
64
|
-
oneOf: [primitiveType, resolvableType],
|
65
43
|
});
|
44
|
+
|
45
|
+
expect(resolver.getValidationSchemaForPrimitive('MyPrimitive')).toEqual([primitiveType, resolvableType]);
|
66
46
|
});
|
67
47
|
|
68
48
|
it('should return the primitive schema and the resolvable schema when a resolver is defined for a different primitive', () => {
|
69
49
|
const primitiveType = primitiveTypeFixture('MyPrimitive');
|
70
50
|
const resolvableType = resolvableTypeFixture('MyResolvable');
|
71
|
-
const resolver = new TypeResolver(
|
72
|
-
{
|
73
|
-
|
74
|
-
MyOtherPrimitive: primitiveTypeFixture('MyOtherPrimitive'),
|
75
|
-
},
|
76
|
-
{
|
77
|
-
MyResolvable: resolvableType,
|
51
|
+
const resolver = new TypeResolver([primitiveType, primitiveTypeFixture('MyOtherPrimitive')], [resolvableType], {
|
52
|
+
MyOtherPrimitive: {
|
53
|
+
MyResolvable: () => null,
|
78
54
|
},
|
79
|
-
{
|
80
|
-
MyOtherPrimitive: {
|
81
|
-
MyResolvable: () => null,
|
82
|
-
},
|
83
|
-
},
|
84
|
-
);
|
85
|
-
|
86
|
-
expect(resolver.getValidationSchemaForPrimitive('MyPrimitive')).toEqual({
|
87
|
-
oneOf: [primitiveType],
|
88
55
|
});
|
56
|
+
|
57
|
+
expect(resolver.getValidationSchemaForPrimitive('MyPrimitive')).toEqual([primitiveType]);
|
89
58
|
});
|
90
59
|
|
91
60
|
it('should error when resolver map contains a key not listed in resolver schemas', () => {
|
@@ -93,20 +62,12 @@ describe('getValidationSchemaForPrimitive', () => {
|
|
93
62
|
const resolvableType = resolvableTypeFixture('MyResolvable');
|
94
63
|
expect(
|
95
64
|
() =>
|
96
|
-
new TypeResolver<typeof primitiveType, typeof resolvableType>(
|
97
|
-
{
|
98
|
-
|
99
|
-
|
100
|
-
{
|
101
|
-
MyResolvable: resolvableType,
|
65
|
+
new TypeResolver<typeof primitiveType, typeof resolvableType>([primitiveType], [resolvableType], {
|
66
|
+
MyPrimitive: {
|
67
|
+
// @ts-expect-error - this is not a valid resolvable type
|
68
|
+
MyOtherResolvable: () => null,
|
102
69
|
},
|
103
|
-
|
104
|
-
MyPrimitive: {
|
105
|
-
// @ts-expect-error - this is not a valid resolvable type
|
106
|
-
MyOtherResolvable: () => null,
|
107
|
-
},
|
108
|
-
},
|
109
|
-
),
|
70
|
+
}),
|
110
71
|
).toThrowError();
|
111
72
|
});
|
112
73
|
|
@@ -115,20 +76,12 @@ describe('getValidationSchemaForPrimitive', () => {
|
|
115
76
|
const resolvableType = resolvableTypeFixture('MyResolvable');
|
116
77
|
expect(
|
117
78
|
() =>
|
118
|
-
new TypeResolver<typeof primitiveType, typeof resolvableType>(
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
{
|
123
|
-
MyResolvable: resolvableType,
|
124
|
-
},
|
125
|
-
{
|
126
|
-
// @ts-expect-error - this is not a valid primitive type
|
127
|
-
MyOtherPrimitive: {
|
128
|
-
MyResolvable: () => null,
|
129
|
-
},
|
79
|
+
new TypeResolver<typeof primitiveType, typeof resolvableType>([primitiveType], [resolvableType], {
|
80
|
+
// @ts-expect-error - this is not a valid primitive type
|
81
|
+
MyOtherPrimitive: {
|
82
|
+
MyResolvable: () => null,
|
130
83
|
},
|
131
|
-
),
|
84
|
+
}),
|
132
85
|
).toThrowError();
|
133
86
|
});
|
134
87
|
});
|
@@ -35,7 +35,7 @@ export function ResolvableType<SHAPE, TITLE extends string>(
|
|
35
35
|
}
|
36
36
|
export type AnyResolvableType = ResolvableType<string, any>;
|
37
37
|
|
38
|
-
type Resolver<INPUT, OUTPUT> = (input: INPUT) => MaybePromise<OUTPUT>;
|
38
|
+
export type Resolver<INPUT, OUTPUT> = (input: INPUT) => MaybePromise<OUTPUT>;
|
39
39
|
|
40
40
|
/**
|
41
41
|
* A JSON Type Resolver class which stores the primitive and resolvable JSON Schema types and their resolvers
|
@@ -43,27 +43,35 @@ type Resolver<INPUT, OUTPUT> = (input: INPUT) => MaybePromise<OUTPUT>;
|
|
43
43
|
* No serious logic is required here. The class should only provide data access methods and type safety
|
44
44
|
*/
|
45
45
|
export class TypeResolver<P extends AnyPrimitiveType, R extends AnyResolvableType> {
|
46
|
+
private primitives: Map<P['title'], P>;
|
47
|
+
private resolvables: Map<R['title'], R>;
|
46
48
|
constructor(
|
47
|
-
|
48
|
-
|
49
|
+
primitives: P[],
|
50
|
+
resolvables: R[] = [],
|
49
51
|
public resolvers: {
|
50
52
|
[PT in P as PT['title']]?: {
|
51
53
|
[RT in R as RT['title']]?: Resolver<RT['__shape__'], PT['__shape__']>;
|
52
54
|
};
|
53
|
-
},
|
55
|
+
} = {},
|
54
56
|
) {
|
57
|
+
this.primitives = new Map(primitives.map((p) => [p.title, p]));
|
58
|
+
this.resolvables = new Map(resolvables.map((r) => [r.title, r]));
|
55
59
|
for (const [primitiveKey, primitiveResolvers] of Object.entries(resolvers) as [string, Record<string, any>][]) {
|
56
|
-
if (!(primitiveKey
|
60
|
+
if (!this.primitives.has(primitiveKey)) {
|
57
61
|
throw new Error('Resolver keys must match a primitive schema');
|
58
62
|
}
|
59
|
-
if (!Object.keys(primitiveResolvers).every((k) => k
|
63
|
+
if (!Object.keys(primitiveResolvers).every((k) => this.resolvables.has(k))) {
|
60
64
|
throw new Error('Primitive resolvers keys must match a resolvable schema');
|
61
65
|
}
|
62
66
|
}
|
63
67
|
}
|
64
68
|
|
69
|
+
get validationSchemaDefinitions() {
|
70
|
+
return [...this.primitives.values(), ...this.resolvables.values()];
|
71
|
+
}
|
72
|
+
|
65
73
|
isPrimitiveType(type: string): type is P['title'] {
|
66
|
-
return
|
74
|
+
return this.primitives.has(type);
|
67
75
|
}
|
68
76
|
|
69
77
|
isPrimitiveSchema(schema: JSONSchema): schema is P {
|
@@ -71,30 +79,26 @@ export class TypeResolver<P extends AnyPrimitiveType, R extends AnyResolvableTyp
|
|
71
79
|
}
|
72
80
|
|
73
81
|
isResolvableSchema(schema: JSONSchema): schema is R {
|
74
|
-
return schema.title
|
82
|
+
return this.resolvables.has(schema.title);
|
75
83
|
}
|
76
84
|
|
77
|
-
getValidationSchemaForPrimitive(type:
|
78
|
-
const primitiveSchema = this.primitives
|
79
|
-
|
80
|
-
|
81
|
-
return {
|
82
|
-
oneOf: validSchemas,
|
83
|
-
};
|
85
|
+
getValidationSchemaForPrimitive(type: P['title']) {
|
86
|
+
const primitiveSchema = this.primitives.get(type) as JsonResolutionSchema<string>;
|
87
|
+
return [primitiveSchema, ...this.fetchResolvableSchemasForPrimitive(type)];
|
84
88
|
}
|
85
89
|
|
86
|
-
private *fetchResolvableSchemasForPrimitive(type:
|
90
|
+
private *fetchResolvableSchemasForPrimitive(type: P['title']) {
|
87
91
|
for (const resolverKey in this.resolvers[type]) {
|
88
|
-
yield this.resolvables
|
92
|
+
yield this.resolvables.get(resolverKey) as JsonResolutionSchema<string>;
|
89
93
|
}
|
90
94
|
}
|
91
95
|
|
92
|
-
tryGetResolver
|
93
|
-
|
94
|
-
resolvableSchema:
|
95
|
-
): Resolver<
|
96
|
-
if (!(
|
96
|
+
tryGetResolver(
|
97
|
+
primitiveSchemaTitle: string,
|
98
|
+
resolvableSchema: R,
|
99
|
+
): Resolver<R['__shape__'], P['__shape__']> | undefined {
|
100
|
+
if (!(primitiveSchemaTitle in this.resolvers)) return;
|
97
101
|
// Sometimes typescript can be insanely annoying
|
98
|
-
return (this.resolvers[
|
102
|
+
return (this.resolvers[primitiveSchemaTitle as keyof typeof this.resolvers] as any)?.[resolvableSchema.title];
|
99
103
|
}
|
100
104
|
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import { AnyPrimitiveType, AnyResolvableType, Resolver, TypeResolver } from './TypeResolver';
|
2
|
+
|
3
|
+
type TypeResolverFunction<P extends AnyPrimitiveType, R extends AnyResolvableType> = Resolver<
|
4
|
+
R['__shape__'],
|
5
|
+
P['__shape__']
|
6
|
+
>;
|
7
|
+
|
8
|
+
export class TypeResolverBuilder {
|
9
|
+
private primitives = new Set<AnyPrimitiveType>();
|
10
|
+
private resolvables = new Set<AnyResolvableType>();
|
11
|
+
private resolverMap: Record<string, Record<string, TypeResolverFunction<AnyPrimitiveType, AnyResolvableType>>> = {};
|
12
|
+
static new() {
|
13
|
+
return new TypeResolverBuilder();
|
14
|
+
}
|
15
|
+
|
16
|
+
addPrimitive<P extends AnyPrimitiveType>(primitive: P) {
|
17
|
+
this.primitives.add(primitive);
|
18
|
+
return this;
|
19
|
+
}
|
20
|
+
|
21
|
+
addResolver<P extends AnyPrimitiveType, R extends AnyResolvableType>(
|
22
|
+
primitive: P,
|
23
|
+
resolvable: R,
|
24
|
+
resolver: TypeResolverFunction<P, R>,
|
25
|
+
) {
|
26
|
+
this.primitives.add(primitive);
|
27
|
+
this.resolvables.add(resolvable);
|
28
|
+
this.resolverMap[primitive.title] ??= {};
|
29
|
+
this.resolverMap[primitive.title][resolvable.title] = resolver as TypeResolverFunction<
|
30
|
+
AnyPrimitiveType,
|
31
|
+
AnyResolvableType
|
32
|
+
>;
|
33
|
+
return this;
|
34
|
+
}
|
35
|
+
|
36
|
+
build() {
|
37
|
+
return new TypeResolver(
|
38
|
+
Array.from(this.primitives.values()),
|
39
|
+
Array.from(this.resolvables.values()),
|
40
|
+
this.resolverMap,
|
41
|
+
);
|
42
|
+
}
|
43
|
+
}
|
@@ -16,7 +16,7 @@
|
|
16
16
|
"allOf": [{ "$ref": "#/definitions/nonNegativeInteger" }, { "default": 0 }]
|
17
17
|
},
|
18
18
|
"simpleTypes": {
|
19
|
-
"enum": ["array", "boolean", "integer", "null", "number", "object", "string", "FormattedText"]
|
19
|
+
"enum": ["array", "boolean", "integer", "null", "number", "object", "string", "FormattedText", "SquizImage"]
|
20
20
|
},
|
21
21
|
"stringArray": {
|
22
22
|
"type": "array",
|
@@ -140,7 +140,34 @@
|
|
140
140
|
}
|
141
141
|
]
|
142
142
|
},
|
143
|
-
"format": {
|
143
|
+
"format": {
|
144
|
+
"type": "string",
|
145
|
+
"enum": [
|
146
|
+
"date-time",
|
147
|
+
"email",
|
148
|
+
"hostname",
|
149
|
+
"ipv4",
|
150
|
+
"ipv6",
|
151
|
+
"json-pointer",
|
152
|
+
"matrix-asset-uri",
|
153
|
+
"multi-line",
|
154
|
+
"password",
|
155
|
+
"phone",
|
156
|
+
"regex",
|
157
|
+
"relative-json-pointer",
|
158
|
+
"uri-reference",
|
159
|
+
"uri-template",
|
160
|
+
"uri",
|
161
|
+
"uuid"
|
162
|
+
]
|
163
|
+
},
|
164
|
+
"matrixAssetTypes": {
|
165
|
+
"type": "array",
|
166
|
+
"items": {
|
167
|
+
"type": "string",
|
168
|
+
"$ref": "#/matrixAssetEnum"
|
169
|
+
}
|
170
|
+
},
|
144
171
|
"contentMediaType": { "type": "string" },
|
145
172
|
"contentEncoding": { "type": "string" },
|
146
173
|
"if": { "$ref": "#" },
|
@@ -161,5 +188,93 @@
|
|
161
188
|
},
|
162
189
|
"required": ["required"]
|
163
190
|
}
|
191
|
+
},
|
192
|
+
"matrixAssetEnum": {
|
193
|
+
"enum": [
|
194
|
+
"audioFile",
|
195
|
+
"bodycopyContainer",
|
196
|
+
"bodycopyDiv",
|
197
|
+
"calendarEventsSearchPage",
|
198
|
+
"contentContainerTemplate",
|
199
|
+
"contentTypeMarkdown",
|
200
|
+
"contentTypeNestContent",
|
201
|
+
"contentTypeRawHtml",
|
202
|
+
"contentTypeSnippet",
|
203
|
+
"contentTypeWysiwyg",
|
204
|
+
"cssFileFolder",
|
205
|
+
"cssFile",
|
206
|
+
"customForm",
|
207
|
+
"dataRecord",
|
208
|
+
"designAreaAssetLineage",
|
209
|
+
"designAreaBody",
|
210
|
+
"designAreaMenuNormal",
|
211
|
+
"designAreaNestContent",
|
212
|
+
"designCssCustomisation",
|
213
|
+
"designCss",
|
214
|
+
"designCustomisation",
|
215
|
+
"designScss",
|
216
|
+
"design",
|
217
|
+
"docx",
|
218
|
+
"excelDoc",
|
219
|
+
"file",
|
220
|
+
"folder",
|
221
|
+
"gitBridge",
|
222
|
+
"googleAnalyticsConnector",
|
223
|
+
"googleAnalyticsView",
|
224
|
+
"image",
|
225
|
+
"jsFileFolder",
|
226
|
+
"jsFile",
|
227
|
+
"jsonWebToken",
|
228
|
+
"layoutManager",
|
229
|
+
"layout",
|
230
|
+
"link",
|
231
|
+
"metadataFieldDate",
|
232
|
+
"metadataFieldRelatedAsset",
|
233
|
+
"metadataFieldSelect",
|
234
|
+
"metadataFieldText",
|
235
|
+
"metadataFieldWysiwyg",
|
236
|
+
"metadataSchema",
|
237
|
+
"metadataSection",
|
238
|
+
"newsItem",
|
239
|
+
"oauthAccountManager",
|
240
|
+
"pageAccountManager",
|
241
|
+
"pageAssetListing",
|
242
|
+
"pageCalendarEventsSearch",
|
243
|
+
"pageCalendar",
|
244
|
+
"pagePasswordReset",
|
245
|
+
"pageRemoteContent",
|
246
|
+
"pageRestResourceJs",
|
247
|
+
"pageRestResourceOauthSession",
|
248
|
+
"pageRestResourceOauthTwoLegged",
|
249
|
+
"pageRestResource",
|
250
|
+
"pageSiteMap",
|
251
|
+
"pageStandard",
|
252
|
+
"paintLayoutBodycopy",
|
253
|
+
"paintLayoutPage",
|
254
|
+
"pdfFile",
|
255
|
+
"pdf",
|
256
|
+
"persona",
|
257
|
+
"powerpointDoc",
|
258
|
+
"pptx",
|
259
|
+
"redirectPage",
|
260
|
+
"regex",
|
261
|
+
"regularExpression",
|
262
|
+
"rtfFile",
|
263
|
+
"samlAccountManager",
|
264
|
+
"saml2Acs",
|
265
|
+
"saml2Sls",
|
266
|
+
"searchPage",
|
267
|
+
"site",
|
268
|
+
"textFile",
|
269
|
+
"TriggerTypes?",
|
270
|
+
"userGroup",
|
271
|
+
"wordDoc",
|
272
|
+
"workflowSchema",
|
273
|
+
"workflowStepCondition",
|
274
|
+
"workflowStep",
|
275
|
+
"workflowStream",
|
276
|
+
"xlsx",
|
277
|
+
"xmlFile"
|
278
|
+
]
|
164
279
|
}
|
165
280
|
}
|