73 lines
2 KiB
JavaScript
73 lines
2 KiB
JavaScript
import { promises } from 'fs';
|
|
import { normalizeDir } from '../export/helpers/prepare.mjs';
|
|
import { scanDirectory } from './scan.mjs';
|
|
import 'pathe';
|
|
|
|
const textFileExtensions = [
|
|
"json",
|
|
"ts",
|
|
"js",
|
|
"mjs",
|
|
"cjs",
|
|
"jsx",
|
|
"tsx",
|
|
"vue",
|
|
"svelte",
|
|
"svg",
|
|
"txt",
|
|
"md"
|
|
];
|
|
async function compareDirectories(dir1, dir2, options) {
|
|
dir1 = normalizeDir(dir1);
|
|
dir2 = normalizeDir(dir2);
|
|
const files1 = await scanDirectory(dir1);
|
|
const files2 = await scanDirectory(dir2);
|
|
if (files1.length !== files2.length) {
|
|
return false;
|
|
}
|
|
options = options || {};
|
|
const ignoreNewLine = options.ignoreNewLine !== false;
|
|
const ignoreVersions = options.ignoreVersions !== false;
|
|
const textExtensions = new Set(
|
|
(options.textExtensions || []).concat(textFileExtensions)
|
|
);
|
|
for (let i = 0; i < files1.length; i++) {
|
|
const file = files1[i];
|
|
if (!files2.includes(file)) {
|
|
return false;
|
|
}
|
|
const ext = file.split(".").pop().toLowerCase();
|
|
const isText = textExtensions.has(ext);
|
|
if (!isText) {
|
|
const content12 = await promises.readFile(dir1 + "/" + file);
|
|
const content22 = await promises.readFile(dir2 + "/" + file);
|
|
if (Buffer.compare(content12, content22) !== 0) {
|
|
return false;
|
|
}
|
|
continue;
|
|
}
|
|
let content1 = await promises.readFile(dir1 + "/" + file, "utf8");
|
|
let content2 = await promises.readFile(dir2 + "/" + file, "utf8");
|
|
if (content1 === content2) {
|
|
continue;
|
|
}
|
|
if (ignoreNewLine) {
|
|
content1 = content1.replace(/\s+\n/g, "\n").trimEnd();
|
|
content2 = content2.replace(/\s+\n/g, "\n").trimEnd();
|
|
}
|
|
if (ignoreVersions && file.split("/").pop() === "package.json") {
|
|
const data1 = JSON.parse(content1);
|
|
const data2 = JSON.parse(content2);
|
|
delete data1.version;
|
|
delete data2.version;
|
|
content1 = JSON.stringify(data1);
|
|
content2 = JSON.stringify(data2);
|
|
}
|
|
if (content1 !== content2) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
export { compareDirectories };
|