@squiz/dx-json-schema-lib 1.21.1-alpha.9 → 1.22.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/.npm/_logs/2023-03-30T09_50_45_736Z-debug-0.log +37 -0
  2. package/lib/JsonValidationService.d.ts +1 -1
  3. package/lib/JsonValidationService.js +15 -5
  4. package/lib/JsonValidationService.js.map +1 -1
  5. package/lib/JsonValidationService.spec.js +444 -445
  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 +1 -1
  19. package/lib/manifest/v1/MatrixAssetSchema.json +28 -8
  20. package/lib/manifest/v1/v1.d.ts +10 -7
  21. package/lib/primitiveTypes/FormattedText.d.ts +8 -0
  22. package/lib/primitiveTypes/FormattedText.js +21 -0
  23. package/lib/primitiveTypes/FormattedText.js.map +1 -0
  24. package/lib/primitiveTypes/SquizImage.d.ts +26 -0
  25. package/lib/primitiveTypes/SquizImage.js +105 -0
  26. package/lib/primitiveTypes/SquizImage.js.map +1 -0
  27. package/lib/primitiveTypes/index.d.ts +2 -0
  28. package/lib/primitiveTypes/index.js +19 -0
  29. package/lib/primitiveTypes/index.js.map +1 -0
  30. package/lib/resolvableTypes/MatrixAsset.d.ts +9 -0
  31. package/lib/resolvableTypes/MatrixAsset.js +21 -0
  32. package/lib/resolvableTypes/MatrixAsset.js.map +1 -0
  33. package/lib/resolvableTypes/index.d.ts +1 -0
  34. package/lib/resolvableTypes/index.js +18 -0
  35. package/lib/resolvableTypes/index.js.map +1 -0
  36. package/package.json +5 -4
  37. package/src/JsonValidationService.spec.ts +585 -584
  38. package/src/JsonValidationService.ts +19 -9
  39. package/src/index.ts +8 -1
  40. package/src/jsonTypeResolution/{arbitraryTypeResolution.spec.ts → TypeResolver.spec.ts} +23 -70
  41. package/src/jsonTypeResolution/{arbitraryTypeResolution.ts → TypeResolver.ts} +27 -23
  42. package/src/jsonTypeResolution/TypeResolverBuilder.ts +43 -0
  43. package/src/manifest/v1/DxContentMetaSchema.json +1 -1
  44. package/src/manifest/v1/MatrixAssetSchema.json +28 -8
  45. package/src/manifest/v1/v1.ts +22 -9
  46. package/src/primitiveTypes/FormattedText.ts +24 -0
  47. package/src/primitiveTypes/SquizImage.ts +128 -0
  48. package/src/primitiveTypes/index.ts +2 -0
  49. package/src/resolvableTypes/MatrixAsset.ts +24 -0
  50. package/src/resolvableTypes/index.ts +1 -0
  51. package/tsconfig.tsbuildinfo +1 -1
  52. package/.npm/_logs/2023-03-08T03_21_11_525Z-debug-0.log +0 -39
  53. package/lib/jsonTypeResolution/arbitraryTypeResolution.js.map +0 -1
  54. package/lib/jsonTypeResolution/arbitraryTypeResolution.spec.js.map +0 -1
  55. package/lib/jsonTypeResolution/index.d.ts +0 -76
  56. package/lib/jsonTypeResolution/index.js +0 -35
  57. package/lib/jsonTypeResolution/index.js.map +0 -1
  58. package/lib/jsonTypeResolution/primitiveTypes.d.ts +0 -10
  59. package/lib/jsonTypeResolution/primitiveTypes.js +0 -27
  60. package/lib/jsonTypeResolution/primitiveTypes.js.map +0 -1
  61. package/lib/jsonTypeResolution/resolvableTypes.d.ts +0 -12
  62. package/lib/jsonTypeResolution/resolvableTypes.js +0 -30
  63. package/lib/jsonTypeResolution/resolvableTypes.js.map +0 -1
  64. package/src/jsonTypeResolution/index.ts +0 -16
  65. package/src/jsonTypeResolution/primitiveTypes.ts +0 -32
  66. package/src/jsonTypeResolution/resolvableTypes.ts +0 -37
  67. /package/lib/jsonTypeResolution/{arbitraryTypeResolution.spec.d.ts → TypeResolver.spec.d.ts} +0 -0
@@ -11,12 +11,12 @@ import FormattedText from './formatted-text/v1/formattedText.json';
11
11
 
12
12
  import v1 from './manifest/v1/v1.json';
13
13
  import { SchemaValidationError } from './errors/SchemaValidationError';
14
- import { Draft07, JSONError, JSONSchema, Draft, DraftConfig, isJSONError } from 'json-schema-library';
14
+ import { Draft07, JSONError, JSONSchema, Draft, DraftConfig } from 'json-schema-library';
15
15
 
16
16
  import { draft07Config } from 'json-schema-library';
17
17
  import { MANIFEST_MODELS } from '.';
18
18
  import { customFormatValidators } from './validators/customFormatValidators';
19
- import { AnyPrimitiveType, AnyResolvableType, TypeResolver } from './jsonTypeResolution/arbitraryTypeResolution';
19
+ import { AnyPrimitiveType, AnyResolvableType, TypeResolver } from './jsonTypeResolution/TypeResolver';
20
20
  import { JsonResolutionError } from './errors/JsonResolutionError';
21
21
 
22
22
  const defaultConfig: DraftConfig = {
@@ -166,6 +166,8 @@ export class JSONSchemaService<P extends AnyPrimitiveType, R extends AnyResolvab
166
166
  {
167
167
  ...defaultConfig,
168
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),
169
171
  },
170
172
  metaSchema.root,
171
173
  );
@@ -173,15 +175,25 @@ export class JSONSchemaService<P extends AnyPrimitiveType, R extends AnyResolvab
173
175
  for (const [key, value] of Object.entries(metaSchema.remotes || {})) {
174
176
  this.schema.addRemoteSchema(key, value);
175
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
+ }
176
184
  }
177
185
 
178
186
  private doResolveRef(schema: JSONSchema, rootSchema: JSONSchema): JSONSchema {
179
187
  const initialRef = draft07Config.resolveRef(schema, rootSchema);
180
-
181
188
  if (!initialRef) return initialRef;
182
189
  if (!this.typeResolver.isPrimitiveType(initialRef.type)) return initialRef;
183
190
 
184
- 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);
185
197
  }
186
198
 
187
199
  /**
@@ -218,12 +230,10 @@ export class JSONSchemaService<P extends AnyPrimitiveType, R extends AnyResolvab
218
230
  if (!this.typeResolver.isResolvableSchema(schema)) return;
219
231
  // If its a resolvable schema, it should exist in a oneOf array with other schemas
220
232
  // Including a primitive schema
221
- const allPossibleSchemas: Array<JSONSchema> = schema.oneOfSchema.oneOf;
222
- if (isJSONError(allPossibleSchemas)) return;
223
-
224
- const primitiveSchema = allPossibleSchemas.find((schema): schema is P =>
225
- this.typeResolver.isPrimitiveSchema(schema),
233
+ const allPossibleSchemaTitles: Array<string> = schema.oneOfSchema.oneOf.map((o: JSONSchema) =>
234
+ o.$ref.replace('.json', ''),
226
235
  );
236
+ const primitiveSchema = allPossibleSchemaTitles.find((title) => this.typeResolver.isPrimitiveType(title));
227
237
  if (!primitiveSchema) return;
228
238
 
229
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",
@@ -244,7 +244,7 @@
244
244
  },
245
245
  "additional": {
246
246
  "description": "Additional data of an arbitrary nature related to the requested asset, which may include derived information or special child asset information.",
247
- "oneOf": [
247
+ "anyOf": [
248
248
  {
249
249
  "$ref": "#/definitions/AssetAdditional"
250
250
  },
@@ -260,6 +260,27 @@
260
260
  ]
261
261
  }
262
262
  },
263
+ "if": {
264
+ "properties": {
265
+ "type": {
266
+ "const": "image"
267
+ }
268
+ }
269
+ },
270
+ "then": {
271
+ "properties": {
272
+ "additional": {
273
+ "allOf": [
274
+ {
275
+ "$ref": "#/definitions/AssetFileAdditional"
276
+ },
277
+ {
278
+ "$ref": "#/definitions/AssetImageAdditional"
279
+ }
280
+ ]
281
+ }
282
+ }
283
+ },
263
284
  "required": [
264
285
  "id",
265
286
  "type",
@@ -273,7 +294,8 @@
273
294
  "published",
274
295
  "url",
275
296
  "urls",
276
- "attributes"
297
+ "attributes",
298
+ "additional"
277
299
  ],
278
300
 
279
301
  "definitions": {
@@ -325,7 +347,8 @@
325
347
  "modified_readable": "Feb 3, 2023 12:26 PM",
326
348
  "modified_unix": 1675387561
327
349
  }
328
- }
350
+ },
351
+ "required": ["file_info"]
329
352
  },
330
353
  "AssetImageAdditional": {
331
354
  "title": "Image additional info",
@@ -337,11 +360,7 @@
337
360
  }
338
361
  }
339
362
  },
340
- "allOf": [
341
- {
342
- "$ref": "#/definitions/AssetFileAdditional"
343
- }
344
- ]
363
+ "required": ["varieties"]
345
364
  },
346
365
  "AssetCalendarEventAdditional": {
347
366
  "title": "Calendar Event additional info",
@@ -360,6 +379,7 @@
360
379
  }
361
380
  }
362
381
  },
382
+ "required": ["event_info"],
363
383
  "example": {
364
384
  "event_info": {
365
385
  "duration": 1800,
@@ -63,8 +63,18 @@ export type CoreSchemaMetaSchema2 =
63
63
  */
64
64
  enum?: true[];
65
65
  type?:
66
- | ('array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string' | 'FormattedText')
67
- | ('array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string' | 'FormattedText')[];
66
+ | ('array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string' | 'FormattedText' | 'SquizImage')
67
+ | (
68
+ | 'array'
69
+ | 'boolean'
70
+ | 'integer'
71
+ | 'null'
72
+ | 'number'
73
+ | 'object'
74
+ | 'string'
75
+ | 'FormattedText'
76
+ | 'SquizImage'
77
+ )[];
68
78
  format?:
69
79
  | 'date-time'
70
80
  | 'email'
@@ -254,7 +264,6 @@ export type CoreSchemaMetaSchema5 =
254
264
  */
255
265
  export type SchemaArray1 = CoreSchemaMetaSchema5[];
256
266
  export type StringArray1 = string[];
257
- export type ImageAdditionalInfo = FileAdditionalInfo;
258
267
 
259
268
  export interface ComponentManifest {
260
269
  /**
@@ -2654,8 +2663,8 @@ export interface CoreSchemaMetaSchema1 {
2654
2663
  */
2655
2664
  enum?: true[];
2656
2665
  type?:
2657
- | ('array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string' | 'FormattedText')
2658
- | ('array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string' | 'FormattedText')[];
2666
+ | ('array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string' | 'FormattedText' | 'SquizImage')
2667
+ | ('array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string' | 'FormattedText' | 'SquizImage')[];
2659
2668
  format?:
2660
2669
  | 'date-time'
2661
2670
  | 'email'
@@ -3147,7 +3156,7 @@ export interface MatrixAssetSchema {
3147
3156
  /**
3148
3157
  * Additional data of an arbitrary nature related to the requested asset, which may include derived information or special child asset information.
3149
3158
  */
3150
- additional?: AssetAdditionalInfo | FileAdditionalInfo | ImageAdditionalInfo | CalendarEventAdditionalInfo;
3159
+ additional: AssetAdditionalInfo | FileAdditionalInfo | ImageAdditionalInfo | CalendarEventAdditionalInfo;
3151
3160
  [k: string]: unknown;
3152
3161
  }
3153
3162
  export interface MatrixAssetSchema1 {
@@ -3339,14 +3348,14 @@ export interface MatrixAssetSchema1 {
3339
3348
  /**
3340
3349
  * Additional data of an arbitrary nature related to the requested asset, which may include derived information or special child asset information.
3341
3350
  */
3342
- additional?: AssetAdditionalInfo | FileAdditionalInfo | ImageAdditionalInfo | CalendarEventAdditionalInfo;
3351
+ additional: AssetAdditionalInfo | FileAdditionalInfo | ImageAdditionalInfo | CalendarEventAdditionalInfo;
3343
3352
  [k: string]: unknown;
3344
3353
  }
3345
3354
  export interface AssetAdditionalInfo {
3346
3355
  [k: string]: unknown;
3347
3356
  }
3348
3357
  export interface FileAdditionalInfo {
3349
- file_info?: {
3358
+ file_info: {
3350
3359
  file_name?: string;
3351
3360
  size_readable?: string;
3352
3361
  size_bytes?: number;
@@ -3358,8 +3367,12 @@ export interface FileAdditionalInfo {
3358
3367
  };
3359
3368
  [k: string]: unknown;
3360
3369
  }
3370
+ export interface ImageAdditionalInfo {
3371
+ varieties: MatrixAssetSchema1[];
3372
+ [k: string]: unknown;
3373
+ }
3361
3374
  export interface CalendarEventAdditionalInfo {
3362
- event_info?: {
3375
+ event_info: {
3363
3376
  duration?: number;
3364
3377
  frequency?: string;
3365
3378
  [k: string]: unknown;
@@ -0,0 +1,24 @@
1
+ import { FORMATTED_TEXT_SCHEMAS } from '..';
2
+ import { BaseFormattedNodes, FormattedText } from '../formatted-text/v1/formattedText';
3
+ import { PrimitiveType } from '../jsonTypeResolution/TypeResolver';
4
+
5
+ export const FormattedTextType = PrimitiveType<FormattedText, 'FormattedText'>({
6
+ ...FORMATTED_TEXT_SCHEMAS.v1,
7
+ title: 'FormattedText',
8
+ });
9
+ export type FormattedTextType = typeof FormattedTextType;
10
+
11
+ export const BaseFormattedTextType = PrimitiveType<BaseFormattedNodes[], 'FormattedText'>({
12
+ ...FORMATTED_TEXT_SCHEMAS.v1,
13
+ items: {
14
+ $ref: '#/definitions/BaseFormattedNodes',
15
+ },
16
+ title: 'FormattedText',
17
+ });
18
+ export type BaseFormattedTextType = typeof BaseFormattedTextType;
19
+
20
+ export const ComponentInputFormattedTextType = PrimitiveType<string, 'FormattedText'>({
21
+ type: 'string',
22
+ title: 'FormattedText',
23
+ });
24
+ export type ComponentInputFormattedTextType = typeof ComponentInputFormattedTextType;
@@ -0,0 +1,128 @@
1
+ import { PrimitiveType } from '../jsonTypeResolution/TypeResolver';
2
+
3
+ interface SquizImageData {
4
+ width: number;
5
+ height: number;
6
+ url: string;
7
+ mimeType: string;
8
+ byteSize: number;
9
+ sha1Hash: string;
10
+ aspectRatio: string; // Enforced validation of something like /\d+:\d+/
11
+ }
12
+
13
+ interface SquizImageShape {
14
+ name: string;
15
+ alt?: string;
16
+ caption?: string;
17
+
18
+ exif?: import('exif').ExifData;
19
+
20
+ imageVariations: {
21
+ original: SquizImageData;
22
+ small?: SquizImageData[];
23
+ medium?: SquizImageData[];
24
+ large?: SquizImageData[];
25
+ aspectRatios?: SquizImageData[];
26
+ };
27
+ }
28
+ export const SquizImageType = PrimitiveType<SquizImageShape, 'SquizImage'>({
29
+ title: 'SquizImage',
30
+ type: 'object',
31
+ properties: {
32
+ name: {
33
+ type: 'string',
34
+ },
35
+ alt: {
36
+ type: 'string',
37
+ },
38
+ caption: {
39
+ type: 'string',
40
+ },
41
+ exif: {
42
+ type: 'object',
43
+ properties: {
44
+ image: {
45
+ type: 'object',
46
+ },
47
+ thumbnail: {
48
+ type: 'object',
49
+ },
50
+ exif: {
51
+ type: 'object',
52
+ },
53
+ gps: {
54
+ type: 'object',
55
+ },
56
+ interoperability: {
57
+ type: 'object',
58
+ },
59
+ makernote: {
60
+ type: 'object',
61
+ },
62
+ },
63
+ required: ['image', 'thumbnail', 'exif', 'gps', 'interoperability', 'makernote'],
64
+ },
65
+ imageVariations: {
66
+ type: 'object',
67
+ properties: {
68
+ original: { $ref: '#/definitions/SquizImageData' },
69
+ small: {
70
+ type: 'array',
71
+ items: {
72
+ $ref: '#/definitions/SquizImageData',
73
+ },
74
+ },
75
+ medium: {
76
+ type: 'array',
77
+ items: {
78
+ $ref: '#/definitions/SquizImageData',
79
+ },
80
+ },
81
+ large: {
82
+ type: 'array',
83
+ items: {
84
+ $ref: '#/definitions/SquizImageData',
85
+ },
86
+ },
87
+ aspectRatios: {
88
+ type: 'array',
89
+ items: {
90
+ $ref: '#/definitions/SquizImageData',
91
+ },
92
+ },
93
+ },
94
+ required: ['original'],
95
+ },
96
+ },
97
+ required: ['name', 'imageVariations'],
98
+ definitions: {
99
+ SquizImageData: {
100
+ type: 'object',
101
+ properties: {
102
+ width: {
103
+ type: 'number',
104
+ },
105
+ height: {
106
+ type: 'number',
107
+ },
108
+ url: {
109
+ type: 'string',
110
+ },
111
+ mimeType: {
112
+ type: 'string',
113
+ },
114
+ byteSize: {
115
+ type: 'number',
116
+ },
117
+ sha1Hash: {
118
+ type: 'string',
119
+ },
120
+ aspectRatio: {
121
+ type: 'string',
122
+ },
123
+ },
124
+ required: ['width', 'height', 'url', 'mimeType', 'byteSize', 'sha1Hash', 'aspectRatio'],
125
+ },
126
+ },
127
+ });
128
+ export type SquizImageType = typeof SquizImageType;
@@ -0,0 +1,2 @@
1
+ export * from './SquizImage';
2
+ export * from './FormattedText';