@financial-times/cp-content-pipeline-schema 3.7.2 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/lib/datasources/capi.d.ts +4 -4
  3. package/lib/datasources/capi.js +4 -4
  4. package/lib/datasources/capi.js.map +1 -1
  5. package/lib/datasources/capi.test.js +3 -3
  6. package/lib/datasources/capi.test.js.map +1 -1
  7. package/lib/fixtures/dummyContext.js +2 -2
  8. package/lib/fixtures/dummyContext.js.map +1 -1
  9. package/lib/generated/index.d.ts +41 -23
  10. package/lib/model/Byline.d.ts +2 -2
  11. package/lib/model/Byline.js.map +1 -1
  12. package/lib/model/{CapiResponse.d.ts → Content.d.ts} +13 -12
  13. package/lib/model/{CapiResponse.js → Content.js} +14 -7
  14. package/lib/model/Content.js.map +1 -0
  15. package/lib/model/{CapiResponse.test.js → Content.test.js} +56 -15
  16. package/lib/model/Content.test.js.map +1 -0
  17. package/lib/model/LeadFlourish.d.ts +2 -2
  18. package/lib/model/LeadFlourish.js.map +1 -1
  19. package/lib/model/LeadFlourish.test.js +3 -3
  20. package/lib/model/LeadFlourish.test.js.map +1 -1
  21. package/lib/model/{CapiList.d.ts → List.d.ts} +5 -5
  22. package/lib/model/{CapiList.js → List.js} +5 -5
  23. package/lib/model/List.js.map +1 -0
  24. package/lib/model/RichText.d.ts +2 -2
  25. package/lib/model/RichText.js.map +1 -1
  26. package/lib/model/Topper.d.ts +2 -2
  27. package/lib/model/Topper.js.map +1 -1
  28. package/lib/model/Topper.test.js +22 -22
  29. package/lib/model/Topper.test.js.map +1 -1
  30. package/lib/model/schemas/capi/article.d.ts +5 -1
  31. package/lib/model/schemas/capi/article.js +1 -0
  32. package/lib/model/schemas/capi/article.js.map +1 -1
  33. package/lib/model/schemas/capi/audio.d.ts +5 -1
  34. package/lib/model/schemas/capi/audio.js +1 -0
  35. package/lib/model/schemas/capi/audio.js.map +1 -1
  36. package/lib/model/schemas/capi/base-schema.d.ts +5 -0
  37. package/lib/model/schemas/capi/base-schema.js +1 -0
  38. package/lib/model/schemas/capi/base-schema.js.map +1 -1
  39. package/lib/model/schemas/capi/content-package.d.ts +5 -1
  40. package/lib/model/schemas/capi/content-package.js +1 -0
  41. package/lib/model/schemas/capi/content-package.js.map +1 -1
  42. package/lib/model/schemas/capi/custom-code-component.d.ts +3 -0
  43. package/lib/model/schemas/capi/index.d.ts +28 -5
  44. package/lib/model/schemas/capi/live-blog-package.d.ts +5 -1
  45. package/lib/model/schemas/capi/live-blog-package.js +1 -0
  46. package/lib/model/schemas/capi/live-blog-package.js.map +1 -1
  47. package/lib/model/schemas/capi/placeholder.d.ts +5 -1
  48. package/lib/model/schemas/capi/placeholder.js +1 -0
  49. package/lib/model/schemas/capi/placeholder.js.map +1 -1
  50. package/lib/model/schemas/capi/video.d.ts +5 -1
  51. package/lib/model/schemas/capi/video.js +1 -0
  52. package/lib/model/schemas/capi/video.js.map +1 -1
  53. package/lib/resolvers/content-tree/references/CustomCodeComponent.js.map +1 -1
  54. package/lib/resolvers/content-tree/references/Recommended.d.ts +1 -1
  55. package/lib/resolvers/content-tree/references/index.d.ts +2 -2
  56. package/lib/resolvers/content-tree/tagMappings.d.ts +2 -2
  57. package/lib/resolvers/content-tree/tagMappings.js.map +1 -1
  58. package/lib/resolvers/content-tree/updateTreeWithReferenceIds.d.ts +2 -2
  59. package/lib/resolvers/content-tree/updateTreeWithReferenceIds.js.map +1 -1
  60. package/lib/resolvers/content.d.ts +251 -235
  61. package/lib/resolvers/content.js +27 -0
  62. package/lib/resolvers/content.js.map +1 -1
  63. package/lib/resolvers/core.d.ts +4 -4
  64. package/lib/resolvers/core.js +12 -2
  65. package/lib/resolvers/core.js.map +1 -1
  66. package/lib/resolvers/index.d.ts +276 -260
  67. package/lib/resolvers/list.d.ts +9 -9
  68. package/lib/resolvers/teaser.d.ts +13 -13
  69. package/package.json +1 -1
  70. package/queries/article.graphql +19 -0
  71. package/src/datasources/capi.test.ts +3 -3
  72. package/src/datasources/capi.ts +6 -9
  73. package/src/fixtures/dummyContext.ts +2 -2
  74. package/src/generated/index.ts +41 -23
  75. package/src/model/Byline.ts +2 -2
  76. package/src/model/{CapiResponse.test.ts → Content.test.ts} +65 -17
  77. package/src/model/{CapiResponse.ts → Content.ts} +24 -17
  78. package/src/model/LeadFlourish.test.ts +6 -5
  79. package/src/model/LeadFlourish.ts +2 -5
  80. package/src/model/{CapiList.ts → List.ts} +5 -5
  81. package/src/model/RichText.ts +2 -2
  82. package/src/model/Topper.test.ts +23 -26
  83. package/src/model/Topper.ts +2 -5
  84. package/src/model/schemas/capi/article.ts +1 -0
  85. package/src/model/schemas/capi/audio.ts +1 -0
  86. package/src/model/schemas/capi/base-schema.ts +1 -0
  87. package/src/model/schemas/capi/content-package.ts +1 -0
  88. package/src/model/schemas/capi/live-blog-package.ts +1 -0
  89. package/src/model/schemas/capi/placeholder.ts +1 -0
  90. package/src/model/schemas/capi/video.ts +1 -0
  91. package/src/resolvers/content-tree/references/CustomCodeComponent.ts +2 -2
  92. package/src/resolvers/content-tree/references/index.ts +2 -2
  93. package/src/resolvers/content-tree/tagMappings.ts +2 -2
  94. package/src/resolvers/content-tree/updateTreeWithReferenceIds.ts +2 -2
  95. package/src/resolvers/content.ts +27 -0
  96. package/src/resolvers/core.ts +12 -2
  97. package/tsconfig.tsbuildinfo +1 -1
  98. package/typedefs/content.graphql +19 -1
  99. package/lib/model/CapiList.js.map +0 -1
  100. package/lib/model/CapiResponse.js.map +0 -1
  101. package/lib/model/CapiResponse.test.js.map +0 -1
  102. /package/lib/model/{CapiResponse.test.d.ts → Content.test.d.ts} +0 -0
@@ -1,14 +1,14 @@
1
1
  declare const _default: {
2
2
  List: {
3
- id: (parent: import("../model/CapiList").CapiList) => string;
4
- apiUrl: (parent: import("../model/CapiList").CapiList) => string;
5
- title: (parent: import("../model/CapiList").CapiList) => string;
6
- items: (parent: import("../model/CapiList").CapiList) => Promise<import("../model/CapiResponse").CapiResponse[]>;
7
- listType: (parent: import("../model/CapiList").CapiList) => "OpinionAnalysis" | "Promotional" | "Recommended" | "TopStories" | "TopStoriesBeta" | "KeyDevelopments";
8
- publishedDate: (parent: import("../model/CapiList").CapiList) => string;
9
- layoutHint: (parent: import("../model/CapiList").CapiList) => "landscape" | "standaloneimage" | "bigstory" | "assassination" | null;
10
- publication: (parent: import("../model/CapiList").CapiList) => string[] | null;
11
- publishReference: (parent: import("../model/CapiList").CapiList) => string | null;
3
+ id: (parent: import("../model/List").List) => string;
4
+ apiUrl: (parent: import("../model/List").List) => string;
5
+ title: (parent: import("../model/List").List) => string;
6
+ items: (parent: import("../model/List").List) => Promise<import("../model/Content").Content[]>;
7
+ listType: (parent: import("../model/List").List) => "OpinionAnalysis" | "Promotional" | "Recommended" | "TopStories" | "TopStoriesBeta" | "KeyDevelopments";
8
+ publishedDate: (parent: import("../model/List").List) => string;
9
+ layoutHint: (parent: import("../model/List").List) => "landscape" | "standaloneimage" | "bigstory" | "assassination" | null;
10
+ publication: (parent: import("../model/List").List) => string[] | null;
11
+ publishReference: (parent: import("../model/List").List) => string | null;
12
12
  };
13
13
  };
14
14
  export default _default;
@@ -1,13 +1,13 @@
1
1
  declare const resolvers: {
2
2
  Teaser: {
3
- url: (parent: import("../model/CapiResponse").CapiResponse, args: Partial<import("../generated").TeaserUrlArgs>) => Promise<string>;
4
- type: (parent: import("../model/CapiResponse").CapiResponse) => string;
5
- metaLink: (parent: import("../model/CapiResponse").CapiResponse) => Promise<import("../model/Concept").Concept | import("../model/CapiResponse").CapiResponse | null>;
6
- metaAltLink: (parent: import("../model/CapiResponse").CapiResponse) => Promise<import("../model/Concept").Concept | null>;
7
- metaPrefixText: (parent: import("../model/CapiResponse").CapiResponse) => Promise<string | null>;
3
+ url: (parent: import("../model/Content").Content, args: Partial<import("../generated").TeaserUrlArgs>) => Promise<string>;
4
+ type: (parent: import("../model/Content").Content) => string;
5
+ metaLink: (parent: import("../model/Content").Content) => Promise<import("../model/Concept").Concept | import("../model/Content").Content | null>;
6
+ metaAltLink: (parent: import("../model/Content").Content) => Promise<import("../model/Concept").Concept | null>;
7
+ metaPrefixText: (parent: import("../model/Content").Content) => Promise<string | null>;
8
8
  metaSuffixText: () => null;
9
- image: (parent: import("../model/CapiResponse").CapiResponse) => import("../model/Image").CAPIImage | null;
10
- indicators(parent: import("../model/CapiResponse").CapiResponse): {
9
+ image: (parent: import("../model/Content").Content) => import("../model/Image").CAPIImage | null;
10
+ indicators(parent: import("../model/Content").Content): {
11
11
  accessLevel: "premium" | "subscribed" | "registered" | "free";
12
12
  isOpinion: boolean;
13
13
  isColumn: boolean;
@@ -16,12 +16,12 @@ declare const resolvers: {
16
16
  isExclusive: boolean;
17
17
  isScoop: boolean;
18
18
  };
19
- standfirst: (parent: import("../model/CapiResponse").CapiResponse) => string | null;
20
- firstPublishedDate: (parent: import("../model/CapiResponse").CapiResponse) => string;
21
- id: (parent: import("../model/CapiResponse").CapiResponse) => string;
22
- publishedDate: (parent: import("../model/CapiResponse").CapiResponse) => string;
23
- theme: (parent: import("../model/CapiResponse").CapiResponse) => "special-report" | "extra" | "basic" | "extra-wide";
24
- title: (parent: import("../model/CapiResponse").CapiResponse) => string;
19
+ standfirst: (parent: import("../model/Content").Content) => string | null;
20
+ firstPublishedDate: (parent: import("../model/Content").Content) => string;
21
+ id: (parent: import("../model/Content").Content) => string;
22
+ publishedDate: (parent: import("../model/Content").Content) => string;
23
+ theme: (parent: import("../model/Content").Content) => "special-report" | "extra" | "basic" | "extra-wide";
24
+ title: (parent: import("../model/Content").Content) => string;
25
25
  };
26
26
  TeaserIndicators: {
27
27
  accessLevel: (parent: import("../generated").TeaserIndicators) => "premium" | "subscribed" | "registered" | "free";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@financial-times/cp-content-pipeline-schema",
3
- "version": "3.7.2",
3
+ "version": "3.8.0",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -506,6 +506,7 @@ fragment Media on Media {
506
506
 
507
507
  fragment Indicators on Indicators {
508
508
  isOpinion
509
+ isFTEdit
509
510
  }
510
511
 
511
512
  fragment BylineAuthor on AuthorReference {
@@ -649,12 +650,16 @@ fragment ArticleFields on Content {
649
650
  clientName
650
651
  indicators {
651
652
  isPartnerContent
653
+ isFTEdit
652
654
  }
653
655
  }
654
656
  ... on Placeholder {
655
657
  containedIn {
656
658
  ...PackageContainer
657
659
  }
660
+ indicators {
661
+ isFTEdit
662
+ }
658
663
  }
659
664
  ... on LiveBlogPost {
660
665
  containedIn {
@@ -687,17 +692,31 @@ fragment ArticleFields on Content {
687
692
  ...PinnedPost
688
693
  }
689
694
  realtime
695
+ indicators {
696
+ isFTEdit
697
+ }
690
698
  }
691
699
  ... on ContentPackage {
692
700
  contains {
693
701
  ...Teaser
694
702
  standfirst
695
703
  }
704
+ indicators {
705
+ isFTEdit
706
+ }
696
707
  }
697
708
  ... on Audio {
698
709
  media {
699
710
  ...Media
700
711
  }
712
+ indicators {
713
+ isFTEdit
714
+ }
715
+ }
716
+ ... on Video {
717
+ indicators {
718
+ isFTEdit
719
+ }
701
720
  }
702
721
  }
703
722
 
@@ -2,7 +2,7 @@ import { Logger } from '@dotcom-reliability-kit/logger'
2
2
  import { CapiDataSource } from './capi'
3
3
  import { QueryContext } from '..'
4
4
  import { KeyValueCache } from '@apollo/utils.keyvaluecache'
5
- import { CapiResponse } from '../model/CapiResponse'
5
+ import { Content } from '../model/Content'
6
6
  import { ContentTypeSchemas } from '../model/schemas/capi/internal-content'
7
7
 
8
8
  const logger = new Logger()
@@ -38,10 +38,10 @@ describe('CapiDataSource', () => {
38
38
  )
39
39
 
40
40
  jest
41
- .spyOn(CapiResponse, 'fromJSON')
41
+ .spyOn(Content, 'fromJSON')
42
42
  .mockImplementation(
43
43
  (content, context) =>
44
- new CapiResponse(content as ContentTypeSchemas, context)
44
+ new Content(content as ContentTypeSchemas, context)
45
45
  )
46
46
  })
47
47
 
@@ -1,11 +1,11 @@
1
- import { CapiResponse } from '../model/CapiResponse'
1
+ import { Content } from '../model/Content'
2
2
  import { InstrumentedRESTDataSource } from './instrumented'
3
3
  import { AugmentedRequest } from '@apollo/datasource-rest'
4
4
  import {
5
5
  KeyValueCache,
6
6
  PrefixingKeyValueCache,
7
7
  } from '@apollo/utils.keyvaluecache'
8
- import { CapiList } from '../model/CapiList'
8
+ import { List } from '../model/List'
9
9
  import { Person } from '../model/Person'
10
10
 
11
11
  const REQUEST_TIMEOUT = process.env.CAPI_DATASOURCE_REQUEST_TIMEOUT
@@ -46,10 +46,7 @@ export class CapiDataSource extends InstrumentedRESTDataSource {
46
46
  request.headers['x-api-key'] = this.capiKey
47
47
  }
48
48
 
49
- async getContent(
50
- uuid: string,
51
- packageContainer?: CapiResponse
52
- ): Promise<CapiResponse> {
49
+ async getContent(uuid: string, packageContainer?: Content): Promise<Content> {
53
50
  this.context.addSurrogateKeys([
54
51
  {
55
52
  prefix: 'contentPipelineArticle',
@@ -63,7 +60,7 @@ export class CapiDataSource extends InstrumentedRESTDataSource {
63
60
  this.context.contentRequestedOnce = true
64
61
  this.calls.push(uuid)
65
62
 
66
- return CapiResponse.fromJSON(content, this.context, packageContainer)
63
+ return Content.fromJSON(content, this.context, packageContainer)
67
64
  }
68
65
 
69
66
  async getPerson(uuid: string): Promise<Person> {
@@ -74,7 +71,7 @@ export class CapiDataSource extends InstrumentedRESTDataSource {
74
71
  return Person.fromJson(person, this.context)
75
72
  }
76
73
 
77
- async getList(uuid: string): Promise<CapiList> {
74
+ async getList(uuid: string): Promise<List> {
78
75
  this.context.addSurrogateKeys([
79
76
  {
80
77
  prefix: 'contentPipelineList',
@@ -83,7 +80,7 @@ export class CapiDataSource extends InstrumentedRESTDataSource {
83
80
  ])
84
81
 
85
82
  const list = await this.get(`lists/${uuid}`)
86
- return CapiList.fromJSON(list, this.context)
83
+ return List.fromJSON(list, this.context)
87
84
  }
88
85
 
89
86
  // replicates the logic implicit in PrefixingKeyValueCache to
@@ -1,4 +1,4 @@
1
- import { CapiResponse } from '../model/CapiResponse'
1
+ import { Content } from '../model/Content'
2
2
  import { baseCapiObject } from './capiObject'
3
3
  import cloneDeep from 'clone-deep'
4
4
  import { QueryContext } from '..'
@@ -18,7 +18,7 @@ export default {
18
18
  capi: {
19
19
  getContent: (id: string) =>
20
20
  Promise.resolve(
21
- new CapiResponse(
21
+ new Content(
22
22
  cloneDeep({
23
23
  ...baseCapiObject,
24
24
  id,
@@ -1,8 +1,8 @@
1
1
  import type { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql';
2
2
  import type { Concept as ConceptModel } from '../model/Concept';
3
3
  import type { Person as PersonModel } from '../model/Person';
4
- import type { CapiList } from '../model/CapiList';
5
- import type { CapiResponse } from '../model/CapiResponse';
4
+ import type { List as ListModel } from '../model/List';
5
+ import type { Content as ContentModel } from '../model/Content';
6
6
  import type { Image as ImageModel } from '../model/Image';
7
7
  import type { Clip as ClipModel } from '../model/Clip';
8
8
  import type { Picture as PictureModel } from '../model/Picture';
@@ -168,6 +168,8 @@ export type Audio = Content & {
168
168
  readonly firstPublishedDate: Scalars['String']['output'];
169
169
  /** The unique identifier of the article - a uuid or a url. */
170
170
  readonly id: Scalars['ID']['output'];
171
+ /** An object of several flags indicating the nature of the content, eg. if it's in an FT Edit edition */
172
+ readonly indicators?: Maybe<Indicators>;
171
173
  /** The concept to use for instant alert CTAs. */
172
174
  readonly instantAlertConcept?: Maybe<Concept>;
173
175
  /** An image object containing the url and the caption, to be displayed usually before the article content. */
@@ -558,6 +560,8 @@ export type ContentPackage = Content & {
558
560
  readonly firstPublishedDate: Scalars['String']['output'];
559
561
  /** The unique identifier of the article - a uuid or a url. */
560
562
  readonly id: Scalars['ID']['output'];
563
+ /** An object of several flags indicating the nature of the content, eg. if it's in an FT Edit edition */
564
+ readonly indicators?: Maybe<Indicators>;
561
565
  /** The concept to use for instant alert CTAs. */
562
566
  readonly instantAlertConcept?: Maybe<Concept>;
563
567
  /** An image object containing the url and the caption, to be displayed usually before the article content. */
@@ -1050,6 +1054,8 @@ export type ImageWideSourceSetArgs = {
1050
1054
  };
1051
1055
 
1052
1056
  export type Indicators = {
1057
+ /** Whether the article is included in an FT Edit editorial curation. */
1058
+ readonly isFTEdit?: Maybe<Scalars['Boolean']['output']>;
1053
1059
  /** Whether the content is an opinion piece. */
1054
1060
  readonly isOpinion?: Maybe<Scalars['Boolean']['output']>;
1055
1061
  /** Whether the content is Commercial Partner Content. */
@@ -1121,6 +1127,8 @@ export type LiveBlogPackage = Content & {
1121
1127
  readonly firstPublishedDate: Scalars['String']['output'];
1122
1128
  /** The unique identifier of the article - a uuid or a url. */
1123
1129
  readonly id: Scalars['ID']['output'];
1130
+ /** An object of flags indicating the nature of the content, eg. if it's in an FT Edit edition */
1131
+ readonly indicators?: Maybe<Indicators>;
1124
1132
  /** The concept to use for instant alert CTAs. */
1125
1133
  readonly instantAlertConcept?: Maybe<Concept>;
1126
1134
  /** The child articles of this live blog package. */
@@ -1220,7 +1228,7 @@ export type LiveBlogPost = Content & {
1220
1228
  readonly firstPublishedDate: Scalars['String']['output'];
1221
1229
  /** The unique identifier of the article - a uuid or a url. */
1222
1230
  readonly id: Scalars['ID']['output'];
1223
- /** An object indicating whether the article is an opinion piece. */
1231
+ /** An object of several flags indicating the nature of the content, eg. if it's in an FT Edit edition */
1224
1232
  readonly indicators?: Maybe<Indicators>;
1225
1233
  /** The concept to use for instant alert CTAs. */
1226
1234
  readonly instantAlertConcept?: Maybe<Concept>;
@@ -1481,6 +1489,8 @@ export type Placeholder = Content & {
1481
1489
  readonly firstPublishedDate: Scalars['String']['output'];
1482
1490
  /** The unique identifier of the article - a uuid or a url. */
1483
1491
  readonly id: Scalars['ID']['output'];
1492
+ /** An object of several flags indicating the nature of the content, eg. if it's in an FT Edit edition */
1493
+ readonly indicators?: Maybe<Indicators>;
1484
1494
  /** The concept to use for instant alert CTAs. */
1485
1495
  readonly instantAlertConcept?: Maybe<Concept>;
1486
1496
  /** An image object containing the url and the caption, to be displayed usually before the article content. */
@@ -1844,6 +1854,8 @@ export type Video = Content & {
1844
1854
  readonly firstPublishedDate: Scalars['String']['output'];
1845
1855
  /** The unique identifier of the article - a uuid or a url. */
1846
1856
  readonly id: Scalars['ID']['output'];
1857
+ /** An object of several flags indicating the nature of the content, eg. if it's in an FT Edit edition */
1858
+ readonly indicators?: Maybe<Indicators>;
1847
1859
  /** The concept to use for instant alert CTAs. */
1848
1860
  readonly instantAlertConcept?: Maybe<Concept>;
1849
1861
  /** An image object containing the url and the caption, to be displayed usually before the article content. */
@@ -1967,13 +1979,13 @@ export type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs
1967
1979
 
1968
1980
  /** Mapping of union types */
1969
1981
  export type ResolversUnionTypes<RefType extends Record<string, unknown>> = ResolversObject<{
1970
- MetaLink: ( ConceptModel ) | ( CapiResponse );
1982
+ MetaLink: ( ConceptModel ) | ( ContentModel );
1971
1983
  }>;
1972
1984
 
1973
1985
  /** Mapping of interface types */
1974
1986
  export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = ResolversObject<{
1975
1987
  ConceptInterface: ( ConceptModel ) | ( ConceptModel );
1976
- Content: ( CapiResponse ) | ( CapiResponse ) | ( CapiResponse ) | ( CapiResponse ) | ( CapiResponse ) | ( CapiResponse ) | ( CapiResponse );
1988
+ Content: ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel );
1977
1989
  Image: ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel );
1978
1990
  Picture: ( PictureModel ) | ( PictureModel ) | ( PictureModel );
1979
1991
  Reference: ( ReferenceWithCAPIData<AuthorNode> ) | ( ReferenceWithCAPIData<ClipSetNode|OldClipNode> ) | ( ReferenceWithCAPIData<ContentTree.CustomCodeComponent> ) | ( ReferenceWithCAPIData<ContentTree.Flourish> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<ContentTree.LayoutImage> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<RawImageNode> ) | ( ReferenceWithCAPIData<ContentTree.Recommended> ) | ( ReferenceWithCAPIData<ContentTree.ScrollyImage> ) | ( ReferenceWithCAPIData<ContentTree.Tweet> ) | ( ReferenceWithCAPIData<VideoNode> );
@@ -1991,8 +2003,8 @@ export type ResolversTypes = ResolversObject<{
1991
2003
  Accessibility: ResolverTypeWrapper<Omit<Accessibility, 'transcript'> & { transcript: Maybe<ResolversTypes['RichText']> }>;
1992
2004
  AltStandfirst: ResolverTypeWrapper<AltStandfirst>;
1993
2005
  AltTitle: ResolverTypeWrapper<AltTitle>;
1994
- Article: ResolverTypeWrapper<CapiResponse>;
1995
- Audio: ResolverTypeWrapper<CapiResponse>;
2006
+ Article: ResolverTypeWrapper<ContentModel>;
2007
+ Audio: ResolverTypeWrapper<ContentModel>;
1996
2008
  Author: ResolverTypeWrapper<ConceptModel>;
1997
2009
  AuthorReference: ResolverTypeWrapper<ReferenceWithCAPIData<AuthorNode>>;
1998
2010
  BasicTopper: ResolverTypeWrapper<TopperModel>;
@@ -2009,7 +2021,7 @@ export type ResolversTypes = ResolversObject<{
2009
2021
  Content: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Content']>;
2010
2022
  ContentConnection: ResolverTypeWrapper<Omit<ContentConnection, 'edges'> & { edges: ReadonlyArray<Maybe<ResolversTypes['ContentEdge']>> }>;
2011
2023
  ContentEdge: ResolverTypeWrapper<Omit<ContentEdge, 'node'> & { node: Maybe<ResolversTypes['Content']> }>;
2012
- ContentPackage: ResolverTypeWrapper<CapiResponse>;
2024
+ ContentPackage: ResolverTypeWrapper<ContentModel>;
2013
2025
  ContentType: ResolverTypeWrapper<Scalars['ContentType']['output']>;
2014
2026
  CustomCodeComponent: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.CustomCodeComponent>>;
2015
2027
  DeepLandscapeTopper: ResolverTypeWrapper<TopperModel>;
@@ -2041,10 +2053,10 @@ export type ResolversTypes = ResolversObject<{
2041
2053
  LayoutHint: ResolverTypeWrapper<Scalars['LayoutHint']['output']>;
2042
2054
  LayoutImage: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.LayoutImage>>;
2043
2055
  LeadFlourish: ResolverTypeWrapper<LeadFlourishModel>;
2044
- List: ResolverTypeWrapper<CapiList>;
2056
+ List: ResolverTypeWrapper<ListModel>;
2045
2057
  ListType: ResolverTypeWrapper<Scalars['ListType']['output']>;
2046
- LiveBlogPackage: ResolverTypeWrapper<CapiResponse>;
2047
- LiveBlogPost: ResolverTypeWrapper<CapiResponse>;
2058
+ LiveBlogPackage: ResolverTypeWrapper<ContentModel>;
2059
+ LiveBlogPost: ResolverTypeWrapper<ContentModel>;
2048
2060
  MainImage: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.ImageSet>>;
2049
2061
  Media: ResolverTypeWrapper<Media>;
2050
2062
  MetaLink: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MetaLink']>;
@@ -2058,7 +2070,7 @@ export type ResolversTypes = ResolversObject<{
2058
2070
  PictureFullBleed: ResolverTypeWrapper<PictureModel>;
2059
2071
  PictureInline: ResolverTypeWrapper<PictureModel>;
2060
2072
  PictureStandard: ResolverTypeWrapper<PictureModel>;
2061
- Placeholder: ResolverTypeWrapper<CapiResponse>;
2073
+ Placeholder: ResolverTypeWrapper<ContentModel>;
2062
2074
  PodcastTopper: ResolverTypeWrapper<TopperModel>;
2063
2075
  Query: ResolverTypeWrapper<{}>;
2064
2076
  RawImage: ResolverTypeWrapper<ReferenceWithCAPIData<RawImageNode>>;
@@ -2071,7 +2083,7 @@ export type ResolversTypes = ResolversObject<{
2071
2083
  String: ResolverTypeWrapper<Scalars['String']['output']>;
2072
2084
  StructuredContent: ResolverTypeWrapper<Omit<StructuredContent, 'references'> & { references: ReadonlyArray<ResolversTypes['Reference']> }>;
2073
2085
  TableOfContents: ResolverTypeWrapper<TableOfContents>;
2074
- Teaser: ResolverTypeWrapper<CapiResponse>;
2086
+ Teaser: ResolverTypeWrapper<ContentModel>;
2075
2087
  TeaserIndicators: ResolverTypeWrapper<TeaserIndicators>;
2076
2088
  Topper: ResolverTypeWrapper<TopperModel>;
2077
2089
  TopperBackgroundColour: ResolverTypeWrapper<Scalars['TopperBackgroundColour']['output']>;
@@ -2082,7 +2094,7 @@ export type ResolversTypes = ResolversObject<{
2082
2094
  TopperWithPackage: ResolverTypeWrapper<TopperModel>;
2083
2095
  TopperWithTheme: ResolverTypeWrapper<TopperModel>;
2084
2096
  Tweet: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.Tweet>>;
2085
- Video: ResolverTypeWrapper<CapiResponse>;
2097
+ Video: ResolverTypeWrapper<ContentModel>;
2086
2098
  VideoReference: ResolverTypeWrapper<ReferenceWithCAPIData<VideoNode>>;
2087
2099
  }>;
2088
2100
 
@@ -2092,8 +2104,8 @@ export type ResolversParentTypes = ResolversObject<{
2092
2104
  Accessibility: Omit<Accessibility, 'transcript'> & { transcript: Maybe<ResolversParentTypes['RichText']> };
2093
2105
  AltStandfirst: AltStandfirst;
2094
2106
  AltTitle: AltTitle;
2095
- Article: CapiResponse;
2096
- Audio: CapiResponse;
2107
+ Article: ContentModel;
2108
+ Audio: ContentModel;
2097
2109
  Author: ConceptModel;
2098
2110
  AuthorReference: ReferenceWithCAPIData<AuthorNode>;
2099
2111
  BasicTopper: TopperModel;
@@ -2110,7 +2122,7 @@ export type ResolversParentTypes = ResolversObject<{
2110
2122
  Content: ResolversInterfaceTypes<ResolversParentTypes>['Content'];
2111
2123
  ContentConnection: Omit<ContentConnection, 'edges'> & { edges: ReadonlyArray<Maybe<ResolversParentTypes['ContentEdge']>> };
2112
2124
  ContentEdge: Omit<ContentEdge, 'node'> & { node: Maybe<ResolversParentTypes['Content']> };
2113
- ContentPackage: CapiResponse;
2125
+ ContentPackage: ContentModel;
2114
2126
  ContentType: Scalars['ContentType']['output'];
2115
2127
  CustomCodeComponent: ReferenceWithCAPIData<ContentTree.CustomCodeComponent>;
2116
2128
  DeepLandscapeTopper: TopperModel;
@@ -2142,10 +2154,10 @@ export type ResolversParentTypes = ResolversObject<{
2142
2154
  LayoutHint: Scalars['LayoutHint']['output'];
2143
2155
  LayoutImage: ReferenceWithCAPIData<ContentTree.LayoutImage>;
2144
2156
  LeadFlourish: LeadFlourishModel;
2145
- List: CapiList;
2157
+ List: ListModel;
2146
2158
  ListType: Scalars['ListType']['output'];
2147
- LiveBlogPackage: CapiResponse;
2148
- LiveBlogPost: CapiResponse;
2159
+ LiveBlogPackage: ContentModel;
2160
+ LiveBlogPost: ContentModel;
2149
2161
  MainImage: ReferenceWithCAPIData<ContentTree.ImageSet>;
2150
2162
  Media: Media;
2151
2163
  MetaLink: ResolversUnionTypes<ResolversParentTypes>['MetaLink'];
@@ -2159,7 +2171,7 @@ export type ResolversParentTypes = ResolversObject<{
2159
2171
  PictureFullBleed: PictureModel;
2160
2172
  PictureInline: PictureModel;
2161
2173
  PictureStandard: PictureModel;
2162
- Placeholder: CapiResponse;
2174
+ Placeholder: ContentModel;
2163
2175
  PodcastTopper: TopperModel;
2164
2176
  Query: {};
2165
2177
  RawImage: ReferenceWithCAPIData<RawImageNode>;
@@ -2172,7 +2184,7 @@ export type ResolversParentTypes = ResolversObject<{
2172
2184
  String: Scalars['String']['output'];
2173
2185
  StructuredContent: Omit<StructuredContent, 'references'> & { references: ReadonlyArray<ResolversParentTypes['Reference']> };
2174
2186
  TableOfContents: TableOfContents;
2175
- Teaser: CapiResponse;
2187
+ Teaser: ContentModel;
2176
2188
  TeaserIndicators: TeaserIndicators;
2177
2189
  Topper: TopperModel;
2178
2190
  TopperBackgroundColour: Scalars['TopperBackgroundColour']['output'];
@@ -2183,7 +2195,7 @@ export type ResolversParentTypes = ResolversObject<{
2183
2195
  TopperWithPackage: TopperModel;
2184
2196
  TopperWithTheme: TopperModel;
2185
2197
  Tweet: ReferenceWithCAPIData<ContentTree.Tweet>;
2186
- Video: CapiResponse;
2198
+ Video: ContentModel;
2187
2199
  VideoReference: ReferenceWithCAPIData<VideoNode>;
2188
2200
  }>;
2189
2201
 
@@ -2255,6 +2267,7 @@ export type AudioResolvers<ContextType = QueryContext, ParentType extends Resolv
2255
2267
  editorialDesk: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
2256
2268
  firstPublishedDate: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2257
2269
  id: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
2270
+ indicators: Resolver<Maybe<ResolversTypes['Indicators']>, ParentType, ContextType>;
2258
2271
  instantAlertConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2259
2272
  mainImage: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
2260
2273
  media: Resolver<Maybe<ReadonlyArray<Maybe<ResolversTypes['Media']>>>, ParentType, ContextType>;
@@ -2459,6 +2472,7 @@ export type ContentPackageResolvers<ContextType = QueryContext, ParentType exten
2459
2472
  editorialDesk: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
2460
2473
  firstPublishedDate: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2461
2474
  id: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
2475
+ indicators: Resolver<Maybe<ResolversTypes['Indicators']>, ParentType, ContextType>;
2462
2476
  instantAlertConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2463
2477
  mainImage: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
2464
2478
  modifiedTimestamp: Resolver<Maybe<ResolversTypes['Float']>, ParentType, ContextType>;
@@ -2730,6 +2744,7 @@ export type ImageWideResolvers<ContextType = QueryContext, ParentType extends Re
2730
2744
  }>;
2731
2745
 
2732
2746
  export type IndicatorsResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Indicators'] = ResolversParentTypes['Indicators']> = ResolversObject<{
2747
+ isFTEdit: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2733
2748
  isOpinion: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2734
2749
  isPartnerContent: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2735
2750
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
@@ -2788,6 +2803,7 @@ export type LiveBlogPackageResolvers<ContextType = QueryContext, ParentType exte
2788
2803
  editorialDesk: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
2789
2804
  firstPublishedDate: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2790
2805
  id: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
2806
+ indicators: Resolver<Maybe<ResolversTypes['Indicators']>, ParentType, ContextType>;
2791
2807
  instantAlertConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2792
2808
  liveBlogPosts: Resolver<Maybe<ReadonlyArray<Maybe<ResolversTypes['Content']>>>, ParentType, ContextType, Partial<LiveBlogPackageLiveBlogPostsArgs>>;
2793
2809
  liveBlogPostsConnection: Resolver<Maybe<ResolversTypes['ContentConnection']>, ParentType, ContextType, Partial<LiveBlogPackageLiveBlogPostsConnectionArgs>>;
@@ -2974,6 +2990,7 @@ export type PlaceholderResolvers<ContextType = QueryContext, ParentType extends
2974
2990
  editorialDesk: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
2975
2991
  firstPublishedDate: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2976
2992
  id: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
2993
+ indicators: Resolver<Maybe<ResolversTypes['Indicators']>, ParentType, ContextType>;
2977
2994
  instantAlertConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
2978
2995
  mainImage: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
2979
2996
  modifiedTimestamp: Resolver<Maybe<ResolversTypes['Float']>, ParentType, ContextType>;
@@ -3189,6 +3206,7 @@ export type VideoResolvers<ContextType = QueryContext, ParentType extends Resolv
3189
3206
  editorialDesk: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
3190
3207
  firstPublishedDate: Resolver<ResolversTypes['String'], ParentType, ContextType>;
3191
3208
  id: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
3209
+ indicators: Resolver<Maybe<ResolversTypes['Indicators']>, ParentType, ContextType>;
3192
3210
  instantAlertConcept: Resolver<Maybe<ResolversTypes['Concept']>, ParentType, ContextType>;
3193
3211
  mainImage: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
3194
3212
  modifiedTimestamp: Resolver<Maybe<ResolversTypes['Float']>, ParentType, ContextType>;
@@ -5,7 +5,7 @@ import {
5
5
  Author as AuthorNode,
6
6
  } from '../resolvers/content-tree/Workarounds'
7
7
  import updateTreeWithReferenceIds from '../resolvers/content-tree/updateTreeWithReferenceIds'
8
- import { CapiResponse } from './CapiResponse'
8
+ import { Content } from './Content'
9
9
 
10
10
  export class Byline {
11
11
  static normaliseQuotes(str: string) {
@@ -16,7 +16,7 @@ export class Byline {
16
16
  private byline: string,
17
17
  private vanity: boolean,
18
18
  private authors: Concept[],
19
- private contentApiData?: CapiResponse
19
+ private contentApiData?: Content
20
20
  ) {}
21
21
 
22
22
  async buildBylineTree() {