oclif
Version:
oclif: create your own CLI
94 lines (93 loc) • 3.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.hash = exports.prettifyPaths = exports.sortVersionsObjectByKeysDesc = exports.template = exports.sortBy = exports.compact = exports.uniqBy = exports.castArray = void 0;
const _ = require("lodash");
const os = require("os");
const crypto = require("node:crypto");
const log_1 = require("./log");
const fs = require("fs-extra");
function castArray(input) {
if (input === undefined)
return [];
return Array.isArray(input) ? input : [input];
}
exports.castArray = castArray;
function uniqBy(arr, fn) {
return arr.filter((a, i) => {
const aVal = fn(a);
return !arr.find((b, j) => j > i && fn(b) === aVal);
});
}
exports.uniqBy = uniqBy;
function compact(a) {
return a.filter((a) => Boolean(a));
}
exports.compact = compact;
function sortBy(arr, fn) {
function compare(a, b) {
a = a === undefined ? 0 : a;
b = b === undefined ? 0 : b;
if (Array.isArray(a) && Array.isArray(b)) {
if (a.length === 0 && b.length === 0)
return 0;
const diff = compare(a[0], b[0]);
if (diff !== 0)
return diff;
return compare(a.slice(1), b.slice(1));
}
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
return arr.sort((a, b) => compare(fn(a), fn(b)));
}
exports.sortBy = sortBy;
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
const template = (context) => (t) => _.template(t || '')(context);
exports.template = template;
const sortVersionsObjectByKeysDesc = (input) => {
const keys = Reflect.ownKeys(input).sort((a, b) => {
const splitA = a.split('.').map(part => Number.parseInt(part, 10));
const splitB = b.split('.').map(part => Number.parseInt(part, 10));
// sort by major
if (splitA[0] < splitB[0])
return 1;
if (splitA[0] > splitB[0])
return -1;
// sort by minor
if (splitA[1] < splitB[1])
return 1;
if (splitA[1] > splitB[1])
return -1;
// sort by patch
if (splitA[2] < splitB[2])
return 1;
if (splitA[2] > splitB[2])
return -1;
return 0;
});
const result = {};
for (const key of keys) {
result[key] = input[key];
}
return result;
};
exports.sortVersionsObjectByKeysDesc = sortVersionsObjectByKeysDesc;
const homeRegexp = new RegExp(`\\B${os.homedir().replace('/', '\\/')}`, 'g');
const curRegexp = new RegExp(`\\B${process.cwd()}`, 'g');
const prettifyPaths = (input) => (input !== null && input !== void 0 ? input : '').toString().replace(curRegexp, '.').replace(homeRegexp, '~');
exports.prettifyPaths = prettifyPaths;
const hash = async (algo, fp) => {
const f = Array.isArray(fp) ? fp.join('') : fp;
(0, log_1.log)('hash', algo, f);
return new Promise((resolve, reject) => {
const hashInProgress = crypto.createHash(algo);
const stream = fs.createReadStream(f);
stream.on('error', err => reject(err));
stream.on('data', chunk => hashInProgress.update(chunk));
stream.on('end', () => resolve(hashInProgress.digest('hex')));
});
};
exports.hash = hash;