UNPKG

@codingtools/cdt

Version:
117 lines 5.54 kB
"use strict"; 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