From 9865c65628e1af78c98b22e96fee82926912f03b Mon Sep 17 00:00:00 2001 From: Jason Mitchell Date: Wed, 14 Mar 2018 11:10:13 -0700 Subject: [PATCH] Only mutate showdown.js if < 1.7.4 --- addon/components/markdown-to-html.js | 13 +- index.js | 52 +++++-- package.json | 2 +- .../unit/components/markdown-to-html-test.js | 100 +++++++----- yarn.lock | 144 +++++------------- 5 files changed, 150 insertions(+), 161 deletions(-) diff --git a/addon/components/markdown-to-html.js b/addon/components/markdown-to-html.js index 8887cd2..62fe75f 100644 --- a/addon/components/markdown-to-html.js +++ b/addon/components/markdown-to-html.js @@ -25,16 +25,23 @@ const ShowdownComponent = Component.extend({ const owner = getOwner(this); if (owner && owner.hasRegistration(CONFIG_LOOKUP)) { - this._globalOptions = (owner.resolveRegistration(CONFIG_LOOKUP) || {}).showdown; + this._globalOptions = ( + owner.resolveRegistration(CONFIG_LOOKUP) || {} + ).showdown; } }, html: computed('markdown', 'converter', function() { - let showdownOptions = this.getShowdownProperties(get(this, 'defaultOptionKeys')); + let showdownOptions = this.getShowdownProperties( + get(this, 'defaultOptionKeys') + ); let converter = get(this, 'converter'); for (let option in showdownOptions) { - if (showdownOptions.hasOwnProperty(option) && (typeof showdownOptions[option]) !== 'undefined') { + if ( + showdownOptions.hasOwnProperty(option) && + typeof showdownOptions[option] !== 'undefined' + ) { converter.setOption(option, showdownOptions[option]); } } diff --git a/index.js b/index.js index 828d5bd..5f23741 100644 --- a/index.js +++ b/index.js @@ -22,12 +22,14 @@ module.exports = { let resolve = require('resolve'); return path.dirname(resolve.sync('showdown', { basedir: basedir })); - } catch(_) { + } catch (_) { try { return path.dirname(require.resolve('showdown')); - } catch(e) { + } catch (e) { if (e.code === 'MODULE_NOT_FOUND') { - this.ui.writeLine(`ember-cli-showdown: showdown not installed, be sure you have showdown installed via npm/yarn.`) + this.ui.writeLine( + `ember-cli-showdown: showdown not installed, be sure you have showdown installed via npm/yarn.` + ); return; } @@ -44,24 +46,46 @@ module.exports = { include: ['showdown.js', 'showdown.js.map'] }); + showdownTree = stringReplace(showdownTree, { + files: ['showdown.js'], + patterns: [ + { + match: /\/\/# sourceMappingURL=showdown.js.map/g, + replacement: '' + } + ] + }); + + let pkg = require(path.join(modulePath, '..', 'package.json')); + + if (pkg) { + let version = pkg.version.split('.'); + + /* if version is >= 1.7.4, we do not need to remove 'typeof module !== 'undefined'' */ + if (version.length >= 3) { + let major = parseInt(version[0], 10); + let minor = parseInt(version[1], 10); + let patch = parseInt(version[2], 10); + + if (major >= 1 && minor >= 7 && patch >= 4) { + return showdownTree; + } + } + } + /* * The stringReplace forces showdown's loader to use define.amd vs. commonjs/node. * This allows us to use the vendored copy of showdown when the app is eval'd within node (fastboot). * https://github.com/showdownjs/showdown/blob/5d2016c0c1fa2bd722e45b952f1e446c3c870d0f/src/loader.js#L4 - * - * fixed here: https://github.com/showdownjs/showdown/pull/426 but cannot be relied on right now. - * we can do a semver showdown version check and take this path if showdown ver < patched ver */ return stringReplace(showdownTree, { files: ['showdown.js'], - patterns: [{ - match: /typeof module !== 'undefined'/g, - replacement: 'false' - }, - { - match: /\/\/# sourceMappingURL=showdown.js.map/g, - replacement: '' - }] + patterns: [ + { + match: /typeof module !== 'undefined'/g, + replacement: 'false' + } + ] }); } } diff --git a/package.json b/package.json index 4c5191d..996d01c 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "ember-cli-htmlbars": "^2.0.3", "ember-cli-import-polyfill": "^0.2.0", "ember-getowner-polyfill": "^2.0.1", - "showdown": "^1.7.3" + "showdown": "^1.7.4" }, "devDependencies": { "broccoli-asset-rev": "^2.4.5", diff --git a/tests/unit/components/markdown-to-html-test.js b/tests/unit/components/markdown-to-html-test.js index 7bed9d0..82fb93b 100644 --- a/tests/unit/components/markdown-to-html-test.js +++ b/tests/unit/components/markdown-to-html-test.js @@ -1,5 +1,5 @@ -import { run } from '@ember/runloop'; import showdown from 'showdown'; +import { run } from '@ember/runloop'; import { moduleForComponent, test } from 'ember-qunit'; moduleForComponent('markdown-to-html', 'Unit | Component | markdown to html', { @@ -9,7 +9,12 @@ moduleForComponent('markdown-to-html', 'Unit | Component | markdown to html', { test('it renders', function(assert) { assert.expect(1); this.render(); - assert.equal(this.$().text().trim(), ''); + assert.equal( + this.$() + .text() + .trim(), + '' + ); }); test('it produces markdown', function(assert) { @@ -25,7 +30,14 @@ test('it produces markdown', function(assert) { let expectedHtml = '

Hello, world

'; assert.equal(component.get('html').toString(), expectedHtml); - assert.equal(component.$().html().toString().trim(), expectedHtml); + assert.equal( + component + .$() + .html() + .toString() + .trim(), + expectedHtml + ); }); test('it inserts
tag', function(assert) { @@ -51,13 +63,17 @@ test('supports setting showdown options', function(assert) { this.render(); run(function() { - component.set('markdown', '# title\nI ~~dislike~~ enjoy visiting http://www.google.com'); + component.set( + 'markdown', + '# title\nI ~~dislike~~ enjoy visiting http://www.google.com' + ); component.set('simplifiedAutoLink', true); component.set('headerLevelStart', 3); component.set('strikethrough', true); }); - let expectedHtml = '

title

\n

I dislike enjoy visiting http://www.google.com

'; + let expectedHtml = + '

title

\n

I dislike enjoy visiting http://www.google.com

'; assert.equal(component.get('html').toString(), expectedHtml); }); @@ -75,12 +91,16 @@ test('supports setting showdown options merged with global options', function(as this.render(); run(function() { - component.set('markdown', '# title\nI ~~dislike~~ enjoy visiting http://www.google.com'); + component.set( + 'markdown', + '# title\nI ~~dislike~~ enjoy visiting http://www.google.com' + ); component.set('headerLevelStart', 3); component.set('strikethrough', true); }); - let expectedHtml = '

title

\n

I dislike enjoy visiting http://www.google.com

'; + let expectedHtml = + '

title

\n

I dislike enjoy visiting http://www.google.com

'; assert.equal(component.get('html').toString(), expectedHtml); }); @@ -88,21 +108,23 @@ test('supports setting showdown options merged with global options', function(as test('it supports loading showdown extensions', function(assert) { assert.expect(1); - showdown.extension("demo", function() { - return [{ - type: "lang", - regex: "this is an ember showdown!", - replace() { - return "no it isn't!"; + showdown.extension('demo', function() { + return [ + { + type: 'lang', + regex: 'this is an ember showdown!', + replace() { + return "no it isn't!"; + } } - }]; + ]; }); let component = this.subject({ extensions: ['demo'] }); this.render(); run(function() { - component.set("markdown", "this is an ember showdown!"); + component.set('markdown', 'this is an ember showdown!'); }); let expectedHtml = "

no it isn't!

"; @@ -129,42 +151,44 @@ test('does not reset default showdown options with undefined', function(assert) showdown.setOption('strikethrough', originalStrikeThroughValue); }); - test('it supports loading showdown extensions', function(assert) { assert.expect(1); - showdown.extension("demo", function() { - return [{ - type: "lang", - regex: /\sa\s/, - replace() { - return " an ember "; + showdown.extension('demo', function() { + return [ + { + type: 'lang', + regex: /\sa\s/, + replace() { + return ' an ember '; + } } - }]; + ]; }); - showdown.extension("excited", function() { - return [{ - type: "lang", - regex: /showdown/, - replace() { - return "showdown!"; + showdown.extension('excited', function() { + return [ + { + type: 'lang', + regex: /showdown/, + replace() { + return 'showdown!'; + } } - }]; + ]; }); let component = this.subject({ extensions: 'demo excited' }); this.render(); run(function() { - component.set("markdown", "this is a showdown"); + component.set('markdown', 'this is a showdown'); }); - let expectedHtml = "

this is an ember showdown!

"; + let expectedHtml = '

this is an ember showdown!

'; assert.equal(component.get('html').toString(), expectedHtml); }); - test('it does not munge code fences', function(assert) { assert.expect(1); @@ -172,10 +196,14 @@ test('it does not munge code fences', function(assert) { this.render(); run(function() { - component.set("ghCodeBlocks", true); - component.set("markdown", "```html\nhello\nworld\n```"); + component.set('ghCodeBlocks', true); + component.set( + 'markdown', + '```html\nhello\nworld\n```' + ); }); - let expectedHtml = "
<strong>hello</strong>\n<em>world</em>\n
"; + let expectedHtml = + '
<strong>hello</strong>\n<em>world</em>\n
'; assert.equal(component.get('html').toString(), expectedHtml); }); diff --git a/yarn.lock b/yarn.lock index c8213d2..156d2ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -164,6 +164,10 @@ ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" @@ -1439,10 +1443,6 @@ buffer-shims@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -1626,12 +1626,12 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" +cliui@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" + string-width "^2.1.1" + strip-ansi "^4.0.0" wrap-ansi "^2.0.0" clone@^0.2.0: @@ -2499,12 +2499,6 @@ entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - error@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" @@ -2890,7 +2884,7 @@ find-index@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -3437,10 +3431,6 @@ ipaddr.js@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.2.0.tgz#8aba49c9192799585bdd643e0ccb50e8ae777ba4" -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -3451,12 +3441,6 @@ is-buffer@^1.0.2: version "1.1.4" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - is-dotfile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" @@ -3771,15 +3755,6 @@ livereload-js@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - loader.js@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.6.0.tgz#b965663ddbe2d80da482454cb865efe496e93e22" @@ -4216,15 +4191,6 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - normalize-path@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" @@ -4399,12 +4365,6 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -4463,12 +4423,6 @@ path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - dependencies: - pify "^2.0.0" - performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" @@ -4612,21 +4566,6 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - readable-stream@^2, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" @@ -4917,7 +4856,7 @@ sane@^1.1.1, sane@^1.6.0: walker "~1.0.5" watch "~0.10.0" -"semver@2 || 3 || 4 || 5", "semver@4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0: +"semver@4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -4986,11 +4925,11 @@ shellwords@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" -showdown@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/showdown/-/showdown-1.7.3.tgz#8d27f501a0850f33a0c25f1a6b7a10b9fc464633" +showdown@^1.7.4: + version "1.8.6" + resolved "https://registry.yarnpkg.com/showdown/-/showdown-1.8.6.tgz#91ea4ee3b7a5448aaca6820a4e27e690c6ad771c" dependencies: - yargs "^8.0.1" + yargs "^10.0.3" signal-exit@^3.0.0: version "3.0.2" @@ -5143,20 +5082,6 @@ spawn-sync@^1.0.15: concat-stream "^1.4.7" os-shim "^0.1.2" -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - sprintf-js@^1.0.3, sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -5207,6 +5132,13 @@ string-width@^2.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^3.0.0" +string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -5235,6 +5167,12 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -5542,13 +5480,6 @@ uuid@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" @@ -5708,29 +5639,28 @@ yam@0.0.22: fs-extra "^0.30.0" lodash.merge "^4.4.0" -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" dependencies: camelcase "^4.1.0" -yargs@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" + cliui "^4.0.0" decamelize "^1.1.1" + find-up "^2.1.0" get-caller-file "^1.0.1" os-locale "^2.0.0" - read-pkg-up "^2.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" string-width "^2.0.0" which-module "^2.0.0" y18n "^3.2.1" - yargs-parser "^7.0.0" + yargs-parser "^8.1.0" yargs@~3.10.0: version "3.10.0"