@atlaskit/editor-plugin-extension
Version:
editor-plugin-extension plugin for @atlaskit/editor-core
632 lines (630 loc) • 26.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.serialize = exports.findDuplicateFields = exports.deserialize = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _extensions = require("@atlaskit/editor-common/extensions");
var _utils = require("./utils");
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
var isOption = function isOption(option) {
return option && (0, _typeof2.default)(option) === 'object' && 'label' in option && 'value' in option;
};
var isOptions = function isOptions(options) {
return Array.isArray(options) && options.every(isOption);
};
/** maps the typed-values from the Form values object */
function extract(value, field, options) {
if (isOptions(value)) {
return value.map(function (item) {
return item.value;
});
} else if (isOption(value)) {
return value.value;
} else if ((0, _extensions.isDateRange)(value)) {
return value;
} else if (value !== undefined && field.type === 'number') {
if (value === '') {
return;
}
return Number(value);
}
// Workaround for https://product-fabric.atlassian.net/browse/DST-2701
else if (options !== null && options !== void 0 && options.useDefaultValue && value === undefined && 'defaultValue' in field) {
return field.defaultValue;
}
return value;
}
var findDuplicateFields = exports.findDuplicateFields = function findDuplicateFields(fields) {
return _findDuplicateFieldsInternal(flattenFields(fields));
};
var _findDuplicateFieldsInternal = function findDuplicateFieldsInternal(fields) {
var allowDuplicatesMap = {};
return fields.find(function (field) {
if ((0, _extensions.isExpand)(field)) {
return _findDuplicateFieldsInternal(field.fields);
} else if ((0, _extensions.isTabGroup)(field)) {
return field.fields.find(function (tabField) {
return _findDuplicateFieldsInternal(tabField.fields);
});
} else if (allowDuplicatesMap[field.name] === undefined) {
allowDuplicatesMap[field.name] = !!field.allowDuplicates;
return;
} else if (!field.allowDuplicates || !allowDuplicatesMap[field.name]) {
return field;
}
return;
});
};
var serialize = exports.serialize = /*#__PURE__*/function () {
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(manifest, data, fields) {
var options,
result,
_options$depth,
depth,
parentType,
flattenedFields,
fillResults,
parameters,
hasDuplicateFields,
_args2 = arguments;
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
options = _args2.length > 3 && _args2[3] !== undefined ? _args2[3] : {};
result = [];
_options$depth = options.depth, depth = _options$depth === void 0 ? 0 : _options$depth, parentType = options.parentType;
flattenedFields = flattenFields(fields);
fillResults = flattenedFields.map( /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(field) {
var tabGroupData, tabData, expandData, fieldsetData, value;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!(0, _extensions.isTabGroup)(field)) {
_context.next = 7;
break;
}
_context.next = 3;
return serializeTabGroupField(manifest, field, data);
case 3:
tabGroupData = _context.sent;
result.push.apply(result, (0, _toConsumableArray2.default)(tabGroupData));
_context.next = 30;
break;
case 7:
if (!(0, _extensions.isTabField)(field)) {
_context.next = 14;
break;
}
_context.next = 10;
return serializeTabField(manifest, field, data);
case 10:
tabData = _context.sent;
result.push.apply(result, (0, _toConsumableArray2.default)(tabData));
_context.next = 30;
break;
case 14:
if (!(0, _extensions.isExpand)(field)) {
_context.next = 21;
break;
}
_context.next = 17;
return serializeExpandField(manifest, field, data);
case 17:
expandData = _context.sent;
result.push.apply(result, (0, _toConsumableArray2.default)(expandData));
_context.next = 30;
break;
case 21:
if (!((0, _extensions.isFieldset)(field) && depth === 0)) {
_context.next = 28;
break;
}
_context.next = 24;
return serializeFieldset(manifest, field, data, depth);
case 24:
fieldsetData = _context.sent;
if (fieldsetData) {
result.push(fieldsetData);
}
_context.next = 30;
break;
case 28:
value = extract(data[field.name], field, {
useDefaultValue: true
}); // ignore undefined values
if (value !== undefined) {
result.push((0, _defineProperty2.default)({}, field.name, value));
}
case 30:
case "end":
return _context.stop();
}
}, _callee);
}));
return function (_x4) {
return _ref2.apply(this, arguments);
};
}());
_context2.next = 7;
return Promise.all(fillResults);
case 7:
// Crunch fields down to parameters
parameters = result.reduce(function (obj, current) {
// eslint-disable-next-line guard-for-in
for (var key in current) {
obj[key] = current[key];
}
return obj;
}, {}); // Fix up duplicate values (currently only for fieldsets)
hasDuplicateFields = parentType === 'fieldset' && !!flattenedFields.find(function (field) {
return field.allowDuplicates;
});
if (!hasDuplicateFields) {
_context2.next = 11;
break;
}
return _context2.abrupt("return", serializeMergeDuplicateFieldData(parameters, data, flattenedFields));
case 11:
return _context2.abrupt("return", parameters);
case 12:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return function serialize(_x, _x2, _x3) {
return _ref.apply(this, arguments);
};
}();
var serializeFieldset = /*#__PURE__*/function () {
var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(manifest, field, data, depth) {
var fieldSerializer, fieldsetFields, fieldParams, extracted;
return _regenerator.default.wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
_context3.prev = 0;
fieldSerializer = (0, _extensions.getFieldSerializer)(manifest, field.options.transformer);
_context3.next = 8;
break;
case 4:
_context3.prev = 4;
_context3.t0 = _context3["catch"](0);
if (!(data[field.name] !== undefined)) {
_context3.next = 8;
break;
}
throw _context3.t0;
case 8:
if (fieldSerializer) {
_context3.next = 10;
break;
}
return _context3.abrupt("return");
case 10:
fieldsetFields = field.fields;
fieldParams = extract(data[field.name], field, {
useDefaultValue: true
}) || {};
_context3.next = 14;
return serialize(manifest, fieldParams, fieldsetFields, {
depth: depth + 1,
parentType: 'fieldset'
});
case 14:
extracted = _context3.sent;
return _context3.abrupt("return", (0, _defineProperty2.default)({}, field.name, fieldSerializer(extracted)));
case 16:
case "end":
return _context3.stop();
}
}, _callee3, null, [[0, 4]]);
}));
return function serializeFieldset(_x5, _x6, _x7, _x8) {
return _ref3.apply(this, arguments);
};
}();
var serializeExpandField = /*#__PURE__*/function () {
var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(manifest, field, data) {
var expandData, value, results, fieldName;
return _regenerator.default.wrap(function _callee4$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
expandData = field.hasGroupedValues ? data[field.name] || {} : data;
_context4.next = 3;
return serialize(manifest, expandData, field.fields, {
parentType: 'expand'
});
case 3:
value = _context4.sent;
results = [];
if (!field.hasGroupedValues) {
// eslint-disable-next-line guard-for-in
for (fieldName in value) {
results.push((0, _defineProperty2.default)({}, fieldName, value[fieldName]));
}
} else {
results.push((0, _defineProperty2.default)({}, field.name, value));
}
return _context4.abrupt("return", results);
case 7:
case "end":
return _context4.stop();
}
}, _callee4);
}));
return function serializeExpandField(_x9, _x0, _x1) {
return _ref5.apply(this, arguments);
};
}();
var resolveTabValues = /*#__PURE__*/function () {
var _ref6 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(manifest, tabField, groupData) {
var tabFieldParams;
return _regenerator.default.wrap(function _callee5$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
tabFieldParams = tabField.hasGroupedValues ? groupData[tabField.name] || {} : groupData;
_context5.next = 3;
return serialize(manifest, tabFieldParams, tabField.fields, {
parentType: 'tab'
});
case 3:
return _context5.abrupt("return", _context5.sent);
case 4:
case "end":
return _context5.stop();
}
}, _callee5);
}));
return function resolveTabValues(_x10, _x11, _x12) {
return _ref6.apply(this, arguments);
};
}();
var serializeTabGroupField = /*#__PURE__*/function () {
var _ref7 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(manifest, field, data) {
var tabs, results, value, i, tabField, tabFieldParameters, fieldName, _fieldName;
return _regenerator.default.wrap(function _callee6$(_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
tabs = field.fields;
results = [];
value = {};
i = 0;
case 4:
if (!(i < tabs.length)) {
_context6.next = 13;
break;
}
tabField = tabs[i];
_context6.next = 8;
return resolveTabValues(manifest, tabField, field.hasGroupedValues ? data[field.name] || {} : data);
case 8:
tabFieldParameters = _context6.sent;
if (tabField.hasGroupedValues) {
// Keep namespaced by tab
value[tabField.name] = tabFieldParameters;
} else {
// Copy into tabGroup value
// eslint-disable-next-line guard-for-in
for (fieldName in tabFieldParameters) {
value[fieldName] = tabFieldParameters[fieldName];
}
}
case 10:
i++;
_context6.next = 4;
break;
case 13:
// Now for tabGroup...
if (field.hasGroupedValues) {
results.push((0, _defineProperty2.default)({}, field.name, value));
} else {
// eslint-disable-next-line guard-for-in
for (_fieldName in value) {
results.push((0, _defineProperty2.default)({}, _fieldName, value));
}
}
return _context6.abrupt("return", results);
case 15:
case "end":
return _context6.stop();
}
}, _callee6);
}));
return function serializeTabGroupField(_x13, _x14, _x15) {
return _ref7.apply(this, arguments);
};
}();
var serializeTabField = /*#__PURE__*/function () {
var _ref8 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(manifest, field, data) {
var results, tabField, tabFieldParameters, fieldName;
return _regenerator.default.wrap(function _callee7$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
results = [];
tabField = field;
_context7.next = 4;
return resolveTabValues(manifest, tabField, data);
case 4:
tabFieldParameters = _context7.sent;
if (tabField.hasGroupedValues) {
// Keep namespaced by tab
results.push((0, _defineProperty2.default)({}, tabField.name, tabFieldParameters));
} else {
// Copy into tabGroup value
// eslint-disable-next-line guard-for-in
for (fieldName in tabFieldParameters) {
results.push((0, _defineProperty2.default)({}, fieldName, tabFieldParameters[fieldName]));
}
}
return _context7.abrupt("return", results);
case 7:
case "end":
return _context7.stop();
}
}, _callee7);
}));
return function serializeTabField(_x16, _x17, _x18) {
return _ref8.apply(this, arguments);
};
}();
var serializeMergeDuplicateFieldData = function serializeMergeDuplicateFieldData(parameters, formData, flattenedFields) {
// Weed out all the non-duplicate field names
var allDuplicateFieldNames = Object.keys(formData).filter(function (key) {
return (0, _utils.isDuplicateField)(key);
});
return flattenedFields.reduce(function (newParams, field) {
var paramValue = parameters[field.name];
if (!field.allowDuplicates && paramValue !== undefined) {
newParams[field.name] = paramValue;
} else {
// extract the given duplicate values through the field
var duplicateValues = allDuplicateFieldNames.filter(function (name) {
return (0, _utils.getNameFromDuplicateField)(name) === field.name;
}).map(function (duplicateFieldName) {
return extract(formData[duplicateFieldName], field, {
useDefaultValue: true
});
});
// Merge and ensure that all values are worth serializing
var mergedValues = [paramValue].concat((0, _toConsumableArray2.default)(duplicateValues)).filter(function (value) {
return value !== undefined;
});
if (mergedValues.length > 0) {
// Replace so the duplicate field values are saved under the
// fieldName as an array
newParams[field.name] = mergedValues;
}
}
return newParams;
}, {});
};
function injectDefaultValues(data, fields) {
var copy = (0, _toConsumableArray2.default)(convertToParametersArray(data));
var _iterator = _createForOfIteratorHelper(fields),
_step;
try {
var _loop = function _loop() {
var field = _step.value;
var name = field.name;
var fieldIndex = copy.findIndex(function (item) {
return Object.entries(item)[0][0] === name;
});
if (fieldIndex >= 0 && !(0, _extensions.isFieldset)(field)) {
return 1; // continue
}
if ((0, _extensions.isFieldset)(field)) {
var fieldsetFields = field.fields;
if (fieldIndex >= 0) {
var fieldValue = Object.entries(copy[fieldIndex])[0][1];
copy[fieldIndex] = (0, _defineProperty2.default)({}, name, injectDefaultValues(fieldValue, fieldsetFields));
} else {
copy.push((0, _defineProperty2.default)({}, name, injectDefaultValues({}, fieldsetFields)));
}
}
if ('defaultValue' in field) {
copy.push((0, _defineProperty2.default)({}, name, field.defaultValue));
}
};
for (_iterator.s(); !(_step = _iterator.n()).done;) {
if (_loop()) continue;
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return convertToParametersObject(copy);
}
/**
* Flattens the given FieldDefinition[] so it resembles the expected data
* structure in result Parameters.
*/
var flattenFields = function flattenFields(fields) {
var _flattenAccumulator = function flattenAccumulator(accumulator, field) {
if ((0, _extensions.isTabGroup)(field)) {
if (field.hasGroupedValues) {
accumulator.push(field);
} else {
var flattenedTabs = field.fields.reduce(function (tabAccumulator, tab) {
return tabAccumulator.concat(tab.hasGroupedValues ?
// eslint-disable-next-line @typescript-eslint/no-explicit-any
tab : tab.fields.reduce(_flattenAccumulator, []));
}, []);
accumulator.push.apply(accumulator, (0, _toConsumableArray2.default)(flattenedTabs));
}
} else if ((0, _extensions.isExpand)(field)) {
if (field.hasGroupedValues) {
accumulator.push(field);
} else {
var flattenedExpand = field.fields.reduce(_flattenAccumulator, []);
accumulator.push.apply(accumulator, (0, _toConsumableArray2.default)(flattenedExpand));
}
} else {
accumulator.push(field);
}
return accumulator;
};
return fields.reduce(_flattenAccumulator, []);
};
var _deserialize = exports.deserialize = /*#__PURE__*/function () {
var _ref9 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(manifest, data, fields) {
var depth,
dataArray,
result,
errors,
flattenedFields,
_iterator2,
_step2,
_loop2,
_ret,
_args9 = arguments;
return _regenerator.default.wrap(function _callee8$(_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
depth = _args9.length > 3 && _args9[3] !== undefined ? _args9[3] : 0;
dataArray = convertToParametersArray(data);
result = [];
errors = [];
flattenedFields = flattenFields(fields);
_iterator2 = _createForOfIteratorHelper(dataArray);
_context9.prev = 6;
_loop2 = /*#__PURE__*/_regenerator.default.mark(function _loop2() {
var item, _Object$entries$, name, originalValue, field, value, fieldDeserializer;
return _regenerator.default.wrap(function _loop2$(_context8) {
while (1) switch (_context8.prev = _context8.next) {
case 0:
item = _step2.value;
_Object$entries$ = (0, _slicedToArray2.default)(Object.entries(item)[0], 2), name = _Object$entries$[0], originalValue = _Object$entries$[1];
field = flattenedFields.find(function (field) {
return field.name === (0, _utils.getNameFromDuplicateField)(name);
});
if (!(field === undefined)) {
_context8.next = 5;
break;
}
return _context8.abrupt("return", 0);
case 5:
value = extract(originalValue, field);
if (!(value === undefined)) {
_context8.next = 8;
break;
}
return _context8.abrupt("return", 0);
case 8:
if (!((0, _extensions.isFieldset)(field) && depth === 0)) {
_context8.next = 22;
break;
}
fieldDeserializer = (0, _extensions.getFieldDeserializer)(manifest, field.options.transformer);
if (!fieldDeserializer) {
_context8.next = 22;
break;
}
_context8.prev = 11;
value = fieldDeserializer(value);
_context8.next = 19;
break;
case 15:
_context8.prev = 15;
_context8.t0 = _context8["catch"](11);
errors.push((0, _defineProperty2.default)({}, name, _context8.t0 instanceof Error ? _context8.t0.message : String(_context8.t0)));
return _context8.abrupt("return", 0);
case 19:
_context8.next = 21;
return _deserialize(manifest, value, field.fields, depth + 1);
case 21:
value = _context8.sent;
case 22:
result.push((0, _defineProperty2.default)({}, name, value));
case 23:
case "end":
return _context8.stop();
}
}, _loop2, null, [[11, 15]]);
});
_iterator2.s();
case 9:
if ((_step2 = _iterator2.n()).done) {
_context9.next = 16;
break;
}
return _context9.delegateYield(_loop2(), "t0", 11);
case 11:
_ret = _context9.t0;
if (!(_ret === 0)) {
_context9.next = 14;
break;
}
return _context9.abrupt("continue", 14);
case 14:
_context9.next = 9;
break;
case 16:
_context9.next = 21;
break;
case 18:
_context9.prev = 18;
_context9.t1 = _context9["catch"](6);
_iterator2.e(_context9.t1);
case 21:
_context9.prev = 21;
_iterator2.f();
return _context9.finish(21);
case 24:
result = convertToParametersObject(result);
if (errors.length > 0) {
result.errors = convertToParametersObject(errors);
}
return _context9.abrupt("return", injectDefaultValues(result, flattenedFields));
case 27:
case "end":
return _context9.stop();
}
}, _callee8, null, [[6, 18, 21, 24]]);
}));
return function deserialize(_x19, _x20, _x21) {
return _ref9.apply(this, arguments);
};
}();
var convertToParametersObject = function convertToParametersObject() {
var parameters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
if (!Array.isArray(parameters)) {
return parameters;
}
return parameters.reduce(function (obj, current) {
// eslint-disable-next-line guard-for-in
for (var key in current) {
var keys = Object.keys(obj);
var resultKey = key;
var idx = 1;
while (keys.indexOf(resultKey) >= 0) {
resultKey = "".concat((0, _utils.getNameFromDuplicateField)(key), ":").concat(idx);
idx++;
}
obj[resultKey] = current[key];
}
return obj;
}, {});
};
var convertToParametersArray = function convertToParametersArray() {
var parameters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (Array.isArray(parameters)) {
return parameters;
}
var dataArray = [];
// eslint-disable-next-line guard-for-in
for (var name in parameters) {
dataArray.push((0, _defineProperty2.default)({}, name, parameters[name]));
}
return dataArray;
};