summaryrefslogtreecommitdiff
path: root/desktop/node_modules/dir-compare/build/src/index.js
blob: b6f638443007d8c6dd004e9fb4186f8385971b18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fileCompareHandlers = exports.compare = exports.compareSync = void 0;
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const compareSync_1 = __importDefault(require("./compareSync"));
const compareAsync_1 = __importDefault(require("./compareAsync"));
const defaultResultBuilderCallback_1 = __importDefault(require("./resultBuilder/defaultResultBuilderCallback"));
const defaultFileCompare_1 = require("./fileCompareHandler/default/defaultFileCompare");
const lineBasedFileCompare_1 = require("./fileCompareHandler/lines/lineBasedFileCompare");
const defaultNameCompare_1 = __importDefault(require("./nameCompare/defaultNameCompare"));
const entryBuilder_1 = __importDefault(require("./entry/entryBuilder"));
const statisticsLifecycle_1 = __importDefault(require("./statistics/statisticsLifecycle"));
const loopDetector_1 = __importDefault(require("./symlink/loopDetector"));
const ROOT_PATH = path_1.default.sep;
__exportStar(require("./types"), exports);
/**
 * Synchronously compares given paths.
 * @param path1 Left file or directory to be compared.
 * @param path2 Right file or directory to be compared.
 * @param options Comparison options.
 */
function compareSync(path1, path2, options) {
    // realpathSync() is necessary for loop detection to work properly
    const absolutePath1 = path_1.default.normalize(path_1.default.resolve(fs_1.default.realpathSync(path1)));
    const absolutePath2 = path_1.default.normalize(path_1.default.resolve(fs_1.default.realpathSync(path2)));
    let diffSet;
    options = prepareOptions(options);
    if (!options.noDiffSet) {
        diffSet = [];
    }
    const statistics = statisticsLifecycle_1.default.initStats(options);
    compareSync_1.default(entryBuilder_1.default.buildEntry(absolutePath1, path1, path_1.default.basename(absolutePath1), options), entryBuilder_1.default.buildEntry(absolutePath2, path2, path_1.default.basename(absolutePath2), options), 0, ROOT_PATH, options, statistics, diffSet, loopDetector_1.default.initSymlinkCache());
    statisticsLifecycle_1.default.completeStatistics(statistics, options);
    statistics.diffSet = diffSet;
    return statistics;
}
exports.compareSync = compareSync;
/**
 * Asynchronously compares given paths.
 * @param path1 Left file or directory to be compared.
 * @param path2 Right file or directory to be compared.
 * @param options Comparison options.
 */
function compare(path1, path2, options) {
    let absolutePath1, absolutePath2;
    return Promise.resolve()
        .then(() => Promise.all([wrapper.realPath(path1), wrapper.realPath(path2)]))
        .then(realPaths => {
        const realPath1 = realPaths[0];
        const realPath2 = realPaths[1];
        // realpath() is necessary for loop detection to work properly
        absolutePath1 = path_1.default.normalize(path_1.default.resolve(realPath1));
        absolutePath2 = path_1.default.normalize(path_1.default.resolve(realPath2));
    })
        .then(() => {
        options = prepareOptions(options);
        let asyncDiffSet;
        if (!options.noDiffSet) {
            asyncDiffSet = [];
        }
        const statistics = statisticsLifecycle_1.default.initStats(options);
        return compareAsync_1.default(entryBuilder_1.default.buildEntry(absolutePath1, path1, path_1.default.basename(path1), options), entryBuilder_1.default.buildEntry(absolutePath2, path2, path_1.default.basename(path2), options), 0, ROOT_PATH, options, statistics, asyncDiffSet, loopDetector_1.default.initSymlinkCache())
            .then(() => {
            statisticsLifecycle_1.default.completeStatistics(statistics, options);
            if (!(options === null || options === void 0 ? void 0 : options.noDiffSet)) {
                const diffSet = [];
                rebuildAsyncDiffSet(statistics, asyncDiffSet, diffSet);
                statistics.diffSet = diffSet;
            }
            return statistics;
        });
    });
}
exports.compare = compare;
/**
 * File comparison handlers.
 * These handlers are used when [[Options.compareContent]] is set.
 */
exports.fileCompareHandlers = {
    defaultFileCompare: defaultFileCompare_1.defaultFileCompare,
    lineBasedFileCompare: lineBasedFileCompare_1.lineBasedFileCompare
};
const wrapper = {
    realPath(path, options) {
        return new Promise((resolve, reject) => {
            fs_1.default.realpath(path, options, (err, resolvedPath) => {
                if (err) {
                    reject(err);
                }
                else {
                    resolve(resolvedPath);
                }
            });
        });
    }
};
function prepareOptions(options) {
    options = options || {};
    const clone = JSON.parse(JSON.stringify(options));
    clone.resultBuilder = options.resultBuilder;
    clone.compareFileSync = options.compareFileSync;
    clone.compareFileAsync = options.compareFileAsync;
    clone.compareNameHandler = options.compareNameHandler;
    if (!clone.resultBuilder) {
        clone.resultBuilder = defaultResultBuilderCallback_1.default;
    }
    if (!clone.compareFileSync) {
        clone.compareFileSync = defaultFileCompare_1.defaultFileCompare.compareSync;
    }
    if (!clone.compareFileAsync) {
        clone.compareFileAsync = defaultFileCompare_1.defaultFileCompare.compareAsync;
    }
    if (!clone.compareNameHandler) {
        clone.compareNameHandler = defaultNameCompare_1.default;
    }
    clone.dateTolerance = clone.dateTolerance || 1000;
    clone.dateTolerance = Number(clone.dateTolerance);
    if (isNaN(clone.dateTolerance)) {
        throw new Error('Date tolerance is not a number');
    }
    return clone;
}
// Async diffsets are kept into recursive structures.
// This method transforms them into one dimensional arrays.
function rebuildAsyncDiffSet(statistics, asyncDiffSet, diffSet) {
    asyncDiffSet.forEach(rawDiff => {
        if (!Array.isArray(rawDiff)) {
            diffSet.push(rawDiff);
        }
        else {
            rebuildAsyncDiffSet(statistics, rawDiff, diffSet);
        }
    });
}
//# sourceMappingURL=index.js.map