@atlaskit/adf-utils
Version:
Set of utilities to traverse, modify and create ADF documents.
84 lines (82 loc) • 3.97 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.transformInvalidMediaContent = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _traverse = require("../traverse/traverse");
var _helpers = require("./helpers");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var getChildrenTypeCounts = function getChildrenTypeCounts(nodeContent, allowedTypes) {
var childrenTypes = {};
nodeContent.forEach(function (childNode) {
if (!(childNode !== null && childNode !== void 0 && childNode.type) || !allowedTypes.includes(childNode.type)) {
return;
}
if (!childrenTypes[childNode.type]) {
childrenTypes[childNode.type] = 1;
return;
}
childrenTypes[childNode.type]++;
});
return childrenTypes;
};
var removeDuplicatedNodes = function removeDuplicatedNodes(type, content, predicate) {
var maxIterations = 10;
var childrenTypeCounts = getChildrenTypeCounts(content, [type])[type];
var firstPredicateNodeIndex = content.findIndex(predicate);
while (childrenTypeCounts > 1 && firstPredicateNodeIndex > -1 && maxIterations-- > 0) {
content.splice(firstPredicateNodeIndex, 1);
firstPredicateNodeIndex = content.findIndex(predicate);
childrenTypeCounts = getChildrenTypeCounts(content, [type])[type];
}
};
/**
* @param {{[type:string]:number}} allowedTypes - array types allowed to deduplicate
*/
var deduplicateMediaSingleChildren = function deduplicateMediaSingleChildren(node, allowedTypes) {
if (!node.content) {
return;
}
var content = (0, _toConsumableArray2.default)(node.content);
Object.keys(allowedTypes).forEach(function (type) {
//prioritise removing empty nodes first
removeDuplicatedNodes(type, content, function (node) {
return (node === null || node === void 0 ? void 0 : node.type) === type && (0, _helpers.isEmpty)(node);
});
//remove other remaining dupicates
removeDuplicatedNodes(type, content, function (node) {
return (node === null || node === void 0 ? void 0 : node.type) === type;
});
});
return _objectSpread(_objectSpread({}, node), {}, {
content: content
});
};
var transformInvalidMediaContent = exports.transformInvalidMediaContent = function transformInvalidMediaContent(adf) {
var isTransformed = false;
var transformedAdf = (0, _traverse.traverse)(adf, {
mediaSingle: function mediaSingle(node) {
var _node$content;
if (!(node !== null && node !== void 0 && (_node$content = node.content) !== null && _node$content !== void 0 && _node$content.length)) {
return;
}
var disallowedDuplicateTypes = ['media', 'caption'];
var childrenTypes = getChildrenTypeCounts(node.content, disallowedDuplicateTypes);
if (Object.values(childrenTypes).some(function (occurences) {
return occurences > 1;
})) {
isTransformed = true;
return deduplicateMediaSingleChildren(node, childrenTypes);
}
return;
}
});
return {
transformedAdf: transformedAdf,
isTransformed: isTransformed
};
};