@financial-times/cp-content-pipeline-schema 3.5.1 → 3.6.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.
- package/CHANGELOG.md +16 -0
- package/lib/datasources/capi.test.js +1 -1
- package/lib/datasources/capi.test.js.map +1 -1
- package/lib/datasources/instrumented.js +1 -2
- package/lib/datasources/instrumented.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js.map +1 -1
- package/lib/model/Image.js +11 -32
- package/lib/model/Image.js.map +1 -1
- package/lib/model/Image.test.js +24 -54
- package/lib/model/Image.test.js.map +1 -1
- package/package.json +1 -1
- package/src/datasources/capi.test.ts +1 -1
- package/src/datasources/instrumented.ts +4 -8
- package/src/index.ts +2 -1
- package/src/model/Image.test.ts +37 -60
- package/src/model/Image.ts +12 -36
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.6.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v3.5.2...cp-content-pipeline-schema-v3.6.0) (2024-11-05)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **metrics:** add support for aggregating an average per metrics bucket ([0f0ddd0](https://github.com/Financial-Times/cp-content-pipeline/commit/0f0ddd00b063d546f32e7d6d6746c6ff6c1bc196))
|
|
9
|
+
* use aggregate metrics for timed metrics ([5fa29c4](https://github.com/Financial-Times/cp-content-pipeline/commit/5fa29c4245e779e92c8b3d8aae82d2f80906a89f))
|
|
10
|
+
|
|
11
|
+
## [3.5.2](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v3.5.1...cp-content-pipeline-schema-v3.5.2) (2024-10-30)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
* don't call image service for any images with missing dimensions ([b3bab4b](https://github.com/Financial-Times/cp-content-pipeline/commit/b3bab4b7c30098e83bc5e1e99a953b741b3a46b6))
|
|
17
|
+
* set max image DPR to 2 when no dimensions ([d556e0b](https://github.com/Financial-Times/cp-content-pipeline/commit/d556e0bd6862c23f3279db717b2cab1617e98c0f))
|
|
18
|
+
|
|
3
19
|
## [3.5.1](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v3.5.0...cp-content-pipeline-schema-v3.5.1) (2024-10-29)
|
|
4
20
|
|
|
5
21
|
|
|
@@ -4,7 +4,7 @@ const logger_1 = require("@dotcom-reliability-kit/logger");
|
|
|
4
4
|
const capi_1 = require("./capi");
|
|
5
5
|
const CapiResponse_1 = require("../model/CapiResponse");
|
|
6
6
|
const logger = new logger_1.Logger();
|
|
7
|
-
const metrics = { count: jest.fn() };
|
|
7
|
+
const metrics = { count: jest.fn(), aggregate: jest.fn() };
|
|
8
8
|
const cache = {
|
|
9
9
|
get: jest.fn(),
|
|
10
10
|
set: jest.fn(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capi.test.js","sourceRoot":"","sources":["../../src/datasources/capi.test.ts"],"names":[],"mappings":";;AAAA,2DAAuD;AACvD,iCAAuC;AAGvC,wDAAoD;AAGpD,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAA;AAC3B,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"capi.test.js","sourceRoot":"","sources":["../../src/datasources/capi.test.ts"],"names":[],"mappings":";;AAAA,2DAAuD;AACvD,iCAAuC;AAGvC,wDAAoD;AAGpD,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAA;AAC3B,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAA;AAE1D,MAAM,KAAK,GAAG;IACZ,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;CACM,CAAA;AAEzB,MAAM,OAAO,GAAG;IACd,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAC3C,MAAM;IACN,OAAO;IACP,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;CACD,CAAA;AAE5B,MAAM,IAAI,GAAG,IAAI,qBAAc,CAAC;IAC9B,KAAK;IACL,OAAO;CACR,CAAC,CAAA;AAEF,MAAM,EAAE,GAAG,sCAAsC,CAAA;AAEjD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAC5C,KAAK,IAAI,EAAE,CACT,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;YACnC,OAAO,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC,CAAC;SAC7D,CAAC,CACL,CAAA;QAED,IAAI;aACD,KAAK,CAAC,2BAAY,EAAE,UAAU,CAAC;aAC/B,kBAAkB,CACjB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CACnB,IAAI,2BAAY,CAAC,OAA6B,EAAE,OAAO,CAAC,CAC3D,CAAA;IACL,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YAEzB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAA;YAC9B,MAAM,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAC5D,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAC7B,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YACzB,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,cAAc,CAC7C,MAAM,CAAC,eAAe,CAAC;gBACrB,MAAM,CAAC,gBAAgB,CAAC;oBACtB,MAAM,EAAE,wBAAwB;oBAChC,EAAE;iBACH,CAAC;aACH,CAAC,CACH,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,GAAG,EAAE;QACZ,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -46,8 +46,7 @@ class InstrumentedRESTDataSource extends datasource_rest_1.RESTDataSource {
|
|
|
46
46
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
47
47
|
async throwIfResponseIsError() { }
|
|
48
48
|
logResponseMetrics(status, duration) {
|
|
49
|
-
this.context.metrics?.
|
|
50
|
-
this.context.metrics?.count(`graphql.datasource.${this.constructor.name}.response.${status}.time`, Number(duration));
|
|
49
|
+
this.context.metrics?.aggregate(`graphql.datasource.${this.constructor.name}.response.${status}`, Number(duration), 'time');
|
|
51
50
|
}
|
|
52
51
|
async fetch(path, incomingRequest) {
|
|
53
52
|
const startTime = process.hrtime.bigint();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumented.js","sourceRoot":"","sources":["../../src/datasources/instrumented.ts"],"names":[],"mappings":";;;AAAA,6DAMgC;AAChC,qEAAoE;AACpE,qFAGoD;AAEpD,0CAAmD;AAEnD,2DAA0D;AAE1D,MAAa,0BACX,SAAQ,gCAAc;IAGtB,SAAS,CAAS;IAClB,OAAO,CAAc;IACrB,KAAK,GAAa,EAAE,CAAA;IACpB,YAAY,CAAmB;IAE/B,IAAI,iBAAiB;QACnB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,YAAY,EAAE,KAAK,EAAE,OAAO,EAAyB;QACnD,MAAM,YAAY,GAAG,IAAI,4CAAsB,CAC7C,IAAA,0BAAkB,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAC9D,sEAAsE,CAAC,yCAAyC;SACjH,CAAA;QAED,KAAK,CAAC;YACJ,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;SACjE,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,GAAG,IAAA,6CAAuB,EAAC;YAC1C,kBAAkB,EAAE,IAAI,CAAC,iBAAiB;SAC3C,CAAC,CAAA;QAEF,+BAA+B;QAC/B,4DAA4D;QAC5D,QAAQ;QACR,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,GAAG,CAAA;QAC/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IACvE,CAAC;IAEkB,WAAW,CAAC,GAAQ;QACrC,OAAO,GAAG,CAAC,IAAI,CAAA;IACjB,CAAC;IAEQ,eAAe,CAAC,IAAY,EAAE,OAAyB;QAC9D,OAAO,CAAC,OAAO,CACb,YAAY,CACb,GAAG,2BAA2B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,+BAA+B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAA;QAEtH,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACjE,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAA;QAC1D,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,gEAAgE;IAChE,KAAK,CAAC,sBAAsB,KAAI,CAAC;IAEjC,kBAAkB,CAAC,MAAc,EAAE,QAAgB;QACjD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"instrumented.js","sourceRoot":"","sources":["../../src/datasources/instrumented.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -3,7 +3,8 @@ import type { KeyValueCache } from '@apollo/utils.keyvaluecache';
|
|
|
3
3
|
import type { Logger } from '@dotcom-reliability-kit/logger';
|
|
4
4
|
import { AnyNode } from './resolvers/content-tree/Workarounds';
|
|
5
5
|
interface Metrics {
|
|
6
|
-
count(metric: string | string[], count?: number):
|
|
6
|
+
count(metric: string | string[], count?: number): number;
|
|
7
|
+
aggregate(metric: string | string[], value: number, totalKey?: string): number;
|
|
7
8
|
}
|
|
8
9
|
export type BodyXMLToTreeError = {
|
|
9
10
|
message: string;
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA4D;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA4D;AAmDnD,gGAnDA,6BAAe,OAmDA;AAhDxB,8CAAoD;AACpD,4EAAsE;AACtE,2CAA4B;AAC5B,2BAAiC;AAiCpB,QAAA,oBAAoB,GAAG,IAAA,iBAAY,EAC9C,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,EAC7C,OAAO,CACR,CAAA;AAEY,QAAA,QAAQ,GAAG,IAAA,qBAAc,EACpC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B,CAAC,EAChD;IACE,OAAO,EAAE,CAAC,IAAI,uCAAiB,EAAE,CAAC;CACnC,CACF,CAAA;AAGD,yCAAkD;AAAzC,uHAAA,OAAO,OAAa;AAC7B,+CAAwD;AAA/C,mHAAA,OAAO,OAAW;AAC3B,yCAA0C;AAAjC,+FAAA,OAAO,OAAA;AAEhB,+FAA8E"}
|
package/lib/model/Image.js
CHANGED
|
@@ -8,7 +8,6 @@ const metadata_1 = require("../helpers/metadata");
|
|
|
8
8
|
const imageService_1 = __importDefault(require("../helpers/imageService"));
|
|
9
9
|
const literal_union_1 = require("../resolvers/literal-union");
|
|
10
10
|
const scalars_1 = require("../resolvers/scalars");
|
|
11
|
-
const isError_1 = __importDefault(require("../helpers/isError"));
|
|
12
11
|
const errors_1 = require("@dotcom-reliability-kit/errors");
|
|
13
12
|
class CAPIImage {
|
|
14
13
|
capiImage;
|
|
@@ -84,7 +83,7 @@ class CAPIImage {
|
|
|
84
83
|
maxAllowedWidth = Math.min(requestedWidth, dimensions?.width || Infinity);
|
|
85
84
|
maxDpr = dimensions
|
|
86
85
|
? Math.min(args.maxDpr || Infinity, Math.floor(dimensions.width / maxAllowedWidth))
|
|
87
|
-
:
|
|
86
|
+
: 2;
|
|
88
87
|
const resolutions = [...Array(maxDpr + 1).keys()].slice(1);
|
|
89
88
|
return resolutions.map((dpr) => ({
|
|
90
89
|
url: (0, imageService_1.default)({
|
|
@@ -111,36 +110,16 @@ class CAPIImage {
|
|
|
111
110
|
height: this.capiImage.pixelHeight,
|
|
112
111
|
};
|
|
113
112
|
}
|
|
114
|
-
// HACK:KB:20241029 graphics don't
|
|
115
|
-
//
|
|
116
|
-
// performance. skip calling Image Service for
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
return null;
|
|
125
|
-
}
|
|
126
|
-
try {
|
|
127
|
-
const imageMetadata = await this.#dataSources.origami.getImageMetadata(this.capiImage.binaryUrl);
|
|
128
|
-
return imageMetadata;
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
if ((0, isError_1.default)(error)) {
|
|
132
|
-
this.context.logger.warn({
|
|
133
|
-
event: 'RECOVERABLE_ERROR',
|
|
134
|
-
error: new errors_1.OperationalError({
|
|
135
|
-
code: 'IMAGE_DIMENSIONS_ERROR',
|
|
136
|
-
message: `Failed to get dimensions for ${this.capiImage.binaryUrl}`,
|
|
137
|
-
url: this.capiImage.binaryUrl,
|
|
138
|
-
cause: error,
|
|
139
|
-
}),
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
113
|
+
// HACK:KB:20241029 graphics and images in layouts don't have pixelWidth/
|
|
114
|
+
// pixelHeight because of reasons. we want to avoid calling Image Service
|
|
115
|
+
// to improve performance. skip calling Image Service for the time being
|
|
116
|
+
this.context.logger.warn({
|
|
117
|
+
event: 'SKIPPING_IMAGE_DIMENSIONS',
|
|
118
|
+
message: 'Not calling Image Service to get graphics dimensions',
|
|
119
|
+
url: this.capiImage.binaryUrl,
|
|
120
|
+
type: this.type(),
|
|
121
|
+
});
|
|
122
|
+
return null;
|
|
144
123
|
}
|
|
145
124
|
credit() {
|
|
146
125
|
return this.capiImage.copyright?.notice ?? null;
|
package/lib/model/Image.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../../src/model/Image.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAiD;AACjD,2EAAqD;AAOrD,8DAGmC;AACnC,kDAA6D;AAC7D,
|
|
1
|
+
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../../src/model/Image.ts"],"names":[],"mappings":"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"}
|
package/lib/model/Image.test.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
const Image_1 = require("./Image");
|
|
4
|
-
const
|
|
7
|
+
const logger_1 = __importDefault(require("@dotcom-reliability-kit/logger"));
|
|
5
8
|
const imageService_1 = require("../helpers/imageService");
|
|
6
9
|
describe('Image', () => {
|
|
7
10
|
const mockImage = {
|
|
@@ -10,40 +13,32 @@ describe('Image', () => {
|
|
|
10
13
|
title: 'title',
|
|
11
14
|
description: 'description',
|
|
12
15
|
binaryUrl: 'cloudfront.com/image',
|
|
16
|
+
pixelWidth: 5000,
|
|
17
|
+
pixelHeight: 1000,
|
|
13
18
|
};
|
|
14
19
|
const graphic = {
|
|
15
20
|
...mockImage,
|
|
16
21
|
type: 'http://www.ft.com/ontology/content/Graphic',
|
|
17
22
|
};
|
|
18
|
-
const getImageMetadata = globals_1.jest.fn();
|
|
19
23
|
const context = {
|
|
20
|
-
|
|
21
|
-
origami: {
|
|
22
|
-
getImageMetadata,
|
|
23
|
-
},
|
|
24
|
-
capi: {},
|
|
25
|
-
vanityUrls: {},
|
|
26
|
-
},
|
|
24
|
+
logger: logger_1.default,
|
|
27
25
|
systemCode: 'image-test',
|
|
28
26
|
};
|
|
29
|
-
beforeEach(() => {
|
|
30
|
-
getImageMetadata.mockReset();
|
|
31
|
-
});
|
|
32
27
|
describe('sourceSet', () => {
|
|
33
28
|
describe('An image that is provided with a high resolution', () => {
|
|
34
|
-
|
|
35
|
-
beforeAll(async () => {
|
|
36
|
-
getImageMetadata.mockResolvedValue({ width: 5000, height: 1000 });
|
|
29
|
+
it('transforms the URL to use the Origami Image Service', async () => {
|
|
37
30
|
const model = new Image_1.CAPIImage(mockImage, context);
|
|
38
|
-
sourceSet = await model.sourceSet({ width: 1000 });
|
|
39
|
-
});
|
|
40
|
-
it('transforms the URL to use the Origami Image Service', () => {
|
|
31
|
+
const sourceSet = await model.sourceSet({ width: 1000 });
|
|
41
32
|
expect(sourceSet.every((source) => source.url.startsWith('https://www.ft.com/__origami/service/image/v2'))).toBeTruthy();
|
|
42
33
|
});
|
|
43
|
-
it('resizes the image to the requested width', () => {
|
|
34
|
+
it('resizes the image to the requested width', async () => {
|
|
35
|
+
const model = new Image_1.CAPIImage(mockImage, context);
|
|
36
|
+
const sourceSet = await model.sourceSet({ width: 1000 });
|
|
44
37
|
expect(sourceSet.every((source) => source.width === 1000 && source.url.includes('width=1000'))).toBeTruthy();
|
|
45
38
|
});
|
|
46
|
-
it('includes sourceSet for all the possible resolutions we can display the image at, given the requested width and the original source width', () => {
|
|
39
|
+
it('includes sourceSet for all the possible resolutions we can display the image at, given the requested width and the original source width', async () => {
|
|
40
|
+
const model = new Image_1.CAPIImage(mockImage, context);
|
|
41
|
+
const sourceSet = await model.sourceSet({ width: 1000 });
|
|
47
42
|
expect(sourceSet.length).toEqual(5);
|
|
48
43
|
expect(sourceSet[0]?.dpr).toEqual(1);
|
|
49
44
|
expect(sourceSet[0]?.url).toMatch(/dpr=1/);
|
|
@@ -53,8 +48,7 @@ describe('Image', () => {
|
|
|
53
48
|
});
|
|
54
49
|
describe("An image that that isn't wide enough to generate high-resolution sourceSet for", () => {
|
|
55
50
|
it('returns an array with a single resolution iamge service UR', async () => {
|
|
56
|
-
|
|
57
|
-
const model = new Image_1.CAPIImage(mockImage, context);
|
|
51
|
+
const model = new Image_1.CAPIImage({ ...mockImage, pixelWidth: 1500, pixelHeight: 500 }, context);
|
|
58
52
|
const sourceSet = await model.sourceSet({ width: 1000 });
|
|
59
53
|
expect(sourceSet.length).toEqual(1);
|
|
60
54
|
expect(sourceSet[0]).toEqual({
|
|
@@ -66,8 +60,7 @@ describe('Image', () => {
|
|
|
66
60
|
});
|
|
67
61
|
describe('An image that that is smaller than the width that was requested', () => {
|
|
68
62
|
it('returns the image at the same width as the original', async () => {
|
|
69
|
-
|
|
70
|
-
const model = new Image_1.CAPIImage(mockImage, context);
|
|
63
|
+
const model = new Image_1.CAPIImage({ ...mockImage, pixelWidth: 500, pixelHeight: 500 }, context);
|
|
71
64
|
const sourceSet = await model.sourceSet({ width: 1000 });
|
|
72
65
|
expect(sourceSet.length).toEqual(1);
|
|
73
66
|
expect(sourceSet[0]).toEqual({
|
|
@@ -79,8 +72,7 @@ describe('Image', () => {
|
|
|
79
72
|
});
|
|
80
73
|
describe('An image that that is bigger than the maximum width that was requested', () => {
|
|
81
74
|
it('returns the image at the same width as the maximum width', async () => {
|
|
82
|
-
|
|
83
|
-
const model = new Image_1.CAPIImage(mockImage, context);
|
|
75
|
+
const model = new Image_1.CAPIImage({ ...mockImage, pixelWidth: 4000, pixelHeight: 4000 }, context);
|
|
84
76
|
const sourceSet = await model.sourceSet({ width: imageService_1.MAX_IMAGE_WIDTH });
|
|
85
77
|
expect(sourceSet.length).toEqual(1);
|
|
86
78
|
expect(sourceSet[0]?.width).toEqual(imageService_1.MAX_IMAGE_WIDTH);
|
|
@@ -88,8 +80,7 @@ describe('Image', () => {
|
|
|
88
80
|
});
|
|
89
81
|
describe('A large image with the maxDpr argumet passed', () => {
|
|
90
82
|
it('only returns sourceSet up to and including the maxDpr', async () => {
|
|
91
|
-
|
|
92
|
-
const model = new Image_1.CAPIImage(mockImage, context);
|
|
83
|
+
const model = new Image_1.CAPIImage({ ...mockImage, pixelWidth: 5000, pixelHeight: 500 }, context);
|
|
93
84
|
const sourceSet = await model.sourceSet({ width: 1000, maxDpr: 2 });
|
|
94
85
|
expect(sourceSet.length).toEqual(2);
|
|
95
86
|
expect(sourceSet[0]?.dpr).toEqual(1);
|
|
@@ -107,25 +98,6 @@ describe('Image', () => {
|
|
|
107
98
|
};
|
|
108
99
|
const model = new Image_1.CAPIImage(invalidImage, context);
|
|
109
100
|
await expect(model.sourceSet({ width: 1000, maxDpr: 2 })).rejects.toThrow('not-a-uuid is not a valid Content API Image ID');
|
|
110
|
-
expect(getImageMetadata).not.toHaveBeenCalled();
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
describe('When the image service fails to return metadata', () => {
|
|
114
|
-
let sourceSet;
|
|
115
|
-
beforeEach(async () => {
|
|
116
|
-
getImageMetadata.mockRejectedValue(null);
|
|
117
|
-
const model = new Image_1.CAPIImage(mockImage, context);
|
|
118
|
-
sourceSet = await model.sourceSet({ width: 3000 });
|
|
119
|
-
});
|
|
120
|
-
it('passes the requested width to the image service', async () => {
|
|
121
|
-
expect(sourceSet.length).toEqual(1);
|
|
122
|
-
expect(sourceSet[0]?.width).toEqual(3000);
|
|
123
|
-
expect(sourceSet[0]?.url).toMatch(/width=3000/);
|
|
124
|
-
});
|
|
125
|
-
it('falls back to a single DPR source', async () => {
|
|
126
|
-
expect(sourceSet.length).toEqual(1);
|
|
127
|
-
expect(sourceSet[0]?.dpr).toEqual(1);
|
|
128
|
-
expect(sourceSet[0]?.url).toMatch(/dpr=1/);
|
|
129
101
|
});
|
|
130
102
|
});
|
|
131
103
|
});
|
|
@@ -173,16 +145,14 @@ describe('Image', () => {
|
|
|
173
145
|
});
|
|
174
146
|
});
|
|
175
147
|
describe('width/height', () => {
|
|
176
|
-
it('returns the original width and height from
|
|
177
|
-
getImageMetadata.mockResolvedValue({ width: 100, height: 200 });
|
|
148
|
+
it('returns the original width and height from capi data', async () => {
|
|
178
149
|
const model = new Image_1.CAPIImage(mockImage, context);
|
|
179
150
|
const { width, height } = (await model.dimensions()) || {};
|
|
180
|
-
expect(width).toEqual(
|
|
181
|
-
expect(height).toEqual(
|
|
151
|
+
expect(width).toEqual(5000);
|
|
152
|
+
expect(height).toEqual(1000);
|
|
182
153
|
});
|
|
183
|
-
it('returns null if
|
|
184
|
-
|
|
185
|
-
const model = new Image_1.CAPIImage(mockImage, context);
|
|
154
|
+
it('returns null if no width and height in capi data', async () => {
|
|
155
|
+
const model = new Image_1.CAPIImage({ ...mockImage, pixelHeight: undefined, pixelWidth: undefined }, context);
|
|
186
156
|
const dimensions = await model.dimensions();
|
|
187
157
|
expect(dimensions).toEqual(null);
|
|
188
158
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Image.test.js","sourceRoot":"","sources":["../../src/model/Image.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Image.test.js","sourceRoot":"","sources":["../../src/model/Image.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@ import { CapiResponse } from '../model/CapiResponse'
|
|
|
6
6
|
import { ContentTypeSchemas } from '../model/schemas/capi/internal-content'
|
|
7
7
|
|
|
8
8
|
const logger = new Logger()
|
|
9
|
-
const metrics = { count: jest.fn() }
|
|
9
|
+
const metrics = { count: jest.fn(), aggregate: jest.fn() }
|
|
10
10
|
|
|
11
11
|
const cache = {
|
|
12
12
|
get: jest.fn(),
|
|
@@ -73,14 +73,10 @@ export class InstrumentedRESTDataSource
|
|
|
73
73
|
async throwIfResponseIsError() {}
|
|
74
74
|
|
|
75
75
|
logResponseMetrics(status: number, duration: bigint): void {
|
|
76
|
-
this.context.metrics?.
|
|
77
|
-
`graphql.datasource.${this.constructor.name}.response.${status}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
this.context.metrics?.count(
|
|
82
|
-
`graphql.datasource.${this.constructor.name}.response.${status}.time`,
|
|
83
|
-
Number(duration)
|
|
76
|
+
this.context.metrics?.aggregate(
|
|
77
|
+
`graphql.datasource.${this.constructor.name}.response.${status}`,
|
|
78
|
+
Number(duration),
|
|
79
|
+
'time'
|
|
84
80
|
)
|
|
85
81
|
}
|
|
86
82
|
|
package/src/index.ts
CHANGED
|
@@ -8,7 +8,8 @@ import { readFileSync } from 'fs'
|
|
|
8
8
|
import { AnyNode } from './resolvers/content-tree/Workarounds'
|
|
9
9
|
|
|
10
10
|
interface Metrics {
|
|
11
|
-
count(metric: string | string[], count?: number):
|
|
11
|
+
count(metric: string | string[], count?: number): number
|
|
12
|
+
aggregate(metric: string | string[], value: number, totalKey?: string): number
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
export type BodyXMLToTreeError = {
|
package/src/model/Image.test.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { CAPIImage } from './Image'
|
|
2
|
-
import
|
|
2
|
+
import logger from '@dotcom-reliability-kit/logger'
|
|
3
3
|
import type { QueryContext } from '..'
|
|
4
4
|
import { Image } from './schemas/capi/internal-content'
|
|
5
|
-
import { OrigamiImageDataSource } from '../datasources/origami-image'
|
|
6
5
|
import { MAX_IMAGE_WIDTH } from '../helpers/imageService'
|
|
7
|
-
import type { ImageSource } from '../generated'
|
|
8
6
|
|
|
9
7
|
describe('Image', () => {
|
|
10
8
|
const mockImage = {
|
|
@@ -13,6 +11,8 @@ describe('Image', () => {
|
|
|
13
11
|
title: 'title',
|
|
14
12
|
description: 'description',
|
|
15
13
|
binaryUrl: 'cloudfront.com/image',
|
|
14
|
+
pixelWidth: 5000,
|
|
15
|
+
pixelHeight: 1000,
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
const graphic = {
|
|
@@ -20,34 +20,17 @@ describe('Image', () => {
|
|
|
20
20
|
type: 'http://www.ft.com/ontology/content/Graphic' as const,
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
const getImageMetadata = jest.fn<OrigamiImageDataSource['getImageMetadata']>()
|
|
24
|
-
|
|
25
23
|
const context = {
|
|
26
|
-
|
|
27
|
-
origami: {
|
|
28
|
-
getImageMetadata,
|
|
29
|
-
},
|
|
30
|
-
capi: {},
|
|
31
|
-
vanityUrls: {},
|
|
32
|
-
},
|
|
24
|
+
logger,
|
|
33
25
|
systemCode: 'image-test',
|
|
34
26
|
} as unknown as QueryContext
|
|
35
27
|
|
|
36
|
-
beforeEach(() => {
|
|
37
|
-
getImageMetadata.mockReset()
|
|
38
|
-
})
|
|
39
|
-
|
|
40
28
|
describe('sourceSet', () => {
|
|
41
29
|
describe('An image that is provided with a high resolution', () => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
beforeAll(async () => {
|
|
45
|
-
getImageMetadata.mockResolvedValue({ width: 5000, height: 1000 })
|
|
30
|
+
it('transforms the URL to use the Origami Image Service', async () => {
|
|
46
31
|
const model = new CAPIImage(mockImage, context)
|
|
47
|
-
sourceSet = await model.sourceSet({ width: 1000 })
|
|
48
|
-
})
|
|
32
|
+
const sourceSet = await model.sourceSet({ width: 1000 })
|
|
49
33
|
|
|
50
|
-
it('transforms the URL to use the Origami Image Service', () => {
|
|
51
34
|
expect(
|
|
52
35
|
sourceSet.every((source) =>
|
|
53
36
|
source.url.startsWith(
|
|
@@ -57,7 +40,10 @@ describe('Image', () => {
|
|
|
57
40
|
).toBeTruthy()
|
|
58
41
|
})
|
|
59
42
|
|
|
60
|
-
it('resizes the image to the requested width', () => {
|
|
43
|
+
it('resizes the image to the requested width', async () => {
|
|
44
|
+
const model = new CAPIImage(mockImage, context)
|
|
45
|
+
const sourceSet = await model.sourceSet({ width: 1000 })
|
|
46
|
+
|
|
61
47
|
expect(
|
|
62
48
|
sourceSet.every(
|
|
63
49
|
(source) =>
|
|
@@ -66,7 +52,9 @@ describe('Image', () => {
|
|
|
66
52
|
).toBeTruthy()
|
|
67
53
|
})
|
|
68
54
|
|
|
69
|
-
it('includes sourceSet for all the possible resolutions we can display the image at, given the requested width and the original source width', () => {
|
|
55
|
+
it('includes sourceSet for all the possible resolutions we can display the image at, given the requested width and the original source width', async () => {
|
|
56
|
+
const model = new CAPIImage(mockImage, context)
|
|
57
|
+
const sourceSet = await model.sourceSet({ width: 1000 })
|
|
70
58
|
expect(sourceSet.length).toEqual(5)
|
|
71
59
|
expect(sourceSet[0]?.dpr).toEqual(1)
|
|
72
60
|
expect(sourceSet[0]?.url).toMatch(/dpr=1/)
|
|
@@ -77,8 +65,10 @@ describe('Image', () => {
|
|
|
77
65
|
|
|
78
66
|
describe("An image that that isn't wide enough to generate high-resolution sourceSet for", () => {
|
|
79
67
|
it('returns an array with a single resolution iamge service UR', async () => {
|
|
80
|
-
|
|
81
|
-
|
|
68
|
+
const model = new CAPIImage(
|
|
69
|
+
{ ...mockImage, pixelWidth: 1500, pixelHeight: 500 },
|
|
70
|
+
context
|
|
71
|
+
)
|
|
82
72
|
const sourceSet = await model.sourceSet({ width: 1000 })
|
|
83
73
|
expect(sourceSet.length).toEqual(1)
|
|
84
74
|
expect(sourceSet[0]).toEqual({
|
|
@@ -91,8 +81,10 @@ describe('Image', () => {
|
|
|
91
81
|
|
|
92
82
|
describe('An image that that is smaller than the width that was requested', () => {
|
|
93
83
|
it('returns the image at the same width as the original', async () => {
|
|
94
|
-
|
|
95
|
-
|
|
84
|
+
const model = new CAPIImage(
|
|
85
|
+
{ ...mockImage, pixelWidth: 500, pixelHeight: 500 },
|
|
86
|
+
context
|
|
87
|
+
)
|
|
96
88
|
const sourceSet = await model.sourceSet({ width: 1000 })
|
|
97
89
|
expect(sourceSet.length).toEqual(1)
|
|
98
90
|
expect(sourceSet[0]).toEqual({
|
|
@@ -105,8 +97,10 @@ describe('Image', () => {
|
|
|
105
97
|
|
|
106
98
|
describe('An image that that is bigger than the maximum width that was requested', () => {
|
|
107
99
|
it('returns the image at the same width as the maximum width', async () => {
|
|
108
|
-
|
|
109
|
-
|
|
100
|
+
const model = new CAPIImage(
|
|
101
|
+
{ ...mockImage, pixelWidth: 4000, pixelHeight: 4000 },
|
|
102
|
+
context
|
|
103
|
+
)
|
|
110
104
|
const sourceSet = await model.sourceSet({ width: MAX_IMAGE_WIDTH })
|
|
111
105
|
expect(sourceSet.length).toEqual(1)
|
|
112
106
|
expect(sourceSet[0]?.width).toEqual(MAX_IMAGE_WIDTH)
|
|
@@ -115,8 +109,10 @@ describe('Image', () => {
|
|
|
115
109
|
|
|
116
110
|
describe('A large image with the maxDpr argumet passed', () => {
|
|
117
111
|
it('only returns sourceSet up to and including the maxDpr', async () => {
|
|
118
|
-
|
|
119
|
-
|
|
112
|
+
const model = new CAPIImage(
|
|
113
|
+
{ ...mockImage, pixelWidth: 5000, pixelHeight: 500 },
|
|
114
|
+
context
|
|
115
|
+
)
|
|
120
116
|
const sourceSet = await model.sourceSet({ width: 1000, maxDpr: 2 })
|
|
121
117
|
expect(sourceSet.length).toEqual(2)
|
|
122
118
|
expect(sourceSet[0]?.dpr).toEqual(1)
|
|
@@ -137,26 +133,6 @@ describe('Image', () => {
|
|
|
137
133
|
await expect(
|
|
138
134
|
model.sourceSet({ width: 1000, maxDpr: 2 })
|
|
139
135
|
).rejects.toThrow('not-a-uuid is not a valid Content API Image ID')
|
|
140
|
-
expect(getImageMetadata).not.toHaveBeenCalled()
|
|
141
|
-
})
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
describe('When the image service fails to return metadata', () => {
|
|
145
|
-
let sourceSet: ImageSource[]
|
|
146
|
-
beforeEach(async () => {
|
|
147
|
-
getImageMetadata.mockRejectedValue(null)
|
|
148
|
-
const model = new CAPIImage(mockImage, context)
|
|
149
|
-
sourceSet = await model.sourceSet({ width: 3000 })
|
|
150
|
-
})
|
|
151
|
-
it('passes the requested width to the image service', async () => {
|
|
152
|
-
expect(sourceSet.length).toEqual(1)
|
|
153
|
-
expect(sourceSet[0]?.width).toEqual(3000)
|
|
154
|
-
expect(sourceSet[0]?.url).toMatch(/width=3000/)
|
|
155
|
-
})
|
|
156
|
-
it('falls back to a single DPR source', async () => {
|
|
157
|
-
expect(sourceSet.length).toEqual(1)
|
|
158
|
-
expect(sourceSet[0]?.dpr).toEqual(1)
|
|
159
|
-
expect(sourceSet[0]?.url).toMatch(/dpr=1/)
|
|
160
136
|
})
|
|
161
137
|
})
|
|
162
138
|
})
|
|
@@ -235,17 +211,18 @@ describe('Image', () => {
|
|
|
235
211
|
})
|
|
236
212
|
|
|
237
213
|
describe('width/height', () => {
|
|
238
|
-
it('returns the original width and height from
|
|
239
|
-
getImageMetadata.mockResolvedValue({ width: 100, height: 200 })
|
|
214
|
+
it('returns the original width and height from capi data', async () => {
|
|
240
215
|
const model = new CAPIImage(mockImage, context)
|
|
241
216
|
const { width, height } = (await model.dimensions()) || {}
|
|
242
|
-
expect(width).toEqual(
|
|
243
|
-
expect(height).toEqual(
|
|
217
|
+
expect(width).toEqual(5000)
|
|
218
|
+
expect(height).toEqual(1000)
|
|
244
219
|
})
|
|
245
220
|
|
|
246
|
-
it('returns null if
|
|
247
|
-
|
|
248
|
-
|
|
221
|
+
it('returns null if no width and height in capi data', async () => {
|
|
222
|
+
const model = new CAPIImage(
|
|
223
|
+
{ ...mockImage, pixelHeight: undefined, pixelWidth: undefined },
|
|
224
|
+
context
|
|
225
|
+
)
|
|
249
226
|
const dimensions = await model.dimensions()
|
|
250
227
|
expect(dimensions).toEqual(null)
|
|
251
228
|
})
|