@financial-times/cp-content-pipeline-schema 3.22.0 → 3.23.1
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 +14 -0
- package/lib/generated/index.d.ts +28 -2
- package/lib/model/Image.d.ts +4 -1
- package/lib/model/Image.js +3 -1
- package/lib/model/Image.js.map +1 -1
- package/lib/model/Topper.d.ts +7 -6
- package/lib/model/Topper.js +38 -18
- package/lib/model/Topper.js.map +1 -1
- package/lib/model/strategies/topper/PodcastStrategy.d.ts +13 -0
- package/lib/model/strategies/topper/PodcastStrategy.js +29 -0
- package/lib/model/strategies/topper/PodcastStrategy.js.map +1 -0
- package/lib/model/strategies/topper/PodcastStrategy.test.d.ts +1 -0
- package/lib/model/strategies/topper/PodcastStrategy.test.js +183 -0
- package/lib/model/strategies/topper/PodcastStrategy.test.js.map +1 -0
- package/lib/model/strategies/topper/TopperStrategy.d.ts +18 -0
- package/lib/model/strategies/topper/TopperStrategy.js +3 -0
- package/lib/model/strategies/topper/TopperStrategy.js.map +1 -0
- package/lib/model/strategies/topper/TopperStrategy.test.d.ts +1 -0
- package/lib/model/strategies/topper/TopperStrategy.test.js +103 -0
- package/lib/model/strategies/topper/TopperStrategy.test.js.map +1 -0
- 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/tagMappings.js +25 -0
- package/lib/resolvers/content-tree/tagMappings.js.map +1 -1
- package/lib/resolvers/index.d.ts +4 -0
- package/lib/resolvers/topper.d.ts +4 -0
- package/lib/resolvers/topper.js +5 -1
- package/lib/resolvers/topper.js.map +1 -1
- package/package.json +3 -3
- package/queries/article.graphql +1 -0
- package/src/generated/index.ts +34 -2
- package/src/model/Image.ts +3 -1
- package/src/model/Topper.ts +53 -30
- package/src/model/strategies/topper/PodcastStrategy.test.ts +215 -0
- package/src/model/strategies/topper/PodcastStrategy.ts +39 -0
- package/src/model/strategies/topper/README.md +11 -0
- package/src/model/strategies/topper/TopperStrategy.test.ts +124 -0
- package/src/model/strategies/topper/TopperStrategy.ts +36 -0
- package/src/resolvers/content-tree/Workarounds.ts +3 -0
- package/src/resolvers/content-tree/nodePredicates.ts +1 -0
- package/src/resolvers/content-tree/tagMappings.ts +36 -0
- package/src/resolvers/topper.ts +8 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/typedefs/topper.graphql +10 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.23.1](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v3.23.0...cp-content-pipeline-schema-v3.23.1) (2026-01-09)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* enable cover image for podcast while introducing strategy pattern ([2f8a242](https://github.com/Financial-Times/cp-content-pipeline/commit/2f8a242ef2e68698449618e70a23a2faec9320b7))
|
|
9
|
+
|
|
10
|
+
## [3.23.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v3.22.0...cp-content-pipeline-schema-v3.23.0) (2026-01-08)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* in numbers component ([729021c](https://github.com/Financial-Times/cp-content-pipeline/commit/729021c08965f313163c3c092d40db6233352ba5))
|
|
16
|
+
|
|
3
17
|
## [3.22.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v3.21.0...cp-content-pipeline-schema-v3.22.0) (2025-12-16)
|
|
4
18
|
|
|
5
19
|
|
package/lib/generated/index.d.ts
CHANGED
|
@@ -1488,7 +1488,7 @@ export type PlaceholderUrlArgs = {
|
|
|
1488
1488
|
relative?: InputMaybe<Scalars['Boolean']['input']>;
|
|
1489
1489
|
vanity?: InputMaybe<Scalars['Boolean']['input']>;
|
|
1490
1490
|
};
|
|
1491
|
-
export type PodcastTopper = Topper & TopperWithBrand & TopperWithHeadshot & TopperWithTheme & {
|
|
1491
|
+
export type PodcastTopper = Topper & TopperWithBrand & TopperWithCoverImage & TopperWithHeadshot & TopperWithTheme & {
|
|
1492
1492
|
/** Whether the topper should have a background box. */
|
|
1493
1493
|
readonly backgroundBox?: Maybe<Scalars['Boolean']['output']>;
|
|
1494
1494
|
/** The background colour of the topper. */
|
|
@@ -1502,6 +1502,8 @@ export type PodcastTopper = Topper & TopperWithBrand & TopperWithHeadshot & Topp
|
|
|
1502
1502
|
readonly columnist?: Maybe<Concept>;
|
|
1503
1503
|
/** The concept object describing details of the column author(s). */
|
|
1504
1504
|
readonly columnists?: Maybe<ReadonlyArray<Concept>>;
|
|
1505
|
+
/** The url of the cover image. */
|
|
1506
|
+
readonly coverImage?: Maybe<Scalars['String']['output']>;
|
|
1505
1507
|
/** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
|
|
1506
1508
|
readonly displayConcept?: Maybe<Concept>;
|
|
1507
1509
|
/** The variant of the follow button to be displayed on the topper. */
|
|
@@ -1510,7 +1512,10 @@ export type PodcastTopper = Topper & TopperWithBrand & TopperWithHeadshot & Topp
|
|
|
1510
1512
|
readonly genreConcept?: Maybe<Concept>;
|
|
1511
1513
|
/** The headline text of the topper. */
|
|
1512
1514
|
readonly headline: Scalars['String']['output'];
|
|
1513
|
-
/**
|
|
1515
|
+
/**
|
|
1516
|
+
* The url of the headshot image, eg. for columns with one key author.
|
|
1517
|
+
* @deprecated replaced by coverImage
|
|
1518
|
+
*/
|
|
1514
1519
|
readonly headshot?: Maybe<Scalars['String']['output']>;
|
|
1515
1520
|
/** An abstract syntax tree of the introduction text. */
|
|
1516
1521
|
readonly intro?: Maybe<RichText>;
|
|
@@ -1521,6 +1526,10 @@ export type PodcastTopper = Topper & TopperWithBrand & TopperWithHeadshot & Topp
|
|
|
1521
1526
|
/** Whether the topper should have a text shadow. */
|
|
1522
1527
|
readonly textShadow?: Maybe<Scalars['Boolean']['output']>;
|
|
1523
1528
|
};
|
|
1529
|
+
export type PodcastTopperCoverImageArgs = {
|
|
1530
|
+
dpr?: InputMaybe<Scalars['Int']['input']>;
|
|
1531
|
+
width?: InputMaybe<Scalars['Int']['input']>;
|
|
1532
|
+
};
|
|
1524
1533
|
export type PodcastTopperHeadshotArgs = {
|
|
1525
1534
|
dpr?: InputMaybe<Scalars['Int']['input']>;
|
|
1526
1535
|
url?: InputMaybe<Scalars['String']['input']>;
|
|
@@ -1706,6 +1715,14 @@ export type TopperWithBrand = {
|
|
|
1706
1715
|
/** The concept object of the genre, eg. {'type': 'GENRE', 'prefLabel': 'Opinion', ...}. */
|
|
1707
1716
|
readonly genreConcept?: Maybe<Concept>;
|
|
1708
1717
|
};
|
|
1718
|
+
export type TopperWithCoverImage = {
|
|
1719
|
+
/** The url of the cover image. */
|
|
1720
|
+
readonly coverImage?: Maybe<Scalars['String']['output']>;
|
|
1721
|
+
};
|
|
1722
|
+
export type TopperWithCoverImageCoverImageArgs = {
|
|
1723
|
+
dpr?: InputMaybe<Scalars['Int']['input']>;
|
|
1724
|
+
width?: InputMaybe<Scalars['Int']['input']>;
|
|
1725
|
+
};
|
|
1709
1726
|
export type TopperWithFlourish = Topper & TopperWithTheme & {
|
|
1710
1727
|
/** Whether the topper should have a background box. */
|
|
1711
1728
|
readonly backgroundBox?: Maybe<Scalars['Boolean']['output']>;
|
|
@@ -1878,6 +1895,7 @@ export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = R
|
|
|
1878
1895
|
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>);
|
|
1879
1896
|
Topper: (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel);
|
|
1880
1897
|
TopperWithBrand: (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel);
|
|
1898
|
+
TopperWithCoverImage: (TopperModel);
|
|
1881
1899
|
TopperWithHeadshot: (TopperModel) | (TopperModel);
|
|
1882
1900
|
TopperWithImages: (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel) | (TopperModel);
|
|
1883
1901
|
TopperWithPackage: (TopperModel);
|
|
@@ -1984,6 +2002,7 @@ export type ResolversTypes = ResolversObject<{
|
|
|
1984
2002
|
Topper: ResolverTypeWrapper<TopperModel>;
|
|
1985
2003
|
TopperBackgroundColour: ResolverTypeWrapper<Scalars['TopperBackgroundColour']['output']>;
|
|
1986
2004
|
TopperWithBrand: ResolverTypeWrapper<TopperModel>;
|
|
2005
|
+
TopperWithCoverImage: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['TopperWithCoverImage']>;
|
|
1987
2006
|
TopperWithFlourish: ResolverTypeWrapper<TopperModel>;
|
|
1988
2007
|
TopperWithHeadshot: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['TopperWithHeadshot']>;
|
|
1989
2008
|
TopperWithImages: ResolverTypeWrapper<TopperModel>;
|
|
@@ -2094,6 +2113,7 @@ export type ResolversParentTypes = ResolversObject<{
|
|
|
2094
2113
|
Topper: TopperModel;
|
|
2095
2114
|
TopperBackgroundColour: Scalars['TopperBackgroundColour']['output'];
|
|
2096
2115
|
TopperWithBrand: TopperModel;
|
|
2116
|
+
TopperWithCoverImage: ResolversInterfaceTypes<ResolversParentTypes>['TopperWithCoverImage'];
|
|
2097
2117
|
TopperWithFlourish: TopperModel;
|
|
2098
2118
|
TopperWithHeadshot: ResolversInterfaceTypes<ResolversParentTypes>['TopperWithHeadshot'];
|
|
2099
2119
|
TopperWithImages: TopperModel;
|
|
@@ -2859,6 +2879,7 @@ export type PodcastTopperResolvers<ContextType = QueryContext, ParentType extend
|
|
|
2859
2879
|
brandConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
|
|
2860
2880
|
columnist: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
|
|
2861
2881
|
columnists: Resolver<Maybe<ReadonlyArray<ResolversTypes['Concept']>>, ParentType, ContextType>;
|
|
2882
|
+
coverImage: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, Partial<PodcastTopperCoverImageArgs>>;
|
|
2862
2883
|
displayConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
|
|
2863
2884
|
followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
|
|
2864
2885
|
genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
|
|
@@ -2986,6 +3007,10 @@ export type TopperWithBrandResolvers<ContextType = QueryContext, ParentType exte
|
|
|
2986
3007
|
brandConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
|
|
2987
3008
|
genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
|
|
2988
3009
|
}>;
|
|
3010
|
+
export type TopperWithCoverImageResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['TopperWithCoverImage'] = ResolversParentTypes['TopperWithCoverImage']> = ResolversObject<{
|
|
3011
|
+
__resolveType?: TypeResolveFn<'PodcastTopper', ParentType, ContextType>;
|
|
3012
|
+
coverImage: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, Partial<TopperWithCoverImageCoverImageArgs>>;
|
|
3013
|
+
}>;
|
|
2989
3014
|
export type TopperWithFlourishResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['TopperWithFlourish'] = ResolversParentTypes['TopperWithFlourish']> = ResolversObject<{
|
|
2990
3015
|
backgroundBox: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
|
|
2991
3016
|
backgroundColour: Resolver<Maybe<ResolversTypes['TopperBackgroundColour']>, ParentType, ContextType>;
|
|
@@ -3147,6 +3172,7 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
|
|
|
3147
3172
|
Topper: TopperResolvers<ContextType>;
|
|
3148
3173
|
TopperBackgroundColour: GraphQLScalarType;
|
|
3149
3174
|
TopperWithBrand: TopperWithBrandResolvers<ContextType>;
|
|
3175
|
+
TopperWithCoverImage: TopperWithCoverImageResolvers<ContextType>;
|
|
3150
3176
|
TopperWithFlourish: TopperWithFlourishResolvers<ContextType>;
|
|
3151
3177
|
TopperWithHeadshot: TopperWithHeadshotResolvers<ContextType>;
|
|
3152
3178
|
TopperWithImages: TopperWithImagesResolvers<ContextType>;
|
package/lib/model/Image.d.ts
CHANGED
package/lib/model/Image.js
CHANGED
|
@@ -98,10 +98,12 @@ class CAPIImage {
|
|
|
98
98
|
dpr,
|
|
99
99
|
}));
|
|
100
100
|
}
|
|
101
|
-
url() {
|
|
101
|
+
url(args) {
|
|
102
102
|
return (0, imageService_1.default)({
|
|
103
103
|
url: this.capiImage.binaryUrl,
|
|
104
104
|
systemCode: this.#systemCode,
|
|
105
|
+
width: args?.width,
|
|
106
|
+
dpr: args?.dpr,
|
|
105
107
|
});
|
|
106
108
|
}
|
|
107
109
|
async dimensions() {
|
package/lib/model/Image.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../../src/model/Image.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../../src/model/Image.ts"],"names":[],"mappings":"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"}
|
package/lib/model/Topper.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { Content } from './Content';
|
|
2
2
|
import { CAPIImage } from './Image';
|
|
3
3
|
import type { QueryContext } from '..';
|
|
4
|
-
import {
|
|
5
|
-
import { TopperBackgroundColour } from '../resolvers/scalars';
|
|
4
|
+
import type { TopperBackgroundColourValues, FollowButtonVariant } from './strategies/topper/TopperStrategy';
|
|
6
5
|
import { RichText } from './RichText';
|
|
7
6
|
import { LeadFlourish } from './LeadFlourish';
|
|
8
|
-
import type { TopperWithHeadshotHeadshotArgs } from '../generated';
|
|
7
|
+
import type { TopperWithHeadshotHeadshotArgs, TopperWithCoverImageCoverImageArgs } from '../generated';
|
|
9
8
|
type TopperType = 'DeepPortraitTopper' | 'DeepLandscapeTopper' | 'SplitTextTopper' | 'FullBleedTopper' | 'PodcastTopper' | 'OpinionTopper' | 'BrandedTopper' | 'BasicTopper' | 'TopperWithFlourish' | 'PartnerContentTopper';
|
|
10
|
-
type TopperBackgroundColourValues = LiteralUnionScalarValues<typeof TopperBackgroundColour>;
|
|
11
9
|
export declare class Topper {
|
|
12
10
|
#private;
|
|
13
11
|
private capiResponse;
|
|
14
12
|
private context;
|
|
15
13
|
constructor(capiResponse: Content, context: QueryContext);
|
|
14
|
+
private createStrategy;
|
|
15
|
+
private get strategy();
|
|
16
16
|
intro(): RichText;
|
|
17
17
|
headline(): string;
|
|
18
18
|
type(): TopperType;
|
|
@@ -26,16 +26,17 @@ export declare class Topper {
|
|
|
26
26
|
backgroundBox(): boolean | null;
|
|
27
27
|
textShadow(): boolean | null;
|
|
28
28
|
displayConcept(): import("./Concept").Concept | null;
|
|
29
|
-
followButtonVariant():
|
|
29
|
+
followButtonVariant(): FollowButtonVariant;
|
|
30
30
|
columnist(): import("./Concept").Concept | null;
|
|
31
31
|
columnists(): import("./Concept").Concept[] | null;
|
|
32
32
|
brandConcept(): import("./Concept").Concept | null;
|
|
33
33
|
genreConcept(): import("./Concept").Concept | null;
|
|
34
34
|
design(): {
|
|
35
|
-
theme: LiteralUnionScalarValues<typeof import("../resolvers/scalars").PackageDesign>;
|
|
35
|
+
theme: import("../resolvers/literal-union").LiteralUnionScalarValues<typeof import("../resolvers/scalars").PackageDesign>;
|
|
36
36
|
layout?: "default" | "wide";
|
|
37
37
|
};
|
|
38
38
|
imageService(args: TopperWithHeadshotHeadshotArgs): string | null;
|
|
39
39
|
headshot(args: TopperWithHeadshotHeadshotArgs): Promise<string | null>;
|
|
40
|
+
coverImage(args: TopperWithCoverImageCoverImageArgs): Promise<string | null>;
|
|
40
41
|
}
|
|
41
42
|
export {};
|
package/lib/model/Topper.js
CHANGED
|
@@ -13,6 +13,7 @@ const LeadFlourish_1 = require("./LeadFlourish");
|
|
|
13
13
|
const Concept_1 = require("./Concept");
|
|
14
14
|
const errors_1 = require("@dotcom-reliability-kit/errors");
|
|
15
15
|
const isError_1 = __importDefault(require("../helpers/isError"));
|
|
16
|
+
const PodcastStrategy_1 = require("./strategies/topper/PodcastStrategy");
|
|
16
17
|
function isDarkBackground(backgroundColour) {
|
|
17
18
|
const darkColours = [
|
|
18
19
|
'black',
|
|
@@ -23,14 +24,33 @@ function isDarkBackground(backgroundColour) {
|
|
|
23
24
|
];
|
|
24
25
|
return darkColours.includes(backgroundColour);
|
|
25
26
|
}
|
|
27
|
+
/*
|
|
28
|
+
Class representing a Topper for content, providing methods to access its properties.
|
|
29
|
+
It uses strategies to handle different topper types.
|
|
30
|
+
It returns a consistent interface for accessing topper-related data.
|
|
31
|
+
Strategies may override certain methods otherwise default values will be returned.
|
|
32
|
+
*/
|
|
26
33
|
class Topper {
|
|
27
34
|
capiResponse;
|
|
28
35
|
context;
|
|
29
36
|
#systemCode;
|
|
37
|
+
#strategy = {};
|
|
30
38
|
constructor(capiResponse, context) {
|
|
31
39
|
this.capiResponse = capiResponse;
|
|
32
40
|
this.context = context;
|
|
33
41
|
this.#systemCode = context.systemCode;
|
|
42
|
+
this.#strategy = this.createStrategy() ?? {};
|
|
43
|
+
}
|
|
44
|
+
createStrategy() {
|
|
45
|
+
switch (this.type()) {
|
|
46
|
+
case 'PodcastTopper':
|
|
47
|
+
return new PodcastStrategy_1.PodcastTopperStrategy(this.capiResponse);
|
|
48
|
+
default:
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
get strategy() {
|
|
53
|
+
return this.#strategy;
|
|
34
54
|
}
|
|
35
55
|
intro() {
|
|
36
56
|
const summary = this.capiResponse.summary();
|
|
@@ -128,6 +148,9 @@ class Topper {
|
|
|
128
148
|
}
|
|
129
149
|
}
|
|
130
150
|
const type = this.type();
|
|
151
|
+
const strategy = this.strategy.backgroundColour?.();
|
|
152
|
+
if (strategy !== undefined)
|
|
153
|
+
return strategy;
|
|
131
154
|
if (this.capiResponse.isCentralBanking()) {
|
|
132
155
|
return 'slate';
|
|
133
156
|
}
|
|
@@ -137,9 +160,6 @@ class Topper {
|
|
|
137
160
|
if (this.capiResponse.isAlphaville()) {
|
|
138
161
|
return 'matisse';
|
|
139
162
|
}
|
|
140
|
-
if (type === 'PodcastTopper') {
|
|
141
|
-
return 'slate';
|
|
142
|
-
}
|
|
143
163
|
if (type === 'BrandedTopper') {
|
|
144
164
|
return 'wheat';
|
|
145
165
|
}
|
|
@@ -170,9 +190,9 @@ class Topper {
|
|
|
170
190
|
return this.capiResponse.topper()?.textShadow ?? null;
|
|
171
191
|
}
|
|
172
192
|
displayConcept() {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
193
|
+
const strategy = this.strategy.displayConcept?.();
|
|
194
|
+
if (strategy !== undefined)
|
|
195
|
+
return strategy;
|
|
176
196
|
if (this.capiResponse.type() === 'ContentPackage' ||
|
|
177
197
|
this.capiResponse.isCentralBanking()) {
|
|
178
198
|
return null;
|
|
@@ -192,9 +212,9 @@ class Topper {
|
|
|
192
212
|
return aboutAnnotation ?? null;
|
|
193
213
|
}
|
|
194
214
|
followButtonVariant() {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
215
|
+
const strategy = this.strategy.followButtonVariant?.();
|
|
216
|
+
if (strategy !== undefined)
|
|
217
|
+
return strategy;
|
|
198
218
|
if (this.type() === 'OpinionTopper') {
|
|
199
219
|
if (this.backgroundColour() === 'sky') {
|
|
200
220
|
return 'opinion';
|
|
@@ -227,9 +247,9 @@ class Topper {
|
|
|
227
247
|
return isOpinionOrColumn && authors.length > 0 ? authors : null;
|
|
228
248
|
}
|
|
229
249
|
brandConcept() {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
250
|
+
const strategy = this.strategy.brandConcept?.();
|
|
251
|
+
if (strategy !== undefined)
|
|
252
|
+
return strategy;
|
|
233
253
|
if (this.capiResponse.type() === 'ContentPackage') {
|
|
234
254
|
return this.capiResponse.getPackageBrandConcept() ?? null;
|
|
235
255
|
}
|
|
@@ -255,12 +275,6 @@ class Topper {
|
|
|
255
275
|
return null;
|
|
256
276
|
}
|
|
257
277
|
async headshot(args) {
|
|
258
|
-
if (this.capiResponse.isPodcast()) {
|
|
259
|
-
return this.imageService({
|
|
260
|
-
...args,
|
|
261
|
-
url: this.capiResponse.mainImage()?.url(),
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
278
|
if (this.capiResponse.isOpinion()) {
|
|
265
279
|
try {
|
|
266
280
|
const primaryAuthor = await this.capiResponse.primaryAuthor();
|
|
@@ -282,6 +296,12 @@ class Topper {
|
|
|
282
296
|
}
|
|
283
297
|
return null;
|
|
284
298
|
}
|
|
299
|
+
async coverImage(args) {
|
|
300
|
+
const strategy = this.strategy.coverImage?.(args);
|
|
301
|
+
if (strategy !== undefined)
|
|
302
|
+
return strategy;
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
285
305
|
}
|
|
286
306
|
exports.Topper = Topper;
|
|
287
307
|
//# sourceMappingURL=Topper.js.map
|
package/lib/model/Topper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Topper.js","sourceRoot":"","sources":["../../src/model/Topper.ts"],"names":[],"mappings":";;;;;;AACA,mCAAmC;AAEnC,
|
|
1
|
+
{"version":3,"file":"Topper.js","sourceRoot":"","sources":["../../src/model/Topper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Content } from '../../Content';
|
|
2
|
+
import type { TopperStrategy, FollowButtonVariant, TopperBackgroundColourValues } from './TopperStrategy';
|
|
3
|
+
import type { TopperWithCoverImageCoverImageArgs } from '../../../generated';
|
|
4
|
+
import type { Concept } from '../../Concept';
|
|
5
|
+
export declare class PodcastTopperStrategy implements TopperStrategy {
|
|
6
|
+
private capiResponse;
|
|
7
|
+
constructor(capiResponse: Content);
|
|
8
|
+
backgroundColour(): TopperBackgroundColourValues;
|
|
9
|
+
displayConcept(): Concept | null;
|
|
10
|
+
brandConcept(): Concept | null;
|
|
11
|
+
followButtonVariant(): FollowButtonVariant;
|
|
12
|
+
coverImage(args: TopperWithCoverImageCoverImageArgs): Promise<string | null>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PodcastTopperStrategy = void 0;
|
|
4
|
+
class PodcastTopperStrategy {
|
|
5
|
+
capiResponse;
|
|
6
|
+
constructor(capiResponse) {
|
|
7
|
+
this.capiResponse = capiResponse;
|
|
8
|
+
}
|
|
9
|
+
backgroundColour() {
|
|
10
|
+
return 'slate';
|
|
11
|
+
}
|
|
12
|
+
displayConcept() {
|
|
13
|
+
return this.capiResponse.getPodcastDisplayConcept() ?? null;
|
|
14
|
+
}
|
|
15
|
+
brandConcept() {
|
|
16
|
+
return this.capiResponse.getPodcastBrandConcept() ?? null;
|
|
17
|
+
}
|
|
18
|
+
followButtonVariant() {
|
|
19
|
+
return 'inverse';
|
|
20
|
+
}
|
|
21
|
+
async coverImage(args) {
|
|
22
|
+
return (this.capiResponse
|
|
23
|
+
.mainImage()
|
|
24
|
+
?.url({ width: args.width || undefined, dpr: args.dpr || undefined }) ||
|
|
25
|
+
null);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.PodcastTopperStrategy = PodcastTopperStrategy;
|
|
29
|
+
//# sourceMappingURL=PodcastStrategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PodcastStrategy.js","sourceRoot":"","sources":["../../../../src/model/strategies/topper/PodcastStrategy.ts"],"names":[],"mappings":";;;AASA,MAAa,qBAAqB;IACZ;IAApB,YAAoB,YAAqB;QAArB,iBAAY,GAAZ,YAAY,CAAS;IAAG,CAAC;IAE7C,gBAAgB;QACd,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,wBAAwB,EAAE,IAAI,IAAI,CAAA;IAC7D,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAA;IAC3D,CAAC;IAED,mBAAmB;QACjB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,UAAU,CACd,IAAwC;QAExC,OAAO,CACL,IAAI,CAAC,YAAY;aACd,SAAS,EAAE;YACZ,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;YACvE,IAAI,CACL,CAAA;IACH,CAAC;CACF;AA7BD,sDA6BC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const Topper_1 = require("../../Topper");
|
|
7
|
+
const Content_1 = require("../../Content");
|
|
8
|
+
const capiObject_1 = require("../../../fixtures/capiObject");
|
|
9
|
+
const dummyContext_1 = __importDefault(require("../../../fixtures/dummyContext"));
|
|
10
|
+
const clone_deep_1 = __importDefault(require("clone-deep"));
|
|
11
|
+
describe('Podcast topper', () => {
|
|
12
|
+
const createPodcastContent = (overrides = {}) => {
|
|
13
|
+
const podcastCapiObject = (0, clone_deep_1.default)({
|
|
14
|
+
...capiObject_1.baseCapiObject,
|
|
15
|
+
types: ['http://www.ft.com/ontology/content/Audio'],
|
|
16
|
+
...overrides,
|
|
17
|
+
});
|
|
18
|
+
return new Content_1.Content(podcastCapiObject, dummyContext_1.default);
|
|
19
|
+
};
|
|
20
|
+
describe('type()', () => {
|
|
21
|
+
test('returns PodcastTopper when content is podcast and has no specific topper layout', () => {
|
|
22
|
+
const podcastContent = createPodcastContent();
|
|
23
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
24
|
+
expect(topper.type()).toBe('PodcastTopper');
|
|
25
|
+
});
|
|
26
|
+
test('returns layout-specific topper type even for podcast content when topper layout is specified', () => {
|
|
27
|
+
const podcastContent = createPodcastContent({
|
|
28
|
+
topper: {
|
|
29
|
+
layout: 'deep-portrait',
|
|
30
|
+
headline: 'Podcast headline',
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
34
|
+
// Layout-based types take precedence over isPodcast() check
|
|
35
|
+
expect(topper.type()).toBe('DeepPortraitTopper');
|
|
36
|
+
});
|
|
37
|
+
test('returns PodcastTopper when content is podcast and has non-matching layout', () => {
|
|
38
|
+
const podcastContent = createPodcastContent({
|
|
39
|
+
topper: {
|
|
40
|
+
layout: 'branded',
|
|
41
|
+
headline: 'Podcast headline',
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
45
|
+
expect(topper.type()).toBe('PodcastTopper');
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('backgroundColour()', () => {
|
|
49
|
+
test('returns slate for podcast topper', () => {
|
|
50
|
+
const podcastContent = createPodcastContent();
|
|
51
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
52
|
+
expect(topper.backgroundColour()).toBe('slate');
|
|
53
|
+
});
|
|
54
|
+
test('returns slate even when topper has different background colour specified', () => {
|
|
55
|
+
const podcastContent = createPodcastContent({
|
|
56
|
+
topper: {
|
|
57
|
+
backgroundColour: 'blue',
|
|
58
|
+
headline: 'Podcast headline',
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
62
|
+
expect(topper.backgroundColour()).toBe('slate');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('displayConcept()', () => {
|
|
66
|
+
test('calls getPodcastDisplayConcept for podcast content', () => {
|
|
67
|
+
const podcastContent = createPodcastContent();
|
|
68
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
69
|
+
jest
|
|
70
|
+
.spyOn(podcastContent, 'getPodcastDisplayConcept')
|
|
71
|
+
.mockReturnValue(undefined);
|
|
72
|
+
topper.displayConcept();
|
|
73
|
+
expect(podcastContent.getPodcastDisplayConcept).toHaveBeenCalled();
|
|
74
|
+
});
|
|
75
|
+
test('returns null when no podcast display concept is available', () => {
|
|
76
|
+
const podcastContent = createPodcastContent();
|
|
77
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
78
|
+
jest
|
|
79
|
+
.spyOn(podcastContent, 'getPodcastDisplayConcept')
|
|
80
|
+
.mockReturnValue(undefined);
|
|
81
|
+
expect(topper.displayConcept()).toBe(null);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('followButtonVariant()', () => {
|
|
85
|
+
test('returns inverse for podcast topper', () => {
|
|
86
|
+
const podcastContent = createPodcastContent();
|
|
87
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
88
|
+
expect(topper.followButtonVariant()).toBe('inverse');
|
|
89
|
+
});
|
|
90
|
+
test('returns inverse regardless of background colour', () => {
|
|
91
|
+
const podcastContent = createPodcastContent({
|
|
92
|
+
topper: {
|
|
93
|
+
backgroundColour: 'white',
|
|
94
|
+
headline: 'Podcast headline',
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
98
|
+
expect(topper.followButtonVariant()).toBe('inverse');
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('brandConcept()', () => {
|
|
102
|
+
test('calls getPodcastBrandConcept for podcast content', () => {
|
|
103
|
+
const podcastContent = createPodcastContent();
|
|
104
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
105
|
+
jest
|
|
106
|
+
.spyOn(podcastContent, 'getPodcastBrandConcept')
|
|
107
|
+
.mockReturnValue(undefined);
|
|
108
|
+
topper.brandConcept();
|
|
109
|
+
expect(podcastContent.getPodcastBrandConcept).toHaveBeenCalled();
|
|
110
|
+
});
|
|
111
|
+
test('returns null when no podcast brand concept is available', () => {
|
|
112
|
+
const podcastContent = createPodcastContent();
|
|
113
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
114
|
+
jest
|
|
115
|
+
.spyOn(podcastContent, 'getPodcastBrandConcept')
|
|
116
|
+
.mockReturnValue(undefined);
|
|
117
|
+
expect(topper.brandConcept()).toBe(null);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('integration with other methods', () => {
|
|
121
|
+
test('podcast topper behavior takes precedence over other content types in specific methods', () => {
|
|
122
|
+
// Create content that would normally be opinion but is also a podcast
|
|
123
|
+
const podcastOpinionContent = createPodcastContent({
|
|
124
|
+
annotations: [
|
|
125
|
+
{
|
|
126
|
+
id: 'http://api.ft.com/things/author-1',
|
|
127
|
+
predicate: 'http://www.ft.com/ontology/annotation/hasAuthor',
|
|
128
|
+
prefLabel: 'Opinion Author',
|
|
129
|
+
directType: 'http://www.ft.com/ontology/Person',
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
});
|
|
133
|
+
jest.spyOn(podcastOpinionContent, 'isOpinion').mockReturnValue(true);
|
|
134
|
+
const topper = new Topper_1.Topper(podcastOpinionContent, dummyContext_1.default);
|
|
135
|
+
// Should still be PodcastTopper, not OpinionTopper (because isPodcast comes before isOpinion in type())
|
|
136
|
+
expect(topper.type()).toBe('PodcastTopper');
|
|
137
|
+
expect(topper.backgroundColour()).toBe('slate');
|
|
138
|
+
expect(topper.followButtonVariant()).toBe('inverse');
|
|
139
|
+
});
|
|
140
|
+
describe('podcast topper behavior works with various topper layouts', () => {
|
|
141
|
+
// Test with layouts that DON'T override podcast behavior
|
|
142
|
+
const nonOverridingLayouts = ['branded', 'basic'];
|
|
143
|
+
nonOverridingLayouts.forEach((layout) => {
|
|
144
|
+
const podcastContent = createPodcastContent({
|
|
145
|
+
topper: {
|
|
146
|
+
layout,
|
|
147
|
+
headline: 'Podcast headline',
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
151
|
+
test(`layout: ${layout}`, () => {
|
|
152
|
+
// These should still be PodcastTopper because layout does not override podcast behavior
|
|
153
|
+
expect(topper.type()).toBe('PodcastTopper');
|
|
154
|
+
expect(topper.backgroundColour()).toBe('slate');
|
|
155
|
+
expect(topper.followButtonVariant()).toBe('inverse');
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe('podcast topper is overriden by some layouts', () => {
|
|
160
|
+
// Test with layouts that DO override podcast behavior
|
|
161
|
+
const overridingLayouts = [
|
|
162
|
+
'deep-portrait',
|
|
163
|
+
'deep-landscape',
|
|
164
|
+
'split',
|
|
165
|
+
'full-bleed',
|
|
166
|
+
];
|
|
167
|
+
overridingLayouts.forEach((layout) => {
|
|
168
|
+
test(`layout: ${layout}`, () => {
|
|
169
|
+
const podcastContent = createPodcastContent({
|
|
170
|
+
topper: {
|
|
171
|
+
layout,
|
|
172
|
+
headline: 'Podcast headline',
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
const topper = new Topper_1.Topper(podcastContent, dummyContext_1.default);
|
|
176
|
+
// These should NOT be PodcastTopper because layout takes precedence
|
|
177
|
+
expect(topper.type()).not.toBe('PodcastTopper');
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
//# sourceMappingURL=PodcastStrategy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PodcastStrategy.test.js","sourceRoot":"","sources":["../../../../src/model/strategies/topper/PodcastStrategy.test.ts"],"names":[],"mappings":"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"}
|