@financial-times/cp-content-pipeline-schema 3.16.0 → 3.18.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 +17 -0
  2. package/lib/generated/index.d.ts +33 -4
  3. package/lib/model/Topper.d.ts +1 -0
  4. package/lib/model/Topper.js +6 -1
  5. package/lib/model/Topper.js.map +1 -1
  6. package/lib/resolvers/content-tree/Workarounds.d.ts +2 -2
  7. package/lib/resolvers/content-tree/nodePredicates.d.ts +1 -1
  8. package/lib/resolvers/content-tree/nodePredicates.js +1 -0
  9. package/lib/resolvers/content-tree/nodePredicates.js.map +1 -1
  10. package/lib/resolvers/content-tree/references/RecommendedList.d.ts +5 -0
  11. package/lib/resolvers/content-tree/references/RecommendedList.js +41 -0
  12. package/lib/resolvers/content-tree/references/RecommendedList.js.map +1 -0
  13. package/lib/resolvers/content-tree/references/Reference.d.ts +1 -1
  14. package/lib/resolvers/content-tree/references/index.d.ts +3 -1
  15. package/lib/resolvers/content-tree/references/index.js +3 -0
  16. package/lib/resolvers/content-tree/references/index.js.map +1 -1
  17. package/lib/resolvers/content-tree/tagMappings.js +19 -0
  18. package/lib/resolvers/content-tree/tagMappings.js.map +1 -1
  19. package/lib/resolvers/index.d.ts +4 -0
  20. package/lib/resolvers/teaser.d.ts +1 -0
  21. package/lib/resolvers/teaser.js +1 -0
  22. package/lib/resolvers/teaser.js.map +1 -1
  23. package/lib/resolvers/topper.d.ts +2 -0
  24. package/lib/resolvers/topper.js +4 -2
  25. package/lib/resolvers/topper.js.map +1 -1
  26. package/package.json +2 -2
  27. package/queries/article.graphql +12 -0
  28. package/src/generated/index.ts +35 -4
  29. package/src/model/Topper.ts +7 -1
  30. package/src/resolvers/content-tree/Workarounds.ts +2 -0
  31. package/src/resolvers/content-tree/nodePredicates.ts +1 -0
  32. package/src/resolvers/content-tree/references/RecommendedList.ts +52 -0
  33. package/src/resolvers/content-tree/references/index.ts +5 -0
  34. package/src/resolvers/content-tree/tagMappings.ts +22 -0
  35. package/src/resolvers/teaser.ts +1 -0
  36. package/src/resolvers/topper.ts +4 -2
  37. package/tsconfig.tsbuildinfo +1 -1
  38. package/typedefs/references/recommendedList.graphql +7 -0
  39. package/typedefs/teaser.graphql +3 -0
  40. package/typedefs/topper.graphql +8 -2
@@ -36,14 +36,16 @@ const resolvers = {
36
36
  headshot: (topper, args) => topper.headshot(args),
37
37
  isLargeHeadline: (topper) => topper.isLargeHeadline(),
38
38
  layout: (topper) => topper.layout(),
39
- columnist: (topper) => topper.columnist(),
39
+ columnist: (topper) => topper.columnist(), // @deprecated Replaced with usage of `columinists`
40
+ columnists: (topper) => topper.columnists(),
40
41
  },
41
42
  OpinionTopper: {
42
43
  ...topperResolvers,
43
44
  headshot: (topper, args) => topper.headshot(args),
44
45
  isLargeHeadline: (topper) => topper.isLargeHeadline(),
45
46
  layout: (topper) => topper.layout(),
46
- columnist: (topper) => topper.columnist(),
47
+ columnist: (topper) => topper.columnist(), // @deprecated Replaced with usage of `columinists`
48
+ columnists: (topper) => topper.columnists(),
47
49
  },
48
50
  TopperWithPackage: {
49
51
  design: (topper) => topper.design().theme,
@@ -1 +1 @@
1
- {"version":3,"file":"topper.js","sourceRoot":"","sources":["../../src/resolvers/topper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"topper.js","sourceRoot":"","sources":["../../src/resolvers/topper.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@financial-times/cp-content-pipeline-schema",
3
- "version": "3.16.0",
3
+ "version": "3.18.0",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -22,7 +22,7 @@
22
22
  "@apollo/utils.keyvaluecache": "^1.0.1",
23
23
  "@dotcom-reliability-kit/fetch-error-handler": "^1.1.1",
24
24
  "@dotcom-reliability-kit/serialize-request": "^4.1.0",
25
- "@financial-times/content-tree": "github:financial-times/content-tree#bd083dc",
25
+ "@financial-times/content-tree": "github:financial-times/content-tree#3f77ec4",
26
26
  "@financial-times/n-concept-ids": "^5.0.0",
27
27
  "@financial-times/n-display-metadata": "^4.0.0",
28
28
  "@financial-times/n-scrollytelling-image": "^1.1.0",
@@ -65,6 +65,7 @@ fragment Teaser on Teaser {
65
65
  isScoop
66
66
  isFTEdit
67
67
  }
68
+ clientName
68
69
  }
69
70
 
70
71
  fragment ImageSource on ImageSource {
@@ -198,6 +199,9 @@ fragment Topper on Topper {
198
199
  columnist {
199
200
  ...Concept
200
201
  }
202
+ columnists {
203
+ ...Concept
204
+ }
201
205
  }
202
206
  ... on PodcastTopper {
203
207
  headshot(dpr: 2, width: 160)
@@ -428,6 +432,13 @@ fragment Recommended on Recommended {
428
432
  }
429
433
  }
430
434
 
435
+ fragment RecommendedList on RecommendedList {
436
+ teasers {
437
+ ...Teaser
438
+ }
439
+ }
440
+
441
+
431
442
  fragment Tweet on Tweet {
432
443
  html
433
444
  }
@@ -551,6 +562,7 @@ fragment PinnedPost on Content {
551
562
  fragment ArticleReferences on Reference {
552
563
  type
553
564
  ...Recommended
565
+ ...RecommendedList
554
566
  ...ImageSet
555
567
  ...ClipSet
556
568
  ...CustomCodeComponent
@@ -1318,8 +1318,13 @@ export type OpinionTopper = Topper & TopperWithHeadshot & TopperWithTheme & {
1318
1318
  readonly backgroundBox?: Maybe<Scalars['Boolean']['output']>;
1319
1319
  /** The background colour of the topper. */
1320
1320
  readonly backgroundColour?: Maybe<Scalars['TopperBackgroundColour']['output']>;
1321
- /** The concept object describing details of the column author. */
1321
+ /**
1322
+ * The concept object describing details of the column author.
1323
+ * @deprecated use columnists instead
1324
+ */
1322
1325
  readonly columnist?: Maybe<Concept>;
1326
+ /** The concept object describing details of the column author(s). */
1327
+ readonly columnists?: Maybe<ReadonlyArray<Concept>>;
1323
1328
  /** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
1324
1329
  readonly displayConcept?: Maybe<Concept>;
1325
1330
  /** The variant of the follow button to be displayed on the topper. */
@@ -1549,8 +1554,13 @@ export type PodcastTopper = Topper & TopperWithBrand & TopperWithHeadshot & Topp
1549
1554
  readonly backgroundColour?: Maybe<Scalars['TopperBackgroundColour']['output']>;
1550
1555
  /** The concept object of the brand, eg. {'type': 'BRAND', 'prefLabel': 'FT Magazine', ...}. */
1551
1556
  readonly brandConcept?: Maybe<Concept>;
1552
- /** The concept object describing details of the column author. */
1557
+ /**
1558
+ * The concept object describing details of the column author.
1559
+ * @deprecated use columnists instead
1560
+ */
1553
1561
  readonly columnist?: Maybe<Concept>;
1562
+ /** The concept object describing details of the column author(s). */
1563
+ readonly columnists?: Maybe<ReadonlyArray<Concept>>;
1554
1564
  /** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
1555
1565
  readonly displayConcept?: Maybe<Concept>;
1556
1566
  /** The variant of the follow button to be displayed on the topper. */
@@ -1620,6 +1630,13 @@ export type Recommended = Reference & {
1620
1630
  readonly type: Scalars['String']['output'];
1621
1631
  };
1622
1632
 
1633
+ export type RecommendedList = Reference & {
1634
+ /** Recommended references contain teaser thumbnails of related articles. */
1635
+ readonly teasers: ReadonlyArray<Teaser>;
1636
+ /** The type of the reference, eg. 'recommended'. */
1637
+ readonly type: Scalars['String']['output'];
1638
+ };
1639
+
1623
1640
  export type Reference = {
1624
1641
  /** The type of the reference, eg. 'image-set'. References are additional data that cannot be loaded by content-tree. They will be appended to content-tree nodes during resolution. */
1625
1642
  readonly type: Scalars['String']['output'];
@@ -1690,6 +1707,8 @@ export type TableOfContents = {
1690
1707
  };
1691
1708
 
1692
1709
  export type Teaser = {
1710
+ /** The label to show if sponsored content. */
1711
+ readonly clientName?: Maybe<Scalars['String']['output']>;
1693
1712
  /** The date the content of the teaser was first published. */
1694
1713
  readonly firstPublishedDate: Scalars['String']['output'];
1695
1714
  /** The unique identifier of the teaser, a uuid or a url. */
@@ -1997,7 +2016,7 @@ export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = R
1997
2016
  Content: ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel );
1998
2017
  Image: ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel );
1999
2018
  Picture: ( PictureModel ) | ( PictureModel ) | ( PictureModel );
2000
- Reference: ( ReferenceWithCAPIData<AuthorNode> ) | ( ReferenceWithCAPIData<ClipSetNode|OldClipNode> ) | ( ReferenceWithCAPIData<ContentTree.CustomCodeComponent> ) | ( ReferenceWithCAPIData<ContentTree.Flourish> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<ContentTree.LayoutImage> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<RawImageNode> ) | ( ReferenceWithCAPIData<ContentTree.Recommended> ) | ( ReferenceWithCAPIData<ContentTree.ScrollyImage> ) | ( ReferenceWithCAPIData<ContentTree.Tweet> ) | ( ReferenceWithCAPIData<ContentTree.Video> );
2019
+ Reference: ( ReferenceWithCAPIData<AuthorNode> ) | ( ReferenceWithCAPIData<ClipSetNode|OldClipNode> ) | ( ReferenceWithCAPIData<ContentTree.CustomCodeComponent> ) | ( ReferenceWithCAPIData<ContentTree.Flourish> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<ContentTree.LayoutImage> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<RawImageNode> ) | ( ReferenceWithCAPIData<ContentTree.Recommended> ) | ( ReferenceWithCAPIData<ContentTree.RecommendedList> ) | ( ReferenceWithCAPIData<ContentTree.ScrollyImage> ) | ( ReferenceWithCAPIData<ContentTree.Tweet> ) | ( ReferenceWithCAPIData<ContentTree.Video> );
2001
2020
  Topper: ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel );
2002
2021
  TopperWithBrand: ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel );
2003
2022
  TopperWithHeadshot: ( TopperModel ) | ( TopperModel );
@@ -2085,6 +2104,7 @@ export type ResolversTypes = ResolversObject<{
2085
2104
  Query: ResolverTypeWrapper<{}>;
2086
2105
  RawImage: ResolverTypeWrapper<ReferenceWithCAPIData<RawImageNode>>;
2087
2106
  Recommended: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.Recommended>>;
2107
+ RecommendedList: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.RecommendedList>>;
2088
2108
  Reference: ResolverTypeWrapper<ReferenceWithCAPIData>;
2089
2109
  RichText: ResolverTypeWrapper<RichTextModel>;
2090
2110
  RichTextSource: ResolverTypeWrapper<Scalars['RichTextSource']['output']>;
@@ -2187,6 +2207,7 @@ export type ResolversParentTypes = ResolversObject<{
2187
2207
  Query: {};
2188
2208
  RawImage: ReferenceWithCAPIData<RawImageNode>;
2189
2209
  Recommended: ReferenceWithCAPIData<ContentTree.Recommended>;
2210
+ RecommendedList: ReferenceWithCAPIData<ContentTree.RecommendedList>;
2190
2211
  Reference: ReferenceWithCAPIData;
2191
2212
  RichText: RichTextModel;
2192
2213
  RichTextSource: Scalars['RichTextSource']['output'];
@@ -2902,6 +2923,7 @@ export type OpinionTopperResolvers<ContextType = QueryContext, ParentType extend
2902
2923
  backgroundBox: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2903
2924
  backgroundColour: Resolver<Maybe<ResolversTypes['TopperBackgroundColour']>, ParentType, ContextType>;
2904
2925
  columnist: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2926
+ columnists: Resolver<Maybe<ReadonlyArray<ResolversTypes['Concept']>>, ParentType, ContextType>;
2905
2927
  displayConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2906
2928
  followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
2907
2929
  genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
@@ -3030,6 +3052,7 @@ export type PodcastTopperResolvers<ContextType = QueryContext, ParentType extend
3030
3052
  backgroundColour: Resolver<Maybe<ResolversTypes['TopperBackgroundColour']>, ParentType, ContextType>;
3031
3053
  brandConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
3032
3054
  columnist: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
3055
+ columnists: Resolver<Maybe<ReadonlyArray<ResolversTypes['Concept']>>, ParentType, ContextType>;
3033
3056
  displayConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
3034
3057
  followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
3035
3058
  genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
@@ -3062,8 +3085,14 @@ export type RecommendedResolvers<ContextType = QueryContext, ParentType extends
3062
3085
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
3063
3086
  }>;
3064
3087
 
3088
+ export type RecommendedListResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['RecommendedList'] = ResolversParentTypes['RecommendedList']> = ResolversObject<{
3089
+ teasers: Resolver<ReadonlyArray<ResolversTypes['Teaser']>, ParentType, ContextType>;
3090
+ type: Resolver<ResolversTypes['String'], ParentType, ContextType>;
3091
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
3092
+ }>;
3093
+
3065
3094
  export type ReferenceResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Reference'] = ResolversParentTypes['Reference']> = ResolversObject<{
3066
- __resolveType?: TypeResolveFn<'AuthorReference' | 'ClipSet' | 'CustomCodeComponent' | 'Flourish' | 'ImageSet' | 'LayoutImage' | 'MainImage' | 'RawImage' | 'Recommended' | 'ScrollyImage' | 'Tweet' | 'VideoReference', ParentType, ContextType>;
3095
+ __resolveType?: TypeResolveFn<'AuthorReference' | 'ClipSet' | 'CustomCodeComponent' | 'Flourish' | 'ImageSet' | 'LayoutImage' | 'MainImage' | 'RawImage' | 'Recommended' | 'RecommendedList' | 'ScrollyImage' | 'Tweet' | 'VideoReference', ParentType, ContextType>;
3067
3096
  type: Resolver<ResolversTypes['String'], ParentType, ContextType>;
3068
3097
  }>;
3069
3098
 
@@ -3116,6 +3145,7 @@ export type TableOfContentsResolvers<ContextType = QueryContext, ParentType exte
3116
3145
  }>;
3117
3146
 
3118
3147
  export type TeaserResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Teaser'] = ResolversParentTypes['Teaser']> = ResolversObject<{
3148
+ clientName: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
3119
3149
  firstPublishedDate: Resolver<ResolversTypes['String'], ParentType, ContextType>;
3120
3150
  id: Resolver<ResolversTypes['String'], ParentType, ContextType>;
3121
3151
  image: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
@@ -3323,6 +3353,7 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
3323
3353
  Query: QueryResolvers<ContextType>;
3324
3354
  RawImage: RawImageResolvers<ContextType>;
3325
3355
  Recommended: RecommendedResolvers<ContextType>;
3356
+ RecommendedList: RecommendedListResolvers<ContextType>;
3326
3357
  Reference: ReferenceResolvers<ContextType>;
3327
3358
  RichText: RichTextResolvers<ContextType>;
3328
3359
  RichTextSource: GraphQLScalarType;
@@ -289,14 +289,20 @@ export class Topper {
289
289
  return 'standard'
290
290
  }
291
291
 
292
+ // @deprecated Replaced with usage of `columinists`
292
293
  columnist() {
294
+ const authors = this.columnists()
295
+ return authors?.[0] ?? null
296
+ }
297
+
298
+ columnists() {
293
299
  const authors = this.capiResponse.annotations({
294
300
  byPredicate: predicates.hasAuthor,
295
301
  })
296
302
  const isOpinionOrColumn =
297
303
  this.type() === 'OpinionTopper' || this.capiResponse.isColumn()
298
304
 
299
- return isOpinionOrColumn && authors[0] ? authors[0] : null
305
+ return isOpinionOrColumn && authors.length > 0 ? authors : null
300
306
  }
301
307
 
302
308
  brandConcept() {
@@ -200,6 +200,7 @@ export type BodyBlock =
200
200
  | ContentTree.Tweet
201
201
  | ContentTree.Video
202
202
  | ContentTree.YoutubeVideo
203
+ | ContentTree.RecommendedList
203
204
 
204
205
  export type AnyNode =
205
206
  | ContentTree.Text
@@ -248,3 +249,4 @@ export type AnyNode =
248
249
  | Byline
249
250
  | Author
250
251
  | Cite
252
+ | ContentTree.RecommendedList
@@ -28,6 +28,7 @@ export const bodyBlockTypes = [
28
28
  'thematic-break',
29
29
  'table',
30
30
  'recommended',
31
+ 'recommended-list',
31
32
  'tweet',
32
33
  'video',
33
34
  'youtube-video',
@@ -0,0 +1,52 @@
1
+ import { uuidFromUrl } from '../../../helpers/metadata'
2
+ import { RecommendedListResolvers } from '../../../generated'
3
+ import { OperationalError } from '@dotcom-reliability-kit/errors'
4
+ import { ContentTree } from '@financial-times/content-tree'
5
+ import { Logger } from '@dotcom-reliability-kit/logger'
6
+ import { CapiDataSource } from '../../../datasources/capi'
7
+
8
+ function getTeaser(context: {
9
+ logger: Logger
10
+ dataSources: { capi: CapiDataSource }
11
+ }) {
12
+ return async function (child: ContentTree.Recommended) {
13
+ try {
14
+ let content = await context.dataSources.capi.getContent(
15
+ uuidFromUrl(child.id)
16
+ )
17
+
18
+ if (!content) {
19
+ throw new Error('Invalid content from recommended article teaser')
20
+ }
21
+
22
+ if (child.teaserTitleOverride) {
23
+ content = content.overrideTitle(child.teaserTitleOverride)
24
+ }
25
+ return content
26
+ } catch (error) {
27
+ if (error instanceof Error) {
28
+ context.logger.warn({
29
+ event: 'RECOVERABLE_ERROR',
30
+ error: new OperationalError({
31
+ code: 'RECOMMENDED_TEASER_ERROR',
32
+ message: `Couldn't load teaser for recommended article ${child.id}`,
33
+ cause: error,
34
+ }),
35
+ })
36
+ }
37
+ }
38
+ }
39
+ }
40
+
41
+ export const RecommendedList = {
42
+ async teasers(parent, _args, context) {
43
+ const responses = await Promise.all(
44
+ parent.reference.children.map(getTeaser(context))
45
+ )
46
+
47
+ return responses.filter((response) => response !== undefined)
48
+ },
49
+ type(parent) {
50
+ return parent.reference.type
51
+ },
52
+ } satisfies RecommendedListResolvers
@@ -10,6 +10,7 @@ import { CustomCodeComponent } from './CustomCodeComponent'
10
10
  import { Video } from './Video'
11
11
  import { Flourish, FlourishSource } from './Flourish'
12
12
  import { Recommended } from './Recommended'
13
+ import { RecommendedList } from './RecommendedList'
13
14
  import { LayoutImage } from './LayoutImage'
14
15
  import { RawImage } from './RawImage'
15
16
  import { ScrollyImage } from './ScrollyImage'
@@ -21,6 +22,7 @@ import {
21
22
  LayoutImageResolvers,
22
23
  RawImageResolvers,
23
24
  RecommendedResolvers,
25
+ RecommendedListResolvers,
24
26
  ReferenceResolvers,
25
27
  ScrollyImageResolvers,
26
28
  TweetResolvers,
@@ -48,6 +50,7 @@ export const resolvers: {
48
50
  Flourish: FlourishResolvers
49
51
  FlourishSource: FlourishSourceResolvers
50
52
  Recommended: RecommendedResolvers
53
+ RecommendedList: RecommendedListResolvers
51
54
  LayoutImage: LayoutImageResolvers
52
55
  RawImage: RawImageResolvers
53
56
  ScrollyImage: ScrollyImageResolvers
@@ -65,6 +68,7 @@ export const resolvers: {
65
68
  Flourish,
66
69
  FlourishSource,
67
70
  Recommended,
71
+ RecommendedList,
68
72
  LayoutImage,
69
73
  RawImage,
70
74
  ScrollyImage,
@@ -83,6 +87,7 @@ export const mapNodeToReference = {
83
87
  'custom-code-component': 'CustomCodeComponent',
84
88
  video: 'VideoReference',
85
89
  recommended: 'Recommended',
90
+ 'recommended-list': 'RecommendedList',
86
91
  'layout-image': 'LayoutImage',
87
92
  'scrolly-image': 'ScrollyImage',
88
93
  'raw-image': 'RawImage',
@@ -9,6 +9,7 @@ import {
9
9
  TableChildren,
10
10
  TableColumnSettings,
11
11
  TableFooter,
12
+ Recommended,
12
13
  } from './Workarounds'
13
14
 
14
15
  import {
@@ -303,6 +304,27 @@ const commonTagMappings: TagMappings = {
303
304
  teaserTitleOverride: $firstLink.text(),
304
305
  }
305
306
  },
307
+ 'recommended-list': ($el) => {
308
+ const title = $el.find('recommended-title').first().text()
309
+ const items = $el
310
+ .find('ft-content')
311
+ .toArray()
312
+ .map((item) => {
313
+ const $item = $el.find(item)
314
+
315
+ return {
316
+ id: $item.attr('url') || '',
317
+ type: 'recommended',
318
+ teaserTitleOverride: $item.text(),
319
+ }
320
+ }) as Recommended[]
321
+
322
+ return {
323
+ type: 'recommended-list',
324
+ heading: title || 'Related content',
325
+ children: items,
326
+ }
327
+ },
306
328
  'big-number': ($el) => {
307
329
  const $number = $el.find('big-number-headline').first()
308
330
  const $description = $el.find('big-number-intro').first()
@@ -33,6 +33,7 @@ const resolvers = {
33
33
  publishedDate: (parent) => parent.publishedDate(),
34
34
  theme: (parent) => parent.design().theme,
35
35
  title: (parent) => parent.title(),
36
+ clientName: (parent) => parent.clientName?.(),
36
37
  },
37
38
  TeaserIndicators: {
38
39
  accessLevel: (parent) => parent.accessLevel,
@@ -59,7 +59,8 @@ const resolvers = {
59
59
  headshot: (topper, args) => topper.headshot(args),
60
60
  isLargeHeadline: (topper) => topper.isLargeHeadline(),
61
61
  layout: (topper) => topper.layout(),
62
- columnist: (topper) => topper.columnist(),
62
+ columnist: (topper) => topper.columnist(), // @deprecated Replaced with usage of `columinists`
63
+ columnists: (topper) => topper.columnists(),
63
64
  },
64
65
 
65
66
  OpinionTopper: {
@@ -67,7 +68,8 @@ const resolvers = {
67
68
  headshot: (topper, args) => topper.headshot(args),
68
69
  isLargeHeadline: (topper) => topper.isLargeHeadline(),
69
70
  layout: (topper) => topper.layout(),
70
- columnist: (topper) => topper.columnist(),
71
+ columnist: (topper) => topper.columnist(), // @deprecated Replaced with usage of `columinists`
72
+ columnists: (topper) => topper.columnists(),
71
73
  },
72
74
 
73
75
  TopperWithPackage: {