@financial-times/cp-content-pipeline-schema 3.11.0 → 3.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +4 -4
  3. package/lib/generated/index.d.ts +17 -4
  4. package/lib/model/Content.d.ts +1 -0
  5. package/lib/model/Content.js +6 -0
  6. package/lib/model/Content.js.map +1 -1
  7. package/lib/model/schemas/capi/article.d.ts +33 -34
  8. package/lib/model/schemas/capi/article.js +1 -0
  9. package/lib/model/schemas/capi/article.js.map +1 -1
  10. package/lib/model/schemas/capi/audio.d.ts +31 -34
  11. package/lib/model/schemas/capi/base-schema.d.ts +61 -68
  12. package/lib/model/schemas/capi/base-schema.js +8 -0
  13. package/lib/model/schemas/capi/base-schema.js.map +1 -1
  14. package/lib/model/schemas/capi/content-package.d.ts +32 -52
  15. package/lib/model/schemas/capi/custom-code-component.d.ts +37 -39
  16. package/lib/model/schemas/capi/index.d.ts +193 -227
  17. package/lib/model/schemas/capi/live-blog-package.d.ts +31 -34
  18. package/lib/model/schemas/capi/placeholder.d.ts +31 -34
  19. package/lib/model/schemas/capi/video.d.ts +31 -34
  20. package/lib/resolvers/content-tree/Workarounds.d.ts +2 -8
  21. package/lib/resolvers/content-tree/references/Video.d.ts +3 -3
  22. package/lib/resolvers/content-tree/tagMappings.js +0 -1
  23. package/lib/resolvers/content-tree/tagMappings.js.map +1 -1
  24. package/lib/resolvers/content.d.ts +1 -0
  25. package/lib/resolvers/content.js +1 -0
  26. package/lib/resolvers/content.js.map +1 -1
  27. package/lib/resolvers/index.d.ts +2 -0
  28. package/lib/resolvers/scalars.d.ts +2 -0
  29. package/lib/resolvers/scalars.js +11 -1
  30. package/lib/resolvers/scalars.js.map +1 -1
  31. package/package.json +4 -4
  32. package/queries/article.graphql +1 -0
  33. package/src/generated/index.ts +15 -4
  34. package/src/model/Content.ts +6 -0
  35. package/src/model/schemas/capi/article.ts +1 -0
  36. package/src/model/schemas/capi/base-schema.ts +8 -0
  37. package/src/resolvers/content-tree/Workarounds.ts +2 -9
  38. package/src/resolvers/content-tree/tagMappings.ts +0 -1
  39. package/src/resolvers/content.ts +1 -0
  40. package/src/resolvers/scalars.ts +18 -0
  41. package/tsconfig.tsbuildinfo +1 -1
  42. package/typedefs/content.graphql +3 -0
  43. package/typedefs/scalars.graphql +1 -0
@@ -12,7 +12,7 @@ import type { LeadFlourish as LeadFlourishModel } from '../model/LeadFlourish';
12
12
  import type { FlourishSource as FlourishSourceModel } from '../model/FlourishSource';
13
13
  import type { ContentTree } from '@financial-times/content-tree';
14
14
  import type { ReferenceWithCAPIData } from '../resolvers/content-tree/references';
15
- import type { Video as VideoNode, Author as AuthorNode, ClipSet as ClipSetNode, OldClip as OldClipNode, RawImage as RawImageNode } from '../resolvers/content-tree/Workarounds';
15
+ import type { Author as AuthorNode, ClipSet as ClipSetNode, OldClip as OldClipNode, RawImage as RawImageNode } from '../resolvers/content-tree/Workarounds';
16
16
  import type { QueryContext } from '../';
17
17
  export type Maybe<T> = T | null;
18
18
  export type InputMaybe<T> = Maybe<T>;
@@ -34,6 +34,7 @@ export type Scalars = {
34
34
  CanBeSyndicated: { input: 'yes' | 'no' | 'verify' | 'withContributorPayment' | 'unknown'; output: 'yes' | 'no' | 'verify' | 'withContributorPayment' | 'unknown'; }
35
35
  ClipFormat: { input: 'standard-inline' | 'mobile'; output: 'standard-inline' | 'mobile'; }
36
36
  ContentType: { input: 'Article' | 'Placeholder' | 'Video' | 'Audio' | 'LiveBlogPackage' | 'LiveBlogPost' | 'ContentPackage' | 'Content' | 'MediaResource' | 'CustomCodeComponent'; output: 'Article' | 'Placeholder' | 'Video' | 'Audio' | 'LiveBlogPackage' | 'LiveBlogPost' | 'ContentPackage' | 'Content' | 'MediaResource' | 'CustomCodeComponent'; }
37
+ DisclaimerType: { input: 'co-created-content' | 'client-supplied-content' | 'ft-studios-risky' | 'auditor'; output: 'co-created-content' | 'client-supplied-content' | 'ft-studios-risky' | 'auditor'; }
37
38
  FollowButtonVariant: { input: 'standard' | 'inverse' | 'opinion' | 'alphaville' | 'monochrome' | 'inverse-monochrome'; output: 'standard' | 'inverse' | 'opinion' | 'alphaville' | 'monochrome' | 'inverse-monochrome'; }
38
39
  ImageFormat: { input: 'standard' | 'standard-inline' | 'desktop' | 'mobile' | 'wide' | 'square' | 'square-ftedit' | 'portrait' | 'landscape'; output: 'standard' | 'standard-inline' | 'desktop' | 'mobile' | 'wide' | 'square' | 'square-ftedit' | 'portrait' | 'landscape'; }
39
40
  ImageType: { input: 'image' | 'graphic'; output: 'image' | 'graphic'; }
@@ -87,6 +88,8 @@ export type Article = Content & {
87
88
  readonly containedIn?: Maybe<Content>;
88
89
  /** A design object containing the theme and layout of the article. */
89
90
  readonly design?: Maybe<Design>;
91
+ /** Disclaimer type for commercial Partner Content articles */
92
+ readonly disclaimerType?: Maybe<Scalars['DisclaimerType']['output']>;
90
93
  /** The editorial division the article belongs to, eg. 'FT-SpecialReports'. */
91
94
  readonly editorialDesk?: Maybe<Scalars['String']['output']>;
92
95
  /** The first ISO string date the article was published, eg. '2024-04-03T10:35:52.443Z'. */
@@ -1994,7 +1997,7 @@ export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = R
1994
1997
  Content: ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel );
1995
1998
  Image: ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel );
1996
1999
  Picture: ( PictureModel ) | ( PictureModel ) | ( PictureModel );
1997
- Reference: ( ReferenceWithCAPIData<AuthorNode> ) | ( ReferenceWithCAPIData<ClipSetNode|OldClipNode> ) | ( ReferenceWithCAPIData<ContentTree.CustomCodeComponent> ) | ( ReferenceWithCAPIData<ContentTree.Flourish> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<ContentTree.LayoutImage> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<RawImageNode> ) | ( ReferenceWithCAPIData<ContentTree.Recommended> ) | ( ReferenceWithCAPIData<ContentTree.ScrollyImage> ) | ( ReferenceWithCAPIData<ContentTree.Tweet> ) | ( ReferenceWithCAPIData<VideoNode> );
2000
+ Reference: ( ReferenceWithCAPIData<AuthorNode> ) | ( ReferenceWithCAPIData<ClipSetNode|OldClipNode> ) | ( ReferenceWithCAPIData<ContentTree.CustomCodeComponent> ) | ( ReferenceWithCAPIData<ContentTree.Flourish> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<ContentTree.LayoutImage> ) | ( ReferenceWithCAPIData<ContentTree.ImageSet> ) | ( ReferenceWithCAPIData<RawImageNode> ) | ( ReferenceWithCAPIData<ContentTree.Recommended> ) | ( ReferenceWithCAPIData<ContentTree.ScrollyImage> ) | ( ReferenceWithCAPIData<ContentTree.Tweet> ) | ( ReferenceWithCAPIData<ContentTree.Video> );
1998
2001
  Topper: ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel );
1999
2002
  TopperWithBrand: ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel );
2000
2003
  TopperWithHeadshot: ( TopperModel ) | ( TopperModel );
@@ -2033,6 +2036,7 @@ export type ResolversTypes = ResolversObject<{
2033
2036
  DeepLandscapeTopper: ResolverTypeWrapper<TopperModel>;
2034
2037
  DeepPortraitTopper: ResolverTypeWrapper<TopperModel>;
2035
2038
  Design: ResolverTypeWrapper<Design>;
2039
+ DisclaimerType: ResolverTypeWrapper<Scalars['DisclaimerType']['output']>;
2036
2040
  Float: ResolverTypeWrapper<Scalars['Float']['output']>;
2037
2041
  Flourish: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.Flourish>>;
2038
2042
  FlourishSource: ResolverTypeWrapper<FlourishSourceModel>;
@@ -2101,7 +2105,7 @@ export type ResolversTypes = ResolversObject<{
2101
2105
  TopperWithTheme: ResolverTypeWrapper<TopperModel>;
2102
2106
  Tweet: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.Tweet>>;
2103
2107
  Video: ResolverTypeWrapper<ContentModel>;
2104
- VideoReference: ResolverTypeWrapper<ReferenceWithCAPIData<VideoNode>>;
2108
+ VideoReference: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.Video>>;
2105
2109
  }>;
2106
2110
 
2107
2111
  /** Mapping between all available schema types and the resolvers parents */
@@ -2134,6 +2138,7 @@ export type ResolversParentTypes = ResolversObject<{
2134
2138
  DeepLandscapeTopper: TopperModel;
2135
2139
  DeepPortraitTopper: TopperModel;
2136
2140
  Design: Design;
2141
+ DisclaimerType: Scalars['DisclaimerType']['output'];
2137
2142
  Float: Scalars['Float']['output'];
2138
2143
  Flourish: ReferenceWithCAPIData<ContentTree.Flourish>;
2139
2144
  FlourishSource: FlourishSourceModel;
@@ -2202,7 +2207,7 @@ export type ResolversParentTypes = ResolversObject<{
2202
2207
  TopperWithTheme: TopperModel;
2203
2208
  Tweet: ReferenceWithCAPIData<ContentTree.Tweet>;
2204
2209
  Video: ContentModel;
2205
- VideoReference: ReferenceWithCAPIData<VideoNode>;
2210
+ VideoReference: ReferenceWithCAPIData<ContentTree.Video>;
2206
2211
  }>;
2207
2212
 
2208
2213
  export interface AccessLevelScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['AccessLevel'], any> {
@@ -2238,6 +2243,7 @@ export type ArticleResolvers<ContextType = QueryContext, ParentType extends Reso
2238
2243
  commentsEnabled: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2239
2244
  containedIn: Resolver<Maybe<ResolversTypes['Content']>, ParentType, ContextType>;
2240
2245
  design: Resolver<Maybe<ResolversTypes['Design']>, ParentType, ContextType>;
2246
+ disclaimerType: Resolver<Maybe<ResolversTypes['DisclaimerType']>, ParentType, ContextType>;
2241
2247
  editorialDesk: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
2242
2248
  firstPublishedDate: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2243
2249
  id: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
@@ -2551,6 +2557,10 @@ export type DesignResolvers<ContextType = QueryContext, ParentType extends Resol
2551
2557
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2552
2558
  }>;
2553
2559
 
2560
+ export interface DisclaimerTypeScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['DisclaimerType'], any> {
2561
+ name: 'DisclaimerType';
2562
+ }
2563
+
2554
2564
  export type FlourishResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Flourish'] = ResolversParentTypes['Flourish']> = ResolversObject<{
2555
2565
  fallbackImage: Resolver<Maybe<ResolversTypes['FlourishSource']>, ParentType, ContextType>;
2556
2566
  type: Resolver<ResolversTypes['String'], ParentType, ContextType>;
@@ -3267,6 +3277,7 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
3267
3277
  DeepLandscapeTopper: DeepLandscapeTopperResolvers<ContextType>;
3268
3278
  DeepPortraitTopper: DeepPortraitTopperResolvers<ContextType>;
3269
3279
  Design: DesignResolvers<ContextType>;
3280
+ DisclaimerType: GraphQLScalarType;
3270
3281
  Flourish: FlourishResolvers<ContextType>;
3271
3282
  FlourishSource: FlourishSourceResolvers<ContextType>;
3272
3283
  FollowButtonVariant: GraphQLScalarType;
@@ -1002,4 +1002,10 @@ export class Content {
1002
1002
  }
1003
1003
  return null
1004
1004
  }
1005
+ disclaimerType() {
1006
+ if ('disclaimerType' in this.capiData && this.capiData.disclaimerType) {
1007
+ return this.capiData.disclaimerType
1008
+ }
1009
+ return null
1010
+ }
1005
1011
  }
@@ -34,6 +34,7 @@ const articleMetadataSchema = baseMetadataSchema.pick({
34
34
  containedIn: true,
35
35
  publication: true,
36
36
  clientName: true,
37
+ disclaimerType: true,
37
38
  internalAnalyticsTags: true,
38
39
  })
39
40
 
@@ -235,6 +235,14 @@ export const baseMetadataSchema = z.object({
235
235
  .optional(),
236
236
  publication: z.array(z.string()).optional(),
237
237
  clientName: z.string().optional(),
238
+ disclaimerType: z
239
+ .union([
240
+ z.literal('co-created-content'),
241
+ z.literal('client-supplied-content'),
242
+ z.literal('ft-studios-risky'),
243
+ z.literal('auditor'),
244
+ ])
245
+ .optional(),
238
246
  internalAnalyticsTags: z.string().optional(),
239
247
  })
240
248
 
@@ -68,13 +68,6 @@ export type MainImageRaw = Omit<RawImage, 'type'> & {
68
68
  type: 'main-image-raw'
69
69
  }
70
70
 
71
- export interface Video extends ContentTree.Node {
72
- type: 'video'
73
- id: string
74
- title?: string
75
- embedded: boolean
76
- }
77
-
78
71
  export interface CccFallbackText extends ContentTree.Node {
79
72
  type: 'ccc-fallback-text'
80
73
  children: ContentTree.Paragraph[]
@@ -205,7 +198,7 @@ export type BodyBlock =
205
198
  | Table
206
199
  | Recommended
207
200
  | ContentTree.Tweet
208
- | Video
201
+ | ContentTree.Video
209
202
  | ContentTree.YoutubeVideo
210
203
 
211
204
  export type AnyNode =
@@ -247,7 +240,7 @@ export type AnyNode =
247
240
  | TableBody
248
241
  | TableRow
249
242
  | TableCell
250
- | Video
243
+ | ContentTree.Video
251
244
  | ContentTree.YoutubeVideo
252
245
  | MainImage
253
246
  | MainImageRaw
@@ -229,7 +229,6 @@ const commonTagMappings: TagMappings = {
229
229
  ) => ({
230
230
  type: 'video',
231
231
  id: $el.attr('url') || '',
232
- embedded: $el.attr('data-embedded') === 'true' || true,
233
232
  }),
234
233
  'a[data-asset-type="video"]': ($el) => {
235
234
  const url = $el.attr('href')
@@ -95,6 +95,7 @@ const resolvers = {
95
95
  containedIn: (parent) => parent.containedIn(),
96
96
  publication: (parent) => parent.publication() ?? null,
97
97
  clientName: (parent) => parent.clientName() ?? null,
98
+ disclaimerType: (parent) => parent.disclaimerType() ?? null,
98
99
  indicators: (parent) => {
99
100
  return {
100
101
  isPartnerContent: parent.isPartnerContent(),
@@ -175,6 +175,23 @@ export const LayoutHint = new LiteralUnionScalar<
175
175
  values: ['standaloneimage', 'landscape', 'bigstory', 'assassination'],
176
176
  })
177
177
 
178
+ export const DisclaimerType = new LiteralUnionScalar<
179
+ [
180
+ 'co-created-content',
181
+ 'client-supplied-content',
182
+ 'ft-studios-risky',
183
+ 'auditor'
184
+ ]
185
+ >({
186
+ name: 'DisclaimerType',
187
+ values: [
188
+ 'co-created-content',
189
+ 'client-supplied-content',
190
+ 'ft-studios-risky',
191
+ 'auditor',
192
+ ],
193
+ })
194
+
178
195
  const resolvers = {
179
196
  ClipFormat,
180
197
  ImageFormat,
@@ -188,6 +205,7 @@ const resolvers = {
188
205
  ContentType,
189
206
  ListType,
190
207
  LayoutHint,
208
+ DisclaimerType,
191
209
  JSON: new GraphQLScalarType({ name: 'JSON' }),
192
210
  }
193
211