@atlaskit/adf-utils 18.0.2 → 18.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cjs/builders/marks/alignment.js +0 -3
  3. package/dist/cjs/builders/marks/annotation.js +0 -3
  4. package/dist/cjs/builders/marks/breakout.js +0 -3
  5. package/dist/cjs/builders/marks/code.js +0 -3
  6. package/dist/cjs/builders/marks/data-consumer.js +0 -3
  7. package/dist/cjs/builders/marks/em.js +0 -3
  8. package/dist/cjs/builders/marks/fragment.js +0 -3
  9. package/dist/cjs/builders/marks/indentation.js +0 -3
  10. package/dist/cjs/builders/marks/link.js +0 -3
  11. package/dist/cjs/builders/marks/strike.js +0 -3
  12. package/dist/cjs/builders/marks/strong.js +0 -3
  13. package/dist/cjs/builders/marks/subsup.js +0 -3
  14. package/dist/cjs/builders/marks/text-color.js +0 -3
  15. package/dist/cjs/builders/marks/underline.js +0 -3
  16. package/dist/cjs/builders/nodes/block-card.js +0 -2
  17. package/dist/cjs/builders/nodes/blockquote.js +0 -3
  18. package/dist/cjs/builders/nodes/bodied-extension.js +0 -3
  19. package/dist/cjs/builders/nodes/bullet-list.js +0 -3
  20. package/dist/cjs/builders/nodes/caption.js +0 -3
  21. package/dist/cjs/builders/nodes/code-block.js +0 -3
  22. package/dist/cjs/builders/nodes/date.js +0 -2
  23. package/dist/cjs/builders/nodes/decision-item.js +0 -3
  24. package/dist/cjs/builders/nodes/decision-list.js +0 -3
  25. package/dist/cjs/builders/nodes/doc.js +0 -3
  26. package/dist/cjs/builders/nodes/embed-card.js +0 -2
  27. package/dist/cjs/builders/nodes/emoji.js +0 -2
  28. package/dist/cjs/builders/nodes/expand.js +0 -3
  29. package/dist/cjs/builders/nodes/extension.js +0 -2
  30. package/dist/cjs/builders/nodes/hard-break.js +0 -2
  31. package/dist/cjs/builders/nodes/heading.js +0 -3
  32. package/dist/cjs/builders/nodes/inline-card.js +0 -2
  33. package/dist/cjs/builders/nodes/inline-extension.js +0 -2
  34. package/dist/cjs/builders/nodes/layout-column.js +0 -2
  35. package/dist/cjs/builders/nodes/layout-section.js +0 -2
  36. package/dist/cjs/builders/nodes/list-item.js +0 -2
  37. package/dist/cjs/builders/nodes/media-group.js +0 -3
  38. package/dist/cjs/builders/nodes/media-inline.js +0 -2
  39. package/dist/cjs/builders/nodes/media-single.js +0 -2
  40. package/dist/cjs/builders/nodes/media.js +0 -2
  41. package/dist/cjs/builders/nodes/mention.js +0 -6
  42. package/dist/cjs/builders/nodes/nested-expand.js +0 -3
  43. package/dist/cjs/builders/nodes/ordered-list.js +0 -3
  44. package/dist/cjs/builders/nodes/panel.js +0 -3
  45. package/dist/cjs/builders/nodes/paragraph.js +0 -4
  46. package/dist/cjs/builders/nodes/placeholder.js +0 -2
  47. package/dist/cjs/builders/nodes/rule.js +0 -2
  48. package/dist/cjs/builders/nodes/status.js +0 -2
  49. package/dist/cjs/builders/nodes/table-cell.js +0 -3
  50. package/dist/cjs/builders/nodes/table-header.js +0 -3
  51. package/dist/cjs/builders/nodes/table-row.js +0 -2
  52. package/dist/cjs/builders/nodes/table.js +0 -3
  53. package/dist/cjs/builders/nodes/task-item.js +0 -3
  54. package/dist/cjs/builders/nodes/task-list.js +0 -3
  55. package/dist/cjs/builders/nodes/text.js +0 -2
  56. package/dist/cjs/builders/utils/apply-mark.js +0 -5
  57. package/dist/cjs/builders/utils/create-text-nodes.js +0 -3
  58. package/dist/cjs/builders/utils/is-duplicate-mark.js +0 -3
  59. package/dist/cjs/builders.js +0 -51
  60. package/dist/cjs/empty-adf.js +0 -2
  61. package/dist/cjs/scrub/default-node-replacements.js +0 -11
  62. package/dist/cjs/scrub/default-value-replacements.js +0 -2
  63. package/dist/cjs/scrub/hash.js +0 -4
  64. package/dist/cjs/scrub/scrub-adf.js +2 -25
  65. package/dist/cjs/scrub/scrub-content.js +7 -37
  66. package/dist/cjs/scrub.js +0 -2
  67. package/dist/cjs/transforms/dedupe-marks-transform.js +2 -23
  68. package/dist/cjs/transforms/helpers.js +0 -3
  69. package/dist/cjs/transforms/indentation-marks-transform.js +6 -14
  70. package/dist/cjs/transforms/invalid-media-content-transform.js +3 -22
  71. package/dist/cjs/transforms/media-link-transform.js +2 -12
  72. package/dist/cjs/transforms/nodes-missing-content-transform.js +0 -44
  73. package/dist/cjs/transforms/text-link-code-transform.js +3 -13
  74. package/dist/cjs/transforms.js +0 -6
  75. package/dist/cjs/traverse/filter.js +0 -2
  76. package/dist/cjs/traverse/map.js +0 -2
  77. package/dist/cjs/traverse/reduce.js +0 -2
  78. package/dist/cjs/traverse/traverse.js +1 -18
  79. package/dist/cjs/traverse.js +0 -4
  80. package/dist/cjs/validator/rules.js +0 -2
  81. package/dist/cjs/validator/specs/block_content.js +1 -1
  82. package/dist/cjs/validator/specs/doc.js +1 -1
  83. package/dist/cjs/validator/specs/index.js +2 -85
  84. package/dist/cjs/validator/specs/listItem.js +1 -1
  85. package/dist/cjs/validator/specs/nestedExpand_content.js +1 -1
  86. package/dist/cjs/validator/specs/non_nestable_block_content.js +1 -1
  87. package/dist/cjs/validator/specs/panel.js +3 -3
  88. package/dist/cjs/validator/specs/tableCell_content.js +1 -1
  89. package/dist/cjs/validator/utils.js +4 -20
  90. package/dist/cjs/validator/validator.js +67 -218
  91. package/dist/cjs/validator.js +0 -1
  92. package/dist/cjs/version.json +1 -1
  93. package/dist/es2019/builders/utils/apply-mark.js +0 -2
  94. package/dist/es2019/builders/utils/is-duplicate-mark.js +0 -1
  95. package/dist/es2019/builders.js +4 -1
  96. package/dist/es2019/scrub/default-node-replacements.js +2 -7
  97. package/dist/es2019/scrub/hash.js +0 -2
  98. package/dist/es2019/scrub/scrub-adf.js +4 -10
  99. package/dist/es2019/scrub/scrub-content.js +7 -20
  100. package/dist/es2019/transforms/dedupe-marks-transform.js +4 -16
  101. package/dist/es2019/transforms/helpers.js +0 -1
  102. package/dist/es2019/transforms/indentation-marks-transform.js +10 -10
  103. package/dist/es2019/transforms/invalid-media-content-transform.js +5 -15
  104. package/dist/es2019/transforms/media-link-transform.js +2 -9
  105. package/dist/es2019/transforms/nodes-missing-content-transform.js +6 -38
  106. package/dist/es2019/transforms/text-link-code-transform.js +5 -8
  107. package/dist/es2019/traverse/traverse.js +5 -13
  108. package/dist/es2019/validator/specs/block_content.js +1 -1
  109. package/dist/es2019/validator/specs/doc.js +1 -1
  110. package/dist/es2019/validator/specs/index.js +2 -2
  111. package/dist/es2019/validator/specs/listItem.js +1 -1
  112. package/dist/es2019/validator/specs/nestedExpand_content.js +1 -1
  113. package/dist/es2019/validator/specs/non_nestable_block_content.js +1 -1
  114. package/dist/es2019/validator/specs/panel.js +3 -3
  115. package/dist/es2019/validator/specs/tableCell_content.js +1 -1
  116. package/dist/es2019/validator/utils.js +4 -2
  117. package/dist/es2019/validator/validator.js +60 -174
  118. package/dist/es2019/version.json +1 -1
  119. package/dist/esm/builders/nodes/blockquote.js +0 -1
  120. package/dist/esm/builders/nodes/bodied-extension.js +0 -1
  121. package/dist/esm/builders/nodes/bullet-list.js +0 -1
  122. package/dist/esm/builders/nodes/caption.js +0 -1
  123. package/dist/esm/builders/nodes/code-block.js +0 -1
  124. package/dist/esm/builders/nodes/decision-item.js +0 -1
  125. package/dist/esm/builders/nodes/decision-list.js +0 -1
  126. package/dist/esm/builders/nodes/doc.js +0 -1
  127. package/dist/esm/builders/nodes/expand.js +0 -1
  128. package/dist/esm/builders/nodes/heading.js +0 -1
  129. package/dist/esm/builders/nodes/media-group.js +0 -1
  130. package/dist/esm/builders/nodes/mention.js +0 -3
  131. package/dist/esm/builders/nodes/nested-expand.js +0 -1
  132. package/dist/esm/builders/nodes/ordered-list.js +0 -1
  133. package/dist/esm/builders/nodes/panel.js +0 -1
  134. package/dist/esm/builders/nodes/paragraph.js +0 -1
  135. package/dist/esm/builders/nodes/table-cell.js +0 -1
  136. package/dist/esm/builders/nodes/table-header.js +0 -1
  137. package/dist/esm/builders/nodes/table.js +0 -1
  138. package/dist/esm/builders/nodes/task-item.js +0 -1
  139. package/dist/esm/builders/nodes/task-list.js +0 -1
  140. package/dist/esm/builders/utils/apply-mark.js +0 -2
  141. package/dist/esm/builders/utils/is-duplicate-mark.js +0 -1
  142. package/dist/esm/builders.js +4 -1
  143. package/dist/esm/scrub/default-node-replacements.js +0 -9
  144. package/dist/esm/scrub/hash.js +0 -2
  145. package/dist/esm/scrub/scrub-adf.js +2 -17
  146. package/dist/esm/scrub/scrub-content.js +7 -28
  147. package/dist/esm/transforms/dedupe-marks-transform.js +2 -18
  148. package/dist/esm/transforms/helpers.js +0 -1
  149. package/dist/esm/transforms/indentation-marks-transform.js +6 -11
  150. package/dist/esm/transforms/invalid-media-content-transform.js +3 -18
  151. package/dist/esm/transforms/media-link-transform.js +2 -9
  152. package/dist/esm/transforms/nodes-missing-content-transform.js +0 -38
  153. package/dist/esm/transforms/text-link-code-transform.js +3 -10
  154. package/dist/esm/traverse/traverse.js +1 -15
  155. package/dist/esm/validator/specs/block_content.js +1 -1
  156. package/dist/esm/validator/specs/doc.js +1 -1
  157. package/dist/esm/validator/specs/index.js +2 -2
  158. package/dist/esm/validator/specs/listItem.js +1 -1
  159. package/dist/esm/validator/specs/nestedExpand_content.js +1 -1
  160. package/dist/esm/validator/specs/non_nestable_block_content.js +1 -1
  161. package/dist/esm/validator/specs/panel.js +3 -3
  162. package/dist/esm/validator/specs/tableCell_content.js +1 -1
  163. package/dist/esm/validator/utils.js +4 -2
  164. package/dist/esm/validator/validator.js +67 -209
  165. package/dist/esm/version.json +1 -1
  166. package/dist/types/validator/specs/index.d.ts +2 -2
  167. package/dist/types/validator/specs/panel.d.ts +3 -3
  168. package/package.json +2 -2
@@ -15,5 +15,4 @@ Object.defineProperty(exports, "validator", {
15
15
  return _validator.validator;
16
16
  }
17
17
  });
18
-
19
18
  var _validator = require("./validator/validator");
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/adf-utils",
3
- "version": "18.0.2",
3
+ "version": "18.0.4",
4
4
  "sideEffects": false
5
5
  }
@@ -2,13 +2,11 @@ import { isDuplicateMark, duplicateMarkError } from './is-duplicate-mark';
2
2
  import { text } from '../nodes/text';
3
3
  export function applyMark(mark, maybeNode) {
4
4
  const node = typeof maybeNode === 'string' ? text(maybeNode) : maybeNode;
5
-
6
5
  if (isDuplicateMark(node, mark.type)) {
7
6
  // eslint-disable-next-line no-console
8
7
  console.error(duplicateMarkError(node, mark.type));
9
8
  return node;
10
9
  }
11
-
12
10
  node.marks = node.marks || [];
13
11
  node.marks.push(mark);
14
12
  return node;
@@ -2,7 +2,6 @@ export function isDuplicateMark(node, type) {
2
2
  if (node.marks && node.marks.some(mark => mark.type === type)) {
3
3
  return true;
4
4
  }
5
-
6
5
  return false;
7
6
  }
8
7
  export function duplicateMarkError(node, type) {
@@ -1,4 +1,5 @@
1
1
  // Marks Builders
2
+
2
3
  export { breakout } from './builders/marks/breakout';
3
4
  export { code } from './builders/marks/code';
4
5
  export { em } from './builders/marks/em';
@@ -14,7 +15,9 @@ export { underline as u } from './builders/marks/underline';
14
15
  export { alignment } from './builders/marks/alignment';
15
16
  export { indentation } from './builders/marks/indentation';
16
17
  export { dataConsumer } from './builders/marks/data-consumer';
17
- export { fragment } from './builders/marks/fragment'; // Nodes Builders
18
+ export { fragment } from './builders/marks/fragment';
19
+
20
+ // Nodes Builders
18
21
 
19
22
  export { blockQuote } from './builders/nodes/blockquote';
20
23
  export { bodiedExtension } from './builders/nodes/bodied-extension';
@@ -1,10 +1,8 @@
1
1
  import { scrubAttrs } from './scrub-content';
2
-
3
2
  const card = (node, {
4
3
  valueReplacements
5
4
  }) => {
6
5
  var _node$attrs;
7
-
8
6
  return {
9
7
  type: node.type,
10
8
  attrs: {
@@ -12,17 +10,14 @@ const card = (node, {
12
10
  }
13
11
  };
14
12
  };
15
-
16
13
  const mediaParent = node => {
17
14
  var _node$content;
18
-
19
15
  return {
20
16
  type: node.type,
21
17
  attrs: node.attrs ? scrubAttrs(node.type, node.attrs) : undefined,
22
18
  content: (_node$content = node.content) === null || _node$content === void 0 ? void 0 : _node$content.filter(c => (c === null || c === void 0 ? void 0 : c.type) === 'media')
23
19
  };
24
20
  };
25
-
26
21
  export const defaultNodeReplacements = {
27
22
  emoji: () => ({
28
23
  type: 'emoji',
@@ -54,7 +49,6 @@ export const defaultNodeReplacements = {
54
49
  parent
55
50
  }) => {
56
51
  var _parent$node, _node$attrs$width, _node$attrs2, _node$attrs$height, _node$attrs3;
57
-
58
52
  const defaults = ((_parent$node = parent.node) === null || _parent$node === void 0 ? void 0 : _parent$node.type) === 'mediaSingle' ? {
59
53
  width: 600,
60
54
  height: 400
@@ -66,7 +60,8 @@ export const defaultNodeReplacements = {
66
60
  const height = (_node$attrs$height = (_node$attrs3 = node.attrs) === null || _node$attrs3 === void 0 ? void 0 : _node$attrs3.height) !== null && _node$attrs$height !== void 0 ? _node$attrs$height : defaults.height;
67
61
  return {
68
62
  type: 'media',
69
- attrs: { ...scrubAttrs('media', node.attrs),
63
+ attrs: {
64
+ ...scrubAttrs('media', node.attrs),
70
65
  type: 'external',
71
66
  url: `https://dummyimage.com/${width}x${height}/f4f5f7/a5adba`
72
67
  }
@@ -2,10 +2,8 @@
2
2
  export const hash = input => {
3
3
  let result = 5381;
4
4
  let index = input.length;
5
-
6
5
  while (index > 0) {
7
6
  result = result * 33 ^ input.charCodeAt(--index);
8
7
  }
9
-
10
8
  return (result >>> 0).toString();
11
9
  };
@@ -3,50 +3,44 @@ import { scrubAttrs, scrubStr, scrubLink } from './scrub-content';
3
3
  import { defaultNodeReplacements } from './default-node-replacements';
4
4
  import { defaultValueReplacements } from './default-value-replacements';
5
5
  export default ((adf, options = {}) => {
6
- const nodeReplacements = { ...defaultNodeReplacements,
6
+ const nodeReplacements = {
7
+ ...defaultNodeReplacements,
7
8
  ...options.nodeReplacements
8
9
  };
9
- const valueReplacements = { ...defaultValueReplacements,
10
+ const valueReplacements = {
11
+ ...defaultValueReplacements,
10
12
  ...options.valueReplacements
11
13
  };
12
14
  return traverse(adf, {
13
15
  any: (node, parent) => {
14
16
  const replacement = nodeReplacements[node.type];
15
-
16
17
  if (typeof replacement === 'function') {
17
18
  const result = replacement(node, {
18
19
  parent,
19
20
  valueReplacements
20
21
  });
21
-
22
22
  if (result !== false) {
23
23
  return result;
24
24
  }
25
25
  }
26
-
27
26
  const updatedNode = {};
28
27
  Object.entries(node).forEach(([key, value]) => {
29
28
  if (['version', 'type', 'content', 'marks'].includes(key)) {
30
29
  updatedNode[key] = value;
31
30
  }
32
31
  });
33
-
34
32
  if (node.text && node.marks) {
35
33
  var _node$marks;
36
-
37
34
  updatedNode.marks = scrubLink((_node$marks = node.marks) !== null && _node$marks !== void 0 ? _node$marks : [], {
38
35
  valueReplacements
39
36
  });
40
37
  }
41
-
42
38
  if (node.text) {
43
39
  updatedNode.text = scrubStr(node.text);
44
40
  }
45
-
46
41
  if (node.attrs) {
47
42
  updatedNode.attrs = scrubAttrs(node.type, node.attrs);
48
43
  }
49
-
50
44
  return updatedNode;
51
45
  }
52
46
  });
@@ -20,14 +20,12 @@ const BYPASS_ATTR_LIST = {
20
20
  tableRow: ['defaultMarks'],
21
21
  taskItem: ['state']
22
22
  };
23
-
24
23
  const fromEntries = iterable => {
25
24
  return [...iterable].reduce((obj, [key, val]) => {
26
25
  obj[key] = val;
27
26
  return obj;
28
27
  }, {});
29
28
  };
30
-
31
29
  const scrubNum = (val, start = 0) => {
32
30
  return parseInt(val.toString().split('').map((_, index) => {
33
31
  const base = start + index;
@@ -35,18 +33,17 @@ const scrubNum = (val, start = 0) => {
35
33
  return DUMMY_DIGITS[base % len];
36
34
  }).join(''), 10);
37
35
  };
38
-
39
36
  export const scrubStr = (val, offset = 0) => {
40
- const base = DUMMY_TEXT.repeat(Math.ceil((offset + val.length) / DUMMY_TEXT.length)); // using [...val] splits emoji character pairs correctly, compared to
41
- // something like "".split('')
37
+ const base = DUMMY_TEXT.repeat(Math.ceil((offset + val.length) / DUMMY_TEXT.length));
42
38
 
39
+ // using [...val] splits emoji character pairs correctly, compared to
40
+ // something like "".split('')
43
41
  return [...val].map((char, index, chars) => {
44
42
  if (/^\p{Nd}$/u.test(char)) {
45
43
  // Decimal digits
46
44
  return scrubNum(parseInt(char, 10), index).toString();
47
45
  } else if (/^\p{So}$/u.test(char)) {
48
46
  var _chars;
49
-
50
47
  // Emoji
51
48
  return ((_chars = chars[index - 1]) === null || _chars === void 0 ? void 0 : _chars.codePointAt(0)) === 8205 ? '' : '⭐️';
52
49
  } else if (/^\p{Sc}$/u.test(char)) {
@@ -74,59 +71,49 @@ export const scrubLink = (marks, {
74
71
  }) => {
75
72
  return marks.map(mark => {
76
73
  if (mark.type === 'link' && mark.attrs.href) {
77
- return { ...mark,
78
- attrs: { ...mark.attrs,
74
+ return {
75
+ ...mark,
76
+ attrs: {
77
+ ...mark.attrs,
79
78
  href: valueReplacements.href(mark.attrs.href)
80
79
  }
81
80
  };
82
81
  }
83
-
84
82
  return mark;
85
83
  });
86
84
  };
87
-
88
85
  const scrubObj = (nodeType, attrsObj) => {
89
86
  const entries = Object.entries(attrsObj).map(([key, value]) => {
90
87
  var _BYPASS_ATTR_LIST$nod;
91
-
92
88
  return (_BYPASS_ATTR_LIST$nod = BYPASS_ATTR_LIST[nodeType]) !== null && _BYPASS_ATTR_LIST$nod !== void 0 && _BYPASS_ATTR_LIST$nod.includes(key) ? [key, value] : [key, scrubAttrs(nodeType, value)];
93
89
  });
94
90
  return fromEntries(entries);
95
91
  };
96
-
97
92
  export const scrubAttrs = (nodeType, attrs, offset = 0) => {
98
93
  if (typeof attrs === 'number') {
99
94
  return scrubNum(attrs, offset);
100
95
  }
101
-
102
96
  if (typeof attrs === 'string') {
103
97
  return scrubStr(attrs, offset);
104
98
  }
105
-
106
99
  if (typeof attrs === 'boolean') {
107
100
  return attrs;
108
101
  }
109
-
110
102
  if (!attrs) {
111
103
  return attrs;
112
104
  }
113
-
114
105
  const attrsObj = attrs;
115
-
116
106
  if (attrsObj && attrsObj.constructor === Object && Object.keys(attrsObj).length === 0) {
117
107
  return {};
118
108
  }
119
-
120
109
  if (typeof attrsObj === 'object' && !Array.isArray(attrsObj)) {
121
110
  return scrubObj(nodeType, attrsObj);
122
111
  }
123
-
124
112
  if (Array.isArray(attrsObj)) {
125
113
  return attrsObj.map(el => {
126
114
  return typeof el === 'object' ? scrubObj(nodeType, el) : scrubAttrs(nodeType, el);
127
115
  });
128
116
  }
129
-
130
117
  throw new TypeError(`scrubAttrs: encountered unsupported attributes type "${typeof attrsObj}"
131
118
  of value ${JSON.stringify(attrsObj)}`);
132
119
  };
@@ -4,24 +4,20 @@ import { traverse } from '../traverse/traverse';
4
4
  // not include annotations here, because we do allow duplicate
5
5
  // annotations as long as they have unique id attributes (valid scenario)
6
6
  const markDuplicatesDisallowed = new Set(['strong', 'underline', 'textColor', 'link', 'em', 'subsup', 'strike']);
7
-
8
7
  const maybeHasDisallowedDuplicateMarks = node => {
9
8
  var _node$marks, _node$marks$map;
10
-
11
- const markTypes = (_node$marks = node.marks) === null || _node$marks === void 0 ? void 0 : (_node$marks$map = _node$marks.map(mark => mark.type)) === null || _node$marks$map === void 0 ? void 0 : _node$marks$map.filter(markType => // For annotations, we are performing the same cheap check
9
+ const markTypes = (_node$marks = node.marks) === null || _node$marks === void 0 ? void 0 : (_node$marks$map = _node$marks.map(mark => mark.type)) === null || _node$marks$map === void 0 ? void 0 : _node$marks$map.filter(markType =>
10
+ // For annotations, we are performing the same cheap check
12
11
  // for duplicates by type, without considering IDs, to quickly determine
13
12
  // whether there may be potential deduping targets.
14
13
  // In the actual deduping logic in maybeRemoveDisallowedDuplicateMarks,
15
14
  // we correctly/safely dedupe annotations by their unique IDs.
16
15
  markDuplicatesDisallowed.has(markType) || markType === 'annotation');
17
-
18
16
  if (!(markTypes !== null && markTypes !== void 0 && markTypes.length)) {
19
17
  return false;
20
18
  }
21
-
22
19
  return new Set(markTypes).size !== markTypes.length;
23
20
  };
24
-
25
21
  const maybeRemoveDisallowedDuplicateMarks = node => {
26
22
  const quota = new Map();
27
23
  const annotationsQuota = new Map();
@@ -29,21 +25,16 @@ const maybeRemoveDisallowedDuplicateMarks = node => {
29
25
  markDuplicatesDisallowed.forEach(mark => {
30
26
  quota.set(mark, false);
31
27
  });
32
-
33
28
  if (!node.marks) {
34
29
  return {
35
30
  discardedMarks
36
31
  };
37
32
  }
38
-
39
33
  let dedupedMarks = node.marks.filter(mark => {
40
34
  const markType = mark.type;
41
-
42
35
  if (markType === 'annotation') {
43
36
  var _mark$attrs;
44
-
45
37
  const id = (_mark$attrs = mark.attrs) === null || _mark$attrs === void 0 ? void 0 : _mark$attrs.id;
46
-
47
38
  if (annotationsQuota.has(id)) {
48
39
  discardedMarks.push(mark);
49
40
  return false;
@@ -52,7 +43,6 @@ const maybeRemoveDisallowedDuplicateMarks = node => {
52
43
  return true;
53
44
  }
54
45
  }
55
-
56
46
  if (quota.has(markType)) {
57
47
  if (!quota.get(markType)) {
58
48
  quota.set(markType, true);
@@ -62,17 +52,16 @@ const maybeRemoveDisallowedDuplicateMarks = node => {
62
52
  return false;
63
53
  }
64
54
  }
65
-
66
55
  return true;
67
56
  });
68
57
  return {
69
- node: { ...node,
58
+ node: {
59
+ ...node,
70
60
  marks: dedupedMarks
71
61
  },
72
62
  discardedMarks
73
63
  };
74
64
  };
75
-
76
65
  export const transformDedupeMarks = adf => {
77
66
  let isTransformed = false;
78
67
  let discardedMarks = [];
@@ -81,7 +70,6 @@ export const transformDedupeMarks = adf => {
81
70
  if (maybeHasDisallowedDuplicateMarks(node)) {
82
71
  const result = maybeRemoveDisallowedDuplicateMarks(node);
83
72
  const resultDiscardedMarks = result.discardedMarks;
84
-
85
73
  if (resultDiscardedMarks.length) {
86
74
  discardedMarks.push(...resultDiscardedMarks);
87
75
  isTransformed = true;
@@ -1,5 +1,4 @@
1
1
  export const isEmpty = node => {
2
2
  var _node$content;
3
-
4
3
  return !(node !== null && node !== void 0 && (_node$content = node.content) !== null && _node$content !== void 0 && _node$content.length);
5
4
  };
@@ -1,33 +1,27 @@
1
1
  import { traverse } from '../traverse/traverse';
2
-
3
2
  const hasChildHeadingWithIndentation = node => {
4
3
  var _node$content$some, _node$content;
5
-
6
4
  return (_node$content$some = (_node$content = node.content) === null || _node$content === void 0 ? void 0 : _node$content.some(childNode => {
7
5
  var _childNode$marks;
8
-
9
6
  return (childNode === null || childNode === void 0 ? void 0 : childNode.type) === 'heading' && (childNode === null || childNode === void 0 ? void 0 : (_childNode$marks = childNode.marks) === null || _childNode$marks === void 0 ? void 0 : _childNode$marks.some(mark => mark.type === 'indentation'));
10
7
  })) !== null && _node$content$some !== void 0 ? _node$content$some : false;
11
8
  };
12
-
13
9
  const removeIndentationFromHeadings = node => {
14
10
  var _node$content2;
15
-
16
- return { ...node,
11
+ return {
12
+ ...node,
17
13
  content: (_node$content2 = node.content) === null || _node$content2 === void 0 ? void 0 : _node$content2.map(childNode => {
18
14
  if ((childNode === null || childNode === void 0 ? void 0 : childNode.type) === 'heading') {
19
15
  var _childNode$marks2;
20
-
21
- return { ...childNode,
16
+ return {
17
+ ...childNode,
22
18
  marks: (_childNode$marks2 = childNode.marks) === null || _childNode$marks2 === void 0 ? void 0 : _childNode$marks2.filter(mark => mark.type !== 'indentation')
23
19
  };
24
20
  }
25
-
26
21
  return childNode;
27
22
  })
28
23
  };
29
24
  };
30
-
31
25
  export const transformIndentationMarks = adf => {
32
26
  let isTransformed = false;
33
27
  const transformedAdf = traverse(adf, {
@@ -36,6 +30,12 @@ export const transformIndentationMarks = adf => {
36
30
  isTransformed = true;
37
31
  return removeIndentationFromHeadings(node);
38
32
  }
33
+ },
34
+ tableHeader: node => {
35
+ if (hasChildHeadingWithIndentation(node)) {
36
+ isTransformed = true;
37
+ return removeIndentationFromHeadings(node);
38
+ }
39
39
  }
40
40
  });
41
41
  return {
@@ -1,69 +1,59 @@
1
1
  import { traverse } from '../traverse/traverse';
2
2
  import { isEmpty } from './helpers';
3
-
4
3
  const getChildrenTypeCounts = (nodeContent, allowedTypes) => {
5
4
  let childrenTypes = {};
6
5
  nodeContent.forEach((childNode, index) => {
7
6
  if (!(childNode !== null && childNode !== void 0 && childNode.type) || !allowedTypes.includes(childNode.type)) {
8
7
  return;
9
8
  }
10
-
11
9
  if (!childrenTypes[childNode.type]) {
12
10
  childrenTypes[childNode.type] = 1;
13
11
  return;
14
12
  }
15
-
16
13
  childrenTypes[childNode.type]++;
17
14
  });
18
15
  return childrenTypes;
19
16
  };
20
-
21
17
  const removeDuplicatedNodes = (type, content, predicate) => {
22
18
  let maxIterations = 10;
23
19
  let childrenTypeCounts = getChildrenTypeCounts(content, [type])[type];
24
20
  let firstPredicateNodeIndex = content.findIndex(predicate);
25
-
26
21
  while (childrenTypeCounts > 1 && firstPredicateNodeIndex > -1 && maxIterations-- > 0) {
27
22
  content.splice(firstPredicateNodeIndex, 1);
28
23
  firstPredicateNodeIndex = content.findIndex(predicate);
29
24
  childrenTypeCounts = getChildrenTypeCounts(content, [type])[type];
30
25
  }
31
26
  };
27
+
32
28
  /**
33
29
  * @param {{[type:string]:number}} allowedTypes - array types allowed to deduplicate
34
30
  */
35
-
36
-
37
31
  const deduplicateMediaSingleChildren = (node, allowedTypes) => {
38
32
  if (!node.content) {
39
33
  return;
40
34
  }
41
-
42
35
  const content = [...node.content];
43
36
  Object.keys(allowedTypes).forEach(type => {
44
37
  //prioritise removing empty nodes first
45
- removeDuplicatedNodes(type, content, node => (node === null || node === void 0 ? void 0 : node.type) === type && isEmpty(node)); //remove other remaining dupicates
46
-
38
+ removeDuplicatedNodes(type, content, node => (node === null || node === void 0 ? void 0 : node.type) === type && isEmpty(node));
39
+ //remove other remaining dupicates
47
40
  removeDuplicatedNodes(type, content, node => (node === null || node === void 0 ? void 0 : node.type) === type);
48
41
  });
49
- return { ...node,
42
+ return {
43
+ ...node,
50
44
  content
51
45
  };
52
46
  };
53
-
54
47
  export const transformInvalidMediaContent = adf => {
55
48
  let isTransformed = false;
56
49
  const transformedAdf = traverse(adf, {
57
50
  mediaSingle: node => {
58
51
  var _node$content;
59
-
60
52
  if (!(node !== null && node !== void 0 && (_node$content = node.content) !== null && _node$content !== void 0 && _node$content.length)) {
61
53
  return;
62
54
  }
63
-
64
55
  const disallowedDuplicateTypes = ['media', 'caption'];
65
56
  const childrenTypes = getChildrenTypeCounts(node.content, disallowedDuplicateTypes);
66
-
67
57
  if (Object.values(childrenTypes).some(occurences => occurences > 1)) {
68
58
  isTransformed = true;
69
59
  return deduplicateMediaSingleChildren(node, childrenTypes);
@@ -6,38 +6,31 @@ export const transformMediaLinkMarks = adf => {
6
6
  const transformedAdf = traverse(adf, {
7
7
  mediaSingle: node => {
8
8
  var _node$content$;
9
-
10
9
  if (!node.marks || !node.content || ((_node$content$ = node.content[0]) === null || _node$content$ === void 0 ? void 0 : _node$content$.type) !== 'media') {
11
10
  return node;
12
11
  }
13
-
14
12
  let linkMark = null;
15
13
  node.marks.forEach((mark, i) => {
16
14
  if (mark.type === 'link') {
17
15
  var _node$marks;
18
-
19
16
  linkMark = mark;
20
17
  (_node$marks = node.marks) === null || _node$marks === void 0 ? void 0 : _node$marks.splice(i, 1);
21
18
  isTransformed = true;
22
19
  }
23
20
  });
24
-
25
21
  if (node.marks.length === 0) {
26
22
  delete node.marks;
27
23
  }
28
-
29
24
  if (linkMark) {
30
25
  var _mediaNode$marks;
31
-
32
- const mediaNode = node.content[0]; // only add link mark if media node doesnt already have one
33
-
26
+ const mediaNode = node.content[0];
27
+ // only add link mark if media node doesnt already have one
34
28
  if ((_mediaNode$marks = mediaNode.marks) !== null && _mediaNode$marks !== void 0 && _mediaNode$marks.every(mark => mark.type !== 'link')) {
35
29
  mediaNode.marks.push(linkMark);
36
30
  } else if (!mediaNode.marks) {
37
31
  mediaNode.marks = [linkMark];
38
32
  }
39
33
  }
40
-
41
34
  return node;
42
35
  }
43
36
  });