react-pdf-builder
Version:
Build beautiful PDF documents in React.
76 lines (75 loc) • 2.99 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.childrenAsArray = void 0;
exports.randomUuid = randomUuid;
exports.deepMerge = deepMerge;
const react_1 = __importDefault(require("react"));
const uuid_1 = require("uuid");
function randomUuid() {
return (0, uuid_1.v4)();
}
/**
* Deep merges two records by combining their properties.
*
* The mergeRecords function creates a copy of record1 in a new object called merged
* and iterates over each key in record2. If both values of the corresponding keys
* in record1 and record2 are objects, it recursively calls mergeRecords. If not,
* it assigns the value from record2 to merged. Finally, it returns the merged record.
*
* A third customMerge function arg allows for custom merging of certain values.
*
* @param record1 - The first record to merge.
* @param record2 - The second record to merge.
* @param customMerge - A function allowing custom value merging in certain circumstances.
* @returns The merged record.
*/
function deepMerge(record1, record2, customMerge) {
const merged = Object.assign({}, record1);
const record2Keys = Object.keys(record2 !== null && record2 !== void 0 ? record2 : {});
for (let i = 0; i < record2Keys.length; i++) {
const key = record2Keys[i];
const value1 = record1[key];
const value2 = record2[key];
// Check if both values are objects and not null
if (typeof value1 === 'object' && value1 !== null && typeof value2 === 'object' && value2 !== null) {
merged[key] = deepMerge(value1, value2, customMerge);
}
else {
let customMergeResult = undefined;
if (customMerge) {
customMergeResult = customMerge(key, value1, value2);
}
// If a custom merge was made, accept that result
if (customMergeResult === null || customMergeResult === void 0 ? void 0 : customMergeResult.success) {
merged[key] = customMergeResult.value;
}
else {
merged[key] = value2; // Take the value from record2
}
}
}
return merged;
}
/** Returns all children as an array, including those inside React fragments. */
const childrenAsArray = (children) => {
if (Array.isArray(children)) {
return children;
}
else if (children &&
typeof children === 'object' &&
children !== null &&
(children === null || children === void 0 ? void 0 : children.hasOwnProperty('type')) &&
children.type === react_1.default.Fragment) {
return (0, exports.childrenAsArray)(children.props.children);
}
else if (typeof children === 'undefined') {
return [];
}
else {
return [children];
}
};
exports.childrenAsArray = childrenAsArray;
;