@atlaskit/adf-utils 14.3.0 → 16.0.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.
Files changed (122) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/cjs/builders/marks/fragment.js +19 -0
  3. package/dist/cjs/builders/nodes/mention.js +2 -2
  4. package/dist/cjs/builders/utils/create-text-nodes.js +1 -1
  5. package/dist/cjs/builders/utils/is-duplicate-mark.js +1 -1
  6. package/dist/cjs/builders.js +128 -120
  7. package/dist/cjs/index.js +53 -37
  8. package/dist/cjs/media-link-transform.js +60 -0
  9. package/dist/cjs/scrub/default-node-replacements.js +2 -2
  10. package/dist/cjs/scrub/scrub-adf.js +2 -2
  11. package/dist/cjs/scrub/scrub-content.js +3 -3
  12. package/dist/cjs/transforms/text-link-code-transform.js +58 -0
  13. package/dist/cjs/traverse/traverse.js +3 -3
  14. package/dist/cjs/traverse.js +4 -4
  15. package/dist/cjs/validator/rules.js +13 -0
  16. package/dist/cjs/validator/specs/atomic_inline.js +1 -1
  17. package/dist/cjs/validator/specs/blockCard.js +2 -1
  18. package/dist/cjs/validator/specs/block_content.js +1 -1
  19. package/dist/cjs/validator/specs/bodiedExtension_with_marks.js +1 -1
  20. package/dist/cjs/validator/specs/doc.js +1 -1
  21. package/dist/cjs/validator/specs/embedCard.js +2 -1
  22. package/dist/cjs/validator/specs/extension_with_marks.js +1 -1
  23. package/dist/cjs/validator/specs/fragment.js +27 -0
  24. package/dist/cjs/validator/specs/index.js +164 -180
  25. package/dist/cjs/validator/specs/inline.js +1 -1
  26. package/dist/cjs/validator/specs/inlineCard.js +2 -1
  27. package/dist/cjs/validator/specs/inlineExtension_with_marks.js +1 -1
  28. package/dist/cjs/validator/specs/link.js +2 -1
  29. package/dist/cjs/validator/specs/non_nestable_block_content.js +1 -1
  30. package/dist/cjs/validator/specs/panel.js +8 -0
  31. package/dist/cjs/validator/specs/table.js +5 -0
  32. package/dist/cjs/validator/specs/tableCell_content.js +1 -1
  33. package/dist/cjs/validator/utils.js +1 -1
  34. package/dist/cjs/validator/validator.js +15 -5
  35. package/dist/cjs/version.json +1 -1
  36. package/dist/es2019/builders/marks/fragment.js +7 -0
  37. package/dist/es2019/builders.js +2 -1
  38. package/dist/es2019/index.js +3 -1
  39. package/dist/es2019/media-link-transform.js +48 -0
  40. package/dist/es2019/transforms/text-link-code-transform.js +37 -0
  41. package/dist/es2019/validator/rules.js +4 -0
  42. package/dist/es2019/validator/specs/atomic_inline.js +1 -1
  43. package/dist/es2019/validator/specs/blockCard.js +2 -1
  44. package/dist/es2019/validator/specs/block_content.js +1 -1
  45. package/dist/es2019/validator/specs/bodiedExtension_with_marks.js +1 -1
  46. package/dist/es2019/validator/specs/doc.js +1 -1
  47. package/dist/es2019/validator/specs/embedCard.js +2 -1
  48. package/dist/es2019/validator/specs/extension_with_marks.js +1 -1
  49. package/dist/es2019/validator/specs/fragment.js +20 -0
  50. package/dist/es2019/validator/specs/index.js +1 -3
  51. package/dist/es2019/validator/specs/inline.js +1 -1
  52. package/dist/es2019/validator/specs/inlineCard.js +2 -1
  53. package/dist/es2019/validator/specs/inlineExtension_with_marks.js +1 -1
  54. package/dist/es2019/validator/specs/link.js +2 -1
  55. package/dist/es2019/validator/specs/non_nestable_block_content.js +1 -1
  56. package/dist/es2019/validator/specs/panel.js +8 -0
  57. package/dist/es2019/validator/specs/table.js +5 -0
  58. package/dist/es2019/validator/specs/tableCell_content.js +1 -1
  59. package/dist/es2019/validator/validator.js +7 -2
  60. package/dist/es2019/version.json +1 -1
  61. package/dist/esm/builders/marks/fragment.js +9 -0
  62. package/dist/esm/builders/nodes/mention.js +2 -2
  63. package/dist/esm/builders.js +2 -1
  64. package/dist/esm/index.js +3 -1
  65. package/dist/esm/media-link-transform.js +50 -0
  66. package/dist/esm/scrub/default-node-replacements.js +2 -2
  67. package/dist/esm/scrub/scrub-adf.js +2 -2
  68. package/dist/esm/scrub/scrub-content.js +2 -2
  69. package/dist/esm/transforms/text-link-code-transform.js +47 -0
  70. package/dist/esm/traverse/traverse.js +2 -2
  71. package/dist/esm/validator/rules.js +4 -0
  72. package/dist/esm/validator/specs/atomic_inline.js +1 -1
  73. package/dist/esm/validator/specs/blockCard.js +2 -1
  74. package/dist/esm/validator/specs/block_content.js +1 -1
  75. package/dist/esm/validator/specs/bodiedExtension_with_marks.js +1 -1
  76. package/dist/esm/validator/specs/doc.js +1 -1
  77. package/dist/esm/validator/specs/embedCard.js +2 -1
  78. package/dist/esm/validator/specs/extension_with_marks.js +1 -1
  79. package/dist/esm/validator/specs/fragment.js +20 -0
  80. package/dist/esm/validator/specs/index.js +1 -3
  81. package/dist/esm/validator/specs/inline.js +1 -1
  82. package/dist/esm/validator/specs/inlineCard.js +2 -1
  83. package/dist/esm/validator/specs/inlineExtension_with_marks.js +1 -1
  84. package/dist/esm/validator/specs/link.js +2 -1
  85. package/dist/esm/validator/specs/non_nestable_block_content.js +1 -1
  86. package/dist/esm/validator/specs/panel.js +8 -0
  87. package/dist/esm/validator/specs/table.js +5 -0
  88. package/dist/esm/validator/specs/tableCell_content.js +1 -1
  89. package/dist/esm/validator/validator.js +13 -5
  90. package/dist/esm/version.json +1 -1
  91. package/dist/types/builders/marks/fragment.d.ts +3 -0
  92. package/dist/types/builders.d.ts +1 -0
  93. package/dist/types/index.d.ts +2 -0
  94. package/dist/types/media-link-transform.d.ts +5 -0
  95. package/dist/types/transforms/text-link-code-transform.d.ts +5 -0
  96. package/dist/types/types/validatorTypes.d.ts +1 -0
  97. package/dist/types/validator/rules.d.ts +3 -0
  98. package/dist/types/validator/specs/blockCard.d.ts +1 -0
  99. package/dist/types/validator/specs/bodiedExtension_with_marks.d.ts +1 -1
  100. package/dist/types/validator/specs/embedCard.d.ts +1 -0
  101. package/dist/types/validator/specs/extension_with_marks.d.ts +1 -1
  102. package/dist/types/validator/specs/fragment.d.ts +21 -0
  103. package/dist/types/validator/specs/index.d.ts +1 -3
  104. package/dist/types/validator/specs/inlineCard.d.ts +1 -0
  105. package/dist/types/validator/specs/inlineExtension_with_marks.d.ts +1 -1
  106. package/dist/types/validator/specs/link.d.ts +1 -0
  107. package/dist/types/validator/specs/panel.d.ts +8 -0
  108. package/dist/types/validator/specs/table.d.ts +5 -0
  109. package/media-link-transform/package.json +7 -0
  110. package/package.json +6 -3
  111. package/dist/cjs/validator/specs/bodiedExtension_with_no_marks.js +0 -17
  112. package/dist/cjs/validator/specs/extension_with_no_marks.js +0 -17
  113. package/dist/cjs/validator/specs/inlineExtension_with_no_marks.js +0 -17
  114. package/dist/es2019/validator/specs/bodiedExtension_with_no_marks.js +0 -10
  115. package/dist/es2019/validator/specs/extension_with_no_marks.js +0 -10
  116. package/dist/es2019/validator/specs/inlineExtension_with_no_marks.js +0 -10
  117. package/dist/esm/validator/specs/bodiedExtension_with_no_marks.js +0 -10
  118. package/dist/esm/validator/specs/extension_with_no_marks.js +0 -10
  119. package/dist/esm/validator/specs/inlineExtension_with_no_marks.js +0 -10
  120. package/dist/types/validator/specs/bodiedExtension_with_no_marks.d.ts +0 -11
  121. package/dist/types/validator/specs/extension_with_no_marks.d.ts +0 -11
  122. package/dist/types/validator/specs/inlineExtension_with_no_marks.d.ts +0 -11
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = ['hardBreak', 'mention', 'emoji', 'inlineExtension_with_no_marks', 'inlineExtension_with_marks', 'date', 'placeholder', 'inlineCard', 'status', 'mediaInline', 'formatted_text_inline', 'code_inline'];
7
+ var _default = ['hardBreak', 'mention', 'emoji', 'inlineExtension_with_marks', 'date', 'placeholder', 'inlineCard', 'status', 'mediaInline', 'formatted_text_inline', 'code_inline'];
8
8
  exports.default = _default;
@@ -13,7 +13,8 @@ var _default = {
13
13
  attrs: [{
14
14
  props: {
15
15
  url: {
16
- type: 'string'
16
+ type: 'string',
17
+ validatorFn: 'safeUrl'
17
18
  }
18
19
  }
19
20
  }, {
@@ -8,7 +8,7 @@ var _default = ['inlineExtension', {
8
8
  props: {
9
9
  marks: {
10
10
  type: 'array',
11
- items: ['dataConsumer'],
11
+ items: [['dataConsumer', 'fragment']],
12
12
  optional: true
13
13
  }
14
14
  }
@@ -13,7 +13,8 @@ var _default = {
13
13
  attrs: {
14
14
  props: {
15
15
  href: {
16
- type: 'string'
16
+ type: 'string',
17
+ validatorFn: 'safeUrl'
17
18
  },
18
19
  title: {
19
20
  type: 'string',
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = ['blockCard', 'paragraph_with_no_marks', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'orderedList', 'heading_with_no_marks', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_no_marks', 'extension_with_marks', 'embedCard', 'table'];
7
+ var _default = ['blockCard', 'paragraph_with_no_marks', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'orderedList', 'heading_with_no_marks', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_marks', 'embedCard', 'table'];
8
8
  exports.default = _default;
@@ -23,6 +23,14 @@ var _default = {
23
23
  panelColor: {
24
24
  type: 'string',
25
25
  optional: true
26
+ },
27
+ panelIconId: {
28
+ type: 'string',
29
+ optional: true
30
+ },
31
+ panelIconText: {
32
+ type: 'string',
33
+ optional: true
26
34
  }
27
35
  }
28
36
  },
@@ -33,6 +33,11 @@ var _default = {
33
33
  type: 'array',
34
34
  items: ['tableRow'],
35
35
  minItems: 1
36
+ },
37
+ marks: {
38
+ type: 'array',
39
+ items: ['fragment'],
40
+ optional: true
36
41
  }
37
42
  }
38
43
  };
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _default = {
8
8
  type: 'array',
9
- items: [['blockCard', 'paragraph_with_no_marks', 'paragraph_with_alignment', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'orderedList', 'heading_with_no_marks', 'heading_with_alignment', 'heading_with_indentation', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_no_marks', 'extension_with_marks', 'embedCard', 'nestedExpand_with_no_marks']],
9
+ items: [['blockCard', 'paragraph_with_no_marks', 'paragraph_with_alignment', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'orderedList', 'heading_with_no_marks', 'heading_with_alignment', 'heading_with_indentation', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_marks', 'embedCard', 'nestedExpand_with_no_marks']],
10
10
  minItems: 1,
11
11
  allowUnsupportedBlock: true
12
12
  };
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.makeArray = exports.copy = exports.isPlainObject = exports.isString = exports.isBoolean = exports.isInteger = exports.isNumber = exports.isDefined = void 0;
8
+ exports.makeArray = exports.isString = exports.isPlainObject = exports.isNumber = exports.isInteger = exports.isDefined = exports.isBoolean = exports.copy = void 0;
9
9
 
10
10
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
11
 
@@ -20,13 +20,17 @@ var specs = _interopRequireWildcard(require("./specs"));
20
20
 
21
21
  var _utils = require("./utils");
22
22
 
23
+ var _rules = require("./rules");
24
+
25
+ var _excluded = ["items"];
26
+
23
27
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
24
28
 
25
29
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
26
30
 
27
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
31
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
28
32
 
29
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
33
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
30
34
 
31
35
  function mapMarksItems(spec) {
32
36
  var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (x) {
@@ -36,7 +40,7 @@ function mapMarksItems(spec) {
36
40
  if (spec.props && spec.props.marks) {
37
41
  var _ref = spec.props.marks,
38
42
  items = _ref.items,
39
- rest = (0, _objectWithoutProperties2.default)(_ref, ["items"]);
43
+ rest = (0, _objectWithoutProperties2.default)(_ref, _excluded);
40
44
  return _objectSpread(_objectSpread({}, spec), {}, {
41
45
  props: _objectSpread(_objectSpread({}, spec.props), {}, {
42
46
  marks: _objectSpread(_objectSpread({}, rest), {}, {
@@ -99,7 +103,9 @@ function createSpec(nodes, marks) {
99
103
  spec.props.content = _objectSpread({}, spec.props.content);
100
104
  }
101
105
 
102
- spec.props.content.items = spec.props.content.items.map(function (item) {
106
+ spec.props.content.items = spec.props.content.items // ['inline'] => [['emoji', 'hr', ...]]
107
+ // ['media'] => [['media']]
108
+ .map(function (item) {
103
109
  return (0, _utils.isString)(item) ? Array.isArray(specs[item]) ? specs[item] : [item] : item;
104
110
  }) // [['emoji', 'hr', 'inline_code']] => [['emoji', 'hr', ['text', { marks: {} }]]]
105
111
  .map(function (item) {
@@ -194,7 +200,11 @@ function validateAttrs(spec, value) {
194
200
  return (0, _utils.isInteger)(value) && ((0, _utils.isDefined)(spec.minimum) ? spec.minimum <= value : true) && ((0, _utils.isDefined)(spec.maximum) ? spec.maximum >= value : true);
195
201
 
196
202
  case 'string':
197
- return (0, _utils.isString)(value) && ((0, _utils.isDefined)(spec.minLength) ? spec.minLength <= value.length : true) && (spec.pattern ? new RegExp(spec.pattern).test(value) : true);
203
+ var validatorFnPassed = function validatorFnPassed(rule) {
204
+ return typeof value === 'string' && (0, _utils.isDefined)(_rules.validatorFnMap[rule]) && _rules.validatorFnMap[rule](value);
205
+ };
206
+
207
+ return (0, _utils.isString)(value) && ((0, _utils.isDefined)(spec.minLength) ? spec.minLength <= value.length : true) && ((0, _utils.isDefined)(spec.validatorFn) ? validatorFnPassed(spec.validatorFn) : true) && (spec.pattern ? new RegExp(spec.pattern).test(value) : true);
198
208
 
199
209
  case 'object':
200
210
  return (0, _utils.isPlainObject)(value);
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/adf-utils",
3
- "version": "14.3.0",
3
+ "version": "16.0.0",
4
4
  "sideEffects": false
5
5
  }
@@ -0,0 +1,7 @@
1
+ import { applyMark } from '../utils/apply-mark';
2
+ export const fragment = attrs => maybeNode => {
3
+ return applyMark({
4
+ type: 'fragment',
5
+ attrs
6
+ }, maybeNode);
7
+ };
@@ -13,7 +13,8 @@ export { underline } from './builders/marks/underline';
13
13
  export { underline as u } from './builders/marks/underline';
14
14
  export { alignment } from './builders/marks/alignment';
15
15
  export { indentation } from './builders/marks/indentation';
16
- export { dataConsumer } from './builders/marks/data-consumer'; // Nodes Builders
16
+ export { dataConsumer } from './builders/marks/data-consumer';
17
+ export { fragment } from './builders/marks/fragment'; // Nodes Builders
17
18
 
18
19
  export { blockQuote } from './builders/nodes/blockquote';
19
20
  export { bodiedExtension } from './builders/nodes/bodied-extension';
@@ -2,4 +2,6 @@ export { a, alignment, b, blockCard, blockQuote, bodiedExtension, br, breakout,
2
2
  export { filter, map, reduce, traverse } from './traverse';
3
3
  export { scrubAdf } from './scrub';
4
4
  export { validateAttrs, validator } from './validator';
5
- export { getEmptyADF } from './empty-adf';
5
+ export { getEmptyADF } from './empty-adf';
6
+ export { transformMediaLinkMarks } from './media-link-transform';
7
+ export { transformTextLinkCodeMarks } from './transforms/text-link-code-transform';
@@ -0,0 +1,48 @@
1
+ import { traverse } from './traverse/traverse';
2
+ // link mark on mediaSingle is deprecated, need to move link mark to child media node
3
+ // https://product-fabric.atlassian.net/browse/ED-14043
4
+ export const transformMediaLinkMarks = adf => {
5
+ let isTransformed = false;
6
+ const transformedAdf = traverse(adf, {
7
+ mediaSingle: node => {
8
+ var _node$content$;
9
+
10
+ if (!node.marks || !node.content || ((_node$content$ = node.content[0]) === null || _node$content$ === void 0 ? void 0 : _node$content$.type) !== 'media') {
11
+ return node;
12
+ }
13
+
14
+ let linkMark = null;
15
+ node.marks.forEach((mark, i) => {
16
+ if (mark.type === 'link') {
17
+ var _node$marks;
18
+
19
+ linkMark = mark;
20
+ (_node$marks = node.marks) === null || _node$marks === void 0 ? void 0 : _node$marks.splice(i, 1);
21
+ isTransformed = true;
22
+ }
23
+ });
24
+
25
+ if (node.marks.length === 0) {
26
+ delete node.marks;
27
+ }
28
+
29
+ if (linkMark) {
30
+ var _mediaNode$marks;
31
+
32
+ const mediaNode = node.content[0]; // only add link mark if media node doesnt already have one
33
+
34
+ if ((_mediaNode$marks = mediaNode.marks) !== null && _mediaNode$marks !== void 0 && _mediaNode$marks.every(mark => mark.type !== 'link')) {
35
+ mediaNode.marks.push(linkMark);
36
+ } else if (!mediaNode.marks) {
37
+ mediaNode.marks = [linkMark];
38
+ }
39
+ }
40
+
41
+ return node;
42
+ }
43
+ });
44
+ return {
45
+ transformedAdf,
46
+ isTransformed
47
+ };
48
+ };
@@ -0,0 +1,37 @@
1
+ import { traverse } from '../traverse/traverse';
2
+
3
+ const hasLinkAndCodeMarks = node => {
4
+ var _node$marks;
5
+
6
+ const marks = (_node$marks = node.marks) === null || _node$marks === void 0 ? void 0 : _node$marks.map(mark => mark.type);
7
+ return (marks === null || marks === void 0 ? void 0 : marks.includes('link')) && (marks === null || marks === void 0 ? void 0 : marks.includes('code'));
8
+ };
9
+
10
+ const removeCodeMarks = node => {
11
+ if (node.marks) {
12
+ return { ...node,
13
+ marks: node.marks.filter(mark => mark.type !== 'code')
14
+ };
15
+ }
16
+
17
+ return node;
18
+ }; // See: HOT-97965 https://product-fabric.atlassian.net/browse/ED-14400
19
+ // We declared in code mark spec that links and marks should not co-exist on
20
+ // text nodes. This util strips code marks from bad text nodes and preserves links.
21
+
22
+
23
+ export const transformTextLinkCodeMarks = adf => {
24
+ let isTransformed = false;
25
+ const transformedAdf = traverse(adf, {
26
+ text: node => {
27
+ if (hasLinkAndCodeMarks(node)) {
28
+ isTransformed = true;
29
+ return removeCodeMarks(node);
30
+ }
31
+ }
32
+ });
33
+ return {
34
+ transformedAdf,
35
+ isTransformed
36
+ };
37
+ };
@@ -0,0 +1,4 @@
1
+ import { isSafeUrl } from '@atlaskit/adf-schema/url';
2
+ export const validatorFnMap = {
3
+ safeUrl: isSafeUrl
4
+ };
@@ -1 +1 @@
1
- export default ['hardBreak', 'mention', 'emoji', 'inlineExtension_with_no_marks', 'date', 'placeholder', 'inlineCard', 'status', 'mediaInline'];
1
+ export default ['hardBreak', 'mention', 'emoji', 'inlineExtension_with_marks', 'date', 'placeholder', 'inlineCard', 'status', 'mediaInline'];
@@ -7,7 +7,8 @@ export default {
7
7
  attrs: [{
8
8
  props: {
9
9
  url: {
10
- type: 'string'
10
+ type: 'string',
11
+ validatorFn: 'safeUrl'
11
12
  }
12
13
  }
13
14
  }, {
@@ -1 +1 @@
1
- export default ['blockCard', 'paragraph_with_no_marks', 'paragraph_with_alignment', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'orderedList', 'heading_with_no_marks', 'heading_with_alignment', 'heading_with_indentation', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_no_marks', 'extension_with_marks', 'embedCard', 'table', 'expand_with_no_mark', 'bodiedExtension_with_no_marks', 'bodiedExtension_with_marks'];
1
+ export default ['blockCard', 'paragraph_with_no_marks', 'paragraph_with_alignment', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'orderedList', 'heading_with_no_marks', 'heading_with_alignment', 'heading_with_indentation', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_marks', 'embedCard', 'table', 'expand_with_no_mark', 'bodiedExtension_with_marks'];
@@ -2,7 +2,7 @@ export default ['bodiedExtension', {
2
2
  props: {
3
3
  marks: {
4
4
  type: 'array',
5
- items: ['dataConsumer'],
5
+ items: [['dataConsumer', 'fragment']],
6
6
  optional: true
7
7
  }
8
8
  }
@@ -10,7 +10,7 @@ export default {
10
10
  },
11
11
  content: {
12
12
  type: 'array',
13
- items: [['blockCard', 'paragraph_with_no_marks', 'paragraph_with_alignment', 'paragraph_with_indentation', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'codeBlock_with_marks', 'orderedList', 'heading_with_no_marks', 'heading_with_alignment', 'heading_with_indentation', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_no_marks', 'extension_with_marks', 'embedCard', 'table', 'expand_with_no_mark', 'expand_with_breakout_mark', 'bodiedExtension_with_no_marks', 'bodiedExtension_with_marks', 'layoutSection_full', 'layoutSection_with_single_column']],
13
+ items: [['blockCard', 'paragraph_with_no_marks', 'paragraph_with_alignment', 'paragraph_with_indentation', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'codeBlock_with_marks', 'orderedList', 'heading_with_no_marks', 'heading_with_alignment', 'heading_with_indentation', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_marks', 'embedCard', 'table', 'expand_with_no_mark', 'expand_with_breakout_mark', 'bodiedExtension_with_marks', 'layoutSection_full', 'layoutSection_with_single_column']],
14
14
  allowUnsupportedBlock: true
15
15
  }
16
16
  }
@@ -15,7 +15,8 @@ export default {
15
15
  optional: true
16
16
  },
17
17
  url: {
18
- type: 'string'
18
+ type: 'string',
19
+ validatorFn: 'safeUrl'
19
20
  },
20
21
  width: {
21
22
  type: 'number',
@@ -2,7 +2,7 @@ export default ['extension', {
2
2
  props: {
3
3
  marks: {
4
4
  type: 'array',
5
- items: ['dataConsumer'],
5
+ items: [['dataConsumer', 'fragment']],
6
6
  optional: true
7
7
  }
8
8
  }
@@ -0,0 +1,20 @@
1
+ export default {
2
+ props: {
3
+ type: {
4
+ type: 'enum',
5
+ values: ['fragment']
6
+ },
7
+ attrs: {
8
+ props: {
9
+ localId: {
10
+ type: 'string',
11
+ minLength: 1
12
+ },
13
+ name: {
14
+ type: 'string',
15
+ optional: true
16
+ }
17
+ }
18
+ }
19
+ }
20
+ };
@@ -13,11 +13,11 @@ export { default as alignment } from './alignment';
13
13
  export { default as indentation } from './indentation';
14
14
  export { default as annotation } from './annotation';
15
15
  export { default as dataConsumer } from './dataConsumer';
16
+ export { default as fragment } from './fragment';
16
17
  export { default as hardBreak } from './hardBreak';
17
18
  export { default as mention } from './mention';
18
19
  export { default as emoji } from './emoji';
19
20
  export { default as inlineExtension } from './inlineExtension';
20
- export { default as inlineExtension_with_no_marks } from './inlineExtension_with_no_marks';
21
21
  export { default as inlineExtension_with_marks } from './inlineExtension_with_marks';
22
22
  export { default as date } from './date';
23
23
  export { default as placeholder } from './placeholder';
@@ -59,7 +59,6 @@ export { default as decisionList } from './decisionList';
59
59
  export { default as taskItem } from './taskItem';
60
60
  export { default as taskList } from './taskList';
61
61
  export { default as extension } from './extension';
62
- export { default as extension_with_no_marks } from './extension_with_no_marks';
63
62
  export { default as extension_with_marks } from './extension_with_marks';
64
63
  export { default as embedCard } from './embedCard';
65
64
  export { default as nestedExpand_content } from './nestedExpand_content';
@@ -75,7 +74,6 @@ export { default as expand } from './expand';
75
74
  export { default as expand_with_no_mark } from './expand_with_no_mark';
76
75
  export { default as expand_with_breakout_mark } from './expand_with_breakout_mark';
77
76
  export { default as bodiedExtension } from './bodiedExtension';
78
- export { default as bodiedExtension_with_no_marks } from './bodiedExtension_with_no_marks';
79
77
  export { default as bodiedExtension_with_marks } from './bodiedExtension_with_marks';
80
78
  export { default as block_content } from './block_content';
81
79
  export { default as layoutColumn } from './layoutColumn';
@@ -1 +1 @@
1
- export default ['hardBreak', 'mention', 'emoji', 'inlineExtension_with_no_marks', 'inlineExtension_with_marks', 'date', 'placeholder', 'inlineCard', 'status', 'mediaInline', 'formatted_text_inline', 'code_inline'];
1
+ export default ['hardBreak', 'mention', 'emoji', 'inlineExtension_with_marks', 'date', 'placeholder', 'inlineCard', 'status', 'mediaInline', 'formatted_text_inline', 'code_inline'];
@@ -7,7 +7,8 @@ export default {
7
7
  attrs: [{
8
8
  props: {
9
9
  url: {
10
- type: 'string'
10
+ type: 'string',
11
+ validatorFn: 'safeUrl'
11
12
  }
12
13
  }
13
14
  }, {
@@ -2,7 +2,7 @@ export default ['inlineExtension', {
2
2
  props: {
3
3
  marks: {
4
4
  type: 'array',
5
- items: ['dataConsumer'],
5
+ items: [['dataConsumer', 'fragment']],
6
6
  optional: true
7
7
  }
8
8
  }
@@ -7,7 +7,8 @@ export default {
7
7
  attrs: {
8
8
  props: {
9
9
  href: {
10
- type: 'string'
10
+ type: 'string',
11
+ validatorFn: 'safeUrl'
11
12
  },
12
13
  title: {
13
14
  type: 'string',
@@ -1 +1 @@
1
- export default ['blockCard', 'paragraph_with_no_marks', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'orderedList', 'heading_with_no_marks', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_no_marks', 'extension_with_marks', 'embedCard', 'table'];
1
+ export default ['blockCard', 'paragraph_with_no_marks', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'orderedList', 'heading_with_no_marks', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_marks', 'embedCard', 'table'];
@@ -17,6 +17,14 @@ export default {
17
17
  panelColor: {
18
18
  type: 'string',
19
19
  optional: true
20
+ },
21
+ panelIconId: {
22
+ type: 'string',
23
+ optional: true
24
+ },
25
+ panelIconText: {
26
+ type: 'string',
27
+ optional: true
20
28
  }
21
29
  }
22
30
  },
@@ -27,6 +27,11 @@ export default {
27
27
  type: 'array',
28
28
  items: ['tableRow'],
29
29
  minItems: 1
30
+ },
31
+ marks: {
32
+ type: 'array',
33
+ items: ['fragment'],
34
+ optional: true
30
35
  }
31
36
  }
32
37
  };
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  type: 'array',
3
- items: [['blockCard', 'paragraph_with_no_marks', 'paragraph_with_alignment', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'orderedList', 'heading_with_no_marks', 'heading_with_alignment', 'heading_with_indentation', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_no_marks', 'extension_with_marks', 'embedCard', 'nestedExpand_with_no_marks']],
3
+ items: [['blockCard', 'paragraph_with_no_marks', 'paragraph_with_alignment', 'bulletList', 'mediaSingle_full', 'mediaSingle_caption', 'codeBlock_with_no_marks', 'orderedList', 'heading_with_no_marks', 'heading_with_alignment', 'heading_with_indentation', 'panel', 'blockquote', 'rule', 'mediaGroup', 'decisionList', 'taskList', 'extension_with_marks', 'embedCard', 'nestedExpand_with_no_marks']],
4
4
  minItems: 1,
5
5
  allowUnsupportedBlock: true
6
6
  };
@@ -1,5 +1,6 @@
1
1
  import * as specs from './specs';
2
2
  import { copy, isBoolean, isDefined, isInteger, isNumber, isPlainObject, isString, makeArray } from './utils';
3
+ import { validatorFnMap } from './rules';
3
4
 
4
5
  function mapMarksItems(spec, fn = x => x) {
5
6
  if (spec.props && spec.props.marks) {
@@ -69,7 +70,9 @@ function createSpec(nodes, marks) {
69
70
  };
70
71
  }
71
72
 
72
- spec.props.content.items = spec.props.content.items.map(item => isString(item) ? Array.isArray(specs[item]) ? specs[item] : [item] : item) // [['emoji', 'hr', 'inline_code']] => [['emoji', 'hr', ['text', { marks: {} }]]]
73
+ spec.props.content.items = spec.props.content.items // ['inline'] => [['emoji', 'hr', ...]]
74
+ // ['media'] => [['media']]
75
+ .map(item => isString(item) ? Array.isArray(specs[item]) ? specs[item] : [item] : item) // [['emoji', 'hr', 'inline_code']] => [['emoji', 'hr', ['text', { marks: {} }]]]
73
76
  .map(item => item.map(subItem => Array.isArray(specs[subItem]) ? specs[subItem] : isString(subItem) ? subItem : // Now `NoMark` produces `items: []`, should be fixed in generator
74
77
  ['text', subItem]) // Remove unsupported nodes & marks
75
78
  // Filter nodes
@@ -151,7 +154,9 @@ export function validateAttrs(spec, value) {
151
154
  return isInteger(value) && (isDefined(spec.minimum) ? spec.minimum <= value : true) && (isDefined(spec.maximum) ? spec.maximum >= value : true);
152
155
 
153
156
  case 'string':
154
- return isString(value) && (isDefined(spec.minLength) ? spec.minLength <= value.length : true) && (spec.pattern ? new RegExp(spec.pattern).test(value) : true);
157
+ const validatorFnPassed = rule => typeof value === 'string' && isDefined(validatorFnMap[rule]) && validatorFnMap[rule](value);
158
+
159
+ return isString(value) && (isDefined(spec.minLength) ? spec.minLength <= value.length : true) && (isDefined(spec.validatorFn) ? validatorFnPassed(spec.validatorFn) : true) && (spec.pattern ? new RegExp(spec.pattern).test(value) : true);
155
160
 
156
161
  case 'object':
157
162
  return isPlainObject(value);
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/adf-utils",
3
- "version": "14.3.0",
3
+ "version": "16.0.0",
4
4
  "sideEffects": false
5
5
  }
@@ -0,0 +1,9 @@
1
+ import { applyMark } from '../utils/apply-mark';
2
+ export var fragment = function fragment(attrs) {
3
+ return function (maybeNode) {
4
+ return applyMark({
5
+ type: 'fragment',
6
+ attrs: attrs
7
+ }, maybeNode);
8
+ };
9
+ };
@@ -1,8 +1,8 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
 
3
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
3
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
4
 
5
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
5
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
6
 
7
7
  export var mention = function mention(attrs) {
8
8
  return {
@@ -13,7 +13,8 @@ export { underline } from './builders/marks/underline';
13
13
  export { underline as u } from './builders/marks/underline';
14
14
  export { alignment } from './builders/marks/alignment';
15
15
  export { indentation } from './builders/marks/indentation';
16
- export { dataConsumer } from './builders/marks/data-consumer'; // Nodes Builders
16
+ export { dataConsumer } from './builders/marks/data-consumer';
17
+ export { fragment } from './builders/marks/fragment'; // Nodes Builders
17
18
 
18
19
  export { blockQuote } from './builders/nodes/blockquote';
19
20
  export { bodiedExtension } from './builders/nodes/bodied-extension';
package/dist/esm/index.js CHANGED
@@ -2,4 +2,6 @@ export { a, alignment, b, blockCard, blockQuote, bodiedExtension, br, breakout,
2
2
  export { filter, map, reduce, traverse } from './traverse';
3
3
  export { scrubAdf } from './scrub';
4
4
  export { validateAttrs, validator } from './validator';
5
- export { getEmptyADF } from './empty-adf';
5
+ export { getEmptyADF } from './empty-adf';
6
+ export { transformMediaLinkMarks } from './media-link-transform';
7
+ export { transformTextLinkCodeMarks } from './transforms/text-link-code-transform';
@@ -0,0 +1,50 @@
1
+ import { traverse } from './traverse/traverse';
2
+ // link mark on mediaSingle is deprecated, need to move link mark to child media node
3
+ // https://product-fabric.atlassian.net/browse/ED-14043
4
+ export var transformMediaLinkMarks = function transformMediaLinkMarks(adf) {
5
+ var isTransformed = false;
6
+ var transformedAdf = traverse(adf, {
7
+ mediaSingle: function mediaSingle(node) {
8
+ var _node$content$;
9
+
10
+ if (!node.marks || !node.content || ((_node$content$ = node.content[0]) === null || _node$content$ === void 0 ? void 0 : _node$content$.type) !== 'media') {
11
+ return node;
12
+ }
13
+
14
+ var linkMark = null;
15
+ node.marks.forEach(function (mark, i) {
16
+ if (mark.type === 'link') {
17
+ var _node$marks;
18
+
19
+ linkMark = mark;
20
+ (_node$marks = node.marks) === null || _node$marks === void 0 ? void 0 : _node$marks.splice(i, 1);
21
+ isTransformed = true;
22
+ }
23
+ });
24
+
25
+ if (node.marks.length === 0) {
26
+ delete node.marks;
27
+ }
28
+
29
+ if (linkMark) {
30
+ var _mediaNode$marks;
31
+
32
+ var mediaNode = node.content[0]; // only add link mark if media node doesnt already have one
33
+
34
+ if ((_mediaNode$marks = mediaNode.marks) !== null && _mediaNode$marks !== void 0 && _mediaNode$marks.every(function (mark) {
35
+ return mark.type !== 'link';
36
+ })) {
37
+ mediaNode.marks.push(linkMark);
38
+ } else if (!mediaNode.marks) {
39
+ mediaNode.marks = [linkMark];
40
+ }
41
+ }
42
+
43
+ return node;
44
+ }
45
+ });
46
+ return {
47
+ transformedAdf: transformedAdf,
48
+ isTransformed: isTransformed
49
+ };
50
+ };