@financial-times/cp-content-pipeline-schema 3.0.0 → 3.0.2

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 CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.0.2](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v3.0.1...cp-content-pipeline-schema-v3.0.2) (2024-08-30)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **schema:** rename Teaser's Indicators type to TeaserIndicators ([ce862e4](https://github.com/Financial-Times/cp-content-pipeline/commit/ce862e4e54dab3793f0436d3da8ebd1dd4f751d4))
9
+
10
+ ## [3.0.1](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v3.0.0...cp-content-pipeline-schema-v3.0.1) (2024-08-28)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * allow Tweet's html field to be nullable again ([b60e18e](https://github.com/Financial-Times/cp-content-pipeline/commit/b60e18e8bf62820bce04380709279c2adc745321))
16
+ * **schema:** validate and typecheck Tweet embed API response ([7646dba](https://github.com/Financial-Times/cp-content-pipeline/commit/7646dba5201c90faa2cba008fbd5a0bd259fdc4a))
17
+
3
18
  ## [3.0.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v2.15.1...cp-content-pipeline-schema-v3.0.0) (2024-08-27)
4
19
 
5
20
 
@@ -6,6 +6,8 @@ export declare class TwitterDataSource extends InstrumentedRESTDataSource {
6
6
  abortController: AbortController;
7
7
  timeout: ReturnType<typeof setTimeout> | undefined;
8
8
  willSendRequest(path: string, request: AugmentedRequest): void;
9
- getTweet(tweetUrl: string): Promise<any>;
9
+ getTweet(tweetUrl: string): Promise<{
10
+ html: string;
11
+ }>;
10
12
  cacheOptionsFor(): CacheOptions;
11
13
  }
@@ -1,14 +1,39 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
6
29
  exports.TwitterDataSource = void 0;
30
+ const z = __importStar(require("zod"));
7
31
  const instrumented_1 = require("./instrumented");
8
32
  const timeout_error_1 = __importDefault(require("../helpers/timeout-error"));
9
33
  const REQUEST_TIMEOUT = process.env.TWITTER_DATASOURCE_REQUEST_TIMEOUT
10
34
  ? parseInt(process.env.TWITTER_DATASOURCE_REQUEST_TIMEOUT)
11
35
  : 1000;
36
+ const Tweet = z.object({ html: z.string() });
12
37
  class TwitterDataSource extends instrumented_1.InstrumentedRESTDataSource {
13
38
  constructor() {
14
39
  super(...arguments);
@@ -31,7 +56,7 @@ class TwitterDataSource extends instrumented_1.InstrumentedRESTDataSource {
31
56
  clearTimeout(this.timeout);
32
57
  this.timeout = undefined;
33
58
  }
34
- return tweet;
59
+ return Tweet.parse(tweet);
35
60
  }
36
61
  cacheOptionsFor() {
37
62
  // HACK:20221110:KB twitter does return a cache_age property, but cacheOptionsFor
@@ -1 +1 @@
1
- {"version":3,"file":"twitter.js","sourceRoot":"","sources":["../../src/datasources/twitter.ts"],"names":[],"mappings":";;;;;;AACA,iDAA2D;AAC3D,6EAAmD;AAEnD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC;IACpE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC;IAC1D,CAAC,CAAC,IAAI,CAAA;AAER,MAAa,iBAAkB,SAAQ,yCAA0B;IAAjE;;QACE,YAAO,GAAG,6BAA6B,CAAA;QAKvC,oBAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QACvC,YAAO,GAA8C,SAAS,CAAA;IA8BhE,CAAC;IAnCC,IAAI,iBAAiB;QACnB,OAAO,oBAAoB,CAAA;IAC7B,CAAC;IAKQ,eAAe,CAAC,IAAY,EAAE,OAAyB;QAC9D,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAEpC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAA;QAC5C,IAAI,CAAC,OAAO,GAAG,UAAU,CACvB,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,uBAAY,CAAC,eAAe,CAAC,CAAC,EACnE,eAAe,CAChB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,QAAQ,mBAAmB,CAAC,CAAA;QAEvE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAEzB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC1B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QAC1B,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED,eAAe;QACb,iFAAiF;QACjF,oFAAoF;QACpF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;IACtB,CAAC;CACF;AArCD,8CAqCC"}
1
+ {"version":3,"file":"twitter.js","sourceRoot":"","sources":["../../src/datasources/twitter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAAwB;AAExB,iDAA2D;AAC3D,6EAAmD;AAEnD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC;IACpE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC;IAC1D,CAAC,CAAC,IAAI,CAAA;AAER,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AAE5C,MAAa,iBAAkB,SAAQ,yCAA0B;IAAjE;;QACE,YAAO,GAAG,6BAA6B,CAAA;QAKvC,oBAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QACvC,YAAO,GAA8C,SAAS,CAAA;IA8BhE,CAAC;IAnCC,IAAI,iBAAiB;QACnB,OAAO,oBAAoB,CAAA;IAC7B,CAAC;IAKQ,eAAe,CAAC,IAAY,EAAE,OAAyB;QAC9D,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAEpC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAA;QAC5C,IAAI,CAAC,OAAO,GAAG,UAAU,CACvB,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,uBAAY,CAAC,eAAe,CAAC,CAAC,EACnE,eAAe,CAChB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,QAAQ,mBAAmB,CAAC,CAAA;QAEvE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAEzB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC1B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;QAC1B,CAAC;QAED,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;IAED,eAAe;QACb,iFAAiF;QACjF,oFAAoF;QACpF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;IACtB,CAAC;CACF;AArCD,8CAqCC"}
@@ -1000,22 +1000,9 @@ export type ImageWideSourceSetArgs = {
1000
1000
  maxDpr?: InputMaybe<Scalars['Int']['input']>;
1001
1001
  width?: InputMaybe<Scalars['Int']['input']>;
1002
1002
  };
1003
- /** Indicators are used to determine teaser styling. */
1004
1003
  export type Indicators = {
1005
- /** The access level of the teaser, eg. 'free' or 'premium'. */
1006
- readonly accessLevel: Scalars['AccessLevel']['output'];
1007
- /** Whether the teaser is a column, ie. has one author. */
1008
- readonly isColumn?: Maybe<Scalars['Boolean']['output']>;
1009
- /** Whether the teaser is an editor's choice. */
1010
- readonly isEditorsChoice?: Maybe<Scalars['Boolean']['output']>;
1011
- /** Whether the teaser is exclusive. */
1012
- readonly isExclusive?: Maybe<Scalars['Boolean']['output']>;
1013
- /** Whether the teaser is an opinion piece. */
1004
+ /** Whether the content is an opinion piece. */
1014
1005
  readonly isOpinion?: Maybe<Scalars['Boolean']['output']>;
1015
- /** Whether the teaser is a podcast. */
1016
- readonly isPodcast?: Maybe<Scalars['Boolean']['output']>;
1017
- /** Whether the teaser is a scoop. */
1018
- readonly isScoop?: Maybe<Scalars['Boolean']['output']>;
1019
1006
  };
1020
1007
  export type LayoutImage = Reference & {
1021
1008
  /** A set of images with different sizes and formats. */
@@ -1548,7 +1535,7 @@ export type Teaser = {
1548
1535
  /** The image to be used as a thumbnail for the teaser. */
1549
1536
  readonly image?: Maybe<Image>;
1550
1537
  /** An object containing a map of indicator items to boolean values, eg. accessLevel, isOpinion. */
1551
- readonly indicators: Indicators;
1538
+ readonly indicators: TeaserIndicators;
1552
1539
  /** An object containing the metadata details of the teaser, eg. id, url, prefLabel. */
1553
1540
  readonly metaAltLink?: Maybe<MetaLink>;
1554
1541
  /** An object containing the metadata details of the teaser, eg. id, url, prefLabel. */
@@ -1573,6 +1560,23 @@ export type Teaser = {
1573
1560
  export type TeaserUrlArgs = {
1574
1561
  relative?: InputMaybe<Scalars['Boolean']['input']>;
1575
1562
  };
1563
+ /** Indicators are used to determine teaser styling. */
1564
+ export type TeaserIndicators = {
1565
+ /** The access level of the teaser, eg. 'free' or 'premium'. */
1566
+ readonly accessLevel: Scalars['AccessLevel']['output'];
1567
+ /** Whether the teaser is a column, ie. has one author. */
1568
+ readonly isColumn?: Maybe<Scalars['Boolean']['output']>;
1569
+ /** Whether the teaser is an editor's choice. */
1570
+ readonly isEditorsChoice?: Maybe<Scalars['Boolean']['output']>;
1571
+ /** Whether the teaser is exclusive. */
1572
+ readonly isExclusive?: Maybe<Scalars['Boolean']['output']>;
1573
+ /** Whether the teaser is an opinion piece. */
1574
+ readonly isOpinion?: Maybe<Scalars['Boolean']['output']>;
1575
+ /** Whether the teaser is a podcast. */
1576
+ readonly isPodcast?: Maybe<Scalars['Boolean']['output']>;
1577
+ /** Whether the teaser is a scoop. */
1578
+ readonly isScoop?: Maybe<Scalars['Boolean']['output']>;
1579
+ };
1576
1580
  export type Topper = {
1577
1581
  /** Whether the topper should have a background box. */
1578
1582
  readonly backgroundBox?: Maybe<Scalars['Boolean']['output']>;
@@ -1650,7 +1654,7 @@ export type TopperWithTheme = {
1650
1654
  };
1651
1655
  export type Tweet = Reference & {
1652
1656
  /** The raw HTML of the tweet. */
1653
- readonly html: Scalars['String']['output'];
1657
+ readonly html?: Maybe<Scalars['String']['output']>;
1654
1658
  /** The type of the reference, eg. 'tweet'. */
1655
1659
  readonly type: Scalars['String']['output'];
1656
1660
  };
@@ -1860,6 +1864,7 @@ export type ResolversTypes = ResolversObject<{
1860
1864
  }>;
1861
1865
  TableOfContents: ResolverTypeWrapper<TableOfContents>;
1862
1866
  Teaser: ResolverTypeWrapper<CapiResponse>;
1867
+ TeaserIndicators: ResolverTypeWrapper<TeaserIndicators>;
1863
1868
  Topper: ResolverTypeWrapper<TopperModel>;
1864
1869
  TopperBackgroundColour: ResolverTypeWrapper<Scalars['TopperBackgroundColour']['output']>;
1865
1870
  TopperWithBrand: ResolverTypeWrapper<TopperModel>;
@@ -1960,6 +1965,7 @@ export type ResolversParentTypes = ResolversObject<{
1960
1965
  };
1961
1966
  TableOfContents: TableOfContents;
1962
1967
  Teaser: CapiResponse;
1968
+ TeaserIndicators: TeaserIndicators;
1963
1969
  Topper: TopperModel;
1964
1970
  TopperBackgroundColour: Scalars['TopperBackgroundColour']['output'];
1965
1971
  TopperWithBrand: TopperModel;
@@ -2452,13 +2458,7 @@ export type ImageWideResolvers<ContextType = QueryContext, ParentType extends Re
2452
2458
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2453
2459
  }>;
2454
2460
  export type IndicatorsResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Indicators'] = ResolversParentTypes['Indicators']> = ResolversObject<{
2455
- accessLevel: Resolver<ResolversTypes['AccessLevel'], ParentType, ContextType>;
2456
- isColumn: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2457
- isEditorsChoice: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2458
- isExclusive: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2459
2461
  isOpinion: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2460
- isPodcast: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2461
- isScoop: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2462
2462
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2463
2463
  }>;
2464
2464
  export interface JsonScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['JSON'], any> {
@@ -2765,7 +2765,7 @@ export type TeaserResolvers<ContextType = QueryContext, ParentType extends Resol
2765
2765
  firstPublishedDate: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2766
2766
  id: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2767
2767
  image: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
2768
- indicators: Resolver<ResolversTypes['Indicators'], ParentType, ContextType>;
2768
+ indicators: Resolver<ResolversTypes['TeaserIndicators'], ParentType, ContextType>;
2769
2769
  metaAltLink: Resolver<Maybe<ResolversTypes['MetaLink']>, ParentType, ContextType>;
2770
2770
  metaLink: Resolver<Maybe<ResolversTypes['MetaLink']>, ParentType, ContextType>;
2771
2771
  metaPrefixText: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -2778,6 +2778,16 @@ export type TeaserResolvers<ContextType = QueryContext, ParentType extends Resol
2778
2778
  url: Resolver<ResolversTypes['String'], ParentType, ContextType, Partial<TeaserUrlArgs>>;
2779
2779
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2780
2780
  }>;
2781
+ export type TeaserIndicatorsResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['TeaserIndicators'] = ResolversParentTypes['TeaserIndicators']> = ResolversObject<{
2782
+ accessLevel: Resolver<ResolversTypes['AccessLevel'], ParentType, ContextType>;
2783
+ isColumn: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2784
+ isEditorsChoice: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2785
+ isExclusive: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2786
+ isOpinion: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2787
+ isPodcast: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2788
+ isScoop: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2789
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2790
+ }>;
2781
2791
  export type TopperResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Topper'] = ResolversParentTypes['Topper']> = ResolversObject<{
2782
2792
  __resolveType?: TypeResolveFn<'BasicTopper' | 'BrandedTopper' | 'DeepLandscapeTopper' | 'DeepPortraitTopper' | 'FullBleedTopper' | 'OpinionTopper' | 'PartnerContentTopper' | 'PodcastTopper' | 'SplitTextTopper' | 'TopperWithFlourish', ParentType, ContextType>;
2783
2793
  backgroundBox: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
@@ -2831,7 +2841,7 @@ export type TopperWithThemeResolvers<ContextType = QueryContext, ParentType exte
2831
2841
  layout: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
2832
2842
  }>;
2833
2843
  export type TweetResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Tweet'] = ResolversParentTypes['Tweet']> = ResolversObject<{
2834
- html: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2844
+ html: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
2835
2845
  type: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2836
2846
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2837
2847
  }>;
@@ -2948,6 +2958,7 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
2948
2958
  StructuredContent: StructuredContentResolvers<ContextType>;
2949
2959
  TableOfContents: TableOfContentsResolvers<ContextType>;
2950
2960
  Teaser: TeaserResolvers<ContextType>;
2961
+ TeaserIndicators: TeaserIndicatorsResolvers<ContextType>;
2951
2962
  Topper: TopperResolvers<ContextType>;
2952
2963
  TopperBackgroundColour: GraphQLScalarType;
2953
2964
  TopperWithBrand: TopperWithBrandResolvers<ContextType>;
@@ -1,4 +1,4 @@
1
1
  export declare const Tweet: {
2
- html(parent: import(".").ReferenceWithCAPIData<import("@financial-times/content-tree").ContentTree.Tweet>, _args: {}, context: import("../../..").QueryContext): Promise<any>;
2
+ html(parent: import(".").ReferenceWithCAPIData<import("@financial-times/content-tree").ContentTree.Tweet>, _args: {}, context: import("../../..").QueryContext): Promise<string | null>;
3
3
  type(parent: import(".").ReferenceWithCAPIData<import("@financial-times/content-tree").ContentTree.Tweet>): "tweet";
4
4
  };
@@ -98,7 +98,6 @@ declare const resolvers: {
98
98
  LiveBlogPost: {
99
99
  containedIn: (parent: import("../model/CapiResponse").CapiResponse) => Promise<import("../model/CapiResponse").CapiResponse | null>;
100
100
  indicators(parent: import("../model/CapiResponse").CapiResponse): {
101
- accessLevel: "premium" | "subscribed" | "registered" | "free";
102
101
  isOpinion: boolean;
103
102
  };
104
103
  isPinned: (parent: import("../model/CapiResponse").CapiResponse) => boolean;
@@ -276,13 +275,7 @@ declare const resolvers: {
276
275
  theme: (parent: import("../generated").Design) => "special-report" | "extra" | "basic" | "extra-wide" | null;
277
276
  };
278
277
  Indicators: {
279
- accessLevel: (parent: import("../generated").Indicators) => "premium" | "subscribed" | "registered" | "free";
280
278
  isOpinion: (parent: import("../generated").Indicators) => boolean | null;
281
- isColumn: (parent: import("../generated").Indicators) => boolean | null;
282
- isPodcast: (parent: import("../generated").Indicators) => boolean | null;
283
- isEditorsChoice: (parent: import("../generated").Indicators) => boolean | null;
284
- isExclusive: (parent: import("../generated").Indicators) => boolean | null;
285
- isScoop: (parent: import("../generated").Indicators) => boolean | null;
286
279
  };
287
280
  Media: {
288
281
  url: (parent: import("../generated").Media) => string | null;
@@ -56,7 +56,6 @@ const resolvers = {
56
56
  containedIn: (parent) => parent.containedIn(),
57
57
  indicators(parent) {
58
58
  return {
59
- accessLevel: parent.accessLevel(),
60
59
  isOpinion: parent.isOpinion(),
61
60
  };
62
61
  },
@@ -95,14 +94,10 @@ const resolvers = {
95
94
  layout: (parent) => parent.layout ?? null,
96
95
  theme: (parent) => parent.theme ?? null,
97
96
  },
97
+ // TODO:20240829:IM Rename this to ContentIndicators to clearly differentiate
98
+ // it from other Indicators types in the next major release.
98
99
  Indicators: {
99
- accessLevel: (parent) => parent.accessLevel,
100
100
  isOpinion: (parent) => parent.isOpinion ?? null,
101
- isColumn: (parent) => parent.isColumn ?? null,
102
- isPodcast: (parent) => parent.isPodcast ?? null,
103
- isEditorsChoice: (parent) => parent.isEditorsChoice ?? null,
104
- isExclusive: (parent) => parent.isExclusive ?? null,
105
- isScoop: (parent) => parent.isScoop ?? null,
106
101
  },
107
102
  Media: {
108
103
  url: (parent) => parent.url ?? null,
@@ -1 +1 @@
1
- {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/resolvers/content.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/resolvers/content.ts"],"names":[],"mappings":"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"}
@@ -231,6 +231,15 @@ declare const resolvers: {
231
231
  theme: (parent: import("../model/CapiResponse").CapiResponse) => "special-report" | "extra" | "basic" | "extra-wide";
232
232
  title: (parent: import("../model/CapiResponse").CapiResponse) => string;
233
233
  };
234
+ TeaserIndicators: {
235
+ accessLevel: (parent: import("../generated").TeaserIndicators) => "premium" | "subscribed" | "registered" | "free";
236
+ isOpinion: (parent: import("../generated").TeaserIndicators) => boolean | null;
237
+ isColumn: (parent: import("../generated").TeaserIndicators) => boolean | null;
238
+ isPodcast: (parent: import("../generated").TeaserIndicators) => boolean | null;
239
+ isEditorsChoice: (parent: import("../generated").TeaserIndicators) => boolean | null;
240
+ isExclusive: (parent: import("../generated").TeaserIndicators) => boolean | null;
241
+ isScoop: (parent: import("../generated").TeaserIndicators) => boolean | null;
242
+ };
234
243
  ClipFormat: import("./literal-union").LiteralUnionScalar<["standard-inline", "mobile"]>;
235
244
  ImageFormat: import("./literal-union").LiteralUnionScalar<["standard", "standard-inline", "desktop", "mobile", "wide", "square", "square-ftedit", "portrait", "landscape"]>;
236
245
  PackageDesign: import("./literal-union").LiteralUnionScalar<["special-report", "extra", "basic", "extra-wide"]>;
@@ -599,7 +608,6 @@ declare const resolvers: {
599
608
  LiveBlogPost: {
600
609
  containedIn: (parent: import("../model/CapiResponse").CapiResponse) => Promise<import("../model/CapiResponse").CapiResponse | null>;
601
610
  indicators(parent: import("../model/CapiResponse").CapiResponse): {
602
- accessLevel: "premium" | "subscribed" | "registered" | "free";
603
611
  isOpinion: boolean;
604
612
  };
605
613
  isPinned: (parent: import("../model/CapiResponse").CapiResponse) => boolean;
@@ -777,13 +785,7 @@ declare const resolvers: {
777
785
  theme: (parent: import("../generated").Design) => "special-report" | "extra" | "basic" | "extra-wide" | null;
778
786
  };
779
787
  Indicators: {
780
- accessLevel: (parent: import("../generated").Indicators) => "premium" | "subscribed" | "registered" | "free";
781
788
  isOpinion: (parent: import("../generated").Indicators) => boolean | null;
782
- isColumn: (parent: import("../generated").Indicators) => boolean | null;
783
- isPodcast: (parent: import("../generated").Indicators) => boolean | null;
784
- isEditorsChoice: (parent: import("../generated").Indicators) => boolean | null;
785
- isExclusive: (parent: import("../generated").Indicators) => boolean | null;
786
- isScoop: (parent: import("../generated").Indicators) => boolean | null;
787
789
  };
788
790
  Media: {
789
791
  url: (parent: import("../generated").Media) => string | null;
@@ -23,5 +23,14 @@ declare const resolvers: {
23
23
  theme: (parent: import("../model/CapiResponse").CapiResponse) => "special-report" | "extra" | "basic" | "extra-wide";
24
24
  title: (parent: import("../model/CapiResponse").CapiResponse) => string;
25
25
  };
26
+ TeaserIndicators: {
27
+ accessLevel: (parent: import("../generated").TeaserIndicators) => "premium" | "subscribed" | "registered" | "free";
28
+ isOpinion: (parent: import("../generated").TeaserIndicators) => boolean | null;
29
+ isColumn: (parent: import("../generated").TeaserIndicators) => boolean | null;
30
+ isPodcast: (parent: import("../generated").TeaserIndicators) => boolean | null;
31
+ isEditorsChoice: (parent: import("../generated").TeaserIndicators) => boolean | null;
32
+ isExclusive: (parent: import("../generated").TeaserIndicators) => boolean | null;
33
+ isScoop: (parent: import("../generated").TeaserIndicators) => boolean | null;
34
+ };
26
35
  };
27
36
  export default resolvers;
@@ -32,6 +32,15 @@ const resolvers = {
32
32
  theme: (parent) => parent.design().theme,
33
33
  title: (parent) => parent.title(),
34
34
  },
35
+ TeaserIndicators: {
36
+ accessLevel: (parent) => parent.accessLevel,
37
+ isOpinion: (parent) => parent.isOpinion ?? null,
38
+ isColumn: (parent) => parent.isColumn ?? null,
39
+ isPodcast: (parent) => parent.isPodcast ?? null,
40
+ isEditorsChoice: (parent) => parent.isEditorsChoice ?? null,
41
+ isExclusive: (parent) => parent.isExclusive ?? null,
42
+ isScoop: (parent) => parent.isScoop ?? null,
43
+ },
35
44
  };
36
45
  exports.default = resolvers;
37
46
  //# sourceMappingURL=teaser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"teaser.js","sourceRoot":"","sources":["../../src/resolvers/teaser.ts"],"names":[],"mappings":";;AAEA,MAAM,SAAS,GAAG;IAChB,MAAM,EAAE;QACN,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACvC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CACf,MAAM;aACH,IAAI,EAAE;aACN,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;aACzD,KAAK,CAAC,CAAC,CAAC;QACb,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE;QACvC,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;QAC7C,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE;QACnD,sEAAsE;QACtE,6DAA6D;QAC7D,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;QAC1B,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;QACvC,UAAU,CAAC,MAAM;YACf,OAAO;gBACL,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;gBACjC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;gBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;gBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;gBAC7B,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE;gBACzC,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;gBACjC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;aAC1B,CAAA;QACH,CAAC;QACD,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE;QAC3C,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE;QAC3D,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE;QAC3B,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE;QACjD,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK;QACxC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;KAClC;CACoC,CAAA;AAEvC,kBAAe,SAAS,CAAA"}
1
+ {"version":3,"file":"teaser.js","sourceRoot":"","sources":["../../src/resolvers/teaser.ts"],"names":[],"mappings":";;AAEA,MAAM,SAAS,GAAG;IAChB,MAAM,EAAE;QACN,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACvC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CACf,MAAM;aACH,IAAI,EAAE;aACN,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;aACzD,KAAK,CAAC,CAAC,CAAC;QACb,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE;QACvC,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;QAC7C,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE;QACnD,sEAAsE;QACtE,6DAA6D;QAC7D,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;QAC1B,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;QACvC,UAAU,CAAC,MAAM;YACf,OAAO;gBACL,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;gBACjC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;gBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;gBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;gBAC7B,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE;gBACzC,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;gBACjC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;aAC1B,CAAA;QACH,CAAC;QACD,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE;QAC3C,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE;QAC3D,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE;QAC3B,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE;QACjD,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK;QACxC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;KAClC;IACD,gBAAgB,EAAE;QAChB,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW;QAC3C,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI;QAC/C,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI;QAC7C,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI;QAC/C,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI;QAC3D,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI;QACnD,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI;KAC5C;CAIF,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": "3.0.0",
3
+ "version": "3.0.2",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -1,4 +1,6 @@
1
1
  import { AugmentedRequest, CacheOptions } from '@apollo/datasource-rest'
2
+ import * as z from 'zod'
3
+
2
4
  import { InstrumentedRESTDataSource } from './instrumented'
3
5
  import TimeoutError from '../helpers/timeout-error'
4
6
 
@@ -6,6 +8,8 @@ const REQUEST_TIMEOUT = process.env.TWITTER_DATASOURCE_REQUEST_TIMEOUT
6
8
  ? parseInt(process.env.TWITTER_DATASOURCE_REQUEST_TIMEOUT)
7
9
  : 1000
8
10
 
11
+ const Tweet = z.object({ html: z.string() })
12
+
9
13
  export class TwitterDataSource extends InstrumentedRESTDataSource {
10
14
  baseURL = 'https://publish.twitter.com'
11
15
  get backendSystemCode() {
@@ -35,7 +39,7 @@ export class TwitterDataSource extends InstrumentedRESTDataSource {
35
39
  this.timeout = undefined
36
40
  }
37
41
 
38
- return tweet
42
+ return Tweet.parse(tweet)
39
43
  }
40
44
 
41
45
  cacheOptionsFor(): CacheOptions {
@@ -1019,22 +1019,9 @@ export type ImageWideSourceSetArgs = {
1019
1019
  width?: InputMaybe<Scalars['Int']['input']>;
1020
1020
  };
1021
1021
 
1022
- /** Indicators are used to determine teaser styling. */
1023
1022
  export type Indicators = {
1024
- /** The access level of the teaser, eg. 'free' or 'premium'. */
1025
- readonly accessLevel: Scalars['AccessLevel']['output'];
1026
- /** Whether the teaser is a column, ie. has one author. */
1027
- readonly isColumn?: Maybe<Scalars['Boolean']['output']>;
1028
- /** Whether the teaser is an editor's choice. */
1029
- readonly isEditorsChoice?: Maybe<Scalars['Boolean']['output']>;
1030
- /** Whether the teaser is exclusive. */
1031
- readonly isExclusive?: Maybe<Scalars['Boolean']['output']>;
1032
- /** Whether the teaser is an opinion piece. */
1023
+ /** Whether the content is an opinion piece. */
1033
1024
  readonly isOpinion?: Maybe<Scalars['Boolean']['output']>;
1034
- /** Whether the teaser is a podcast. */
1035
- readonly isPodcast?: Maybe<Scalars['Boolean']['output']>;
1036
- /** Whether the teaser is a scoop. */
1037
- readonly isScoop?: Maybe<Scalars['Boolean']['output']>;
1038
1025
  };
1039
1026
 
1040
1027
  export type LayoutImage = Reference & {
@@ -1627,7 +1614,7 @@ export type Teaser = {
1627
1614
  /** The image to be used as a thumbnail for the teaser. */
1628
1615
  readonly image?: Maybe<Image>;
1629
1616
  /** An object containing a map of indicator items to boolean values, eg. accessLevel, isOpinion. */
1630
- readonly indicators: Indicators;
1617
+ readonly indicators: TeaserIndicators;
1631
1618
  /** An object containing the metadata details of the teaser, eg. id, url, prefLabel. */
1632
1619
  readonly metaAltLink?: Maybe<MetaLink>;
1633
1620
  /** An object containing the metadata details of the teaser, eg. id, url, prefLabel. */
@@ -1655,6 +1642,24 @@ export type TeaserUrlArgs = {
1655
1642
  relative?: InputMaybe<Scalars['Boolean']['input']>;
1656
1643
  };
1657
1644
 
1645
+ /** Indicators are used to determine teaser styling. */
1646
+ export type TeaserIndicators = {
1647
+ /** The access level of the teaser, eg. 'free' or 'premium'. */
1648
+ readonly accessLevel: Scalars['AccessLevel']['output'];
1649
+ /** Whether the teaser is a column, ie. has one author. */
1650
+ readonly isColumn?: Maybe<Scalars['Boolean']['output']>;
1651
+ /** Whether the teaser is an editor's choice. */
1652
+ readonly isEditorsChoice?: Maybe<Scalars['Boolean']['output']>;
1653
+ /** Whether the teaser is exclusive. */
1654
+ readonly isExclusive?: Maybe<Scalars['Boolean']['output']>;
1655
+ /** Whether the teaser is an opinion piece. */
1656
+ readonly isOpinion?: Maybe<Scalars['Boolean']['output']>;
1657
+ /** Whether the teaser is a podcast. */
1658
+ readonly isPodcast?: Maybe<Scalars['Boolean']['output']>;
1659
+ /** Whether the teaser is a scoop. */
1660
+ readonly isScoop?: Maybe<Scalars['Boolean']['output']>;
1661
+ };
1662
+
1658
1663
  export type Topper = {
1659
1664
  /** Whether the topper should have a background box. */
1660
1665
  readonly backgroundBox?: Maybe<Scalars['Boolean']['output']>;
@@ -1741,7 +1746,7 @@ export type TopperWithTheme = {
1741
1746
 
1742
1747
  export type Tweet = Reference & {
1743
1748
  /** The raw HTML of the tweet. */
1744
- readonly html: Scalars['String']['output'];
1749
+ readonly html?: Maybe<Scalars['String']['output']>;
1745
1750
  /** The type of the reference, eg. 'tweet'. */
1746
1751
  readonly type: Scalars['String']['output'];
1747
1752
  };
@@ -1998,6 +2003,7 @@ export type ResolversTypes = ResolversObject<{
1998
2003
  StructuredContent: ResolverTypeWrapper<Omit<StructuredContent, 'references'> & { references: ReadonlyArray<ResolversTypes['Reference']> }>;
1999
2004
  TableOfContents: ResolverTypeWrapper<TableOfContents>;
2000
2005
  Teaser: ResolverTypeWrapper<CapiResponse>;
2006
+ TeaserIndicators: ResolverTypeWrapper<TeaserIndicators>;
2001
2007
  Topper: ResolverTypeWrapper<TopperModel>;
2002
2008
  TopperBackgroundColour: ResolverTypeWrapper<Scalars['TopperBackgroundColour']['output']>;
2003
2009
  TopperWithBrand: ResolverTypeWrapper<TopperModel>;
@@ -2095,6 +2101,7 @@ export type ResolversParentTypes = ResolversObject<{
2095
2101
  StructuredContent: Omit<StructuredContent, 'references'> & { references: ReadonlyArray<ResolversParentTypes['Reference']> };
2096
2102
  TableOfContents: TableOfContents;
2097
2103
  Teaser: CapiResponse;
2104
+ TeaserIndicators: TeaserIndicators;
2098
2105
  Topper: TopperModel;
2099
2106
  TopperBackgroundColour: Scalars['TopperBackgroundColour']['output'];
2100
2107
  TopperWithBrand: TopperModel;
@@ -2631,13 +2638,7 @@ export type ImageWideResolvers<ContextType = QueryContext, ParentType extends Re
2631
2638
  }>;
2632
2639
 
2633
2640
  export type IndicatorsResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Indicators'] = ResolversParentTypes['Indicators']> = ResolversObject<{
2634
- accessLevel: Resolver<ResolversTypes['AccessLevel'], ParentType, ContextType>;
2635
- isColumn: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2636
- isEditorsChoice: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2637
- isExclusive: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2638
2641
  isOpinion: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2639
- isPodcast: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2640
- isScoop: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2641
2642
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2642
2643
  }>;
2643
2644
 
@@ -2977,7 +2978,7 @@ export type TeaserResolvers<ContextType = QueryContext, ParentType extends Resol
2977
2978
  firstPublishedDate: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2978
2979
  id: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2979
2980
  image: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
2980
- indicators: Resolver<ResolversTypes['Indicators'], ParentType, ContextType>;
2981
+ indicators: Resolver<ResolversTypes['TeaserIndicators'], ParentType, ContextType>;
2981
2982
  metaAltLink: Resolver<Maybe<ResolversTypes['MetaLink']>, ParentType, ContextType>;
2982
2983
  metaLink: Resolver<Maybe<ResolversTypes['MetaLink']>, ParentType, ContextType>;
2983
2984
  metaPrefixText: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -2991,6 +2992,17 @@ export type TeaserResolvers<ContextType = QueryContext, ParentType extends Resol
2991
2992
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2992
2993
  }>;
2993
2994
 
2995
+ export type TeaserIndicatorsResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['TeaserIndicators'] = ResolversParentTypes['TeaserIndicators']> = ResolversObject<{
2996
+ accessLevel: Resolver<ResolversTypes['AccessLevel'], ParentType, ContextType>;
2997
+ isColumn: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2998
+ isEditorsChoice: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2999
+ isExclusive: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
3000
+ isOpinion: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
3001
+ isPodcast: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
3002
+ isScoop: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
3003
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
3004
+ }>;
3005
+
2994
3006
  export type TopperResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Topper'] = ResolversParentTypes['Topper']> = ResolversObject<{
2995
3007
  __resolveType?: TypeResolveFn<'BasicTopper' | 'BrandedTopper' | 'DeepLandscapeTopper' | 'DeepPortraitTopper' | 'FullBleedTopper' | 'OpinionTopper' | 'PartnerContentTopper' | 'PodcastTopper' | 'SplitTextTopper' | 'TopperWithFlourish', ParentType, ContextType>;
2996
3008
  backgroundBox: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
@@ -3052,7 +3064,7 @@ export type TopperWithThemeResolvers<ContextType = QueryContext, ParentType exte
3052
3064
  }>;
3053
3065
 
3054
3066
  export type TweetResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Tweet'] = ResolversParentTypes['Tweet']> = ResolversObject<{
3055
- html: Resolver<ResolversTypes['String'], ParentType, ContextType>;
3067
+ html: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
3056
3068
  type: Resolver<ResolversTypes['String'], ParentType, ContextType>;
3057
3069
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
3058
3070
  }>;
@@ -3172,6 +3184,7 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
3172
3184
  StructuredContent: StructuredContentResolvers<ContextType>;
3173
3185
  TableOfContents: TableOfContentsResolvers<ContextType>;
3174
3186
  Teaser: TeaserResolvers<ContextType>;
3187
+ TeaserIndicators: TeaserIndicatorsResolvers<ContextType>;
3175
3188
  Topper: TopperResolvers<ContextType>;
3176
3189
  TopperBackgroundColour: GraphQLScalarType;
3177
3190
  TopperWithBrand: TopperWithBrandResolvers<ContextType>;
@@ -78,7 +78,6 @@ const resolvers = {
78
78
  containedIn: (parent) => parent.containedIn(),
79
79
  indicators(parent) {
80
80
  return {
81
- accessLevel: parent.accessLevel(),
82
81
  isOpinion: parent.isOpinion(),
83
82
  }
84
83
  },
@@ -125,14 +124,10 @@ const resolvers = {
125
124
  theme: (parent) => parent.theme ?? null,
126
125
  },
127
126
 
127
+ // TODO:20240829:IM Rename this to ContentIndicators to clearly differentiate
128
+ // it from other Indicators types in the next major release.
128
129
  Indicators: {
129
- accessLevel: (parent) => parent.accessLevel,
130
130
  isOpinion: (parent) => parent.isOpinion ?? null,
131
- isColumn: (parent) => parent.isColumn ?? null,
132
- isPodcast: (parent) => parent.isPodcast ?? null,
133
- isEditorsChoice: (parent) => parent.isEditorsChoice ?? null,
134
- isExclusive: (parent) => parent.isExclusive ?? null,
135
- isScoop: (parent) => parent.isScoop ?? null,
136
131
  },
137
132
 
138
133
  Media: {
@@ -1,4 +1,4 @@
1
- import { TeaserResolvers } from '../generated'
1
+ import { TeaserResolvers, TeaserIndicatorsResolvers } from '../generated'
2
2
 
3
3
  const resolvers = {
4
4
  Teaser: {
@@ -33,6 +33,18 @@ const resolvers = {
33
33
  theme: (parent) => parent.design().theme,
34
34
  title: (parent) => parent.title(),
35
35
  },
36
- } satisfies { Teaser: TeaserResolvers }
36
+ TeaserIndicators: {
37
+ accessLevel: (parent) => parent.accessLevel,
38
+ isOpinion: (parent) => parent.isOpinion ?? null,
39
+ isColumn: (parent) => parent.isColumn ?? null,
40
+ isPodcast: (parent) => parent.isPodcast ?? null,
41
+ isEditorsChoice: (parent) => parent.isEditorsChoice ?? null,
42
+ isExclusive: (parent) => parent.isExclusive ?? null,
43
+ isScoop: (parent) => parent.isScoop ?? null,
44
+ },
45
+ } satisfies {
46
+ Teaser: TeaserResolvers
47
+ TeaserIndicators: TeaserIndicatorsResolvers
48
+ }
37
49
 
38
50
  export default resolvers