@codingtools/cdt
Version:
CLI for Developers
117 lines • 5.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const command_1 = require("@oclif/command");
const axios_1 = tslib_1.__importDefault(require("axios"));
const chalk_1 = tslib_1.__importDefault(require("chalk"));
const logger_1 = tslib_1.__importDefault(require("../utilities/logger"));
const utilities_1 = tslib_1.__importDefault(require("../utilities/utilities"));
// TODO:
// ADD VALID tests ( for now they just ignoring )
class Bundlephobia extends command_1.Command {
static getSize(byteSize) {
if (byteSize >= 1024 * 1024)
return `${chalk_1.default.red((byteSize / (1024 * 1024)).toFixed(1) + 'MB')}`;
else if (byteSize >= 1024)
return `${chalk_1.default.blue((byteSize / (1024)).toFixed(1) + 'KB')}`;
else //if (byteSize < 1024)
return `${chalk_1.default.green(byteSize.toFixed(1) + 'B')}`;
}
// values needed package
async run() {
const { args, flags } = this.parse(Bundlephobia);
args.packages = this.getPackages(flags, args); // get a list
logger_1.default.info(this, `running bundlephobia for ${args.packages.length} packages`);
this.checkParameters(flags, args);
this.bundlePhobia(flags, args);
}
getErrorMessage(pkg, message) {
// replacing will be useful when we do not have specific version
// output will be like below
/*
⚠ @codingtools/cdt@1.2.3 This package has not been published with this particular version.
Valid versions - `<code>latest</code>`, `<code>0.1.1</code>` and `<code>0.1.2</code>`
*/
if (message.includes('This package has not been published with this particular version.'))
message = message.replace(/`<code>|<\/code>`/g, '');
return `${chalk_1.default.red(pkg)} ${message}`;
}
getPackages(flags, args) {
let packages = [];
if (args.package)
packages.push(args.package);
if (flags.packages)
packages = packages.concat(flags.packages); // not inplace operation
// package.json file passed
if (flags.file) {
let jsonObject = utilities_1.default.getJsonObjectFromFile(this, flags.file);
packages = packages.concat(this.convertObjectToArray(jsonObject.dependencies));
}
return packages;
}
// tslint:disable-next-line:no-unused
checkParameters(flags, args) {
if (args.packages.length === 0)
logger_1.default.error(this, 'At least one package must be passed');
}
// tslint:disable-next-line:no-unused
bundlePhobia(flags, args) {
logger_1.default.progressStart(this, 'finding size...');
let size = 0;
let gzip = 0;
let dependencyCount = 0;
let packagesResolved = 0;
let packagesInfo = args.packages.map((pkg) => {
return {
url: `https://bundlephobia.com/api/size?package=${pkg}`,
pkg
};
});
// tslint:disable-next-line:no-unsafe-any no-unused
let x = axios_1.default.all(packagesInfo.map((packageInfo) => {
return axios_1.default.get(packageInfo.url).then(successResponse => {
packagesResolved++;
size += successResponse.data.size;
gzip += successResponse.data.gzip;
dependencyCount += successResponse.data.dependencyCount;
logger_1.default.progressStop(this, this.getSuccessMessage(successResponse.data));
}).catch(errorResponse => {
logger_1.default.progressStopError(this, this.getErrorMessage(packageInfo.pkg, errorResponse.response.data.error.message));
});
// tslint:disable-next-line:no-unused
}))
.then(() => { }).catch(() => { })
.finally(() => {
logger_1.default.success(this, this.getFinalMessage({
count: packagesResolved,
dependencyCount,
size,
gzip
}));
});
}
getFinalMessage(data) {
return `\n${chalk_1.default.magenta('Total')} [${chalk_1.default.cyan(data.count + ' packages resolved')}] has ${data.dependencyCount} dependencies with size of ${Bundlephobia.getSize(data.size)}(${Bundlephobia.getSize(data.gzip)} gzipped)`;
}
getSuccessMessage(data) {
return `${chalk_1.default.magenta(data.name)}@${chalk_1.default.cyan(data.version)} has ${data.dependencyCount} dependencies with size of ${Bundlephobia.getSize(data.size)}(${Bundlephobia.getSize(data.gzip)} gzipped)`;
}
convertObjectToArray(jsobObject) {
return Object.keys(jsobObject).map(key => {
return `${key}@${jsobObject[key]}`;
});
}
}
exports.default = Bundlephobia;
Bundlephobia.description = 'Find cost of adding a npm/yarn packages or all dependencies in package.json file';
Bundlephobia.flags = {
help: command_1.flags.help({ char: 'h' }),
packages: command_1.flags.string({
char: 'p',
description: 'packages for which cost is required, can pass more than one separated by space',
multiple: true // can get multiple package names
}),
file: command_1.flags.string({ char: 'f', description: 'path for package.json file' }),
};
Bundlephobia.args = [{ name: 'package' }]; // only one can be passed club which one passed through flag and arg
//# sourceMappingURL=bundlephobia.js.map