@vrerv/md-to-notion
Version:
An upload of markdown files to a hierarchy of Notion pages.
91 lines • 3.55 kB
JavaScript
;
/* eslint-disable @typescript-eslint/no-explicit-any */
Object.defineProperty(exports, "__esModule", { value: true });
exports.compareBlock = exports.mergeBlocks = void 0;
const logging_1 = require("./logging");
const logger = (0, logging_1.makeConsoleLogger)("merge-blocks");
/**
* Determines append or delete action to existing blocks to merge new blocks to existing blocks,
*
* @param existingBlocks
* @param newBlocks
* @param appendBlocks
* @param deleteBlock
*/
async function mergeBlocks(existingBlocks, newBlocks, appendBlocks, deleteBlock) {
let existingIndex = 0;
let newIndex = 0;
let appendIndex = -1;
let afterIndex = -1;
while (existingIndex < existingBlocks.length || newIndex < newBlocks.length) {
if (existingIndex >= existingBlocks.length) {
await appendBlocks(newBlocks.slice(newIndex), afterIndex === -1 ? null : existingBlocks[afterIndex]);
break;
}
const same = compareBlock(existingBlocks[existingIndex], newBlocks[newIndex]);
logger(logging_1.LogLevel.DEBUG, "comparing block", {
same,
existingIndex,
newIndex,
existing: existingBlocks[existingIndex],
newBlock: newBlocks[newIndex],
});
if (same) {
if (appendIndex !== -1) {
await appendBlocks(newBlocks.slice(appendIndex, newIndex), existingIndex === 0 ? null : existingBlocks[afterIndex]);
appendIndex = -1;
}
existingIndex++;
newIndex++;
afterIndex++;
}
else {
if (appendIndex === -1)
appendIndex = newIndex;
newIndex++;
if (newIndex >= newBlocks.length) {
await deleteBlock(existingBlocks[existingIndex]);
newIndex = appendIndex;
appendIndex = -1;
existingIndex++;
}
}
}
}
exports.mergeBlocks = mergeBlocks;
function compareBlock(targetBlock, baseBlock) {
logger(logging_1.LogLevel.DEBUG, "comparing block", { targetBlock, baseBlock });
if (!baseBlock)
return false;
// Function to deeply compare two objects
function deepCompare(targetObject, baseObject) {
if (typeof targetObject !== "object" ||
targetObject === null ||
baseObject === null) {
const compareObject = baseObject === undefined ? (baseObject = null) : baseObject;
logger(logging_1.LogLevel.DEBUG, "comparing", {
targetObject,
compareObject,
equals: targetObject === compareObject,
});
if (targetObject === undefined && compareObject === null)
return true;
return targetObject === compareObject;
}
logger(logging_1.LogLevel.DEBUG, "comparing block", { targetBlock, baseBlock });
const baseKeys = Object.keys(baseObject);
for (const key of baseKeys) {
// Skip comparing url type which is not present in the target object
if (baseObject[key] === "url" && key === "type")
return true;
if (!!targetObject[key] !== !!baseObject[key])
return false;
if (!deepCompare(targetObject[key], baseObject[key]))
return false;
}
return true;
}
return deepCompare(targetBlock, baseBlock);
}
exports.compareBlock = compareBlock;
//# sourceMappingURL=merge-blocks.js.map