@financial-times/cp-content-pipeline-schema 2.15.0 → 3.0.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 (161) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/lib/datasources/capi.d.ts +2 -2
  3. package/lib/datasources/capi.js +4 -2
  4. package/lib/datasources/capi.js.map +1 -1
  5. package/lib/datasources/capi.test.js +2 -2
  6. package/lib/fixtures/capiObject.d.ts +2 -2
  7. package/lib/fixtures/capiObject.js +2 -0
  8. package/lib/fixtures/capiObject.js.map +1 -1
  9. package/lib/fixtures/capiPerson.d.ts +1 -1
  10. package/lib/generated/index.d.ts +296 -131
  11. package/lib/helpers/decorateHeadshotUrl.d.ts +1 -2
  12. package/lib/helpers/decorateHeadshotUrl.js +2 -3
  13. package/lib/helpers/decorateHeadshotUrl.js.map +1 -1
  14. package/lib/model/Byline.d.ts +8 -10
  15. package/lib/model/Byline.js +34 -33
  16. package/lib/model/Byline.js.map +1 -1
  17. package/lib/model/Byline.test.js +105 -52
  18. package/lib/model/Byline.test.js.map +1 -1
  19. package/lib/model/CapiResponse.d.ts +12 -16
  20. package/lib/model/CapiResponse.js +38 -41
  21. package/lib/model/CapiResponse.js.map +1 -1
  22. package/lib/model/CapiResponse.test.js +7 -18
  23. package/lib/model/CapiResponse.test.js.map +1 -1
  24. package/lib/model/Clip.d.ts +1 -1
  25. package/lib/model/Concept.d.ts +1 -1
  26. package/lib/model/Concept.js +1 -2
  27. package/lib/model/Concept.js.map +1 -1
  28. package/lib/model/FlourishSource.d.ts +1 -1
  29. package/lib/model/FlourishSource.js.map +1 -1
  30. package/lib/model/Image.d.ts +1 -1
  31. package/lib/model/LeadFlourish.test.js +1 -0
  32. package/lib/model/LeadFlourish.test.js.map +1 -1
  33. package/lib/model/Person.d.ts +6 -12
  34. package/lib/model/Person.js +39 -66
  35. package/lib/model/Person.js.map +1 -1
  36. package/lib/model/Person.test.js +7 -60
  37. package/lib/model/Person.test.js.map +1 -1
  38. package/lib/model/Picture.d.ts +1 -1
  39. package/lib/model/RichText.d.ts +1 -2
  40. package/lib/model/Topper.d.ts +1 -1
  41. package/lib/model/Topper.js +10 -8
  42. package/lib/model/Topper.js.map +1 -1
  43. package/lib/model/Topper.test.js +9 -10
  44. package/lib/model/Topper.test.js.map +1 -1
  45. package/lib/model/schemas/capi/article.d.ts +7 -4
  46. package/lib/model/schemas/capi/article.js +1 -0
  47. package/lib/model/schemas/capi/article.js.map +1 -1
  48. package/lib/model/schemas/capi/audio.d.ts +7 -4
  49. package/lib/model/schemas/capi/audio.js +1 -0
  50. package/lib/model/schemas/capi/audio.js.map +1 -1
  51. package/lib/model/schemas/capi/base-schema.d.ts +14 -123
  52. package/lib/model/schemas/capi/base-schema.js +7 -6
  53. package/lib/model/schemas/capi/base-schema.js.map +1 -1
  54. package/lib/model/schemas/capi/content-package.d.ts +10 -5
  55. package/lib/model/schemas/capi/content-package.js +2 -0
  56. package/lib/model/schemas/capi/content-package.js.map +1 -1
  57. package/lib/model/schemas/capi/index.d.ts +41 -22
  58. package/lib/model/schemas/capi/internal-content.d.ts +24 -0
  59. package/lib/model/schemas/capi/internal-content.js +3 -0
  60. package/lib/model/schemas/capi/internal-content.js.map +1 -0
  61. package/lib/model/schemas/capi/live-blog-package.d.ts +7 -4
  62. package/lib/model/schemas/capi/live-blog-package.js +1 -0
  63. package/lib/model/schemas/capi/live-blog-package.js.map +1 -1
  64. package/lib/model/schemas/capi/placeholder.d.ts +7 -4
  65. package/lib/model/schemas/capi/placeholder.js +1 -0
  66. package/lib/model/schemas/capi/placeholder.js.map +1 -1
  67. package/lib/model/schemas/capi/video.d.ts +10 -5
  68. package/lib/model/schemas/capi/video.js +2 -0
  69. package/lib/model/schemas/capi/video.js.map +1 -1
  70. package/lib/resolvers/concept.d.ts +37 -2
  71. package/lib/resolvers/concept.js +17 -10
  72. package/lib/resolvers/concept.js.map +1 -1
  73. package/lib/resolvers/content-tree/Workarounds.d.ts +19 -11
  74. package/lib/resolvers/content-tree/references/Author.d.ts +4 -0
  75. package/lib/resolvers/content-tree/references/Author.js +14 -0
  76. package/lib/resolvers/content-tree/references/Author.js.map +1 -0
  77. package/lib/resolvers/content-tree/references/ClipSet.d.ts +1 -1
  78. package/lib/resolvers/content-tree/references/ClipSet.js +1 -1
  79. package/lib/resolvers/content-tree/references/ClipSet.js.map +1 -1
  80. package/lib/resolvers/content-tree/references/Flourish.d.ts +1 -1
  81. package/lib/resolvers/content-tree/references/Reference.d.ts +1 -1
  82. package/lib/resolvers/content-tree/references/index.d.ts +4 -2
  83. package/lib/resolvers/content-tree/references/index.js +4 -1
  84. package/lib/resolvers/content-tree/references/index.js.map +1 -1
  85. package/lib/resolvers/content-tree/updateTreeWithReferenceIds.d.ts +3 -3
  86. package/lib/resolvers/content-tree/updateTreeWithReferenceIds.js +2 -3
  87. package/lib/resolvers/content-tree/updateTreeWithReferenceIds.js.map +1 -1
  88. package/lib/resolvers/content.d.ts +27 -18
  89. package/lib/resolvers/content.js +4 -2
  90. package/lib/resolvers/content.js.map +1 -1
  91. package/lib/resolvers/image.d.ts +12 -12
  92. package/lib/resolvers/index.d.ts +89 -42
  93. package/lib/resolvers/leadFlourish.d.ts +2 -1
  94. package/lib/resolvers/leadFlourish.js +1 -0
  95. package/lib/resolvers/leadFlourish.js.map +1 -1
  96. package/lib/resolvers/person.d.ts +1 -1
  97. package/lib/resolvers/person.js +1 -1
  98. package/lib/resolvers/person.js.map +1 -1
  99. package/lib/resolvers/picture.d.ts +4 -4
  100. package/lib/resolvers/richText.d.ts +1 -1
  101. package/lib/resolvers/teaser.d.ts +1 -1
  102. package/lib/resolvers/topper.d.ts +3 -3
  103. package/package.json +1 -1
  104. package/queries/article.graphql +35 -13
  105. package/src/datasources/capi.test.ts +3 -3
  106. package/src/datasources/capi.ts +5 -3
  107. package/src/fixtures/capiObject.ts +4 -2
  108. package/src/fixtures/capiPerson.ts +1 -1
  109. package/src/generated/index.ts +321 -132
  110. package/src/helpers/decorateHeadshotUrl.ts +2 -2
  111. package/src/model/Byline.test.ts +136 -55
  112. package/src/model/Byline.ts +49 -39
  113. package/src/model/CapiResponse.test.ts +9 -25
  114. package/src/model/CapiResponse.ts +83 -56
  115. package/src/model/Clip.ts +1 -1
  116. package/src/model/Concept.ts +3 -3
  117. package/src/model/FlourishSource.ts +1 -1
  118. package/src/model/Image.test.ts +1 -1
  119. package/src/model/Image.ts +1 -1
  120. package/src/model/LeadFlourish.test.ts +1 -0
  121. package/src/model/Person.test.ts +11 -62
  122. package/src/model/Person.ts +47 -51
  123. package/src/model/Picture.test.ts +1 -1
  124. package/src/model/Picture.ts +1 -1
  125. package/src/model/Topper.test.ts +22 -18
  126. package/src/model/Topper.ts +10 -9
  127. package/src/model/__snapshots__/Byline.test.ts.snap +166 -27
  128. package/src/model/schemas/capi/article.ts +1 -0
  129. package/src/model/schemas/capi/audio.ts +1 -0
  130. package/src/model/schemas/capi/base-schema.ts +5 -4
  131. package/src/model/schemas/capi/content-package.ts +2 -0
  132. package/src/model/schemas/capi/internal-content.ts +45 -0
  133. package/src/model/schemas/capi/live-blog-package.ts +1 -0
  134. package/src/model/schemas/capi/placeholder.ts +1 -0
  135. package/src/model/schemas/capi/video.ts +2 -0
  136. package/src/resolvers/concept.ts +29 -12
  137. package/src/resolvers/content-tree/Workarounds.ts +39 -20
  138. package/src/resolvers/content-tree/references/Author.ts +18 -0
  139. package/src/resolvers/content-tree/references/ClipSet.ts +6 -8
  140. package/src/resolvers/content-tree/references/ImageSet.ts +1 -1
  141. package/src/resolvers/content-tree/references/ScrollyImage.ts +1 -1
  142. package/src/resolvers/content-tree/references/index.ts +6 -1
  143. package/src/resolvers/content-tree/updateTreeWithReferenceIds.ts +6 -8
  144. package/src/resolvers/content.ts +4 -2
  145. package/src/resolvers/leadFlourish.ts +1 -0
  146. package/src/resolvers/person.ts +1 -1
  147. package/src/types/n-display-metadata.d.ts +1 -1
  148. package/tsconfig.tsbuildinfo +1 -1
  149. package/typedefs/clip.graphql +2 -2
  150. package/typedefs/concept.graphql +64 -2
  151. package/typedefs/content.graphql +63 -39
  152. package/typedefs/image.graphql +12 -12
  153. package/typedefs/leadFlourish.graphql +32 -0
  154. package/typedefs/person.graphql +2 -2
  155. package/typedefs/picture.graphql +6 -6
  156. package/typedefs/references/author.graphql +7 -0
  157. package/typedefs/references/clipSet.graphql +14 -2
  158. package/typedefs/references/tweet.graphql +1 -1
  159. package/typedefs/teaser.graphql +10 -10
  160. package/src/types/internal-content.d.ts +0 -55
  161. package/typedefs/leadFlouish.graphql +0 -29
@@ -11,7 +11,7 @@ type ClipSource {
11
11
  "The media type eg. video/mp4."
12
12
  mediaType: String!
13
13
 
14
- "The height of the clip in pixels."
14
+ "The height of the clip in pixels."
15
15
  pixelHeight: Int
16
16
 
17
17
  "The width of the clip in pixels."
@@ -48,7 +48,7 @@ type Caption {
48
48
 
49
49
  type Accessibility {
50
50
  "An array of captions for the clip."
51
- captions: [Caption]
51
+ captions: [Caption!]
52
52
 
53
53
  "An abstract syntax tree of the transcript for the clip."
54
54
  transcript: RichText
@@ -1,6 +1,65 @@
1
1
  "A concept is supplemtary information item, like a location, person, organisation or topic. It is used to provide context to an article."
2
+ interface ConceptInterface {
3
+ "The unique identifier of the concept - a uuid or a url."
4
+ id: ID!
5
+
6
+ "The url of the media, eg. 'https://next-media-api.ft.com/renditions/16868569859480/0x0.mp3'."
7
+ url(vanity: Boolean, relative: Boolean): String!
8
+
9
+ "The api url of the concept, eg. 'http://api.ft.com/things/a579350c-61ce-4c00-97ca-ddaa2e0cacf6'."
10
+ apiUrl: String
11
+
12
+ "The type of the concept, eg. 'http://www.ft.com/ontology/Topic'."
13
+ directType: String
14
+
15
+ "Whether the concept is part of a package brand eg. 'ftSeries' or 'ftGuides'."
16
+ isPackageBrand: Boolean
17
+
18
+ "The relationship between the concept and the article, eg. 'http://www.ft.com/ontology/hasAuthor'."
19
+ predicate: String
20
+
21
+ "The preferred label of the concept, eg. 'Work & Careers'."
22
+ prefLabel: String!
23
+
24
+ "The type of the concept, eg. 'TOPIC'."
25
+ type: String
26
+
27
+ "An array of types, eg. ['http://www.ft.com/ontology/core/Thing', 'http://www.ft.com/ontology/Topic']."
28
+ types: [String!]
29
+ }
2
30
 
3
- type Concept {
31
+ "A concept is supplemtary information item, like a location, person, organisation or topic. It is used to provide context to an article."
32
+ type Concept implements ConceptInterface {
33
+ "The unique identifier of the concept - a uuid or a url."
34
+ id: ID!
35
+
36
+ "The url of the media, eg. 'https://next-media-api.ft.com/renditions/16868569859480/0x0.mp3'."
37
+ url(vanity: Boolean, relative: Boolean): String!
38
+
39
+ "The api url of the concept, eg. 'http://api.ft.com/things/a579350c-61ce-4c00-97ca-ddaa2e0cacf6'."
40
+ apiUrl: String!
41
+
42
+ "The type of the concept, eg. 'http://www.ft.com/ontology/Topic'."
43
+ directType: String!
44
+
45
+ "Whether the concept is part of a package brand eg. 'ftSeries' or 'ftGuides'."
46
+ isPackageBrand: Boolean!
47
+
48
+ "The relationship between the concept and the article, eg. 'http://www.ft.com/ontology/hasAuthor'."
49
+ predicate: String!
50
+
51
+ "The preferred label of the concept, eg. 'Work & Careers'."
52
+ prefLabel: String!
53
+
54
+ "The type of the concept, eg. 'TOPIC'."
55
+ type: String
56
+
57
+ "An array of types, eg. ['http://www.ft.com/ontology/core/Thing', 'http://www.ft.com/ontology/Topic']."
58
+ types: [String!]!
59
+ }
60
+
61
+ "An author is a concept that represents a person that was involved in the writing of an item of content."
62
+ type Author implements ConceptInterface {
4
63
  "The unique identifier of the concept - a uuid or a url."
5
64
  id: ID!
6
65
 
@@ -24,7 +83,10 @@ type Concept {
24
83
 
25
84
  "The type of the concept, eg. 'TOPIC'."
26
85
  type: String
27
-
86
+
28
87
  "An array of types, eg. ['http://www.ft.com/ontology/core/Thing', 'http://www.ft.com/ontology/Topic']."
29
88
  types: [String!]
89
+
90
+ "The People API data for the person referenced by this Author concept."
91
+ person: Person!
30
92
  }
@@ -68,17 +68,20 @@ interface Content {
68
68
  "The url of the concept. Vanity urls replace long, randomly generated urls - they are more user friendly and concise. Relative urls are relative to the current domain."
69
69
  url(vanity: Boolean, relative: Boolean): String!
70
70
 
71
- "The ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
71
+ "The ISO string date the article was marked as published, eg. '2024-04-03T10:35:52.443Z'."
72
72
  publishedDate: String!
73
73
 
74
- "The number of milliseconds since the unix epoch the article was published, eg '1712140552443'."
74
+ "The number of milliseconds since the unix epoch the article was marked as published, eg '1712140552443'."
75
75
  publishedTimestamp: Float!
76
76
 
77
+ "The number of milliseconds since the unix epoch the article was last changed, eg '1712140552443'."
78
+ modifiedTimestamp: Float!
79
+
77
80
  "The first ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
78
81
  firstPublishedDate: String!
79
82
 
80
83
  "A string ID used to trace content publishes through the pipeline, e.g. 'republish_tid_JNhUrBjdXo'."
81
- publishReference: String!
84
+ publishReference: String
82
85
 
83
86
  "An image object containing the url and the caption, to be displayed usually before the article content."
84
87
  mainImage: Image
@@ -96,7 +99,7 @@ interface Content {
96
99
  teaser: Teaser
97
100
 
98
101
  "An array of concepts related to the article, eg. organisations or topics."
99
- annotations: [Concept]
102
+ annotations(byPredicate: String): [ConceptInterface!]!
100
103
 
101
104
  "The editorial division the article belongs to, eg. 'FT-SpecialReports'."
102
105
  editorialDesk: String
@@ -145,17 +148,20 @@ type Article implements Content {
145
148
  "The url of the concept. Vanity urls replace long, randomly generated urls - they are more user friendly and concise. Relative urls are relative to the current domain."
146
149
  url(vanity: Boolean, relative: Boolean): String!
147
150
 
148
- "The ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
151
+ "The ISO string date the article was marked as published, eg. '2024-04-03T10:35:52.443Z'."
149
152
  publishedDate: String!
150
153
 
151
- "The number of milliseconds since the unix epoch the article was published, eg '1712140552443'."
154
+ "The number of milliseconds since the unix epoch the article was marked as published, eg '1712140552443'."
152
155
  publishedTimestamp: Float!
153
156
 
157
+ "The number of milliseconds since the unix epoch the article was last changed, eg '1712140552443'."
158
+ modifiedTimestamp: Float!
159
+
154
160
  "The first ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
155
161
  firstPublishedDate: String!
156
162
 
157
163
  "A string ID used to trace content publishes through the pipeline, e.g. 'republish_tid_JNhUrBjdXo'."
158
- publishReference: String!
164
+ publishReference: String
159
165
 
160
166
  "An image object containing the url and the caption, to be displayed usually before the article content."
161
167
  mainImage: Image
@@ -173,7 +179,7 @@ type Article implements Content {
173
179
  teaser: Teaser
174
180
 
175
181
  "An array of concepts related to the article, eg. organisations or topics."
176
- annotations: [Concept]
182
+ annotations(byPredicate: String): [ConceptInterface!]!
177
183
 
178
184
  "The editorial division the article belongs to, eg. 'FT-SpecialReports'."
179
185
  editorialDesk: String
@@ -225,17 +231,20 @@ type Placeholder implements Content {
225
231
  "The url of the concept. Vanity urls replace long, randomly generated urls - they are more user friendly and concise. Relative urls are relative to the current domain."
226
232
  url(vanity: Boolean, relative: Boolean): String!
227
233
 
228
- "The ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
234
+ "The ISO string date the article was marked as published, eg. '2024-04-03T10:35:52.443Z'."
229
235
  publishedDate: String!
230
236
 
231
- "The number of milliseconds since the unix epoch the article was published, eg '1712140552443'."
237
+ "The number of milliseconds since the unix epoch the article was marked as published, eg '1712140552443'."
232
238
  publishedTimestamp: Float!
233
239
 
240
+ "The number of milliseconds since the unix epoch the article was last changed, eg '1712140552443'."
241
+ modifiedTimestamp: Float!
242
+
234
243
  "The first ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
235
244
  firstPublishedDate: String!
236
245
 
237
246
  "A string ID used to trace content publishes through the pipeline, e.g. 'republish_tid_JNhUrBjdXo'."
238
- publishReference: String!
247
+ publishReference: String
239
248
 
240
249
  "An image object containing the url and the caption, to be displayed usually before the article content."
241
250
  mainImage: Image
@@ -253,7 +262,7 @@ type Placeholder implements Content {
253
262
  teaser: Teaser
254
263
 
255
264
  "An array of concepts related to the article, eg. organisations or topics."
256
- annotations: [Concept]
265
+ annotations(byPredicate: String): [ConceptInterface!]!
257
266
 
258
267
  "The editorial division the article belongs to, eg. 'FT-SpecialReports'."
259
268
  editorialDesk: String
@@ -305,17 +314,20 @@ type LiveBlogPackage implements Content {
305
314
  "The url of the concept. Vanity urls replace long, randomly generated urls - they are more user friendly and concise. Relative urls are relative to the current domain."
306
315
  url(vanity: Boolean, relative: Boolean): String!
307
316
 
308
- "The ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
317
+ "The ISO string date the article was marked as published, eg. '2024-04-03T10:35:52.443Z'."
309
318
  publishedDate: String!
310
319
 
311
- "The number of milliseconds since the unix epoch the article was published, eg '1712140552443'."
320
+ "The number of milliseconds since the unix epoch the article was marked as published, eg '1712140552443'."
312
321
  publishedTimestamp: Float!
313
322
 
323
+ "The number of milliseconds since the unix epoch the article was last changed, eg '1712140552443'."
324
+ modifiedTimestamp: Float!
325
+
314
326
  "The first ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
315
327
  firstPublishedDate: String!
316
328
 
317
329
  "A string ID used to trace content publishes through the pipeline, e.g. 'republish_tid_JNhUrBjdXo'."
318
- publishReference: String!
330
+ publishReference: String
319
331
 
320
332
  "An image object containing the url and the caption, to be displayed usually before the article content."
321
333
  mainImage: Image
@@ -333,7 +345,7 @@ type LiveBlogPackage implements Content {
333
345
  teaser: Teaser
334
346
 
335
347
  "An array of concepts related to the article, eg. organisations or topics."
336
- annotations: [Concept]
348
+ annotations(byPredicate: String): [ConceptInterface!]!
337
349
 
338
350
  "The editorial division the article belongs to, eg. 'FT-SpecialReports'."
339
351
  editorialDesk: String
@@ -357,12 +369,7 @@ type LiveBlogPackage implements Content {
357
369
  design: Design
358
370
 
359
371
  "The child articles of this live blog package."
360
- liveBlogPosts(
361
- includePinned: Boolean
362
- @deprecated(
363
- reason: "avoiding breaking change, will remove argument on next major release"
364
- )
365
- ): [Content]
372
+ liveBlogPosts: [Content]
366
373
 
367
374
  "The pinned article of this live blog package."
368
375
  pinnedPost: Content
@@ -396,17 +403,20 @@ type LiveBlogPost implements Content {
396
403
  "The url of the concept. Vanity urls replace long, randomly generated urls - they are more user friendly and concise. Relative urls are relative to the current domain."
397
404
  url(vanity: Boolean, relative: Boolean): String!
398
405
 
399
- "The ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
406
+ "The ISO string date the article was marked as published, eg. '2024-04-03T10:35:52.443Z'."
400
407
  publishedDate: String!
401
408
 
402
- "The number of milliseconds since the unix epoch the article was published, eg '1712140552443'."
409
+ "The number of milliseconds since the unix epoch the article was marked as published, eg '1712140552443'."
403
410
  publishedTimestamp: Float!
404
411
 
412
+ "The number of milliseconds since the unix epoch the article was last changed, eg '1712140552443'."
413
+ modifiedTimestamp: Float!
414
+
405
415
  "The first ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
406
416
  firstPublishedDate: String!
407
417
 
408
418
  "A string ID used to trace content publishes through the pipeline, e.g. 'republish_tid_JNhUrBjdXo'."
409
- publishReference: String!
419
+ publishReference: String
410
420
 
411
421
  "An image object containing the url and the caption, to be displayed usually before the article content."
412
422
  mainImage: Image
@@ -424,7 +434,7 @@ type LiveBlogPost implements Content {
424
434
  teaser: Teaser
425
435
 
426
436
  "An array of concepts related to the article, eg. organisations or topics."
427
- annotations: [Concept]
437
+ annotations(byPredicate: String): [ConceptInterface!]!
428
438
 
429
439
  "The editorial division the article belongs to, eg. 'FT-SpecialReports'."
430
440
  editorialDesk: String
@@ -455,7 +465,12 @@ type LiveBlogPost implements Content {
455
465
 
456
466
  "Whether the live-blog-post should be pinned."
457
467
  isPinned: Boolean
458
- authors: [Person]
468
+
469
+ "The People API data for the authors of the live blog post"
470
+ authors: [Person!]!
471
+ @deprecated(
472
+ reason: "use Content.annotations(byPredicate: \"http://www.ft.com/ontology/annotation/hasAuthor\")"
473
+ )
459
474
  }
460
475
 
461
476
  type Audio implements Content {
@@ -483,17 +498,20 @@ type Audio implements Content {
483
498
  "The url of the concept. Vanity urls replace long, randomly generated urls - they are more user friendly and concise. Relative urls are relative to the current domain."
484
499
  url(vanity: Boolean, relative: Boolean): String!
485
500
 
486
- "The ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
501
+ "The ISO string date the article was marked as published, eg. '2024-04-03T10:35:52.443Z'."
487
502
  publishedDate: String!
488
503
 
489
- "The number of milliseconds since the unix epoch the article was published, eg '1712140552443'."
504
+ "The number of milliseconds since the unix epoch the article was marked as published, eg '1712140552443'."
490
505
  publishedTimestamp: Float!
491
506
 
507
+ "The number of milliseconds since the unix epoch the article was last changed, eg '1712140552443'."
508
+ modifiedTimestamp: Float!
509
+
492
510
  "The first ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
493
511
  firstPublishedDate: String!
494
512
 
495
513
  "A string ID used to trace content publishes through the pipeline, e.g. 'republish_tid_JNhUrBjdXo'."
496
- publishReference: String!
514
+ publishReference: String
497
515
 
498
516
  "An image object containing the url and the caption, to be displayed usually before the article content."
499
517
  mainImage: Image
@@ -511,7 +529,7 @@ type Audio implements Content {
511
529
  teaser: Teaser
512
530
 
513
531
  "An array of concepts related to the article, eg. organisations or topics."
514
- annotations: [Concept]
532
+ annotations(byPredicate: String): [ConceptInterface!]!
515
533
 
516
534
  "The editorial division the article belongs to, eg. 'FT-SpecialReports'."
517
535
  editorialDesk: String
@@ -563,17 +581,20 @@ type Video implements Content {
563
581
  "The url of the concept. Vanity urls replace long, randomly generated urls - they are more user friendly and concise. Relative urls are relative to the current domain."
564
582
  url(vanity: Boolean, relative: Boolean): String!
565
583
 
566
- "The ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
584
+ "The ISO string date the article was marked as published, eg. '2024-04-03T10:35:52.443Z'."
567
585
  publishedDate: String!
568
586
 
569
- "The number of milliseconds since the unix epoch the article was published, eg '1712140552443'."
587
+ "The number of milliseconds since the unix epoch the article was marked as published, eg '1712140552443'."
570
588
  publishedTimestamp: Float!
571
589
 
590
+ "The number of milliseconds since the unix epoch the article was last changed, eg '1712140552443'."
591
+ modifiedTimestamp: Float!
592
+
572
593
  "The first ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
573
594
  firstPublishedDate: String!
574
595
 
575
596
  "A string ID used to trace content publishes through the pipeline, e.g. 'republish_tid_JNhUrBjdXo'."
576
- publishReference: String!
597
+ publishReference: String
577
598
 
578
599
  "An image object containing the url and the caption, to be displayed usually before the article content."
579
600
  mainImage: Image
@@ -591,7 +612,7 @@ type Video implements Content {
591
612
  teaser: Teaser
592
613
 
593
614
  "An array of concepts related to the article, eg. organisations or topics."
594
- annotations: [Concept]
615
+ annotations(byPredicate: String): [ConceptInterface!]!
595
616
 
596
617
  "The editorial division the article belongs to, eg. 'FT-SpecialReports'."
597
618
  editorialDesk: String
@@ -640,17 +661,20 @@ type ContentPackage implements Content {
640
661
  "The url of the concept. Vanity urls replace long, randomly generated urls - they are more user friendly and concise. Relative urls are relative to the current domain."
641
662
  url(vanity: Boolean, relative: Boolean): String!
642
663
 
643
- "The ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
664
+ "The ISO string date the article was marked as published, eg. '2024-04-03T10:35:52.443Z'."
644
665
  publishedDate: String!
645
666
 
646
- "The number of milliseconds since the unix epoch the article was published, eg '1712140552443'."
667
+ "The number of milliseconds since the unix epoch the article was marked as published, eg '1712140552443'."
647
668
  publishedTimestamp: Float!
648
669
 
670
+ "The number of milliseconds since the unix epoch the article was last changed, eg '1712140552443'."
671
+ modifiedTimestamp: Float!
672
+
649
673
  "The first ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'."
650
674
  firstPublishedDate: String!
651
675
 
652
676
  "A string ID used to trace content publishes through the pipeline, e.g. 'republish_tid_JNhUrBjdXo'."
653
- publishReference: String!
677
+ publishReference: String
654
678
 
655
679
  "An image object containing the url and the caption, to be displayed usually before the article content."
656
680
  mainImage: Image
@@ -668,7 +692,7 @@ type ContentPackage implements Content {
668
692
  teaser: Teaser
669
693
 
670
694
  "An array of concepts related to the article, eg. organisations or topics."
671
- annotations: [Concept]
695
+ annotations(byPredicate: String): [ConceptInterface!]!
672
696
 
673
697
  "The editorial division the article belongs to, eg. 'FT-SpecialReports'."
674
698
  editorialDesk: String
@@ -3,10 +3,10 @@ type ImageSource {
3
3
  url: String!
4
4
 
5
5
  "The width of the image source in pixels."
6
- width: Int
6
+ width: Int!
7
7
 
8
8
  "The device pixel ratio. DPR is calculated as DPR = Physical Pixels (pixels seen on screen) / Logical Pixels (pixel that can fit in a given space)."
9
- dpr: Int
9
+ dpr: Int!
10
10
  }
11
11
 
12
12
  interface Image {
@@ -23,7 +23,7 @@ interface Image {
23
23
  sourceSet(width: Int, maxDpr: Int): [ImageSource!]!
24
24
 
25
25
  "The url of the image, eg. 'https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3Aimage%3A0e7e7b6e-4e7b-11e9-bde6-79e4b4311f90?source=next&fit=scale-down&width=700'."
26
- url: String
26
+ url: String!
27
27
 
28
28
  "Text describing the content of the image, usually hidden from the user unless the image is not available. It is to be read by screen readers."
29
29
  altText: String
@@ -55,7 +55,7 @@ type ImageStandardInline implements Image {
55
55
  sourceSet(width: Int, maxDpr: Int): [ImageSource!]!
56
56
 
57
57
  "The url of the image, eg. 'https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3Aimage%3A0e7e7b6e-4e7b-11e9-bde6-79e4b4311f90?source=next&fit=scale-down&width=700'."
58
- url: String
58
+ url: String!
59
59
 
60
60
  "Text describing the content of the image, usually hidden from the user unless the image is not available. It is to be read by screen readers."
61
61
  altText: String
@@ -87,7 +87,7 @@ type ImageDesktop implements Image {
87
87
  sourceSet(width: Int, maxDpr: Int): [ImageSource!]!
88
88
 
89
89
  "The url of the image, eg. 'https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3Aimage%3A0e7e7b6e-4e7b-11e9-bde6-79e4b4311f90?source=next&fit=scale-down&width=700'."
90
- url: String
90
+ url: String!
91
91
 
92
92
  "Text describing the content of the image, usually hidden from the user unless the image is not available. It is to be read by screen readers."
93
93
  altText: String
@@ -119,7 +119,7 @@ type ImageMobile implements Image {
119
119
  sourceSet(width: Int, maxDpr: Int): [ImageSource!]!
120
120
 
121
121
  "The url of the image, eg. 'https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3Aimage%3A0e7e7b6e-4e7b-11e9-bde6-79e4b4311f90?source=next&fit=scale-down&width=700'."
122
- url: String
122
+ url: String!
123
123
 
124
124
  "Text describing the content of the image, usually hidden from the user unless the image is not available. It is to be read by screen readers."
125
125
  altText: String
@@ -151,7 +151,7 @@ type ImageStandard implements Image {
151
151
  sourceSet(width: Int, maxDpr: Int): [ImageSource!]!
152
152
 
153
153
  "The url of the image, eg. 'https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3Aimage%3A0e7e7b6e-4e7b-11e9-bde6-79e4b4311f90?source=next&fit=scale-down&width=700'."
154
- url: String
154
+ url: String!
155
155
 
156
156
  "Text describing the content of the image, usually hidden from the user unless the image is not available. It is to be read by screen readers."
157
157
  altText: String
@@ -183,7 +183,7 @@ type ImageSquare implements Image {
183
183
  sourceSet(width: Int, maxDpr: Int): [ImageSource!]!
184
184
 
185
185
  "The url of the image, eg. 'https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3Aimage%3A0e7e7b6e-4e7b-11e9-bde6-79e4b4311f90?source=next&fit=scale-down&width=700'."
186
- url: String
186
+ url: String!
187
187
 
188
188
  "Text describing the content of the image, usually hidden from the user unless the image is not available. It is to be read by screen readers."
189
189
  altText: String
@@ -215,7 +215,7 @@ type ImageWide implements Image {
215
215
  sourceSet(width: Int, maxDpr: Int): [ImageSource!]!
216
216
 
217
217
  "The url of the image, eg. 'https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3Aimage%3A0e7e7b6e-4e7b-11e9-bde6-79e4b4311f90?source=next&fit=scale-down&width=700'."
218
- url: String
218
+ url: String!
219
219
 
220
220
  "Text describing the content of the image, usually hidden from the user unless the image is not available. It is to be read by screen readers."
221
221
  altText: String
@@ -247,7 +247,7 @@ type ImageSquareFTEdit implements Image {
247
247
  sourceSet(width: Int, maxDpr: Int): [ImageSource!]!
248
248
 
249
249
  "The url of the image, eg. 'https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3Aimage%3A0e7e7b6e-4e7b-11e9-bde6-79e4b4311f90?source=next&fit=scale-down&width=700'."
250
- url: String
250
+ url: String!
251
251
 
252
252
  "Text describing the content of the image, usually hidden from the user unless the image is not available. It is to be read by screen readers."
253
253
  altText: String
@@ -279,7 +279,7 @@ type ImagePortrait implements Image {
279
279
  sourceSet(width: Int, maxDpr: Int): [ImageSource!]!
280
280
 
281
281
  "The url of the image, eg. 'https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3Aimage%3A0e7e7b6e-4e7b-11e9-bde6-79e4b4311f90?source=next&fit=scale-down&width=700'."
282
- url: String
282
+ url: String!
283
283
 
284
284
  "Text describing the content of the image, usually hidden from the user unless the image is not available. It is to be read by screen readers."
285
285
  altText: String
@@ -311,7 +311,7 @@ type ImageLandscape implements Image {
311
311
  sourceSet(width: Int, maxDpr: Int): [ImageSource!]!
312
312
 
313
313
  "The url of the image, eg. 'https://www.ft.com/__origami/service/image/v2/images/raw/ftcms%3Aimage%3A0e7e7b6e-4e7b-11e9-bde6-79e4b4311f90?source=next&fit=scale-down&width=700'."
314
- url: String
314
+ url: String!
315
315
 
316
316
  "Text describing the content of the image, usually hidden from the user unless the image is not available. It is to be read by screen readers."
317
317
  altText: String
@@ -0,0 +1,32 @@
1
+ type FlourishSource {
2
+ "The id of the source."
3
+ id: String!
4
+
5
+ "The Origami image service url"
6
+ url: String!
7
+
8
+ "The type of the source, e.g. visualisation for leadFlourish "
9
+ type: String!
10
+
11
+ "The format of the source, eg. 'standard'."
12
+ format: ImageFormat!
13
+
14
+ "The width of the source."
15
+ width: Int!
16
+
17
+ "The height of the source."
18
+ height: Int!
19
+ }
20
+
21
+ type LeadFlourish {
22
+ "The type of the chart, eg. 'visualisation'."
23
+ type: String
24
+
25
+ "The id of the Flourish chart."
26
+ id: String
27
+
28
+ "The description of the Flourish chart."
29
+ description: String
30
+
31
+ fallbackImage: FlourishSource!
32
+ }
@@ -1,5 +1,5 @@
1
1
  type Person {
2
2
  prefLabel: String
3
3
  headshot(width: Int, dpr: Int): String
4
- streamPage: String
5
- }
4
+ streamPage: String @deprecated(reason: "use Concept.url instead")
5
+ }
@@ -1,5 +1,5 @@
1
- "A wrapper for images."
2
- interface Picture {
1
+ "A wrapper for images."
2
+ interface Picture {
3
3
  "A set of images with different sizes and formats."
4
4
  images: [Image!]!
5
5
 
@@ -13,7 +13,7 @@ interface Picture {
13
13
  credit: String
14
14
 
15
15
  "The layout width of the image, eg, 'standard'."
16
- layoutWidth: String
16
+ layoutWidth: String!
17
17
 
18
18
  "The type of the image, eg. 'image' or 'graphic'."
19
19
  imageType: ImageType!
@@ -36,7 +36,7 @@ type PictureStandard implements Picture {
36
36
  credit: String
37
37
 
38
38
  "The layout width of the image, eg, 'standard'."
39
- layoutWidth: String
39
+ layoutWidth: String!
40
40
 
41
41
  "The type of the image, eg. 'image' or 'graphic'."
42
42
  imageType: ImageType!
@@ -59,7 +59,7 @@ type PictureInline implements Picture {
59
59
  credit: String
60
60
 
61
61
  "The layout width of the image, eg, 'standard'."
62
- layoutWidth: String
62
+ layoutWidth: String!
63
63
 
64
64
  "The type of the image, eg. 'image' or 'graphic'."
65
65
  imageType: ImageType!
@@ -82,7 +82,7 @@ type PictureFullBleed implements Picture {
82
82
  credit: String
83
83
 
84
84
  "The layout width of the image, eg, 'standard'."
85
- layoutWidth: String
85
+ layoutWidth: String!
86
86
 
87
87
  "The type of the image, eg. 'image' or 'graphic'."
88
88
  imageType: ImageType!
@@ -0,0 +1,7 @@
1
+ type AuthorReference implements Reference {
2
+ "The type of the reference, 'author'"
3
+ type: String!
4
+
5
+ "The concept for this author"
6
+ concept: ConceptInterface
7
+ }
@@ -7,18 +7,30 @@ type ClipSet implements Reference {
7
7
 
8
8
  "Whether the clip should play automatically when loaded."
9
9
  autoplay: Boolean
10
+ @deprecated(
11
+ reason: "field is redundant as already returned in content-tree"
12
+ )
10
13
 
11
14
  "An object containing the accessibility details of the clip."
12
15
  accessibility: Accessibility
13
16
 
14
17
  "Whether the clip should loop."
15
18
  loop: Boolean
19
+ @deprecated(
20
+ reason: "field is redundant as already returned in content-tree"
21
+ )
16
22
 
17
23
  "Whether the clip should be muted."
18
24
  muted: Boolean
25
+ @deprecated(
26
+ reason: "field is redundant as already returned in content-tree"
27
+ )
19
28
 
20
29
  "The layout of the clip set, eg. 'in-line'."
21
30
  dataLayout: String
31
+ @deprecated(
32
+ reason: "field is redundant as already returned in content-tree"
33
+ )
22
34
 
23
35
  "Whether the clip set should **not** include audio."
24
36
  noAudio: Boolean
@@ -36,7 +48,7 @@ type ClipSet implements Reference {
36
48
  displayTitle: String
37
49
 
38
50
  "An array of content warnings for the clip set."
39
- contentWarning: [String]
51
+ contentWarning: [String!]
40
52
 
41
53
  "The source of the clip set, eg. 'YouTube'."
42
54
  source: String
@@ -48,5 +60,5 @@ type ClipSet implements Reference {
48
60
  publishedDate: String
49
61
 
50
62
  "An array of clips in the clip set."
51
- clips: [Clip]
63
+ clips: [Clip!]
52
64
  }
@@ -3,5 +3,5 @@ type Tweet implements Reference {
3
3
  type: String!
4
4
 
5
5
  "The raw HTML of the tweet."
6
- html: String
6
+ html: String!
7
7
  }