UNPKG

@vrerv/md-to-notion

Version:

An upload of markdown files to a hierarchy of Notion pages.

91 lines 3.55 kB
"use strict"; /* 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