@financial-times/cp-content-pipeline-schema 2.10.3 → 2.11.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 +18 -0
- package/lib/datasources/capi.js +1 -0
- package/lib/datasources/capi.js.map +1 -1
- package/lib/datasources/capi.test.js +30 -20
- package/lib/datasources/capi.test.js.map +1 -1
- package/lib/generated/index.d.ts +34 -2
- package/lib/model/CapiResponse.d.ts +1 -0
- package/lib/model/CapiResponse.js +4 -7
- package/lib/model/CapiResponse.js.map +1 -1
- package/lib/model/Topper.d.ts +1 -1
- package/lib/model/Topper.js +3 -0
- package/lib/model/Topper.js.map +1 -1
- package/lib/model/schemas/capi/base-schema.js.map +1 -1
- package/lib/resolvers/index.d.ts +22 -10
- package/lib/resolvers/topper.d.ts +22 -10
- package/lib/resolvers/topper.js +3 -0
- package/lib/resolvers/topper.js.map +1 -1
- package/package.json +1 -1
- package/src/datasources/capi.test.ts +42 -25
- package/src/datasources/capi.ts +2 -0
- package/src/generated/index.ts +36 -2
- package/src/model/CapiResponse.ts +5 -10
- package/src/model/Topper.ts +5 -0
- package/src/model/schemas/capi/base-schema.ts +4 -4
- package/src/resolvers/topper.ts +5 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/typedefs/topper.graphql +40 -14
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
declare const resolvers: {
|
|
2
2
|
Topper: {
|
|
3
|
-
__resolveType: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish", import("../model/Topper").Topper, import("..").QueryContext>;
|
|
3
|
+
__resolveType: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish" | "PartnerContentTopper", import("../model/Topper").Topper, import("..").QueryContext>;
|
|
4
4
|
backgroundBox: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
5
5
|
backgroundColour: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"paper" | "wheat" | "white" | "black" | "claret" | "oxford" | "slate" | "crimson" | "sky" | "matisse">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
6
6
|
displayConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
@@ -31,7 +31,7 @@ declare const resolvers: {
|
|
|
31
31
|
isLargeHeadline: (topper: import("../model/Topper").Topper) => boolean;
|
|
32
32
|
layout: (topper: import("../model/Topper").Topper) => string;
|
|
33
33
|
columnist: (topper: import("../model/Topper").Topper) => import("../model/Concept").Concept | null;
|
|
34
|
-
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
34
|
+
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish" | "PartnerContentTopper", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
35
35
|
backgroundBox: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
36
36
|
backgroundColour: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"paper" | "wheat" | "white" | "black" | "claret" | "oxford" | "slate" | "crimson" | "sky" | "matisse">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
37
37
|
displayConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
@@ -46,7 +46,7 @@ declare const resolvers: {
|
|
|
46
46
|
isLargeHeadline: (topper: import("../model/Topper").Topper) => boolean;
|
|
47
47
|
layout: (topper: import("../model/Topper").Topper) => string;
|
|
48
48
|
columnist: (topper: import("../model/Topper").Topper) => import("../model/Concept").Concept | null;
|
|
49
|
-
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
49
|
+
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish" | "PartnerContentTopper", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
50
50
|
backgroundBox: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
51
51
|
backgroundColour: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"paper" | "wheat" | "white" | "black" | "claret" | "oxford" | "slate" | "crimson" | "sky" | "matisse">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
52
52
|
displayConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
@@ -61,7 +61,7 @@ declare const resolvers: {
|
|
|
61
61
|
};
|
|
62
62
|
BasicTopper: {
|
|
63
63
|
[x: string]: any;
|
|
64
|
-
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
64
|
+
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish" | "PartnerContentTopper", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
65
65
|
backgroundBox: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
66
66
|
backgroundColour: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"paper" | "wheat" | "white" | "black" | "claret" | "oxford" | "slate" | "crimson" | "sky" | "matisse">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
67
67
|
displayConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
@@ -75,7 +75,7 @@ declare const resolvers: {
|
|
|
75
75
|
brandConcept: (topper: import("../model/Topper").Topper) => import("../model/Concept").Concept | null;
|
|
76
76
|
isLargeHeadline: (topper: import("../model/Topper").Topper) => boolean;
|
|
77
77
|
layout: (topper: import("../model/Topper").Topper) => string;
|
|
78
|
-
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
78
|
+
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish" | "PartnerContentTopper", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
79
79
|
backgroundBox: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
80
80
|
backgroundColour: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"paper" | "wheat" | "white" | "black" | "claret" | "oxford" | "slate" | "crimson" | "sky" | "matisse">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
81
81
|
displayConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
@@ -91,7 +91,7 @@ declare const resolvers: {
|
|
|
91
91
|
layout: (topper: import("../model/Topper").Topper) => string;
|
|
92
92
|
fallbackImage: (topper: import("../model/Topper").Topper) => import("../model/Image").CAPIImage | null;
|
|
93
93
|
images: (topper: import("../model/Topper").Topper) => import("../model/Image").CAPIImage[];
|
|
94
|
-
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
94
|
+
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish" | "PartnerContentTopper", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
95
95
|
backgroundBox: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
96
96
|
backgroundColour: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"paper" | "wheat" | "white" | "black" | "claret" | "oxford" | "slate" | "crimson" | "sky" | "matisse">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
97
97
|
displayConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
@@ -107,7 +107,7 @@ declare const resolvers: {
|
|
|
107
107
|
layout: (topper: import("../model/Topper").Topper) => string;
|
|
108
108
|
fallbackImage: (topper: import("../model/Topper").Topper) => import("../model/Image").CAPIImage | null;
|
|
109
109
|
images: (topper: import("../model/Topper").Topper) => import("../model/Image").CAPIImage[];
|
|
110
|
-
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
110
|
+
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish" | "PartnerContentTopper", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
111
111
|
backgroundBox: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
112
112
|
backgroundColour: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"paper" | "wheat" | "white" | "black" | "claret" | "oxford" | "slate" | "crimson" | "sky" | "matisse">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
113
113
|
displayConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
@@ -121,7 +121,7 @@ declare const resolvers: {
|
|
|
121
121
|
layout: (topper: import("../model/Topper").Topper) => string;
|
|
122
122
|
layoutWidth: (topper: import("../model/Topper").Topper) => string | null;
|
|
123
123
|
leadFlourish: (topper: import("../model/Topper").Topper) => import("../model/LeadFlourish").LeadFlourish;
|
|
124
|
-
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
124
|
+
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish" | "PartnerContentTopper", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
125
125
|
backgroundBox: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
126
126
|
backgroundColour: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"paper" | "wheat" | "white" | "black" | "claret" | "oxford" | "slate" | "crimson" | "sky" | "matisse">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
127
127
|
displayConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
@@ -137,7 +137,7 @@ declare const resolvers: {
|
|
|
137
137
|
layout: (topper: import("../model/Topper").Topper) => string;
|
|
138
138
|
fallbackImage: (topper: import("../model/Topper").Topper) => import("../model/Image").CAPIImage | null;
|
|
139
139
|
images: (topper: import("../model/Topper").Topper) => import("../model/Image").CAPIImage[];
|
|
140
|
-
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
140
|
+
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish" | "PartnerContentTopper", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
141
141
|
backgroundBox: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
142
142
|
backgroundColour: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"paper" | "wheat" | "white" | "black" | "claret" | "oxford" | "slate" | "crimson" | "sky" | "matisse">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
143
143
|
displayConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
@@ -154,7 +154,19 @@ declare const resolvers: {
|
|
|
154
154
|
layout: (topper: import("../model/Topper").Topper) => string;
|
|
155
155
|
fallbackImage: (topper: import("../model/Topper").Topper) => import("../model/Image").CAPIImage | null;
|
|
156
156
|
images: (topper: import("../model/Topper").Topper) => import("../model/Image").CAPIImage[];
|
|
157
|
-
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
157
|
+
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish" | "PartnerContentTopper", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
158
|
+
backgroundBox: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
159
|
+
backgroundColour: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"paper" | "wheat" | "white" | "black" | "claret" | "oxford" | "slate" | "crimson" | "sky" | "matisse">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
160
|
+
displayConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
161
|
+
followButtonVariant: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"standard" | "inverse" | "opinion" | "alphaville" | "monochrome" | "inverse-monochrome">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
162
|
+
genreConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
163
|
+
headline: import("../generated").Resolver<import("../generated").ResolverTypeWrapper<string>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
164
|
+
intro: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/RichText").RichText>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
165
|
+
textShadow: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
166
|
+
};
|
|
167
|
+
PartnerContentTopper: {
|
|
168
|
+
[x: string]: any;
|
|
169
|
+
__resolveType?: import("../generated").TypeResolveFn<"DeepPortraitTopper" | "DeepLandscapeTopper" | "SplitTextTopper" | "FullBleedTopper" | "PodcastTopper" | "OpinionTopper" | "BrandedTopper" | "BasicTopper" | "TopperWithFlourish" | "PartnerContentTopper", import("../model/Topper").Topper, import("..").QueryContext> | undefined;
|
|
158
170
|
backgroundBox: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
159
171
|
backgroundColour: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<"paper" | "wheat" | "white" | "black" | "claret" | "oxford" | "slate" | "crimson" | "sky" | "matisse">>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
160
172
|
displayConcept: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<import("../model/Concept").Concept>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
package/lib/resolvers/topper.js
CHANGED
|
@@ -96,6 +96,9 @@ const resolvers = {
|
|
|
96
96
|
fallbackImage: (topper) => topper.fallbackImage(),
|
|
97
97
|
images: (topper) => topper.images(),
|
|
98
98
|
},
|
|
99
|
+
PartnerContentTopper: {
|
|
100
|
+
...topperResolvers,
|
|
101
|
+
},
|
|
99
102
|
};
|
|
100
103
|
exports.default = resolvers;
|
|
101
104
|
//# sourceMappingURL=topper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topper.js","sourceRoot":"","sources":["../../src/resolvers/topper.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"topper.js","sourceRoot":"","sources":["../../src/resolvers/topper.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -8,37 +8,45 @@ import { ContentTypeSchemas } from '../types/internal-content'
|
|
|
8
8
|
const logger = new Logger()
|
|
9
9
|
const metrics = { count: jest.fn() }
|
|
10
10
|
|
|
11
|
+
const cache = {
|
|
12
|
+
get: jest.fn(),
|
|
13
|
+
set: jest.fn(),
|
|
14
|
+
delete: jest.fn(),
|
|
15
|
+
} satisfies KeyValueCache
|
|
16
|
+
|
|
17
|
+
const context = {
|
|
18
|
+
versions: { api: '1.0.0', schema: '1.0.0' },
|
|
19
|
+
logger,
|
|
20
|
+
metrics,
|
|
21
|
+
addSurrogateKeys: jest.fn(),
|
|
22
|
+
} as unknown as QueryContext
|
|
23
|
+
|
|
24
|
+
const capi = new CapiDataSource({
|
|
25
|
+
cache,
|
|
26
|
+
context,
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
const id = '00000000-0000-0000-0000-000000000000'
|
|
30
|
+
|
|
11
31
|
describe('CapiDataSource', () => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const cache = {
|
|
16
|
-
get: jest.fn(),
|
|
17
|
-
set: jest.fn(),
|
|
18
|
-
delete: jest.fn(),
|
|
19
|
-
} satisfies KeyValueCache
|
|
20
|
-
const capi = new CapiDataSource({
|
|
21
|
-
cache,
|
|
22
|
-
context: {
|
|
23
|
-
versions: { api: '1.0.0', schema: '1.0.0' },
|
|
24
|
-
logger,
|
|
25
|
-
metrics,
|
|
26
|
-
} as unknown as QueryContext,
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
jest.spyOn(global, 'fetch').mockResolvedValue(
|
|
32
|
+
beforeAll(() => {
|
|
33
|
+
jest.spyOn(global, 'fetch').mockImplementation(
|
|
34
|
+
async () =>
|
|
30
35
|
new Response(JSON.stringify({ id }), {
|
|
31
36
|
headers: new Headers([['content-type', 'application/json']]),
|
|
32
37
|
})
|
|
33
|
-
|
|
38
|
+
)
|
|
34
39
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
jest
|
|
41
|
+
.spyOn(CapiResponse, 'fromJSON')
|
|
42
|
+
.mockImplementation(
|
|
43
|
+
(content, context) =>
|
|
44
|
+
new CapiResponse(content as ContentTypeSchemas, context)
|
|
45
|
+
)
|
|
46
|
+
})
|
|
41
47
|
|
|
48
|
+
describe('cache keys', () => {
|
|
49
|
+
it('should return the same cache key that it actually stored in the cache', async () => {
|
|
42
50
|
await capi.getContent(id)
|
|
43
51
|
|
|
44
52
|
expect(cache.set).toBeCalled()
|
|
@@ -48,6 +56,15 @@ describe('CapiDataSource', () => {
|
|
|
48
56
|
})
|
|
49
57
|
})
|
|
50
58
|
|
|
59
|
+
describe('surrogate keys', () => {
|
|
60
|
+
it('should add uuid to the context surrogate keys', async () => {
|
|
61
|
+
await capi.getContent(id)
|
|
62
|
+
expect(context.addSurrogateKeys).toBeCalledWith(
|
|
63
|
+
expect.arrayContaining([id])
|
|
64
|
+
)
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
|
|
51
68
|
afterAll(() => {
|
|
52
69
|
jest.resetAllMocks()
|
|
53
70
|
})
|
package/src/datasources/capi.ts
CHANGED
|
@@ -52,6 +52,8 @@ export class CapiDataSource extends InstrumentedRESTDataSource {
|
|
|
52
52
|
uuid: string,
|
|
53
53
|
packageContainer?: CapiResponse
|
|
54
54
|
): Promise<CapiResponse> {
|
|
55
|
+
this.context.addSurrogateKeys([uuid])
|
|
56
|
+
|
|
55
57
|
const content = await this.get(`internalcontent/${uuid}`, {
|
|
56
58
|
cacheOptions: { ttl: this.articleCacheTTL },
|
|
57
59
|
})
|
package/src/generated/index.ts
CHANGED
|
@@ -1140,6 +1140,25 @@ export type OpinionTopperHeadshotArgs = {
|
|
|
1140
1140
|
width?: InputMaybe<Scalars['Int']['input']>;
|
|
1141
1141
|
};
|
|
1142
1142
|
|
|
1143
|
+
export type PartnerContentTopper = Topper & {
|
|
1144
|
+
/** Whether the topper should have a background box. */
|
|
1145
|
+
readonly backgroundBox?: Maybe<Scalars['Boolean']['output']>;
|
|
1146
|
+
/** The background colour of the topper. */
|
|
1147
|
+
readonly backgroundColour?: Maybe<Scalars['TopperBackgroundColour']['output']>;
|
|
1148
|
+
/** The concept object to be displayed, eg. {'type': 'TOPIC', 'prefLabel': 'Non-dom tax status', ...}. */
|
|
1149
|
+
readonly displayConcept?: Maybe<Concept>;
|
|
1150
|
+
/** The variant of the follow button to be displayed on the topper. */
|
|
1151
|
+
readonly followButtonVariant?: Maybe<Scalars['FollowButtonVariant']['output']>;
|
|
1152
|
+
/** The concept object of the genre, eg. {'type': 'GENRE', 'prefLabel': 'Opinion', ...}. */
|
|
1153
|
+
readonly genreConcept?: Maybe<Concept>;
|
|
1154
|
+
/** The headline text of the topper. */
|
|
1155
|
+
readonly headline: Scalars['String']['output'];
|
|
1156
|
+
/** An abstract syntax tree of the introduction text. */
|
|
1157
|
+
readonly intro?: Maybe<RichText>;
|
|
1158
|
+
/** Whether the topper should have a text shadow. */
|
|
1159
|
+
readonly textShadow?: Maybe<Scalars['Boolean']['output']>;
|
|
1160
|
+
};
|
|
1161
|
+
|
|
1143
1162
|
export type Person = {
|
|
1144
1163
|
readonly headshot?: Maybe<Scalars['String']['output']>;
|
|
1145
1164
|
readonly prefLabel?: Maybe<Scalars['String']['output']>;
|
|
@@ -1700,7 +1719,7 @@ export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = R
|
|
|
1700
1719
|
Image: ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel );
|
|
1701
1720
|
Picture: ( PictureModel ) | ( PictureModel ) | ( PictureModel );
|
|
1702
1721
|
Reference: ( ReferenceWithCAPIData<ClipSetNode|OldClipNode> ) | ( ReferenceWithCAPIData<ContentTree.Flourish> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<ContentTree.LayoutImage> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<RawImageNode> ) | ( ReferenceWithCAPIData<ContentTree.Recommended> ) | ( ReferenceWithCAPIData<ContentTree.ScrollyImage> ) | ( ReferenceWithCAPIData<ContentTree.Tweet> ) | ( ReferenceWithCAPIData<VideoNode> );
|
|
1703
|
-
Topper: ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel );
|
|
1722
|
+
Topper: ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel );
|
|
1704
1723
|
TopperWithBrand: ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel );
|
|
1705
1724
|
TopperWithHeadshot: ( TopperModel ) | ( TopperModel );
|
|
1706
1725
|
TopperWithImages: ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel );
|
|
@@ -1766,6 +1785,7 @@ export type ResolversTypes = ResolversObject<{
|
|
|
1766
1785
|
Mutation: ResolverTypeWrapper<{}>;
|
|
1767
1786
|
OpinionTopper: ResolverTypeWrapper<TopperModel>;
|
|
1768
1787
|
PackageDesign: ResolverTypeWrapper<Scalars['PackageDesign']['output']>;
|
|
1788
|
+
PartnerContentTopper: ResolverTypeWrapper<TopperModel>;
|
|
1769
1789
|
Person: ResolverTypeWrapper<PersonModel>;
|
|
1770
1790
|
Picture: ResolverTypeWrapper<PictureModel>;
|
|
1771
1791
|
PictureFullBleed: ResolverTypeWrapper<PictureModel>;
|
|
@@ -1856,6 +1876,7 @@ export type ResolversParentTypes = ResolversObject<{
|
|
|
1856
1876
|
Mutation: {};
|
|
1857
1877
|
OpinionTopper: TopperModel;
|
|
1858
1878
|
PackageDesign: Scalars['PackageDesign']['output'];
|
|
1879
|
+
PartnerContentTopper: TopperModel;
|
|
1859
1880
|
Person: PersonModel;
|
|
1860
1881
|
Picture: PictureModel;
|
|
1861
1882
|
PictureFullBleed: PictureModel;
|
|
@@ -2502,6 +2523,18 @@ export interface PackageDesignScalarConfig extends GraphQLScalarTypeConfig<Resol
|
|
|
2502
2523
|
name: 'PackageDesign';
|
|
2503
2524
|
}
|
|
2504
2525
|
|
|
2526
|
+
export type PartnerContentTopperResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['PartnerContentTopper'] = ResolversParentTypes['PartnerContentTopper']> = ResolversObject<{
|
|
2527
|
+
backgroundBox: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
|
|
2528
|
+
backgroundColour: Resolver<Maybe<ResolversTypes['TopperBackgroundColour']>, ParentType, ContextType>;
|
|
2529
|
+
displayConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
|
|
2530
|
+
followButtonVariant: Resolver<Maybe<ResolversTypes['FollowButtonVariant']>, ParentType, ContextType>;
|
|
2531
|
+
genreConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
|
|
2532
|
+
headline: Resolver<ResolversTypes['String'], ParentType, ContextType>;
|
|
2533
|
+
intro: Resolver<Maybe<ResolversTypes['RichText']>, ParentType, ContextType>;
|
|
2534
|
+
textShadow: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
|
|
2535
|
+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
|
|
2536
|
+
}>;
|
|
2537
|
+
|
|
2505
2538
|
export type PersonResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Person'] = ResolversParentTypes['Person']> = ResolversObject<{
|
|
2506
2539
|
headshot: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, Partial<PersonHeadshotArgs>>;
|
|
2507
2540
|
prefLabel: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
|
|
@@ -2690,7 +2723,7 @@ export type TeaserResolvers<ContextType = QueryContext, ParentType extends Resol
|
|
|
2690
2723
|
}>;
|
|
2691
2724
|
|
|
2692
2725
|
export type TopperResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Topper'] = ResolversParentTypes['Topper']> = ResolversObject<{
|
|
2693
|
-
__resolveType?: TypeResolveFn<'BasicTopper' | 'BrandedTopper' | 'DeepLandscapeTopper' | 'DeepPortraitTopper' | 'FullBleedTopper' | 'OpinionTopper' | 'PodcastTopper' | 'SplitTextTopper' | 'TopperWithFlourish', ParentType, ContextType>;
|
|
2726
|
+
__resolveType?: TypeResolveFn<'BasicTopper' | 'BrandedTopper' | 'DeepLandscapeTopper' | 'DeepPortraitTopper' | 'FullBleedTopper' | 'OpinionTopper' | 'PartnerContentTopper' | 'PodcastTopper' | 'SplitTextTopper' | 'TopperWithFlourish', ParentType, ContextType>;
|
|
2694
2727
|
backgroundBox: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
|
|
2695
2728
|
backgroundColour: Resolver<Maybe<ResolversTypes['TopperBackgroundColour']>, ParentType, ContextType>;
|
|
2696
2729
|
displayConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
|
|
@@ -2842,6 +2875,7 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
|
|
|
2842
2875
|
Mutation: MutationResolvers<ContextType>;
|
|
2843
2876
|
OpinionTopper: OpinionTopperResolvers<ContextType>;
|
|
2844
2877
|
PackageDesign: GraphQLScalarType;
|
|
2878
|
+
PartnerContentTopper: PartnerContentTopperResolvers<ContextType>;
|
|
2845
2879
|
Person: PersonResolvers<ContextType>;
|
|
2846
2880
|
Picture: PictureResolvers<ContextType>;
|
|
2847
2881
|
PictureFullBleed: PictureFullBleedResolvers<ContextType>;
|
|
@@ -362,10 +362,7 @@ export class CapiResponse {
|
|
|
362
362
|
return this.capiData.title
|
|
363
363
|
}
|
|
364
364
|
id() {
|
|
365
|
-
|
|
366
|
-
this.context.addSurrogateKeys([uuid])
|
|
367
|
-
|
|
368
|
-
return uuid
|
|
365
|
+
return uuidFromUrl(this.capiData.id)
|
|
369
366
|
}
|
|
370
367
|
standfirst(): string | null {
|
|
371
368
|
if ('standfirst' in this.capiData && this.capiData.standfirst) {
|
|
@@ -433,10 +430,6 @@ export class CapiResponse {
|
|
|
433
430
|
}
|
|
434
431
|
}
|
|
435
432
|
|
|
436
|
-
if (container) {
|
|
437
|
-
this.context.addSurrogateKeys([container.id()])
|
|
438
|
-
}
|
|
439
|
-
|
|
440
433
|
return container ?? null
|
|
441
434
|
}
|
|
442
435
|
|
|
@@ -674,8 +667,6 @@ export class CapiResponse {
|
|
|
674
667
|
)
|
|
675
668
|
: this.capiData.contains
|
|
676
669
|
|
|
677
|
-
this.context.addSurrogateKeys(contains.map((article) => article.id))
|
|
678
|
-
|
|
679
670
|
const results = await Promise.allSettled(
|
|
680
671
|
contains.map(({ id }) =>
|
|
681
672
|
this.context.dataSources.capi.getContent(uuidFromUrl(id), this)
|
|
@@ -813,4 +804,8 @@ export class CapiResponse {
|
|
|
813
804
|
}
|
|
814
805
|
return null
|
|
815
806
|
}
|
|
807
|
+
|
|
808
|
+
isPartnerContent(): boolean {
|
|
809
|
+
return this.capiData.editorialDesk === '/FT/Commercial/PartnerContent'
|
|
810
|
+
}
|
|
816
811
|
}
|
package/src/model/Topper.ts
CHANGED
|
@@ -21,6 +21,7 @@ type TopperType =
|
|
|
21
21
|
| 'BrandedTopper'
|
|
22
22
|
| 'BasicTopper'
|
|
23
23
|
| 'TopperWithFlourish'
|
|
24
|
+
| 'PartnerContentTopper'
|
|
24
25
|
|
|
25
26
|
type TopperBackgroundColourValues = LiteralUnionScalarValues<
|
|
26
27
|
typeof TopperBackgroundColour
|
|
@@ -102,6 +103,10 @@ export class Topper {
|
|
|
102
103
|
return 'BrandedTopper'
|
|
103
104
|
}
|
|
104
105
|
|
|
106
|
+
if (this.capiResponse.isPartnerContent()) {
|
|
107
|
+
return 'PartnerContentTopper'
|
|
108
|
+
}
|
|
109
|
+
|
|
105
110
|
return 'BasicTopper'
|
|
106
111
|
}
|
|
107
112
|
|
|
@@ -90,10 +90,10 @@ const AlternativeImage = z.object({
|
|
|
90
90
|
})
|
|
91
91
|
|
|
92
92
|
export const LeadFlourish = z.object({
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
id: z.string(),
|
|
94
|
+
type: z.string(),
|
|
95
|
+
description: z.string(),
|
|
96
|
+
})
|
|
97
97
|
|
|
98
98
|
const ClipSource = z.object({
|
|
99
99
|
audioCodec: z.string().optional(),
|
package/src/resolvers/topper.ts
CHANGED
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
DeepLandscapeTopperResolvers,
|
|
15
15
|
DeepPortraitTopperResolvers,
|
|
16
16
|
BrandedTopperResolvers,
|
|
17
|
+
PartnerContentTopperResolvers,
|
|
17
18
|
} from '../generated'
|
|
18
19
|
|
|
19
20
|
const topperResolvers: TopperResolvers = {
|
|
@@ -128,6 +129,9 @@ const resolvers = {
|
|
|
128
129
|
images: (topper) => topper.images(),
|
|
129
130
|
},
|
|
130
131
|
|
|
132
|
+
PartnerContentTopper: {
|
|
133
|
+
...topperResolvers,
|
|
134
|
+
},
|
|
131
135
|
} satisfies {
|
|
132
136
|
Topper: TopperResolvers
|
|
133
137
|
TopperWithImages: TopperWithImagesResolvers
|
|
@@ -144,6 +148,7 @@ const resolvers = {
|
|
|
144
148
|
DeepPortraitTopper: DeepPortraitTopperResolvers
|
|
145
149
|
FullBleedTopper: FullBleedTopperResolvers
|
|
146
150
|
SplitTextTopper: SplitTextTopperResolvers
|
|
151
|
+
PartnerContentTopper: PartnerContentTopperResolvers
|
|
147
152
|
}
|
|
148
153
|
|
|
149
154
|
export default resolvers
|