From f1f6a0f771e72b5d3c494b69ebc8fe4d259b6e69 Mon Sep 17 00:00:00 2001 From: ashish Date: Sat, 2 Nov 2019 19:07:54 +0530 Subject: [PATCH 01/14] [BUNDLEPHOBIA]: commands added Signed-off-by: ashish --- README.md | 17 +++++++++ src/commands/bundlephobia.ts | 55 ++++++++++++++++++++++++++++++ test/commands/bundlephobia.test.ts | 11 ++++++ 3 files changed, 83 insertions(+) create mode 100644 src/commands/bundlephobia.ts create mode 100644 test/commands/bundlephobia.test.ts diff --git a/README.md b/README.md index 95596ca..17207c6 100644 --- a/README.md +++ b/README.md @@ -46,11 +46,28 @@ USAGE # Commands +* [`cdt bundlephobia [FILE]`](#cdt-bundlephobia-file) * [`cdt crypto [STRING]`](#cdt-crypto-string) * [`cdt hash [STRING]`](#cdt-hash-string) * [`cdt help [COMMAND]`](#cdt-help-command) * [`cdt minify [FILE]`](#cdt-minify-file) +## `cdt bundlephobia [FILE]` + +describe the command here + +``` +USAGE + $ cdt bundlephobia [FILE] + +OPTIONS + -f, --force + -h, --help show CLI help + -n, --name=name name to print +``` + +_See code: [src/commands/bundlephobia.ts](https://github.com/codingtools/cdt/blob/v0.1.2/src/commands/bundlephobia.ts)_ + ## `cdt crypto [STRING]` Encryption and Decryption functionality for File/String diff --git a/src/commands/bundlephobia.ts b/src/commands/bundlephobia.ts new file mode 100644 index 0000000..ca867d6 --- /dev/null +++ b/src/commands/bundlephobia.ts @@ -0,0 +1,55 @@ +import {Command, flags} from '@oclif/command' + +import Logger from '../utilities/logger' + +export default class Bundlephobia extends Command { + static description = 'Find cost of adding a npm/yarn package' + + static flags = { + help: flags.help({char: 'h'}), + packages: flags.string({ + char: 'p', + description: 'packages for which cost is required, pass more than one separated by space', + multiple: true // can get multiple package names + }), + } + + static args = [{name: 'package'}] // only one can be passed club which one passed through flag and arg + + // values needed package + async run() { + const {args, flags} = this.parse(Bundlephobia) + + args.packages = this.getPackages(flags, args) // get a list + + this.checkParameters(flags, args) + + args.packages.map( + (p: string) => this.bundlePhobia(p) + ) + + } + + private getPackages(flags: any, args: any) { + let packages = [] + + if (args.package) + packages.push(args.package) + + if (flags.packages) + packages = packages.concat(flags.packages) // not inplace operation + + return packages + } + + // tslint:disable-next-line:no-unused + private checkParameters(flags: unknown, args: any) { + if (args.packages.length === 0) + Logger.error(this, 'At least one package must be passed') + } + + private bundlePhobia(p: string) { + this.log('called for ' + p) + + } +} diff --git a/test/commands/bundlephobia.test.ts b/test/commands/bundlephobia.test.ts new file mode 100644 index 0000000..72d55e0 --- /dev/null +++ b/test/commands/bundlephobia.test.ts @@ -0,0 +1,11 @@ +import {expect, test} from '@oclif/test' + +describe('bundlephobia', () => { + test + .stdout() + .command(['bundlephobia']) + .exit(0) + .it('if no package passed', ctx => { + expect(ctx.stdout).to.contain('At least one package must be passed') + }) +}) From 0e71b2ac09a53559419f1f076a537776b7ddd5b4 Mon Sep 17 00:00:00 2001 From: ashish Date: Sat, 2 Nov 2019 19:21:49 +0530 Subject: [PATCH 02/14] [BUNDLEPHOBIA]: axios added Signed-off-by: ashish --- package-lock.json | 43 +++++++++++++++++++++++++++++++----- package.json | 1 + src/commands/bundlephobia.ts | 9 +++++++- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64ee1fb..5f44a59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -415,6 +415,15 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1100,6 +1109,29 @@ "is-buffer": "~2.0.3" } }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", @@ -1387,8 +1419,7 @@ "is-buffer": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" }, "is-callable": { "version": "1.1.4", @@ -2047,7 +2078,7 @@ "dependencies": { "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "resolved": false, "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" @@ -2055,7 +2086,7 @@ }, "locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "resolved": false, "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { "p-locate": "^3.0.0", @@ -2073,7 +2104,7 @@ }, "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "resolved": false, "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { "p-limit": "^2.0.0" @@ -2081,7 +2112,7 @@ }, "path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "resolved": false, "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } diff --git a/package.json b/package.json index 81cb362..b6ded76 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@oclif/plugin-help": "^2.2.1", "@types/crypto-js": "^3.1.43", "@types/signale": "^1.2.1", + "axios": "^0.19.0", "crypto-js": "^3.1.9-1", "jshashes": "^1.0.7", "minify": "^4.1.3", diff --git a/src/commands/bundlephobia.ts b/src/commands/bundlephobia.ts index ca867d6..1730aed 100644 --- a/src/commands/bundlephobia.ts +++ b/src/commands/bundlephobia.ts @@ -1,4 +1,5 @@ import {Command, flags} from '@oclif/command' +import axios from 'axios' import Logger from '../utilities/logger' @@ -50,6 +51,12 @@ export default class Bundlephobia extends Command { private bundlePhobia(p: string) { this.log('called for ' + p) - + let url = `https://bundlephobia.com/api/size?package=${p}` + this.log('calling '+url) + axios + .get(url) + .then(response => this.log(response.data)) + .catch(response => this.log(response)) + .finally(() => this.log(`done for ${p}`)) } } From 03d87c849bd96d482bdf6b8d8dfc5edc910e8689 Mon Sep 17 00:00:00 2001 From: ashish Date: Sat, 2 Nov 2019 20:18:00 +0530 Subject: [PATCH 03/14] [BUNDLEPHOBIA]: working for single dependency so far Signed-off-by: ashish --- error.js | 262 +++++++++++++++++++++++++++++++++++ error.json | 17 +++ src/commands/bundlephobia.ts | 29 +++- src/utilities/logger.ts | 19 ++- 4 files changed, 321 insertions(+), 6 deletions(-) create mode 100644 error.js create mode 100644 error.json diff --git a/error.js b/error.js new file mode 100644 index 0000000..0c2d540 --- /dev/null +++ b/error.js @@ -0,0 +1,262 @@ +ℹ info running for react + +{ + status: 200, + statusText: 'OK', + headers: { + date: 'Sat, 02 Nov 2019 14:13:46 GMT', + 'content-type': 'application/json; charset=utf-8', + 'content-length': '407', + connection: 'close', + 'set-cookie': [ + '__cfduid=d6c4f18b79e2f01aac4e034417dee36e91572704026; expires=Sun, 01-Nov-20 14:13:46 GMT; path=/; domain=.bundlephobia.com; HttpOnly; Secure' + ], + 'request-id': '50ed8366-af30-44ff-8d9d-83944147ae7d', + 'x-ratelimit-limit': '60', + 'x-ratelimit-reset': '1572677719567', + vary: 'Accept-Encoding', + 'content-encoding': 'identity', + 'cache-control': 'max-age=86400, no-transform', + 'x-ua-compatible': 'IE=Edge', + 'access-control-allow-origin': '*', + 'access-control-allow-headers': '*', + 'access-control-allow-methods': 'GET, OPTIONS', + 'x-nginx-cache-status': 'EXPIRED', + 'cf-cache-status': 'HIT', + age: '1993', + 'accept-ranges': 'bytes', + 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', + server: 'cloudflare', + 'cf-ray': '52f6b6066b1bcc30-SIN' + }, + config: { + url: 'https://bundlephobia.com/api/size?package=react', + method: 'get', + headers: { + Accept: 'application/json, text/plain, */*', + 'User-Agent': 'axios/0.19.0' + }, + transformRequest: [ [Function: transformRequest] ], + transformResponse: [ [Function: transformResponse] ], + timeout: 0, + adapter: [Function: httpAdapter], + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + maxContentLength: -1, + validateStatus: [Function: validateStatus], + data: undefined + }, + request: ClientRequest { + _events: [Object: null prototype] { + socket: [Function], + abort: [Function], + aborted: [Function], + error: [Function], + timeout: [Function], + prefinish: [Function: requestOnPrefinish] + }, + _eventsCount: 6, + _maxListeners: undefined, + outputData: [], + outputSize: 0, + writable: true, + _last: true, + chunkedEncoding: false, + shouldKeepAlive: false, + useChunkedEncodingByDefault: false, + sendDate: false, + _removedConnection: false, + _removedContLen: false, + _removedTE: false, + _contentLength: 0, + _hasBody: true, + _trailer: '', + finished: true, + _headerSent: true, + socket: TLSSocket { + _tlsOptions: [Object], + _secureEstablished: true, + _securePending: false, + _newSessionPending: false, + _controlReleased: true, + _SNICallback: null, + servername: 'bundlephobia.com', + alpnProtocol: false, + authorized: true, + authorizationError: null, + encrypted: true, + _events: [Object: null prototype], + _eventsCount: 10, + connecting: false, + _hadError: false, + _parent: null, + _host: 'bundlephobia.com', + _readableState: [ReadableState], + readable: true, + _maxListeners: undefined, + _writableState: [WritableState], + writable: false, + allowHalfOpen: false, + _sockname: null, + _pendingData: null, + _pendingEncoding: '', + server: undefined, + _server: null, + ssl: [TLSWrap], + _requestCert: true, + _rejectUnauthorized: true, + parser: null, + _httpMessage: [Circular], + [Symbol(res)]: [TLSWrap], + [Symbol(asyncId)]: 43, + [Symbol(kHandle)]: [TLSWrap], + [Symbol(lastWriteQueueSize)]: 0, + [Symbol(timeout)]: null, + [Symbol(kBytesRead)]: 0, + [Symbol(kBytesWritten)]: 0, + [Symbol(connect-options)]: [Object] + }, + connection: TLSSocket { + _tlsOptions: [Object], + _secureEstablished: true, + _securePending: false, + _newSessionPending: false, + _controlReleased: true, + _SNICallback: null, + servername: 'bundlephobia.com', + alpnProtocol: false, + authorized: true, + authorizationError: null, + encrypted: true, + _events: [Object: null prototype], + _eventsCount: 10, + connecting: false, + _hadError: false, + _parent: null, + _host: 'bundlephobia.com', + _readableState: [ReadableState], + readable: true, + _maxListeners: undefined, + _writableState: [WritableState], + writable: false, + allowHalfOpen: false, + _sockname: null, + _pendingData: null, + _pendingEncoding: '', + server: undefined, + _server: null, + ssl: [TLSWrap], + _requestCert: true, + _rejectUnauthorized: true, + parser: null, + _httpMessage: [Circular], + [Symbol(res)]: [TLSWrap], + [Symbol(asyncId)]: 43, + [Symbol(kHandle)]: [TLSWrap], + [Symbol(lastWriteQueueSize)]: 0, + [Symbol(timeout)]: null, + [Symbol(kBytesRead)]: 0, + [Symbol(kBytesWritten)]: 0, + [Symbol(connect-options)]: [Object] + }, + _header: 'GET /api/size?package=react HTTP/1.1\r\n' + + 'Accept: application/json, text/plain, */*\r\n' + + 'User-Agent: axios/0.19.0\r\n' + + 'Host: bundlephobia.com\r\n' + + 'Connection: close\r\n' + + '\r\n', + _onPendingData: [Function: noopPendingOutput], + agent: Agent { + _events: [Object: null prototype], + _eventsCount: 1, + _maxListeners: undefined, + defaultPort: 443, + protocol: 'https:', + options: [Object], + requests: {}, + sockets: [Object], + freeSockets: {}, + keepAliveMsecs: 1000, + keepAlive: false, + maxSockets: Infinity, + maxFreeSockets: 256, + maxCachedSessions: 100, + _sessionCache: [Object] + }, + socketPath: undefined, + method: 'GET', + path: '/api/size?package=react', + _ended: true, + res: IncomingMessage { + _readableState: [ReadableState], + readable: false, + _events: [Object: null prototype], + _eventsCount: 3, + _maxListeners: undefined, + socket: [TLSSocket], + connection: [TLSSocket], + httpVersionMajor: 1, + httpVersionMinor: 1, + httpVersion: '1.1', + complete: true, + headers: [Object], + rawHeaders: [Array], + trailers: {}, + rawTrailers: [], + aborted: false, + upgrade: false, + url: '', + method: null, + statusCode: 200, + statusMessage: 'OK', + client: [TLSSocket], + _consuming: false, + _dumped: false, + req: [Circular], + responseUrl: 'https://bundlephobia.com/api/size?package=react', + redirects: [] + }, + aborted: false, + timeoutCb: null, + upgradeOrConnect: false, + parser: null, + maxHeadersCount: null, + _redirectable: Writable { + _writableState: [WritableState], + writable: true, + _events: [Object: null prototype], + _eventsCount: 2, + _maxListeners: undefined, + _options: [Object], + _redirectCount: 0, + _redirects: [], + _requestBodyLength: 0, + _requestBodyBuffers: [], + _onNativeResponse: [Function], + _currentRequest: [Circular], + _currentUrl: 'https://bundlephobia.com/api/size?package=react' + }, + [Symbol(kNeedDrain)]: false, + [Symbol(isCorked)]: false, + [Symbol(kOutHeaders)]: [Object: null prototype] { + accept: [Array], + 'user-agent': [Array], + host: [Array] + } + }, + data: { + assets: [ [Object] ], + dependencyCount: 3, + dependencySizes: [ [Object] ], + description: 'React is a JavaScript library for building user interfaces.', + gzip: 2630, + hasJSModule: false, + hasJSNext: false, + hasSideEffects: true, + name: 'react', + repository: 'https://github.com/facebook/react.git', + scoped: false, + size: 6499, + version: '16.11.0' + } +} diff --git a/error.json b/error.json new file mode 100644 index 0000000..8081885 --- /dev/null +++ b/error.json @@ -0,0 +1,17 @@ +{ + data: { + assets: [ [Object] ], + dependencyCount: 3, + dependencySizes: [ [Object] ], + description: 'React is a JavaScript library for building user interfaces.', + gzip: 2630, + hasJSModule: false, + hasJSNext: false, + hasSideEffects: true, + name: 'react', + repository: 'https://github.com/facebook/react.git', + scoped: false, + size: 6499, + version: '16.11.0' + } +} diff --git a/src/commands/bundlephobia.ts b/src/commands/bundlephobia.ts index 1730aed..9e740af 100644 --- a/src/commands/bundlephobia.ts +++ b/src/commands/bundlephobia.ts @@ -50,13 +50,32 @@ export default class Bundlephobia extends Command { } private bundlePhobia(p: string) { - this.log('called for ' + p) + Logger.info(this, `running for ${p}`) + Logger.progressStart(this, `finding size of ${p}`) let url = `https://bundlephobia.com/api/size?package=${p}` - this.log('calling '+url) + + // this.log('calling: ' + url) axios .get(url) - .then(response => this.log(response.data)) - .catch(response => this.log(response)) - .finally(() => this.log(`done for ${p}`)) + .then(successResponse => { + // this.showDependencyData(successResponse.data) + Logger.progressStop(this, this.showDependencyData(successResponse.data)) + }) + .catch(errorResponse => { + // Logger.warn(this, ) + Logger.progressStopError(this, `[${p}] : ${errorResponse.response.data.error.message}`) + }) + + return true + } + + private showDependencyData(data: any) { + // Logger.info(this, `${data.name}@${data.version} minified:${this.getKB(data.size)} gzip:${this.getKB(data.gzip)}`) + return `[${data.name}@${data.version}] minified:${this.getSize(data.size)} gzip:${this.getSize(data.gzip)}` + } + + private getSize(byteSize: number) { + if (byteSize < 1024) return `${byteSize.toFixed(1)} B` + else if (byteSize > 1024) return `${(byteSize / 1024).toFixed(1)} kB` } } diff --git a/src/utilities/logger.ts b/src/utilities/logger.ts index 154fc47..0a40f4b 100644 --- a/src/utilities/logger.ts +++ b/src/utilities/logger.ts @@ -19,6 +19,12 @@ export default class Logger { signale.error(`${message}`) thisRef.exit(0) //added to exit command } + + // tslint:disable-next-line:no-unused + public static warn(thisRef: any, message: any) { + signale.warn(`${message}`) + } + // tslint:disable-next-line:no-unused public static progressStart(thisRef: any, message: string) { // signale.watch(`${message}`) @@ -26,11 +32,23 @@ export default class Logger { Logger.spinner.start() } + // tslint:disable-next-line:no-unused + public static progressStart1(thisRef: any, message: string) { + // signale.watch(`${message}`) + Logger.spinner = Ora() + Logger.spinner.start() + } + // tslint:disable-next-line:no-unused public static progressStop(thisRef: any, message: string) { Logger.spinner.succeed(message) } + // tslint:disable-next-line:no-unused + public static progressStopError(thisRef: any, message: string) { + Logger.spinner.warn(message) + } + // public static logSuccess(thisRef: any, message: string) { // thisRef.log(` › Success: ${message}`) // } @@ -40,5 +58,4 @@ export default class Logger { // public static logError(thisRef: any, message: string) { // thisRef.error(`${message}`) // } - } From 283293aba098311a99583575e09e5674bd6aa519 Mon Sep 17 00:00:00 2001 From: ashish Date: Sat, 2 Nov 2019 20:21:49 +0530 Subject: [PATCH 04/14] [BUNDLEPHOBIA]: white space fixed Signed-off-by: ashish --- test/commands/crypto.test.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/test/commands/crypto.test.ts b/test/commands/crypto.test.ts index b1e8e3a..98da100 100644 --- a/test/commands/crypto.test.ts +++ b/test/commands/crypto.test.ts @@ -19,49 +19,49 @@ describe('crypto', () => { test .stdout() - .command(['crypto', '-d', 'aes', '-s','U2FsdGVkX1/OLQ6Lp+V3O1d5SaxEf9pAf8CV7ErBC9o=', '-k', 'Secret Passphrase']) + .command(['crypto', '-d', 'aes', '-s', 'U2FsdGVkX1/OLQ6Lp+V3O1d5SaxEf9pAf8CV7ErBC9o=', '-k', 'Secret Passphrase']) .it('AES Decryption string passed as flag', ctx => { expect(ctx.stdout).to.contain('Message') }) test .stdout() - .command(['crypto', '-d', 'des', '-s','U2FsdGVkX180d+J1kUcxGL9bbBAErXAw', '-k', 'Secret Passphrase']) + .command(['crypto', '-d', 'des', '-s', 'U2FsdGVkX180d+J1kUcxGL9bbBAErXAw', '-k', 'Secret Passphrase']) .it('DES Decryption', ctx => { expect(ctx.stdout).to.contain('Message') }) test .stdout() - .command(['crypto', '-d', 'des', '-s','U2FsdGVkX186YglxZ7yF7aqTjFQA3Yzs', '-k', 'Secret Passphrase','-m','ECB']) + .command(['crypto', '-d', 'des', '-s', 'U2FsdGVkX186YglxZ7yF7aqTjFQA3Yzs', '-k', 'Secret Passphrase', '-m', 'ECB']) .it('DES Decryption with Mode ECB', ctx => { expect(ctx.stdout).to.contain('Message') }) test .stdout() - .command(['crypto', '-d', '3des', '-s','U2FsdGVkX1+2jkjCxuWwL8uMgdu6SXJc', '-k', 'Secret Passphrase']) + .command(['crypto', '-d', '3des', '-s', 'U2FsdGVkX1+2jkjCxuWwL8uMgdu6SXJc', '-k', 'Secret Passphrase']) .it('3DES Decryption', ctx => { expect(ctx.stdout).to.contain('Message') }) test .stdout() - .command(['crypto', '-d', 'RABBIT', '-s','U2FsdGVkX185oOsUqvpF+7x0zPUxNJw=', '-k', 'Secret Passphrase']) + .command(['crypto', '-d', 'RABBIT', '-s', 'U2FsdGVkX185oOsUqvpF+7x0zPUxNJw=', '-k', 'Secret Passphrase']) .it('RABBIT Decryption', ctx => { expect(ctx.stdout).to.contain('Message') }) test .stdout() - .command(['crypto', '-d', 'RC4', '-s','U2FsdGVkX1+/oErpaqQQk1Fj2eXwL1o=', '-k', 'Secret Passphrase']) + .command(['crypto', '-d', 'RC4', '-s', 'U2FsdGVkX1+/oErpaqQQk1Fj2eXwL1o=', '-k', 'Secret Passphrase']) .it('RC4 Decryption', ctx => { expect(ctx.stdout).to.contain('Message') }) test .stdout() - .command(['crypto', '-d', 'RC4DROP', '-s','U2FsdGVkX18+D1WNQ64XzaCwkUM6moE=', '-k', 'Secret Passphrase']) + .command(['crypto', '-d', 'RC4DROP', '-s', 'U2FsdGVkX18+D1WNQ64XzaCwkUM6moE=', '-k', 'Secret Passphrase']) .it('RC4Drop Decryption', ctx => { expect(ctx.stdout).to.contain('Message') }) @@ -92,7 +92,7 @@ describe('crypto', () => { test .stdout() - .command(['crypto', '-e', 'aes','-d', 'aes', '-s', 'Message', '-k', 'Secret Passphrase']) + .command(['crypto', '-e', 'aes', '-d', 'aes', '-s', 'Message', '-k', 'Secret Passphrase']) .exit(0) .it('Both encryption and decryption methods passed', ctx => { expect(ctx.stdout).to.contain('Both encryption and decryption methods passed') @@ -106,5 +106,4 @@ describe('crypto', () => { expect(ctx.stdout).to.contain('Neither encryption or decryption methods passed') }) - }) From 82700e84a787154b7d59e9f473a36dd37a4bd0e5 Mon Sep 17 00:00:00 2001 From: ashish Date: Sat, 2 Nov 2019 20:32:25 +0530 Subject: [PATCH 05/14] [BUNDLEPHOBIA]: working for single dependency Signed-off-by: ashish --- test/commands/bundlephobia.test.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/commands/bundlephobia.test.ts b/test/commands/bundlephobia.test.ts index 72d55e0..165c6db 100644 --- a/test/commands/bundlephobia.test.ts +++ b/test/commands/bundlephobia.test.ts @@ -8,4 +8,22 @@ describe('bundlephobia', () => { .it('if no package passed', ctx => { expect(ctx.stdout).to.contain('At least one package must be passed') }) + + test + .stdout() + .command(['bundlephobia', 'react@16.10.2']) + .it('if package passed with argument', ctx => { + setTimeout(() => // TODO: can we remove it and check if we can resolve promise here + expect(ctx.stdout).to.contain(' [react@16.10.2] minified:6.5 kB gzip:2.6 kB') + , 5000) // proving 5 seconds just to be safe + }) + + test + .stdout() + .command(['bundlephobia', '-p', 'react@16.10.2']) + .it('if package passed with flag', ctx => { + setTimeout(() => // TODO: can we remove it and check if we can resolve promise here + expect(ctx.stdout).to.contain(' [react@16.10.2] minified:6.5 kB gzip:2.6 kB') + , 5000) + }) }) From fd82111c69bf29f9be26bfc2b0f85d83506da770 Mon Sep 17 00:00:00 2001 From: ashish Date: Sat, 2 Nov 2019 20:33:21 +0530 Subject: [PATCH 06/14] [BUNDLEPHOBIA]: todos added Signed-off-by: ashish --- error.js | 262 ----------------------------------- src/commands/bundlephobia.ts | 2 + 2 files changed, 2 insertions(+), 262 deletions(-) delete mode 100644 error.js diff --git a/error.js b/error.js deleted file mode 100644 index 0c2d540..0000000 --- a/error.js +++ /dev/null @@ -1,262 +0,0 @@ -ℹ info running for react - -{ - status: 200, - statusText: 'OK', - headers: { - date: 'Sat, 02 Nov 2019 14:13:46 GMT', - 'content-type': 'application/json; charset=utf-8', - 'content-length': '407', - connection: 'close', - 'set-cookie': [ - '__cfduid=d6c4f18b79e2f01aac4e034417dee36e91572704026; expires=Sun, 01-Nov-20 14:13:46 GMT; path=/; domain=.bundlephobia.com; HttpOnly; Secure' - ], - 'request-id': '50ed8366-af30-44ff-8d9d-83944147ae7d', - 'x-ratelimit-limit': '60', - 'x-ratelimit-reset': '1572677719567', - vary: 'Accept-Encoding', - 'content-encoding': 'identity', - 'cache-control': 'max-age=86400, no-transform', - 'x-ua-compatible': 'IE=Edge', - 'access-control-allow-origin': '*', - 'access-control-allow-headers': '*', - 'access-control-allow-methods': 'GET, OPTIONS', - 'x-nginx-cache-status': 'EXPIRED', - 'cf-cache-status': 'HIT', - age: '1993', - 'accept-ranges': 'bytes', - 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', - server: 'cloudflare', - 'cf-ray': '52f6b6066b1bcc30-SIN' - }, - config: { - url: 'https://bundlephobia.com/api/size?package=react', - method: 'get', - headers: { - Accept: 'application/json, text/plain, */*', - 'User-Agent': 'axios/0.19.0' - }, - transformRequest: [ [Function: transformRequest] ], - transformResponse: [ [Function: transformResponse] ], - timeout: 0, - adapter: [Function: httpAdapter], - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN', - maxContentLength: -1, - validateStatus: [Function: validateStatus], - data: undefined - }, - request: ClientRequest { - _events: [Object: null prototype] { - socket: [Function], - abort: [Function], - aborted: [Function], - error: [Function], - timeout: [Function], - prefinish: [Function: requestOnPrefinish] - }, - _eventsCount: 6, - _maxListeners: undefined, - outputData: [], - outputSize: 0, - writable: true, - _last: true, - chunkedEncoding: false, - shouldKeepAlive: false, - useChunkedEncodingByDefault: false, - sendDate: false, - _removedConnection: false, - _removedContLen: false, - _removedTE: false, - _contentLength: 0, - _hasBody: true, - _trailer: '', - finished: true, - _headerSent: true, - socket: TLSSocket { - _tlsOptions: [Object], - _secureEstablished: true, - _securePending: false, - _newSessionPending: false, - _controlReleased: true, - _SNICallback: null, - servername: 'bundlephobia.com', - alpnProtocol: false, - authorized: true, - authorizationError: null, - encrypted: true, - _events: [Object: null prototype], - _eventsCount: 10, - connecting: false, - _hadError: false, - _parent: null, - _host: 'bundlephobia.com', - _readableState: [ReadableState], - readable: true, - _maxListeners: undefined, - _writableState: [WritableState], - writable: false, - allowHalfOpen: false, - _sockname: null, - _pendingData: null, - _pendingEncoding: '', - server: undefined, - _server: null, - ssl: [TLSWrap], - _requestCert: true, - _rejectUnauthorized: true, - parser: null, - _httpMessage: [Circular], - [Symbol(res)]: [TLSWrap], - [Symbol(asyncId)]: 43, - [Symbol(kHandle)]: [TLSWrap], - [Symbol(lastWriteQueueSize)]: 0, - [Symbol(timeout)]: null, - [Symbol(kBytesRead)]: 0, - [Symbol(kBytesWritten)]: 0, - [Symbol(connect-options)]: [Object] - }, - connection: TLSSocket { - _tlsOptions: [Object], - _secureEstablished: true, - _securePending: false, - _newSessionPending: false, - _controlReleased: true, - _SNICallback: null, - servername: 'bundlephobia.com', - alpnProtocol: false, - authorized: true, - authorizationError: null, - encrypted: true, - _events: [Object: null prototype], - _eventsCount: 10, - connecting: false, - _hadError: false, - _parent: null, - _host: 'bundlephobia.com', - _readableState: [ReadableState], - readable: true, - _maxListeners: undefined, - _writableState: [WritableState], - writable: false, - allowHalfOpen: false, - _sockname: null, - _pendingData: null, - _pendingEncoding: '', - server: undefined, - _server: null, - ssl: [TLSWrap], - _requestCert: true, - _rejectUnauthorized: true, - parser: null, - _httpMessage: [Circular], - [Symbol(res)]: [TLSWrap], - [Symbol(asyncId)]: 43, - [Symbol(kHandle)]: [TLSWrap], - [Symbol(lastWriteQueueSize)]: 0, - [Symbol(timeout)]: null, - [Symbol(kBytesRead)]: 0, - [Symbol(kBytesWritten)]: 0, - [Symbol(connect-options)]: [Object] - }, - _header: 'GET /api/size?package=react HTTP/1.1\r\n' + - 'Accept: application/json, text/plain, */*\r\n' + - 'User-Agent: axios/0.19.0\r\n' + - 'Host: bundlephobia.com\r\n' + - 'Connection: close\r\n' + - '\r\n', - _onPendingData: [Function: noopPendingOutput], - agent: Agent { - _events: [Object: null prototype], - _eventsCount: 1, - _maxListeners: undefined, - defaultPort: 443, - protocol: 'https:', - options: [Object], - requests: {}, - sockets: [Object], - freeSockets: {}, - keepAliveMsecs: 1000, - keepAlive: false, - maxSockets: Infinity, - maxFreeSockets: 256, - maxCachedSessions: 100, - _sessionCache: [Object] - }, - socketPath: undefined, - method: 'GET', - path: '/api/size?package=react', - _ended: true, - res: IncomingMessage { - _readableState: [ReadableState], - readable: false, - _events: [Object: null prototype], - _eventsCount: 3, - _maxListeners: undefined, - socket: [TLSSocket], - connection: [TLSSocket], - httpVersionMajor: 1, - httpVersionMinor: 1, - httpVersion: '1.1', - complete: true, - headers: [Object], - rawHeaders: [Array], - trailers: {}, - rawTrailers: [], - aborted: false, - upgrade: false, - url: '', - method: null, - statusCode: 200, - statusMessage: 'OK', - client: [TLSSocket], - _consuming: false, - _dumped: false, - req: [Circular], - responseUrl: 'https://bundlephobia.com/api/size?package=react', - redirects: [] - }, - aborted: false, - timeoutCb: null, - upgradeOrConnect: false, - parser: null, - maxHeadersCount: null, - _redirectable: Writable { - _writableState: [WritableState], - writable: true, - _events: [Object: null prototype], - _eventsCount: 2, - _maxListeners: undefined, - _options: [Object], - _redirectCount: 0, - _redirects: [], - _requestBodyLength: 0, - _requestBodyBuffers: [], - _onNativeResponse: [Function], - _currentRequest: [Circular], - _currentUrl: 'https://bundlephobia.com/api/size?package=react' - }, - [Symbol(kNeedDrain)]: false, - [Symbol(isCorked)]: false, - [Symbol(kOutHeaders)]: [Object: null prototype] { - accept: [Array], - 'user-agent': [Array], - host: [Array] - } - }, - data: { - assets: [ [Object] ], - dependencyCount: 3, - dependencySizes: [ [Object] ], - description: 'React is a JavaScript library for building user interfaces.', - gzip: 2630, - hasJSModule: false, - hasJSNext: false, - hasSideEffects: true, - name: 'react', - repository: 'https://github.com/facebook/react.git', - scoped: false, - size: 6499, - version: '16.11.0' - } -} diff --git a/src/commands/bundlephobia.ts b/src/commands/bundlephobia.ts index 9e740af..76e6849 100644 --- a/src/commands/bundlephobia.ts +++ b/src/commands/bundlephobia.ts @@ -3,6 +3,8 @@ import axios from 'axios' import Logger from '../utilities/logger' +// TODO: add multiple package support +// ADD package.json support export default class Bundlephobia extends Command { static description = 'Find cost of adding a npm/yarn package' From 0e0159be09b167d3b1438e7295dbf73dc50f9725 Mon Sep 17 00:00:00 2001 From: ashish Date: Sun, 3 Nov 2019 01:11:18 +0530 Subject: [PATCH 07/14] [BUNDLEPHOBIA]: chalk added for styling Signed-off-by: ashish --- package.json | 1 + src/commands/bundlephobia.ts | 12 +++++++++--- test/commands/bundlephobia.test.ts | 4 +++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index b6ded76..e4e2cf6 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@types/crypto-js": "^3.1.43", "@types/signale": "^1.2.1", "axios": "^0.19.0", + "chalk": "^2.4.2", "crypto-js": "^3.1.9-1", "jshashes": "^1.0.7", "minify": "^4.1.3", diff --git a/src/commands/bundlephobia.ts b/src/commands/bundlephobia.ts index 76e6849..4c0fddc 100644 --- a/src/commands/bundlephobia.ts +++ b/src/commands/bundlephobia.ts @@ -1,10 +1,12 @@ import {Command, flags} from '@oclif/command' import axios from 'axios' +import chalk from 'chalk' import Logger from '../utilities/logger' // TODO: add multiple package support // ADD package.json support +// ADD VALID tests ( for now they just ignoring ) export default class Bundlephobia extends Command { static description = 'Find cost of adding a npm/yarn package' @@ -73,11 +75,15 @@ export default class Bundlephobia extends Command { private showDependencyData(data: any) { // Logger.info(this, `${data.name}@${data.version} minified:${this.getKB(data.size)} gzip:${this.getKB(data.gzip)}`) - return `[${data.name}@${data.version}] minified:${this.getSize(data.size)} gzip:${this.getSize(data.gzip)}` + return `${chalk.magenta(data.name)}@${chalk.cyan(data.version)} has ${data.dependencyCount} dependencies with size of ${this.getSize(data.size)}(${this.getSize(data.gzip)} gzipped)` } private getSize(byteSize: number) { - if (byteSize < 1024) return `${byteSize.toFixed(1)} B` - else if (byteSize > 1024) return `${(byteSize / 1024).toFixed(1)} kB` + if (byteSize >= 1024 * 1024) + return `${chalk.red((byteSize / (1024 * 1024)).toFixed(1) + 'MB')}` + else if (byteSize >= 1024) + return `${chalk.blue((byteSize / (1024)).toFixed(1) + 'KB')}` + else //if (byteSize < 1024) + return `${chalk.green(byteSize.toFixed(1) + 'B')}` } } diff --git a/test/commands/bundlephobia.test.ts b/test/commands/bundlephobia.test.ts index 165c6db..7de47c4 100644 --- a/test/commands/bundlephobia.test.ts +++ b/test/commands/bundlephobia.test.ts @@ -1,5 +1,7 @@ import {expect, test} from '@oclif/test' +// TODO: add test for invalid package +// test for valid with matching describe('bundlephobia', () => { test .stdout() @@ -20,7 +22,7 @@ describe('bundlephobia', () => { test .stdout() - .command(['bundlephobia', '-p', 'react@16.10.2']) + .command(['bundlephobia', '-p', 'react@16.10.2', 'react@15.10.2']) .it('if package passed with flag', ctx => { setTimeout(() => // TODO: can we remove it and check if we can resolve promise here expect(ctx.stdout).to.contain(' [react@16.10.2] minified:6.5 kB gzip:2.6 kB') From e2cfd9ff05938134870a3071933dd249d248616e Mon Sep 17 00:00:00 2001 From: ashish Date: Sun, 3 Nov 2019 01:52:06 +0530 Subject: [PATCH 08/14] [BUNDLEPHOBIA]: multiple packages working Signed-off-by: ashish --- src/commands/bundlephobia.ts | 70 ++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/src/commands/bundlephobia.ts b/src/commands/bundlephobia.ts index 4c0fddc..1f6ded5 100644 --- a/src/commands/bundlephobia.ts +++ b/src/commands/bundlephobia.ts @@ -29,10 +29,30 @@ export default class Bundlephobia extends Command { this.checkParameters(flags, args) - args.packages.map( - (p: string) => this.bundlePhobia(p) + Logger.progressStart(this, 'finding size...') + + let size = 0 + let gzip = 0 + let dependencyCount = 0 + + let responseList = await args.packages.map( + (pkg: string) => this.bundlePhobia(pkg) ) + // return `${chalk.magenta('Total')} [${chalk.cyan(data.count)}] has ${data.dependencyCount} dependencies with size of ${this.getSize(data.size)}(${this.getSize(data.gzip)} gzipped)` + + responseList.map((response: any) => { + size += response.size + gzip += response.gzipSize + dependencyCount += response.dependencyCount + }) + + Logger.success(this, this.getFinalMessage({ + count: args.packages.length, + dependencyCount, + size, + gzip + })) } private getPackages(flags: any, args: any) { @@ -53,31 +73,50 @@ export default class Bundlephobia extends Command { Logger.error(this, 'At least one package must be passed') } - private bundlePhobia(p: string) { - Logger.info(this, `running for ${p}`) - Logger.progressStart(this, `finding size of ${p}`) - let url = `https://bundlephobia.com/api/size?package=${p}` + private bundlePhobia(pkg: string) { + let url = `https://bundlephobia.com/api/size?package=${pkg}` - // this.log('calling: ' + url) + let size = 0 + let gzipSize = 0 + let dependencyCount = 0 axios - .get(url) + .get(url, { + headers: {'User-Agent': '@codingtools/cdt', 'X-Bundlephobia-User': '@codingtools/cdt'} + }) .then(successResponse => { - // this.showDependencyData(successResponse.data) - Logger.progressStop(this, this.showDependencyData(successResponse.data)) + size = successResponse.data.size + gzipSize = successResponse.data.gzip + dependencyCount = successResponse.data.dependencyCount + Logger.progressStop(this, this.getSuccessMessage(successResponse.data)) }) .catch(errorResponse => { - // Logger.warn(this, ) - Logger.progressStopError(this, `[${p}] : ${errorResponse.response.data.error.message}`) + Logger.progressStopError(this, this.getErrorMessage(pkg, errorResponse.response.data.error.message)) }) - return true + return {size , gzipSize, dependencyCount} } - private showDependencyData(data: any) { - // Logger.info(this, `${data.name}@${data.version} minified:${this.getKB(data.size)} gzip:${this.getKB(data.gzip)}`) + private getFinalMessage(data: any) { + return `${chalk.magenta('Total')} [${chalk.cyan(data.count)}] has ${data.dependencyCount} dependencies with size of ${this.getSize(data.size)}(${this.getSize(data.gzip)} gzipped)` + } + + private getSuccessMessage(data: any) { return `${chalk.magenta(data.name)}@${chalk.cyan(data.version)} has ${data.dependencyCount} dependencies with size of ${this.getSize(data.size)}(${this.getSize(data.gzip)} gzipped)` } + private getErrorMessage(pkg: string, message: string) { + // 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 - `latest`, `0.1.1` and `0.1.2` +*/ + if (message.includes('This package has not been published with this particular version.')) + message = message.replace(/`|<\/code>`/g, '') + + return `${chalk.magenta(pkg)} ${message}` + } + private getSize(byteSize: number) { if (byteSize >= 1024 * 1024) return `${chalk.red((byteSize / (1024 * 1024)).toFixed(1) + 'MB')}` @@ -86,4 +125,5 @@ export default class Bundlephobia extends Command { else //if (byteSize < 1024) return `${chalk.green(byteSize.toFixed(1) + 'B')}` } + } From e770d5dca754365f55f17f2c36594f6418d17767 Mon Sep 17 00:00:00 2001 From: ashish Date: Sun, 3 Nov 2019 02:47:13 +0530 Subject: [PATCH 09/14] [BUNDLEPHOBIA]: working for total in case of all success Signed-off-by: ashish --- src/commands/bundlephobia.ts | 58 +++++++++++++++++------------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/src/commands/bundlephobia.ts b/src/commands/bundlephobia.ts index 1f6ded5..77fc5ee 100644 --- a/src/commands/bundlephobia.ts +++ b/src/commands/bundlephobia.ts @@ -35,24 +35,35 @@ export default class Bundlephobia extends Command { let gzip = 0 let dependencyCount = 0 - let responseList = await args.packages.map( + let promiseList = args.packages.map( (pkg: string) => this.bundlePhobia(pkg) ) - // return `${chalk.magenta('Total')} [${chalk.cyan(data.count)}] has ${data.dependencyCount} dependencies with size of ${this.getSize(data.size)}(${this.getSize(data.gzip)} gzipped)` - - responseList.map((response: any) => { - size += response.size - gzip += response.gzipSize - dependencyCount += response.dependencyCount - }) + // @ts-ignore + axios.all(promiseList).then( + axios.spread((...responses) => { + responses.map((successResponse: any) => { + size += successResponse.data.size + gzip += successResponse.data.gzip + dependencyCount += successResponse.data.dependencyCount + Logger.progressStop(this, this.getSuccessMessage(successResponse.data)) + }) + }) + ) + .catch((...errors) => { + errors.map(errorResponse => { + Logger.progressStopError(this, this.getErrorMessage('pkg', errorResponse.response.data.error.message)) + }) + }) + .finally(() => { + Logger.success(this, '\n' + this.getFinalMessage({ + count: args.packages.length, + dependencyCount, + size, + gzip + })) + }) - Logger.success(this, this.getFinalMessage({ - count: args.packages.length, - dependencyCount, - size, - gzip - })) } private getPackages(flags: any, args: any) { @@ -75,29 +86,14 @@ export default class Bundlephobia extends Command { private bundlePhobia(pkg: string) { let url = `https://bundlephobia.com/api/size?package=${pkg}` - - let size = 0 - let gzipSize = 0 - let dependencyCount = 0 - axios + return axios .get(url, { headers: {'User-Agent': '@codingtools/cdt', 'X-Bundlephobia-User': '@codingtools/cdt'} }) - .then(successResponse => { - size = successResponse.data.size - gzipSize = successResponse.data.gzip - dependencyCount = successResponse.data.dependencyCount - Logger.progressStop(this, this.getSuccessMessage(successResponse.data)) - }) - .catch(errorResponse => { - Logger.progressStopError(this, this.getErrorMessage(pkg, errorResponse.response.data.error.message)) - }) - - return {size , gzipSize, dependencyCount} } private getFinalMessage(data: any) { - return `${chalk.magenta('Total')} [${chalk.cyan(data.count)}] has ${data.dependencyCount} dependencies with size of ${this.getSize(data.size)}(${this.getSize(data.gzip)} gzipped)` + return `${chalk.magenta('Total')} [${chalk.cyan(data.count + ' packages')}] has ${data.dependencyCount} dependencies with size of ${this.getSize(data.size)}(${this.getSize(data.gzip)} gzipped)` } private getSuccessMessage(data: any) { From e864c3273a246b6516ea07c953a2f6b4b390000b Mon Sep 17 00:00:00 2001 From: ashish Date: Sun, 3 Nov 2019 03:11:13 +0530 Subject: [PATCH 10/14] [BUNDLEPHOBIA]: working for all Cases Signed-off-by: ashish --- src/commands/bundlephobia.ts | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/src/commands/bundlephobia.ts b/src/commands/bundlephobia.ts index 77fc5ee..61393e3 100644 --- a/src/commands/bundlephobia.ts +++ b/src/commands/bundlephobia.ts @@ -1,6 +1,7 @@ import {Command, flags} from '@oclif/command' import axios from 'axios' import chalk from 'chalk' +import {gzip} from 'zlib' import Logger from '../utilities/logger' @@ -35,27 +36,21 @@ export default class Bundlephobia extends Command { let gzip = 0 let dependencyCount = 0 - let promiseList = args.packages.map( + let urlList = args.packages.map( (pkg: string) => this.bundlePhobia(pkg) ) - // @ts-ignore - axios.all(promiseList).then( - axios.spread((...responses) => { - responses.map((successResponse: any) => { - size += successResponse.data.size - gzip += successResponse.data.gzip - dependencyCount += successResponse.data.dependencyCount - Logger.progressStop(this, this.getSuccessMessage(successResponse.data)) - }) + axios.all(urlList.map((url: string) => { + return axios.get(url).then(successResponse => { + size += successResponse.data.size + gzip += successResponse.data.gzip + dependencyCount += successResponse.data.dependencyCount + Logger.progressStop(this, this.getSuccessMessage(successResponse.data)) + }).catch(errorResponse => { + Logger.progressStopError(this, this.getErrorMessage('pkg', errorResponse.response.data.error.message)) }) - ) - .catch((...errors) => { - errors.map(errorResponse => { - Logger.progressStopError(this, this.getErrorMessage('pkg', errorResponse.response.data.error.message)) - }) - }) - .finally(() => { + })) + . finally(() => { Logger.success(this, '\n' + this.getFinalMessage({ count: args.packages.length, dependencyCount, @@ -86,10 +81,7 @@ export default class Bundlephobia extends Command { private bundlePhobia(pkg: string) { let url = `https://bundlephobia.com/api/size?package=${pkg}` - return axios - .get(url, { - headers: {'User-Agent': '@codingtools/cdt', 'X-Bundlephobia-User': '@codingtools/cdt'} - }) + return url } private getFinalMessage(data: any) { From 17f8a6b176ddd86856a57c9f73e64075f7809e80 Mon Sep 17 00:00:00 2001 From: ashish Date: Sun, 3 Nov 2019 03:21:01 +0530 Subject: [PATCH 11/14] [MINIFY]: added file type in flag description Signed-off-by: ashish --- src/commands/minify.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/minify.ts b/src/commands/minify.ts index 3103f1f..1f765d6 100644 --- a/src/commands/minify.ts +++ b/src/commands/minify.ts @@ -10,7 +10,7 @@ export default class Minify extends Command { static flags = { help: flags.help({char: 'h'}), - type: flags.string({char: 't' , description: 'type of file to be minified, it will try to find type with extension'}), + type: flags.string({char: 't' , description: 'type of file to be minified, it will try to find type with extension supported: JS, HTML/HTM, CSS'}), file: flags.string({char: 'f' , description: 'file to be minified'}), } From 6fb70602f78ae15728445b6047829e83502dbc50 Mon Sep 17 00:00:00 2001 From: ashish Date: Sun, 3 Nov 2019 03:42:11 +0530 Subject: [PATCH 12/14] [BUNDLEPHOBIA]: added other styling and refactored Signed-off-by: ashish --- src/commands/bundlephobia.ts | 117 ++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 57 deletions(-) diff --git a/src/commands/bundlephobia.ts b/src/commands/bundlephobia.ts index 61393e3..52c7b0e 100644 --- a/src/commands/bundlephobia.ts +++ b/src/commands/bundlephobia.ts @@ -1,11 +1,10 @@ import {Command, flags} from '@oclif/command' import axios from 'axios' import chalk from 'chalk' -import {gzip} from 'zlib' import Logger from '../utilities/logger' -// TODO: add multiple package support +// TODO: // ADD package.json support // ADD VALID tests ( for now they just ignoring ) export default class Bundlephobia extends Command { @@ -22,37 +21,86 @@ export default class Bundlephobia extends Command { static args = [{name: 'package'}] // only one can be passed club which one passed through flag and arg + private static getPackages(flags: any, args: any) { + let packages = [] + + if (args.package) + packages.push(args.package) + if (flags.packages) + packages = packages.concat(flags.packages) // not inplace operation + return packages + } + + private static getErrorMessage(pkg: string, message: string) { + // 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 - `latest`, `0.1.1` and `0.1.2` +*/ + if (message.includes('This package has not been published with this particular version.')) + message = message.replace(/`|<\/code>`/g, '') + + return `${chalk.red(pkg)} ${message}` + } + + private static getSize(byteSize: number) { + if (byteSize >= 1024 * 1024) + return `${chalk.red((byteSize / (1024 * 1024)).toFixed(1) + 'MB')}` + else if (byteSize >= 1024) + return `${chalk.blue((byteSize / (1024)).toFixed(1) + 'KB')}` + else //if (byteSize < 1024) + return `${chalk.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 + args.packages = Bundlephobia.getPackages(flags, args) // get a list this.checkParameters(flags, args) + this.bundlePhobia(flags, args) + } + // tslint:disable-next-line:no-unused + private checkParameters(flags: unknown, args: any) { + if (args.packages.length === 0) + Logger.error(this, 'At least one package must be passed') + } + + // tslint:disable-next-line:no-unused + private bundlePhobia(flags: any, args: any) { Logger.progressStart(this, 'finding size...') let size = 0 let gzip = 0 let dependencyCount = 0 - - let urlList = args.packages.map( - (pkg: string) => this.bundlePhobia(pkg) + let packagesResolved = 0 + + let packagesInfo: any[] = args.packages.map( + (pkg: string) => { + return { + url: `https://bundlephobia.com/api/size?package=${pkg}`, + pkg + } + } ) - axios.all(urlList.map((url: string) => { - return axios.get(url).then(successResponse => { + axios.all(packagesInfo.map((packageInfo: any) => { + return axios.get(packageInfo.url).then(successResponse => { + packagesResolved ++ size += successResponse.data.size gzip += successResponse.data.gzip dependencyCount += successResponse.data.dependencyCount Logger.progressStop(this, this.getSuccessMessage(successResponse.data)) }).catch(errorResponse => { - Logger.progressStopError(this, this.getErrorMessage('pkg', errorResponse.response.data.error.message)) + Logger.progressStopError(this, Bundlephobia.getErrorMessage(packageInfo.pkg, errorResponse.response.data.error.message)) }) })) . finally(() => { Logger.success(this, '\n' + this.getFinalMessage({ - count: args.packages.length, + count: packagesResolved, dependencyCount, size, gzip @@ -61,57 +109,12 @@ export default class Bundlephobia extends Command { } - private getPackages(flags: any, args: any) { - let packages = [] - - if (args.package) - packages.push(args.package) - - if (flags.packages) - packages = packages.concat(flags.packages) // not inplace operation - - return packages - } - - // tslint:disable-next-line:no-unused - private checkParameters(flags: unknown, args: any) { - if (args.packages.length === 0) - Logger.error(this, 'At least one package must be passed') - } - - private bundlePhobia(pkg: string) { - let url = `https://bundlephobia.com/api/size?package=${pkg}` - return url - } - private getFinalMessage(data: any) { - return `${chalk.magenta('Total')} [${chalk.cyan(data.count + ' packages')}] has ${data.dependencyCount} dependencies with size of ${this.getSize(data.size)}(${this.getSize(data.gzip)} gzipped)` + return `${chalk.magenta('Total')} [${chalk.cyan(data.count + ' packages')}] resolved has ${data.dependencyCount} dependencies with size of ${Bundlephobia.getSize(data.size)}(${Bundlephobia.getSize(data.gzip)} gzipped)` } private getSuccessMessage(data: any) { - return `${chalk.magenta(data.name)}@${chalk.cyan(data.version)} has ${data.dependencyCount} dependencies with size of ${this.getSize(data.size)}(${this.getSize(data.gzip)} gzipped)` - } - - private getErrorMessage(pkg: string, message: string) { - // 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 - `latest`, `0.1.1` and `0.1.2` -*/ - if (message.includes('This package has not been published with this particular version.')) - message = message.replace(/`|<\/code>`/g, '') - - return `${chalk.magenta(pkg)} ${message}` - } - - private getSize(byteSize: number) { - if (byteSize >= 1024 * 1024) - return `${chalk.red((byteSize / (1024 * 1024)).toFixed(1) + 'MB')}` - else if (byteSize >= 1024) - return `${chalk.blue((byteSize / (1024)).toFixed(1) + 'KB')}` - else //if (byteSize < 1024) - return `${chalk.green(byteSize.toFixed(1) + 'B')}` + return `${chalk.magenta(data.name)}@${chalk.cyan(data.version)} has ${data.dependencyCount} dependencies with size of ${Bundlephobia.getSize(data.size)}(${Bundlephobia.getSize(data.gzip)} gzipped)` } } From a84e731d2e0cc50b3bcfc50f2842284a72f86283 Mon Sep 17 00:00:00 2001 From: ashish Date: Sun, 3 Nov 2019 03:50:01 +0530 Subject: [PATCH 13/14] [BUNDLEPHOBIA]: removed unused method Signed-off-by: ashish --- src/utilities/logger.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/utilities/logger.ts b/src/utilities/logger.ts index 0a40f4b..a72d6d4 100644 --- a/src/utilities/logger.ts +++ b/src/utilities/logger.ts @@ -32,13 +32,6 @@ export default class Logger { Logger.spinner.start() } - // tslint:disable-next-line:no-unused - public static progressStart1(thisRef: any, message: string) { - // signale.watch(`${message}`) - Logger.spinner = Ora() - Logger.spinner.start() - } - // tslint:disable-next-line:no-unused public static progressStop(thisRef: any, message: string) { Logger.spinner.succeed(message) From 28aa4b7ae04035d261d6d9e6d61a4d37afd48ec4 Mon Sep 17 00:00:00 2001 From: ashish Date: Sun, 3 Nov 2019 04:06:16 +0530 Subject: [PATCH 14/14] [BUNDLEPHOBIA]: fixed tslint error Signed-off-by: ashish --- src/commands/bundlephobia.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/commands/bundlephobia.ts b/src/commands/bundlephobia.ts index 52c7b0e..5c51752 100644 --- a/src/commands/bundlephobia.ts +++ b/src/commands/bundlephobia.ts @@ -87,7 +87,8 @@ export default class Bundlephobia extends Command { } ) - axios.all(packagesInfo.map((packageInfo: any) => { + // tslint:disable-next-line:no-unsafe-any no-unused + let x = axios.all(packagesInfo.map((packageInfo: any) => { // have to use x for removing TSLintError: promises must be handled appropriately return axios.get(packageInfo.url).then(successResponse => { packagesResolved ++ size += successResponse.data.size @@ -97,9 +98,11 @@ export default class Bundlephobia extends Command { }).catch(errorResponse => { Logger.progressStopError(this, Bundlephobia.getErrorMessage(packageInfo.pkg, errorResponse.response.data.error.message)) }) + // tslint:disable-next-line:no-unused })) + .then(() => {}).catch(() => {}) . finally(() => { - Logger.success(this, '\n' + this.getFinalMessage({ + Logger.success(this, this.getFinalMessage({ count: packagesResolved, dependencyCount, size, @@ -110,7 +113,7 @@ export default class Bundlephobia extends Command { } private getFinalMessage(data: any) { - return `${chalk.magenta('Total')} [${chalk.cyan(data.count + ' packages')}] resolved has ${data.dependencyCount} dependencies with size of ${Bundlephobia.getSize(data.size)}(${Bundlephobia.getSize(data.gzip)} gzipped)` + return `${chalk.magenta('Total')} [${chalk.cyan(data.count + ' packages resolved')}] has ${data.dependencyCount} dependencies with size of ${Bundlephobia.getSize(data.size)}(${Bundlephobia.getSize(data.gzip)} gzipped)` } private getSuccessMessage(data: any) {