gatsby
Version:
Blazing fast modern site generator for React
86 lines (64 loc) • 2.06 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _each2 = _interopRequireDefault(require("lodash/each"));
var _isArray2 = _interopRequireDefault(require("lodash/isArray"));
var _pickBy2 = _interopRequireDefault(require("lodash/pickBy"));
var _isPlainObject2 = _interopRequireDefault(require("lodash/isPlainObject"));
const omitUndefined = data => {
const isPlainObject = (0, _isPlainObject2.default)(data);
if (isPlainObject) {
return (0, _pickBy2.default)(data, p => p !== undefined);
}
return data.filter(p => p !== undefined);
};
/**
* @param {*} data
* @return {boolean}
*/
const isTypeSupported = data => {
if (data === null) {
return true;
}
const type = typeof data;
const isSupported = type === `number` || type === `string` || type === `boolean` || data instanceof Date;
return isSupported;
};
/**
* Make data serializable
* @param {(Object|Array)} data to sanitize
* @param {boolean} isNode = true
* @param {Set<string>} path = new Set
*/
const sanitizeNode = (data, isNode = true, path = new Set()) => {
const isPlainObject = (0, _isPlainObject2.default)(data);
if (isPlainObject || (0, _isArray2.default)(data)) {
if (path.has(data)) return data;
path.add(data);
const returnData = isPlainObject ? {} : [];
let anyFieldChanged = false;
(0, _each2.default)(data, (o, key) => {
if (isNode && key === `internal`) {
returnData[key] = o;
return;
}
returnData[key] = sanitizeNode(o, false, path);
if (returnData[key] !== o) {
anyFieldChanged = true;
}
});
if (anyFieldChanged) {
data = omitUndefined(returnData);
} // arrays and plain objects are supported - no need to to sanitize
return data;
}
if (!isTypeSupported(data)) {
return undefined;
} else {
return data;
}
};
var _default = sanitizeNode;
exports.default = _default;
//# sourceMappingURL=sanitize-node.js.map