@financial-times/cp-content-pipeline-schema 4.1.0 → 4.3.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 (40) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/MAIN-IMAGE.MD +59 -0
  3. package/lib/datasources/capi.js.map +1 -1
  4. package/lib/generated/index.d.ts +151 -22
  5. package/lib/resolvers/content-tree/Workarounds.d.ts +1 -1
  6. package/lib/resolvers/content-tree/nodePredicates.d.ts +1 -0
  7. package/lib/resolvers/content-tree/nodePredicates.js +13 -1
  8. package/lib/resolvers/content-tree/nodePredicates.js.map +1 -1
  9. package/lib/resolvers/content-tree/tagMappings.js +12 -9
  10. package/lib/resolvers/content-tree/tagMappings.js.map +1 -1
  11. package/lib/resolvers/content-tree/tagMappings.test.js +56 -2
  12. package/lib/resolvers/content-tree/tagMappings.test.js.map +1 -1
  13. package/lib/resolvers/core.d.ts +6 -0
  14. package/lib/resolvers/core.js +1 -0
  15. package/lib/resolvers/core.js.map +1 -1
  16. package/lib/resolvers/debug.d.ts +63 -0
  17. package/lib/resolvers/debug.js +44 -0
  18. package/lib/resolvers/debug.js.map +1 -0
  19. package/lib/resolvers/index.d.ts +66 -12
  20. package/lib/resolvers/index.js +2 -0
  21. package/lib/resolvers/index.js.map +1 -1
  22. package/lib/resolvers/topper.d.ts +20 -12
  23. package/lib/resolvers/topper.js +13 -12
  24. package/lib/resolvers/topper.js.map +1 -1
  25. package/package.json +4 -4
  26. package/queries/article.graphql +11 -0
  27. package/src/datasources/capi.ts +1 -0
  28. package/src/generated/index.ts +173 -22
  29. package/src/resolvers/content-tree/Workarounds.ts +1 -0
  30. package/src/resolvers/content-tree/nodePredicates.ts +22 -0
  31. package/src/resolvers/content-tree/tagMappings.test.ts +72 -3
  32. package/src/resolvers/content-tree/tagMappings.ts +18 -13
  33. package/src/resolvers/core.ts +1 -0
  34. package/src/resolvers/debug.ts +62 -0
  35. package/src/resolvers/index.ts +2 -0
  36. package/src/resolvers/topper.ts +14 -12
  37. package/tsconfig.tsbuildinfo +1 -1
  38. package/typedefs/core.graphql +3 -0
  39. package/typedefs/debug.graphql +69 -0
  40. package/typedefs/topper.graphql +32 -14
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.3.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v4.2.0...cp-content-pipeline-schema-v4.3.0) (2026-05-05)
4
+
5
+
6
+ ### Features
7
+
8
+ * add debug resolvers for http-based datasources ([3690e5b](https://github.com/Financial-Times/cp-content-pipeline/commit/3690e5bb9a36d7b25b9a39e215739ee307e99ae7))
9
+ * add new element for onward journey's find out more link ([9f916bf](https://github.com/Financial-Times/cp-content-pipeline/commit/9f916bfdcd5ee7525de6ea68a3731516f05af2b8))
10
+ * bump @financial-times/content-tree to 0.6.0 ([7f98a3a](https://github.com/Financial-Times/cp-content-pipeline/commit/7f98a3ae735b6a228d93236d3b08e3895016879b))
11
+
12
+ ## [4.2.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v4.1.0...cp-content-pipeline-schema-v4.2.0) (2026-04-22)
13
+
14
+
15
+ ### Features
16
+
17
+ * ci-3193 support main images in leadimage data ([62ce69c](https://github.com/Financial-Times/cp-content-pipeline/commit/62ce69cb437d1048236de70bc417d67a74b0132e))
18
+
3
19
  ## [4.1.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v4.0.0...cp-content-pipeline-schema-v4.1.0) (2026-04-16)
4
20
 
5
21
 
package/MAIN-IMAGE.MD ADDED
@@ -0,0 +1,59 @@
1
+ # Main Image logic
2
+
3
+ Historically, main images have come through to us as an imageset that is the first child in the body XML returned by CAPI. The main image appears between the standfirst and the byline, placing it amongst the topper data rather than the first item in the article body. The main image data should now be moving to the list of lead images.
4
+
5
+ Lead images can already contain the images used in the more stylized toppers (deep landscape, split text, full bleed) where the image is next to or underneath the topper content. These articles do not display a main image between standfirst and byline.
6
+
7
+ ## Data
8
+
9
+ ### Content tree
10
+
11
+ Spark has the concept of a basic topper type, and this branches out into further derived types (opinion, branded) when creating the topper data returned by this API. This is later checked by the templates.
12
+
13
+ The content tree will take the leadImages data to make a property called images on topper.
14
+
15
+ ```mermaid
16
+ flowchart TD
17
+ A[Topper model] --> |CAPI data | B{has leadImages?}
18
+ B --> |yes| C[filter to only get leadImages with truthy image property]
19
+ C --> D[create newCapiImage for each valid image]
20
+ D --> F["images: [CAPIImage instances]"]
21
+ B --> |no| E["images: []"]
22
+ ```
23
+
24
+ ### Tag mapping (bodyXML)
25
+
26
+ For tag mappings, we check if the first child of the body is an imageset and that there is no topper data to determine whether this is supposed to be a main image or not. The more stylized toppers have topper data, the basic types do not.
27
+
28
+ ```mermaid
29
+ flowchart TD
30
+ A[TagMapping] -->|CAPI data| B(articleMapping)
31
+ B --> C{check body > imageset:firstchild}
32
+ C -->|type is CCC OR <br />topperHasImage<sup>1</sup> AND topper exists| E[image-set]
33
+ C -->|else| D[main-image]
34
+ ```
35
+ <sup>1</sup> `topperHasImage` is true if there are 1+ valid `leadImages` items in the CAPI response. This is because if you have lead images, then anything in the body should be part of the article, not the main image.
36
+
37
+ ## Templates
38
+
39
+ #### Lead images for toppers with prominent images (split-left etc)
40
+ This is how we decide to render a lead image in the o-topper__visual area
41
+ ```mermaid
42
+ flowchart TD
43
+ Start([Topper/index.tsx]) --> HasImages{Does topper have<br/>'images' property?}
44
+ HasImages -->|yes| CheckType{Is type basic / branded / opinion?}
45
+ HasImages -->|no| NoRender[Don't render Picture]
46
+ CheckType -->|no/false/null/undefined| RenderPicture[Render Picture component]
47
+ CheckType -->|yes| NoRender
48
+ ```
49
+
50
+ #### Lead images for basic/opinion/branded toppers
51
+ This is how we decide whether to render a main image from lead images or bodyXML
52
+ ```mermaid
53
+ flowchart TD
54
+ Start([MainImage/index.tsx]) --> HasImages{Does topper have<br/>'images' property?}
55
+ HasImages -->|yes| CheckType{Is type basic / branded / opinion?}
56
+ HasImages -->|no| Fallback[Fall through to legacy main image rendering]
57
+ CheckType -->|yes| RenderTopperMainImage[Render TopperMainImage component]
58
+ CheckType -->|no| Fallback
59
+ ```
@@ -1 +1 @@
1
- {"version":3,"file":"capi.js","sourceRoot":"","sources":["../../src/datasources/capi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capi.js","sourceRoot":"","sources":["../../src/datasources/capi.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,11 @@ import type { FlourishSource as FlourishSourceModel } from '../model/FlourishSou
13
13
  import type { ContentTree } from '@financial-times/content-tree';
14
14
  import type { ReferenceWithCAPIData } from '../resolvers/content-tree/references';
15
15
  import type { Author as AuthorNode, ClipSet as ClipSetNode, OldClip as OldClipNode, RawImage as RawImageNode } from '../resolvers/content-tree/Workarounds';
16
+ import type { DataSourceFetchResult } from '@apollo/datasource-rest';
17
+ import type { DataSources } from '../datasources';
18
+ import type { CapiDataSource } from '../datasources/capi';
19
+ import type { OrigamiImageDataSource } from '../datasources/origami-image';
20
+ import type { TwitterDataSource } from '../datasources/twitter';
16
21
  import type { QueryContext } from '../';
17
22
  export type Maybe<T> = T | null;
18
23
  export type InputMaybe<T> = Maybe<T>;
@@ -312,25 +317,29 @@ export type AuthorReference = Reference & {
312
317
  /** The type of the reference, 'author' */
313
318
  readonly type: Scalars['String']['output'];
314
319
  };
315
- export type BasicTopper = Topper & {
320
+ export type BasicTopper = Topper & TopperWithImages & {
316
321
  /** Whether the topper should have a background box. */
317
322
  readonly backgroundBox?: Maybe<Scalars['Boolean']['output']>;
318
323
  /** The background colour of the topper. */
319
324
  readonly backgroundColour?: Maybe<Scalars['TopperBackgroundColour']['output']>;
320
325
  /** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
321
326
  readonly displayConcept?: Maybe<Concept>;
327
+ /** A fallback image to be used if the 'images' are not availableimages: [Image!]. */
328
+ readonly fallbackImage?: Maybe<Image>;
322
329
  /** The variant of the follow button to be displayed on the topper. */
323
330
  readonly followButtonVariant?: Maybe<Scalars['FollowButtonVariant']['output']>;
324
331
  /** The concept object of the genre, eg. {'type': 'GENRE', 'prefLabel': 'Opinion', ...}. */
325
332
  readonly genreConcept?: Maybe<Concept>;
326
333
  /** The headline text of the topper. */
327
334
  readonly headline: Scalars['String']['output'];
335
+ /** An array of images to be displayed on the topper. */
336
+ readonly images?: Maybe<ReadonlyArray<Image>>;
328
337
  /** An abstract syntax tree of the introduction text. */
329
338
  readonly intro?: Maybe<RichText>;
330
339
  /** Whether the topper should have a text shadow. */
331
340
  readonly textShadow?: Maybe<Scalars['Boolean']['output']>;
332
341
  };
333
- export type BrandedTopper = Topper & TopperWithBrand & TopperWithTheme & {
342
+ export type BrandedTopper = Topper & TopperWithBrand & TopperWithImages & TopperWithTheme & {
334
343
  /** Whether the topper should have a background box. */
335
344
  readonly backgroundBox?: Maybe<Scalars['Boolean']['output']>;
336
345
  /** The background colour of the topper. */
@@ -339,12 +348,16 @@ export type BrandedTopper = Topper & TopperWithBrand & TopperWithTheme & {
339
348
  readonly brandConcept?: Maybe<Concept>;
340
349
  /** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
341
350
  readonly displayConcept?: Maybe<Concept>;
351
+ /** A fallback image to be used if the 'images' are not availableimages: [Image!]. */
352
+ readonly fallbackImage?: Maybe<Image>;
342
353
  /** The variant of the follow button to be displayed on the topper. */
343
354
  readonly followButtonVariant?: Maybe<Scalars['FollowButtonVariant']['output']>;
344
355
  /** The concept object of the genre, eg. {'type': 'GENRE', 'prefLabel': 'Opinion', ...}. */
345
356
  readonly genreConcept?: Maybe<Concept>;
346
357
  /** The headline text of the topper. */
347
358
  readonly headline: Scalars['String']['output'];
359
+ /** An array of images to be displayed on the topper. */
360
+ readonly images?: Maybe<ReadonlyArray<Image>>;
348
361
  /** An abstract syntax tree of the introduction text. */
349
362
  readonly intro?: Maybe<RichText>;
350
363
  /** Whether the headline should be large. */
@@ -359,6 +372,32 @@ export type BrandedTopper = Topper & TopperWithBrand & TopperWithTheme & {
359
372
  /** Whether the topper should have a text shadow. */
360
373
  readonly textShadow?: Maybe<Scalars['Boolean']['output']>;
361
374
  };
375
+ export type CapiDebug = {
376
+ /** Call the /internalcontent endpoint for debugging */
377
+ readonly content: DebugResponse;
378
+ /** Call the /enrichedcontent endpoint for debugging */
379
+ readonly imageSet: DebugResponse;
380
+ /** Call the /lists endpoint for debugging */
381
+ readonly list: DebugResponse;
382
+ /** Call the /people endpoint for debugging */
383
+ readonly person: DebugResponse;
384
+ };
385
+ export type CapiDebugContentArgs = {
386
+ skipCache?: InputMaybe<Scalars['Boolean']['input']>;
387
+ uuid: Scalars['String']['input'];
388
+ };
389
+ export type CapiDebugImageSetArgs = {
390
+ skipCache?: InputMaybe<Scalars['Boolean']['input']>;
391
+ uuid: Scalars['String']['input'];
392
+ };
393
+ export type CapiDebugListArgs = {
394
+ skipCache?: InputMaybe<Scalars['Boolean']['input']>;
395
+ uuid: Scalars['String']['input'];
396
+ };
397
+ export type CapiDebugPersonArgs = {
398
+ skipCache?: InputMaybe<Scalars['Boolean']['input']>;
399
+ uuid: Scalars['String']['input'];
400
+ };
362
401
  export type Caption = {
363
402
  /** The media type of the caption eg. text/vtt. */
364
403
  readonly mediaType?: Maybe<Scalars['String']['output']>;
@@ -669,6 +708,24 @@ export type CustomCodeComponent = Reference & {
669
708
  /** Semantic version of the code of the component. */
670
709
  readonly versionRange: Scalars['String']['output'];
671
710
  };
711
+ export type DataSourceDebug = {
712
+ /** Call the Content API datasource for debugging */
713
+ readonly capi?: Maybe<CapiDebug>;
714
+ /** Call the Image Service datasource for debugging */
715
+ readonly imageService?: Maybe<ImageServiceDebug>;
716
+ /** Call the Twitter datasource for debugging */
717
+ readonly twitter?: Maybe<TwitterDebug>;
718
+ };
719
+ export type DebugResponse = {
720
+ /** The JSON body returned from the upstream datasource */
721
+ readonly body: Scalars['JSON']['output'];
722
+ /** Whether this response was served from the Valkey cache */
723
+ readonly fromCache: Scalars['Boolean']['output'];
724
+ /** The headers returned from the upstream datasource */
725
+ readonly headers: Scalars['JSON']['output'];
726
+ /** The status code returned by the upstream datasource */
727
+ readonly status: Scalars['Int']['output'];
728
+ };
672
729
  export type DeepLandscapeTopper = Topper & TopperWithBrand & TopperWithImages & TopperWithTheme & {
673
730
  /** Whether the topper should have a background box. */
674
731
  readonly backgroundBox?: Maybe<Scalars['Boolean']['output']>;
@@ -678,7 +735,7 @@ export type DeepLandscapeTopper = Topper & TopperWithBrand & TopperWithImages &
678
735
  readonly brandConcept?: Maybe<Concept>;
679
736
  /** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
680
737
  readonly displayConcept?: Maybe<Concept>;
681
- /** A fallback image to be used if the 'images' are not availableimages: [Image!]!. */
738
+ /** A fallback image to be used if the 'images' are not availableimages: [Image!]. */
682
739
  readonly fallbackImage?: Maybe<Image>;
683
740
  /** The variant of the follow button to be displayed on the topper. */
684
741
  readonly followButtonVariant?: Maybe<Scalars['FollowButtonVariant']['output']>;
@@ -687,7 +744,7 @@ export type DeepLandscapeTopper = Topper & TopperWithBrand & TopperWithImages &
687
744
  /** The headline text of the topper. */
688
745
  readonly headline: Scalars['String']['output'];
689
746
  /** An array of images to be displayed on the topper. */
690
- readonly images: ReadonlyArray<Image>;
747
+ readonly images?: Maybe<ReadonlyArray<Image>>;
691
748
  /** An abstract syntax tree of the introduction text. */
692
749
  readonly intro?: Maybe<RichText>;
693
750
  /** Whether the headline should be large. */
@@ -711,7 +768,7 @@ export type DeepPortraitTopper = Topper & TopperWithBrand & TopperWithImages & T
711
768
  readonly brandConcept?: Maybe<Concept>;
712
769
  /** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
713
770
  readonly displayConcept?: Maybe<Concept>;
714
- /** A fallback image to be used if the 'images' are not availableimages: [Image!]!. */
771
+ /** A fallback image to be used if the 'images' are not availableimages: [Image!]. */
715
772
  readonly fallbackImage?: Maybe<Image>;
716
773
  /** The variant of the follow button to be displayed on the topper. */
717
774
  readonly followButtonVariant?: Maybe<Scalars['FollowButtonVariant']['output']>;
@@ -720,7 +777,7 @@ export type DeepPortraitTopper = Topper & TopperWithBrand & TopperWithImages & T
720
777
  /** The headline text of the topper. */
721
778
  readonly headline: Scalars['String']['output'];
722
779
  /** An array of images to be displayed on the topper. */
723
- readonly images: ReadonlyArray<Image>;
780
+ readonly images?: Maybe<ReadonlyArray<Image>>;
724
781
  /** An abstract syntax tree of the introduction text. */
725
782
  readonly intro?: Maybe<RichText>;
726
783
  /** Whether the headline should be large. */
@@ -770,7 +827,7 @@ export type FullBleedTopper = Topper & TopperWithBrand & TopperWithImages & Topp
770
827
  readonly brandConcept?: Maybe<Concept>;
771
828
  /** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
772
829
  readonly displayConcept?: Maybe<Concept>;
773
- /** A fallback image to be used if the 'images' are not availableimages: [Image!]!. */
830
+ /** A fallback image to be used if the 'images' are not availableimages: [Image!]. */
774
831
  readonly fallbackImage?: Maybe<Image>;
775
832
  /** The variant of the follow button to be displayed on the topper. */
776
833
  readonly followButtonVariant?: Maybe<Scalars['FollowButtonVariant']['output']>;
@@ -779,7 +836,7 @@ export type FullBleedTopper = Topper & TopperWithBrand & TopperWithImages & Topp
779
836
  /** The headline text of the topper. */
780
837
  readonly headline: Scalars['String']['output'];
781
838
  /** An array of images to be displayed on the topper. */
782
- readonly images: ReadonlyArray<Image>;
839
+ readonly images?: Maybe<ReadonlyArray<Image>>;
783
840
  /** An abstract syntax tree of the introduction text. */
784
841
  readonly intro?: Maybe<RichText>;
785
842
  /** Whether the headline should be large. */
@@ -924,6 +981,14 @@ export type ImagePortraitSourceSetArgs = {
924
981
  maxDpr?: InputMaybe<Scalars['Int']['input']>;
925
982
  width?: InputMaybe<Scalars['Int']['input']>;
926
983
  };
984
+ export type ImageServiceDebug = {
985
+ /** Call the /metadata endpoint for debugging */
986
+ readonly metadata: DebugResponse;
987
+ };
988
+ export type ImageServiceDebugMetadataArgs = {
989
+ skipCache?: InputMaybe<Scalars['Boolean']['input']>;
990
+ url: Scalars['String']['input'];
991
+ };
927
992
  export type ImageSet = Reference & {
928
993
  /** A set of images with different sizes and formats. */
929
994
  readonly picture?: Maybe<Picture>;
@@ -1297,7 +1362,7 @@ export type Mutation = {
1297
1362
  export type MutationInvalidateRedisCacheArgs = {
1298
1363
  uuid: Scalars['String']['input'];
1299
1364
  };
1300
- export type OpinionTopper = Topper & TopperWithHeadshot & TopperWithTheme & {
1365
+ export type OpinionTopper = Topper & TopperWithHeadshot & TopperWithImages & TopperWithTheme & {
1301
1366
  /** Whether the topper should have a background box. */
1302
1367
  readonly backgroundBox?: Maybe<Scalars['Boolean']['output']>;
1303
1368
  /** The background colour of the topper. */
@@ -1311,6 +1376,8 @@ export type OpinionTopper = Topper & TopperWithHeadshot & TopperWithTheme & {
1311
1376
  readonly columnists?: Maybe<ReadonlyArray<Concept>>;
1312
1377
  /** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
1313
1378
  readonly displayConcept?: Maybe<Concept>;
1379
+ /** A fallback image to be used if the 'images' are not availableimages: [Image!]. */
1380
+ readonly fallbackImage?: Maybe<Image>;
1314
1381
  /** The variant of the follow button to be displayed on the topper. */
1315
1382
  readonly followButtonVariant?: Maybe<Scalars['FollowButtonVariant']['output']>;
1316
1383
  /** The concept object of the genre, eg. {'type': 'GENRE', 'prefLabel': 'Opinion', ...}. */
@@ -1319,6 +1386,8 @@ export type OpinionTopper = Topper & TopperWithHeadshot & TopperWithTheme & {
1319
1386
  readonly headline: Scalars['String']['output'];
1320
1387
  /** The url of the headshot image, eg. for columns with one key author. */
1321
1388
  readonly headshot?: Maybe<Scalars['String']['output']>;
1389
+ /** An array of images to be displayed on the topper. */
1390
+ readonly images?: Maybe<ReadonlyArray<Image>>;
1322
1391
  /** An abstract syntax tree of the introduction text. */
1323
1392
  readonly intro?: Maybe<RichText>;
1324
1393
  /** Whether the headline should be large. */
@@ -1355,7 +1424,7 @@ export type PartnerContentTopper = Topper & TopperWithImages & TopperWithTheme &
1355
1424
  readonly backgroundColour?: Maybe<Scalars['TopperBackgroundColour']['output']>;
1356
1425
  /** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
1357
1426
  readonly displayConcept?: Maybe<Concept>;
1358
- /** A fallback image to be used if the 'images' are not availableimages: [Image!]!. */
1427
+ /** A fallback image to be used if the 'images' are not availableimages: [Image!]. */
1359
1428
  readonly fallbackImage?: Maybe<Image>;
1360
1429
  /** The variant of the follow button to be displayed on the topper. */
1361
1430
  readonly followButtonVariant?: Maybe<Scalars['FollowButtonVariant']['output']>;
@@ -1364,7 +1433,7 @@ export type PartnerContentTopper = Topper & TopperWithImages & TopperWithTheme &
1364
1433
  /** The headline text of the topper. */
1365
1434
  readonly headline: Scalars['String']['output'];
1366
1435
  /** An array of images to be displayed on the topper. */
1367
- readonly images: ReadonlyArray<Image>;
1436
+ readonly images?: Maybe<ReadonlyArray<Image>>;
1368
1437
  /** An abstract syntax tree of the introduction text. */
1369
1438
  readonly intro?: Maybe<RichText>;
1370
1439
  /** Whether the headline should be large. */
@@ -1579,6 +1648,8 @@ export type Query = {
1579
1648
  readonly content: Content;
1580
1649
  /** The article content as resolved from passed-in content-api json data. */
1581
1650
  readonly contentFromJSON: Content;
1651
+ /** Directly call datasources for debugging purposes */
1652
+ readonly debugDataSources?: Maybe<DataSourceDebug>;
1582
1653
  /** Resolve a content list from a uuid. */
1583
1654
  readonly list: List;
1584
1655
  /** The version of the schema, eg. 2.0.0. */
@@ -1642,7 +1713,7 @@ export type SplitTextTopper = Topper & TopperWithBrand & TopperWithImages & Topp
1642
1713
  readonly design?: Maybe<Scalars['String']['output']>;
1643
1714
  /** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
1644
1715
  readonly displayConcept?: Maybe<Concept>;
1645
- /** A fallback image to be used if the 'images' are not availableimages: [Image!]!. */
1716
+ /** A fallback image to be used if the 'images' are not availableimages: [Image!]. */
1646
1717
  readonly fallbackImage?: Maybe<Image>;
1647
1718
  /** The variant of the follow button to be displayed on the topper. */
1648
1719
  readonly followButtonVariant?: Maybe<Scalars['FollowButtonVariant']['output']>;
@@ -1651,7 +1722,7 @@ export type SplitTextTopper = Topper & TopperWithBrand & TopperWithImages & Topp
1651
1722
  /** The headline text of the topper. */
1652
1723
  readonly headline: Scalars['String']['output'];
1653
1724
  /** An array of images to be displayed on the topper. */
1654
- readonly images: ReadonlyArray<Image>;
1725
+ readonly images?: Maybe<ReadonlyArray<Image>>;
1655
1726
  /** An abstract syntax tree of the introduction text. */
1656
1727
  readonly intro?: Maybe<RichText>;
1657
1728
  /** Whether the headline should be large. */
@@ -1815,7 +1886,7 @@ export type TopperWithImages = {
1815
1886
  /** A fallback image to be used if the 'images' are not available. */
1816
1887
  readonly fallbackImage?: Maybe<Image>;
1817
1888
  /** An array of images to be displayed on the topper. */
1818
- readonly images: ReadonlyArray<Image>;
1889
+ readonly images?: Maybe<ReadonlyArray<Image>>;
1819
1890
  };
1820
1891
  export type TopperWithPackage = {
1821
1892
  /** The design of the topper, eg. 'standard'. */
@@ -1838,6 +1909,14 @@ export type Tweet = Reference & {
1838
1909
  /** The type of the reference, eg. 'tweet'. */
1839
1910
  readonly type: Scalars['String']['output'];
1840
1911
  };
1912
+ export type TwitterDebug = {
1913
+ /** Call the OEmbed API for debugging */
1914
+ readonly tweet: DebugResponse;
1915
+ };
1916
+ export type TwitterDebugTweetArgs = {
1917
+ skipCache?: InputMaybe<Scalars['Boolean']['input']>;
1918
+ url: Scalars['String']['input'];
1919
+ };
1841
1920
  export type Video = Content & {
1842
1921
  /** A scalar representing the access level of the article, eg. 'free'. */
1843
1922
  readonly accessLevel?: Maybe<Scalars['AccessLevel']['output']>;
@@ -1955,7 +2034,7 @@ export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = R
1955
2034
  TopperWithBrand: (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel);
1956
2035
  TopperWithCoverImage: (TopperModel);
1957
2036
  TopperWithHeadshot: (TopperModel) | (TopperModel);
1958
- TopperWithImages: (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel);
2037
+ TopperWithImages: (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel);
1959
2038
  TopperWithPackage: (TopperModel);
1960
2039
  TopperWithTheme: (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel);
1961
2040
  }>;
@@ -1975,6 +2054,7 @@ export type ResolversTypes = ResolversObject<{
1975
2054
  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;
1976
2055
  BrandedTopper: ResolverTypeWrapper<TopperModel>;
1977
2056
  CanBeSyndicated: ResolverTypeWrapper<Scalars['CanBeSyndicated']['output']>;
2057
+ CapiDebug: ResolverTypeWrapper<CapiDataSource>;
1978
2058
  Caption: ResolverTypeWrapper<Caption>;
1979
2059
  Clip: ResolverTypeWrapper<ClipModel>;
1980
2060
  ClipFormat: ResolverTypeWrapper<Scalars['ClipFormat']['output']>;
@@ -1992,6 +2072,8 @@ export type ResolversTypes = ResolversObject<{
1992
2072
  ContentPackage: ResolverTypeWrapper<ContentModel>;
1993
2073
  ContentType: ResolverTypeWrapper<Scalars['ContentType']['output']>;
1994
2074
  CustomCodeComponent: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.CustomCodeComponent>>;
2075
+ DataSourceDebug: ResolverTypeWrapper<DataSources>;
2076
+ DebugResponse: ResolverTypeWrapper<DataSourceFetchResult<any>>;
1995
2077
  DeepLandscapeTopper: ResolverTypeWrapper<TopperModel>;
1996
2078
  DeepPortraitTopper: ResolverTypeWrapper<TopperModel>;
1997
2079
  Design: ResolverTypeWrapper<Design>;
@@ -2008,6 +2090,7 @@ export type ResolversTypes = ResolversObject<{
2008
2090
  ImageLandscape: ResolverTypeWrapper<ImageModel>;
2009
2091
  ImageMobile: ResolverTypeWrapper<ImageModel>;
2010
2092
  ImagePortrait: ResolverTypeWrapper<ImageModel>;
2093
+ ImageServiceDebug: ResolverTypeWrapper<OrigamiImageDataSource>;
2011
2094
  ImageSet: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.ImageSet>>;
2012
2095
  ImageSource: ResolverTypeWrapper<ImageSource>;
2013
2096
  ImageSquare: ResolverTypeWrapper<ImageModel>;
@@ -2069,6 +2152,7 @@ export type ResolversTypes = ResolversObject<{
2069
2152
  TopperWithPackage: ResolverTypeWrapper<TopperModel>;
2070
2153
  TopperWithTheme: ResolverTypeWrapper<TopperModel>;
2071
2154
  Tweet: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.Tweet>>;
2155
+ TwitterDebug: ResolverTypeWrapper<TwitterDataSource>;
2072
2156
  Video: ResolverTypeWrapper<ContentModel>;
2073
2157
  VideoReference: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.Video>>;
2074
2158
  }>;
@@ -2088,6 +2172,7 @@ export type ResolversParentTypes = ResolversObject<{
2088
2172
  Boolean: Scalars['Boolean']['output'];
2089
2173
  BrandedTopper: TopperModel;
2090
2174
  CanBeSyndicated: Scalars['CanBeSyndicated']['output'];
2175
+ CapiDebug: CapiDataSource;
2091
2176
  Caption: Caption;
2092
2177
  Clip: ClipModel;
2093
2178
  ClipFormat: Scalars['ClipFormat']['output'];
@@ -2105,6 +2190,8 @@ export type ResolversParentTypes = ResolversObject<{
2105
2190
  ContentPackage: ContentModel;
2106
2191
  ContentType: Scalars['ContentType']['output'];
2107
2192
  CustomCodeComponent: ReferenceWithCAPIData<ContentTree.CustomCodeComponent>;
2193
+ DataSourceDebug: DataSources;
2194
+ DebugResponse: DataSourceFetchResult<any>;
2108
2195
  DeepLandscapeTopper: TopperModel;
2109
2196
  DeepPortraitTopper: TopperModel;
2110
2197
  Design: Design;
@@ -2121,6 +2208,7 @@ export type ResolversParentTypes = ResolversObject<{
2121
2208
  ImageLandscape: ImageModel;
2122
2209
  ImageMobile: ImageModel;
2123
2210
  ImagePortrait: ImageModel;
2211
+ ImageServiceDebug: OrigamiImageDataSource;
2124
2212
  ImageSet: ReferenceWithCAPIData<ContentTree.ImageSet>;
2125
2213
  ImageSource: ImageSource;
2126
2214
  ImageSquare: ImageModel;
@@ -2182,6 +2270,7 @@ export type ResolversParentTypes = ResolversObject<{
2182
2270
  TopperWithPackage: TopperModel;
2183
2271
  TopperWithTheme: TopperModel;
2184
2272
  Tweet: ReferenceWithCAPIData<ContentTree.Tweet>;
2273
+ TwitterDebug: TwitterDataSource;
2185
2274
  Video: ContentModel;
2186
2275
  VideoReference: ReferenceWithCAPIData<ContentTree.Video>;
2187
2276
  }>;
@@ -2288,9 +2377,11 @@ export type BasicTopperResolvers<ContextType = QueryContext, ParentType extends
2288
2377
  backgroundBox: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2289
2378
  backgroundColour: Resolver<Maybe<ResolversTypes['TopperBackgroundColour']>, ParentType, ContextType>;
2290
2379
  displayConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2380
+ fallbackImage: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
2291
2381
  followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
2292
2382
  genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2293
2383
  headline: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2384
+ images: Resolver<Maybe<ReadonlyArray<ResolversTypes['Image']>>, ParentType, ContextType>;
2294
2385
  intro: Resolver<Maybe<ResolversTypes['RichText']>, ParentType, ContextType>;
2295
2386
  textShadow: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2296
2387
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
@@ -2300,9 +2391,11 @@ export type BrandedTopperResolvers<ContextType = QueryContext, ParentType extend
2300
2391
  backgroundColour: Resolver<Maybe<ResolversTypes['TopperBackgroundColour']>, ParentType, ContextType>;
2301
2392
  brandConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2302
2393
  displayConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2394
+ fallbackImage: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
2303
2395
  followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
2304
2396
  genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2305
2397
  headline: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2398
+ images: Resolver<Maybe<ReadonlyArray<ResolversTypes['Image']>>, ParentType, ContextType>;
2306
2399
  intro: Resolver<Maybe<ResolversTypes['RichText']>, ParentType, ContextType>;
2307
2400
  isLargeHeadline: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2308
2401
  layout: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -2313,6 +2406,13 @@ export type BrandedTopperResolvers<ContextType = QueryContext, ParentType extend
2313
2406
  export interface CanBeSyndicatedScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['CanBeSyndicated'], any> {
2314
2407
  name: 'CanBeSyndicated';
2315
2408
  }
2409
+ export type CapiDebugResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['CapiDebug'] = ResolversParentTypes['CapiDebug']> = ResolversObject<{
2410
+ content: Resolver<ResolversTypes['DebugResponse'], ParentType, ContextType, RequireFields<CapiDebugContentArgs, 'uuid'>>;
2411
+ imageSet: Resolver<ResolversTypes['DebugResponse'], ParentType, ContextType, RequireFields<CapiDebugImageSetArgs, 'uuid'>>;
2412
+ list: Resolver<ResolversTypes['DebugResponse'], ParentType, ContextType, RequireFields<CapiDebugListArgs, 'uuid'>>;
2413
+ person: Resolver<ResolversTypes['DebugResponse'], ParentType, ContextType, RequireFields<CapiDebugPersonArgs, 'uuid'>>;
2414
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2415
+ }>;
2316
2416
  export type CaptionResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Caption'] = ResolversParentTypes['Caption']> = ResolversObject<{
2317
2417
  mediaType: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
2318
2418
  url: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -2472,6 +2572,19 @@ export type CustomCodeComponentResolvers<ContextType = QueryContext, ParentType
2472
2572
  versionRange: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2473
2573
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2474
2574
  }>;
2575
+ export type DataSourceDebugResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['DataSourceDebug'] = ResolversParentTypes['DataSourceDebug']> = ResolversObject<{
2576
+ capi: Resolver<Maybe<ResolversTypes['CapiDebug']>, ParentType, ContextType>;
2577
+ imageService: Resolver<Maybe<ResolversTypes['ImageServiceDebug']>, ParentType, ContextType>;
2578
+ twitter: Resolver<Maybe<ResolversTypes['TwitterDebug']>, ParentType, ContextType>;
2579
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2580
+ }>;
2581
+ export type DebugResponseResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['DebugResponse'] = ResolversParentTypes['DebugResponse']> = ResolversObject<{
2582
+ body: Resolver<ResolversTypes['JSON'], ParentType, ContextType>;
2583
+ fromCache: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;
2584
+ headers: Resolver<ResolversTypes['JSON'], ParentType, ContextType>;
2585
+ status: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
2586
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2587
+ }>;
2475
2588
  export type DeepLandscapeTopperResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['DeepLandscapeTopper'] = ResolversParentTypes['DeepLandscapeTopper']> = ResolversObject<{
2476
2589
  backgroundBox: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2477
2590
  backgroundColour: Resolver<Maybe<ResolversTypes['TopperBackgroundColour']>, ParentType, ContextType>;
@@ -2481,7 +2594,7 @@ export type DeepLandscapeTopperResolvers<ContextType = QueryContext, ParentType
2481
2594
  followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
2482
2595
  genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2483
2596
  headline: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2484
- images: Resolver<ReadonlyArray<ResolversTypes['Image']>, ParentType, ContextType>;
2597
+ images: Resolver<Maybe<ReadonlyArray<ResolversTypes['Image']>>, ParentType, ContextType>;
2485
2598
  intro: Resolver<Maybe<ResolversTypes['RichText']>, ParentType, ContextType>;
2486
2599
  isLargeHeadline: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2487
2600
  layout: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -2498,7 +2611,7 @@ export type DeepPortraitTopperResolvers<ContextType = QueryContext, ParentType e
2498
2611
  followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
2499
2612
  genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2500
2613
  headline: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2501
- images: Resolver<ReadonlyArray<ResolversTypes['Image']>, ParentType, ContextType>;
2614
+ images: Resolver<Maybe<ReadonlyArray<ResolversTypes['Image']>>, ParentType, ContextType>;
2502
2615
  intro: Resolver<Maybe<ResolversTypes['RichText']>, ParentType, ContextType>;
2503
2616
  isLargeHeadline: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2504
2617
  layout: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -2540,7 +2653,7 @@ export type FullBleedTopperResolvers<ContextType = QueryContext, ParentType exte
2540
2653
  followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
2541
2654
  genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2542
2655
  headline: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2543
- images: Resolver<ReadonlyArray<ResolversTypes['Image']>, ParentType, ContextType>;
2656
+ images: Resolver<Maybe<ReadonlyArray<ResolversTypes['Image']>>, ParentType, ContextType>;
2544
2657
  intro: Resolver<Maybe<ResolversTypes['RichText']>, ParentType, ContextType>;
2545
2658
  isLargeHeadline: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2546
2659
  layout: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -2616,6 +2729,10 @@ export type ImagePortraitResolvers<ContextType = QueryContext, ParentType extend
2616
2729
  width: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;
2617
2730
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2618
2731
  }>;
2732
+ export type ImageServiceDebugResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['ImageServiceDebug'] = ResolversParentTypes['ImageServiceDebug']> = ResolversObject<{
2733
+ metadata: Resolver<ResolversTypes['DebugResponse'], ParentType, ContextType, RequireFields<ImageServiceDebugMetadataArgs, 'url'>>;
2734
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2735
+ }>;
2619
2736
  export type ImageSetResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['ImageSet'] = ResolversParentTypes['ImageSet']> = ResolversObject<{
2620
2737
  picture: Resolver<Maybe<ResolversTypes['Picture']>, ParentType, ContextType>;
2621
2738
  type: Resolver<ResolversTypes['String'], ParentType, ContextType>;
@@ -2827,10 +2944,12 @@ export type OpinionTopperResolvers<ContextType = QueryContext, ParentType extend
2827
2944
  columnist: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2828
2945
  columnists: Resolver<Maybe<ReadonlyArray<ResolversTypes['Concept']>>, ParentType, ContextType>;
2829
2946
  displayConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2947
+ fallbackImage: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
2830
2948
  followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
2831
2949
  genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2832
2950
  headline: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2833
2951
  headshot: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, Partial<OpinionTopperHeadshotArgs>>;
2952
+ images: Resolver<Maybe<ReadonlyArray<ResolversTypes['Image']>>, ParentType, ContextType>;
2834
2953
  intro: Resolver<Maybe<ResolversTypes['RichText']>, ParentType, ContextType>;
2835
2954
  isLargeHeadline: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2836
2955
  layout: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -2856,7 +2975,7 @@ export type PartnerContentTopperResolvers<ContextType = QueryContext, ParentType
2856
2975
  followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
2857
2976
  genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2858
2977
  headline: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2859
- images: Resolver<ReadonlyArray<ResolversTypes['Image']>, ParentType, ContextType>;
2978
+ images: Resolver<Maybe<ReadonlyArray<ResolversTypes['Image']>>, ParentType, ContextType>;
2860
2979
  intro: Resolver<Maybe<ResolversTypes['RichText']>, ParentType, ContextType>;
2861
2980
  isLargeHeadline: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2862
2981
  layout: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -2963,6 +3082,7 @@ export type PodcastTopperResolvers<ContextType = QueryContext, ParentType extend
2963
3082
  export type QueryResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = ResolversObject<{
2964
3083
  content: Resolver<ResolversTypes['Content'], ParentType, ContextType, RequireFields<QueryContentArgs, 'uuid'>>;
2965
3084
  contentFromJSON: Resolver<ResolversTypes['Content'], ParentType, ContextType, RequireFields<QueryContentFromJsonArgs, 'content'>>;
3085
+ debugDataSources: Resolver<Maybe<ResolversTypes['DataSourceDebug']>, ParentType, ContextType>;
2966
3086
  list: Resolver<ResolversTypes['List'], ParentType, ContextType, RequireFields<QueryListArgs, 'uuid'>>;
2967
3087
  version: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2968
3088
  }>;
@@ -3010,7 +3130,7 @@ export type SplitTextTopperResolvers<ContextType = QueryContext, ParentType exte
3010
3130
  followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
3011
3131
  genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
3012
3132
  headline: Resolver<ResolversTypes['String'], ParentType, ContextType>;
3013
- images: Resolver<ReadonlyArray<ResolversTypes['Image']>, ParentType, ContextType>;
3133
+ images: Resolver<Maybe<ReadonlyArray<ResolversTypes['Image']>>, ParentType, ContextType>;
3014
3134
  intro: Resolver<Maybe<ResolversTypes['RichText']>, ParentType, ContextType>;
3015
3135
  isLargeHeadline: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
3016
3136
  layout: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -3110,9 +3230,9 @@ export type TopperWithHeadshotResolvers<ContextType = QueryContext, ParentType e
3110
3230
  headshot: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, Partial<TopperWithHeadshotHeadshotArgs>>;
3111
3231
  }>;
3112
3232
  export type TopperWithImagesResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['TopperWithImages'] = ResolversParentTypes['TopperWithImages']> = ResolversObject<{
3113
- __resolveType?: TypeResolveFn<'DeepLandscapeTopper' | 'DeepPortraitTopper' | 'FullBleedTopper' | 'PartnerContentTopper' | 'SplitTextTopper', ParentType, ContextType>;
3233
+ __resolveType?: TypeResolveFn<'BasicTopper' | 'BrandedTopper' | 'DeepLandscapeTopper' | 'DeepPortraitTopper' | 'FullBleedTopper' | 'OpinionTopper' | 'PartnerContentTopper' | 'SplitTextTopper', ParentType, ContextType>;
3114
3234
  fallbackImage: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
3115
- images: Resolver<ReadonlyArray<ResolversTypes['Image']>, ParentType, ContextType>;
3235
+ images: Resolver<Maybe<ReadonlyArray<ResolversTypes['Image']>>, ParentType, ContextType>;
3116
3236
  }>;
3117
3237
  export type TopperWithPackageResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['TopperWithPackage'] = ResolversParentTypes['TopperWithPackage']> = ResolversObject<{
3118
3238
  __resolveType?: TypeResolveFn<'SplitTextTopper', ParentType, ContextType>;
@@ -3129,6 +3249,10 @@ export type TweetResolvers<ContextType = QueryContext, ParentType extends Resolv
3129
3249
  type: Resolver<ResolversTypes['String'], ParentType, ContextType>;
3130
3250
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
3131
3251
  }>;
3252
+ export type TwitterDebugResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['TwitterDebug'] = ResolversParentTypes['TwitterDebug']> = ResolversObject<{
3253
+ tweet: Resolver<ResolversTypes['DebugResponse'], ParentType, ContextType, RequireFields<TwitterDebugTweetArgs, 'url'>>;
3254
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
3255
+ }>;
3132
3256
  export type VideoResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Video'] = ResolversParentTypes['Video']> = ResolversObject<{
3133
3257
  accessLevel: Resolver<Maybe<ResolversTypes['AccessLevel']>, ParentType, ContextType>;
3134
3258
  altStandfirst: Resolver<Maybe<ResolversTypes['AltStandfirst']>, ParentType, ContextType>;
@@ -3177,6 +3301,7 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
3177
3301
  BasicTopper: BasicTopperResolvers<ContextType>;
3178
3302
  BrandedTopper: BrandedTopperResolvers<ContextType>;
3179
3303
  CanBeSyndicated: GraphQLScalarType;
3304
+ CapiDebug: CapiDebugResolvers<ContextType>;
3180
3305
  Caption: CaptionResolvers<ContextType>;
3181
3306
  Clip: ClipResolvers<ContextType>;
3182
3307
  ClipFormat: GraphQLScalarType;
@@ -3190,6 +3315,8 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
3190
3315
  ContentPackage: ContentPackageResolvers<ContextType>;
3191
3316
  ContentType: GraphQLScalarType;
3192
3317
  CustomCodeComponent: CustomCodeComponentResolvers<ContextType>;
3318
+ DataSourceDebug: DataSourceDebugResolvers<ContextType>;
3319
+ DebugResponse: DebugResponseResolvers<ContextType>;
3193
3320
  DeepLandscapeTopper: DeepLandscapeTopperResolvers<ContextType>;
3194
3321
  DeepPortraitTopper: DeepPortraitTopperResolvers<ContextType>;
3195
3322
  Design: DesignResolvers<ContextType>;
@@ -3204,6 +3331,7 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
3204
3331
  ImageLandscape: ImageLandscapeResolvers<ContextType>;
3205
3332
  ImageMobile: ImageMobileResolvers<ContextType>;
3206
3333
  ImagePortrait: ImagePortraitResolvers<ContextType>;
3334
+ ImageServiceDebug: ImageServiceDebugResolvers<ContextType>;
3207
3335
  ImageSet: ImageSetResolvers<ContextType>;
3208
3336
  ImageSource: ImageSourceResolvers<ContextType>;
3209
3337
  ImageSquare: ImageSquareResolvers<ContextType>;
@@ -3261,6 +3389,7 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
3261
3389
  TopperWithPackage: TopperWithPackageResolvers<ContextType>;
3262
3390
  TopperWithTheme: TopperWithThemeResolvers<ContextType>;
3263
3391
  Tweet: TweetResolvers<ContextType>;
3392
+ TwitterDebug: TwitterDebugResolvers<ContextType>;
3264
3393
  Video: VideoResolvers<ContextType>;
3265
3394
  VideoReference: VideoReferenceResolvers<ContextType>;
3266
3395
  }>;