@financial-times/cp-content-pipeline-schema 2.15.1 → 3.0.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.
- package/CHANGELOG.md +40 -0
- package/lib/datasources/capi.d.ts +2 -2
- package/lib/datasources/capi.js +4 -2
- package/lib/datasources/capi.js.map +1 -1
- package/lib/datasources/capi.test.js +2 -2
- package/lib/datasources/twitter.d.ts +3 -1
- package/lib/datasources/twitter.js +26 -1
- package/lib/datasources/twitter.js.map +1 -1
- package/lib/fixtures/capiObject.d.ts +2 -2
- package/lib/fixtures/capiObject.js +2 -0
- package/lib/fixtures/capiObject.js.map +1 -1
- package/lib/fixtures/capiPerson.d.ts +1 -1
- package/lib/generated/index.d.ts +278 -113
- package/lib/helpers/decorateHeadshotUrl.d.ts +1 -2
- package/lib/helpers/decorateHeadshotUrl.js +2 -3
- package/lib/helpers/decorateHeadshotUrl.js.map +1 -1
- package/lib/model/Byline.d.ts +8 -10
- package/lib/model/Byline.js +34 -33
- package/lib/model/Byline.js.map +1 -1
- package/lib/model/Byline.test.js +105 -52
- package/lib/model/Byline.test.js.map +1 -1
- package/lib/model/CapiResponse.d.ts +11 -15
- package/lib/model/CapiResponse.js +37 -40
- package/lib/model/CapiResponse.js.map +1 -1
- package/lib/model/CapiResponse.test.js +7 -18
- package/lib/model/CapiResponse.test.js.map +1 -1
- package/lib/model/Clip.d.ts +1 -1
- package/lib/model/Concept.d.ts +1 -1
- package/lib/model/Concept.js +1 -2
- package/lib/model/Concept.js.map +1 -1
- package/lib/model/FlourishSource.d.ts +1 -1
- package/lib/model/FlourishSource.js.map +1 -1
- package/lib/model/Image.d.ts +1 -1
- package/lib/model/LeadFlourish.test.js +1 -0
- package/lib/model/LeadFlourish.test.js.map +1 -1
- package/lib/model/Person.d.ts +6 -12
- package/lib/model/Person.js +39 -66
- package/lib/model/Person.js.map +1 -1
- package/lib/model/Person.test.js +7 -60
- package/lib/model/Person.test.js.map +1 -1
- package/lib/model/Picture.d.ts +1 -1
- package/lib/model/RichText.d.ts +1 -2
- package/lib/model/Topper.d.ts +1 -1
- package/lib/model/Topper.js +10 -8
- package/lib/model/Topper.js.map +1 -1
- package/lib/model/Topper.test.js +9 -10
- package/lib/model/Topper.test.js.map +1 -1
- package/lib/model/schemas/capi/article.d.ts +4 -1
- package/lib/model/schemas/capi/article.js +1 -0
- package/lib/model/schemas/capi/article.js.map +1 -1
- package/lib/model/schemas/capi/audio.d.ts +4 -1
- package/lib/model/schemas/capi/audio.js +1 -0
- package/lib/model/schemas/capi/audio.js.map +1 -1
- package/lib/model/schemas/capi/base-schema.d.ts +11 -120
- package/lib/model/schemas/capi/base-schema.js +6 -5
- package/lib/model/schemas/capi/base-schema.js.map +1 -1
- package/lib/model/schemas/capi/content-package.d.ts +7 -2
- package/lib/model/schemas/capi/content-package.js +2 -0
- package/lib/model/schemas/capi/content-package.js.map +1 -1
- package/lib/model/schemas/capi/index.d.ts +26 -7
- package/lib/model/schemas/capi/internal-content.d.ts +24 -0
- package/lib/model/schemas/capi/internal-content.js +3 -0
- package/lib/model/schemas/capi/internal-content.js.map +1 -0
- package/lib/model/schemas/capi/live-blog-package.d.ts +4 -1
- package/lib/model/schemas/capi/live-blog-package.js +1 -0
- package/lib/model/schemas/capi/live-blog-package.js.map +1 -1
- package/lib/model/schemas/capi/placeholder.d.ts +4 -1
- package/lib/model/schemas/capi/placeholder.js +1 -0
- package/lib/model/schemas/capi/placeholder.js.map +1 -1
- package/lib/model/schemas/capi/video.d.ts +7 -2
- package/lib/model/schemas/capi/video.js +2 -0
- package/lib/model/schemas/capi/video.js.map +1 -1
- package/lib/resolvers/concept.d.ts +37 -2
- package/lib/resolvers/concept.js +17 -10
- package/lib/resolvers/concept.js.map +1 -1
- package/lib/resolvers/content-tree/Workarounds.d.ts +19 -11
- package/lib/resolvers/content-tree/references/Author.d.ts +4 -0
- package/lib/resolvers/content-tree/references/Author.js +14 -0
- package/lib/resolvers/content-tree/references/Author.js.map +1 -0
- package/lib/resolvers/content-tree/references/ClipSet.d.ts +1 -1
- package/lib/resolvers/content-tree/references/ClipSet.js +1 -1
- package/lib/resolvers/content-tree/references/ClipSet.js.map +1 -1
- package/lib/resolvers/content-tree/references/Flourish.d.ts +1 -1
- package/lib/resolvers/content-tree/references/Reference.d.ts +1 -1
- package/lib/resolvers/content-tree/references/Tweet.d.ts +1 -1
- package/lib/resolvers/content-tree/references/index.d.ts +4 -2
- package/lib/resolvers/content-tree/references/index.js +4 -1
- package/lib/resolvers/content-tree/references/index.js.map +1 -1
- package/lib/resolvers/content-tree/updateTreeWithReferenceIds.d.ts +3 -3
- package/lib/resolvers/content-tree/updateTreeWithReferenceIds.js +2 -3
- package/lib/resolvers/content-tree/updateTreeWithReferenceIds.js.map +1 -1
- package/lib/resolvers/content.d.ts +19 -10
- package/lib/resolvers/content.js +4 -2
- package/lib/resolvers/content.js.map +1 -1
- package/lib/resolvers/image.d.ts +12 -12
- package/lib/resolvers/index.d.ts +81 -34
- package/lib/resolvers/leadFlourish.d.ts +2 -1
- package/lib/resolvers/leadFlourish.js +1 -0
- package/lib/resolvers/leadFlourish.js.map +1 -1
- package/lib/resolvers/person.d.ts +1 -1
- package/lib/resolvers/person.js +1 -1
- package/lib/resolvers/person.js.map +1 -1
- package/lib/resolvers/picture.d.ts +4 -4
- package/lib/resolvers/richText.d.ts +1 -1
- package/lib/resolvers/teaser.d.ts +1 -1
- package/lib/resolvers/topper.d.ts +3 -3
- package/package.json +1 -1
- package/queries/article.graphql +35 -13
- package/src/datasources/capi.test.ts +3 -3
- package/src/datasources/capi.ts +5 -3
- package/src/datasources/twitter.ts +5 -1
- package/src/fixtures/capiObject.ts +4 -2
- package/src/fixtures/capiPerson.ts +1 -1
- package/src/generated/index.ts +303 -114
- package/src/helpers/decorateHeadshotUrl.ts +2 -2
- package/src/model/Byline.test.ts +136 -55
- package/src/model/Byline.ts +49 -39
- package/src/model/CapiResponse.test.ts +9 -25
- package/src/model/CapiResponse.ts +82 -55
- package/src/model/Clip.ts +1 -1
- package/src/model/Concept.ts +3 -3
- package/src/model/FlourishSource.ts +1 -1
- package/src/model/Image.test.ts +1 -1
- package/src/model/Image.ts +1 -1
- package/src/model/LeadFlourish.test.ts +1 -0
- package/src/model/Person.test.ts +11 -62
- package/src/model/Person.ts +47 -51
- package/src/model/Picture.test.ts +1 -1
- package/src/model/Picture.ts +1 -1
- package/src/model/Topper.test.ts +22 -18
- package/src/model/Topper.ts +10 -9
- package/src/model/__snapshots__/Byline.test.ts.snap +166 -27
- package/src/model/schemas/capi/article.ts +1 -0
- package/src/model/schemas/capi/audio.ts +1 -0
- package/src/model/schemas/capi/base-schema.ts +4 -3
- package/src/model/schemas/capi/content-package.ts +2 -0
- package/src/model/schemas/capi/internal-content.ts +45 -0
- package/src/model/schemas/capi/live-blog-package.ts +1 -0
- package/src/model/schemas/capi/placeholder.ts +1 -0
- package/src/model/schemas/capi/video.ts +2 -0
- package/src/resolvers/concept.ts +29 -12
- package/src/resolvers/content-tree/Workarounds.ts +39 -20
- package/src/resolvers/content-tree/references/Author.ts +18 -0
- package/src/resolvers/content-tree/references/ClipSet.ts +6 -8
- package/src/resolvers/content-tree/references/ImageSet.ts +1 -1
- package/src/resolvers/content-tree/references/ScrollyImage.ts +1 -1
- package/src/resolvers/content-tree/references/index.ts +6 -1
- package/src/resolvers/content-tree/updateTreeWithReferenceIds.ts +6 -8
- package/src/resolvers/content.ts +4 -2
- package/src/resolvers/leadFlourish.ts +1 -0
- package/src/resolvers/person.ts +1 -1
- package/src/types/n-display-metadata.d.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/typedefs/clip.graphql +2 -2
- package/typedefs/concept.graphql +64 -2
- package/typedefs/content.graphql +55 -31
- package/typedefs/image.graphql +12 -12
- package/typedefs/leadFlourish.graphql +32 -0
- package/typedefs/person.graphql +2 -2
- package/typedefs/picture.graphql +6 -6
- package/typedefs/references/author.graphql +7 -0
- package/typedefs/references/clipSet.graphql +14 -2
- package/typedefs/teaser.graphql +10 -10
- package/src/types/internal-content.d.ts +0 -55
- package/typedefs/leadFlouish.graphql +0 -29
|
@@ -23,11 +23,11 @@ declare const resolvers: {
|
|
|
23
23
|
genreConcept: (topper: import("../model/Topper").Topper) => import("../model/Concept").Concept | null;
|
|
24
24
|
};
|
|
25
25
|
TopperWithHeadshot: {
|
|
26
|
-
headshot: (topper: import("../model/Topper").Topper, args: Partial<import("../generated").TopperWithHeadshotHeadshotArgs>) =>
|
|
26
|
+
headshot: (topper: import("../model/Topper").Topper, args: Partial<import("../generated").TopperWithHeadshotHeadshotArgs>) => Promise<string | null>;
|
|
27
27
|
};
|
|
28
28
|
PodcastTopper: {
|
|
29
29
|
brandConcept: (topper: import("../model/Topper").Topper) => import("../model/Concept").Concept | null;
|
|
30
|
-
headshot: (topper: import("../model/Topper").Topper, args: Partial<import("../generated").PodcastTopperHeadshotArgs>) =>
|
|
30
|
+
headshot: (topper: import("../model/Topper").Topper, args: Partial<import("../generated").PodcastTopperHeadshotArgs>) => Promise<string | null>;
|
|
31
31
|
isLargeHeadline: (topper: import("../model/Topper").Topper) => boolean;
|
|
32
32
|
layout: (topper: import("../model/Topper").Topper) => string;
|
|
33
33
|
columnist: (topper: import("../model/Topper").Topper) => import("../model/Concept").Concept | null;
|
|
@@ -42,7 +42,7 @@ declare const resolvers: {
|
|
|
42
42
|
textShadow: import("../generated").Resolver<import("../generated").Maybe<import("../generated").ResolverTypeWrapper<boolean>>, import("../model/Topper").Topper, import("..").QueryContext, {}>;
|
|
43
43
|
};
|
|
44
44
|
OpinionTopper: {
|
|
45
|
-
headshot: (topper: import("../model/Topper").Topper, args: Partial<import("../generated").OpinionTopperHeadshotArgs>) =>
|
|
45
|
+
headshot: (topper: import("../model/Topper").Topper, args: Partial<import("../generated").OpinionTopperHeadshotArgs>) => Promise<string | null>;
|
|
46
46
|
isLargeHeadline: (topper: import("../model/Topper").Topper) => boolean;
|
|
47
47
|
layout: (topper: import("../model/Topper").Topper) => string;
|
|
48
48
|
columnist: (topper: import("../model/Topper").Topper) => import("../model/Concept").Concept | null;
|
package/package.json
CHANGED
package/queries/article.graphql
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
fragment Concept on
|
|
1
|
+
fragment Concept on ConceptInterface {
|
|
2
2
|
id
|
|
3
3
|
prefLabel
|
|
4
4
|
types
|
|
@@ -6,10 +6,22 @@ fragment Concept on Concept {
|
|
|
6
6
|
directType
|
|
7
7
|
isPackageBrand
|
|
8
8
|
predicate
|
|
9
|
+
|
|
10
|
+
...ConceptURLs
|
|
11
|
+
...Author
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
fragment ConceptURLs on ConceptInterface {
|
|
9
15
|
url(vanity: $useVanities)
|
|
10
16
|
relativeUrl: url(relative: true, vanity: $useVanities)
|
|
11
17
|
}
|
|
12
18
|
|
|
19
|
+
fragment Author on Author {
|
|
20
|
+
person {
|
|
21
|
+
...Person
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
13
25
|
fragment StructuredTree on StructuredContent {
|
|
14
26
|
tree
|
|
15
27
|
}
|
|
@@ -17,14 +29,13 @@ fragment StructuredTree on StructuredContent {
|
|
|
17
29
|
fragment MetaLink on MetaLink {
|
|
18
30
|
... on Concept {
|
|
19
31
|
id
|
|
20
|
-
url
|
|
21
|
-
relativeUrl: url(relative: true)
|
|
22
32
|
prefLabel
|
|
33
|
+
...ConceptURLs
|
|
23
34
|
}
|
|
24
35
|
... on ContentPackage {
|
|
25
36
|
id
|
|
26
|
-
url
|
|
27
|
-
relativeUrl: url(relative: true)
|
|
37
|
+
url: url(vanity: $useVanities)
|
|
38
|
+
relativeUrl: url(vanity: $useVanities, relative: true)
|
|
28
39
|
prefLabel: title
|
|
29
40
|
}
|
|
30
41
|
}
|
|
@@ -82,6 +93,7 @@ fragment Person on Person {
|
|
|
82
93
|
}
|
|
83
94
|
|
|
84
95
|
fragment FlourishSource on FlourishSource {
|
|
96
|
+
id
|
|
85
97
|
url
|
|
86
98
|
type
|
|
87
99
|
format
|
|
@@ -361,10 +373,6 @@ fragment Transcript on RichText {
|
|
|
361
373
|
|
|
362
374
|
fragment ClipSet on ClipSet {
|
|
363
375
|
type
|
|
364
|
-
autoplay
|
|
365
|
-
loop
|
|
366
|
-
muted
|
|
367
|
-
dataLayout
|
|
368
376
|
id
|
|
369
377
|
noAudio
|
|
370
378
|
caption
|
|
@@ -483,6 +491,19 @@ fragment Indicators on Indicators {
|
|
|
483
491
|
isOpinion
|
|
484
492
|
}
|
|
485
493
|
|
|
494
|
+
fragment BylineAuthor on AuthorReference {
|
|
495
|
+
concept {
|
|
496
|
+
...ConceptURLs
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
fragment Byline on StructuredContent {
|
|
501
|
+
tree
|
|
502
|
+
references {
|
|
503
|
+
...BylineAuthor
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
|
|
486
507
|
fragment PinnedPost on Content {
|
|
487
508
|
__typename
|
|
488
509
|
id
|
|
@@ -500,8 +521,8 @@ fragment PinnedPost on Content {
|
|
|
500
521
|
altTitle {
|
|
501
522
|
promotionalTitle
|
|
502
523
|
}
|
|
503
|
-
byline
|
|
504
|
-
|
|
524
|
+
byline {
|
|
525
|
+
...Byline
|
|
505
526
|
}
|
|
506
527
|
accessLevel
|
|
507
528
|
canBeSyndicated
|
|
@@ -538,6 +559,7 @@ fragment Content on Content {
|
|
|
538
559
|
publishedDate
|
|
539
560
|
publishedTimestamp
|
|
540
561
|
firstPublishedDate
|
|
562
|
+
modifiedTimestamp
|
|
541
563
|
publishReference
|
|
542
564
|
standfirst
|
|
543
565
|
topper {
|
|
@@ -555,8 +577,8 @@ fragment Content on Content {
|
|
|
555
577
|
altTitle {
|
|
556
578
|
promotionalTitle
|
|
557
579
|
}
|
|
558
|
-
byline
|
|
559
|
-
|
|
580
|
+
byline {
|
|
581
|
+
...Byline
|
|
560
582
|
}
|
|
561
583
|
annotations {
|
|
562
584
|
...Concept
|
|
@@ -3,7 +3,7 @@ import { CapiDataSource } from './capi'
|
|
|
3
3
|
import { QueryContext } from '..'
|
|
4
4
|
import { KeyValueCache } from '@apollo/utils.keyvaluecache'
|
|
5
5
|
import { CapiResponse } from '../model/CapiResponse'
|
|
6
|
-
import { ContentTypeSchemas } from '../
|
|
6
|
+
import { ContentTypeSchemas } from '../model/schemas/capi/internal-content'
|
|
7
7
|
|
|
8
8
|
const logger = new Logger()
|
|
9
9
|
const metrics = { count: jest.fn() }
|
|
@@ -63,8 +63,8 @@ describe('CapiDataSource', () => {
|
|
|
63
63
|
expect.arrayContaining([
|
|
64
64
|
expect.objectContaining({
|
|
65
65
|
prefix: 'contentPipelineArticle',
|
|
66
|
-
id
|
|
67
|
-
})
|
|
66
|
+
id,
|
|
67
|
+
}),
|
|
68
68
|
])
|
|
69
69
|
)
|
|
70
70
|
})
|
package/src/datasources/capi.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { CapiResponse } from '../model/CapiResponse'
|
|
2
2
|
import { InstrumentedRESTDataSource } from './instrumented'
|
|
3
|
-
import { CapiPerson } from '../types/internal-content'
|
|
4
3
|
import { AugmentedRequest } from '@apollo/datasource-rest'
|
|
5
4
|
import {
|
|
6
5
|
KeyValueCache,
|
|
@@ -8,6 +7,7 @@ import {
|
|
|
8
7
|
} from '@apollo/utils.keyvaluecache'
|
|
9
8
|
import { CapiList } from '../model/CapiList'
|
|
10
9
|
import TimeoutError from '../helpers/timeout-error'
|
|
10
|
+
import { Person } from '../model/Person'
|
|
11
11
|
|
|
12
12
|
const REQUEST_TIMEOUT = process.env.CAPI_DATASOURCE_REQUEST_TIMEOUT
|
|
13
13
|
? parseInt(process.env.CAPI_DATASOURCE_REQUEST_TIMEOUT)
|
|
@@ -79,10 +79,12 @@ export class CapiDataSource extends InstrumentedRESTDataSource {
|
|
|
79
79
|
return CapiResponse.fromJSON(content, this.context, packageContainer)
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
getPerson(uuid: string): Promise<
|
|
83
|
-
|
|
82
|
+
async getPerson(uuid: string): Promise<Person> {
|
|
83
|
+
const person = await this.get(`people/${uuid}`, {
|
|
84
84
|
cacheOptions: { ttl: this.peopleCacheTTL },
|
|
85
85
|
})
|
|
86
|
+
|
|
87
|
+
return Person.fromJson(person, this.context)
|
|
86
88
|
}
|
|
87
89
|
|
|
88
90
|
async getList(uuid: string): Promise<CapiList> {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { AugmentedRequest, CacheOptions } from '@apollo/datasource-rest'
|
|
2
|
+
import * as z from 'zod'
|
|
3
|
+
|
|
2
4
|
import { InstrumentedRESTDataSource } from './instrumented'
|
|
3
5
|
import TimeoutError from '../helpers/timeout-error'
|
|
4
6
|
|
|
@@ -6,6 +8,8 @@ const REQUEST_TIMEOUT = process.env.TWITTER_DATASOURCE_REQUEST_TIMEOUT
|
|
|
6
8
|
? parseInt(process.env.TWITTER_DATASOURCE_REQUEST_TIMEOUT)
|
|
7
9
|
: 1000
|
|
8
10
|
|
|
11
|
+
const Tweet = z.object({ html: z.string() })
|
|
12
|
+
|
|
9
13
|
export class TwitterDataSource extends InstrumentedRESTDataSource {
|
|
10
14
|
baseURL = 'https://publish.twitter.com'
|
|
11
15
|
get backendSystemCode() {
|
|
@@ -35,7 +39,7 @@ export class TwitterDataSource extends InstrumentedRESTDataSource {
|
|
|
35
39
|
this.timeout = undefined
|
|
36
40
|
}
|
|
37
41
|
|
|
38
|
-
return tweet
|
|
42
|
+
return Tweet.parse(tweet)
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
cacheOptionsFor(): CacheOptions {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Article } from '../model/schemas/capi/internal-content'
|
|
2
2
|
|
|
3
|
-
export const baseCapiObject:
|
|
3
|
+
export const baseCapiObject: Article = {
|
|
4
4
|
id: 'http://www.ft.com/thing/3071cae8-a27c-4ab4-a0d4-7bb00df1d477',
|
|
5
5
|
type: 'http://www.ft.com/ontology/content/Article',
|
|
6
6
|
types: ['http://www.ft.com/ontology/content/Article'],
|
|
@@ -57,5 +57,7 @@ export const baseCapiObject: InternalContent = {
|
|
|
57
57
|
accessLevel: 'premium' as const,
|
|
58
58
|
embeds: [],
|
|
59
59
|
publishedDate: '2024-04-02T10:00:09.935Z',
|
|
60
|
+
lastModified: '2024-04-02T12:34:56.789Z',
|
|
60
61
|
firstPublishedDate: '',
|
|
62
|
+
canBeSyndicated: 'yes',
|
|
61
63
|
}
|