@squiz/dx-json-schema-lib 1.21.1-alpha.2 → 1.21.1-alpha.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. package/.npm/_logs/2023-03-17T05_05_36_315Z-debug-0.log +37 -0
  2. package/lib/JsonValidationService.d.ts +1 -1
  3. package/lib/JsonValidationService.js +23 -5
  4. package/lib/JsonValidationService.js.map +1 -1
  5. package/lib/JsonValidationService.spec.js +469 -426
  6. package/lib/JsonValidationService.spec.js.map +1 -1
  7. package/lib/index.d.ts +6 -1
  8. package/lib/index.js +6 -1
  9. package/lib/index.js.map +1 -1
  10. package/lib/jsonTypeResolution/{arbitraryTypeResolution.d.ts → TypeResolver.d.ts} +7 -12
  11. package/lib/jsonTypeResolution/{arbitraryTypeResolution.js → TypeResolver.js} +17 -17
  12. package/lib/jsonTypeResolution/TypeResolver.js.map +1 -0
  13. package/lib/jsonTypeResolution/{arbitraryTypeResolution.spec.js → TypeResolver.spec.js} +12 -39
  14. package/lib/jsonTypeResolution/TypeResolver.spec.js.map +1 -0
  15. package/lib/jsonTypeResolution/TypeResolverBuilder.d.ts +12 -0
  16. package/lib/jsonTypeResolution/TypeResolverBuilder.js +32 -0
  17. package/lib/jsonTypeResolution/TypeResolverBuilder.js.map +1 -0
  18. package/lib/manifest/v1/DxContentMetaSchema.json +117 -2
  19. package/lib/manifest/v1/MatrixAssetSchema.json +390 -0
  20. package/lib/manifest/v1/__test__/schemas/inputStringWithFormat.json +29 -0
  21. package/lib/manifest/v1/subSchemas.d.ts +2 -1
  22. package/lib/manifest/v1/subSchemas.js +3 -1
  23. package/lib/manifest/v1/subSchemas.js.map +1 -1
  24. package/lib/manifest/v1/v1.d.ts +405 -4
  25. package/lib/manifest/v1/v1.json +48 -0
  26. package/lib/primitiveTypes/FormattedText.d.ts +8 -0
  27. package/lib/primitiveTypes/FormattedText.js +21 -0
  28. package/lib/primitiveTypes/FormattedText.js.map +1 -0
  29. package/lib/primitiveTypes/SquizImage.d.ts +26 -0
  30. package/lib/primitiveTypes/SquizImage.js +105 -0
  31. package/lib/primitiveTypes/SquizImage.js.map +1 -0
  32. package/lib/primitiveTypes/index.d.ts +2 -0
  33. package/lib/primitiveTypes/index.js +19 -0
  34. package/lib/primitiveTypes/index.js.map +1 -0
  35. package/lib/resolvableTypes/MatrixAsset.d.ts +9 -0
  36. package/lib/resolvableTypes/MatrixAsset.js +21 -0
  37. package/lib/resolvableTypes/MatrixAsset.js.map +1 -0
  38. package/lib/resolvableTypes/index.d.ts +1 -0
  39. package/lib/resolvableTypes/index.js +18 -0
  40. package/lib/resolvableTypes/index.js.map +1 -0
  41. package/lib/validators/customFormatValidators.d.ts +2 -0
  42. package/lib/validators/customFormatValidators.js +14 -0
  43. package/lib/validators/customFormatValidators.js.map +1 -0
  44. package/lib/validators/utils/matrixAssetValidator.d.ts +2 -0
  45. package/lib/validators/utils/matrixAssetValidator.js +11 -0
  46. package/lib/validators/utils/matrixAssetValidator.js.map +1 -0
  47. package/lib/validators/utils/matrixAssetValidator.spec.d.ts +1 -0
  48. package/lib/validators/utils/matrixAssetValidator.spec.js +43 -0
  49. package/lib/validators/utils/matrixAssetValidator.spec.js.map +1 -0
  50. package/package.json +5 -4
  51. package/src/JsonValidationService.spec.ts +596 -533
  52. package/src/JsonValidationService.ts +28 -10
  53. package/src/index.ts +8 -1
  54. package/src/jsonTypeResolution/{arbitraryTypeResolution.spec.ts → TypeResolver.spec.ts} +23 -70
  55. package/src/jsonTypeResolution/{arbitraryTypeResolution.ts → TypeResolver.ts} +27 -23
  56. package/src/jsonTypeResolution/TypeResolverBuilder.ts +43 -0
  57. package/src/manifest/v1/DxContentMetaSchema.json +117 -2
  58. package/src/manifest/v1/MatrixAssetSchema.json +391 -0
  59. package/src/manifest/v1/__test__/schemas/inputStringWithFormat.json +29 -0
  60. package/src/manifest/v1/subSchemas.ts +2 -1
  61. package/src/manifest/v1/v1.json +48 -0
  62. package/src/manifest/v1/v1.ts +657 -6
  63. package/src/primitiveTypes/FormattedText.ts +24 -0
  64. package/src/primitiveTypes/SquizImage.ts +128 -0
  65. package/src/primitiveTypes/index.ts +2 -0
  66. package/src/resolvableTypes/MatrixAsset.ts +24 -0
  67. package/src/resolvableTypes/index.ts +1 -0
  68. package/src/validators/customFormatValidators.ts +15 -0
  69. package/src/validators/utils/matrixAssetValidator.spec.ts +49 -0
  70. package/src/validators/utils/matrixAssetValidator.ts +8 -0
  71. package/tsconfig.tsbuildinfo +1 -1
  72. package/.npm/_logs/2023-03-02T03_26_09_372Z-debug-0.log +0 -39
  73. package/lib/jsonTypeResolution/arbitraryTypeResolution.js.map +0 -1
  74. package/lib/jsonTypeResolution/arbitraryTypeResolution.spec.js.map +0 -1
  75. package/lib/jsonTypeResolution/index.d.ts +0 -76
  76. package/lib/jsonTypeResolution/index.js +0 -35
  77. package/lib/jsonTypeResolution/index.js.map +0 -1
  78. package/lib/jsonTypeResolution/primitiveTypes.d.ts +0 -10
  79. package/lib/jsonTypeResolution/primitiveTypes.js +0 -27
  80. package/lib/jsonTypeResolution/primitiveTypes.js.map +0 -1
  81. package/lib/jsonTypeResolution/resolvableTypes.d.ts +0 -12
  82. package/lib/jsonTypeResolution/resolvableTypes.js +0 -30
  83. package/lib/jsonTypeResolution/resolvableTypes.js.map +0 -1
  84. package/src/jsonTypeResolution/index.ts +0 -16
  85. package/src/jsonTypeResolution/primitiveTypes.ts +0 -32
  86. package/src/jsonTypeResolution/resolvableTypes.ts +0 -37
  87. /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, isJSONError } from 'json-schema-library';
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 { AnyPrimitiveType, AnyResolvableType, TypeResolver } from './jsonTypeResolution/arbitraryTypeResolution';
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
- return this.typeResolver.getValidationSchemaForPrimitive(initialRef.type);
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 allPossibleSchemas: Array<JSONSchema> = schema.oneOfSchema.oneOf;
214
- if (isJSONError(allPossibleSchemas)) return;
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 './jsonTypeResolution';
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 './arbitraryTypeResolution';
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
- MyPrimitive: primitiveType,
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
- MyPrimitive: primitiveType,
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
- MyPrimitive: primitiveType,
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
- MyPrimitive: primitiveType,
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
- private primitives: { [K in P as P['title']]: K },
48
- private resolvables: { [K in R as R['title']]: K },
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 in primitives)) {
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 in resolvables)) {
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 type in this.primitives;
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 in this.resolvables;
82
+ return this.resolvables.has(schema.title);
75
83
  }
76
84
 
77
- getValidationSchemaForPrimitive(type: keyof typeof this.primitives) {
78
- const primitiveSchema = this.primitives[type];
79
- const validSchemas = [primitiveSchema, ...this.fetchResolvableSchemasForPrimitive(type)];
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: keyof typeof this.primitives) {
90
+ private *fetchResolvableSchemasForPrimitive(type: P['title']) {
87
91
  for (const resolverKey in this.resolvers[type]) {
88
- yield this.resolvables[resolverKey];
92
+ yield this.resolvables.get(resolverKey) as JsonResolutionSchema<string>;
89
93
  }
90
94
  }
91
95
 
92
- tryGetResolver<PS extends P, RS extends R>(
93
- primitiveSchema: PS,
94
- resolvableSchema: RS,
95
- ): Resolver<RS['__shape__'], PS['__shape__']> | undefined {
96
- if (!(primitiveSchema.title in this.resolvers)) return;
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[primitiveSchema.title as keyof typeof this.resolvers] as any)?.[resolvableSchema.title];
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": { "type": "string" },
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
  }