@financial-times/cp-content-pipeline-schema 3.10.0 → 3.12.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 (45) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/lib/generated/index.d.ts +23 -4
  3. package/lib/model/Content.d.ts +3 -0
  4. package/lib/model/Content.js +24 -0
  5. package/lib/model/Content.js.map +1 -1
  6. package/lib/model/Content.test.js +66 -0
  7. package/lib/model/Content.test.js.map +1 -1
  8. package/lib/model/schemas/capi/article.d.ts +5 -1
  9. package/lib/model/schemas/capi/article.js +1 -0
  10. package/lib/model/schemas/capi/article.js.map +1 -1
  11. package/lib/model/schemas/capi/audio.d.ts +2 -0
  12. package/lib/model/schemas/capi/base-schema.d.ts +5 -0
  13. package/lib/model/schemas/capi/base-schema.js +8 -0
  14. package/lib/model/schemas/capi/base-schema.js.map +1 -1
  15. package/lib/model/schemas/capi/content-package.d.ts +2 -0
  16. package/lib/model/schemas/capi/custom-code-component.d.ts +3 -0
  17. package/lib/model/schemas/capi/index.d.ts +13 -0
  18. package/lib/model/schemas/capi/live-blog-package.d.ts +2 -0
  19. package/lib/model/schemas/capi/placeholder.d.ts +2 -0
  20. package/lib/model/schemas/capi/video.d.ts +2 -0
  21. package/lib/resolvers/content-tree/Workarounds.d.ts +2 -8
  22. package/lib/resolvers/content-tree/references/Video.d.ts +3 -3
  23. package/lib/resolvers/content-tree/tagMappings.js +0 -1
  24. package/lib/resolvers/content-tree/tagMappings.js.map +1 -1
  25. package/lib/resolvers/content.d.ts +5 -0
  26. package/lib/resolvers/content.js +5 -0
  27. package/lib/resolvers/content.js.map +1 -1
  28. package/lib/resolvers/index.d.ts +6 -0
  29. package/lib/resolvers/scalars.d.ts +2 -0
  30. package/lib/resolvers/scalars.js +11 -1
  31. package/lib/resolvers/scalars.js.map +1 -1
  32. package/package.json +2 -2
  33. package/queries/article.graphql +3 -0
  34. package/src/generated/index.ts +21 -4
  35. package/src/model/Content.test.ts +82 -0
  36. package/src/model/Content.ts +32 -0
  37. package/src/model/schemas/capi/article.ts +1 -0
  38. package/src/model/schemas/capi/base-schema.ts +8 -0
  39. package/src/resolvers/content-tree/Workarounds.ts +2 -9
  40. package/src/resolvers/content-tree/tagMappings.ts +0 -1
  41. package/src/resolvers/content.ts +5 -0
  42. package/src/resolvers/scalars.ts +18 -0
  43. package/tsconfig.tsbuildinfo +1 -1
  44. package/typedefs/content.graphql +9 -0
  45. 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'. */
@@ -1054,8 +1057,12 @@ export type ImageWideSourceSetArgs = {
1054
1057
  };
1055
1058
 
1056
1059
  export type Indicators = {
1060
+ /** Whether an article is in an archived state */
1061
+ readonly isArchived?: Maybe<Scalars['Boolean']['output']>;
1057
1062
  /** Whether the article is included in an FT Edit editorial curation. */
1058
1063
  readonly isFTEdit?: Maybe<Scalars['Boolean']['output']>;
1064
+ /** Whether an article is a Live Q&A */
1065
+ readonly isLiveQandA?: Maybe<Scalars['Boolean']['output']>;
1059
1066
  /** Whether the content is an opinion piece. */
1060
1067
  readonly isOpinion?: Maybe<Scalars['Boolean']['output']>;
1061
1068
  /** Whether the content is Commercial Partner Content. */
@@ -1990,7 +1997,7 @@ export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = R
1990
1997
  Content: ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel ) | ( ContentModel );
1991
1998
  Image: ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel ) | ( ImageModel );
1992
1999
  Picture: ( PictureModel ) | ( PictureModel ) | ( PictureModel );
1993
- 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> );
1994
2001
  Topper: ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel );
1995
2002
  TopperWithBrand: ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel ) | ( TopperModel );
1996
2003
  TopperWithHeadshot: ( TopperModel ) | ( TopperModel );
@@ -2029,6 +2036,7 @@ export type ResolversTypes = ResolversObject<{
2029
2036
  DeepLandscapeTopper: ResolverTypeWrapper<TopperModel>;
2030
2037
  DeepPortraitTopper: ResolverTypeWrapper<TopperModel>;
2031
2038
  Design: ResolverTypeWrapper<Design>;
2039
+ DisclaimerType: ResolverTypeWrapper<Scalars['DisclaimerType']['output']>;
2032
2040
  Float: ResolverTypeWrapper<Scalars['Float']['output']>;
2033
2041
  Flourish: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.Flourish>>;
2034
2042
  FlourishSource: ResolverTypeWrapper<FlourishSourceModel>;
@@ -2097,7 +2105,7 @@ export type ResolversTypes = ResolversObject<{
2097
2105
  TopperWithTheme: ResolverTypeWrapper<TopperModel>;
2098
2106
  Tweet: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.Tweet>>;
2099
2107
  Video: ResolverTypeWrapper<ContentModel>;
2100
- VideoReference: ResolverTypeWrapper<ReferenceWithCAPIData<VideoNode>>;
2108
+ VideoReference: ResolverTypeWrapper<ReferenceWithCAPIData<ContentTree.Video>>;
2101
2109
  }>;
2102
2110
 
2103
2111
  /** Mapping between all available schema types and the resolvers parents */
@@ -2130,6 +2138,7 @@ export type ResolversParentTypes = ResolversObject<{
2130
2138
  DeepLandscapeTopper: TopperModel;
2131
2139
  DeepPortraitTopper: TopperModel;
2132
2140
  Design: Design;
2141
+ DisclaimerType: Scalars['DisclaimerType']['output'];
2133
2142
  Float: Scalars['Float']['output'];
2134
2143
  Flourish: ReferenceWithCAPIData<ContentTree.Flourish>;
2135
2144
  FlourishSource: FlourishSourceModel;
@@ -2198,7 +2207,7 @@ export type ResolversParentTypes = ResolversObject<{
2198
2207
  TopperWithTheme: TopperModel;
2199
2208
  Tweet: ReferenceWithCAPIData<ContentTree.Tweet>;
2200
2209
  Video: ContentModel;
2201
- VideoReference: ReferenceWithCAPIData<VideoNode>;
2210
+ VideoReference: ReferenceWithCAPIData<ContentTree.Video>;
2202
2211
  }>;
2203
2212
 
2204
2213
  export interface AccessLevelScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['AccessLevel'], any> {
@@ -2234,6 +2243,7 @@ export type ArticleResolvers<ContextType = QueryContext, ParentType extends Reso
2234
2243
  commentsEnabled: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2235
2244
  containedIn: Resolver<Maybe<ResolversTypes['Content']>, ParentType, ContextType>;
2236
2245
  design: Resolver<Maybe<ResolversTypes['Design']>, ParentType, ContextType>;
2246
+ disclaimerType: Resolver<Maybe<ResolversTypes['DisclaimerType']>, ParentType, ContextType>;
2237
2247
  editorialDesk: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
2238
2248
  firstPublishedDate: Resolver<ResolversTypes['String'], ParentType, ContextType>;
2239
2249
  id: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
@@ -2547,6 +2557,10 @@ export type DesignResolvers<ContextType = QueryContext, ParentType extends Resol
2547
2557
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
2548
2558
  }>;
2549
2559
 
2560
+ export interface DisclaimerTypeScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['DisclaimerType'], any> {
2561
+ name: 'DisclaimerType';
2562
+ }
2563
+
2550
2564
  export type FlourishResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Flourish'] = ResolversParentTypes['Flourish']> = ResolversObject<{
2551
2565
  fallbackImage: Resolver<Maybe<ResolversTypes['FlourishSource']>, ParentType, ContextType>;
2552
2566
  type: Resolver<ResolversTypes['String'], ParentType, ContextType>;
@@ -2746,7 +2760,9 @@ export type ImageWideResolvers<ContextType = QueryContext, ParentType extends Re
2746
2760
  }>;
2747
2761
 
2748
2762
  export type IndicatorsResolvers<ContextType = QueryContext, ParentType extends ResolversParentTypes['Indicators'] = ResolversParentTypes['Indicators']> = ResolversObject<{
2763
+ isArchived: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2749
2764
  isFTEdit: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2765
+ isLiveQandA: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2750
2766
  isOpinion: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2751
2767
  isPartnerContent: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
2752
2768
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
@@ -3261,6 +3277,7 @@ export type Resolvers<ContextType = QueryContext> = ResolversObject<{
3261
3277
  DeepLandscapeTopper: DeepLandscapeTopperResolvers<ContextType>;
3262
3278
  DeepPortraitTopper: DeepPortraitTopperResolvers<ContextType>;
3263
3279
  Design: DesignResolvers<ContextType>;
3280
+ DisclaimerType: GraphQLScalarType;
3264
3281
  Flourish: FlourishResolvers<ContextType>;
3265
3282
  FlourishSource: FlourishSourceResolvers<ContextType>;
3266
3283
  FollowButtonVariant: GraphQLScalarType;
@@ -325,4 +325,86 @@ describe('Content', () => {
325
325
  expect(capiResponse.isFTEdit()).toBe(false)
326
326
  })
327
327
  })
328
+
329
+ describe('isLiveQandA', () => {
330
+ test('identifies articles that are Live Q&As', () => {
331
+ const article = cloneDeep({
332
+ ...baseCapiObject,
333
+ internalAnalyticsTags: 'someStringHereisLiveQandAsomethingElse',
334
+ })
335
+ const capiResponse = new Content(article, context)
336
+
337
+ expect(capiResponse.isLiveQandA()).toBe(true)
338
+ })
339
+
340
+ test('ignores articles that are not Live Q&As', () => {
341
+ const article = cloneDeep({
342
+ ...baseCapiObject,
343
+ internalAnalyticsTags: 'testSomethingThatisNotALiveQ&A',
344
+ })
345
+ const capiResponse = new Content(article, context)
346
+
347
+ expect(capiResponse.isLiveQandA()).toBe(false)
348
+ })
349
+
350
+ test('handles missing `internalAnalyticsTags` property', () => {
351
+ const article = cloneDeep({
352
+ ...baseCapiObject,
353
+ })
354
+ const capiResponse = new Content(article, context)
355
+
356
+ expect(capiResponse.isLiveQandA()).toBe(false)
357
+ })
358
+
359
+ test('is case-insensitive', () => {
360
+ const article = cloneDeep({
361
+ ...baseCapiObject,
362
+ internalAnalyticsTags: 'LIVeQaNdA',
363
+ })
364
+ const capiResponse = new Content(article, context)
365
+
366
+ expect(capiResponse.isLiveQandA()).toBe(true)
367
+ })
368
+ })
369
+
370
+ describe('isArchived', () => {
371
+ test('identifies articles that are archived', () => {
372
+ const article = cloneDeep({
373
+ ...baseCapiObject,
374
+ internalAnalyticsTags: 'something archived somethng else',
375
+ })
376
+ const capiResponse = new Content(article, context)
377
+
378
+ expect(capiResponse.isArchived()).toBe(true)
379
+ })
380
+
381
+ test('ignores articles that are not archived', () => {
382
+ const article = cloneDeep({
383
+ ...baseCapiObject,
384
+ internalAnalyticsTags: 'archive will not match, it misses the d',
385
+ })
386
+ const capiResponse = new Content(article, context)
387
+
388
+ expect(capiResponse.isArchived()).toBe(false)
389
+ })
390
+
391
+ test('handles missing `internalAnalyticsTags` property', () => {
392
+ const article = cloneDeep({
393
+ ...baseCapiObject,
394
+ })
395
+ const capiResponse = new Content(article, context)
396
+
397
+ expect(capiResponse.isArchived()).toBe(false)
398
+ })
399
+
400
+ test('is case-insensitive', () => {
401
+ const article = cloneDeep({
402
+ ...baseCapiObject,
403
+ internalAnalyticsTags: 'ArChIvEd',
404
+ })
405
+ const capiResponse = new Content(article, context)
406
+
407
+ expect(capiResponse.isArchived()).toBe(true)
408
+ })
409
+ })
328
410
  })
@@ -941,6 +941,32 @@ export class Content {
941
941
  return false
942
942
  }
943
943
 
944
+ isLiveQandA(): boolean {
945
+ if (
946
+ 'internalAnalyticsTags' in this.capiData &&
947
+ this.capiData.internalAnalyticsTags
948
+ ) {
949
+ return this.capiData.internalAnalyticsTags
950
+ .toLowerCase()
951
+ .includes('liveqanda')
952
+ }
953
+
954
+ return false
955
+ }
956
+
957
+ isArchived(): boolean {
958
+ if (
959
+ 'internalAnalyticsTags' in this.capiData &&
960
+ this.capiData.internalAnalyticsTags
961
+ ) {
962
+ return this.capiData.internalAnalyticsTags
963
+ .toLowerCase()
964
+ .includes('archived')
965
+ }
966
+
967
+ return false
968
+ }
969
+
944
970
  design(): Design {
945
971
  if ('design' in this.capiData && this.capiData.design.theme) {
946
972
  return { theme: this.capiData.design.theme }
@@ -976,4 +1002,10 @@ export class Content {
976
1002
  }
977
1003
  return null
978
1004
  }
1005
+ disclaimerType() {
1006
+ if ('disclaimerType' in this.capiData && this.capiData.disclaimerType) {
1007
+ return this.capiData.disclaimerType
1008
+ }
1009
+ return null
1010
+ }
979
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,10 +95,13 @@ 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(),
101
102
  isFTEdit: parent.isFTEdit(),
103
+ isLiveQandA: parent.isLiveQandA(),
104
+ isArchived: parent.isArchived(),
102
105
  }
103
106
  },
104
107
  },
@@ -197,6 +200,8 @@ const resolvers = {
197
200
  isFTEdit: (parent) => parent.isFTEdit ?? null,
198
201
  isOpinion: (parent) => parent.isOpinion ?? null,
199
202
  isPartnerContent: (parent) => parent.isPartnerContent ?? null,
203
+ isLiveQandA: (parent) => parent.isLiveQandA ?? null,
204
+ isArchived: (parent) => parent.isArchived ?? null,
200
205
  },
201
206
 
202
207
  Media: {
@@ -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