@financial-times/cp-content-pipeline-schema 1.4.3 → 1.5.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 (87) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/lib/fixtures/capiObject.js +1 -1
  3. package/lib/fixtures/capiObject.js.map +1 -1
  4. package/lib/fixtures/clipSet.d.ts +2 -0
  5. package/lib/fixtures/clipSet.js +70 -0
  6. package/lib/fixtures/clipSet.js.map +1 -0
  7. package/lib/generated/index.d.ts +136 -3
  8. package/lib/model/CapiResponse.d.ts +3 -2
  9. package/lib/model/CapiResponse.js +10 -1
  10. package/lib/model/CapiResponse.js.map +1 -1
  11. package/lib/model/Clip.d.ts +28 -0
  12. package/lib/model/Clip.js +51 -0
  13. package/lib/model/Clip.js.map +1 -0
  14. package/lib/model/schemas/capi/article.d.ts +605 -9
  15. package/lib/model/schemas/capi/article.js +1 -0
  16. package/lib/model/schemas/capi/article.js.map +1 -1
  17. package/lib/model/schemas/capi/audio.d.ts +34 -31
  18. package/lib/model/schemas/capi/audio.js +1 -0
  19. package/lib/model/schemas/capi/audio.js.map +1 -1
  20. package/lib/model/schemas/capi/base-schema.d.ts +1358 -14
  21. package/lib/model/schemas/capi/base-schema.js +46 -2
  22. package/lib/model/schemas/capi/base-schema.js.map +1 -1
  23. package/lib/model/schemas/capi/content-package.d.ts +6 -3
  24. package/lib/model/schemas/capi/content-package.js +1 -0
  25. package/lib/model/schemas/capi/content-package.js.map +1 -1
  26. package/lib/model/schemas/capi/live-blog-package.d.ts +605 -9
  27. package/lib/model/schemas/capi/live-blog-package.js +1 -0
  28. package/lib/model/schemas/capi/live-blog-package.js.map +1 -1
  29. package/lib/model/schemas/capi/placeholder.d.ts +605 -9
  30. package/lib/model/schemas/capi/placeholder.js +1 -0
  31. package/lib/model/schemas/capi/placeholder.js.map +1 -1
  32. package/lib/resolvers/clip.d.ts +10 -0
  33. package/lib/resolvers/clip.js +13 -0
  34. package/lib/resolvers/clip.js.map +1 -0
  35. package/lib/resolvers/content-tree/Workarounds.d.ts +10 -2
  36. package/lib/resolvers/content-tree/nodePredicates.d.ts +3 -3
  37. package/lib/resolvers/content-tree/references/ClipSet.d.ts +27 -0
  38. package/lib/resolvers/content-tree/references/ClipSet.js +37 -0
  39. package/lib/resolvers/content-tree/references/ClipSet.js.map +1 -0
  40. package/lib/resolvers/content-tree/references/ImageSet.js +3 -2
  41. package/lib/resolvers/content-tree/references/ImageSet.js.map +1 -1
  42. package/lib/resolvers/content-tree/references/Reference.d.ts +1 -1
  43. package/lib/resolvers/content-tree/references/ScrollyImage.js +3 -2
  44. package/lib/resolvers/content-tree/references/ScrollyImage.js.map +1 -1
  45. package/lib/resolvers/content-tree/references/index.d.ts +4 -1
  46. package/lib/resolvers/content-tree/references/index.js +4 -0
  47. package/lib/resolvers/content-tree/references/index.js.map +1 -1
  48. package/lib/resolvers/content-tree/tagMappings.js +9 -0
  49. package/lib/resolvers/content-tree/tagMappings.js.map +1 -1
  50. package/lib/resolvers/content.d.ts +1 -0
  51. package/lib/resolvers/content.js +1 -0
  52. package/lib/resolvers/content.js.map +1 -1
  53. package/lib/resolvers/index.d.ts +10 -0
  54. package/lib/resolvers/index.js +2 -0
  55. package/lib/resolvers/index.js.map +1 -1
  56. package/lib/resolvers/scalars.d.ts +2 -0
  57. package/lib/resolvers/scalars.js +6 -1
  58. package/lib/resolvers/scalars.js.map +1 -1
  59. package/package.json +1 -1
  60. package/src/fixtures/capiObject.ts +1 -1
  61. package/src/fixtures/clipSet.ts +72 -0
  62. package/src/generated/index.ts +144 -3
  63. package/src/model/CapiResponse.ts +12 -2
  64. package/src/model/Clip.ts +75 -0
  65. package/src/model/__snapshots__/RichText.test.ts.snap +25 -0
  66. package/src/model/schemas/capi/article.ts +1 -0
  67. package/src/model/schemas/capi/audio.ts +1 -0
  68. package/src/model/schemas/capi/base-schema.ts +50 -1
  69. package/src/model/schemas/capi/content-package.ts +1 -0
  70. package/src/model/schemas/capi/live-blog-package.ts +1 -0
  71. package/src/model/schemas/capi/placeholder.ts +1 -0
  72. package/src/resolvers/clip.ts +13 -0
  73. package/src/resolvers/content-tree/Workarounds.ts +13 -2
  74. package/src/resolvers/content-tree/references/ClipSet.ts +49 -0
  75. package/src/resolvers/content-tree/references/ImageSet.ts +9 -5
  76. package/src/resolvers/content-tree/references/ScrollyImage.ts +9 -5
  77. package/src/resolvers/content-tree/references/index.ts +6 -0
  78. package/src/resolvers/content-tree/tagMappings.ts +10 -0
  79. package/src/resolvers/content.ts +1 -0
  80. package/src/resolvers/index.ts +2 -0
  81. package/src/resolvers/scalars.ts +8 -0
  82. package/src/types/internal-content.d.ts +4 -0
  83. package/tsconfig.tsbuildinfo +1 -1
  84. package/typedefs/clip.graphql +28 -0
  85. package/typedefs/content.graphql +8 -2
  86. package/typedefs/references/clipSet.graphql +19 -0
  87. package/typedefs/scalars.graphql +1 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.5.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v1.4.4...cp-content-pipeline-schema-v1.5.0) (2023-10-31)
4
+
5
+
6
+ ### Features
7
+
8
+ * add accessibility to ClipSet schema ([9eb2dde](https://github.com/Financial-Times/cp-content-pipeline/commit/9eb2dde1377965f315b9c702b4abb683cc37d12e))
9
+ * add clip and clipset schema ([a765b91](https://github.com/Financial-Times/cp-content-pipeline/commit/a765b917fc3f3ffa05b52662687239a27ec29d0c))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * correct dataLayout attribute ([59bee9a](https://github.com/Financial-Times/cp-content-pipeline/commit/59bee9a018f703b5e94cf87ca68492ddf25a7532))
15
+ * get this working with old clips ([ca5944a](https://github.com/Financial-Times/cp-content-pipeline/commit/ca5944a74683c23102287f452a684bdf2b84e1a7))
16
+ * make poster optional ([af793fd](https://github.com/Financial-Times/cp-content-pipeline/commit/af793fd10dc7034a91bba35e2ca550d535fe6303))
17
+ * resolve v1 caption, description, credits ([b3ec137](https://github.com/Financial-Times/cp-content-pipeline/commit/b3ec1374bfda8d899c18d6cfebbe52bc79b89a0a))
18
+ * sort dataSource to avoid video not showing ([724ef51](https://github.com/Financial-Times/cp-content-pipeline/commit/724ef510e45a604e2bd29836b1a6bd6f4f160076))
19
+
20
+ ## [1.4.4](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v1.4.3...cp-content-pipeline-schema-v1.4.4) (2023-10-26)
21
+
22
+
23
+ ### Bug Fixes
24
+
25
+ * add missing originatingParty property ([8f684a8](https://github.com/Financial-Times/cp-content-pipeline/commit/8f684a8fd252b4f0d4196f77ee4cfd319f2a679a))
26
+
3
27
  ## [1.4.3](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v1.4.2...cp-content-pipeline-schema-v1.4.3) (2023-10-17)
4
28
 
5
29
 
@@ -9,7 +9,7 @@ exports.baseCapiObject = {
9
9
  title: 'Kwarteng faces test persuading UK watchdog of fiscal plans',
10
10
  standfirst: '',
11
11
  byline: 'Chris Giles in London',
12
- bodyXML: `<body><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/c45f7393-62c8-4a6b-b53d-641725351851" data-embedded="true"></ft-content><p><a href="https://amzn.to/3V3cwPP"><strong>Eliot After The Waste Land</strong></a><strong> (Eliot Biographies, 2)<br/></strong>by Robert Crawford, <em>Jonathan Cape £25</em></p><p>After a six-year wait, Robert Crawford follows up <em>Young Eliot</em> (2016) with his <a href="https://www.ft.com/content/210d7f37-115e-4197-b392-ffb094ed2699">second (and final) volume</a> on the life of TS Eliot in time for the centenary of “The Waste Land”. Here, he explores Eliot’s marriage, religious life and draws on the 1,131 letters written to American friend Emily Hale that were only released from embargo in 2020 to probe the poet’s later years with tact and empathy.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/bf48b0fc-ad4b-4ce9-a734-faf3e9aab225" data-embedded="true"></ft-content><p><a href="https://amzn.to/3UFKeul"><strong>All the Knowledge in the World</strong></a><strong>: The Extraordinary History of the Encyclopaedia<br/></strong>by Simon Garfield, <em>Weidenfeld &amp; Nicolson £18.99</em></p><p>Simon Garfield, author of quirky histories on everything from fonts to maps, surveys the publishing phenomenon that is the encyclopedia. Tracing its origins from Ancient Greece right up to its modern incarnation in Wikipedia, his handsome book offers an erudite and amusing exploration of the human quest for knowledge.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/cc74e2ec-3314-4b9f-81c1-bcfdf9dbaf99" data-embedded="true"></ft-content><p><a href="https://amzn.to/3VbW1AB"><strong>The Waste Land</strong></a><strong>: A Biography of a Poem<br/></strong>by Matthew Hollis, <em>Faber £20</em></p><p>In the 100 years since TS Eliot penned his famous poem, it has taken on a life of its own. So it’s fitting, perhaps, that Matthew Hollis treats Eliot’s work to its own biography. This richly analytical book locates the poem’s genesis in the aftermath of the first world war and the “nightmare agony” of Eliot’s disastrous marriage.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/7393690b-e02e-4cdb-a263-57e7d1a6eedf" data-embedded="true"></ft-content><p><a href="https://amzn.to/3OgAT9M"><strong>Endless Flight</strong></a><strong>: The Life of Joseph Roth<br/></strong>by Keiron Pim, <em>Granta £25</em></p><p>“I paint the portrait of the age,” Joseph Roth once claimed. Certainly, his work as a journalist from 1917-1939, dissecting central and eastern Europe in more than a thousand essays and anticipating the collapse of democracy on the continent as well as 19 novels provides an exceptional anatomy of a tumultuous period of history. Keiron Pim’s <a href="https://www.ft.com/content/fee9056b-277e-41b4-9572-9fbac39f957b">biography</a> goes some way to introducing the great Austro-Hungarian writer to a new age.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/6e7b048f-d08f-43f7-b1fa-95e98c8ca811" data-embedded="true"></ft-content><p><a href="https://amzn.to/3hX8PfS"><strong>Super-Infinite</strong></a><strong>: The Transformations of John Donne<br/></strong>by Katherine Rundell, <em>Faber £16.99</em></p><p>Katherine Rundell, a Fellow of All Souls College, Oxford, has produced a remarkable life of John Donne, the great poet of love, sex and death. Winner of this year’s Baillie Gifford Prize, her <a href="https://www.ft.com/content/c229396d-5448-44fa-b423-b018695d65d8">biography</a> of the man who was at once soldier, poet, prisoner and priest is sensitive and witty, capturing the essence of a tricky subject. </p><experimental><div class="n-content-layout" data-layout-name="card" data-layout-width="true"><div class="n-content-layout__container"><h2 theme-style="3">Books of the Year 2022</h2><div class="n-content-layout__slot" data-slot-width="true"><h4></h4><div class="n-content-layout__slot" data-slot-width="true"><img alt="" data-copyright="" data-image-type="image" longdesc="" src="https://d1e00ek4ebabms.cloudfront.net/production/43c41a77-ab10-40ed-a2a2-efa99ef32a10.jpg"/></div></div><div class="n-content-layout__slot" data-slot-width="true"><h4></h4><div class="n-content-layout__slot" data-slot-width="true"><p>All this week, FT writers and critics share <a href="https://www.ft.com/content/2dd61d03-13ac-4278-8214-678c1d9a33c1">their favourites</a>. Some highlights are: <br/><br/><strong>Monday:</strong> <a href="https://www.ft.com/content/416e1e1d-22e7-439b-9388-5d0cd56f5a9c">Business</a> by Andrew Hill<br/><strong>Tuesday:</strong> <a href="https://www.ft.com/content/db8aaeb6-141f-4a7c-b364-2296fb0d8065">Environment</a> by Pilita Clark<br/><strong>Wednesday:</strong> <a href="https://www.ft.com/content/634c1974-bc76-4f56-9548-274816dcc638">Economics</a> by Martin Wolf<br/><strong>Thursday:</strong> Fiction by Laura Battle<br/><strong>Friday:</strong> Politics by Gideon Rachman<br/><strong>Saturday:</strong> Critics’ choice</p></div></div></div></div></experimental><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/fde6576e-ab0c-41ec-8e18-bcdb3d6c21c0" data-embedded="true"></ft-content><p><a href="https://amzn.to/3gn2kCl"><strong>The Book of Phobias and Manias</strong></a><strong>: A History of the World in 99 Obsessions<br/></strong>by Kate Summerscale, <em>Profile £16.99</em></p><p>This neat compendium from the prizewinning author of <em>The Suspicions of Mr Whicher</em> charts a broad and intriguing range of fears and madness. Although these phobias and manias are alphabetised, Kate Summerscale suggests groupings (textures, animals, communal crazes) that — accompanied by a lightly erudite introduction — illuminate some of the darker corners of our collective psyche.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/a07a6f3b-41cf-47c7-9b79-1c755ebfe54c" data-embedded="true"></ft-content><p><a href="https://amzn.to/3hX9oq0"><strong>Papyrus</strong></a><strong>: The Invention of Books in the Ancient World<br/></strong>by Irene Vallejo, <em>Hodder &amp; Stoughton £25</em></p><p>Described as “a masterpiece” by Mario Vargas Llosa when it was first published in Spain in 2019, this bestselling phenomenon is now available in English. In it, Irene Vallejo recounts the birth of literary culture in the ancient world while interweaving dynamic, thrilling tales that underscore and celebrate the power of words to change the world.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/60b81603-654d-46ac-85ef-5865eb7bc1e8" data-embedded="true"></ft-content><p><a href="https://amzn.to/3EIwiKD"><strong>Magnificent Rebels</strong></a><strong>: The First Romantics and the Invention of the Self</strong><br/>by Andrea Wulf, <em>John Murray £25/Knopf $35</em></p><p>Between 1794-1806, the cream of Germany’s intelligentsia descended on the tiny university town of Jena. There, Johann Wolfgang von Goethe mingled with philosophers Friedrich Schelling and Georg Wilhelm Friedrich Hegel, the scientist-explorer Alexander von Humboldt and the playwright Friedrich Schiller during the first flush of Romanticism. Andrea Wulf’s wonderful <a href="https://www.ft.com/content/391e2bcd-f14e-44e5-b6de-40990ce7272f">book</a> brings to life the “Jena set” and a golden age of German culture. </p><experimental><div class="n-content-layout" data-layout-name="card" data-layout-width="fullWidth"><div class="n-content-layout__container"><h3>Tell us what you think</h3><div class="n-content-layout__slot" data-slot-width="true"><p>What are your favourites from this list — and what books have we missed? Tell us in the comments below</p></div></div></div></experimental><p><em>Join our online book group on Facebook at </em><a href="https://www.facebook.com/groups/139838140082304/"><em>FT Books Café</em></a></p></body>`,
12
+ bodyXML: `<body><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/c45f7393-62c8-4a6b-b53d-641725351851" data-embedded="true"></ft-content><p><a href="https://amzn.to/3V3cwPP"><strong>Eliot After The Waste Land</strong></a><strong> (Eliot Biographies, 2)<br/></strong>by Robert Crawford, <em>Jonathan Cape £25</em></p><p>After a six-year wait, Robert Crawford follows up <em>Young Eliot</em> (2016) with his <a href="https://www.ft.com/content/210d7f37-115e-4197-b392-ffb094ed2699">second (and final) volume</a> on the life of TS Eliot in time for the centenary of “The Waste Land”. Here, he explores Eliot’s marriage, religious life and draws on the 1,131 letters written to American friend Emily Hale that were only released from embargo in 2020 to probe the poet’s later years with tact and empathy.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/bf48b0fc-ad4b-4ce9-a734-faf3e9aab225" data-embedded="true"></ft-content><p><a href="https://amzn.to/3UFKeul"><strong>All the Knowledge in the World</strong></a><strong>: The Extraordinary History of the Encyclopaedia<br/></strong>by Simon Garfield, <em>Weidenfeld &amp; Nicolson £18.99</em></p><p>Simon Garfield, author of quirky histories on everything from fonts to maps, surveys the publishing phenomenon that is the encyclopedia. Tracing its origins from Ancient Greece right up to its modern incarnation in Wikipedia, his handsome book offers an erudite and amusing exploration of the human quest for knowledge.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/cc74e2ec-3314-4b9f-81c1-bcfdf9dbaf99" data-embedded="true"></ft-content><p><a href="https://amzn.to/3VbW1AB"><strong>The Waste Land</strong></a><strong>: A Biography of a Poem<br/></strong>by Matthew Hollis, <em>Faber £20</em></p><p>In the 100 years since TS Eliot penned his famous poem, it has taken on a life of its own. So it’s fitting, perhaps, that Matthew Hollis treats Eliot’s work to its own biography. This richly analytical book locates the poem’s genesis in the aftermath of the first world war and the “nightmare agony” of Eliot’s disastrous marriage.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/7393690b-e02e-4cdb-a263-57e7d1a6eedf" data-embedded="true"></ft-content><p><a href="https://amzn.to/3OgAT9M"><strong>Endless Flight</strong></a><strong>: The Life of Joseph Roth<br/></strong>by Keiron Pim, <em>Granta £25</em></p><p>“I paint the portrait of the age,” Joseph Roth once claimed. Certainly, his work as a journalist from 1917-1939, dissecting central and eastern Europe in more than a thousand essays and anticipating the collapse of democracy on the continent as well as 19 novels provides an exceptional anatomy of a tumultuous period of history. Keiron Pim’s <a href="https://www.ft.com/content/fee9056b-277e-41b4-9572-9fbac39f957b">biography</a> goes some way to introducing the great Austro-Hungarian writer to a new age.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/6e7b048f-d08f-43f7-b1fa-95e98c8ca811" data-embedded="true"></ft-content><p><a href="https://amzn.to/3hX8PfS"><strong>Super-Infinite</strong></a><strong>: The Transformations of John Donne<br/></strong>by Katherine Rundell, <em>Faber £16.99</em></p><p>Katherine Rundell, a Fellow of All Souls College, Oxford, has produced a remarkable life of John Donne, the great poet of love, sex and death. Winner of this year’s Baillie Gifford Prize, her <a href="https://www.ft.com/content/c229396d-5448-44fa-b423-b018695d65d8">biography</a> of the man who was at once soldier, poet, prisoner and priest is sensitive and witty, capturing the essence of a tricky subject. </p><experimental><div class="n-content-layout" data-layout-name="card" data-layout-width="true"><div class="n-content-layout__container"><h2 theme-style="3">Books of the Year 2022</h2><div class="n-content-layout__slot" data-slot-width="true"><h4></h4><div class="n-content-layout__slot" data-slot-width="true"><img alt="" data-copyright="" data-image-type="image" longdesc="" src="https://d1e00ek4ebabms.cloudfront.net/production/43c41a77-ab10-40ed-a2a2-efa99ef32a10.jpg"/></div></div><div class="n-content-layout__slot" data-slot-width="true"><h4></h4><div class="n-content-layout__slot" data-slot-width="true"><p>All this week, FT writers and critics share <a href="https://www.ft.com/content/2dd61d03-13ac-4278-8214-678c1d9a33c1">their favourites</a>. Some highlights are: <br/><br/><strong>Monday:</strong> <a href="https://www.ft.com/content/416e1e1d-22e7-439b-9388-5d0cd56f5a9c">Business</a> by Andrew Hill<br/><strong>Tuesday:</strong> <a href="https://www.ft.com/content/db8aaeb6-141f-4a7c-b364-2296fb0d8065">Environment</a> by Pilita Clark<br/><strong>Wednesday:</strong> <a href="https://www.ft.com/content/634c1974-bc76-4f56-9548-274816dcc638">Economics</a> by Martin Wolf<br/><strong>Thursday:</strong> Fiction by Laura Battle<br/><strong>Friday:</strong> Politics by Gideon Rachman<br/><strong>Saturday:</strong> Critics’ choice</p></div></div></div></div></experimental><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/fde6576e-ab0c-41ec-8e18-bcdb3d6c21c0" data-embedded="true"></ft-content><p><a href="https://amzn.to/3gn2kCl"><strong>The Book of Phobias and Manias</strong></a><strong>: A History of the World in 99 Obsessions<br/></strong>by Kate Summerscale, <em>Profile £16.99</em></p><p>This neat compendium from the prizewinning author of <em>The Suspicions of Mr Whicher</em> charts a broad and intriguing range of fears and madness. Although these phobias and manias are alphabetised, Kate Summerscale suggests groupings (textures, animals, communal crazes) that — accompanied by a lightly erudite introduction — illuminate some of the darker corners of our collective psyche.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/a07a6f3b-41cf-47c7-9b79-1c755ebfe54c" data-embedded="true"></ft-content><p><a href="https://amzn.to/3hX9oq0"><strong>Papyrus</strong></a><strong>: The Invention of Books in the Ancient World<br/></strong>by Irene Vallejo, <em>Hodder &amp; Stoughton £25</em></p><p>Described as “a masterpiece” by Mario Vargas Llosa when it was first published in Spain in 2019, this bestselling phenomenon is now available in English. In it, Irene Vallejo recounts the birth of literary culture in the ancient world while interweaving dynamic, thrilling tales that underscore and celebrate the power of words to change the world.</p><ft-content type="http://www.ft.com/ontology/content/ImageSet" url="http://api.ft.com/content/60b81603-654d-46ac-85ef-5865eb7bc1e8" data-embedded="true"></ft-content><p><a href="https://amzn.to/3EIwiKD"><strong>Magnificent Rebels</strong></a><strong>: The First Romantics and the Invention of the Self</strong><br/>by Andrea Wulf, <em>John Murray £25/Knopf $35</em></p><ft-content type="http://www.ft.com/ontology/content/ClipSet" url="http://api-t.ft.com/content/f17fe25b-cdea-4d5f-a6af-40e56e33e888" autoplay="true" data-layout="in-line" loop="true" muted="true"></ft-content><p>Between 1794-1806, the cream of Germany’s intelligentsia descended on the tiny university town of Jena. There, Johann Wolfgang von Goethe mingled with philosophers Friedrich Schelling and Georg Wilhelm Friedrich Hegel, the scientist-explorer Alexander von Humboldt and the playwright Friedrich Schiller during the first flush of Romanticism. Andrea Wulf’s wonderful <a href="https://www.ft.com/content/391e2bcd-f14e-44e5-b6de-40990ce7272f">book</a> brings to life the “Jena set” and a golden age of German culture. </p><experimental><div class="n-content-layout" data-layout-name="card" data-layout-width="fullWidth"><div class="n-content-layout__container"><h3>Tell us what you think</h3><div class="n-content-layout__slot" data-slot-width="true"><p>What are your favourites from this list — and what books have we missed? Tell us in the comments below</p></div></div></div></experimental><p><em>Join our online book group on Facebook at </em><a href="https://www.facebook.com/groups/139838140082304/"><em>FT Books Café</em></a></p></body>`,
13
13
  annotations: [
14
14
  {
15
15
  apiUrl: 'http://api.ft.com/things/9bfe954c-e0ec-4716-ae91-24bd0f7860c9',
@@ -1 +1 @@
1
- {"version":3,"file":"capiObject.js","sourceRoot":"","sources":["../../src/fixtures/capiObject.ts"],"names":[],"mappings":";;;AAEa,QAAA,cAAc,GAAoB;IAC7C,EAAE,EAAE,8DAA8D;IAClE,IAAI,EAAE,4CAA4C;IAClD,KAAK,EAAE,CAAC,4CAA4C,CAAC;IACrD,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,4DAA4D;IACnE,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,g5PAAg5P;IACz5P,WAAW,EAAE;QACX;YACE,MAAM,EAAE,+DAA+D;YACvE,UAAU,EAAE,kCAAkC;YAC9C,EAAE,EAAE,+DAA+D;YACnE,SAAS,EAAE,6CAA6C;YACxD,SAAS,EAAE,qBAAqB;YAChC,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,uCAAuC;gBACvC,4CAA4C;gBAC5C,kCAAkC;aACnC;SACF;QACD;YACE,MAAM,EAAE,+DAA+D;YACvE,UAAU,EAAE,kCAAkC;YAC9C,EAAE,EAAE,+DAA+D;YACnE,SAAS,EAAE,0CAA0C;YACrD,SAAS,EAAE,sBAAsB;YACjC,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,uCAAuC;gBACvC,4CAA4C;gBAC5C,kCAAkC;aACnC;SACF;QACD;YACE,EAAE,EAAE,+DAA+D;YACnE,SAAS,EAAE,iDAAiD;YAC5D,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,EAAE;YACd,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;SACV;KACF;IACD,SAAS,EAAE;QACT,EAAE,EAAE,EAAE;QACN,IAAI,EAAE,0CAAmD;QACzD,KAAK,EAAE,EAAE;QACT,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,uCAAuC;KACnD;IACD,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,SAAkB;IAC/B,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,EAAE;IACjB,kBAAkB,EAAE,EAAE;CACvB,CAAA"}
1
+ {"version":3,"file":"capiObject.js","sourceRoot":"","sources":["../../src/fixtures/capiObject.ts"],"names":[],"mappings":";;;AAEa,QAAA,cAAc,GAAoB;IAC7C,EAAE,EAAE,8DAA8D;IAClE,IAAI,EAAE,4CAA4C;IAClD,KAAK,EAAE,CAAC,4CAA4C,CAAC;IACrD,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,4DAA4D;IACnE,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,imQAAimQ;IAC1mQ,WAAW,EAAE;QACX;YACE,MAAM,EAAE,+DAA+D;YACvE,UAAU,EAAE,kCAAkC;YAC9C,EAAE,EAAE,+DAA+D;YACnE,SAAS,EAAE,6CAA6C;YACxD,SAAS,EAAE,qBAAqB;YAChC,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,uCAAuC;gBACvC,4CAA4C;gBAC5C,kCAAkC;aACnC;SACF;QACD;YACE,MAAM,EAAE,+DAA+D;YACvE,UAAU,EAAE,kCAAkC;YAC9C,EAAE,EAAE,+DAA+D;YACnE,SAAS,EAAE,0CAA0C;YACrD,SAAS,EAAE,sBAAsB;YACjC,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,uCAAuC;gBACvC,4CAA4C;gBAC5C,kCAAkC;aACnC;SACF;QACD;YACE,EAAE,EAAE,+DAA+D;YACnE,SAAS,EAAE,iDAAiD;YAC5D,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,EAAE;YACd,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;SACV;KACF;IACD,SAAS,EAAE;QACT,EAAE,EAAE,EAAE;QACN,IAAI,EAAE,0CAAmD;QACzD,KAAK,EAAE,EAAE;QACT,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,uCAAuC;KACnD;IACD,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,SAAkB;IAC/B,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,EAAE;IACjB,kBAAkB,EAAE,EAAE;CACvB,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { ClipSet as ClipSetType } from '../types/internal-content';
2
+ export declare const ClipSet: ClipSetType;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClipSet = void 0;
4
+ exports.ClipSet = {
5
+ accessibility: {
6
+ captions: [
7
+ {
8
+ mediaType: 'text/vtt',
9
+ url: 'https://next-media-api.ft.com/captions/16862228218010.vtt',
10
+ },
11
+ ],
12
+ transcript: '<p>Hydrogen is this magic molecule which is the lightest, the most energetic and the most abundant in the universe. ... </p>',
13
+ },
14
+ description: "The global push for net zero carbon emissions is one of humanity's greatest challenges. ...",
15
+ displayTitle: 'Ukranians fight back',
16
+ contentWarning: ['graphic violence', 'animal cruelty'],
17
+ id: 'http://www.ft.com/thing/f17fe25b-cdea-4d5f-a6af-40e56e33e888',
18
+ members: [
19
+ {
20
+ format: 'standardInline',
21
+ id: 'https://api.ft.com/content/4d000e07-d679-4e3b-bd6d-afa3461243a8',
22
+ type: 'http://www.ft.com/ontology/content/Clip',
23
+ dataSource: [
24
+ {
25
+ audioCodec: 'mp3',
26
+ binaryUrl: 'https://next-media-api.ft.com/renditions/16868569859480/0x0.mp3',
27
+ duration: 1057,
28
+ mediaType: 'audio/mpeg',
29
+ pixelHeight: 720,
30
+ pixelWidth: 1280,
31
+ videoCodec: 'h264',
32
+ },
33
+ ],
34
+ poster: {
35
+ id: 'https://api.ft.com/content/2f730c3c-1fb2-4131-9697-c534fe1ee488',
36
+ type: 'http://www.ft.com/ontology/content/ImageSet',
37
+ description: 'Picture for video',
38
+ members: [],
39
+ },
40
+ },
41
+ {
42
+ format: 'mobile',
43
+ id: 'https://api.ft.com/content/b529ba2b-d424-4f85-a93f-8413636dac82',
44
+ type: 'http://www.ft.com/ontology/content/Clip',
45
+ dataSource: [
46
+ {
47
+ audioCodec: 'mp3',
48
+ binaryUrl: 'https://next-media-api.ft.com/renditions/16868569859480/0x0.mp3',
49
+ duration: 1057,
50
+ mediaType: 'audio/mpeg',
51
+ pixelHeight: 720,
52
+ pixelWidth: 1280,
53
+ videoCodec: 'h264',
54
+ },
55
+ ],
56
+ poster: {
57
+ id: 'https://api.ft.com/content/2f730c3c-1fb2-4131-9697-c534fe1ee488',
58
+ type: 'http://www.ft.com/ontology/content/ImageSet',
59
+ description: 'Picture for video',
60
+ members: [],
61
+ },
62
+ },
63
+ ],
64
+ noAudio: false,
65
+ publishedDate: '2023-06-14T03:59:47.543Z',
66
+ source: 'YouGov',
67
+ subtitle: 'Drone hits Moscow tower block',
68
+ type: 'http://www.ft.com/ontology/content/ClipSet',
69
+ };
70
+ //# sourceMappingURL=clipSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipSet.js","sourceRoot":"","sources":["../../src/fixtures/clipSet.ts"],"names":[],"mappings":";;;AAEa,QAAA,OAAO,GAAgB;IAClC,aAAa,EAAE;QACb,QAAQ,EAAE;YACR;gBACE,SAAS,EAAE,UAAU;gBACrB,GAAG,EAAE,2DAA2D;aACjE;SACF;QACD,UAAU,EACR,8HAA8H;KACjI;IACD,WAAW,EACT,6FAA6F;IAC/F,YAAY,EAAE,sBAAsB;IACpC,cAAc,EAAE,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IACtD,EAAE,EAAE,8DAA8D;IAClE,OAAO,EAAE;QACP;YACE,MAAM,EAAE,gBAAgB;YACxB,EAAE,EAAE,iEAAiE;YACrE,IAAI,EAAE,yCAAyC;YAC/C,UAAU,EAAE;gBACV;oBACE,UAAU,EAAE,KAAK;oBACjB,SAAS,EACP,iEAAiE;oBACnE,QAAQ,EAAE,IAAI;oBACd,SAAS,EAAE,YAAY;oBACvB,WAAW,EAAE,GAAG;oBAChB,UAAU,EAAE,IAAI;oBAChB,UAAU,EAAE,MAAM;iBACnB;aACF;YACD,MAAM,EAAE;gBACN,EAAE,EAAE,iEAAiE;gBACrE,IAAI,EAAE,6CAA6C;gBACnD,WAAW,EAAE,mBAAmB;gBAChC,OAAO,EAAE,EAAE;aACZ;SACF;QACD;YACE,MAAM,EAAE,QAAQ;YAChB,EAAE,EAAE,iEAAiE;YACrE,IAAI,EAAE,yCAAyC;YAC/C,UAAU,EAAE;gBACV;oBACE,UAAU,EAAE,KAAK;oBACjB,SAAS,EACP,iEAAiE;oBACnE,QAAQ,EAAE,IAAI;oBACd,SAAS,EAAE,YAAY;oBACvB,WAAW,EAAE,GAAG;oBAChB,UAAU,EAAE,IAAI;oBAChB,UAAU,EAAE,MAAM;iBACnB;aACF;YACD,MAAM,EAAE;gBACN,EAAE,EAAE,iEAAiE;gBACrE,IAAI,EAAE,6CAA6C;gBACnD,WAAW,EAAE,mBAAmB;gBAChC,OAAO,EAAE,EAAE;aACZ;SACF;KACF;IACD,OAAO,EAAE,KAAK;IACd,aAAa,EAAE,0BAA0B;IACzC,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,+BAA+B;IACzC,IAAI,EAAE,4CAA4C;CACnD,CAAA"}
@@ -2,12 +2,13 @@ import type { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } f
2
2
  import type { Concept as ConceptModel } from '../model/Concept';
3
3
  import type { CapiResponse } from '../model/CapiResponse';
4
4
  import type { Image as ImageModel } from '../model/Image';
5
+ import type { Clip as ClipModel } from '../model/Clip';
5
6
  import type { Picture as PictureModel } from '../model/Picture';
6
7
  import type { RichText as RichTextModel } from '../model/RichText';
7
8
  import type { Topper as TopperModel } from '../model/Topper';
8
9
  import type { ContentTree } from '@financial-times/content-tree';
9
10
  import type { ReferenceWithCAPIData } from '../resolvers/content-tree/references';
10
- import type { Video as VideoNode, RawImage as RawImageNode } from '../resolvers/content-tree/Workarounds';
11
+ import type { Video as VideoNode, ClipSet as ClipSetNode, OldClip as OldClipNode, RawImage as RawImageNode } from '../resolvers/content-tree/Workarounds';
11
12
  import type { QueryContext } from '../';
12
13
  export type Maybe<T> = T | null;
13
14
  export type InputMaybe<T> = Maybe<T>;
@@ -64,6 +65,10 @@ export type Scalars = {
64
65
  input: 'yes' | 'no' | 'verify' | 'withContributorPayment' | 'unknown';
65
66
  output: 'yes' | 'no' | 'verify' | 'withContributorPayment' | 'unknown';
66
67
  };
68
+ ClipFormat: {
69
+ input: 'standard-inline' | 'mobile';
70
+ output: 'standard-inline' | 'mobile';
71
+ };
67
72
  ContentType: {
68
73
  input: 'Article' | 'Placeholder' | 'Video' | 'Audio' | 'LiveBlogPackage' | 'LiveBlogPost' | 'ContentPackage' | 'Content' | 'MediaResource';
69
74
  output: 'Article' | 'Placeholder' | 'Video' | 'Audio' | 'LiveBlogPackage' | 'LiveBlogPost' | 'ContentPackage' | 'Content' | 'MediaResource';
@@ -97,6 +102,10 @@ export type Scalars = {
97
102
  output: 'paper' | 'wheat' | 'white' | 'black' | 'claret' | 'oxford' | 'slate' | 'crimson' | 'sky' | 'matisse';
98
103
  };
99
104
  };
105
+ export type Accessibility = {
106
+ readonly captions?: Maybe<ReadonlyArray<Maybe<Caption>>>;
107
+ readonly transcript?: Maybe<Scalars['String']['output']>;
108
+ };
100
109
  export type AltStandfirst = {
101
110
  readonly promotionalStandfirst?: Maybe<Scalars['String']['output']>;
102
111
  };
@@ -118,6 +127,7 @@ export type Article = Content & {
118
127
  readonly firstPublishedDate: Scalars['String']['output'];
119
128
  readonly id: Scalars['ID']['output'];
120
129
  readonly mainImage?: Maybe<Image>;
130
+ readonly originatingParty?: Maybe<Scalars['String']['output']>;
121
131
  readonly publishedDate: Scalars['String']['output'];
122
132
  readonly standfirst?: Maybe<Scalars['String']['output']>;
123
133
  readonly teaser?: Maybe<Teaser>;
@@ -148,6 +158,7 @@ export type Audio = Content & {
148
158
  readonly id: Scalars['ID']['output'];
149
159
  readonly mainImage?: Maybe<Image>;
150
160
  readonly media?: Maybe<ReadonlyArray<Maybe<Media>>>;
161
+ readonly originatingParty?: Maybe<Scalars['String']['output']>;
151
162
  readonly publishedDate: Scalars['String']['output'];
152
163
  readonly standfirst?: Maybe<Scalars['String']['output']>;
153
164
  readonly teaser?: Maybe<Teaser>;
@@ -186,6 +197,45 @@ export type BrandedTopper = Topper & TopperWithBrand & TopperWithTheme & {
186
197
  readonly layout?: Maybe<Scalars['String']['output']>;
187
198
  readonly textShadow?: Maybe<Scalars['Boolean']['output']>;
188
199
  };
200
+ export type Caption = {
201
+ readonly mediaType?: Maybe<Scalars['String']['output']>;
202
+ readonly url?: Maybe<Scalars['String']['output']>;
203
+ };
204
+ export type Clip = {
205
+ readonly dataSource: ReadonlyArray<ClipSource>;
206
+ readonly format?: Maybe<Scalars['ClipFormat']['output']>;
207
+ readonly id: Scalars['String']['output'];
208
+ readonly poster?: Maybe<Scalars['String']['output']>;
209
+ readonly type?: Maybe<Scalars['String']['output']>;
210
+ };
211
+ export type ClipSet = Reference & {
212
+ readonly accessibility?: Maybe<Accessibility>;
213
+ readonly autoplay?: Maybe<Scalars['Boolean']['output']>;
214
+ readonly caption?: Maybe<Scalars['String']['output']>;
215
+ readonly clips?: Maybe<ReadonlyArray<Maybe<Clip>>>;
216
+ readonly contentWarning?: Maybe<ReadonlyArray<Maybe<Scalars['String']['output']>>>;
217
+ readonly credits?: Maybe<Scalars['String']['output']>;
218
+ readonly dataLayout?: Maybe<Scalars['String']['output']>;
219
+ readonly description?: Maybe<Scalars['String']['output']>;
220
+ readonly displayTitle?: Maybe<Scalars['String']['output']>;
221
+ readonly id: Scalars['String']['output'];
222
+ readonly loop?: Maybe<Scalars['Boolean']['output']>;
223
+ readonly muted?: Maybe<Scalars['Boolean']['output']>;
224
+ readonly noAudio?: Maybe<Scalars['Boolean']['output']>;
225
+ readonly publishedDate?: Maybe<Scalars['String']['output']>;
226
+ readonly source?: Maybe<Scalars['String']['output']>;
227
+ readonly subtitle?: Maybe<Scalars['String']['output']>;
228
+ readonly type: Scalars['String']['output'];
229
+ };
230
+ export type ClipSource = {
231
+ readonly audioCodec?: Maybe<Scalars['String']['output']>;
232
+ readonly binaryUrl: Scalars['String']['output'];
233
+ readonly duration?: Maybe<Scalars['Int']['output']>;
234
+ readonly mediaType: Scalars['String']['output'];
235
+ readonly pixelHeight?: Maybe<Scalars['Int']['output']>;
236
+ readonly pixelWidth?: Maybe<Scalars['Int']['output']>;
237
+ readonly videoCodec?: Maybe<Scalars['String']['output']>;
238
+ };
189
239
  export type Concept = {
190
240
  readonly apiUrl?: Maybe<Scalars['String']['output']>;
191
241
  readonly directType?: Maybe<Scalars['String']['output']>;
@@ -215,6 +265,7 @@ export type Content = {
215
265
  readonly firstPublishedDate: Scalars['String']['output'];
216
266
  readonly id: Scalars['ID']['output'];
217
267
  readonly mainImage?: Maybe<Image>;
268
+ readonly originatingParty?: Maybe<Scalars['String']['output']>;
218
269
  readonly publishedDate: Scalars['String']['output'];
219
270
  readonly standfirst?: Maybe<Scalars['String']['output']>;
220
271
  readonly teaser?: Maybe<Teaser>;
@@ -246,6 +297,7 @@ export type ContentPackage = Content & {
246
297
  readonly firstPublishedDate: Scalars['String']['output'];
247
298
  readonly id: Scalars['ID']['output'];
248
299
  readonly mainImage?: Maybe<Image>;
300
+ readonly originatingParty?: Maybe<Scalars['String']['output']>;
249
301
  readonly publishedDate: Scalars['String']['output'];
250
302
  readonly standfirst?: Maybe<Scalars['String']['output']>;
251
303
  readonly tableOfContents?: Maybe<TableOfContents>;
@@ -521,6 +573,7 @@ export type LiveBlogPackage = Content & {
521
573
  readonly id: Scalars['ID']['output'];
522
574
  readonly liveBlogPosts?: Maybe<ReadonlyArray<Maybe<Content>>>;
523
575
  readonly mainImage?: Maybe<Image>;
576
+ readonly originatingParty?: Maybe<Scalars['String']['output']>;
524
577
  readonly pinnedPost?: Maybe<Content>;
525
578
  readonly publishedDate: Scalars['String']['output'];
526
579
  readonly realtime?: Maybe<Scalars['Boolean']['output']>;
@@ -553,6 +606,7 @@ export type LiveBlogPost = Content & {
553
606
  readonly firstPublishedDate: Scalars['String']['output'];
554
607
  readonly id: Scalars['ID']['output'];
555
608
  readonly mainImage?: Maybe<Image>;
609
+ readonly originatingParty?: Maybe<Scalars['String']['output']>;
556
610
  readonly publishedDate: Scalars['String']['output'];
557
611
  readonly standfirst?: Maybe<Scalars['String']['output']>;
558
612
  readonly teaser?: Maybe<Teaser>;
@@ -654,6 +708,7 @@ export type Placeholder = Content & {
654
708
  readonly firstPublishedDate: Scalars['String']['output'];
655
709
  readonly id: Scalars['ID']['output'];
656
710
  readonly mainImage?: Maybe<Image>;
711
+ readonly originatingParty?: Maybe<Scalars['String']['output']>;
657
712
  readonly publishedDate: Scalars['String']['output'];
658
713
  readonly standfirst?: Maybe<Scalars['String']['output']>;
659
714
  readonly teaser?: Maybe<Teaser>;
@@ -813,6 +868,7 @@ export type Video = Content & {
813
868
  readonly firstPublishedDate: Scalars['String']['output'];
814
869
  readonly id: Scalars['ID']['output'];
815
870
  readonly mainImage?: Maybe<Image>;
871
+ readonly originatingParty?: Maybe<Scalars['String']['output']>;
816
872
  readonly publishedDate: Scalars['String']['output'];
817
873
  readonly standfirst?: Maybe<Scalars['String']['output']>;
818
874
  readonly teaser?: Maybe<Teaser>;
@@ -879,7 +935,7 @@ export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = R
879
935
  fallbackImage: RefType['Image'];
880
936
  images: ReadonlyArray<RefType['Image']>;
881
937
  });
882
- Reference: (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>);
938
+ Reference: (ReferenceWithCAPIData<ClipSetNode | OldClipNode>) | (ReferenceWithCAPIData<ContentTree.Flourish>) | (ReferenceWithCAPIData<ContentTree.ImageSet>) | (ReferenceWithCAPIData<ContentTree.LayoutImage>) | (ReferenceWithCAPIData<ContentTree.ImageSet>) | (ReferenceWithCAPIData<RawImageNode>) | (ReferenceWithCAPIData<ContentTree.Recommended>) | (ReferenceWithCAPIData<ContentTree.ScrollyImage>) | (ReferenceWithCAPIData<ContentTree.Tweet>) | (ReferenceWithCAPIData<VideoNode>);
883
939
  Topper: (Omit<BasicTopper, 'displayConcept' | 'genreConcept' | 'intro'> & {
884
940
  displayConcept?: Maybe<RefType['Concept']>;
885
941
  genreConcept?: Maybe<RefType['Concept']>;
@@ -1028,6 +1084,7 @@ export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = R
1028
1084
  /** Mapping between all available schema types and the resolvers types */
1029
1085
  export type ResolversTypes = ResolversObject<{
1030
1086
  AccessLevel: ResolverTypeWrapper<Scalars['AccessLevel']['output']>;
1087
+ Accessibility: ResolverTypeWrapper<Accessibility>;
1031
1088
  AltStandfirst: ResolverTypeWrapper<AltStandfirst>;
1032
1089
  AltTitle: ResolverTypeWrapper<AltTitle>;
1033
1090
  Article: ResolverTypeWrapper<CapiResponse>;
@@ -1045,6 +1102,11 @@ export type ResolversTypes = ResolversObject<{
1045
1102
  intro?: Maybe<ResolversTypes['RichText']>;
1046
1103
  }>;
1047
1104
  CanBeSyndicated: ResolverTypeWrapper<Scalars['CanBeSyndicated']['output']>;
1105
+ Caption: ResolverTypeWrapper<Caption>;
1106
+ Clip: ResolverTypeWrapper<ClipModel>;
1107
+ ClipFormat: ResolverTypeWrapper<Scalars['ClipFormat']['output']>;
1108
+ ClipSet: ResolverTypeWrapper<ReferenceWithCAPIData<ClipSetNode | OldClipNode>>;
1109
+ ClipSource: ResolverTypeWrapper<ClipSource>;
1048
1110
  Concept: ResolverTypeWrapper<ConceptModel>;
1049
1111
  Content: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Content']>;
1050
1112
  ContentPackage: ResolverTypeWrapper<CapiResponse>;
@@ -1154,6 +1216,7 @@ export type ResolversTypes = ResolversObject<{
1154
1216
  /** Mapping between all available schema types and the resolvers parents */
1155
1217
  export type ResolversParentTypes = ResolversObject<{
1156
1218
  AccessLevel: Scalars['AccessLevel']['output'];
1219
+ Accessibility: Accessibility;
1157
1220
  AltStandfirst: AltStandfirst;
1158
1221
  AltTitle: AltTitle;
1159
1222
  Article: CapiResponse;
@@ -1171,6 +1234,11 @@ export type ResolversParentTypes = ResolversObject<{
1171
1234
  intro?: Maybe<ResolversParentTypes['RichText']>;
1172
1235
  };
1173
1236
  CanBeSyndicated: Scalars['CanBeSyndicated']['output'];
1237
+ Caption: Caption;
1238
+ Clip: ClipModel;
1239
+ ClipFormat: Scalars['ClipFormat']['output'];
1240
+ ClipSet: ReferenceWithCAPIData<ClipSetNode | OldClipNode>;
1241
+ ClipSource: ClipSource;
1174
1242
  Concept: ConceptModel;
1175
1243
  Content: ResolversInterfaceTypes<ResolversParentTypes>['Content'];
1176
1244
  ContentPackage: CapiResponse;
@@ -1280,6 +1348,11 @@ export type ResolversParentTypes = ResolversObject<{
1280
1348
  export interface AccessLevelScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['AccessLevel'], any> {
1281
1349
  name: 'AccessLevel';
1282
1350
  }
1351
+ export type AccessibilityResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Accessibility'] = ResolversParentTypes['Accessibility']> = ResolversObject<{
1352
+ captions?: Resolver<Maybe<ReadonlyArray<Maybe<ResolversTypes['Caption']>>>, ParentType, ContextType>;
1353
+ transcript?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1354
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1355
+ }>;
1283
1356
  export type AltStandfirstResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['AltStandfirst'] = ResolversParentTypes['AltStandfirst']> = ResolversObject<{
1284
1357
  promotionalStandfirst?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1285
1358
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
@@ -1303,6 +1376,7 @@ export type ArticleResolvers<ContextType = QueryContext, ParentType extends Reso
1303
1376
  firstPublishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1304
1377
  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
1305
1378
  mainImage?: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
1379
+ originatingParty?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1306
1380
  publishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1307
1381
  standfirst?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1308
1382
  teaser?: Resolver<Maybe<ResolversTypes['Teaser']>, ParentType, ContextType>;
@@ -1327,6 +1401,7 @@ export type AudioResolvers<ContextType = QueryContext, ParentType extends Resolv
1327
1401
  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
1328
1402
  mainImage?: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
1329
1403
  media?: Resolver<Maybe<ReadonlyArray<Maybe<ResolversTypes['Media']>>>, ParentType, ContextType>;
1404
+ originatingParty?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1330
1405
  publishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1331
1406
  standfirst?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1332
1407
  teaser?: Resolver<Maybe<ResolversTypes['Teaser']>, ParentType, ContextType>;
@@ -1364,6 +1439,52 @@ export type BrandedTopperResolvers<ContextType = QueryContext, ParentType extend
1364
1439
  export interface CanBeSyndicatedScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['CanBeSyndicated'], any> {
1365
1440
  name: 'CanBeSyndicated';
1366
1441
  }
1442
+ export type CaptionResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Caption'] = ResolversParentTypes['Caption']> = ResolversObject<{
1443
+ mediaType?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1444
+ url?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1445
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1446
+ }>;
1447
+ export type ClipResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Clip'] = ResolversParentTypes['Clip']> = ResolversObject<{
1448
+ dataSource?: Resolver<ReadonlyArray<ResolversTypes['ClipSource']>, ParentType, ContextType>;
1449
+ format?: Resolver<Maybe<ResolversTypes['ClipFormat']>, ParentType, ContextType>;
1450
+ id?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1451
+ poster?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1452
+ type?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1453
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1454
+ }>;
1455
+ export interface ClipFormatScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['ClipFormat'], any> {
1456
+ name: 'ClipFormat';
1457
+ }
1458
+ export type ClipSetResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['ClipSet'] = ResolversParentTypes['ClipSet']> = ResolversObject<{
1459
+ accessibility?: Resolver<Maybe<ResolversTypes['Accessibility']>, ParentType, ContextType>;
1460
+ autoplay?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
1461
+ caption?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1462
+ clips?: Resolver<Maybe<ReadonlyArray<Maybe<ResolversTypes['Clip']>>>, ParentType, ContextType>;
1463
+ contentWarning?: Resolver<Maybe<ReadonlyArray<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;
1464
+ credits?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1465
+ dataLayout?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1466
+ description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1467
+ displayTitle?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1468
+ id?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1469
+ loop?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
1470
+ muted?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
1471
+ noAudio?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
1472
+ publishedDate?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1473
+ source?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1474
+ subtitle?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1475
+ type?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1476
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1477
+ }>;
1478
+ export type ClipSourceResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['ClipSource'] = ResolversParentTypes['ClipSource']> = ResolversObject<{
1479
+ audioCodec?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1480
+ binaryUrl?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1481
+ duration?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;
1482
+ mediaType?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1483
+ pixelHeight?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;
1484
+ pixelWidth?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;
1485
+ videoCodec?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1486
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1487
+ }>;
1367
1488
  export type ConceptResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Concept'] = ResolversParentTypes['Concept']> = ResolversObject<{
1368
1489
  apiUrl?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1369
1490
  directType?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -1391,6 +1512,7 @@ export type ContentResolvers<ContextType = QueryContext, ParentType extends Reso
1391
1512
  firstPublishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1392
1513
  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
1393
1514
  mainImage?: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
1515
+ originatingParty?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1394
1516
  publishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1395
1517
  standfirst?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1396
1518
  teaser?: Resolver<Maybe<ResolversTypes['Teaser']>, ParentType, ContextType>;
@@ -1415,6 +1537,7 @@ export type ContentPackageResolvers<ContextType = QueryContext, ParentType exten
1415
1537
  firstPublishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1416
1538
  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
1417
1539
  mainImage?: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
1540
+ originatingParty?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1418
1541
  publishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1419
1542
  standfirst?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1420
1543
  tableOfContents?: Resolver<Maybe<ResolversTypes['TableOfContents']>, ParentType, ContextType>;
@@ -1675,6 +1798,7 @@ export type LiveBlogPackageResolvers<ContextType = QueryContext, ParentType exte
1675
1798
  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
1676
1799
  liveBlogPosts?: Resolver<Maybe<ReadonlyArray<Maybe<ResolversTypes['Content']>>>, ParentType, ContextType>;
1677
1800
  mainImage?: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
1801
+ originatingParty?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1678
1802
  pinnedPost?: Resolver<Maybe<ResolversTypes['Content']>, ParentType, ContextType>;
1679
1803
  publishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1680
1804
  realtime?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
@@ -1701,6 +1825,7 @@ export type LiveBlogPostResolvers<ContextType = QueryContext, ParentType extends
1701
1825
  firstPublishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1702
1826
  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
1703
1827
  mainImage?: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
1828
+ originatingParty?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1704
1829
  publishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1705
1830
  standfirst?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1706
1831
  teaser?: Resolver<Maybe<ResolversTypes['Teaser']>, ParentType, ContextType>;
@@ -1801,6 +1926,7 @@ export type PlaceholderResolvers<ContextType = QueryContext, ParentType extends
1801
1926
  firstPublishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1802
1927
  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
1803
1928
  mainImage?: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
1929
+ originatingParty?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1804
1930
  publishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1805
1931
  standfirst?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1806
1932
  teaser?: Resolver<Maybe<ResolversTypes['Teaser']>, ParentType, ContextType>;
@@ -1842,7 +1968,7 @@ export type RecommendedResolvers<ContextType = QueryContext, ParentType extends
1842
1968
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
1843
1969
  }>;
1844
1970
  export type ReferenceResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Reference'] = ResolversParentTypes['Reference']> = ResolversObject<{
1845
- __resolveType?: TypeResolveFn<'Flourish' | 'ImageSet' | 'LayoutImage' | 'MainImage' | 'RawImage' | 'Recommended' | 'ScrollyImage' | 'Tweet' | 'VideoReference', ParentType, ContextType>;
1971
+ __resolveType?: TypeResolveFn<'ClipSet' | 'Flourish' | 'ImageSet' | 'LayoutImage' | 'MainImage' | 'RawImage' | 'Recommended' | 'ScrollyImage' | 'Tweet' | 'VideoReference', ParentType, ContextType>;
1846
1972
  type?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1847
1973
  }>;
1848
1974
  export type RichTextResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['RichText'] = ResolversParentTypes['RichText']> = ResolversObject<{
@@ -1960,6 +2086,7 @@ export type VideoResolvers<ContextType = QueryContext, ParentType extends Resolv
1960
2086
  firstPublishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1961
2087
  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
1962
2088
  mainImage?: Resolver<Maybe<ResolversTypes['Image']>, ParentType, ContextType>;
2089
+ originatingParty?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1963
2090
  publishedDate?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
1964
2091
  standfirst?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
1965
2092
  teaser?: Resolver<Maybe<ResolversTypes['Teaser']>, ParentType, ContextType>;
@@ -1977,6 +2104,7 @@ export type VideoReferenceResolvers<ContextType = QueryContext, ParentType exten
1977
2104
  }>;
1978
2105
  export type Resolvers<ContextType = QueryContext> = ResolversObject<{
1979
2106
  AccessLevel?: GraphQLScalarType;
2107
+ Accessibility?: AccessibilityResolvers<ContextType>;
1980
2108
  AltStandfirst?: AltStandfirstResolvers<ContextType>;
1981
2109
  AltTitle?: AltTitleResolvers<ContextType>;
1982
2110
  Article?: ArticleResolvers<ContextType>;
@@ -1984,6 +2112,11 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
1984
2112
  BasicTopper?: BasicTopperResolvers<ContextType>;
1985
2113
  BrandedTopper?: BrandedTopperResolvers<ContextType>;
1986
2114
  CanBeSyndicated?: GraphQLScalarType;
2115
+ Caption?: CaptionResolvers<ContextType>;
2116
+ Clip?: ClipResolvers<ContextType>;
2117
+ ClipFormat?: GraphQLScalarType;
2118
+ ClipSet?: ClipSetResolvers<ContextType>;
2119
+ ClipSource?: ClipSourceResolvers<ContextType>;
1987
2120
  Concept?: ConceptResolvers<ContextType>;
1988
2121
  Content?: ContentResolvers<ContextType>;
1989
2122
  ContentPackage?: ContentPackageResolvers<ContextType>;
@@ -1,4 +1,4 @@
1
- import type { ImageSet, ContentTypeSchemas } from '../types/internal-content';
1
+ import type { ImageSet, ContentTypeSchemas, ClipSet } from '../types/internal-content';
2
2
  import type { QueryContext } from '..';
3
3
  import { CAPIImage } from './Image';
4
4
  import { Concept } from './Concept';
@@ -66,7 +66,7 @@ export declare class CapiResponse {
66
66
  title: string;
67
67
  }>;
68
68
  bodyXML(): string | null;
69
- embeds(): ImageSet[];
69
+ embeds(): (ImageSet | ClipSet)[];
70
70
  byline(): string | null;
71
71
  annotations(): Concept[];
72
72
  types(): string[];
@@ -114,6 +114,7 @@ export declare class CapiResponse {
114
114
  } | null | undefined;
115
115
  accessLevel(): LiteralUnionScalarValues<typeof AccessLevel>;
116
116
  canBeSyndicated(): LiteralUnionScalarValues<typeof CanBeSyndicated>;
117
+ originatingParty(): string | null;
117
118
  summary(): {
118
119
  bodyXML: string;
119
120
  } | null | undefined;
@@ -64,7 +64,7 @@ class CapiResponse {
64
64
  /*
65
65
  * Check if the incoming data matches the types defined in our data source schema
66
66
  * Our data source schema should handle all possible response from CAPI
67
- * As there is no agreed schema provided by CAPI there is a chance it will out of date / incorrect at times
67
+ * As there is no agreed schema provided by CAPI there is a chance it will be out of date / incorrect at times
68
68
  * Manual updates will be required at times to keep it in sync with the responses we receive
69
69
  */
70
70
  const schemaResponse = model.schema().safeParse(content);
@@ -156,6 +156,15 @@ class CapiResponse {
156
156
  canBeSyndicated() {
157
157
  return this.capiData.canBeSyndicated;
158
158
  }
159
+ originatingParty() {
160
+ return this.capiData.canBeDistributed === 'no' &&
161
+ this.annotations().some((annotation) => {
162
+ annotation.id() ===
163
+ 'http://api.ft.com/things/ed3b6ec5-6466-47ef-b1d8-16952fd522c7';
164
+ })
165
+ ? 'Reuters'
166
+ : 'FT';
167
+ }
159
168
  summary() {
160
169
  if ('summary' in this.capiData)
161
170
  return this.capiData.summary;