vtex
Version:
The platform for e-commerce apps
105 lines (104 loc) • 5.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.matchedDepsDiffTable = exports.getSimpleVersion = exports.getDistTag = exports.runYarnIfPathExists = exports.runYarn = exports.formatNano = exports.yarnPath = void 0;
const tslib_1 = require("tslib");
const chalk_1 = tslib_1.__importDefault(require("chalk"));
const child_process_es6_promise_1 = require("child-process-es6-promise");
const diff_1 = require("diff");
const fs_extra_1 = require("fs-extra");
const path_1 = require("path");
const ramda_1 = tslib_1.__importDefault(require("ramda"));
const logger_1 = tslib_1.__importDefault(require("../api/logger"));
const ManifestUtil_1 = require("../api/manifest/ManifestUtil");
const table_1 = require("../api/table");
exports.yarnPath = `"${require.resolve('yarn/bin/yarn')}"`;
exports.formatNano = (nanoseconds) => `${(nanoseconds / 1e9).toFixed(0)}s ${((nanoseconds / 1e6) % 1e3).toFixed(0)}ms`;
exports.runYarn = (relativePath, force) => {
logger_1.default.info(`Running yarn in ${chalk_1.default.green(relativePath)}`);
const root = ManifestUtil_1.getAppRoot();
const command = force
? `${exports.yarnPath} --force --non-interactive --ignore-engines`
: `${exports.yarnPath} --non-interactive --ignore-engines`;
child_process_es6_promise_1.execSync(command, { stdio: 'inherit', cwd: path_1.resolve(root, relativePath) });
logger_1.default.info('Finished running yarn');
};
exports.runYarnIfPathExists = (relativePath) => {
const root = ManifestUtil_1.getAppRoot();
const pathName = path_1.resolve(root, relativePath);
if (fs_extra_1.existsSync(pathName)) {
try {
exports.runYarn(relativePath, false);
}
catch (e) {
logger_1.default.error(`Failed to run yarn in ${chalk_1.default.green(relativePath)}`);
throw e;
}
}
};
const formatAppId = (appId) => {
const [appVendor, appName] = ramda_1.default.split('.', appId);
if (!appName) {
// Then the app is an 'infra' app.
const [infraAppVendor, infraAppName] = ramda_1.default.split(':', appId);
if (!infraAppName) {
return appId;
}
return `${chalk_1.default.blue(infraAppVendor)}:${infraAppName}`;
}
return `${chalk_1.default.blue(appVendor)}.${appName}`;
};
const cleanVersion = (appId) => {
return ramda_1.default.compose((version) => {
const [pureVersion, build] = ramda_1.default.split('+build', version);
return build ? `${pureVersion}(linked)` : pureVersion;
}, ramda_1.default.last, ramda_1.default.split('@'))(appId);
};
// Return version tag
// Example: 2.115.0-beta.somehash -> beta
// Example: 2.115.0 -> latest
exports.getDistTag = (version) => {
const regex = /(?:-([0-9A-Za-z-]*))/g;
const distTag = version.match(regex);
return distTag ? distTag[0].substring(1) : 'latest';
};
// Return version and tag only
// Example: 2.115.0-beta.somehash -> 2.115.0-beta
// Example: 2.115.0 -> 2.115.0
exports.getSimpleVersion = (version) => {
const regex = /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+))?/g;
return version.match(regex)[0];
};
exports.matchedDepsDiffTable = (title1, title2, deps1, deps2) => {
const depsDiff = diff_1.diffArrays(deps1, deps2);
// Get deduplicated names (no version) of the changed deps.
const depNames = [
...new Set(ramda_1.default.compose(ramda_1.default.map(k => ramda_1.default.head(ramda_1.default.split('@', k))), ramda_1.default.flatten, ramda_1.default.pluck('value'), ramda_1.default.filter((k) => !!k.removed || !!k.added))(depsDiff)),
].sort((strA, strB) => strA.localeCompare(strB));
const produceStartValues = () => ramda_1.default.map(_ => [])(depNames);
// Each of the following objects will start as a { `depName`: [] }, ... }-like.
const addedDeps = ramda_1.default.zipObj(depNames, produceStartValues());
const removedDeps = ramda_1.default.zipObj(depNames, produceStartValues());
// Custom function to set the objects values.
const setObjectValues = (obj, formatter, filterFunction) => {
ramda_1.default.compose(
// eslint-disable-next-line array-callback-return
ramda_1.default.map(k => {
const index = ramda_1.default.head(ramda_1.default.split('@', k));
obj[index].push(formatter(k));
}), ramda_1.default.flatten, ramda_1.default.pluck('value'), ramda_1.default.filter(filterFunction))(depsDiff);
ramda_1.default.mapObjIndexed((_, index) => {
obj[index] = obj[index].join(',');
})(obj);
};
// Setting the objects values.
setObjectValues(removedDeps, k => chalk_1.default.red(`${cleanVersion(k)}`), (k) => !!k.removed);
setObjectValues(addedDeps, k => chalk_1.default.green(`${cleanVersion(k)}`), (k) => !!k.added);
const table = table_1.createTable(); // Set table headers.
table.push(['', chalk_1.default.bold.yellow(title1), chalk_1.default.bold.yellow(title2)]);
const formattedDepNames = ramda_1.default.map(formatAppId, depNames);
// Push array of changed dependencies pairs to the table.
Array.prototype.push.apply(table, ramda_1.default.map((k) => ramda_1.default.flatten(k))(ramda_1.default.zip(
// zipping 3 arrays.
ramda_1.default.zip(formattedDepNames, ramda_1.default.values(removedDeps)), ramda_1.default.values(addedDeps))));
return table;
};