@financial-times/cp-content-pipeline-schema 2.5.1 → 2.5.3

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 (136) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/lib/datasources/instrumented.js.map +1 -1
  3. package/lib/generated/index.d.ts +668 -907
  4. package/lib/helpers/imageService.d.ts +2 -1
  5. package/lib/model/Byline.js +1 -1
  6. package/lib/model/Byline.js.map +1 -1
  7. package/lib/model/CapiResponse.d.ts +14 -4
  8. package/lib/model/CapiResponse.js +19 -4
  9. package/lib/model/CapiResponse.js.map +1 -1
  10. package/lib/model/Clip.d.ts +3 -2
  11. package/lib/model/Clip.js +7 -5
  12. package/lib/model/Clip.js.map +1 -1
  13. package/lib/model/Concept.d.ts +3 -13
  14. package/lib/model/Concept.js +10 -10
  15. package/lib/model/Concept.js.map +1 -1
  16. package/lib/model/Image.d.ts +1 -5
  17. package/lib/model/Image.js.map +1 -1
  18. package/lib/model/Image.test.js.map +1 -1
  19. package/lib/model/RichText.d.ts +1 -1
  20. package/lib/model/RichText.js.map +1 -1
  21. package/lib/model/Topper.d.ts +4 -7
  22. package/lib/model/Topper.js +3 -3
  23. package/lib/model/Topper.js.map +1 -1
  24. package/lib/model/schemas/capi/base-schema.d.ts +0 -119
  25. package/lib/model/schemas/capi/base-schema.js +7 -7
  26. package/lib/model/schemas/capi/base-schema.js.map +1 -1
  27. package/lib/model/schemas/capi/content-package.d.ts +18 -0
  28. package/lib/model/schemas/capi/content-package.js +1 -0
  29. package/lib/model/schemas/capi/content-package.js.map +1 -1
  30. package/lib/resolvers/clip.d.ts +19 -1
  31. package/lib/resolvers/clip.js +10 -0
  32. package/lib/resolvers/clip.js.map +1 -1
  33. package/lib/resolvers/content-tree/nodePredicates.d.ts +0 -5
  34. package/lib/resolvers/content-tree/nodePredicates.js +1 -26
  35. package/lib/resolvers/content-tree/nodePredicates.js.map +1 -1
  36. package/lib/resolvers/content-tree/references/ClipSet.d.ts +13 -0
  37. package/lib/resolvers/content-tree/references/ClipSet.js +12 -1
  38. package/lib/resolvers/content-tree/references/ClipSet.js.map +1 -1
  39. package/lib/resolvers/content-tree/references/Flourish.d.ts +6 -0
  40. package/lib/resolvers/content-tree/references/Flourish.js +15 -1
  41. package/lib/resolvers/content-tree/references/Flourish.js.map +1 -1
  42. package/lib/resolvers/content-tree/references/ImageSet.d.ts +1 -0
  43. package/lib/resolvers/content-tree/references/ImageSet.js +3 -0
  44. package/lib/resolvers/content-tree/references/ImageSet.js.map +1 -1
  45. package/lib/resolvers/content-tree/references/LayoutImage.d.ts +1 -0
  46. package/lib/resolvers/content-tree/references/LayoutImage.js +3 -0
  47. package/lib/resolvers/content-tree/references/LayoutImage.js.map +1 -1
  48. package/lib/resolvers/content-tree/references/RawImage.d.ts +1 -0
  49. package/lib/resolvers/content-tree/references/RawImage.js +3 -0
  50. package/lib/resolvers/content-tree/references/RawImage.js.map +1 -1
  51. package/lib/resolvers/content-tree/references/Recommended.d.ts +1 -0
  52. package/lib/resolvers/content-tree/references/Recommended.js +3 -0
  53. package/lib/resolvers/content-tree/references/Recommended.js.map +1 -1
  54. package/lib/resolvers/content-tree/references/Reference.d.ts +1 -1
  55. package/lib/resolvers/content-tree/references/Reference.js +1 -3
  56. package/lib/resolvers/content-tree/references/Reference.js.map +1 -1
  57. package/lib/resolvers/content-tree/references/ScrollyImage.d.ts +1 -0
  58. package/lib/resolvers/content-tree/references/ScrollyImage.js +3 -0
  59. package/lib/resolvers/content-tree/references/ScrollyImage.js.map +1 -1
  60. package/lib/resolvers/content-tree/references/Tweet.d.ts +1 -0
  61. package/lib/resolvers/content-tree/references/Tweet.js +3 -0
  62. package/lib/resolvers/content-tree/references/Tweet.js.map +1 -1
  63. package/lib/resolvers/content-tree/references/Video.d.ts +2 -1
  64. package/lib/resolvers/content-tree/references/Video.js +4 -3
  65. package/lib/resolvers/content-tree/references/Video.js.map +1 -1
  66. package/lib/resolvers/content-tree/references/index.d.ts +5 -1
  67. package/lib/resolvers/content-tree/references/index.js +4 -0
  68. package/lib/resolvers/content-tree/references/index.js.map +1 -1
  69. package/lib/resolvers/content-tree/tagMappings.test.js +6 -9
  70. package/lib/resolvers/content-tree/tagMappings.test.js.map +1 -1
  71. package/lib/resolvers/content.d.ts +242 -33
  72. package/lib/resolvers/content.js +66 -31
  73. package/lib/resolvers/content.js.map +1 -1
  74. package/lib/resolvers/image.d.ts +142 -12
  75. package/lib/resolvers/image.js +45 -10
  76. package/lib/resolvers/image.js.map +1 -1
  77. package/lib/resolvers/index.d.ts +597 -61
  78. package/lib/resolvers/picture.d.ts +41 -8
  79. package/lib/resolvers/picture.js +19 -21
  80. package/lib/resolvers/picture.js.map +1 -1
  81. package/lib/resolvers/richText.d.ts +14 -2
  82. package/lib/resolvers/richText.js +8 -6
  83. package/lib/resolvers/richText.js.map +1 -1
  84. package/lib/resolvers/scalars.d.ts +2 -1
  85. package/lib/resolvers/scalars.js +5 -3
  86. package/lib/resolvers/scalars.js.map +1 -1
  87. package/lib/resolvers/teaser.d.ts +5 -0
  88. package/lib/resolvers/teaser.js +6 -1
  89. package/lib/resolvers/teaser.js.map +1 -1
  90. package/lib/resolvers/topper.d.ts +127 -7
  91. package/lib/resolvers/topper.js +64 -6
  92. package/lib/resolvers/topper.js.map +1 -1
  93. package/package.json +1 -1
  94. package/src/datasources/instrumented.ts +0 -1
  95. package/src/generated/index.ts +668 -668
  96. package/src/helpers/imageService.ts +1 -1
  97. package/src/model/Byline.ts +1 -1
  98. package/src/model/CapiResponse.ts +32 -7
  99. package/src/model/Clip.ts +11 -8
  100. package/src/model/Concept.ts +5 -9
  101. package/src/model/Image.test.ts +1 -6
  102. package/src/model/Image.ts +1 -6
  103. package/src/model/RichText.ts +1 -1
  104. package/src/model/Topper.ts +5 -9
  105. package/src/model/schemas/capi/base-schema.ts +3 -3
  106. package/src/model/schemas/capi/content-package.ts +1 -0
  107. package/src/resolvers/clip.ts +13 -2
  108. package/src/resolvers/content-tree/nodePredicates.ts +0 -42
  109. package/src/resolvers/content-tree/references/ClipSet.ts +22 -2
  110. package/src/resolvers/content-tree/references/Flourish.ts +20 -1
  111. package/src/resolvers/content-tree/references/ImageSet.ts +4 -0
  112. package/src/resolvers/content-tree/references/LayoutImage.ts +4 -0
  113. package/src/resolvers/content-tree/references/RawImage.ts +4 -0
  114. package/src/resolvers/content-tree/references/Recommended.ts +4 -0
  115. package/src/resolvers/content-tree/references/Reference.ts +1 -3
  116. package/src/resolvers/content-tree/references/ScrollyImage.ts +4 -0
  117. package/src/resolvers/content-tree/references/Tweet.ts +4 -0
  118. package/src/resolvers/content-tree/references/Video.ts +5 -3
  119. package/src/resolvers/content-tree/references/index.ts +13 -4
  120. package/src/resolvers/content-tree/tagMappings.test.ts +6 -10
  121. package/src/resolvers/content.ts +88 -38
  122. package/src/resolvers/image.ts +75 -5
  123. package/src/resolvers/picture.ts +35 -23
  124. package/src/resolvers/richText.ts +13 -8
  125. package/src/resolvers/scalars.ts +3 -1
  126. package/src/resolvers/teaser.ts +6 -2
  127. package/src/resolvers/topper.ts +86 -6
  128. package/tsconfig.tsbuildinfo +1 -1
  129. package/lib/fixtures/clipSet.d.ts +0 -2
  130. package/lib/fixtures/clipSet.js +0 -70
  131. package/lib/fixtures/clipSet.js.map +0 -1
  132. package/lib/helpers/kebabCaseToPascalCase.d.ts +0 -1
  133. package/lib/helpers/kebabCaseToPascalCase.js +0 -7
  134. package/lib/helpers/kebabCaseToPascalCase.js.map +0 -1
  135. package/src/fixtures/clipSet.ts +0 -72
  136. package/src/helpers/kebabCaseToPascalCase.ts +0 -5
@@ -1,5 +1,4 @@
1
1
  import { Topper } from '../model/Topper'
2
- import { Byline } from '../model/Byline'
3
2
  import {
4
3
  ArticleResolvers,
5
4
  PlaceholderResolvers,
@@ -8,8 +7,40 @@ import {
8
7
  ContentResolvers,
9
8
  LiveBlogPackageResolvers,
10
9
  LiveBlogPostResolvers,
10
+ VideoResolvers,
11
+ TableOfContentsResolvers,
12
+ AltStandfirstResolvers,
13
+ AltTitleResolvers,
14
+ DesignResolvers,
15
+ IndicatorsResolvers,
16
+ MediaResolvers,
11
17
  } from '../generated'
12
- import { RichText } from '../model/RichText'
18
+
19
+ const contentResolvers: ContentResolvers = {
20
+ accessLevel: (parent) => parent.accessLevel(),
21
+ altStandfirst: (parent) => parent.alternativeStandfirst(),
22
+ altTitle: (parent) => parent.alternativeTitle(),
23
+ annotations: (parent) => parent.annotations(),
24
+ body: (parent) => parent.body(),
25
+ bodyXML: (parent) => parent.bodyXML(),
26
+ byline: (parent, args) => parent.byline(args),
27
+ canBeSyndicated: (parent) => parent.canBeSyndicated(),
28
+ commentsEnabled: (parent) => parent.commentsEnabled(),
29
+ design: (parent) => parent.design(),
30
+ editorialDesk: (parent) => parent.editorialDesk(),
31
+ firstPublishedDate: (parent) => parent.firstPublishedDate(),
32
+ id: (parent) => parent.id(),
33
+ instantAlertConcept: (parent) => parent.instantAlertConcept(),
34
+ mainImage: (parent) => parent.mainImage(),
35
+ originatingParty: (parent) => parent.originatingParty(),
36
+ publishedDate: (parent) => parent.publishedDate(),
37
+ standfirst: (parent) => parent.standfirst(),
38
+ teaser: (parent) => parent.teaser(),
39
+ title: (parent) => parent.title(),
40
+ topper: (parent, _, context) => new Topper(parent, context),
41
+ type: (parent) => parent.type(),
42
+ url: (parent, args) => parent.url(args),
43
+ }
13
44
 
14
45
  const resolvers = {
15
46
  Content: {
@@ -26,78 +57,90 @@ const resolvers = {
26
57
 
27
58
  return type
28
59
  },
29
- body(parent) {
30
- return new RichText('bodyXML', parent.bodyXML(), parent)
31
- },
32
- topper: (parent, _, context) => new Topper(parent, context),
33
- byline(parent, args, context) {
34
- const vanity = Boolean(args.vanity)
35
- const bylineText = parent.byline()
36
-
37
- if (!bylineText) return null
38
- const authorUrlMapping = parent.getAuthorUrlMapping()
39
-
40
- return new Byline(
41
- bylineText,
42
- vanity,
43
- authorUrlMapping,
44
- context
45
- ).buildBylineTree()
46
- },
47
- url: (parent, args) =>
48
- args.relative
49
- ? parent.relativeUrl(args?.vanity)
50
- : parent.url(args?.vanity),
51
- type: (parent) => parent.type(),
52
- mainImage: (parent) => parent.mainImage(),
53
- altTitle: (parent) => parent.alternativeTitle(),
54
- altStandfirst: (parent) => parent.alternativeStandfirst(),
55
- publishedDate: (parent) => parent.publishedDate(),
56
- annotations: (parent) => parent.annotations(),
57
- accessLevel: (parent) => parent.accessLevel(),
58
- editorialDesk: (parent) => parent.editorialDesk(),
59
- canBeSyndicated: (parent) => parent.canBeSyndicated(),
60
- instantAlertConcept: (parent) => parent.instantAlertConcept(),
61
- originatingParty: (parent) => parent.originatingParty(),
62
- commentsEnabled: (parent) => parent.commentsEnabled(),
63
- design: (parent) => parent.design(),
60
+ ...contentResolvers,
64
61
  },
65
62
 
66
63
  Article: {
64
+ ...contentResolvers,
67
65
  containedIn: (parent) => parent.containedIn(),
68
66
  },
69
67
 
70
68
  Placeholder: {
69
+ ...contentResolvers,
71
70
  containedIn: (parent) => parent.containedIn(),
72
71
  },
73
72
 
74
73
  LiveBlogPost: {
74
+ ...contentResolvers,
75
75
  containedIn: (parent) => parent.containedIn(),
76
- isPinned: (parent) => parent.isPinned(),
77
76
  indicators(parent) {
78
77
  return {
79
78
  isOpinion: parent.isOpinion(),
80
79
  }
81
80
  },
81
+ isPinned: (parent) => parent.isPinned(),
82
82
  },
83
83
 
84
84
  LiveBlogPackage: {
85
+ ...contentResolvers,
85
86
  liveBlogPosts: (parent) => parent.liveBlogPosts(),
86
87
  pinnedPost: (parent) => parent.pinnedPost(),
87
88
  realtime: (parent) => parent.realtime(),
88
89
  },
89
90
 
90
91
  ContentPackage: {
92
+ ...contentResolvers,
91
93
  contains: (parent, args) => parent.contains(args),
94
+ tableOfContents: (parent) => parent.tableOfContents(),
92
95
  containsLength: (parent) => parent.containsLength(),
93
96
  },
94
97
 
95
98
  Audio: {
99
+ ...contentResolvers,
96
100
  media: (parent) =>
97
101
  // TODO:20230712:IM should probably return captions too
98
102
  parent.media()?.filter(({ mediaType }) => mediaType === 'audio/mpeg') ??
99
103
  null,
100
104
  },
105
+
106
+ Video: {
107
+ ...contentResolvers,
108
+ },
109
+
110
+ AltStandfirst: {
111
+ promotionalStandfirst: (parent) => parent.promotionalStandfirst ?? null,
112
+ },
113
+
114
+ AltTitle: {
115
+ promotionalTitle: (parent) => parent.promotionalTitle ?? null,
116
+ },
117
+
118
+ Design: {
119
+ layout: (parent) => parent.layout ?? null,
120
+ theme: (parent) => parent.theme ?? null,
121
+ },
122
+
123
+ Indicators: {
124
+ accessLevel: (parent) => parent.accessLevel ?? null,
125
+ isOpinion: (parent) => parent.isOpinion ?? null,
126
+ isColumn: (parent) => parent.isColumn ?? null,
127
+ isPodcast: (parent) => parent.isPodcast ?? null,
128
+ isEditorsChoice: (parent) => parent.isEditorsChoice ?? null,
129
+ isExclusive: (parent) => parent.isExclusive ?? null,
130
+ isScoop: (parent) => parent.isScoop ?? null,
131
+ },
132
+
133
+ Media: {
134
+ url: (parent) => parent.url ?? null,
135
+ duration: (parent) => parent.duration ?? null,
136
+ filesize: (parent) => parent.filesize ?? null,
137
+ mediaType: (parent) => parent.mediaType ?? null,
138
+ },
139
+
140
+ TableOfContents: {
141
+ labelType: (parent) => parent.labelType ?? null,
142
+ sequence: (parent) => parent.sequence ?? null,
143
+ },
101
144
  } satisfies {
102
145
  Article: ArticleResolvers
103
146
  Placeholder: PlaceholderResolvers
@@ -106,6 +149,13 @@ const resolvers = {
106
149
  LiveBlogPackage: LiveBlogPackageResolvers
107
150
  ContentPackage: ContentPackageResolvers
108
151
  Audio: AudioResolvers
152
+ Video: VideoResolvers
153
+ AltStandfirst: AltStandfirstResolvers
154
+ AltTitle: AltTitleResolvers
155
+ Design: DesignResolvers
156
+ Indicators: IndicatorsResolvers
157
+ TableOfContents: TableOfContentsResolvers
158
+ Media: MediaResolvers
109
159
  }
110
160
 
111
161
  export default resolvers
@@ -1,4 +1,16 @@
1
- import { ImageResolvers } from '../generated'
1
+ import {
2
+ ImageDesktopResolvers,
3
+ ImageLandscapeResolvers,
4
+ ImageMobileResolvers,
5
+ ImagePortraitResolvers,
6
+ ImageResolvers,
7
+ ImageSourceResolvers,
8
+ ImageSquareFtEditResolvers,
9
+ ImageSquareResolvers,
10
+ ImageStandardInlineResolvers,
11
+ ImageStandardResolvers,
12
+ ImageWideResolvers,
13
+ } from '../generated'
2
14
  import { LiteralUnionScalarValues } from './literal-union'
3
15
  import { ImageFormat } from './scalars'
4
16
 
@@ -47,9 +59,7 @@ const resolveImageTypeFromTree = (
47
59
  return 'ImageStandard'
48
60
  }
49
61
 
50
- const resolvers = {
51
- Image: {
52
- __resolveType: (image) => resolveImageTypeFromTree(image.format()),
62
+ const imageResolvers: ImageResolvers = {
53
63
  type: (image) => image.type(),
54
64
  format: (image) => image.format(),
55
65
  caption: (image) => image.caption(),
@@ -60,7 +70,67 @@ const resolvers = {
60
70
  height: async (image) => (await image.dimensions())?.height ?? null,
61
71
  sourceSet: (image, args) => image.sourceSet(args),
62
72
  altText: (image) => image.alt(),
73
+ }
74
+
75
+ const resolvers = {
76
+ Image: {
77
+ __resolveType: (image) => resolveImageTypeFromTree(image.format()),
78
+ ...imageResolvers,
63
79
  },
64
- } satisfies { Image: ImageResolvers }
80
+
81
+ ImageDesktop: {
82
+ ...imageResolvers,
83
+ },
84
+
85
+ ImageMobile: {
86
+ ...imageResolvers,
87
+ },
88
+
89
+ ImagePortrait: {
90
+ ...imageResolvers,
91
+ },
92
+
93
+ ImageLandscape: {
94
+ ...imageResolvers,
95
+ },
96
+
97
+ ImageSquare: {
98
+ ...imageResolvers,
99
+ },
100
+
101
+ ImageSquareFTEdit: {
102
+ ...imageResolvers,
103
+ },
104
+
105
+ ImageStandard: {
106
+ ...imageResolvers,
107
+ },
108
+
109
+ ImageStandardInline: {
110
+ ...imageResolvers,
111
+ },
112
+
113
+ ImageWide: {
114
+ ...imageResolvers,
115
+ },
116
+
117
+ ImageSource: {
118
+ url: (image) => image.url,
119
+ width: (image) => image.width ?? null,
120
+ dpr: (image) => image.dpr ?? null,
121
+ },
122
+ } satisfies {
123
+ Image: ImageResolvers
124
+ ImageDesktop: ImageDesktopResolvers
125
+ ImageMobile: ImageMobileResolvers
126
+ ImagePortrait: ImagePortraitResolvers
127
+ ImageLandscape: ImageLandscapeResolvers
128
+ ImageSquare: ImageSquareResolvers
129
+ ImageSquareFTEdit: ImageSquareFtEditResolvers
130
+ ImageStandard: ImageStandardResolvers
131
+ ImageStandardInline: ImageStandardInlineResolvers
132
+ ImageWide: ImageWideResolvers
133
+ ImageSource: ImageSourceResolvers
134
+ }
65
135
 
66
136
  export default resolvers
@@ -1,4 +1,19 @@
1
- import { PictureResolvers } from '../generated'
1
+ import {
2
+ PictureResolvers,
3
+ PictureFullBleedResolvers,
4
+ PictureInlineResolvers,
5
+ PictureStandardResolvers,
6
+ } from '../generated'
7
+
8
+ const pictureResolvers: PictureResolvers = {
9
+ alt: (parent) => parent.standard().alt(),
10
+ caption: (parent) => parent.standard().caption(),
11
+ credit: (parent) => parent.standard().credit(),
12
+ fallbackImage: (parent) => parent.standard(),
13
+ images: (parent) => parent.images(),
14
+ imageType: (parent) => parent.standard().type(),
15
+ layoutWidth: (parent) => parent.layoutWidth(),
16
+ }
2
17
 
3
18
  const resolvers = {
4
19
  Picture: {
@@ -11,28 +26,25 @@ const resolvers = {
11
26
  } as const
12
27
  return layoutWidthToType[layoutWidth]
13
28
  },
14
- layoutWidth(parent) {
15
- return parent.layoutWidth()
16
- },
17
- images(parent) {
18
- return parent.images()
19
- },
20
- fallbackImage(parent) {
21
- return parent.standard()
22
- },
23
- caption(parent) {
24
- return parent.standard().caption()
25
- },
26
- credit(parent) {
27
- return parent.standard().credit()
28
- },
29
- alt(parent) {
30
- return parent.standard().alt()
31
- },
32
- imageType(parent) {
33
- return parent.standard().type()
34
- },
29
+ ...pictureResolvers,
30
+ },
31
+
32
+ PictureStandard: {
33
+ ...pictureResolvers,
34
+ },
35
+
36
+ PictureInline: {
37
+ ...pictureResolvers,
38
+ },
39
+
40
+ PictureFullBleed: {
41
+ ...pictureResolvers,
35
42
  },
36
- } satisfies { Picture: PictureResolvers }
43
+ } satisfies {
44
+ Picture: PictureResolvers
45
+ PictureFullBleed: PictureFullBleedResolvers
46
+ PictureInline: PictureInlineResolvers
47
+ PictureStandard: PictureStandardResolvers
48
+ }
37
49
 
38
50
  export default resolvers
@@ -1,15 +1,20 @@
1
- import { RichTextResolvers } from '../generated'
1
+ import { RichTextResolvers, StructuredContentResolvers } from '../generated'
2
2
 
3
3
  const resolvers = {
4
4
  RichText: {
5
- raw(parent) {
6
- return parent.raw()
7
- },
5
+ raw: (parent) => parent.raw(),
6
+ structured: (parent, _, context) => parent.structured(context),
7
+ source: (parent) => parent.source,
8
+ },
8
9
 
9
- structured(parent, args, context) {
10
- return parent.structured(context)
11
- },
10
+ StructuredContent: {
11
+ tree: (parent) => parent.tree,
12
+ references: (parent) => parent.references,
13
+ text: (parent) => parent.text ?? null,
12
14
  },
13
- } satisfies { RichText: RichTextResolvers }
15
+ } satisfies {
16
+ RichText: RichTextResolvers
17
+ StructuredContent: StructuredContentResolvers
18
+ }
14
19
 
15
20
  export default resolvers
@@ -1,3 +1,4 @@
1
+ import { GraphQLScalarType } from 'graphql'
1
2
  import { LiteralUnionScalar } from './literal-union'
2
3
 
3
4
  export const ImageFormat = new LiteralUnionScalar<
@@ -63,7 +64,7 @@ export const TopperBackgroundColour = new LiteralUnionScalar<
63
64
  ],
64
65
  })
65
66
 
66
- export const FollowButtonVariant = new LiteralUnionScalar<
67
+ const FollowButtonVariant = new LiteralUnionScalar<
67
68
  [
68
69
  'standard',
69
70
  'inverse',
@@ -155,6 +156,7 @@ const resolvers = {
155
156
  ImageType,
156
157
  RichTextSource,
157
158
  ContentType,
159
+ JSON: new GraphQLScalarType({ name: 'JSON' }),
158
160
  }
159
161
 
160
162
  export default resolvers
@@ -2,8 +2,7 @@ import { TeaserResolvers } from '../generated'
2
2
 
3
3
  const resolvers = {
4
4
  Teaser: {
5
- url: (parent, args) =>
6
- args.relative ? parent.relativeUrl() : parent.url(),
5
+ url: (parent, args) => parent.url(args),
7
6
  type: (parent) =>
8
7
  parent
9
8
  .type()
@@ -28,6 +27,11 @@ const resolvers = {
28
27
  }
29
28
  },
30
29
  standfirst: (parent) => parent.standfirst(),
30
+ firstPublishedDate: (parent) => parent.firstPublishedDate(),
31
+ id: (parent) => parent.id(),
32
+ publishedDate: (parent) => parent.publishedDate(),
33
+ theme: (parent) => parent.design().theme,
34
+ title: (parent) => parent.title(),
31
35
  },
32
36
  } satisfies { Teaser: TeaserResolvers }
33
37
 
@@ -6,17 +6,30 @@ import {
6
6
  TopperWithPackageResolvers,
7
7
  TopperWithThemeResolvers,
8
8
  PodcastTopperResolvers,
9
+ TopperWithHeadshotResolvers,
10
+ BasicTopperResolvers,
11
+ SplitTextTopperResolvers,
12
+ FullBleedTopperResolvers,
13
+ DeepLandscapeTopperResolvers,
14
+ DeepPortraitTopperResolvers,
15
+ BrandedTopperResolvers,
9
16
  } from '../generated'
10
17
 
18
+ const topperResolvers: TopperResolvers = {
19
+ backgroundBox: (topper) => topper.backgroundBox(),
20
+ backgroundColour: (topper) => topper.backgroundColour(),
21
+ displayConcept: (topper) => topper.displayConcept(),
22
+ followButtonVariant: (topper) => topper.followButtonVariant(),
23
+ genreConcept: (topper) => topper.genreConcept(),
24
+ headline: (topper) => topper.headline(),
25
+ intro: (topper) => topper.intro(),
26
+ textShadow: (topper) => topper.textShadow(),
27
+ }
28
+
11
29
  const resolvers = {
12
30
  Topper: {
13
31
  __resolveType: (topper) => topper.type(),
14
- headline: (topper) => topper.headline(),
15
- intro: (topper) => topper.intro(),
16
- backgroundColour: (topper) => topper.backgroundColour(),
17
- displayConcept: (topper) => topper.displayConcept(),
18
- followButtonVariant: (topper) => topper.followButtonVariant(),
19
- genreConcept: (topper) => topper.genreConcept(),
32
+ ...topperResolvers,
20
33
  },
21
34
 
22
35
  TopperWithImages: {
@@ -34,26 +47,93 @@ const resolvers = {
34
47
  genreConcept: (topper) => topper.genreConcept(),
35
48
  },
36
49
 
50
+ TopperWithHeadshot: {
51
+ headshot: (topper, args) => topper.headshot(args),
52
+ },
53
+
37
54
  PodcastTopper: {
55
+ ...topperResolvers,
56
+ brandConcept: (topper) => topper.brandConcept(),
38
57
  headshot: (topper, args) => topper.headshot(args),
58
+ isLargeHeadline: (topper) => topper.isLargeHeadline(),
59
+ layout: (topper) => topper.layout(),
60
+ columnist: (topper) => topper.columnist(),
39
61
  },
40
62
 
41
63
  OpinionTopper: {
64
+ ...topperResolvers,
42
65
  headshot: (topper, args) => topper.headshot(args),
66
+ isLargeHeadline: (topper) => topper.isLargeHeadline(),
67
+ layout: (topper) => topper.layout(),
43
68
  columnist: (topper) => topper.columnist(),
44
69
  },
45
70
 
46
71
  TopperWithPackage: {
47
72
  design: (topper) => topper.design().theme,
48
73
  },
74
+
75
+ BasicTopper: {
76
+ ...topperResolvers,
77
+ },
78
+
79
+ BrandedTopper: {
80
+ ...topperResolvers,
81
+ brandConcept: (topper) => topper.brandConcept(),
82
+ isLargeHeadline: (topper) => topper.isLargeHeadline(),
83
+ layout: (topper) => topper.layout(),
84
+ },
85
+
86
+ DeepLandscapeTopper: {
87
+ ...topperResolvers,
88
+ brandConcept: (topper) => topper.brandConcept(),
89
+ isLargeHeadline: (topper) => topper.isLargeHeadline(),
90
+ layout: (topper) => topper.layout(),
91
+ fallbackImage: (topper) => topper.fallbackImage(),
92
+ images: (topper) => topper.images(),
93
+ },
94
+
95
+ DeepPortraitTopper: {
96
+ ...topperResolvers,
97
+ brandConcept: (topper) => topper.brandConcept(),
98
+ isLargeHeadline: (topper) => topper.isLargeHeadline(),
99
+ layout: (topper) => topper.layout(),
100
+ fallbackImage: (topper) => topper.fallbackImage(),
101
+ images: (topper) => topper.images(),
102
+ },
103
+
104
+ FullBleedTopper: {
105
+ ...topperResolvers,
106
+ brandConcept: (topper) => topper.brandConcept(),
107
+ isLargeHeadline: (topper) => topper.isLargeHeadline(),
108
+ layout: (topper) => topper.layout(),
109
+ fallbackImage: (topper) => topper.fallbackImage(),
110
+ images: (topper) => topper.images(),
111
+ },
112
+
113
+ SplitTextTopper: {
114
+ ...topperResolvers,
115
+ design: (topper) => topper.design().theme,
116
+ brandConcept: (topper) => topper.brandConcept(),
117
+ isLargeHeadline: (topper) => topper.isLargeHeadline(),
118
+ layout: (topper) => topper.layout(),
119
+ fallbackImage: (topper) => topper.fallbackImage(),
120
+ images: (topper) => topper.images(),
121
+ },
49
122
  } satisfies {
50
123
  Topper: TopperResolvers
51
124
  TopperWithImages: TopperWithImagesResolvers
52
125
  TopperWithTheme: TopperWithThemeResolvers
53
126
  TopperWithBrand: TopperWithBrandResolvers
127
+ TopperWithHeadshot: TopperWithHeadshotResolvers
54
128
  TopperWithPackage: TopperWithPackageResolvers
55
129
  PodcastTopper: PodcastTopperResolvers
56
130
  OpinionTopper: OpinionTopperResolvers
131
+ BasicTopper: BasicTopperResolvers
132
+ BrandedTopper: BrandedTopperResolvers
133
+ DeepLandscapeTopper: DeepLandscapeTopperResolvers
134
+ DeepPortraitTopper: DeepPortraitTopperResolvers
135
+ FullBleedTopper: FullBleedTopperResolvers
136
+ SplitTextTopper: SplitTextTopperResolvers
57
137
  }
58
138
 
59
139
  export default resolvers