@financial-times/cp-content-pipeline-schema 2.3.0 → 2.3.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 +7 -0
- package/lib/model/Concept.test.js +0 -9
- package/lib/model/Concept.test.js.map +1 -1
- package/lib/model/RichText.d.ts +1 -1
- package/lib/model/RichText.js +20 -34
- package/lib/model/RichText.js.map +1 -1
- package/lib/model/RichText.test.js +0 -9
- package/lib/model/RichText.test.js.map +1 -1
- package/lib/resolvers/content-tree/bodyXMLToTree.d.ts +4 -3
- package/lib/resolvers/content-tree/bodyXMLToTree.js +2 -2
- package/lib/resolvers/content-tree/bodyXMLToTree.js.map +1 -1
- package/lib/resolvers/content-tree/bodyXMLToTree.test.js +20 -32
- package/lib/resolvers/content-tree/bodyXMLToTree.test.js.map +1 -1
- package/lib/resolvers/content-tree/nodePredicates.d.ts +6 -13
- package/lib/resolvers/content-tree/nodePredicates.js +33 -33
- package/lib/resolvers/content-tree/nodePredicates.js.map +1 -1
- package/lib/resolvers/content-tree/references/Reference.d.ts +1 -1
- package/lib/resolvers/content-tree/tagMappings.d.ts +2 -1
- package/lib/resolvers/content-tree/tagMappings.js +60 -60
- package/lib/resolvers/content-tree/tagMappings.js.map +1 -1
- package/package.json +1 -2
- package/src/model/Concept.test.ts +0 -9
- package/src/model/RichText.test.ts +0 -10
- package/src/model/RichText.ts +27 -39
- package/src/resolvers/content-tree/bodyXMLToTree.test.ts +22 -32
- package/src/resolvers/content-tree/bodyXMLToTree.ts +11 -6
- package/src/resolvers/content-tree/nodePredicates.ts +39 -45
- package/src/resolvers/content-tree/tagMappings.ts +102 -60
- package/tsconfig.tsbuildinfo +1 -1
- package/__mocks__/worker_threads.ts +0 -3
- package/lib/resolvers/content-tree/bodyXMLToTreeWorker.d.ts +0 -9
- package/lib/resolvers/content-tree/bodyXMLToTreeWorker.js +0 -18
- package/lib/resolvers/content-tree/bodyXMLToTreeWorker.js.map +0 -1
- package/src/resolvers/content-tree/bodyXMLToTreeWorker.ts +0 -31
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.3.1](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v2.3.0...cp-content-pipeline-schema-v2.3.1) (2024-03-18)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* revert "CPP-1964 Process CAPI's XML on worker threads" ([e7ac056](https://github.com/Financial-Times/cp-content-pipeline/commit/e7ac05629bd25d033ded87133d0a04c2c9b8f4fd))
|
|
9
|
+
|
|
3
10
|
## [2.3.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v2.2.2...cp-content-pipeline-schema-v2.3.0) (2024-03-18)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -4,15 +4,6 @@ const Concept_1 = require("./Concept");
|
|
|
4
4
|
const globals_1 = require("@jest/globals");
|
|
5
5
|
const capiPerson_1 = require("../fixtures/capiPerson");
|
|
6
6
|
const logger_1 = require("@dotcom-reliability-kit/logger");
|
|
7
|
-
globals_1.jest.mock('@dotcom-reliability-kit/logger', () => ({
|
|
8
|
-
Logger: globals_1.jest.fn(() => ({
|
|
9
|
-
debug: globals_1.jest.fn(),
|
|
10
|
-
error: globals_1.jest.fn(),
|
|
11
|
-
fatal: globals_1.jest.fn(),
|
|
12
|
-
info: globals_1.jest.fn(),
|
|
13
|
-
warn: globals_1.jest.fn(),
|
|
14
|
-
})),
|
|
15
|
-
}));
|
|
16
7
|
const vanityMock = globals_1.jest.fn();
|
|
17
8
|
const getPersonMock = globals_1.jest.fn();
|
|
18
9
|
const context = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Concept.test.js","sourceRoot":"","sources":["../../src/model/Concept.test.ts"],"names":[],"mappings":";;AAAA,uCAAmC;AACnC,2CAAoC;AAEpC,uDAAmD;AAGnD,2DAAuD;AAEvD,
|
|
1
|
+
{"version":3,"file":"Concept.test.js","sourceRoot":"","sources":["../../src/model/Concept.test.ts"],"names":[],"mappings":"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"}
|
package/lib/model/RichText.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { QueryContext } from '..';
|
|
2
1
|
import { LiteralUnionScalarValues } from '../resolvers/literal-union';
|
|
3
2
|
import { RichTextSource } from '../resolvers/scalars';
|
|
4
3
|
import { CapiResponse } from './CapiResponse';
|
|
5
4
|
import { ContentTree } from '@financial-times/content-tree';
|
|
5
|
+
import { QueryContext } from '..';
|
|
6
6
|
export declare class RichText {
|
|
7
7
|
private source;
|
|
8
8
|
private value;
|
package/lib/model/RichText.js
CHANGED
|
@@ -4,21 +4,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.RichText = void 0;
|
|
7
|
-
const
|
|
8
|
-
const bodyXMLToTreeWorker_1 = __importDefault(require("../resolvers/content-tree/bodyXMLToTreeWorker"));
|
|
7
|
+
const bodyXMLToTree_1 = __importDefault(require("../resolvers/content-tree/bodyXMLToTree"));
|
|
9
8
|
const extractText_1 = __importDefault(require("../resolvers/content-tree/extractText"));
|
|
10
9
|
const updateTreeWithReferenceIds_1 = __importDefault(require("../resolvers/content-tree/updateTreeWithReferenceIds"));
|
|
11
|
-
const
|
|
12
|
-
let piscina;
|
|
13
|
-
// Don't run the thread pool during tests as it creates loads of threads that
|
|
14
|
-
// aren't properly closed and leaves the process hanging. We do our best to
|
|
15
|
-
// keep the same behaviour when running on the main thread vs a worker thread,
|
|
16
|
-
// with the main difference being the lack of logs on the main thread.
|
|
17
|
-
if (process.env.NODE_ENV !== 'test') {
|
|
18
|
-
piscina = new piscina_1.default({
|
|
19
|
-
filename: require.resolve('../resolvers/content-tree/bodyXMLToTreeWorker'),
|
|
20
|
-
});
|
|
21
|
-
}
|
|
10
|
+
const tagMappings_1 = require("../resolvers/content-tree/tagMappings");
|
|
22
11
|
class RichText {
|
|
23
12
|
constructor(source, value, contentApiData) {
|
|
24
13
|
this.source = source;
|
|
@@ -29,29 +18,26 @@ class RichText {
|
|
|
29
18
|
return this.value;
|
|
30
19
|
}
|
|
31
20
|
async structured(context) {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
21
|
+
const tree = await new Promise((resolve, reject) => {
|
|
22
|
+
// bodyXMLToTree is synchronous and slow. scheduling it in a setImmediate
|
|
23
|
+
// prevents it from blocking the event loop, so the app can still handle
|
|
24
|
+
// requests, and it won't skew resolver timing metrics by blocking the
|
|
25
|
+
// timers for quicker, asynchronous resolvers from finishing.
|
|
26
|
+
const tagMappings = this.contentApiData?.type() === 'LiveBlogPost'
|
|
27
|
+
? { ...tagMappings_1.commonTagMappings, ...tagMappings_1.liveBlogPostTagMappings }
|
|
28
|
+
: {
|
|
29
|
+
...tagMappings_1.commonTagMappings,
|
|
30
|
+
...(0, tagMappings_1.articleTagMappings)(this.contentApiData),
|
|
31
|
+
};
|
|
32
|
+
setImmediate(() => {
|
|
33
|
+
try {
|
|
34
|
+
resolve((0, bodyXMLToTree_1.default)(this.value ?? '', tagMappings, context));
|
|
38
35
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const { stack } = error;
|
|
44
|
-
const opError = new errors_1.OperationalError(predError);
|
|
45
|
-
opError.stack = stack;
|
|
46
|
-
context?.logger.error({ event, error: opError });
|
|
36
|
+
catch (error) {
|
|
37
|
+
reject(error);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
47
40
|
});
|
|
48
|
-
// bodyXMLToTree is synchronous and slow. Offload its processing to a
|
|
49
|
-
// worker thread so that it does not block the event loop. This allows the
|
|
50
|
-
// app to continue to handle other requests whilst processing an expensive
|
|
51
|
-
// one, as well as not skewing timing metrics.
|
|
52
|
-
const tree = piscina
|
|
53
|
-
? await piscina.run(args)
|
|
54
|
-
: (0, bodyXMLToTreeWorker_1.default)(args);
|
|
55
41
|
const { tree: treeWithReferences, references } = (0, updateTreeWithReferenceIds_1.default)(tree, this.contentApiData);
|
|
56
42
|
const text = (0, extractText_1.default)(tree);
|
|
57
43
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichText.js","sourceRoot":"","sources":["../../src/model/RichText.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"RichText.js","sourceRoot":"","sources":["../../src/model/RichText.ts"],"names":[],"mappings":";;;;;;AAAA,4FAAmE;AACnE,wFAA+D;AAC/D,sHAA6F;AAI7F,uEAI8C;AAI9C,MAAa,QAAQ;IACnB,YACU,MAAuD,EACvD,KAAoB,EACpB,cAA6B;QAF7B,WAAM,GAAN,MAAM,CAAiD;QACvD,UAAK,GAAL,KAAK,CAAe;QACpB,mBAAc,GAAd,cAAc,CAAe;IACpC,CAAC;IAEJ,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAsB;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnE,yEAAyE;YACzE,wEAAwE;YACxE,sEAAsE;YACtE,6DAA6D;YAE7D,MAAM,WAAW,GACf,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,cAAc;gBAC5C,CAAC,CAAC,EAAE,GAAG,+BAAiB,EAAE,GAAG,qCAAuB,EAAE;gBACtD,CAAC,CAAC;oBACE,GAAG,+BAAiB;oBACpB,GAAG,IAAA,gCAAkB,EAAC,IAAI,CAAC,cAAc,CAAC;iBAC3C,CAAA;YACP,YAAY,CAAC,GAAG,EAAE;gBAChB,IAAI;oBACF,OAAO,CAAC,IAAA,uBAAa,EAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;iBAC/D;gBAAC,OAAO,KAAK,EAAE;oBACd,MAAM,CAAC,KAAK,CAAC,CAAA;iBACd;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,GAAG,IAAA,oCAA0B,EACzE,IAAI,EACJ,IAAI,CAAC,cAAc,CACpB,CAAA;QACD,MAAM,IAAI,GAAG,IAAA,qBAAW,EAAC,IAAI,CAAC,CAAA;QAE9B,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,IAAI;YACJ,UAAU;SACX,CAAA;IACH,CAAC;CACF;AA9CD,4BA8CC"}
|
|
@@ -2,15 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const capiObject_1 = require("../fixtures/capiObject");
|
|
4
4
|
const RichText_1 = require("../model/RichText");
|
|
5
|
-
jest.mock('@dotcom-reliability-kit/logger', () => ({
|
|
6
|
-
Logger: jest.fn(() => ({
|
|
7
|
-
debug: jest.fn(),
|
|
8
|
-
error: jest.fn(),
|
|
9
|
-
fatal: jest.fn(),
|
|
10
|
-
info: jest.fn(),
|
|
11
|
-
warn: jest.fn(),
|
|
12
|
-
})),
|
|
13
|
-
}));
|
|
14
5
|
describe('RichText resolver', () => {
|
|
15
6
|
it('should transform bodyXML to an AST', async () => {
|
|
16
7
|
const model = new RichText_1.RichText('bodyXML', capiObject_1.baseCapiObject.bodyXML);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichText.test.js","sourceRoot":"","sources":["../../src/model/RichText.test.ts"],"names":[],"mappings":";;AAAA,uDAAuD;AACvD,gDAA4C;AAE5C,
|
|
1
|
+
{"version":3,"file":"RichText.test.js","sourceRoot":"","sources":["../../src/model/RichText.test.ts"],"names":[],"mappings":";;AAAA,uDAAuD;AACvD,gDAA4C;AAE5C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,KAAK,GAAG,IAAI,mBAAQ,CAAC,SAAS,EAAE,2BAAc,CAAC,OAAO,CAAC,CAAA;QAC7D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;QAEvC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,mBAAQ,CACxB,YAAY,EACZ,4HAA4H,CAC7H,CAAA;QACD,MAAM,CAAC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;KAetD,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,KAAK,GAAG,IAAI,mBAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC9C,MAAM,CAAC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;KAUtD,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,OAAO,GAAG;;;;;gBAKN,CAAA;YAEV,MAAM,KAAK,GAAG,IAAI,mBAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC9C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;YAEvC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YACjE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,iFAAiF;YACjF,MAAM,OAAO,GAAG;;;;;;cAMR,CAAA;YAER,MAAM,KAAK,GAAG,IAAI,mBAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC9C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;YAEvC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YACjE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { ContentTree } from '@financial-times/content-tree';
|
|
2
1
|
import * as cheerio from 'cheerio';
|
|
2
|
+
import type { ContentTree } from '@financial-times/content-tree';
|
|
3
3
|
import { AnyNode } from './Workarounds';
|
|
4
|
-
|
|
4
|
+
import { QueryContext } from '../..';
|
|
5
|
+
type ContentTreeTransform = ($el: cheerio.Cheerio<any>, traverse: () => AnyNode[], context?: QueryContext) => AnyNode | AnyNode[];
|
|
5
6
|
export type TagMappings = Record<string, ContentTreeTransform>;
|
|
6
|
-
export default function bodyXMLToTree(xml: string, tagMappings: TagMappings): ContentTree.Body;
|
|
7
|
+
export default function bodyXMLToTree(xml: string, tagMappings: TagMappings, context?: QueryContext): ContentTree.Body;
|
|
7
8
|
export {};
|
|
@@ -32,7 +32,7 @@ function isNode(node) {
|
|
|
32
32
|
Function that converts an XML string to a Body node from
|
|
33
33
|
the Content Tree spec - https://github.com/Financial-Times/content-tree#Body
|
|
34
34
|
*/
|
|
35
|
-
function bodyXMLToTree(xml, tagMappings) {
|
|
35
|
+
function bodyXMLToTree(xml, tagMappings, context) {
|
|
36
36
|
const $ = cheerio.load(xml);
|
|
37
37
|
const flattenAndTraverseChildren = (children) => children.flatMap(traverse);
|
|
38
38
|
function traverse(node) {
|
|
@@ -46,7 +46,7 @@ function bodyXMLToTree(xml, tagMappings) {
|
|
|
46
46
|
const matchedSelector = Object.keys(tagMappings).find((selector) => node.name === selector || $(node).is(selector));
|
|
47
47
|
if (matchedSelector) {
|
|
48
48
|
const contentTreeTransform = tagMappings[matchedSelector];
|
|
49
|
-
return contentTreeTransform($(node), () => flattenAndTraverseChildren(node.children));
|
|
49
|
+
return contentTreeTransform($(node), () => flattenAndTraverseChildren(node.children), context);
|
|
50
50
|
}
|
|
51
51
|
return flattenAndTraverseChildren(node.children);
|
|
52
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bodyXMLToTree.js","sourceRoot":"","sources":["../../../src/resolvers/content-tree/bodyXMLToTree.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"bodyXMLToTree.js","sourceRoot":"","sources":["../../../src/resolvers/content-tree/bodyXMLToTree.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAkC;AAKlC,2CAA0C;AAE1C,SAAS,MAAM,CAAC,IAAkC;IAChD,OAAO,OAAO,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAA;AACxC,CAAC;AAUD;;;EAGE;AACF,SAAwB,aAAa,CACnC,GAAW,EACX,WAAwB,EACxB,OAAsB;IAEtB,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE3B,MAAM,0BAA0B,GAAG,CAAC,QAAwB,EAAa,EAAE,CACzE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE5B,SAAS,QAAQ,CAAC,IAAkB;QAClC,IAAI,IAAA,mBAAM,EAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;YAC7B,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,IAAI,CAAC,IAAI;aACjB,CAAA;SACF;aAAM,IAAI,IAAA,kBAAK,EAAC,IAAI,CAAC,EAAE;YACtB,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CACnD,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAC7D,CAAA;YAED,IAAI,eAAe,EAAE;gBACnB,MAAM,oBAAoB,GAAG,WAAW,CAAC,eAAe,CAAC,CAAA;gBACzD,OAAO,oBAAoB,CACzB,CAAC,CAAC,IAAI,CAAC,EACP,GAAG,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAC/C,OAAO,CACR,CAAA;aACF;YAED,OAAO,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;SACjD;QAED,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEnC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM,IAAI,KAAK,CACb,qDAAqD,IAAI,CAAC,SAAS,CACjE,IAAI,CACL,EAAE,CACJ,CAAA;KACF;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;QACxB,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;KACzE;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAnDD,gCAmDC"}
|
|
@@ -3,16 +3,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const worker_threads_1 = require("worker_threads");
|
|
7
6
|
const bodyXMLToTree_1 = __importDefault(require("./bodyXMLToTree"));
|
|
8
7
|
const tagMappings_1 = __importDefault(require("./tagMappings"));
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const
|
|
8
|
+
const logger_1 = require("@dotcom-reliability-kit/logger");
|
|
9
|
+
const mockLogger = new logger_1.Logger();
|
|
10
|
+
const mockLogError = jest.spyOn(mockLogger, 'error');
|
|
11
|
+
const mockContext = {
|
|
12
|
+
logger: mockLogger,
|
|
13
|
+
};
|
|
12
14
|
describe('bodyXMLToTree', () => {
|
|
13
15
|
it('converts XML to tree', () => {
|
|
14
16
|
const xml = `<body><p>Hello world</p></body>`;
|
|
15
|
-
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default)).toMatchInlineSnapshot(`
|
|
17
|
+
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default, mockContext)).toMatchInlineSnapshot(`
|
|
16
18
|
Object {
|
|
17
19
|
"children": Array [
|
|
18
20
|
Object {
|
|
@@ -199,11 +201,11 @@ describe('bodyXMLToTree', () => {
|
|
|
199
201
|
"version": 1,
|
|
200
202
|
}
|
|
201
203
|
`);
|
|
202
|
-
expect(
|
|
204
|
+
expect(mockLogError).not.toBeCalled();
|
|
203
205
|
});
|
|
204
206
|
it('should handle heading and slots', () => {
|
|
205
207
|
const xml = '<body><div class="n-content-layout"><h3></h3><div class="n-content-layout__slot"></div><div class="n-content-layout__slot"></div></body>';
|
|
206
|
-
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default)).toMatchInlineSnapshot(`
|
|
208
|
+
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default, mockContext)).toMatchInlineSnapshot(`
|
|
207
209
|
Object {
|
|
208
210
|
"children": Array [
|
|
209
211
|
Object {
|
|
@@ -231,11 +233,11 @@ describe('bodyXMLToTree', () => {
|
|
|
231
233
|
"version": 1,
|
|
232
234
|
}
|
|
233
235
|
`);
|
|
234
|
-
expect(
|
|
236
|
+
expect(mockLogError).not.toBeCalled();
|
|
235
237
|
});
|
|
236
238
|
it('should log an error on unexpected child after heading', () => {
|
|
237
239
|
const xml = '<body><div class="n-content-layout"><h3></h3><div class="n-content-layout__slot"></div><p></p></body>';
|
|
238
|
-
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default)).toMatchInlineSnapshot(`
|
|
240
|
+
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default, mockContext)).toMatchInlineSnapshot(`
|
|
239
241
|
Object {
|
|
240
242
|
"children": Array [
|
|
241
243
|
Object {
|
|
@@ -263,26 +265,19 @@ describe('bodyXMLToTree', () => {
|
|
|
263
265
|
"version": 1,
|
|
264
266
|
}
|
|
265
267
|
`);
|
|
266
|
-
expect(
|
|
267
|
-
expect(
|
|
268
|
+
expect(mockLogError).toBeCalled();
|
|
269
|
+
expect(mockLogError.mock.lastCall).toMatchInlineSnapshot(`
|
|
268
270
|
Array [
|
|
269
271
|
Object {
|
|
270
|
-
"
|
|
271
|
-
"layout-slot",
|
|
272
|
-
"paragraph",
|
|
273
|
-
],
|
|
274
|
-
"code": "BODY_XML_UNEXPECTED_STRUCTURE",
|
|
275
|
-
"error": [Error],
|
|
272
|
+
"error": [OperationalError: Unexpected children types for layout],
|
|
276
273
|
"event": "RECOVERABLE_ERROR",
|
|
277
|
-
"expected": "layout-slot",
|
|
278
|
-
"message": "Unexpected children types for layout",
|
|
279
274
|
},
|
|
280
275
|
]
|
|
281
276
|
`);
|
|
282
277
|
});
|
|
283
278
|
it('should log an error on unexpected child after slots', () => {
|
|
284
279
|
const xml = '<body><div class="n-content-layout"><div class="n-content-layout__slot"></div><p></p></body>';
|
|
285
|
-
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default)).toMatchInlineSnapshot(`
|
|
280
|
+
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default, mockContext)).toMatchInlineSnapshot(`
|
|
286
281
|
Object {
|
|
287
282
|
"children": Array [
|
|
288
283
|
Object {
|
|
@@ -305,19 +300,12 @@ describe('bodyXMLToTree', () => {
|
|
|
305
300
|
"version": 1,
|
|
306
301
|
}
|
|
307
302
|
`);
|
|
308
|
-
expect(
|
|
309
|
-
expect(
|
|
303
|
+
expect(mockLogError).toBeCalled();
|
|
304
|
+
expect(mockLogError.mock.lastCall).toMatchInlineSnapshot(`
|
|
310
305
|
Array [
|
|
311
306
|
Object {
|
|
312
|
-
"
|
|
313
|
-
"layout-slot",
|
|
314
|
-
"paragraph",
|
|
315
|
-
],
|
|
316
|
-
"code": "BODY_XML_UNEXPECTED_STRUCTURE",
|
|
317
|
-
"error": [Error],
|
|
307
|
+
"error": [OperationalError: Unexpected children types for layout],
|
|
318
308
|
"event": "RECOVERABLE_ERROR",
|
|
319
|
-
"expected": "layout-slot",
|
|
320
|
-
"message": "Unexpected children types for layout",
|
|
321
309
|
},
|
|
322
310
|
]
|
|
323
311
|
`);
|
|
@@ -326,7 +314,7 @@ describe('bodyXMLToTree', () => {
|
|
|
326
314
|
describe('tables', () => {
|
|
327
315
|
it('parses tables', () => {
|
|
328
316
|
const xml = '<table class="data-table" data-table-collapse-rownum="" data-table-layout-largescreen="auto" data-table-layout-smallscreen="auto" data-table-theme="auto"><caption>Nulla iaculis tempus augue</caption><thead><tr><th data-column-hidden="none" data-column-sortable="false" data-column-type="string">libero mollis</th><th data-column-hidden="none" data-column-sortable="false" data-column-type="string">pretium nunc</th><th data-column-hidden="none" data-column-sortable="false" data-column-type="string">euismod nunc</th></tr></thead><tbody><tr><td>Aenean </td><td>14134</td><td>dfdsfd</td></tr><tr><td>lobortis </td><td>3434</td><td>fdsf dsf </td></tr><tr><td>volutpat </td><td>234234</td><td>sd fsd</td></tr><tr><td>vitae </td><td>2423</td><td>s fsdf</td></tr><tr><td>elementumus</td><td>23423</td><td>f sdf</td></tr></tbody><tfoot><tr><td colspan="1000">Aenean sodales sapien</td></tr></tfoot></table>';
|
|
329
|
-
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default)).toMatchInlineSnapshot(`
|
|
317
|
+
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default, mockContext)).toMatchInlineSnapshot(`
|
|
330
318
|
Object {
|
|
331
319
|
"children": Array [
|
|
332
320
|
Object {
|
|
@@ -582,7 +570,7 @@ describe('bodyXMLToTree', () => {
|
|
|
582
570
|
});
|
|
583
571
|
it('parses single cell tables as infoboxes', () => {
|
|
584
572
|
const xml = '<table class="data-table" id="U1140244733565W0C"><caption>Emerging markets outlook for 2017</caption><tbody><tr><td colspan="2"><p>Brazil</p><p>Brazilian shares were the best-performing asset globally over the 12 months to the end of January, returning 121 per cent, according to data from BofA Merrill Lynch. Brazilian stocks did very well through January, but investors including Lazard and Eastspring have scaled back their exposure after strong growth last year.</p></td></tr></tbody></table>';
|
|
585
|
-
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default)).toMatchInlineSnapshot(`
|
|
573
|
+
expect((0, bodyXMLToTree_1.default)(xml, tagMappings_1.default, mockContext)).toMatchInlineSnapshot(`
|
|
586
574
|
Object {
|
|
587
575
|
"children": Array [
|
|
588
576
|
Object {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bodyXMLToTree.test.js","sourceRoot":"","sources":["../../../src/resolvers/content-tree/bodyXMLToTree.test.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"bodyXMLToTree.test.js","sourceRoot":"","sources":["../../../src/resolvers/content-tree/bodyXMLToTree.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { AnyNode } from './Workarounds';
|
|
2
|
+
import { QueryContext } from '../..';
|
|
2
3
|
type ValuesOfTuple<Tuple extends readonly string[]> = Tuple[number];
|
|
3
4
|
type NodeOfType<Type extends AnyNode['type']> = Extract<AnyNode, {
|
|
4
5
|
type: Type;
|
|
@@ -7,17 +8,9 @@ type NodesOfTypes<Types extends readonly AnyNode['type'][]> = {
|
|
|
7
8
|
-readonly [key in keyof Types]: NodeOfType<Types[key]>;
|
|
8
9
|
};
|
|
9
10
|
export declare const phrasingTypes: readonly ["text", "break", "strong", "emphasis", "strikethrough", "link"];
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
message: string;
|
|
14
|
-
expected: AnyNode['type'] | readonly AnyNode['type'][];
|
|
15
|
-
actual: AnyNode['type'][];
|
|
16
|
-
error: Error;
|
|
17
|
-
}
|
|
18
|
-
export declare const findChildOftype: <NodeType extends AnyNode>(type: NodeType["type"], nodes: AnyNode[], parentType: AnyNode['type']) => NodeType | undefined;
|
|
19
|
-
export declare const everyChildIsType: <NodeType extends AnyNode>(type: NodeType["type"], nodes: AnyNode[], parentType: AnyNode['type']) => NodeType[];
|
|
20
|
-
export declare const childrenOfTypes: <Types extends readonly ("layout" | "clip" | "text" | "author-link" | "raw-image" | "main-image" | "main-image-raw" | "video" | "youtube-video" | "clip-set" | "table-caption" | "table-body" | "table-footer" | "table" | "break" | "strong" | "emphasis" | "strikethrough" | "link" | "table-row" | "table-cell" | "image-set" | "root" | "body" | "thematic-break" | "paragraph" | "heading" | "list" | "list-item" | "blockquote" | "pullquote" | "recommended" | "tweet" | "flourish" | "big-number" | "scrolly-block" | "scrolly-section" | "scrolly-copy" | "scrolly-heading" | "scrolly-image" | "layout-slot" | "layout-image")[]>(types: Types, nodes: AnyNode[], parentType: AnyNode['type']) => NodeOfType<ValuesOfTuple<Types>>[];
|
|
11
|
+
export declare const findChildOftype: <NodeType extends AnyNode>(type: NodeType["type"], nodes: AnyNode[], parentType: AnyNode['type'], context?: QueryContext) => NodeType | undefined;
|
|
12
|
+
export declare const everyChildIsType: <NodeType extends AnyNode>(type: NodeType["type"], nodes: AnyNode[], parentType: AnyNode['type'], context?: QueryContext) => NodeType[];
|
|
13
|
+
export declare const childrenOfTypes: <Types extends readonly ("layout" | "clip" | "text" | "author-link" | "raw-image" | "main-image" | "main-image-raw" | "video" | "youtube-video" | "clip-set" | "table-caption" | "table-body" | "table-footer" | "table" | "break" | "strong" | "emphasis" | "strikethrough" | "link" | "table-row" | "table-cell" | "image-set" | "root" | "body" | "thematic-break" | "paragraph" | "heading" | "list" | "list-item" | "blockquote" | "pullquote" | "recommended" | "tweet" | "flourish" | "big-number" | "scrolly-block" | "scrolly-section" | "scrolly-copy" | "scrolly-heading" | "scrolly-image" | "layout-slot" | "layout-image")[]>(types: Types, nodes: AnyNode[], parentType: AnyNode['type'], context?: QueryContext) => NodeOfType<ValuesOfTuple<Types>>[];
|
|
21
14
|
export declare const nodesAreOrderedTypes: <Types extends readonly ("layout" | "clip" | "text" | "author-link" | "raw-image" | "main-image" | "main-image-raw" | "video" | "youtube-video" | "clip-set" | "table-caption" | "table-body" | "table-footer" | "table" | "break" | "strong" | "emphasis" | "strikethrough" | "link" | "table-row" | "table-cell" | "image-set" | "root" | "body" | "thematic-break" | "paragraph" | "heading" | "list" | "list-item" | "blockquote" | "pullquote" | "recommended" | "tweet" | "flourish" | "big-number" | "scrolly-block" | "scrolly-section" | "scrolly-copy" | "scrolly-heading" | "scrolly-image" | "layout-slot" | "layout-image")[]>(types: Types, nodes: readonly AnyNode[]) => nodes is NodesOfTypes<Types>;
|
|
22
|
-
export declare const childrenOfOrderedTypes: <Types extends readonly ("layout" | "clip" | "text" | "author-link" | "raw-image" | "main-image" | "main-image-raw" | "video" | "youtube-video" | "clip-set" | "table-caption" | "table-body" | "table-footer" | "table" | "break" | "strong" | "emphasis" | "strikethrough" | "link" | "table-row" | "table-cell" | "image-set" | "root" | "body" | "thematic-break" | "paragraph" | "heading" | "list" | "list-item" | "blockquote" | "pullquote" | "recommended" | "tweet" | "flourish" | "big-number" | "scrolly-block" | "scrolly-section" | "scrolly-copy" | "scrolly-heading" | "scrolly-image" | "layout-slot" | "layout-image")[]>(types: Types, nodes: AnyNode[], parentType: AnyNode['type']) => NodesOfTypes<Types>;
|
|
15
|
+
export declare const childrenOfOrderedTypes: <Types extends readonly ("layout" | "clip" | "text" | "author-link" | "raw-image" | "main-image" | "main-image-raw" | "video" | "youtube-video" | "clip-set" | "table-caption" | "table-body" | "table-footer" | "table" | "break" | "strong" | "emphasis" | "strikethrough" | "link" | "table-row" | "table-cell" | "image-set" | "root" | "body" | "thematic-break" | "paragraph" | "heading" | "list" | "list-item" | "blockquote" | "pullquote" | "recommended" | "tweet" | "flourish" | "big-number" | "scrolly-block" | "scrolly-section" | "scrolly-copy" | "scrolly-heading" | "scrolly-image" | "layout-slot" | "layout-image")[]>(types: Types, nodes: AnyNode[], parentType: AnyNode['type'], context?: QueryContext) => NodesOfTypes<Types>;
|
|
23
16
|
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.childrenOfOrderedTypes = exports.nodesAreOrderedTypes = exports.childrenOfTypes = exports.everyChildIsType = exports.findChildOftype = exports.phrasingTypes = void 0;
|
|
4
|
-
const
|
|
4
|
+
const errors_1 = require("@dotcom-reliability-kit/errors");
|
|
5
5
|
exports.phrasingTypes = [
|
|
6
6
|
'text',
|
|
7
7
|
'break',
|
|
@@ -10,54 +10,52 @@ exports.phrasingTypes = [
|
|
|
10
10
|
'strikethrough',
|
|
11
11
|
'link',
|
|
12
12
|
];
|
|
13
|
-
|
|
14
|
-
// access this thread directly from these worker threads. Instead let's send
|
|
15
|
-
// all our recoverable errors to the piscina pool managing us.
|
|
16
|
-
const postLoggerError = (error) => {
|
|
17
|
-
// stacks will only copy over if they're in an Error object
|
|
18
|
-
const errorWithStack = { ...error, error: new Error() };
|
|
19
|
-
worker_threads_1.parentPort?.postMessage(errorWithStack);
|
|
20
|
-
};
|
|
21
|
-
const findChildOftype = (type, nodes, parentType) => {
|
|
13
|
+
const findChildOftype = (type, nodes, parentType, context) => {
|
|
22
14
|
const predicate = (node) => node.type === type;
|
|
23
15
|
const child = nodes.find(predicate);
|
|
24
16
|
if (!child) {
|
|
25
|
-
|
|
17
|
+
context?.logger.error({
|
|
26
18
|
event: 'RECOVERABLE_ERROR',
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
19
|
+
error: new errors_1.OperationalError({
|
|
20
|
+
code: 'BODY_XML_UNEXPECTED_STRUCTURE',
|
|
21
|
+
message: `Didn't find expected child type in ${parentType}`,
|
|
22
|
+
expected: type,
|
|
23
|
+
actual: nodes.map((node) => node.type),
|
|
24
|
+
}),
|
|
31
25
|
});
|
|
32
26
|
}
|
|
33
27
|
return child;
|
|
34
28
|
};
|
|
35
29
|
exports.findChildOftype = findChildOftype;
|
|
36
|
-
const everyChildIsType = (type, nodes, parentType) => {
|
|
30
|
+
const everyChildIsType = (type, nodes, parentType, context) => {
|
|
37
31
|
const predicate = (node) => node.type === type;
|
|
38
32
|
const allChildrenAreType = nodes.every(predicate);
|
|
39
33
|
if (!allChildrenAreType) {
|
|
40
|
-
|
|
34
|
+
context?.logger.error({
|
|
41
35
|
event: 'RECOVERABLE_ERROR',
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
36
|
+
error: new errors_1.OperationalError({
|
|
37
|
+
code: 'BODY_XML_UNEXPECTED_STRUCTURE',
|
|
38
|
+
message: `Unexpected children types for ${parentType}`,
|
|
39
|
+
expected: type,
|
|
40
|
+
actual: nodes.map((node) => node.type),
|
|
41
|
+
}),
|
|
46
42
|
});
|
|
47
43
|
}
|
|
48
44
|
return nodes;
|
|
49
45
|
};
|
|
50
46
|
exports.everyChildIsType = everyChildIsType;
|
|
51
|
-
const childrenOfTypes = (types, nodes, parentType) => {
|
|
47
|
+
const childrenOfTypes = (types, nodes, parentType, context) => {
|
|
52
48
|
const predicate = (node) => types.includes(node.type);
|
|
53
49
|
const allChildrenAreType = nodes.every(predicate);
|
|
54
50
|
if (!allChildrenAreType) {
|
|
55
|
-
|
|
51
|
+
context?.logger.error({
|
|
56
52
|
event: 'RECOVERABLE_ERROR',
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
53
|
+
error: new errors_1.OperationalError({
|
|
54
|
+
code: 'BODY_XML_UNEXPECTED_STRUCTURE',
|
|
55
|
+
message: `Unexpected ordered children types for ${parentType}`,
|
|
56
|
+
expected: types,
|
|
57
|
+
actual: nodes.map((node) => node.type),
|
|
58
|
+
}),
|
|
61
59
|
});
|
|
62
60
|
}
|
|
63
61
|
return nodes;
|
|
@@ -72,16 +70,18 @@ const nodesAreOrderedTypes = (types, nodes) => {
|
|
|
72
70
|
return true;
|
|
73
71
|
};
|
|
74
72
|
exports.nodesAreOrderedTypes = nodesAreOrderedTypes;
|
|
75
|
-
const childrenOfOrderedTypes = (types, nodes, parentType) => {
|
|
73
|
+
const childrenOfOrderedTypes = (types, nodes, parentType, context) => {
|
|
76
74
|
if ((0, exports.nodesAreOrderedTypes)(types, nodes)) {
|
|
77
75
|
return nodes;
|
|
78
76
|
}
|
|
79
|
-
|
|
77
|
+
context?.logger.error({
|
|
80
78
|
event: 'RECOVERABLE_ERROR',
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
79
|
+
error: new errors_1.OperationalError({
|
|
80
|
+
code: 'BODY_XML_UNEXPECTED_STRUCTURE',
|
|
81
|
+
message: `Unexpected children types for ${parentType}`,
|
|
82
|
+
expected: types,
|
|
83
|
+
actual: nodes.map((node) => node.type),
|
|
84
|
+
}),
|
|
85
85
|
});
|
|
86
86
|
return nodes;
|
|
87
87
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodePredicates.js","sourceRoot":"","sources":["../../../src/resolvers/content-tree/nodePredicates.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"nodePredicates.js","sourceRoot":"","sources":["../../../src/resolvers/content-tree/nodePredicates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare const Reference: {
|
|
2
|
-
__resolveType(parent: import(".").ReferenceWithCAPIData<import("@financial-times/content-tree").ContentTree.Node>): "
|
|
2
|
+
__resolveType(parent: import(".").ReferenceWithCAPIData<import("@financial-times/content-tree").ContentTree.Node>): "Tweet" | "ImageSet" | "ClipSet" | "VideoReference" | "Flourish" | "Recommended" | "LayoutImage" | "RawImage" | "ScrollyImage";
|
|
3
3
|
type(parent: import(".").ReferenceWithCAPIData<import("@financial-times/content-tree").ContentTree.Node>): string;
|
|
4
4
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { TagMappings } from './bodyXMLToTree';
|
|
2
|
-
|
|
2
|
+
import { CapiResponse } from '../../model/CapiResponse';
|
|
3
|
+
declare const articleTagMappings: (capiData?: CapiResponse) => TagMappings;
|
|
3
4
|
declare const liveBlogPostTagMappings: TagMappings;
|
|
4
5
|
declare const commonTagMappings: TagMappings;
|
|
5
6
|
export declare const getBooleanAttributeValue: ($el: any, attribute: string) => boolean;
|