@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.
@@ -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, {}>;
@@ -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":"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"}
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;KAC1C;IAED,aAAa,EAAE;QACb,GAAG,eAAe;QAClB,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;KAC1C;IAED,iBAAiB,EAAE;QACjB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK;KAC1C;IAED,WAAW,EAAE;QACX,GAAG,eAAe;KACnB;IAED,aAAa,EAAE;QACb,GAAG,eAAe;QAClB,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE;QAC/C,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,mBAAmB,EAAE;QACnB,GAAG,eAAe;QAClB,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE;QAC/C,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE;QACrD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE;QACjD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;KACpC;IAED,kBAAkB,EAAE;QAClB,GAAG,eAAe;QAClB,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE;QAC/C,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE;QACrD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE;QACjD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;KACpC;IAED,kBAAkB,EAAE;QAClB,GAAG,eAAe;QAClB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;QAC7C,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE;KAChD;IAED,eAAe,EAAE;QACf,GAAG,eAAe;QAClB,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE;QAC/C,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE;QACrD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE;QACjD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;KACpC;IAED,eAAe,EAAE;QACf,GAAG,eAAe;QAClB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK;QACzC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE;QAC/C,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE;QACrD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE;QACjD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;KACpC;IAED,oBAAoB,EAAE;QACpB,GAAG,eAAe;KACnB;CAkBF,CAAA;AAED,kBAAe,SAAS,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@financial-times/cp-content-pipeline-schema",
3
- "version": "2.10.3",
3
+ "version": "2.11.1",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -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
- describe('cache keys', () => {
13
- it('should return the same cache key that it actually stored in the cache', async () => {
14
- const id = '00000000-0000-0000-0000-000000000000'
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
- jest
36
- .spyOn(CapiResponse, 'fromJSON')
37
- .mockImplementation(
38
- (content, context) =>
39
- new CapiResponse(content as ContentTypeSchemas, context)
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
  })
@@ -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
  })
@@ -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
- const uuid = uuidFromUrl(this.capiData.id)
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
  }
@@ -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
- id: z.string(),
94
- type: z.string(),
95
- description: z.string(),
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(),
@@ -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