@financial-times/cp-content-pipeline-schema 0.7.9 → 0.7.10

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.7.10](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v0.7.9...cp-content-pipeline-schema-v0.7.10) (2023-05-18)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * handle spuriously-nested layout slots ([95f6dcd](https://github.com/Financial-Times/cp-content-pipeline/commit/95f6dcd069c7fa2037057755d2e971b15d2443a3))
9
+ * return all children, don't filter, when predicate doesn't match ([78060c8](https://github.com/Financial-Times/cp-content-pipeline/commit/78060c8d723a1fbb6eb8a0f4d535a06684b98640))
10
+
3
11
  ## [0.7.9](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v0.7.8...cp-content-pipeline-schema-v0.7.9) (2023-05-04)
4
12
 
5
13
 
@@ -1,6 +1,8 @@
1
1
  /// <reference types="cheerio" />
2
2
  import type { ContentTree } from '@financial-times/content-tree';
3
- declare type ContentTreeTransform = ($el: cheerio.Cheerio) => ContentTree.Node;
3
+ import { AnyNode } from './Workarounds';
4
+ import { QueryContext } from '..';
5
+ declare type ContentTreeTransform = ($el: cheerio.Cheerio, traverse: () => AnyNode[], context?: QueryContext) => AnyNode;
4
6
  export declare type TagMappings = Record<string, ContentTreeTransform>;
5
- export default function bodyXMLToTree(xml: string, tagMappings: TagMappings): ContentTree.Body;
7
+ export default function bodyXMLToTree(xml: string, tagMappings: TagMappings, context?: QueryContext): ContentTree.Body;
6
8
  export {};
@@ -17,17 +17,12 @@ function isNode(node) {
17
17
  Function that converts an XML string to a Body node from
18
18
  the Content Tree spec - https://github.com/Financial-Times/content-tree#Body
19
19
  */
20
- function bodyXMLToTree(xml, tagMappings) {
20
+ function bodyXMLToTree(xml, tagMappings, context) {
21
21
  const $ = cheerio_1.default.load(xml);
22
- const bodyEl = $('body')[0];
23
- if (!isTagElement(bodyEl)) {
24
- throw new Error('Body is invalid');
25
- }
26
- const flattenAndTraverseChildren = (element) => element.children.map(traverse).flat().filter(isNode);
22
+ const flattenAndTraverseChildren = (children) => children.flatMap(traverse);
27
23
  function traverse(element) {
28
- let contentTreeNode;
29
24
  if (element.type === 'text' && element.data) {
30
- contentTreeNode = {
25
+ return {
31
26
  type: 'text',
32
27
  value: element.data,
33
28
  };
@@ -36,25 +31,20 @@ function bodyXMLToTree(xml, tagMappings) {
36
31
  const matchedSelector = Object.keys(tagMappings).find((selector) => element.name === selector || $(element).is(selector));
37
32
  if (matchedSelector) {
38
33
  const contentTreeTransform = tagMappings[matchedSelector];
39
- contentTreeNode = contentTreeTransform($(element));
40
- }
41
- if (element.children.length) {
42
- if (contentTreeNode && isParent(contentTreeNode)) {
43
- contentTreeNode.children = flattenAndTraverseChildren(element);
44
- }
45
- else if (!contentTreeNode) {
46
- return flattenAndTraverseChildren(element);
47
- }
34
+ return contentTreeTransform($(element), () => flattenAndTraverseChildren(element.children), context);
48
35
  }
36
+ return flattenAndTraverseChildren(element.children);
49
37
  }
50
- return contentTreeNode;
38
+ return [];
39
+ }
40
+ const body = traverse($('body')[0]);
41
+ if (Array.isArray(body) || !isNode(body)) {
42
+ throw new Error(`Unexpected mapping result for body node, received ${JSON.stringify(body)}`);
43
+ }
44
+ if (body.type !== 'body') {
45
+ throw new Error(`Expected root node to be a body, but got ${body.type}`);
51
46
  }
52
- const children = flattenAndTraverseChildren(bodyEl);
53
- return {
54
- type: 'body',
55
- version: 1,
56
- children,
57
- };
47
+ return body;
58
48
  }
59
49
  exports.default = bodyXMLToTree;
60
50
  //# sourceMappingURL=bodyXMLToTree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bodyXMLToTree.js","sourceRoot":"","sources":["../../src/content-tree/bodyXMLToTree.ts"],"names":[],"mappings":";;;;;AAAA,sDAA6B;AAI7B,SAAS,YAAY,CAAC,EAAmB;IACvC,OAAO,EAAE,CAAC,IAAI,KAAK,KAAK,CAAA;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAsB;IACtC,OAAO,UAAU,IAAI,IAAI,CAAA;AAC3B,CAAC;AAED,SAAS,MAAM,CAAC,IAAkC;IAChD,OAAO,OAAO,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAA;AACxC,CAAC;AAMD;;;EAGE;AACF,SAAwB,aAAa,CACnC,GAAW,EACX,WAAwB;IAExB,MAAM,CAAC,GAAG,iBAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE3B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAE3B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;QACzB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;KACnC;IAED,MAAM,0BAA0B,GAAG,CACjC,OAA2B,EACP,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAE7E,SAAS,QAAQ,CAAC,OAAwB;QACxC,IAAI,eAAe,CAAA;QAEnB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,EAAE;YAC3C,eAAe,GAAG;gBAChB,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,OAAO,CAAC,IAAI;aACpB,CAAA;SACF;aAAM,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE;YAChC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CACnD,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CACnE,CAAA;YAED,IAAI,eAAe,EAAE;gBACnB,MAAM,oBAAoB,GAAG,WAAW,CAAC,eAAe,CAAC,CAAA;gBACzD,eAAe,GAAG,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;aACnD;YAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE;gBAC3B,IAAI,eAAe,IAAI,QAAQ,CAAC,eAAe,CAAC,EAAE;oBAChD,eAAe,CAAC,QAAQ,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAA;iBAC/D;qBAAM,IAAI,CAAC,eAAe,EAAE;oBAC3B,OAAO,0BAA0B,CAAC,OAAO,CAAC,CAAA;iBAC3C;aACF;SACF;QAED,OAAO,eAAe,CAAA;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAA;IAEnD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC;QACV,QAAQ;KACT,CAAA;AACH,CAAC;AArDD,gCAqDC"}
1
+ {"version":3,"file":"bodyXMLToTree.js","sourceRoot":"","sources":["../../src/content-tree/bodyXMLToTree.ts"],"names":[],"mappings":";;;;;AAAA,sDAA6B;AAM7B,SAAS,YAAY,CAAC,EAAmB;IACvC,OAAO,EAAE,CAAC,IAAI,KAAK,KAAK,CAAA;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAsB;IACtC,OAAO,UAAU,IAAI,IAAI,CAAA;AAC3B,CAAC;AAED,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,iBAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE3B,MAAM,0BAA0B,GAAG,CAAC,QAA2B,EAAa,EAAE,CAC5E,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE5B,SAAS,QAAQ,CAAC,OAAwB;QACxC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,EAAE;YAC3C,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,OAAO,CAAC,IAAI;aACpB,CAAA;SACF;aAAM,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE;YAChC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CACnD,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CACnE,CAAA;YAED,IAAI,eAAe,EAAE;gBACnB,MAAM,oBAAoB,GAAG,WAAW,CAAC,eAAe,CAAC,CAAA;gBACzD,OAAO,oBAAoB,CACzB,CAAC,CAAC,OAAO,CAAC,EACV,GAAG,EAAE,CAAC,0BAA0B,CAAC,OAAO,CAAC,QAAQ,CAAC,EAClD,OAAO,CACR,CAAA;aACF;YAED,OAAO,0BAA0B,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;SACpD;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"}
@@ -1,78 +1,337 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
+ jest.mock('@dotcom-reliability-kit/log-error', () => ({
30
+ logRecoverableError: jest.fn(),
31
+ }));
6
32
  const bodyXMLToTree_js_1 = __importDefault(require("./bodyXMLToTree.js"));
7
33
  const tagMappings_js_1 = __importDefault(require("./tagMappings.js"));
34
+ const logError = __importStar(require("@dotcom-reliability-kit/log-error"));
35
+ const logRecoverableErrorMock = logError.logRecoverableError;
8
36
  describe('bodyXMLToTree', () => {
9
37
  it('converts XML to tree', () => {
10
38
  const xml = `<body><p>Hello world</p></body>`;
11
- const expectedTree = {
12
- type: 'body',
13
- version: 1,
14
- children: [
15
- {
16
- type: 'paragraph',
17
- children: [{ type: 'text', value: 'Hello world' }],
18
- },
39
+ expect((0, bodyXMLToTree_js_1.default)(xml, tagMappings_js_1.default)).toMatchInlineSnapshot(`
40
+ Object {
41
+ "children": Array [
42
+ Object {
43
+ "children": Array [
44
+ Object {
45
+ "type": "text",
46
+ "value": "Hello world",
47
+ },
19
48
  ],
20
- };
21
- expect((0, bodyXMLToTree_js_1.default)(xml, tagMappings_js_1.default)).toEqual(expectedTree);
49
+ "type": "paragraph",
50
+ },
51
+ ],
52
+ "type": "body",
53
+ "version": 1,
54
+ }
55
+ `);
22
56
  });
23
57
  it('supports nested selectors', () => {
24
- const xml = `<body><img src="regular-image"/><div class="n-content-layout"><img src="layout-image" /></div></body>`;
58
+ const xml = `<body><img src="regular-image"/><div class="n-content-layout"><div class="n-content-layout__slot"><img src="layout-image" /></div></div></body>`;
25
59
  const tags = {
26
- 'body > img': ($el) => ({ type: 'regular-image' }),
27
- '.n-content-layout': ($el) => ({ type: 'layout', children: [] }),
28
- '.n-content-layout > img': ($el) => ({ type: 'layout-image' }),
60
+ body: ($el, traverse) => ({
61
+ type: 'body',
62
+ children: traverse(),
63
+ version: 1,
64
+ }),
65
+ 'body > img': () => ({ type: 'image-set', id: 'id' }),
66
+ '.n-content-layout': ($el, traverse) => ({
67
+ type: 'layout',
68
+ children: traverse().filter((node) => node.type === 'layout-slot'),
69
+ layoutName: 'auto',
70
+ layoutWidth: 'layoutWidth',
71
+ }),
72
+ '.n-content-layout__slot': ($el, traverse) => ({
73
+ type: 'layout-slot',
74
+ children: traverse().filter((node) => node.type === 'layout-image'),
75
+ }),
76
+ '.n-content-layout img': () => ({
77
+ type: 'layout-image',
78
+ id: 'id',
79
+ alt: 'alt',
80
+ caption: 'caption',
81
+ credit: 'credit',
82
+ }),
29
83
  };
30
- const expectedTree = {
31
- type: 'body',
32
- version: 1,
33
- children: [
34
- {
35
- type: 'regular-image',
36
- },
37
- {
38
- type: 'layout',
39
- children: [{ type: 'layout-image' }],
40
- },
84
+ expect((0, bodyXMLToTree_js_1.default)(xml, tags)).toMatchInlineSnapshot(`
85
+ Object {
86
+ "children": Array [
87
+ Object {
88
+ "id": "id",
89
+ "type": "image-set",
90
+ },
91
+ Object {
92
+ "children": Array [
93
+ Object {
94
+ "children": Array [
95
+ Object {
96
+ "alt": "alt",
97
+ "caption": "caption",
98
+ "credit": "credit",
99
+ "id": "id",
100
+ "type": "layout-image",
101
+ },
102
+ ],
103
+ "type": "layout-slot",
104
+ },
41
105
  ],
42
- };
43
- expect((0, bodyXMLToTree_js_1.default)(xml, tags)).toEqual(expectedTree);
106
+ "layoutName": "auto",
107
+ "layoutWidth": "layoutWidth",
108
+ "type": "layout",
109
+ },
110
+ ],
111
+ "type": "body",
112
+ "version": 1,
113
+ }
114
+ `);
44
115
  });
45
116
  it('includes known children of unknown tags', () => {
46
117
  const xml = `<body><p>P1</p><unknown><p>P2</p></unknown></body>`;
47
- const expectedTree = {
48
- type: 'body',
49
- version: 1,
50
- children: [
51
- {
52
- type: 'paragraph',
53
- children: [{ type: 'text', value: 'P1' }],
54
- },
55
- {
56
- type: 'paragraph',
57
- children: [{ type: 'text', value: 'P2' }],
58
- },
118
+ expect((0, bodyXMLToTree_js_1.default)(xml, tagMappings_js_1.default)).toMatchInlineSnapshot(`
119
+ Object {
120
+ "children": Array [
121
+ Object {
122
+ "children": Array [
123
+ Object {
124
+ "type": "text",
125
+ "value": "P1",
126
+ },
59
127
  ],
60
- };
61
- expect((0, bodyXMLToTree_js_1.default)(xml, tagMappings_js_1.default)).toEqual(expectedTree);
128
+ "type": "paragraph",
129
+ },
130
+ Object {
131
+ "children": Array [
132
+ Object {
133
+ "type": "text",
134
+ "value": "P2",
135
+ },
136
+ ],
137
+ "type": "paragraph",
138
+ },
139
+ ],
140
+ "type": "body",
141
+ "version": 1,
142
+ }
143
+ `);
62
144
  });
63
145
  it("maps tags that aren't expected to have any children (e.g. tweet reference)", () => {
64
146
  const xml = '<body><a data-asset-type="tweet" data-embedded="true" href="https://twitter.com/EllliotttB/status/1610358432577748992?s=20&amp;t=pcwJG65_c10H3snOQWzI4w">https://twitter.com/EllliotttB/status/1610358432577748992?s=20&amp;t=pcwJG65_c10H3snOQWzI4w</a></body>';
65
- const expectedTree = {
66
- type: 'body',
67
- version: 1,
68
- children: [
69
- {
70
- type: 'tweet',
71
- id: 'https://twitter.com/EllliotttB/status/1610358432577748992?s=20&t=pcwJG65_c10H3snOQWzI4w',
72
- },
147
+ expect((0, bodyXMLToTree_js_1.default)(xml, tagMappings_js_1.default)).toMatchInlineSnapshot(`
148
+ Object {
149
+ "children": Array [
150
+ Object {
151
+ "id": "https://twitter.com/EllliotttB/status/1610358432577748992?s=20&t=pcwJG65_c10H3snOQWzI4w",
152
+ "type": "tweet",
153
+ },
154
+ ],
155
+ "type": "body",
156
+ "version": 1,
157
+ }
158
+ `);
159
+ });
160
+ it('collapses nested .n-content-layout__slots', () => {
161
+ const xml = '<body><div class="n-content-layout"><div class="n-content-layout__slot"><h4></h4><div class="n-content-layout__slot"><p>text</p></div></div></div></body>';
162
+ expect((0, bodyXMLToTree_js_1.default)(xml, tagMappings_js_1.default)).toMatchInlineSnapshot(`
163
+ Object {
164
+ "children": Array [
165
+ Object {
166
+ "children": Array [
167
+ Object {
168
+ "children": Array [
169
+ Object {
170
+ "children": Array [],
171
+ "level": "label",
172
+ "type": "heading",
173
+ },
174
+ Object {
175
+ "children": Array [
176
+ Object {
177
+ "type": "text",
178
+ "value": "text",
179
+ },
180
+ ],
181
+ "type": "paragraph",
182
+ },
183
+ ],
184
+ "type": "layout-slot",
185
+ },
73
186
  ],
74
- };
75
- expect((0, bodyXMLToTree_js_1.default)(xml, tagMappings_js_1.default)).toEqual(expectedTree);
187
+ "layoutName": "auto",
188
+ "layoutWidth": "full-width",
189
+ "type": "layout",
190
+ },
191
+ ],
192
+ "type": "body",
193
+ "version": 1,
194
+ }
195
+ `);
196
+ });
197
+ describe('layout children handling', () => {
198
+ beforeEach(() => {
199
+ jest.resetAllMocks();
200
+ });
201
+ it('should handle slots', () => {
202
+ const xml = '<body><div class="n-content-layout"><div class="n-content-layout__slot"></div><div class="n-content-layout__slot"></div></body>';
203
+ expect((0, bodyXMLToTree_js_1.default)(xml, tagMappings_js_1.default)).toMatchInlineSnapshot(`
204
+ Object {
205
+ "children": Array [
206
+ Object {
207
+ "children": Array [
208
+ Object {
209
+ "children": Array [],
210
+ "type": "layout-slot",
211
+ },
212
+ Object {
213
+ "children": Array [],
214
+ "type": "layout-slot",
215
+ },
216
+ ],
217
+ "layoutName": "auto",
218
+ "layoutWidth": "full-width",
219
+ "type": "layout",
220
+ },
221
+ ],
222
+ "type": "body",
223
+ "version": 1,
224
+ }
225
+ `);
226
+ expect(logRecoverableErrorMock).not.toBeCalled();
227
+ });
228
+ it('should handle heading and slots', () => {
229
+ 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>';
230
+ expect((0, bodyXMLToTree_js_1.default)(xml, tagMappings_js_1.default)).toMatchInlineSnapshot(`
231
+ Object {
232
+ "children": Array [
233
+ Object {
234
+ "children": Array [
235
+ Object {
236
+ "children": Array [],
237
+ "level": "subheading",
238
+ "type": "heading",
239
+ },
240
+ Object {
241
+ "children": Array [],
242
+ "type": "layout-slot",
243
+ },
244
+ Object {
245
+ "children": Array [],
246
+ "type": "layout-slot",
247
+ },
248
+ ],
249
+ "layoutName": "auto",
250
+ "layoutWidth": "full-width",
251
+ "type": "layout",
252
+ },
253
+ ],
254
+ "type": "body",
255
+ "version": 1,
256
+ }
257
+ `);
258
+ expect(logRecoverableErrorMock).not.toBeCalled();
259
+ });
260
+ it('should log an error on unexpected child after heading', () => {
261
+ const xml = '<body><div class="n-content-layout"><h3></h3><div class="n-content-layout__slot"></div><p></p></body>';
262
+ expect((0, bodyXMLToTree_js_1.default)(xml, tagMappings_js_1.default)).toMatchInlineSnapshot(`
263
+ Object {
264
+ "children": Array [
265
+ Object {
266
+ "children": Array [
267
+ Object {
268
+ "children": Array [],
269
+ "level": "subheading",
270
+ "type": "heading",
271
+ },
272
+ Object {
273
+ "children": Array [],
274
+ "type": "layout-slot",
275
+ },
276
+ Object {
277
+ "children": Array [],
278
+ "type": "paragraph",
279
+ },
280
+ ],
281
+ "layoutName": "auto",
282
+ "layoutWidth": "full-width",
283
+ "type": "layout",
284
+ },
285
+ ],
286
+ "type": "body",
287
+ "version": 1,
288
+ }
289
+ `);
290
+ expect(logRecoverableErrorMock).toBeCalled();
291
+ expect(logRecoverableErrorMock.mock.lastCall).toMatchInlineSnapshot(`
292
+ Array [
293
+ Object {
294
+ "error": [OperationalError: Unexpected children types for layout],
295
+ "logger": undefined,
296
+ },
297
+ ]
298
+ `);
299
+ });
300
+ it('should log an error on unexpected child after slots', () => {
301
+ const xml = '<body><div class="n-content-layout"><div class="n-content-layout__slot"></div><p></p></body>';
302
+ expect((0, bodyXMLToTree_js_1.default)(xml, tagMappings_js_1.default)).toMatchInlineSnapshot(`
303
+ Object {
304
+ "children": Array [
305
+ Object {
306
+ "children": Array [
307
+ Object {
308
+ "children": Array [],
309
+ "type": "layout-slot",
310
+ },
311
+ Object {
312
+ "children": Array [],
313
+ "type": "paragraph",
314
+ },
315
+ ],
316
+ "layoutName": "auto",
317
+ "layoutWidth": "full-width",
318
+ "type": "layout",
319
+ },
320
+ ],
321
+ "type": "body",
322
+ "version": 1,
323
+ }
324
+ `);
325
+ expect(logRecoverableErrorMock).toBeCalled();
326
+ expect(logRecoverableErrorMock.mock.lastCall).toMatchInlineSnapshot(`
327
+ Array [
328
+ Object {
329
+ "error": [OperationalError: Unexpected children types for layout],
330
+ "logger": undefined,
331
+ },
332
+ ]
333
+ `);
334
+ });
76
335
  });
77
336
  });
78
337
  //# sourceMappingURL=bodyXMLToTree.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bodyXMLToTree.test.js","sourceRoot":"","sources":["../../src/content-tree/bodyXMLToTree.test.ts"],"names":[],"mappings":";;;;;AACA,0EAA+D;AAC/D,sEAAmC;AACnC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,GAAG,GAAG,iCAAiC,CAAA;QAC7C,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;iBACnD;aACF;SACF,CAAA;QACD,MAAM,CAAC,IAAA,0BAAa,EAAC,GAAG,EAAE,wBAAI,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,GAAG,GAAG,uGAAuG,CAAA;QAEnH,MAAM,IAAI,GAAgB;YACxB,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;YAClD,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YAChE,yBAAyB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;SAC/D,CAAA;QACD,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,eAAe;iBACtB;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;iBACrC;aACF;SACF,CAAA;QACD,MAAM,CAAC,IAAA,0BAAa,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,GAAG,GAAG,oDAAoD,CAAA;QAEhE,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;iBAC1C;gBACD;oBACE,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;iBAC1C;aACF;SACF,CAAA;QACD,MAAM,CAAC,IAAA,0BAAa,EAAC,GAAG,EAAE,wBAAI,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,GAAG,GACP,iQAAiQ,CAAA;QAEnQ,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,OAAO;oBACb,EAAE,EAAE,yFAAyF;iBAC9F;aACF;SACF,CAAA;QACD,MAAM,CAAC,IAAA,0BAAa,EAAC,GAAG,EAAE,wBAAI,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"bodyXMLToTree.test.js","sourceRoot":"","sources":["../../src/content-tree/bodyXMLToTree.test.ts"],"names":[],"mappings":"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"}