@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.
- package/CHANGELOG.md +17 -0
- package/lib/generated/index.d.ts +33 -4
- package/lib/model/Topper.d.ts +1 -0
- package/lib/model/Topper.js +6 -1
- package/lib/model/Topper.js.map +1 -1
- package/lib/resolvers/content-tree/Workarounds.d.ts +2 -2
- package/lib/resolvers/content-tree/nodePredicates.d.ts +1 -1
- package/lib/resolvers/content-tree/nodePredicates.js +1 -0
- package/lib/resolvers/content-tree/nodePredicates.js.map +1 -1
- package/lib/resolvers/content-tree/references/RecommendedList.d.ts +5 -0
- package/lib/resolvers/content-tree/references/RecommendedList.js +41 -0
- package/lib/resolvers/content-tree/references/RecommendedList.js.map +1 -0
- package/lib/resolvers/content-tree/references/Reference.d.ts +1 -1
- package/lib/resolvers/content-tree/references/index.d.ts +3 -1
- package/lib/resolvers/content-tree/references/index.js +3 -0
- package/lib/resolvers/content-tree/references/index.js.map +1 -1
- package/lib/resolvers/content-tree/tagMappings.js +19 -0
- package/lib/resolvers/content-tree/tagMappings.js.map +1 -1
- package/lib/resolvers/index.d.ts +4 -0
- package/lib/resolvers/teaser.d.ts +1 -0
- package/lib/resolvers/teaser.js +1 -0
- package/lib/resolvers/teaser.js.map +1 -1
- package/lib/resolvers/topper.d.ts +2 -0
- package/lib/resolvers/topper.js +4 -2
- package/lib/resolvers/topper.js.map +1 -1
- package/package.json +2 -2
- package/queries/article.graphql +12 -0
- package/src/generated/index.ts +35 -4
- package/src/model/Topper.ts +7 -1
- package/src/resolvers/content-tree/Workarounds.ts +2 -0
- package/src/resolvers/content-tree/nodePredicates.ts +1 -0
- package/src/resolvers/content-tree/references/RecommendedList.ts +52 -0
- package/src/resolvers/content-tree/references/index.ts +5 -0
- package/src/resolvers/content-tree/tagMappings.ts +22 -0
- package/src/resolvers/teaser.ts +1 -0
- package/src/resolvers/topper.ts +4 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/typedefs/references/recommendedList.graphql +7 -0
- package/typedefs/teaser.graphql +3 -0
- package/typedefs/topper.graphql +8 -2
package/lib/resolvers/topper.js
CHANGED
|
@@ -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":";;AAmBA,MAAM,eAAe,GAAoB;IACvC,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE;IACjD,gBAAgB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,EAAE;IACvD,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE;IACnD,mBAAmB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,mBAAmB,EAAE;IAC7D,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE;IAC/C,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE;IACvC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;IACjC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE;CAC5C,CAAA;AAED,MAAM,SAAS,GAAG;IAChB,MAAM,EAAE;QACN,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;QACxC,GAAG,eAAe;KACnB;IAED,gBAAgB,EAAE;QAChB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE;KAClD;IAED,eAAe,EAAE;QACf,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE;QACrD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;KACpC;IAED,eAAe,EAAE;QACf,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE;QAC/C,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE;KAChD;IAED,kBAAkB,EAAE;QAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;KAClD;IAED,aAAa,EAAE;QACb,GAAG,eAAe;QAClB,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE;QAC/C,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjD,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE;QACrD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE;
|
|
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.
|
|
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#
|
|
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",
|
package/queries/article.graphql
CHANGED
|
@@ -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
|
package/src/generated/index.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
-
/**
|
|
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;
|
package/src/model/Topper.ts
CHANGED
|
@@ -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
|
|
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
|
|
@@ -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()
|
package/src/resolvers/teaser.ts
CHANGED
|
@@ -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,
|
package/src/resolvers/topper.ts
CHANGED
|
@@ -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: {
|