From e80056d64e3022e60625f77ca01b03140011b785 Mon Sep 17 00:00:00 2001 From: Adam S Date: Thu, 17 Oct 2019 18:27:55 -0500 Subject: [PATCH 001/131] add feature #389 --- src/package.ts | 8 ++++++-- src/test/package.test.ts | 10 ++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/package.ts b/src/package.ts index 5dcfe9ed..7c95e3bf 100644 --- a/src/package.ts +++ b/src/package.ts @@ -183,6 +183,10 @@ function isGitHubRepository(repository: string): boolean { return /^https:\/\/github\.com\/|^git@github\.com:/.test(repository || ''); } +function isGitHubBadge(href: string): boolean { + return isGitHubRepository(href) && /[A-Za-z0-9_-]{1,100}\/workflows\/[^<>:;,?"*|/]+\/badge\.svg$/.test(href || ''); +} + class ManifestProcessor extends BaseProcessor { constructor(manifest: Manifest) { @@ -449,7 +453,7 @@ export class MarkdownProcessor extends BaseProcessor { throw new Error(`Images in ${this.name} must come from an HTTPS source: ${src}`); } - if (/\.svg$/i.test(srcUrl.pathname) && !isHostTrusted(srcUrl.host)) { + if (/\.svg$/i.test(srcUrl.pathname) && (!isHostTrusted(srcUrl.host) && !isGitHubBadge(srcUrl.href))) { throw new Error(`SVGs are restricted in ${this.name}; please use other file image formats, such as PNG: ${src}`); } }); @@ -694,7 +698,7 @@ export function validateManifest(manifest: Manifest): Manifest { throw new Error(`Badge URLs must come from an HTTPS source: ${badge.url}`); } - if (/\.svg$/i.test(srcUrl.pathname) && !isHostTrusted(srcUrl.host)) { + if (/\.svg$/i.test(srcUrl.pathname) && (!isHostTrusted(srcUrl.host) && !isGitHubBadge(srcUrl.href))) { throw new Error(`Badge SVGs are restricted. Please use other file image formats, such as PNG: ${badge.url}`); } }); diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 8cb26edb..fed4a485 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1615,6 +1615,16 @@ describe('MarkdownProcessor', () => { assert(file); }); + it('should allow SVG from GitHub actions in image tag', async() => { + const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const contents = `![title](https://github.com/fakeuser/fakerepo/workflows/fakeworkflowname/badge.svg)`; + const processor = new ReadmeProcessor(manifest, {}); + const readme = { path: 'extension/readme.md', contents }; + + const file = await processor.onFile(readme); + assert(file); + }); + it('should prevent SVGs from not trusted sources in img tags', async () => { const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; const contents = ``; From 8455460dbc80de2aefd43801a3bd236c48a4c180 Mon Sep 17 00:00:00 2001 From: Adam S Date: Fri, 18 Oct 2019 21:24:32 -0500 Subject: [PATCH 002/131] add test ensuring non-workflow SVGs aren't allowed --- src/test/package.test.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/test/package.test.ts b/src/test/package.test.ts index fed4a485..279e73be 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1625,6 +1625,15 @@ describe('MarkdownProcessor', () => { assert(file); }); + it('should prevent SVG from a GitHub repo in image tag', async() => { + const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const contents = `![title](https://github.com/eviluser/evilrepo/blob/master/malicious.svg)`; + const processor = new ReadmeProcessor(manifest, {}); + const readme = { path: 'extension/readme.md', contents }; + + await throws(() => processor.onFile(readme)); + }); + it('should prevent SVGs from not trusted sources in img tags', async () => { const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; const contents = ``; From 285c1844d00ff9e7816d362783a6e0fc21347cf4 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 3 Feb 2020 09:23:05 +0100 Subject: [PATCH 003/131] Revert "fixes #415" This reverts commit e4a8df59d34e1f6a83776256067cf11bff943f1f. --- src/test/validation.test.ts | 2 +- src/validation.ts | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/test/validation.test.ts b/src/test/validation.test.ts index 94126ad6..fa4508b2 100644 --- a/src/test/validation.test.ts +++ b/src/test/validation.test.ts @@ -57,6 +57,7 @@ describe('validateVersion', () => { it('should validate', () => { validateVersion('1.0.0'); validateVersion('0.1.1'); + validateVersion('0.1.1-pre'); assert.throws(() => validateVersion('.')); assert.throws(() => validateVersion('..')); @@ -65,7 +66,6 @@ describe('validateVersion', () => { assert.throws(() => validateVersion('.0.1')); assert.throws(() => validateVersion('0.1.')); assert.throws(() => validateVersion('0.0.0.1')); - assert.throws(() => validateVersion('0.1.1-pre')); }); }); diff --git a/src/validation.ts b/src/validation.ts index 087f8f48..2d7290e4 100644 --- a/src/validation.ts +++ b/src/validation.ts @@ -31,10 +31,6 @@ export function validateVersion(version: string): void { if (!semver.valid(version)) { throw new Error(`Invalid extension version '${version}'`); } - - if (semver.prerelease(version)) { - throw new Error(`Invalid extension version '${version}: semver prerelease field is not supported`); - } } export function validateEngineCompatibility(version: string): void { From 32d7b80e1dca0f7281a3b9388c1c025da48a5245 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 3 Feb 2020 09:23:13 +0100 Subject: [PATCH 004/131] 1.73.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c6b2e1a3..2a1f3865 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.72.0", + "version": "1.73.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 032cca7738fc8b2ad4baa66d10656b11875c1e57 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 18 Feb 2020 09:59:58 +0100 Subject: [PATCH 005/131] setup default build task --- .vscode/tasks.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 75e1aeaa..bacb5606 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -9,7 +9,10 @@ "problemMatcher": [ "$tsc-watch" ], - "group": "build", + "group": { + "kind": "build", + "isDefault": true + }, "isBackground": true } ] From ee42cf42c0a98d005653b84c45bfd57b18b44139 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 18 Feb 2020 10:03:19 +0100 Subject: [PATCH 006/131] upgrade lodash fixes #422 --- package.json | 4 +- yarn.lock | 382 +++++++++++++-------------------------------------- 2 files changed, 97 insertions(+), 289 deletions(-) diff --git a/package.json b/package.json index 2a1f3865..3a4e5e24 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "denodeify": "^1.2.1", "didyoumean": "^1.2.1", "glob": "^7.0.6", - "lodash": "^4.17.10", + "lodash": "^4.17.15", "markdown-it": "^8.3.1", "mime": "^1.3.4", "minimatch": "^3.0.3", @@ -71,7 +71,7 @@ "@types/semver": "^6.0.0", "@types/tmp": "^0.1.0", "@types/xml2js": "^0.4.4", - "concurrently": "^4.1.0", + "concurrently": "^5.1.0", "mocha": "^5.2.0", "source-map-support": "^0.4.2", "typescript": "^3.4.3", diff --git a/yarn.lock b/yarn.lock index 483a9b3f..3e67e752 100644 --- a/yarn.lock +++ b/yarn.lock @@ -88,17 +88,12 @@ dependencies: "@types/node" "*" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -155,7 +150,7 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -176,19 +171,14 @@ cheerio@^1.0.0-rc.1: lodash "^4.15.0" parse5 "^3.0.1" -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" color-convert@^1.9.0: version "1.9.3" @@ -217,31 +207,20 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concurrently@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-4.1.0.tgz#17fdf067da71210685d9ea554423ef239da30d33" - integrity sha512-pwzXCE7qtOB346LyO9eFWpkFJVO3JQZ/qU/feGeaAHiX1M3Rw3zgXKc5cZ8vSH5DGygkjzLFDzA/pwoQDkRNGg== +concurrently@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.1.0.tgz#05523986ba7aaf4b58a49ddd658fab88fa783132" + integrity sha512-9ViZMu3OOCID3rBgU31mjBftro2chOop0G2u1olq1OuwRBVRw/GxHTg80TVJBUTJfoswMmEUeuOg1g1yu1X2dA== dependencies: - chalk "^2.4.1" - date-fns "^1.23.0" - lodash "^4.17.10" + chalk "^2.4.2" + date-fns "^2.0.1" + lodash "^4.17.15" read-pkg "^4.0.1" - rxjs "^6.3.3" + rxjs "^6.5.2" spawn-command "^0.0.2-1" - supports-color "^4.5.0" - tree-kill "^1.1.0" - yargs "^12.0.1" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" + supports-color "^6.1.0" + tree-kill "^1.2.2" + yargs "^13.3.0" css-select@~1.2.0: version "1.2.0" @@ -258,10 +237,10 @@ css-what@2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" integrity sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ== -date-fns@^1.23.0: - version "1.30.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" - integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== +date-fns@^2.0.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.9.0.tgz#d0b175a5c37ed5f17b97e2272bbc1fa5aec677d2" + integrity sha512-khbFLu/MlzLjEzy9Gh8oY1hNt/Dvxw3J6Rbc28cVoYWQaC1S3YI4xwkF9ZWcjDLscbZlY9hISMr66RFzZagLsA== debug@3.1.0: version "3.1.0" @@ -331,12 +310,10 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== - dependencies: - once "^1.4.0" +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== entities@^1.1.1, entities@~1.1.1: version "1.1.2" @@ -355,19 +332,6 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -387,17 +351,10 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== glob@7.1.2: version "7.1.2" @@ -428,11 +385,6 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -473,50 +425,21 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - linkify-it@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.1.0.tgz#c4caf38a6cd7ac2212ef3c7d2bde30a91561f9db" @@ -532,17 +455,15 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash@^4.15.0, lodash@^4.17.10: +lodash@^4.15.0: version "4.17.13" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.13.tgz#0bdc3a6adc873d2f4e0c4bac285df91b64fc7b93" integrity sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA== -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" +lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== markdown-it@^8.3.1: version "8.4.2" @@ -560,25 +481,11 @@ mdurl@^1.0.1: resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -625,11 +532,6 @@ mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -640,13 +542,6 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -654,12 +549,7 @@ nth-check@~1.0.1: dependencies: boolbase "~1.0.0" -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -671,15 +561,6 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -698,21 +579,6 @@ osenv@^0.1.3: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - p-limit@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" @@ -764,11 +630,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -784,14 +645,6 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" @@ -822,10 +675,10 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== resolve@^1.10.0: version "1.10.0" @@ -834,10 +687,10 @@ resolve@^1.10.0: dependencies: path-parse "^1.0.6" -rxjs@^6.3.3: - version "6.4.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" - integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== +rxjs@^6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== dependencies: tslib "^1.9.0" @@ -851,7 +704,7 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -"semver@2 || 3 || 4 || 5", semver@^5.5.0: +"semver@2 || 3 || 4 || 5": version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== @@ -866,23 +719,6 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - source-map-support@^0.4.2: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" @@ -931,22 +767,14 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.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" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: + emoji-regex "^7.0.1" is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + strip-ansi "^5.1.0" string_decoder@^1.1.1: version "1.2.0" @@ -955,24 +783,12 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - 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" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: - ansi-regex "^3.0.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + ansi-regex "^4.1.0" supports-color@5.4.0: version "5.4.0" @@ -981,13 +797,6 @@ supports-color@5.4.0: dependencies: has-flag "^3.0.0" -supports-color@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= - dependencies: - has-flag "^2.0.0" - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -995,6 +804,13 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + tmp@0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" @@ -1002,10 +818,10 @@ tmp@0.0.29: dependencies: os-tmpdir "~1.0.1" -tree-kill@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" - integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== tslib@^1.9.0: version "1.9.3" @@ -1063,20 +879,14 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== dependencies: - isexe "^2.0.0" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" wrappy@1: version "1.0.2" @@ -1096,36 +906,34 @@ xmlbuilder@~9.0.1: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= -"y18n@^3.2.1 || ^4.0.0": +y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== +yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^12.0.1: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== +yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" + cliui "^5.0.0" find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" + get-caller-file "^2.0.1" require-directory "^2.1.1" - require-main-filename "^1.0.1" + require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^2.0.0" + string-width "^3.0.0" which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" + y18n "^4.0.0" + yargs-parser "^13.1.1" yauzl@^2.3.1: version "2.10.0" From 368ffbd535568020b6b4f0870a4acd0175ca9633 Mon Sep 17 00:00:00 2001 From: Robert Holt Date: Thu, 20 Feb 2020 13:22:50 -0800 Subject: [PATCH 007/131] Add --noGitHubIssueLinking to stop issue link expansion in package step --- src/main.ts | 3 ++- src/package.ts | 29 ++++++++++++++++------------- src/test/package.test.ts | 27 +++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/src/main.ts b/src/main.ts index dcaf77cf..7554eee1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -74,7 +74,8 @@ module.exports = function (argv: string[]): void { .option('--baseImagesUrl [url]', 'Prepend all relative image links in README.md with this url.') .option('--yarn', 'Use yarn instead of npm') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') - .action(({ out, baseContentUrl, baseImagesUrl, yarn, ignoreFile }) => main(packageCommand({ packagePath: out, baseContentUrl, baseImagesUrl, useYarn: yarn, ignoreFile }))); + .option('--noGitHubIssueLinking', 'Prevent automatic expansion of GitHub-style issue syntax into links') + .action(({ out, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking }) => main(packageCommand({ packagePath: out, baseContentUrl, baseImagesUrl, useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking }))); program .command('publish []') diff --git a/src/package.ts b/src/package.ts index f84d78a7..95660bbd 100644 --- a/src/package.ts +++ b/src/package.ts @@ -65,6 +65,7 @@ export interface IPackageOptions { useYarn?: boolean; dependencyEntryPoints?: string[]; ignoreFile?: string; + expandGitHubIssueLinks?: boolean; } export interface IProcessor { @@ -356,6 +357,7 @@ export class MarkdownProcessor extends BaseProcessor { private baseImagesUrl: string; private isGitHub: boolean; private repositoryUrl: string; + private expandGitHubIssueLinks: boolean; constructor(manifest: Manifest, private name: string, private regexp: RegExp, private assetType: string, options: IPackageOptions = {}) { super(manifest); @@ -366,6 +368,7 @@ export class MarkdownProcessor extends BaseProcessor { this.baseImagesUrl = options.baseImagesUrl || options.baseContentUrl || (guess && guess.images); this.repositoryUrl = (guess && guess.repository); this.isGitHub = isGitHubRepository(this.repositoryUrl); + this.expandGitHubIssueLinks = typeof options.expandGitHubIssueLinks === 'boolean' ? options.expandGitHubIssueLinks : true; } async onFile(file: IFile): Promise { @@ -424,17 +427,17 @@ export class MarkdownProcessor extends BaseProcessor { return all.replace(link, urljoin(prefix, link)); }); - const markdownIssueRegex = /(\s|\n)([\w\d_-]+\/[\w\d_-]+)?#(\d+)\b/g - const issueReplace = (all: string, prefix: string, ownerAndRepositoryName: string, issueNumber: string): string => { - let result = all; - let owner: string; - let repositoryName: string; + if (this.isGitHub && this.expandGitHubIssueLinks) { + const markdownIssueRegex = /(\s|\n)([\w\d_-]+\/[\w\d_-]+)?#(\d+)\b/g + const issueReplace = (all: string, prefix: string, ownerAndRepositoryName: string, issueNumber: string): string => { + let result = all; + let owner: string; + let repositoryName: string; - if (ownerAndRepositoryName) { - [owner, repositoryName] = ownerAndRepositoryName.split('/', 2); - } + if (ownerAndRepositoryName) { + [owner, repositoryName] = ownerAndRepositoryName.split('/', 2); + } - if (this.isGitHub) { if (owner && repositoryName && issueNumber) { // Issue in external repository const issueUrl = urljoin('https://github.com', owner, repositoryName, 'issues', issueNumber); @@ -444,12 +447,12 @@ export class MarkdownProcessor extends BaseProcessor { // Issue in own repository result = prefix + `[#${issueNumber}](${urljoin(this.repositoryUrl, 'issues', issueNumber)})`; } - } - return result; + return result; + } + // Replace Markdown issue references with urls + contents = contents.replace(markdownIssueRegex, issueReplace); } - // Replace Markdown issue references with urls - contents = contents.replace(markdownIssueRegex, issueReplace); const html = markdownit({ html: true }).render(contents); const $ = cheerio.load(html); diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 08b7ed50..4194ec96 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1551,6 +1551,33 @@ describe('MarkdownProcessor', () => { }); }); + it('should not replace issue links with urls if its a github repo but issue link expansion is disabled.', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', + engines: Object.create(null), + repository: 'https://github.com/username/repository.git' + }; + + const root = fixture('readme'); + const processor = new ReadmeProcessor(manifest, { expandGitHubIssueLinks: false }); + const readme = { + path: 'extension/readme.md', + localPath: path.join(root, 'readme.github.md') + }; + + return processor.onFile(readme) + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.github.md'), 'utf8') + .then(expected => { + assert.equal(actual, expected); + }); + }); + }); + it('should not replace issue links with urls if its not a github repo.', () => { const manifest = { name: 'test', From 66a41f19ab006a5092373f8cd90b873bbfae5bbd Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 27 Feb 2020 08:24:17 +0100 Subject: [PATCH 008/131] 1.74.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a4e5e24..9f7ec2dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.73.0", + "version": "1.74.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 2a6d2e6cead22c00fcff3795e5b27347e2e2a881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 31 Mar 2020 16:58:44 +0200 Subject: [PATCH 009/131] fixes #423 --- src/publish.ts | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/publish.ts b/src/publish.ts index 3c7d7266..3375e877 100644 --- a/src/publish.ts +++ b/src/publish.ts @@ -99,11 +99,17 @@ export interface IPublishOptions { ignoreFile?: string; } -function versionBump(cwd: string = process.cwd(), version?: string, commitMessage?: string): Promise { +async function versionBump(cwd: string = process.cwd(), version?: string, commitMessage?: string): Promise { if (!version) { return Promise.resolve(null); } + const manifest = await readManifest(cwd); + + if (manifest.version === version) { + return null; + } + switch (version) { case 'major': case 'minor': @@ -127,14 +133,15 @@ function versionBump(cwd: string = process.cwd(), version?: string, commitMessag command = `${command} -m "${commitMessage}"`; } - // call `npm version` to do our dirty work - return exec(command, { cwd }) - .then(({ stdout, stderr }) => { - process.stdout.write(stdout); - process.stderr.write(stderr); - return Promise.resolve(null); - }) - .catch(err => Promise.reject(err.message)); + try { + // call `npm version` to do our dirty work + const { stdout, stderr } = await exec(command, { cwd }); + process.stdout.write(stdout); + process.stderr.write(stderr); + return null; + } catch (err) { + throw err.message; + } } export function publish(options: IPublishOptions = {}): Promise { From fbebf951823f28c46abf351b7981bf094f3e36a9 Mon Sep 17 00:00:00 2001 From: "Bob Brown (DEVDIV)" Date: Tue, 31 Mar 2020 08:29:57 -0700 Subject: [PATCH 010/131] Change a console.warn to console.log for an informational message --- src/package.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.ts b/src/package.ts index 95660bbd..ec27213f 100644 --- a/src/package.ts +++ b/src/package.ts @@ -927,7 +927,7 @@ async function prepublish(cwd: string, manifest: Manifest, useYarn: boolean = fa return; } - console.warn(`Executing prepublish script '${useYarn ? 'yarn' : 'npm'} run vscode:prepublish'...`); + console.log(`Executing prepublish script '${useYarn ? 'yarn' : 'npm'} run vscode:prepublish'...`); const { stdout, stderr } = await exec(`${useYarn ? 'yarn' : 'npm'} run vscode:prepublish`, { cwd, maxBuffer: 5000 * 1024 }); process.stdout.write(stdout); From 2be9d7def651262d267716dbe0e9abbcdd338764 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Wed, 1 Apr 2020 11:47:00 +0530 Subject: [PATCH 011/131] chore: drop didyoumean --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 9f7ec2dc..5b217249 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,6 @@ "cheerio": "^1.0.0-rc.1", "commander": "^2.8.1", "denodeify": "^1.2.1", - "didyoumean": "^1.2.1", "glob": "^7.0.6", "lodash": "^4.17.15", "markdown-it": "^8.3.1", From 03a95d4886c966ea2b62bc107bfe8ffda250c233 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Wed, 1 Apr 2020 11:47:34 +0530 Subject: [PATCH 012/131] chore: drop type defnition lib for didyoumean --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 5b217249..631013c3 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ "devDependencies": { "@types/cheerio": "^0.22.1", "@types/denodeify": "^1.2.31", - "@types/didyoumean": "^1.2.0", "@types/glob": "^7.1.1", "@types/lodash": "^4.14.123", "@types/markdown-it": "0.0.2", From ff9ce089ec44640f9697e162515cd4141bd77290 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Wed, 1 Apr 2020 11:48:03 +0530 Subject: [PATCH 013/131] chore: add leven --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 631013c3..540f373c 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "commander": "^2.8.1", "denodeify": "^1.2.1", "glob": "^7.0.6", + "leven": "^3.1.0", "lodash": "^4.17.15", "markdown-it": "^8.3.1", "mime": "^1.3.4", From f3e7284f8e246743575488b905a2616ad9178322 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Wed, 1 Apr 2020 11:48:39 +0530 Subject: [PATCH 014/131] chore: update lockfile --- yarn.lock | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3e67e752..8584d317 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,11 +12,6 @@ resolved "https://registry.yarnpkg.com/@types/denodeify/-/denodeify-1.2.31.tgz#9a737b063bf1a8e3a63cc006cbbb0de601ce3584" integrity sha512-Jgy3dvCyIxhNb5RstVJkubeHZifw8KJXca13ov8OO4IqhDLPRHiJJ6VArJbZZ4HuEMJEB83yCuABodNMlYylzQ== -"@types/didyoumean@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@types/didyoumean/-/didyoumean-1.2.0.tgz#e597a710fc6b18fe3ed6cdac17772f8fb51a07c1" - integrity sha512-3QMjBOgPEXaOkhfQxiGgzn6JpofPSi8Z0RmQq65FIpZv4kCPT/jvYiYrwqaUrfiHZmwwRvyYJjJmoKopbvLPQw== - "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -259,11 +254,6 @@ denodeify@^1.2.1: resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= -didyoumean@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.1.tgz#e92edfdada6537d484d73c0172fd1eba0c4976ff" - integrity sha1-6S7f2tplN9SE1zwBcv0eugxJdv8= - diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -440,6 +430,11 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + linkify-it@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.1.0.tgz#c4caf38a6cd7ac2212ef3c7d2bde30a91561f9db" From e2877842283e60cf9dd5deab9f3a4557c0134082 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Wed, 1 Apr 2020 11:50:49 +0530 Subject: [PATCH 015/131] feat: recommend matching commands --- src/main.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main.ts b/src/main.ts index 7554eee1..13b69da4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,5 +1,5 @@ import * as program from 'commander'; -import * as didYouMean from 'didyoumean'; +import * as leven from 'leven'; import { packageCommand, ls } from './package'; import { publish, unpublish } from './publish'; @@ -138,7 +138,9 @@ module.exports = function (argv: string[]): void { .command('*', '', { noHelp: true }) .action((cmd: string) => { program.help(help => { - const suggestion = didYouMean(cmd, program.commands.map(c => c._name)); + const suggestion = program.commands.map(c => c._name).find(c => { + return leven(c, cmd) < c.length * 0.4; + }); help = `${help} Unknown command '${cmd}'`; From 2dec836b11780c9977df8dc80031b33199578de9 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Wed, 1 Apr 2020 11:52:13 +0530 Subject: [PATCH 016/131] refactor: inline approach --- src/main.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main.ts b/src/main.ts index 13b69da4..abc833e2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -138,9 +138,7 @@ module.exports = function (argv: string[]): void { .command('*', '', { noHelp: true }) .action((cmd: string) => { program.help(help => { - const suggestion = program.commands.map(c => c._name).find(c => { - return leven(c, cmd) < c.length * 0.4; - }); + const suggestion = program.commands.map(c => c._name).find(c => leven(c, cmd) < c.length * 0.4); help = `${help} Unknown command '${cmd}'`; From 18845b1ea530a2b4b08e5ebfbad992699b4706d4 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Wed, 1 Apr 2020 11:54:31 +0530 Subject: [PATCH 017/131] refactor: better approach --- src/main.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index abc833e2..c552a92f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -138,7 +138,8 @@ module.exports = function (argv: string[]): void { .command('*', '', { noHelp: true }) .action((cmd: string) => { program.help(help => { - const suggestion = program.commands.map(c => c._name).find(c => leven(c, cmd) < c.length * 0.4); + const availableCommands = program.commands.map(c => c._name); + const suggestion = availableCommands.find(c => leven(c, cmd) < c.length * 0.4); help = `${help} Unknown command '${cmd}'`; From 9a66cdca457e771905c126797023dd86fa10c502 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Wed, 1 Apr 2020 12:01:50 +0530 Subject: [PATCH 018/131] chore: update markdown-it --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9f7ec2dc..d7ded207 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "didyoumean": "^1.2.1", "glob": "^7.0.6", "lodash": "^4.17.15", - "markdown-it": "^8.3.1", + "markdown-it": "^10.0.0", "mime": "^1.3.4", "minimatch": "^3.0.3", "osenv": "^0.1.3", From 48702544dfc3be61aa7716aa79cd326515b93610 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Wed, 1 Apr 2020 12:03:31 +0530 Subject: [PATCH 019/131] chore: update lock file --- yarn.lock | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3e67e752..fffbb63e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -320,6 +320,11 @@ entities@^1.1.1, entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== +entities@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -465,13 +470,13 @@ lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -markdown-it@^8.3.1: - version "8.4.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" - integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== +markdown-it@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" + integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== dependencies: argparse "^1.0.7" - entities "~1.1.1" + entities "~2.0.0" linkify-it "^2.0.0" mdurl "^1.0.1" uc.micro "^1.0.5" From 68e143f621c80322e50a44920cfa12821934fb6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 2 Apr 2020 11:56:42 +0200 Subject: [PATCH 020/131] upgrade mocha --- package.json | 12 +- test/mocha.opts | 1 - yarn.lock | 480 ++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 432 insertions(+), 61 deletions(-) delete mode 100644 test/mocha.opts diff --git a/package.json b/package.json index 85d8c4f1..6b12f576 100644 --- a/package.json +++ b/package.json @@ -64,16 +64,22 @@ "@types/markdown-it": "0.0.2", "@types/mime": "^1", "@types/minimatch": "^3.0.3", - "@types/mocha": "^5.2.6", + "@types/mocha": "^7.0.2", "@types/node": "^8", "@types/read": "^0.0.28", "@types/semver": "^6.0.0", "@types/tmp": "^0.1.0", "@types/xml2js": "^0.4.4", "concurrently": "^5.1.0", - "mocha": "^5.2.0", + "mocha": "^7.1.1", "source-map-support": "^0.4.2", "typescript": "^3.4.3", "xml2js": "^0.4.12" + }, + "mocha": { + "require": [ + "source-map-support/register" + ], + "spec": "out/test" } -} +} \ No newline at end of file diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index 957f28ef..00000000 --- a/test/mocha.opts +++ /dev/null @@ -1 +0,0 @@ ---require source-map-support/register out/test \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index cdd1fc3d..beeeea4c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -46,10 +46,10 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/mocha@^5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.6.tgz#b8622d50557dd155e9f2f634b7d68fd38de5e94b" - integrity sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw== +"@types/mocha@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce" + integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w== "@types/node@*": version "10.12.15" @@ -83,6 +83,16 @@ dependencies: "@types/node" "*" +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" @@ -95,6 +105,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -117,6 +135,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -130,6 +153,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -166,6 +196,21 @@ cheerio@^1.0.0-rc.1: lodash "^4.15.0" parse5 "^3.0.1" +chokidar@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.2.0" + optionalDependencies: + fsevents "~2.1.1" + cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -187,11 +232,6 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== - commander@^2.8.1: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" @@ -237,18 +277,25 @@ date-fns@^2.0.1: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.9.0.tgz#d0b175a5c37ed5f17b97e2272bbc1fa5aec677d2" integrity sha512-khbFLu/MlzLjEzy9Gh8oY1hNt/Dvxw3J6Rbc28cVoYWQaC1S3YI4xwkF9ZWcjDLscbZlY9hISMr66RFzZagLsA== -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== +debug@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: - ms "2.0.0" + ms "^2.1.1" decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" @@ -322,11 +369,42 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -334,36 +412,55 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -find-up@^3.0.0: +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@3.0.0, find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" +flat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== +glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" + is-glob "^4.0.1" -glob@^7.0.6: +glob@7.1.3, glob@^7.0.6: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -385,10 +482,22 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== hosted-git-info@^2.1.4: version "2.7.1" @@ -425,11 +534,77 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +js-yaml@3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -465,6 +640,13 @@ lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +log-symbols@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + markdown-it@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" @@ -493,45 +675,71 @@ minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= +mkdirp@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" + integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== dependencies: - minimist "0.0.8" + minimist "^1.2.5" -mocha@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== +mocha@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.1.tgz#89fbb30d09429845b1bb893a830bf5771049a441" + integrity sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA== dependencies: + ansi-colors "3.2.3" browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" + chokidar "3.3.0" + debug "3.2.6" diff "3.5.0" escape-string-regexp "1.0.5" - glob "7.1.2" + find-up "3.0.0" + glob "7.1.3" growl "1.10.5" - he "1.1.1" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" + mkdirp "0.5.3" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +node-environment-flags@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -542,6 +750,11 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -549,6 +762,34 @@ nth-check@~1.0.1: dependencies: boolbase "~1.0.0" +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@4.1.0, object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -640,6 +881,11 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= +picomatch@^2.0.4: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -670,6 +916,13 @@ readable-stream@^3.0.6: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== + dependencies: + picomatch "^2.0.4" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -714,6 +967,11 @@ semver@^5.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -767,6 +1025,14 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -776,6 +1042,40 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string.prototype.trimend@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz#ee497fd29768646d84be2c9b819e292439614373" + integrity sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimleft@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" + +string.prototype.trimright@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz#afe596a7ce9de905496919406c9734845f01a2f2" + integrity sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" @@ -783,6 +1083,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.1.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -790,10 +1097,15 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== +strip-json-comments@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== dependencies: has-flag "^3.0.0" @@ -818,6 +1130,13 @@ tmp@0.0.29: dependencies: os-tmpdir "~1.0.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -879,6 +1198,20 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -911,6 +1244,14 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +yargs-parser@13.1.2, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" @@ -919,6 +1260,31 @@ yargs-parser@^13.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + +yargs@13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + yargs@^13.3.0: version "13.3.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" From 48e02a8773da3eef5fa24904bdf6583b9c2e3523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 2 Apr 2020 11:56:55 +0200 Subject: [PATCH 021/131] 1.75.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6b12f576..40b2366d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.74.0", + "version": "1.75.0", "description": "VSCode Extension Manager", "repository": { "type": "git", @@ -82,4 +82,4 @@ ], "spec": "out/test" } -} \ No newline at end of file +} From dc36c1f16bb0c213be6abfea56614c0ac76c6c17 Mon Sep 17 00:00:00 2001 From: Ilia Pozdnyakov Date: Fri, 17 Apr 2020 15:44:02 +0700 Subject: [PATCH 022/131] print output of failed prepublish scripts #441 --- src/package.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/package.ts b/src/package.ts index ec27213f..b57c918f 100644 --- a/src/package.ts +++ b/src/package.ts @@ -20,7 +20,7 @@ import { getDependencies } from './npm'; const readFile = denodeify(fs.readFile); const unlink = denodeify(fs.unlink as any); const stat = denodeify(fs.stat); -const exec = denodeify(cp.exec as any, (err, stdout, stderr) => [err, { stdout, stderr }]); +const exec = denodeify(cp.exec as any, (error, stdout, stderr) => [undefined, { stdout, stderr, error }]); const glob = denodeify(_glob); const resourcesPath = path.join(path.dirname(__dirname), 'resources'); @@ -929,8 +929,10 @@ async function prepublish(cwd: string, manifest: Manifest, useYarn: boolean = fa console.log(`Executing prepublish script '${useYarn ? 'yarn' : 'npm'} run vscode:prepublish'...`); - const { stdout, stderr } = await exec(`${useYarn ? 'yarn' : 'npm'} run vscode:prepublish`, { cwd, maxBuffer: 5000 * 1024 }); + const { stdout, stderr, error } = await exec(`${useYarn ? 'yarn' : 'npm'} run vscode:prepublish`, { cwd, maxBuffer: 5000 * 1024 }); process.stdout.write(stdout); + // in case of error, stderr gets written by a top-level exception handler + if (error !== undefined) throw error; process.stderr.write(stderr); } From 4960c7c6744e20bbeb36b2ece6406425abd33f0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 20 Apr 2020 13:52:52 +0200 Subject: [PATCH 023/131] use spawn instead of exec --- src/package.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/package.ts b/src/package.ts index b57c918f..42b1278c 100644 --- a/src/package.ts +++ b/src/package.ts @@ -20,7 +20,6 @@ import { getDependencies } from './npm'; const readFile = denodeify(fs.readFile); const unlink = denodeify(fs.unlink as any); const stat = denodeify(fs.stat); -const exec = denodeify(cp.exec as any, (error, stdout, stderr) => [undefined, { stdout, stderr, error }]); const glob = denodeify(_glob); const resourcesPath = path.join(path.dirname(__dirname), 'resources'); @@ -929,11 +928,12 @@ async function prepublish(cwd: string, manifest: Manifest, useYarn: boolean = fa console.log(`Executing prepublish script '${useYarn ? 'yarn' : 'npm'} run vscode:prepublish'...`); - const { stdout, stderr, error } = await exec(`${useYarn ? 'yarn' : 'npm'} run vscode:prepublish`, { cwd, maxBuffer: 5000 * 1024 }); - process.stdout.write(stdout); - // in case of error, stderr gets written by a top-level exception handler - if (error !== undefined) throw error; - process.stderr.write(stderr); + await new Promise((c, e) => { + const tool = useYarn ? 'yarn' : 'npm'; + const child = cp.spawn(tool, ['run', 'vscode:prepublish'], { cwd, shell: true, stdio: 'inherit' }); + child.on('exit', code => code === 0 ? c() : e(`${tool} failed with exit code ${code}`)); + child.on('error', e); + }); } async function getPackagePath(cwd: string, manifest: Manifest, options: IPackageOptions = {}): Promise { From 07ea89230270a9a1e3e8350d57227943d5939865 Mon Sep 17 00:00:00 2001 From: Owen Farrell Date: Mon, 11 May 2020 12:34:27 -0400 Subject: [PATCH 024/131] Support injecting PAT from an environmental variable --- src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index c552a92f..0872420d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -80,7 +80,7 @@ module.exports = function (argv: string[]): void { program .command('publish []') .description('Publishes an extension') - .option('-p, --pat ', 'Personal Access Token') + .option('-p, --pat ', 'Personal Access Token', process.env['VSCE_PAT']) .option('-m, --message ', 'Commit message used when calling `npm version`.') .option('--packagePath [path]', 'Publish the VSIX package located at the specified path.') .option('--baseContentUrl [url]', 'Prepend all relative links in README.md with this url.') From d1609eea711d930ba796b09ef892f19db23b8fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 5 Jun 2020 13:59:33 +0200 Subject: [PATCH 025/131] 1.76.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 40b2366d..c36767e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.75.0", + "version": "1.76.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 2929c77b3a6fcf0e284a2dd45a329e88f55d6540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 10 Jun 2020 11:23:56 +0200 Subject: [PATCH 026/131] add test task --- .vscode/tasks.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index bacb5606..f49ea199 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -14,6 +14,10 @@ "isDefault": true }, "isBackground": true + }, + { + "type": "npm", + "script": "test" } ] } \ No newline at end of file From 1d582dccc9aa1281cff707666880272154c1d6b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 10 Jun 2020 11:24:19 +0200 Subject: [PATCH 027/131] fixes #455 --- src/test/validation.test.ts | 1 + src/validation.ts | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/validation.test.ts b/src/test/validation.test.ts index fa4508b2..b98a3d9b 100644 --- a/src/test/validation.test.ts +++ b/src/test/validation.test.ts @@ -109,6 +109,7 @@ describe('validateVSCodeTypesCompatibility', () => { validateVSCodeTypesCompatibility('1.30.0', '1.30.0'); validateVSCodeTypesCompatibility('1.30.0', '1.20.0'); + validateVSCodeTypesCompatibility('1.46.0', '1.45.1'); assert.throws(() => validateVSCodeTypesCompatibility('1.30.0', '1.40.0')); assert.throws(() => validateVSCodeTypesCompatibility('1.30.0', '^1.40.0')); diff --git a/src/validation.ts b/src/validation.ts index 2d7290e4..3b0cec75 100644 --- a/src/validation.ts +++ b/src/validation.ts @@ -91,13 +91,13 @@ export function validateVSCodeTypesCompatibility(engineVersion: string, typeVers const error = new Error(`@types/vscode ${typeVersion} greater than engines.vscode ${engineVersion}. Consider upgrade engines.vscode or use an older @types/vscode version`); - if (typeof typeMajor === 'number' && typeof engineMajor === 'number' && typeMajor > engineMajor) { + if (typeMajor > engineMajor) { throw error; } - if (typeof typeMinor === 'number' && typeof engineMinor === 'number' && typeMinor > engineMinor) { + if (typeMajor === engineMajor && typeMinor > engineMinor) { throw error; } - if (typeof typePatch === 'number' && typeof enginePatch === 'number' && typePatch > enginePatch) { + if (typeMajor === engineMajor && typeMinor === engineMinor && typePatch > enginePatch) { throw error; } } \ No newline at end of file From a4cca087461e7148046229212e6d8702a99b0777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 10 Jun 2020 11:24:35 +0200 Subject: [PATCH 028/131] 1.76.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c36767e1..23eb45df 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.76.0", + "version": "1.76.1", "description": "VSCode Extension Manager", "repository": { "type": "git", From 600505a0655b1e178d522843ad05efe27acf728f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 15 Jun 2020 09:41:46 +0200 Subject: [PATCH 029/131] cleanup github badge validation --- src/package.ts | 14 +++++++------- src/test/package.test.ts | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/package.ts b/src/package.ts index ca0896bd..d6a72f8c 100644 --- a/src/package.ts +++ b/src/package.ts @@ -171,16 +171,16 @@ const TrustedSVGSources = [ 'www.versioneye.com' ]; -function isHostTrusted(host: string): boolean { - return TrustedSVGSources.indexOf(host.toLowerCase()) > -1; -} - function isGitHubRepository(repository: string): boolean { return /^https:\/\/github\.com\/|^git@github\.com:/.test(repository || ''); } function isGitHubBadge(href: string): boolean { - return isGitHubRepository(href) && /[A-Za-z0-9_-]{1,100}\/workflows\/[^<>:;,?"*|/]+\/badge\.svg$/.test(href || ''); + return /^https:\/\/github\.com\/[^/]+\/[^/]+\/workflows\/.*badge\.svg/.test(href || ''); +} + +function isHostTrusted(url: url.UrlWithStringQuery): boolean { + return TrustedSVGSources.indexOf(url.host.toLowerCase()) > -1 || isGitHubBadge(url.href); } class ManifestProcessor extends BaseProcessor { @@ -472,7 +472,7 @@ export class MarkdownProcessor extends BaseProcessor { throw new Error(`Images in ${this.name} must come from an HTTPS source: ${src}`); } - if (/\.svg$/i.test(srcUrl.pathname) && (!isHostTrusted(srcUrl.host) && !isGitHubBadge(srcUrl.href))) { + if (/\.svg$/i.test(srcUrl.pathname) && (!isHostTrusted(srcUrl))) { throw new Error(`SVGs are restricted in ${this.name}; please use other file image formats, such as PNG: ${src}`); } }); @@ -717,7 +717,7 @@ export function validateManifest(manifest: Manifest): Manifest { throw new Error(`Badge URLs must come from an HTTPS source: ${badge.url}`); } - if (/\.svg$/i.test(srcUrl.pathname) && (!isHostTrusted(srcUrl.host) && !isGitHubBadge(srcUrl.href))) { + if (/\.svg$/i.test(srcUrl.pathname) && (!isHostTrusted(srcUrl))) { throw new Error(`Badge SVGs are restricted. Please use other file image formats, such as PNG: ${badge.url}`); } }); diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 9bbf0244..221cdda5 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1642,7 +1642,7 @@ describe('MarkdownProcessor', () => { assert(file); }); - it('should allow SVG from GitHub actions in image tag', async() => { + it('should allow SVG from GitHub actions in image tag', async () => { const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; const contents = `![title](https://github.com/fakeuser/fakerepo/workflows/fakeworkflowname/badge.svg)`; const processor = new ReadmeProcessor(manifest, {}); @@ -1652,7 +1652,7 @@ describe('MarkdownProcessor', () => { assert(file); }); - it('should prevent SVG from a GitHub repo in image tag', async() => { + it('should prevent SVG from a GitHub repo in image tag', async () => { const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; const contents = `![title](https://github.com/eviluser/evilrepo/blob/master/malicious.svg)`; const processor = new ReadmeProcessor(manifest, {}); From 96e7e42bb43d8c3beab88de924310997e73fda14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 15 Jun 2020 09:42:47 +0200 Subject: [PATCH 030/131] 1.77.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 23eb45df..c0ef4bfa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.76.1", + "version": "1.77.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From c0b8adda4ee90eddf2eb1682ce1bdc7931e03596 Mon Sep 17 00:00:00 2001 From: Shaun Tabone Date: Sat, 20 Jun 2020 10:59:45 +0200 Subject: [PATCH 031/131] Added Dockerfile for docker support --- .dockerignore | 6 ++++++ Dockerfile | 10 ++++++++++ README.md | 20 +++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..2711dc52 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +node_modules/ +out/ +npm-debug.log +!src/test/**/node_modules +package-lock.json +Dockerfile \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..2a111dfc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM node:12-alpine +VOLUME /usr/share/vsce +WORKDIR /src +COPY package.json . +COPY yarn.lock . +RUN yarn +COPY . . +RUN yarn compile +WORKDIR /usr/share/vsce +ENTRYPOINT ["/src/out/vsce"] \ No newline at end of file diff --git a/README.md b/README.md index 03d2bdfc..87b5d6e6 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ ## Requirements -- [Node.js](https://nodejs.org/en/) at least `8.x.x` +- [Node.js](https://nodejs.org/en/) at least `8.x.x` or +- [Docker](https://docker.com/) ## Usage @@ -14,6 +15,23 @@ > **Warning:** When using vsce as a library be sure to sanitize any user input used in API calls, as a security measurement. +### via Node.js + +To install vsce globally, you can use the following command: + +```sh +npm install -g vsce +``` + +### via Docker + +To build your own Docker image, first clone this repository and then run the following commands: + +```sh +docker build -t vsce . +docker run -it -v /host/path/extension:/usr/share/vsce vsce # change /host/path/extension to your actual vsce extension path +``` + ## Development First clone this repository, then: From b57d6a60a00f0852fb64ee91be2746a891872082 Mon Sep 17 00:00:00 2001 From: Tomas Vik Date: Fri, 26 Jun 2020 14:29:29 +0200 Subject: [PATCH 032/131] Fix issues with missing out directory --- package.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index c0ef4bfa..e8d97b1c 100644 --- a/package.json +++ b/package.json @@ -24,11 +24,12 @@ "vsce": "out/vsce" }, "scripts": { - "compile": "tsc && cp src/vsce out/vsce", - "watch": "cp src/vsce out/vsce && tsc --watch", - "watch-test": "cp src/vsce out/vsce && concurrently \"tsc --watch\" \"mocha --watch\"", + "copy-vsce": "mkdir -p out && cp src/vsce out/vsce", + "compile": "tsc && yarn copy-vsce", + "watch": "yarn copy-vsce && tsc --watch", + "watch-test": "yarn copy-vsce && concurrently \"tsc --watch\" \"mocha --watch\"", "test": "mocha", - "prepublishOnly": "tsc && cp src/vsce out/vsce && mocha", + "prepublishOnly": "tsc && yarn copy-vsce && mocha", "vsce": "out/vsce" }, "engines": { From ad67f3554ad53b38cdad3bc6a6fab7304d250286 Mon Sep 17 00:00:00 2001 From: Tomas Vik Date: Fri, 26 Jun 2020 14:30:17 +0200 Subject: [PATCH 033/131] Update launch.json to be useful for extension debugging --- .vscode/launch.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 5e421d83..754af5a1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,13 +8,14 @@ "type": "node", "request": "launch", "name": "Launch Program", + // "cwd": "", "program": "${workspaceFolder}/out/vsce", "args": [ "--version" + // "ls", "package", "publish" ], "sourceMaps": true, - "outputCapture": "std", - "preLaunchTask": "compile" + "outputCapture": "std" } ] } \ No newline at end of file From 2a6d88d7ba626a872fa59df8405a2087059d9299 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2020 22:33:45 +0000 Subject: [PATCH 034/131] Bump lodash from 4.17.15 to 4.17.19 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] --- yarn.lock | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index beeeea4c..071bc120 100644 --- a/yarn.lock +++ b/yarn.lock @@ -630,15 +630,10 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash@^4.15.0: - version "4.17.13" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.13.tgz#0bdc3a6adc873d2f4e0c4bac285df91b64fc7b93" - integrity sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA== - -lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.15.0, lodash@^4.17.15: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== log-symbols@3.0.0: version "3.0.0" From b95a11bf0d66471dea1b5e40bf696351a5cc6b4b Mon Sep 17 00:00:00 2001 From: Greg Van Liew Date: Sat, 25 Jul 2020 15:10:44 -0700 Subject: [PATCH 035/131] Fix typo in README Fixes #470 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 03d2bdfc..bafcade7 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ `vsce` is meant to be mainly used as a command line tool. It can also be used a library since it exposes a small [API](https://github.com/microsoft/vscode-vsce/blob/master/src/api.ts). -> **Warning:** When using vsce as a library be sure to sanitize any user input used in API calls, as a security measurement. +> **Warning:** When using vsce as a library be sure to sanitize any user input used in API calls, as a security measure. ## Development From 960c841778b8e4e303f71b9de51862b747fc8a8b Mon Sep 17 00:00:00 2001 From: Jeffrey Chen Date: Mon, 3 Aug 2020 10:36:09 -0400 Subject: [PATCH 036/131] Prevent mailto links from being joined with prefix --- src/package.ts | 6 +++++- src/test/fixtures/readme/readme.expected.md | 1 + src/test/fixtures/readme/readme.github.expected.md | 1 + src/test/fixtures/readme/readme.github.md | 1 + src/test/fixtures/readme/readme.images.expected.md | 1 + src/test/fixtures/readme/readme.md | 1 + 6 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/package.ts b/src/package.ts index d6a72f8c..ef8c5998 100644 --- a/src/package.ts +++ b/src/package.ts @@ -390,7 +390,11 @@ export class MarkdownProcessor extends BaseProcessor { } const markdownPathRegex = /(!?)\[([^\]\[]*|!\[[^\]\[]*]\([^\)]+\))\]\(([^\)]+)\)/g; - const urlReplace = (_, isImage, title, link) => { + const urlReplace = (_, isImage, title, link: string) => { + if (/^mailto:/i.test(link)) { + return `${isImage}[${title}](${link})`; + } + const isLinkRelative = !/^\w+:\/\//.test(link) && link[0] !== '#'; if (!this.baseContentUrl && !this.baseImagesUrl) { diff --git a/src/test/fixtures/readme/readme.expected.md b/src/test/fixtures/readme/readme.expected.md index 67628fe3..46ab381d 100644 --- a/src/test/fixtures/readme/readme.expected.md +++ b/src/test/fixtures/readme/readme.expected.md @@ -31,6 +31,7 @@ The `spellMD.json` config file is watched so you can add more ignores or change [mono](https://github.com/username/repository/blob/master/monkey) [not](http://shouldnottouchthis/) +[Email me](mailto:example@example.com) # Install This extension is published in the VS Code Gallery. So simply hit 'F1' and type 'ext inst' from there select `SpellMD` and follow instructions. diff --git a/src/test/fixtures/readme/readme.github.expected.md b/src/test/fixtures/readme/readme.github.expected.md index f28c96ce..5c1f8050 100644 --- a/src/test/fixtures/readme/readme.github.expected.md +++ b/src/test/fixtures/readme/readme.github.expected.md @@ -12,3 +12,4 @@ * foo/$234/#7 * [#7](http://shouldnottouchthis/) * [other/repositoryName#8](http://shouldnottouchthis/) + * [Email me](MAILTO:example@example.com) diff --git a/src/test/fixtures/readme/readme.github.md b/src/test/fixtures/readme/readme.github.md index 51355f13..7d40e679 100644 --- a/src/test/fixtures/readme/readme.github.md +++ b/src/test/fixtures/readme/readme.github.md @@ -12,3 +12,4 @@ * foo/$234/#7 * [#7](http://shouldnottouchthis/) * [other/repositoryName#8](http://shouldnottouchthis/) + * [Email me](MAILTO:example@example.com) diff --git a/src/test/fixtures/readme/readme.images.expected.md b/src/test/fixtures/readme/readme.images.expected.md index cae36542..19dc6d7f 100644 --- a/src/test/fixtures/readme/readme.images.expected.md +++ b/src/test/fixtures/readme/readme.images.expected.md @@ -31,6 +31,7 @@ The `spellMD.json` config file is watched so you can add more ignores or change [mono](https://github.com/username/repository/blob/master/monkey) [not](http://shouldnottouchthis/) +[Email me](mailto:example@example.com) # Install This extension is published in the VS Code Gallery. So simply hit 'F1' and type 'ext inst' from there select `SpellMD` and follow instructions. diff --git a/src/test/fixtures/readme/readme.md b/src/test/fixtures/readme/readme.md index 970b9b6f..c28a5ee0 100644 --- a/src/test/fixtures/readme/readme.md +++ b/src/test/fixtures/readme/readme.md @@ -31,6 +31,7 @@ The `spellMD.json` config file is watched so you can add more ignores or change [mono](monkey) [not](http://shouldnottouchthis/) +[Email me](mailto:example@example.com) # Install This extension is published in the VS Code Gallery. So simply hit 'F1' and type 'ext inst' from there select `SpellMD` and follow instructions. From 16f35b3485c79195f4c31c8992da3b855cbed49b Mon Sep 17 00:00:00 2001 From: JeffreyCA Date: Sat, 8 Aug 2020 22:33:50 -0400 Subject: [PATCH 037/131] Add githubBranch flag to control the branch for GitHub relative links --- src/main.ts | 6 ++++-- src/package.ts | 10 ++++++---- src/publish.ts | 4 +++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main.ts b/src/main.ts index 0872420d..ad9c61ce 100644 --- a/src/main.ts +++ b/src/main.ts @@ -70,12 +70,13 @@ module.exports = function (argv: string[]): void { .command('package') .description('Packages an extension') .option('-o, --out [path]', 'Output .vsix extension file to [path] location') + .option('--githubBranch [branch]', 'The GitHub branch used to infer relative links in README.md. Can be overriden by --baseContentUrl and --baseImagesUrl.') .option('--baseContentUrl [url]', 'Prepend all relative links in README.md with this url.') .option('--baseImagesUrl [url]', 'Prepend all relative image links in README.md with this url.') .option('--yarn', 'Use yarn instead of npm') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') .option('--noGitHubIssueLinking', 'Prevent automatic expansion of GitHub-style issue syntax into links') - .action(({ out, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking }) => main(packageCommand({ packagePath: out, baseContentUrl, baseImagesUrl, useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking }))); + .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking }) => main(packageCommand({ packagePath: out, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking }))); program .command('publish []') @@ -83,12 +84,13 @@ module.exports = function (argv: string[]): void { .option('-p, --pat ', 'Personal Access Token', process.env['VSCE_PAT']) .option('-m, --message ', 'Commit message used when calling `npm version`.') .option('--packagePath [path]', 'Publish the VSIX package located at the specified path.') + .option('--githubBranch [branch]', 'The GitHub branch used to infer relative links in README.md. Can be overriden by --baseContentUrl and --baseImagesUrl.') .option('--baseContentUrl [url]', 'Prepend all relative links in README.md with this url.') .option('--baseImagesUrl [url]', 'Prepend all relative image links in README.md with this url.') .option('--yarn', 'Use yarn instead of npm while packing extension files') .option('--noVerify') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') - .action((version, { pat, message, packagePath, baseContentUrl, baseImagesUrl, yarn, noVerify, ignoreFile }) => main(publish({ pat, commitMessage: message, version, packagePath, baseContentUrl, baseImagesUrl, useYarn: yarn, noVerify, ignoreFile }))); + .action((version, { pat, message, packagePath, githubBranch, baseContentUrl, baseImagesUrl, yarn, noVerify, ignoreFile }) => main(publish({ pat, commitMessage: message, version, packagePath, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, noVerify, ignoreFile }))); program .command('unpublish []') diff --git a/src/package.ts b/src/package.ts index ef8c5998..ac2aa79d 100644 --- a/src/package.ts +++ b/src/package.ts @@ -59,6 +59,7 @@ export interface IAsset { export interface IPackageOptions { cwd?: string; packagePath?: string; + githubBranch?: string; baseContentUrl?: string; baseImagesUrl?: string; useYarn?: boolean; @@ -365,7 +366,7 @@ export class MarkdownProcessor extends BaseProcessor { constructor(manifest: Manifest, private name: string, private regexp: RegExp, private assetType: string, options: IPackageOptions = {}) { super(manifest); - const guess = this.guessBaseUrls(); + const guess = this.guessBaseUrls(options.githubBranch); this.baseContentUrl = options.baseContentUrl || (guess && guess.content); this.baseImagesUrl = options.baseImagesUrl || options.baseContentUrl || (guess && guess.images); @@ -492,7 +493,7 @@ export class MarkdownProcessor extends BaseProcessor { } // GitHub heuristics - private guessBaseUrls(): { content: string; images: string; repository: string } { + private guessBaseUrls(githubBranch: string | undefined): { content: string; images: string; repository: string } { let repository = null; if (typeof this.manifest.repository === 'string') { @@ -514,10 +515,11 @@ export class MarkdownProcessor extends BaseProcessor { const account = match[1]; const repositoryName = match[2].replace(/\.git$/i, ''); + const branchName = githubBranch ? githubBranch : 'master'; return { - content: `https://github.com/${account}/${repositoryName}/blob/master`, - images: `https://github.com/${account}/${repositoryName}/raw/master`, + content: `https://github.com/${account}/${repositoryName}/blob/${branchName}`, + images: `https://github.com/${account}/${repositoryName}/raw/${branchName}`, repository: `https://github.com/${account}/${repositoryName}` }; } diff --git a/src/publish.ts b/src/publish.ts index 3375e877..1d3f0d8d 100644 --- a/src/publish.ts +++ b/src/publish.ts @@ -92,6 +92,7 @@ export interface IPublishOptions { commitMessage?: string; cwd?: string; pat?: string; + githubBranch?: string; baseContentUrl?: string; baseImagesUrl?: string; useYarn?: boolean; @@ -156,6 +157,7 @@ export function publish(options: IPublishOptions = {}): Promise { .then(manifest => ({ manifest, packagePath: options.packagePath })); } else { const cwd = options.cwd; + const githubBranch = options.githubBranch; const baseContentUrl = options.baseContentUrl; const baseImagesUrl = options.baseImagesUrl; const useYarn = options.useYarn; @@ -163,7 +165,7 @@ export function publish(options: IPublishOptions = {}): Promise { promise = versionBump(options.cwd, options.version, options.commitMessage) .then(() => tmpName()) - .then(packagePath => pack({ packagePath, cwd, baseContentUrl, baseImagesUrl, useYarn, ignoreFile })); + .then(packagePath => pack({ packagePath, cwd, githubBranch, baseContentUrl, baseImagesUrl, useYarn, ignoreFile })); } return promise.then(({ manifest, packagePath }) => { From fc75efa9ad086f017b416673f727f66db7fb1c32 Mon Sep 17 00:00:00 2001 From: JeffreyCA Date: Sat, 8 Aug 2020 22:33:59 -0400 Subject: [PATCH 038/131] Add test --- .../fixtures/readme/readme.branch.expected.md | 48 +++++++++++++++++++ src/test/package.test.ts | 31 ++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 src/test/fixtures/readme/readme.branch.expected.md diff --git a/src/test/fixtures/readme/readme.branch.expected.md b/src/test/fixtures/readme/readme.branch.expected.md new file mode 100644 index 00000000..3b8d5a21 --- /dev/null +++ b/src/test/fixtures/readme/readme.branch.expected.md @@ -0,0 +1,48 @@ +# README + +>**Important:** Once installed the checker will only update if you add the setting `"spellMD.enable": true` to your `.vscode\settings.json` file. + +This README covers off: +* [Functionality](#functionality) +* [Install](#install) +* [Run and Configure](#run-and-configure) +* [Known Issues/Bugs](#known-issuesbugs) +* [Backlog](#backlog) +* [How to Debug](#how-to-debug) + +# Functionality + +Load up a Markdown file and get highlights and hovers for existing issues. Checking will occur as you type in the document. + +![Underscores and hovers](https://github.com/username/repository/raw/master/images/SpellMDDemo1.gif) + +The status bar lets you quickly navigate to any issue and you can see all positions in the gutter. + +[![Jump to issues](https://github.com/username/repository/raw/master/images/SpellMDDemo2.gif)](http://shouldnottouchthis/) +[![Jump to issues](https://github.com/username/repository/raw/master/images/SpellMDDemo2.gif)](https://github.com/username/repository/blob/main/monkey) +![](https://github.com/username/repository/raw/master/images/SpellMDDemo2.gif) + + +The `spellMD.json` config file is watched so you can add more ignores or change mappings at will. + +![Add to dictionary](https://github.com/username/repository/raw/master/images/SpellMDDemo3.gif) + +![issue](https://github.com/username/repository/raw/master/issue) + +[mono](https://github.com/username/repository/blob/main/monkey) +[not](http://shouldnottouchthis/) +[Email me](mailto:example@example.com) + +# Install +This extension is published in the VS Code Gallery. So simply hit 'F1' and type 'ext inst' from there select `SpellMD` and follow instructions. + + +To clone the extension and load locally... + +``` +git clone https://github.com/Microsoft/vscode-SpellMD.git +npm install +tsc +``` + +>**Note:** TypeScript 1.6 or higher is required you can check with `tsc -v` and if you need to upgrade then run `npm install -g typescript`. diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 221cdda5..7e026eee 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1466,6 +1466,37 @@ describe('MarkdownProcessor', () => { }); }); + it('should respect specified GitHub branch and can be overriden', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', + engines: Object.create(null), + repository: 'https://github.com/username/repository' + }; + + const root = fixture('readme'); + const processor = new ReadmeProcessor(manifest, { + githubBranch: 'main', + // Override image relative links to point to different base URL + baseImagesUrl: 'https://github.com/username/repository/raw/master' + }); + const readme = { + path: 'extension/readme.md', + localPath: path.join(root, 'readme.md') + }; + + return processor.onFile(readme) + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.branch.expected.md'), 'utf8') + .then(expected => { + assert.equal(actual, expected); + }); + }); + }); + it('should infer baseContentUrl if its a github repo (.git)', () => { const manifest = { name: 'test', From 728b7930bc870e2078be820c8c5d1c84188fda94 Mon Sep 17 00:00:00 2001 From: JeffreyCA Date: Mon, 10 Aug 2020 14:25:00 -0400 Subject: [PATCH 039/131] Update tests --- ...cted.md => readme.branch.main.expected.md} | 14 ++-- ...readme.branch.override.content.expected.md | 48 +++++++++++ .../readme.branch.override.images.expected.md | 48 +++++++++++ src/test/package.test.ts | 79 +++++++++++++++++-- 4 files changed, 175 insertions(+), 14 deletions(-) rename src/test/fixtures/readme/{readme.branch.expected.md => readme.branch.main.expected.md} (77%) create mode 100644 src/test/fixtures/readme/readme.branch.override.content.expected.md create mode 100644 src/test/fixtures/readme/readme.branch.override.images.expected.md diff --git a/src/test/fixtures/readme/readme.branch.expected.md b/src/test/fixtures/readme/readme.branch.main.expected.md similarity index 77% rename from src/test/fixtures/readme/readme.branch.expected.md rename to src/test/fixtures/readme/readme.branch.main.expected.md index 3b8d5a21..d6ef3666 100644 --- a/src/test/fixtures/readme/readme.branch.expected.md +++ b/src/test/fixtures/readme/readme.branch.main.expected.md @@ -14,20 +14,20 @@ This README covers off: Load up a Markdown file and get highlights and hovers for existing issues. Checking will occur as you type in the document. -![Underscores and hovers](https://github.com/username/repository/raw/master/images/SpellMDDemo1.gif) +![Underscores and hovers](https://github.com/username/repository/raw/main/images/SpellMDDemo1.gif) The status bar lets you quickly navigate to any issue and you can see all positions in the gutter. -[![Jump to issues](https://github.com/username/repository/raw/master/images/SpellMDDemo2.gif)](http://shouldnottouchthis/) -[![Jump to issues](https://github.com/username/repository/raw/master/images/SpellMDDemo2.gif)](https://github.com/username/repository/blob/main/monkey) -![](https://github.com/username/repository/raw/master/images/SpellMDDemo2.gif) - +[![Jump to issues](https://github.com/username/repository/raw/main/images/SpellMDDemo2.gif)](http://shouldnottouchthis/) +[![Jump to issues](https://github.com/username/repository/raw/main/images/SpellMDDemo2.gif)](https://github.com/username/repository/blob/main/monkey) +![](https://github.com/username/repository/raw/main/images/SpellMDDemo2.gif) + The `spellMD.json` config file is watched so you can add more ignores or change mappings at will. -![Add to dictionary](https://github.com/username/repository/raw/master/images/SpellMDDemo3.gif) +![Add to dictionary](https://github.com/username/repository/raw/main/images/SpellMDDemo3.gif) -![issue](https://github.com/username/repository/raw/master/issue) +![issue](https://github.com/username/repository/raw/main/issue) [mono](https://github.com/username/repository/blob/main/monkey) [not](http://shouldnottouchthis/) diff --git a/src/test/fixtures/readme/readme.branch.override.content.expected.md b/src/test/fixtures/readme/readme.branch.override.content.expected.md new file mode 100644 index 00000000..8bf6e2c9 --- /dev/null +++ b/src/test/fixtures/readme/readme.branch.override.content.expected.md @@ -0,0 +1,48 @@ +# README + +>**Important:** Once installed the checker will only update if you add the setting `"spellMD.enable": true` to your `.vscode\settings.json` file. + +This README covers off: +* [Functionality](#functionality) +* [Install](#install) +* [Run and Configure](#run-and-configure) +* [Known Issues/Bugs](#known-issuesbugs) +* [Backlog](#backlog) +* [How to Debug](#how-to-debug) + +# Functionality + +Load up a Markdown file and get highlights and hovers for existing issues. Checking will occur as you type in the document. + +![Underscores and hovers](https://github.com/base/images/SpellMDDemo1.gif) + +The status bar lets you quickly navigate to any issue and you can see all positions in the gutter. + +[![Jump to issues](https://github.com/base/images/SpellMDDemo2.gif)](http://shouldnottouchthis/) +[![Jump to issues](https://github.com/base/images/SpellMDDemo2.gif)](https://github.com/base/monkey) +![](https://github.com/base/images/SpellMDDemo2.gif) + + +The `spellMD.json` config file is watched so you can add more ignores or change mappings at will. + +![Add to dictionary](https://github.com/base/images/SpellMDDemo3.gif) + +![issue](https://github.com/base/issue) + +[mono](https://github.com/base/monkey) +[not](http://shouldnottouchthis/) +[Email me](mailto:example@example.com) + +# Install +This extension is published in the VS Code Gallery. So simply hit 'F1' and type 'ext inst' from there select `SpellMD` and follow instructions. + + +To clone the extension and load locally... + +``` +git clone https://github.com/Microsoft/vscode-SpellMD.git +npm install +tsc +``` + +>**Note:** TypeScript 1.6 or higher is required you can check with `tsc -v` and if you need to upgrade then run `npm install -g typescript`. diff --git a/src/test/fixtures/readme/readme.branch.override.images.expected.md b/src/test/fixtures/readme/readme.branch.override.images.expected.md new file mode 100644 index 00000000..9df6b7e9 --- /dev/null +++ b/src/test/fixtures/readme/readme.branch.override.images.expected.md @@ -0,0 +1,48 @@ +# README + +>**Important:** Once installed the checker will only update if you add the setting `"spellMD.enable": true` to your `.vscode\settings.json` file. + +This README covers off: +* [Functionality](#functionality) +* [Install](#install) +* [Run and Configure](#run-and-configure) +* [Known Issues/Bugs](#known-issuesbugs) +* [Backlog](#backlog) +* [How to Debug](#how-to-debug) + +# Functionality + +Load up a Markdown file and get highlights and hovers for existing issues. Checking will occur as you type in the document. + +![Underscores and hovers](https://github.com/base/images/SpellMDDemo1.gif) + +The status bar lets you quickly navigate to any issue and you can see all positions in the gutter. + +[![Jump to issues](https://github.com/base/images/SpellMDDemo2.gif)](http://shouldnottouchthis/) +[![Jump to issues](https://github.com/base/images/SpellMDDemo2.gif)](https://github.com/username/repository/blob/main/monkey) +![](https://github.com/base/images/SpellMDDemo2.gif) + + +The `spellMD.json` config file is watched so you can add more ignores or change mappings at will. + +![Add to dictionary](https://github.com/base/images/SpellMDDemo3.gif) + +![issue](https://github.com/base/issue) + +[mono](https://github.com/username/repository/blob/main/monkey) +[not](http://shouldnottouchthis/) +[Email me](mailto:example@example.com) + +# Install +This extension is published in the VS Code Gallery. So simply hit 'F1' and type 'ext inst' from there select `SpellMD` and follow instructions. + + +To clone the extension and load locally... + +``` +git clone https://github.com/Microsoft/vscode-SpellMD.git +npm install +tsc +``` + +>**Note:** TypeScript 1.6 or higher is required you can check with `tsc -v` and if you need to upgrade then run `npm install -g typescript`. diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 7e026eee..4a20cd34 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1466,7 +1466,7 @@ describe('MarkdownProcessor', () => { }); }); - it('should respect specified GitHub branch and can be overriden', () => { + it('should replace relative links with GitHub URLs while respecting githubBranch', () => { const manifest = { name: 'test', publisher: 'mocha', @@ -1478,9 +1478,7 @@ describe('MarkdownProcessor', () => { const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, { - githubBranch: 'main', - // Override image relative links to point to different base URL - baseImagesUrl: 'https://github.com/username/repository/raw/master' + githubBranch: 'main' }); const readme = { path: 'extension/readme.md', @@ -1490,13 +1488,80 @@ describe('MarkdownProcessor', () => { return processor.onFile(readme) .then(file => read(file)) .then(actual => { - return readFile(path.join(root, 'readme.branch.expected.md'), 'utf8') + return readFile(path.join(root, 'readme.branch.main.expected.md'), 'utf8') .then(expected => { assert.equal(actual, expected); }); }); }); + it("should override image URLs with baseImagesUrl while also respecting githubBranch", () => { + const manifest = { + name: "test", + publisher: "mocha", + version: "0.0.1", + description: "test extension", + engines: Object.create(null), + repository: "https://github.com/username/repository", + }; + + const root = fixture("readme"); + const processor = new ReadmeProcessor(manifest, { + githubBranch: "main", + // Override image relative links to point to different base URL + baseImagesUrl: "https://github.com/base", + }); + const readme = { + path: "extension/readme.md", + localPath: path.join(root, "readme.md"), + }; + + return processor + .onFile(readme) + .then((file) => read(file)) + .then((actual) => { + return readFile( + path.join(root, "readme.branch.override.images.expected.md"), + "utf8" + ).then((expected) => { + assert.equal(actual, expected); + }); + }); + }); + + it("should override githubBranch setting with baseContentUrl", () => { + const manifest = { + name: "test", + publisher: "mocha", + version: "0.0.1", + description: "test extension", + engines: Object.create(null), + repository: "https://github.com/username/repository", + }; + + const root = fixture("readme"); + const processor = new ReadmeProcessor(manifest, { + githubBranch: "main", + baseContentUrl: "https://github.com/base", + }); + const readme = { + path: "extension/readme.md", + localPath: path.join(root, "readme.md"), + }; + + return processor + .onFile(readme) + .then((file) => read(file)) + .then((actual) => { + return readFile( + path.join(root, "readme.branch.override.content.expected.md"), + "utf8" + ).then((expected) => { + assert.equal(actual, expected); + }); + }); + }); + it('should infer baseContentUrl if its a github repo (.git)', () => { const manifest = { name: 'test', @@ -1520,8 +1585,8 @@ describe('MarkdownProcessor', () => { return readFile(path.join(root, 'readme.expected.md'), 'utf8') .then(expected => { assert.equal(actual, expected); - }); - }); + }); + }); }); it('should replace img urls with baseImagesUrl', () => { From 9633988aa022062eb5a82554e20d128f9ae012c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 11 Aug 2020 20:06:23 +0200 Subject: [PATCH 040/131] 1.78.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e8d97b1c..736e09e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.77.0", + "version": "1.78.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 3b10000ad4f922f49b1642795d5b3593be0cadfd Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Aug 2020 11:39:44 +0200 Subject: [PATCH 041/131] support web extensions --- src/main.ts | 6 ++- src/manifest.ts | 5 +- src/package.ts | 103 ++++++++++++++++++++++++++++++++++++++- src/publicgalleryapi.ts | 20 +++++++- src/publish.ts | 4 +- src/test/package.test.ts | 81 +++++++++++++++++++++++++++++- 6 files changed, 211 insertions(+), 8 deletions(-) diff --git a/src/main.ts b/src/main.ts index ad9c61ce..c611a68d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -76,7 +76,8 @@ module.exports = function (argv: string[]): void { .option('--yarn', 'Use yarn instead of npm') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') .option('--noGitHubIssueLinking', 'Prevent automatic expansion of GitHub-style issue syntax into links') - .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking }) => main(packageCommand({ packagePath: out, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking }))); + .option('--web', 'Enable packing as web extension. Note: This is a preview feature and is supported only for selected extensions.') + .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking, web }) => main(packageCommand({ packagePath: out, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking, web }))); program .command('publish []') @@ -90,7 +91,8 @@ module.exports = function (argv: string[]): void { .option('--yarn', 'Use yarn instead of npm while packing extension files') .option('--noVerify') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') - .action((version, { pat, message, packagePath, githubBranch, baseContentUrl, baseImagesUrl, yarn, noVerify, ignoreFile }) => main(publish({ pat, commitMessage: message, version, packagePath, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, noVerify, ignoreFile }))); + .option('--web', 'Enable packing as web extension. Note: This is a preview feature and is supported only for selected extensions.') + .action((version, { pat, message, packagePath, githubBranch, baseContentUrl, baseImagesUrl, yarn, noVerify, ignoreFile, web }) => main(publish({ pat, commitMessage: message, version, packagePath, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, noVerify, ignoreFile, web }))); program .command('unpublish []') diff --git a/src/manifest.ts b/src/manifest.ts index 542781aa..da1ac198 100644 --- a/src/manifest.ts +++ b/src/manifest.ts @@ -21,6 +21,8 @@ export interface Contributions { [contributionType: string]: any; } +export type ExtensionKind = 'ui' | 'workspace' | 'web'; + export interface Manifest { // mandatory (npm) name: string; @@ -42,7 +44,7 @@ export interface Manifest { _testing?: string; enableProposedApi?: boolean; qna?: 'marketplace' | string | false; - extensionKind?: string[]; + extensionKind?: ExtensionKind | ExtensionKind[]; // optional (npm) author?: string | Person; @@ -55,6 +57,7 @@ export interface Manifest { license?: string; contributors?: string | Person[]; main?: string; + browser?: string; repository?: string | { type?: string; url?: string; }; scripts?: { [name: string]: string; }; dependencies?: { [name: string]: string; }; diff --git a/src/package.ts b/src/package.ts index ac2aa79d..654319de 100644 --- a/src/package.ts +++ b/src/package.ts @@ -3,7 +3,7 @@ import * as path from 'path'; import * as cp from 'child_process'; import * as _ from 'lodash'; import * as yazl from 'yazl'; -import { Manifest } from './manifest'; +import { ExtensionKind, Manifest } from './manifest'; import { ITranslations, patchNLS } from './nls'; import * as util from './util'; import * as _glob from 'glob'; @@ -16,6 +16,7 @@ import { lookup } from 'mime'; import * as urljoin from 'url-join'; import { validatePublisher, validateExtensionName, validateVersion, validateEngineCompatibility, validateVSCodeTypesCompatibility } from './validation'; import { getDependencies } from './npm'; +import { IExtensionsReport } from './publicgalleryapi'; const readFile = denodeify(fs.readFile); const unlink = denodeify(fs.unlink as any); @@ -66,6 +67,7 @@ export interface IPackageOptions { dependencyEntryPoints?: string[]; ignoreFile?: string; expandGitHubIssueLinks?: boolean; + web?: boolean; } export interface IProcessor { @@ -541,7 +543,7 @@ export class ChangelogProcessor extends MarkdownProcessor { class LicenseProcessor extends BaseProcessor { private didFindLicense = false; - private filter: (name: string) => boolean; + filter: (name: string) => boolean; constructor(manifest: Manifest) { super(manifest); @@ -609,6 +611,89 @@ class IconProcessor extends BaseProcessor { } } +export function isSupportedWebExtension(manifest: Manifest, extensionsReport: IExtensionsReport): boolean { + const id = `${manifest.publisher}.${manifest.name}`; + return extensionsReport.web.publishers.some(publisher => manifest.publisher === publisher) + || extensionsReport.web.extensions.some(extension => extension === id); +} + +export function isWebKind(manifest: Manifest): boolean { + const extensionKind = getExtensionKind(manifest); + return extensionKind.some(kind => kind === 'web'); +} + +const workspaceExtensionPoints: string[] = ['terminal', 'debuggers', 'jsonValidation']; + +function getExtensionKind(manifest: Manifest): ExtensionKind[] { + // check the manifest + if (manifest.extensionKind) { + return Array.isArray(manifest.extensionKind) + ? manifest.extensionKind + : manifest.extensionKind === 'ui' ? ['ui', 'workspace'] : [manifest.extensionKind] + } + + // Not an UI extension if it has main + if (manifest.main) { + if (manifest.browser) { + return ['workspace', 'web']; + } + return ['workspace']; + } + + if (manifest.browser) { + return ['web']; + } + + const isNonEmptyArray = obj => Array.isArray(obj) && obj.length > 0; + // Not an UI nor web extension if it has dependencies or an extension pack + if (isNonEmptyArray(manifest.extensionDependencies) || isNonEmptyArray(manifest.extensionPack)) { + return ['workspace']; + } + + if (manifest.contributes) { + // Not an UI nor web extension if it has workspace contributions + for (const contribution of Object.keys(manifest.contributes)) { + if (workspaceExtensionPoints.indexOf(contribution) !== -1) { + return ['workspace']; + } + } + } + + return ['ui', 'workspace', 'web']; +} + +export class WebExtensionProcessor extends BaseProcessor { + + private readonly isWebKind: boolean = false; + private readonly licenseProcessor: LicenseProcessor; + + constructor(manifest: Manifest, options: IPackageOptions) { + super(manifest); + this.isWebKind = options.web && isWebKind(manifest); + this.licenseProcessor = new LicenseProcessor(manifest); + } + + onFile(file: IFile): Promise { + if (this.isWebKind) { + const path = util.normalize(file.path); + if (/\.svg$/i.test(path)) { + throw new Error(`SVGs can't be used in web extensions: ${path}`); + } + if ( + !/^extension\/readme.md$/i.test(path) // exclude read me + && !/^extension\/changelog.md$/i.test(path) // exclude changelog + && !/^extension\/package.json$/i.test(path) // exclude package.json + && !this.licenseProcessor.filter(path) // exclude licenses + && !/^extension\/*node_modules\/*/i.test(path) // exclude node_modules + ) { + this.assets.push({ type: `Microsoft.VisualStudio.Code.WebResources/${path}`, path }); + } + } + return Promise.resolve(file); + } + +} + export class NLSProcessor extends BaseProcessor { private translations: { [path: string]: string } = Object.create(null); @@ -870,6 +955,11 @@ export function processFiles(processors: IProcessor[], files: IFile[]): Promise< return Promise.all(processedFiles).then(files => { return util.sequence(processors.map(p => () => p.onEnd())).then(() => { const assets = _.flatten(processors.map(p => p.assets)); + + if (assets.length >= 50) { + throw new Error('Cannot have more than 50 assets'); + } + const vsix = processors.reduce((r, p) => ({ ...r, ...p.vsix }), { assets }); return Promise.all([toVsixManifest(vsix), toContentTypes(files)]).then(result => { @@ -892,6 +982,7 @@ export function createDefaultProcessors(manifest: Manifest, options: IPackageOpt new LicenseProcessor(manifest), new IconProcessor(manifest), new NLSProcessor(manifest), + new WebExtensionProcessor(manifest, options), new ValidationProcessor(manifest) ]; } @@ -968,6 +1059,14 @@ export async function pack(options: IPackageOptions = {}): Promise extensionId.toLowerCase() === `${publisher}.${name}`.toLowerCase())[0]; } + + async getExtensionsReport(): Promise { + const res = await this.client.get(this.extensionsReportUrl); + const raw = >JSON.parse(await res.readBody()); + return { + malicious: raw.malicious || [], + web: raw.web || { publishers: [], extensions: [] } + } + } } diff --git a/src/publish.ts b/src/publish.ts index 1d3f0d8d..a2449d48 100644 --- a/src/publish.ts +++ b/src/publish.ts @@ -98,6 +98,7 @@ export interface IPublishOptions { useYarn?: boolean; noVerify?: boolean; ignoreFile?: string; + web?: boolean; } async function versionBump(cwd: string = process.cwd(), version?: string, commitMessage?: string): Promise { @@ -162,10 +163,11 @@ export function publish(options: IPublishOptions = {}): Promise { const baseImagesUrl = options.baseImagesUrl; const useYarn = options.useYarn; const ignoreFile = options.ignoreFile; + const web = options.web; promise = versionBump(options.cwd, options.version, options.commitMessage) .then(() => tmpName()) - .then(packagePath => pack({ packagePath, cwd, githubBranch, baseContentUrl, baseImagesUrl, useYarn, ignoreFile })); + .then(packagePath => pack({ packagePath, cwd, githubBranch, baseContentUrl, baseImagesUrl, useYarn, ignoreFile, web })); } return promise.then(({ manifest, packagePath }) => { diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 4a20cd34..de6ce34a 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1,7 +1,7 @@ import { readManifest, collect, toContentTypes, ReadmeProcessor, read, processFiles, createDefaultProcessors, - toVsixManifest, IFile, validateManifest + toVsixManifest, IFile, validateManifest, isSupportedWebExtension, WebExtensionProcessor, IAsset } from '../package'; import { Manifest } from '../manifest'; import * as path from 'path'; @@ -10,6 +10,7 @@ import * as assert from 'assert'; import { parseString } from 'xml2js'; import * as denodeify from 'denodeify'; import * as _ from 'lodash'; +import { IExtensionsReport } from '../publicgalleryapi'; // don't warn in tests console.warn = () => null; @@ -1803,3 +1804,81 @@ describe('MarkdownProcessor', () => { await throws(() => processor.onFile(readme)); }) }); + +describe('isSupportedWebExtension', () => { + + it('should return true if extension report has extension', () => { + const manifest = createManifest({ name: 'test', publisher: 'mocha' }); + const extensionReport: IExtensionsReport = { malicious: [], web: { extensions: ['mocha.test'], publishers: [] } }; + assert.ok(isSupportedWebExtension(manifest, extensionReport)); + }); + + it('should return true if extension report has publisher', () => { + const manifest = createManifest({ name: 'test', publisher: 'mocha' }); + const extensionReport: IExtensionsReport = { malicious: [], web: { extensions: [], publishers: ['mocha'] } }; + assert.ok(isSupportedWebExtension(manifest, extensionReport)); + }); + + it('should return false if extension report does not has extension', () => { + const manifest = createManifest({ name: 'test', publisher: 'mocha' }); + const extensionReport: IExtensionsReport = { malicious: [], web: { extensions: [], publishers: [] } }; + assert.ok(!isSupportedWebExtension(manifest, extensionReport)); + }); + +}); + +describe('WebExtensionProcessor', () => { + + it('should include browser file', () => { + const manifest = createManifest({ extensionKind: ['web'] }); + const processor = new WebExtensionProcessor(manifest, { web: true }); + const file = { path: 'extension/browser.js', contents: '' }; + + processor.onFile(file); + + const expected: IAsset[] = [{ type: `Microsoft.VisualStudio.Code.WebResources/${file.path}`, path: file.path }]; + assert.deepEqual(processor.assets, expected); + }); + + it('should exclude manifest', () => { + const manifest = createManifest({ extensionKind: ['web'] }); + const processor = new WebExtensionProcessor(manifest, { web: true }); + const manifestFile = { path: 'extension/package.json', contents: JSON.stringify(manifest) }; + + processor.onFile(manifestFile); + + assert.deepEqual(processor.assets, []); + }); + + it('should exclude changelog', () => { + const manifest = createManifest({ extensionKind: ['web'] }); + const processor = new WebExtensionProcessor(manifest, { web: true }); + const changelogFile = { path: 'extension/changelog.md', contents: '' }; + + processor.onFile(changelogFile); + + assert.deepEqual(processor.assets, []); + }); + + it('should exclude readme', () => { + const manifest = createManifest({ extensionKind: ['web'] }); + const processor = new WebExtensionProcessor(manifest, { web: true }); + const readMeFile = { path: 'extension/readme.md', contents: '' }; + + processor.onFile(readMeFile); + + assert.deepEqual(processor.assets, []); + }); + + it('should exclude files from node_modules', () => { + const manifest = createManifest({ extensionKind: ['web'] }); + const processor = new WebExtensionProcessor(manifest, { web: true }); + + processor.onFile({ path: 'extension/node_modules/sample.t.ds', contents: '' }); + processor.onFile({ path: 'extension/node_modules/a/sample.js', contents: '' }); + processor.onFile({ path: 'extension/node_modules/a/b/c/sample.js', contents: '' }); + + assert.deepEqual(processor.assets, []); + }); + +}); \ No newline at end of file From dc49ab513c3357ac1d7dd2af713056c383318ba6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Aug 2020 13:03:29 +0200 Subject: [PATCH 042/131] - add extension kind property - add web extension property - include all files as web resources - cap web resources to 25 - add tests --- resources/extension.vsixmanifest | 2 + src/package.ts | 34 +-- src/test/package.test.ts | 384 +++++++++++++++++++++++-------- 3 files changed, 309 insertions(+), 111 deletions(-) diff --git a/resources/extension.vsixmanifest b/resources/extension.vsixmanifest index 0fd2ee2d..a110f72d 100644 --- a/resources/extension.vsixmanifest +++ b/resources/extension.vsixmanifest @@ -12,6 +12,7 @@ + <% if (links.repository) { %> @@ -29,6 +30,7 @@ <% if (typeof enableMarketplaceQnA === 'boolean') { %><% } %> <% if (customerQnALink) { %><% } %> + <% if (typeof webExtension === 'boolean') { %><% } %> <% if (license) { %><%- license %><% } %> <% if (icon) { %><%- icon %><% } %> diff --git a/src/package.ts b/src/package.ts index 654319de..9c8b75ee 100644 --- a/src/package.ts +++ b/src/package.ts @@ -211,6 +211,8 @@ class ManifestProcessor extends BaseProcessor { enableMarketplaceQnA = false; } + const extensionKind = getExtensionKind(manifest); + this.vsix = { ...this.vsix, id: manifest.name, @@ -233,6 +235,7 @@ class ManifestProcessor extends BaseProcessor { customerQnALink, extensionDependencies: _(manifest.extensionDependencies || []).uniq().join(','), extensionPack: _(manifest.extensionPack || []).uniq().join(','), + extensionKind: extensionKind.join(','), localizedLanguages: (manifest.contributes && manifest.contributes.localizations) ? manifest.contributes.localizations.map(loc => loc.localizedLanguageName || loc.languageName || loc.languageId).join(',') : '' }; @@ -665,33 +668,35 @@ function getExtensionKind(manifest: Manifest): ExtensionKind[] { export class WebExtensionProcessor extends BaseProcessor { private readonly isWebKind: boolean = false; - private readonly licenseProcessor: LicenseProcessor; constructor(manifest: Manifest, options: IPackageOptions) { super(manifest); this.isWebKind = options.web && isWebKind(manifest); - this.licenseProcessor = new LicenseProcessor(manifest); + if (this.isWebKind) { + this.vsix = { + ...this.vsix, + webExtension: true + } + } } onFile(file: IFile): Promise { if (this.isWebKind) { const path = util.normalize(file.path); if (/\.svg$/i.test(path)) { - throw new Error(`SVGs can't be used in web extensions: ${path}`); - } - if ( - !/^extension\/readme.md$/i.test(path) // exclude read me - && !/^extension\/changelog.md$/i.test(path) // exclude changelog - && !/^extension\/package.json$/i.test(path) // exclude package.json - && !this.licenseProcessor.filter(path) // exclude licenses - && !/^extension\/*node_modules\/*/i.test(path) // exclude node_modules - ) { - this.assets.push({ type: `Microsoft.VisualStudio.Code.WebResources/${path}`, path }); + throw new Error(`SVGs can't be used in a web extension: ${path}`); } + this.assets.push({ type: `Microsoft.VisualStudio.Code.WebResources/${path}`, path }); } return Promise.resolve(file); } + async onEnd(): Promise { + if (this.assets.length > 25) { + throw new Error('Cannot pack more than 25 files in a web extension. Use `vsce -ls` to see all the files that will be packed and exclude those which are not needed in .vscodeignore.'); + } + } + } export class NLSProcessor extends BaseProcessor { @@ -955,11 +960,6 @@ export function processFiles(processors: IProcessor[], files: IFile[]): Promise< return Promise.all(processedFiles).then(files => { return util.sequence(processors.map(p => () => p.onEnd())).then(() => { const assets = _.flatten(processors.map(p => p.assets)); - - if (assets.length >= 50) { - throw new Error('Cannot have more than 50 assets'); - } - const vsix = processors.reduce((r, p) => ({ ...r, ...p.vsix }), { assets }); return Promise.all([toVsixManifest(vsix), toContentTypes(files)]).then(result => { diff --git a/src/test/package.test.ts b/src/test/package.test.ts index de6ce34a..bd411c71 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1,7 +1,7 @@ import { readManifest, collect, toContentTypes, ReadmeProcessor, read, processFiles, createDefaultProcessors, - toVsixManifest, IFile, validateManifest, isSupportedWebExtension, WebExtensionProcessor, IAsset + toVsixManifest, IFile, validateManifest, isSupportedWebExtension, WebExtensionProcessor, IAsset, IPackageOptions } from '../package'; import { Manifest } from '../manifest'; import * as path from 'path'; @@ -66,8 +66,8 @@ type ContentTypes = { const parseXmlManifest = createXMLParser(); const parseContentTypes = createXMLParser(); -function _toVsixManifest(manifest: Manifest, files: IFile[]): Promise { - const processors = createDefaultProcessors(manifest); +function _toVsixManifest(manifest: Manifest, files: IFile[], options: IPackageOptions = {}): Promise { + const processors = createDefaultProcessors(manifest, options); return processFiles(processors, files).then(() => { const assets = _.flatten(processors.map(p => p.assets)); const vsix = processors.reduce((r, p) => ({ ...r, ...p.vsix }), { assets }); @@ -1267,84 +1267,191 @@ describe('toVsixManifest', () => { throw new Error('Should not reach here'); }); - describe('qna', () => { - it('should use marketplace qna by default', async () => { - const xmlManifest = await toXMLManifest({ - name: 'test', - publisher: 'mocha', - version: '0.0.1', - engines: Object.create(null) - }); + it('should expose web extension assets and properties', async () => { + const manifest = createManifest({ + browser: 'browser.js', + extensionKind: ['web'], + }); + const files = [ + { path: 'extension/browser.js', contents: Buffer.from('') }, + ]; + + const vsixManifest = await _toVsixManifest(manifest, files, { web: true }) + const result = await parseXmlManifest(vsixManifest); + const assets = result.PackageManifest.Assets[0].Asset; + assert(assets.some(asset => asset.$.Type === 'Microsoft.VisualStudio.Code.WebResources/extension/browser.js' && asset.$.Path === 'extension/browser.js')); - assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA'); - assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink'); + const properties = result.PackageManifest.Metadata[0].Properties[0].Property; + const webExtensionProps = properties.filter(p => p.$.Id === 'Microsoft.VisualStudio.Code.WebExtension'); + assert.equal(webExtensionProps.length, 1); + assert.equal(webExtensionProps[0].$.Value, 'true'); + }); + + it('should expose web extension assets and properties when extension kind is not provided', async () => { + const manifest = createManifest({ + browser: 'browser.js', }); + const files = [ + { path: 'extension/browser.js', contents: Buffer.from('') }, + ]; - it('should not use marketplace in a github repo, without specifying it', async () => { - const xmlManifest = await toXMLManifest({ - name: 'test', - publisher: 'mocha', - version: '0.0.1', - engines: Object.create(null), - repository: 'https://github.com/username/repository' - }); + const vsixManifest = await _toVsixManifest(manifest, files, { web: true }) + const result = await parseXmlManifest(vsixManifest); + const assets = result.PackageManifest.Assets[0].Asset; + assert(assets.some(asset => asset.$.Type === 'Microsoft.VisualStudio.Code.WebResources/extension/browser.js' && asset.$.Path === 'extension/browser.js')); + + const properties = result.PackageManifest.Metadata[0].Properties[0].Property; + const webExtensionProps = properties.filter(p => p.$.Id === 'Microsoft.VisualStudio.Code.WebExtension'); + assert.equal(webExtensionProps.length, 1); + assert.equal(webExtensionProps[0].$.Value, 'true'); + }); - assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA'); - assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink'); + it('should not expose web extension assets and properties for web extension when not asked for', async () => { + const manifest = createManifest({ + browser: 'browser.js', + extensionKind: ['web'], }); + const files = [ + { path: 'extension/browser.js', contents: Buffer.from('') }, + ]; - it('should use marketplace in a github repo, when specifying it', async () => { - const xmlManifest = await toXMLManifest({ - name: 'test', - publisher: 'mocha', - version: '0.0.1', - engines: Object.create(null), - repository: 'https://github.com/username/repository', - qna: 'marketplace' - }); + const vsixManifest = await _toVsixManifest(manifest, files) + const result = await parseXmlManifest(vsixManifest); + const assets = result.PackageManifest.Assets[0].Asset; + assert(assets.every(asset => !asset.$.Type.startsWith('Microsoft.VisualStudio.Code.WebResources'))); + + const properties = result.PackageManifest.Metadata[0].Properties[0].Property; + const webExtensionProps = properties.filter(p => p.$.Id === 'Microsoft.VisualStudio.Code.WebExtension'); + assert.equal(webExtensionProps.length, 0); + }); - assertProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA', 'true'); - assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink'); + it('should not expose web extension assets and properties for non web extension', async () => { + const manifest = createManifest({ + main: 'main.js', }); + const files = [ + { path: 'extension/main.js', contents: Buffer.from('') }, + ]; - it('should handle qna=marketplace', async () => { - const xmlManifest = await toXMLManifest({ - name: 'test', - publisher: 'mocha', - version: '0.0.1', - engines: Object.create(null), - qna: 'marketplace' - }); + const vsixManifest = await _toVsixManifest(manifest, files, { web: true }) + const result = await parseXmlManifest(vsixManifest); + const assets = result.PackageManifest.Assets[0].Asset; + assert(assets.every(asset => !asset.$.Type.startsWith('Microsoft.VisualStudio.Code.WebResources'))); - assertProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA', 'true'); - assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink'); + const properties = result.PackageManifest.Metadata[0].Properties[0].Property; + const webExtensionProps = properties.filter(p => p.$.Id === 'Microsoft.VisualStudio.Code.WebExtension'); + assert.equal(webExtensionProps.length, 0); + }); + + it('should expose extension kind properties when providedd', async () => { + const manifest = createManifest({ + extensionKind: ['ui', 'workspace', 'web'], }); + const files = [ + { path: 'extension/main.js', contents: Buffer.from('') }, + ]; - it('should handle qna=false', async () => { - const xmlManifest = await toXMLManifest({ - name: 'test', - publisher: 'mocha', - version: '0.0.1', - engines: Object.create(null), - qna: false - }); + const vsixManifest = await _toVsixManifest(manifest, files, { web: true }) + const result = await parseXmlManifest(vsixManifest); + const properties = result.PackageManifest.Metadata[0].Properties[0].Property; + const extensionKindProps = properties.filter(p => p.$.Id === 'Microsoft.VisualStudio.Code.ExtensionKind'); + assert.equal(extensionKindProps[0].$.Value, ['ui', 'workspace', 'web'].join(',')); + }); - assertProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA', 'false'); - assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink'); + it('should expose extension kind properties when derived', async () => { + const manifest = createManifest({ + main: 'main.js', }); + const files = [ + { path: 'extension/main.js', contents: Buffer.from('') }, + ]; - it('should handle custom qna', async () => { - const xmlManifest = await toXMLManifest({ - name: 'test', - publisher: 'mocha', - version: '0.0.1', - engines: Object.create(null), - qna: 'http://myqna' - }); + const vsixManifest = await _toVsixManifest(manifest, files, { web: true }) + const result = await parseXmlManifest(vsixManifest); + const properties = result.PackageManifest.Metadata[0].Properties[0].Property; + const extensionKindProps = properties.filter(p => p.$.Id === 'Microsoft.VisualStudio.Code.ExtensionKind'); + assert.equal(extensionKindProps[0].$.Value, 'workspace'); + }); + +}); + +describe('qna', () => { + it('should use marketplace qna by default', async () => { + const xmlManifest = await toXMLManifest({ + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null) + }); + + assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA'); + assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink'); + }); + + it('should not use marketplace in a github repo, without specifying it', async () => { + const xmlManifest = await toXMLManifest({ + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository' + }); + + assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA'); + assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink'); + }); + + it('should use marketplace in a github repo, when specifying it', async () => { + const xmlManifest = await toXMLManifest({ + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + qna: 'marketplace' + }); + + assertProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA', 'true'); + assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink'); + }); + + it('should handle qna=marketplace', async () => { + const xmlManifest = await toXMLManifest({ + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + qna: 'marketplace' + }); + + assertProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA', 'true'); + assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink'); + }); + + it('should handle qna=false', async () => { + const xmlManifest = await toXMLManifest({ + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + qna: false + }); + + assertProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA', 'false'); + assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink'); + }); - assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA'); - assertProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink', 'http://myqna'); + it('should handle custom qna', async () => { + const xmlManifest = await toXMLManifest({ + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + qna: 'http://myqna' }); + + assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA'); + assertProperty(xmlManifest, 'Microsoft.VisualStudio.Services.CustomerQnALink', 'http://myqna'); }); }); @@ -1522,10 +1629,10 @@ describe('MarkdownProcessor', () => { .then((file) => read(file)) .then((actual) => { return readFile( - path.join(root, "readme.branch.override.images.expected.md"), - "utf8" + path.join(root, "readme.branch.override.images.expected.md"), + "utf8" ).then((expected) => { - assert.equal(actual, expected); + assert.equal(actual, expected); }); }); }); @@ -1554,15 +1661,15 @@ describe('MarkdownProcessor', () => { .onFile(readme) .then((file) => read(file)) .then((actual) => { - return readFile( - path.join(root, "readme.branch.override.content.expected.md"), - "utf8" - ).then((expected) => { - assert.equal(actual, expected); + return readFile( + path.join(root, "readme.branch.override.content.expected.md"), + "utf8" + ).then((expected) => { + assert.equal(actual, expected); + }); }); - }); }); - + it('should infer baseContentUrl if its a github repo (.git)', () => { const manifest = { name: 'test', @@ -1586,8 +1693,8 @@ describe('MarkdownProcessor', () => { return readFile(path.join(root, 'readme.expected.md'), 'utf8') .then(expected => { assert.equal(actual, expected); - }); - }); + }); + }); }); it('should replace img urls with baseImagesUrl', () => { @@ -1829,56 +1936,145 @@ describe('isSupportedWebExtension', () => { describe('WebExtensionProcessor', () => { - it('should include browser file', () => { + it('should include file', async () => { const manifest = createManifest({ extensionKind: ['web'] }); const processor = new WebExtensionProcessor(manifest, { web: true }); const file = { path: 'extension/browser.js', contents: '' }; - processor.onFile(file); + await processor.onFile(file); + await processor.onEnd(); + + const expected: IAsset[] = [{ type: `Microsoft.VisualStudio.Code.WebResources/${file.path}`, path: file.path }]; + assert.deepEqual(processor.assets, expected); + }); + + it('should include file when extension kind is not specified', async () => { + const manifest = createManifest({ browser: 'browser.js' }); + const processor = new WebExtensionProcessor(manifest, { web: true }); + const file = { path: 'extension/browser.js', contents: '' }; + + await processor.onFile(file); + await processor.onEnd(); const expected: IAsset[] = [{ type: `Microsoft.VisualStudio.Code.WebResources/${file.path}`, path: file.path }]; assert.deepEqual(processor.assets, expected); }); - it('should exclude manifest', () => { + it('should not include file when not asked for', async () => { const manifest = createManifest({ extensionKind: ['web'] }); + const processor = new WebExtensionProcessor(manifest, { web: false }); + const file = { path: 'extension/browser.js', contents: '' }; + + await processor.onFile(file); + await processor.onEnd(); + + assert.deepEqual(processor.assets, []); + }); + + it('should not include file for non web extension', async () => { + const manifest = createManifest({ extensionKind: ['ui'] }); const processor = new WebExtensionProcessor(manifest, { web: true }); - const manifestFile = { path: 'extension/package.json', contents: JSON.stringify(manifest) }; + const file = { path: 'extension/browser.js', contents: '' }; - processor.onFile(manifestFile); + await processor.onFile(file); + await processor.onEnd(); assert.deepEqual(processor.assets, []); }); - it('should exclude changelog', () => { + it('should include manifest', async () => { const manifest = createManifest({ extensionKind: ['web'] }); const processor = new WebExtensionProcessor(manifest, { web: true }); - const changelogFile = { path: 'extension/changelog.md', contents: '' }; + const manifestFile = { path: 'extension/package.json', contents: JSON.stringify(manifest) }; - processor.onFile(changelogFile); + await processor.onFile(manifestFile); + await processor.onEnd(); - assert.deepEqual(processor.assets, []); + const expected: IAsset[] = [{ type: `Microsoft.VisualStudio.Code.WebResources/${manifestFile.path}`, path: manifestFile.path }]; + assert.deepEqual(processor.assets, expected); + }); + + it('should fail for svg file', async () => { + const manifest = createManifest({ extensionKind: ['web'] }); + const processor = new WebExtensionProcessor(manifest, { web: true }); + + try { + await processor.onFile({ path: 'extension/sample.svg', contents: '' }); + } catch (error) { + return; // expected + } + + assert.fail('Should fail'); }); - it('should exclude readme', () => { + it('should include max 25 files', async () => { const manifest = createManifest({ extensionKind: ['web'] }); const processor = new WebExtensionProcessor(manifest, { web: true }); - const readMeFile = { path: 'extension/readme.md', contents: '' }; - processor.onFile(readMeFile); + const expected: IAsset[] = []; + for (let i = 1; i <= 25; i++) { + const file = { path: `extension/${i}.json`, contents: `${i}` }; + await processor.onFile(file); + expected.push({ type: `Microsoft.VisualStudio.Code.WebResources/${file.path}`, path: file.path }); + } + + await processor.onEnd(); - assert.deepEqual(processor.assets, []); + assert.deepEqual(processor.assets.length, 25); + assert.deepEqual(processor.assets, expected); }); - it('should exclude files from node_modules', () => { + it('should throw an error if there are more than 25 files', async () => { const manifest = createManifest({ extensionKind: ['web'] }); const processor = new WebExtensionProcessor(manifest, { web: true }); - processor.onFile({ path: 'extension/node_modules/sample.t.ds', contents: '' }); - processor.onFile({ path: 'extension/node_modules/a/sample.js', contents: '' }); - processor.onFile({ path: 'extension/node_modules/a/b/c/sample.js', contents: '' }); + for (let i = 1; i <= 26; i++) { + await processor.onFile({ path: `extension/${i}.json`, contents: `${i}` }); + } - assert.deepEqual(processor.assets, []); + try { + await processor.onEnd(); + } catch (error) { + return; // expected error + } + assert.fail('Should fail'); + }); + + it('should include web extension property', async () => { + const manifest = createManifest({ extensionKind: ['web'] }); + const processor = new WebExtensionProcessor(manifest, { web: true }); + + await processor.onEnd(); + + assert.equal(processor.vsix.webExtension, true); + }); + + it('should include web extension property when extension kind is not provided', async () => { + const manifest = createManifest({ browser: 'browser.js' }); + const processor = new WebExtensionProcessor(manifest, { web: true }); + + await processor.onEnd(); + + assert.equal(processor.vsix.webExtension, true); + }); + + it('should not include web extension property when not asked for', async () => { + const manifest = createManifest({ extensionKind: ['web'] }); + const processor = new WebExtensionProcessor(manifest, { web: false }); + + await processor.onEnd(); + + assert.equal(processor.vsix.webExtension, undefined); }); + it('should not include web extension property for non web extension', async () => { + const manifest = createManifest({ extensionKind: ['ui'] }); + const processor = new WebExtensionProcessor(manifest, { web: true }); + + await processor.onEnd(); + + assert.equal(processor.vsix.webExtension, undefined); + }); + + }); \ No newline at end of file From bb205c01d0b568972123e628bb16fbf4ad3f9e2d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Aug 2020 13:13:10 +0200 Subject: [PATCH 043/131] fix ls command in error --- src/package.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.ts b/src/package.ts index 9c8b75ee..c9d03f96 100644 --- a/src/package.ts +++ b/src/package.ts @@ -693,7 +693,7 @@ export class WebExtensionProcessor extends BaseProcessor { async onEnd(): Promise { if (this.assets.length > 25) { - throw new Error('Cannot pack more than 25 files in a web extension. Use `vsce -ls` to see all the files that will be packed and exclude those which are not needed in .vscodeignore.'); + throw new Error('Cannot pack more than 25 files in a web extension. Use `vsce ls` to see all the files that will be packed and exclude those which are not needed in .vscodeignore.'); } } From 4a019da349ebec84dcae9abe133628e2086ffa8e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Aug 2020 13:19:19 +0200 Subject: [PATCH 044/131] fix error message --- src/package.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.ts b/src/package.ts index c9d03f96..dac73aa3 100644 --- a/src/package.ts +++ b/src/package.ts @@ -1063,7 +1063,7 @@ export async function pack(options: IPackageOptions = {}): Promise Date: Mon, 24 Aug 2020 16:05:02 +0200 Subject: [PATCH 045/131] check for valid web extensions only while publishing --- src/main.ts | 4 ++-- src/package.ts | 7 ------- src/publish.ts | 13 ++++++++++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main.ts b/src/main.ts index c611a68d..4f6233ce 100644 --- a/src/main.ts +++ b/src/main.ts @@ -76,7 +76,7 @@ module.exports = function (argv: string[]): void { .option('--yarn', 'Use yarn instead of npm') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') .option('--noGitHubIssueLinking', 'Prevent automatic expansion of GitHub-style issue syntax into links') - .option('--web', 'Enable packing as web extension. Note: This is a preview feature and is supported only for selected extensions.') + .option('--web', 'Experimental flag to enable packing web extension') .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking, web }) => main(packageCommand({ packagePath: out, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking, web }))); program @@ -91,7 +91,7 @@ module.exports = function (argv: string[]): void { .option('--yarn', 'Use yarn instead of npm while packing extension files') .option('--noVerify') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') - .option('--web', 'Enable packing as web extension. Note: This is a preview feature and is supported only for selected extensions.') + .option('--web', 'Experimental flag to enable publishing web extension. Note: This is supported only for selected extensions.') .action((version, { pat, message, packagePath, githubBranch, baseContentUrl, baseImagesUrl, yarn, noVerify, ignoreFile, web }) => main(publish({ pat, commitMessage: message, version, packagePath, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, noVerify, ignoreFile, web }))); program diff --git a/src/package.ts b/src/package.ts index dac73aa3..42d701fa 100644 --- a/src/package.ts +++ b/src/package.ts @@ -1060,13 +1060,6 @@ export async function pack(options: IPackageOptions = {}): Promise { .then(packagePath => pack({ packagePath, cwd, githubBranch, baseContentUrl, baseImagesUrl, useYarn, ignoreFile, web })); } - return promise.then(({ manifest, packagePath }) => { + return promise.then(async ({ manifest, packagePath }) => { if (!options.noVerify && manifest.enableProposedApi) { throw new Error('Extensions using proposed API (enableProposedApi: true) can\'t be published to the Marketplace'); } + if (options.web && isWebKind(manifest)) { + const extensionsReport = await getPublicGalleryAPI().getExtensionsReport(); + if (!isSupportedWebExtension(manifest, extensionsReport)) { + throw new Error(`Unsupported web extensions can\'t be published to the Marketplace`); + } + } + const patPromise = options.pat ? Promise.resolve(options.pat) : getPublisher(manifest.publisher).then(p => p.pat); From 665047b6d219ed7e5dabf924bd16ff2830da75b8 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Aug 2020 16:06:48 +0200 Subject: [PATCH 046/131] 1.79.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 736e09e9..4995bd9a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.78.0", + "version": "1.79.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From fb9170a7078a3b2be86c9e246a63e0591492978b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Aug 2020 16:35:44 +0200 Subject: [PATCH 047/131] check for supported web extensions also while packing --- src/main.ts | 4 ++-- src/package.ts | 8 ++++++++ src/publish.ts | 11 ++--------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main.ts b/src/main.ts index 4f6233ce..2a7cec9d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -76,7 +76,7 @@ module.exports = function (argv: string[]): void { .option('--yarn', 'Use yarn instead of npm') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') .option('--noGitHubIssueLinking', 'Prevent automatic expansion of GitHub-style issue syntax into links') - .option('--web', 'Experimental flag to enable packing web extension') + .option('--web', 'Experimental flag to enable packing web extensions. Note: This is supported only for selected extensions.') .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking, web }) => main(packageCommand({ packagePath: out, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking, web }))); program @@ -91,7 +91,7 @@ module.exports = function (argv: string[]): void { .option('--yarn', 'Use yarn instead of npm while packing extension files') .option('--noVerify') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') - .option('--web', 'Experimental flag to enable publishing web extension. Note: This is supported only for selected extensions.') + .option('--web', 'Experimental flag to enable packing web extensions. Note: This is supported only for selected extensions.') .action((version, { pat, message, packagePath, githubBranch, baseContentUrl, baseImagesUrl, yarn, noVerify, ignoreFile, web }) => main(publish({ pat, commitMessage: message, version, packagePath, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, noVerify, ignoreFile, web }))); program diff --git a/src/package.ts b/src/package.ts index 42d701fa..697a6ed7 100644 --- a/src/package.ts +++ b/src/package.ts @@ -17,6 +17,7 @@ import * as urljoin from 'url-join'; import { validatePublisher, validateExtensionName, validateVersion, validateEngineCompatibility, validateVSCodeTypesCompatibility } from './validation'; import { getDependencies } from './npm'; import { IExtensionsReport } from './publicgalleryapi'; +import { getPublicGalleryAPI } from './util'; const readFile = denodeify(fs.readFile); const unlink = denodeify(fs.unlink as any); @@ -1060,6 +1061,13 @@ export async function pack(options: IPackageOptions = {}): Promise { throw new Error('Extensions using proposed API (enableProposedApi: true) can\'t be published to the Marketplace'); } - if (options.web && isWebKind(manifest)) { - const extensionsReport = await getPublicGalleryAPI().getExtensionsReport(); - if (!isSupportedWebExtension(manifest, extensionsReport)) { - throw new Error(`Unsupported web extensions can\'t be published to the Marketplace`); - } - } - const patPromise = options.pat ? Promise.resolve(options.pat) : getPublisher(manifest.publisher).then(p => p.pat); From 74172a1b80ab7f4a2bbee03fa6c1e1a1d72bde7a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Aug 2020 16:35:54 +0200 Subject: [PATCH 048/131] 1.79.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4995bd9a..7e4dd60c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.79.0", + "version": "1.79.1", "description": "VSCode Extension Manager", "repository": { "type": "git", From 4b42b6ce38c968465a821eaed529e7ac711fbff1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Aug 2020 20:46:10 +0200 Subject: [PATCH 049/131] enable web flag only on publish --- src/main.ts | 5 ++--- src/package.ts | 8 -------- src/publish.ts | 11 +++++++++-- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main.ts b/src/main.ts index 2a7cec9d..fef158ef 100644 --- a/src/main.ts +++ b/src/main.ts @@ -76,8 +76,7 @@ module.exports = function (argv: string[]): void { .option('--yarn', 'Use yarn instead of npm') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') .option('--noGitHubIssueLinking', 'Prevent automatic expansion of GitHub-style issue syntax into links') - .option('--web', 'Experimental flag to enable packing web extensions. Note: This is supported only for selected extensions.') - .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking, web }) => main(packageCommand({ packagePath: out, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking, web }))); + .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking }) => main(packageCommand({ packagePath: out, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking }))); program .command('publish []') @@ -91,7 +90,7 @@ module.exports = function (argv: string[]): void { .option('--yarn', 'Use yarn instead of npm while packing extension files') .option('--noVerify') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') - .option('--web', 'Experimental flag to enable packing web extensions. Note: This is supported only for selected extensions.') + .option('--web', 'Experimental flag to enable publishing web extensions. Note: This is supported only for selected extensions.') .action((version, { pat, message, packagePath, githubBranch, baseContentUrl, baseImagesUrl, yarn, noVerify, ignoreFile, web }) => main(publish({ pat, commitMessage: message, version, packagePath, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, noVerify, ignoreFile, web }))); program diff --git a/src/package.ts b/src/package.ts index 697a6ed7..42d701fa 100644 --- a/src/package.ts +++ b/src/package.ts @@ -17,7 +17,6 @@ import * as urljoin from 'url-join'; import { validatePublisher, validateExtensionName, validateVersion, validateEngineCompatibility, validateVSCodeTypesCompatibility } from './validation'; import { getDependencies } from './npm'; import { IExtensionsReport } from './publicgalleryapi'; -import { getPublicGalleryAPI } from './util'; const readFile = denodeify(fs.readFile); const unlink = denodeify(fs.unlink as any); @@ -1061,13 +1060,6 @@ export async function pack(options: IPackageOptions = {}): Promise { throw new Error('Extensions using proposed API (enableProposedApi: true) can\'t be published to the Marketplace'); } + if (options.web && isWebKind(manifest)) { + const extensionsReport = await getPublicGalleryAPI().getExtensionsReport(); + if (!isSupportedWebExtension(manifest, extensionsReport)) { + throw new Error(`This extension can\'t be packed as web extension because it is not supported`); + } + } + const patPromise = options.pat ? Promise.resolve(options.pat) : getPublisher(manifest.publisher).then(p => p.pat); From d15456e941f40a06f0f19fe5d1aa3c23c7c32b66 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 24 Aug 2020 20:46:52 +0200 Subject: [PATCH 050/131] 1.79.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7e4dd60c..e9b22793 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.79.1", + "version": "1.79.2", "description": "VSCode Extension Manager", "repository": { "type": "git", From d3c2ffc5f45809431032ac734924b3361bce32ea Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 25 Aug 2020 11:24:54 +0200 Subject: [PATCH 051/131] do not allow web publishing when package path is provided --- src/publish.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/publish.ts b/src/publish.ts index 92ee818f..d08026cc 100644 --- a/src/publish.ts +++ b/src/publish.ts @@ -153,6 +153,9 @@ export function publish(options: IPublishOptions = {}): Promise { if (options.version) { return Promise.reject(`Not supported: packagePath and version.`); } + if (options.web) { + return Promise.reject(`Not supported: packagePath and web.`); + } promise = readManifestFromPackage(options.packagePath) .then(manifest => ({ manifest, packagePath: options.packagePath })); From 789e14b31a0ff59ea2e178998c29c17ca82bfa2d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 25 Aug 2020 11:41:50 +0200 Subject: [PATCH 052/131] 1.79.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e9b22793..00d2a594 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.79.2", + "version": "1.79.3", "description": "VSCode Extension Manager", "repository": { "type": "git", From 2cd3c14d9da86594fd14e7dd441ef70ef52de8e5 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 28 Aug 2020 17:56:35 +0200 Subject: [PATCH 053/131] add __web_extension tag for web extensions --- src/package.ts | 25 ++++++++++++++++--------- src/test/package.test.ts | 15 ++++++++++----- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/package.ts b/src/package.ts index 42d701fa..15b89def 100644 --- a/src/package.ts +++ b/src/package.ts @@ -74,12 +74,14 @@ export interface IProcessor { onFile(file: IFile): Promise; onEnd(): Promise; assets: IAsset[]; + tags: string[]; vsix: any; } export class BaseProcessor implements IProcessor { constructor(protected manifest: Manifest) { } assets: IAsset[] = []; + tags: string[] = []; vsix: any = Object.create(null); onFile(file: IFile): Promise { return Promise.resolve(file); } onEnd() { return Promise.resolve(null); } @@ -351,10 +353,10 @@ export class TagsProcessor extends BaseProcessor { ...descriptionKeywords ]; - this.vsix.tags = _(tags) + this.tags = _(tags) .uniq() // deduplicate .compact() // remove falsey values - .join(','); + .value(); return Promise.resolve(null); } @@ -672,12 +674,6 @@ export class WebExtensionProcessor extends BaseProcessor { constructor(manifest: Manifest, options: IPackageOptions) { super(manifest); this.isWebKind = options.web && isWebKind(manifest); - if (this.isWebKind) { - this.vsix = { - ...this.vsix, - webExtension: true - } - } } onFile(file: IFile): Promise { @@ -695,6 +691,13 @@ export class WebExtensionProcessor extends BaseProcessor { if (this.assets.length > 25) { throw new Error('Cannot pack more than 25 files in a web extension. Use `vsce ls` to see all the files that will be packed and exclude those which are not needed in .vscodeignore.'); } + if (this.isWebKind) { + this.vsix = { + ...this.vsix, + webExtension: true + } + this.tags = ['__web_extension']; + } } } @@ -960,7 +963,11 @@ export function processFiles(processors: IProcessor[], files: IFile[]): Promise< return Promise.all(processedFiles).then(files => { return util.sequence(processors.map(p => () => p.onEnd())).then(() => { const assets = _.flatten(processors.map(p => p.assets)); - const vsix = processors.reduce((r, p) => ({ ...r, ...p.vsix }), { assets }); + const tags = _(_.flatten(processors.map(p => p.tags))) + .uniq() // deduplicate + .compact() // remove falsey values + .join(','); + const vsix = processors.reduce((r, p) => ({ ...r, ...p.vsix }), { assets, tags }); return Promise.all([toVsixManifest(vsix), toContentTypes(files)]).then(result => { return [ diff --git a/src/test/package.test.ts b/src/test/package.test.ts index bd411c71..f380806d 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -70,7 +70,8 @@ function _toVsixManifest(manifest: Manifest, files: IFile[], options: IPackageOp const processors = createDefaultProcessors(manifest, options); return processFiles(processors, files).then(() => { const assets = _.flatten(processors.map(p => p.assets)); - const vsix = processors.reduce((r, p) => ({ ...r, ...p.vsix }), { assets }); + const tags = _(_.flatten(processors.map(p => p.tags))).join(','); + const vsix = processors.reduce((r, p) => ({ ...r, ...p.vsix }), { assets, tags }); return toVsixManifest(vsix); }); @@ -2040,40 +2041,44 @@ describe('WebExtensionProcessor', () => { assert.fail('Should fail'); }); - it('should include web extension property', async () => { + it('should include web extension property & tag', async () => { const manifest = createManifest({ extensionKind: ['web'] }); const processor = new WebExtensionProcessor(manifest, { web: true }); await processor.onEnd(); assert.equal(processor.vsix.webExtension, true); + assert.deepEqual(processor.tags, ['__web_extension']); }); - it('should include web extension property when extension kind is not provided', async () => { + it('should include web extension property & tag when extension kind is not provided', async () => { const manifest = createManifest({ browser: 'browser.js' }); const processor = new WebExtensionProcessor(manifest, { web: true }); await processor.onEnd(); assert.equal(processor.vsix.webExtension, true); + assert.deepEqual(processor.tags, ['__web_extension']); }); - it('should not include web extension property when not asked for', async () => { + it('should not include web extension property & tag when not asked for', async () => { const manifest = createManifest({ extensionKind: ['web'] }); const processor = new WebExtensionProcessor(manifest, { web: false }); await processor.onEnd(); assert.equal(processor.vsix.webExtension, undefined); + assert.deepEqual(processor.tags, []); }); - it('should not include web extension property for non web extension', async () => { + it('should not include web extension property & tag for non web extension', async () => { const manifest = createManifest({ extensionKind: ['ui'] }); const processor = new WebExtensionProcessor(manifest, { web: true }); await processor.onEnd(); assert.equal(processor.vsix.webExtension, undefined); + assert.deepEqual(processor.tags, []); }); From 6b9d1f3f116ff2522fcfd68fdf7c6541d8945d6b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 28 Aug 2020 17:56:50 +0200 Subject: [PATCH 054/131] 1.79.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 00d2a594..7044ffd0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.79.3", + "version": "1.79.4", "description": "VSCode Extension Manager", "repository": { "type": "git", From d971fb692b2a733ae0e52638953dd003c434680e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 30 Aug 2020 18:57:43 +0200 Subject: [PATCH 055/131] throw error if extension is not a web extension --- src/publish.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/publish.ts b/src/publish.ts index d08026cc..11ffc03a 100644 --- a/src/publish.ts +++ b/src/publish.ts @@ -178,10 +178,13 @@ export function publish(options: IPublishOptions = {}): Promise { throw new Error('Extensions using proposed API (enableProposedApi: true) can\'t be published to the Marketplace'); } - if (options.web && isWebKind(manifest)) { + if (options.web) { + if (!isWebKind(manifest)) { + throw new Error('Extensions which are not web kind can\'t be published to the Marketpalce as a web extension'); + } const extensionsReport = await getPublicGalleryAPI().getExtensionsReport(); if (!isSupportedWebExtension(manifest, extensionsReport)) { - throw new Error(`This extension can\'t be packed as web extension because it is not supported`); + throw new Error('Extensions which are not supported can\'t be published to the Marketpalce as a web extension'); } } From 5ade7bfa4272b4ad171ffa2ac0993a43076865cc Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 31 Aug 2020 13:01:47 +0200 Subject: [PATCH 056/131] 1.79.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7044ffd0..1a5edc8b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.79.4", + "version": "1.79.5", "description": "VSCode Extension Manager", "repository": { "type": "git", From e82e2ca7dbce6a0a836c9135c0418e4466edd019 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2020 10:43:06 +0000 Subject: [PATCH 057/131] Bump yargs-parser from 13.1.1 to 13.1.2 Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 13.1.1 to 13.1.2. - [Release notes](https://github.com/yargs/yargs-parser/releases) - [Changelog](https://github.com/yargs/yargs-parser/blob/master/docs/CHANGELOG-full.md) - [Commits](https://github.com/yargs/yargs-parser/commits) Signed-off-by: dependabot[bot] --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 071bc120..258ece48 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1239,7 +1239,7 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yargs-parser@13.1.2, yargs-parser@^13.1.2: +yargs-parser@13.1.2, yargs-parser@^13.1.1: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -1247,10 +1247,10 @@ yargs-parser@13.1.2, yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" From 44ddc5287f655b3a0f35af8ee32de214e4ae380d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 18 Sep 2020 10:31:14 +0200 Subject: [PATCH 058/131] add prettier --- .prettierignore | 3 + .vscode/extensions.json | 6 +- .vscode/launch.json | 2 +- .vscode/settings.json | 2 +- .vscode/tasks.json | 8 +- README.md | 2 +- azure-pipelines.yml | 38 +- package.json | 175 +++---- src/api.ts | 14 +- src/main.ts | 106 ++-- src/manifest.ts | 18 +- src/nls.ts | 2 +- src/npm.ts | 42 +- src/package.ts | 384 ++++++++------ src/publicgalleryapi.ts | 33 +- src/publish.ts | 40 +- src/search.ts | 35 +- src/show.ts | 90 ++-- src/store.ts | 59 +-- src/test/package.test.ts | 971 ++++++++++++++++++++++-------------- src/test/validation.test.ts | 11 +- src/util.ts | 11 +- src/validation.ts | 16 +- src/viewutils.ts | 42 +- tsconfig.json | 6 +- yarn.lock | 15 +- 26 files changed, 1277 insertions(+), 854 deletions(-) create mode 100644 .prettierignore diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..33a58293 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +out +resources +fixtures \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index cb006521..78bd74f6 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,9 +2,7 @@ // See http://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp // List of extensions which should be recommended for users of this workspace. - "recommendations": [ - "hbenl.vscode-mocha-test-adapter", - ], + "recommendations": ["hbenl.vscode-mocha-test-adapter"], // List of extensions recommended by VS Code that should not be recommended for users of this workspace. "unwantedRecommendations": [] -} \ No newline at end of file +} diff --git a/.vscode/launch.json b/.vscode/launch.json index 754af5a1..15bf3d12 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,4 +18,4 @@ "outputCapture": "std" } ] -} \ No newline at end of file +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 540c24fa..be273011 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,4 +7,4 @@ }, "typescript.tsdk": "./node_modules/typescript/lib", "mochaExplorer.files": "out/**/test/*.test.js" -} \ No newline at end of file +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f49ea199..6f6d84e2 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,14 +1,12 @@ { - // See https://go.microsoft.com/fwlink/?LinkId=733558 + // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "type": "npm", "script": "watch", - "problemMatcher": [ - "$tsc-watch" - ], + "problemMatcher": ["$tsc-watch"], "group": { "kind": "build", "isDefault": true @@ -20,4 +18,4 @@ "script": "test" } ] -} \ No newline at end of file +} diff --git a/README.md b/README.md index bafcade7..5e2f828a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # vsce -> *The Visual Studio Code Extension Manager* +> _The Visual Studio Code Extension Manager_ [![Build Status](https://dev.azure.com/vscode/VSCE/_apis/build/status/VSCE?branchName=master)](https://dev.azure.com/vscode/VSCE/_build/latest?definitionId=16&branchName=master) [![npm version](https://badge.fury.io/js/vsce.svg)](https://badge.fury.io/js/vsce) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ad3251e4..c96b30c8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -5,27 +5,27 @@ trigger: include: ['*'] steps: -- task: NodeTool@0 - inputs: - versionSpec: "8.x" + - task: NodeTool@0 + inputs: + versionSpec: '8.x' -- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.x" + - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: '1.x' -- script: yarn - displayName: Install Dependencies + - script: yarn + displayName: Install Dependencies -- script: yarn compile - displayName: Compile + - script: yarn compile + displayName: Compile -- script: yarn test - displayName: Run Tests + - script: yarn test + displayName: Run Tests -- task: Npm@1 - displayName: 'Publish to NPM' - inputs: - command: publish - verbose: false - publishEndpoint: 'NPM' - condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) \ No newline at end of file + - task: Npm@1 + displayName: 'Publish to NPM' + inputs: + command: publish + verbose: false + publishEndpoint: 'NPM' + condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) diff --git a/package.json b/package.json index 1a5edc8b..a0e16e6f 100644 --- a/package.json +++ b/package.json @@ -1,86 +1,93 @@ { - "name": "vsce", - "version": "1.79.5", - "description": "VSCode Extension Manager", - "repository": { - "type": "git", - "url": "https://github.com/Microsoft/vsce" - }, - "homepage": "https://code.visualstudio.com", - "bugs": "https://github.com/Microsoft/vsce/issues", - "keywords": [ - "vscode", - "vsce", - "extension" - ], - "contributors": [ - "Microsoft Corporation" - ], - "author": "Microsoft Corporation", - "license": "MIT", - "main": "out/api.js", - "typings": "out/api.d.ts", - "bin": { - "vsce": "out/vsce" - }, - "scripts": { - "copy-vsce": "mkdir -p out && cp src/vsce out/vsce", - "compile": "tsc && yarn copy-vsce", - "watch": "yarn copy-vsce && tsc --watch", - "watch-test": "yarn copy-vsce && concurrently \"tsc --watch\" \"mocha --watch\"", - "test": "mocha", - "prepublishOnly": "tsc && yarn copy-vsce && mocha", - "vsce": "out/vsce" - }, - "engines": { - "node": ">= 8" - }, - "dependencies": { - "azure-devops-node-api": "^7.2.0", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.1", - "commander": "^2.8.1", - "denodeify": "^1.2.1", - "glob": "^7.0.6", - "leven": "^3.1.0", - "lodash": "^4.17.15", - "markdown-it": "^10.0.0", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "osenv": "^0.1.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "0.0.29", - "typed-rest-client": "1.2.0", - "url-join": "^1.1.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "devDependencies": { - "@types/cheerio": "^0.22.1", - "@types/denodeify": "^1.2.31", - "@types/glob": "^7.1.1", - "@types/lodash": "^4.14.123", - "@types/markdown-it": "0.0.2", - "@types/mime": "^1", - "@types/minimatch": "^3.0.3", - "@types/mocha": "^7.0.2", - "@types/node": "^8", - "@types/read": "^0.0.28", - "@types/semver": "^6.0.0", - "@types/tmp": "^0.1.0", - "@types/xml2js": "^0.4.4", - "concurrently": "^5.1.0", - "mocha": "^7.1.1", - "source-map-support": "^0.4.2", - "typescript": "^3.4.3", - "xml2js": "^0.4.12" - }, - "mocha": { - "require": [ - "source-map-support/register" - ], - "spec": "out/test" - } + "name": "vsce", + "version": "1.79.5", + "description": "VSCode Extension Manager", + "repository": { + "type": "git", + "url": "https://github.com/Microsoft/vsce" + }, + "homepage": "https://code.visualstudio.com", + "bugs": "https://github.com/Microsoft/vsce/issues", + "keywords": [ + "vscode", + "vsce", + "extension" + ], + "contributors": [ + "Microsoft Corporation" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "main": "out/api.js", + "typings": "out/api.d.ts", + "bin": { + "vsce": "out/vsce" + }, + "scripts": { + "copy-vsce": "mkdir -p out && cp src/vsce out/vsce", + "compile": "tsc && yarn copy-vsce", + "watch": "yarn copy-vsce && tsc --watch", + "watch-test": "yarn copy-vsce && concurrently \"tsc --watch\" \"mocha --watch\"", + "test": "mocha", + "prepublishOnly": "tsc && yarn copy-vsce && mocha", + "vsce": "out/vsce" + }, + "engines": { + "node": ">= 8" + }, + "dependencies": { + "azure-devops-node-api": "^7.2.0", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.1", + "commander": "^2.8.1", + "denodeify": "^1.2.1", + "glob": "^7.0.6", + "leven": "^3.1.0", + "lodash": "^4.17.15", + "markdown-it": "^10.0.0", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "osenv": "^0.1.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "0.0.29", + "typed-rest-client": "1.2.0", + "url-join": "^1.1.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "devDependencies": { + "@types/cheerio": "^0.22.1", + "@types/denodeify": "^1.2.31", + "@types/glob": "^7.1.1", + "@types/lodash": "^4.14.123", + "@types/markdown-it": "0.0.2", + "@types/mime": "^1", + "@types/minimatch": "^3.0.3", + "@types/mocha": "^7.0.2", + "@types/node": "^8", + "@types/read": "^0.0.28", + "@types/semver": "^6.0.0", + "@types/tmp": "^0.1.0", + "@types/xml2js": "^0.4.4", + "concurrently": "^5.1.0", + "mocha": "^7.1.1", + "prettier": "2.1.2", + "source-map-support": "^0.4.2", + "typescript": "^3.4.3", + "xml2js": "^0.4.12" + }, + "mocha": { + "require": [ + "source-map-support/register" + ], + "spec": "out/test" + }, + "prettier": { + "useTabs": true, + "printWidth": 120, + "singleQuote": true, + "arrowParens": "avoid" + } } diff --git a/src/api.ts b/src/api.ts index aa3f3c5d..25ffd7cd 100644 --- a/src/api.ts +++ b/src/api.ts @@ -33,7 +33,6 @@ export interface ICreateVSIXOptions { } export interface IPublishOptions { - /** * The location of the extension in the file system. * @@ -69,11 +68,10 @@ export interface IPublishOptions { */ export enum PackageManager { Npm, - Yarn + Yarn, } export interface IListFilesOptions { - /** * The working directory of the extension. Defaults to `process.cwd()`. */ @@ -85,7 +83,7 @@ export interface IListFilesOptions { packageManager?: PackageManager; /** - * A subset of the top level dependencies which should be included. The + * A subset of the top level dependencies which should be included. The * default is `undefined` which include all dependencies, an empty array means * no dependencies will be included. */ @@ -100,7 +98,6 @@ export interface IListFilesOptions { } export interface IPublishVSIXOptions { - /** * The Personal Access Token to use. * @@ -142,7 +139,12 @@ export function publish(options: IPublishOptions = {}): Promise { * Lists the files included in the extension's package. */ export function listFiles(options: IListFilesOptions = {}): Promise { - return _listFiles(options.cwd, options.packageManager === PackageManager.Yarn, options.packagedDependencies, options.ignoreFile); + return _listFiles( + options.cwd, + options.packageManager === PackageManager.Yarn, + options.packagedDependencies, + options.ignoreFile + ); } /** diff --git a/src/main.ts b/src/main.ts index fef158ef..36588955 100644 --- a/src/main.ts +++ b/src/main.ts @@ -38,45 +38,67 @@ function main(task: Promise): void { if (isatty(1)) { getLatestVersion(pkg.name, token) - .then(version => latestVersion = version) - .catch(_ => { /* noop */ }); + .then(version => (latestVersion = version)) + .catch(_ => { + /* noop */ + }); } - task - .catch(fatal) - .then(() => { - if (latestVersion && semver.gt(latestVersion, pkg.version)) { - log.info(`\nThe latest version of ${pkg.name} is ${latestVersion} and you have ${pkg.version}.\nUpdate it now: npm install -g ${pkg.name}`); - } else { - token.cancel(); - } - }); + task.catch(fatal).then(() => { + if (latestVersion && semver.gt(latestVersion, pkg.version)) { + log.info( + `\nThe latest version of ${pkg.name} is ${latestVersion} and you have ${pkg.version}.\nUpdate it now: npm install -g ${pkg.name}` + ); + } else { + token.cancel(); + } + }); } module.exports = function (argv: string[]): void { - program - .version(pkg.version) - .usage(' [options]'); + program.version(pkg.version).usage(' [options]'); program .command('ls') .description('Lists all the files that will be published') .option('--yarn', 'Use yarn instead of npm') - .option('--packagedDependencies ', 'Select packages that should be published only (includes dependencies)', (val, all) => all ? all.concat(val) : [val], undefined) + .option( + '--packagedDependencies ', + 'Select packages that should be published only (includes dependencies)', + (val, all) => (all ? all.concat(val) : [val]), + undefined + ) .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') - .action(({ yarn, packagedDependencies, ignoreFile }) => main(ls(undefined, yarn, packagedDependencies, ignoreFile))); + .action(({ yarn, packagedDependencies, ignoreFile }) => + main(ls(undefined, yarn, packagedDependencies, ignoreFile)) + ); program .command('package') .description('Packages an extension') .option('-o, --out [path]', 'Output .vsix extension file to [path] location') - .option('--githubBranch [branch]', 'The GitHub branch used to infer relative links in README.md. Can be overriden by --baseContentUrl and --baseImagesUrl.') + .option( + '--githubBranch [branch]', + 'The GitHub branch used to infer relative links in README.md. Can be overriden by --baseContentUrl and --baseImagesUrl.' + ) .option('--baseContentUrl [url]', 'Prepend all relative links in README.md with this url.') .option('--baseImagesUrl [url]', 'Prepend all relative image links in README.md with this url.') .option('--yarn', 'Use yarn instead of npm') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') .option('--noGitHubIssueLinking', 'Prevent automatic expansion of GitHub-style issue syntax into links') - .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking }) => main(packageCommand({ packagePath: out, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking }))); + .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking }) => + main( + packageCommand({ + packagePath: out, + githubBranch, + baseContentUrl, + baseImagesUrl, + useYarn: yarn, + ignoreFile, + expandGitHubIssueLinks: noGitHubIssueLinking, + }) + ) + ); program .command('publish []') @@ -84,14 +106,40 @@ module.exports = function (argv: string[]): void { .option('-p, --pat ', 'Personal Access Token', process.env['VSCE_PAT']) .option('-m, --message ', 'Commit message used when calling `npm version`.') .option('--packagePath [path]', 'Publish the VSIX package located at the specified path.') - .option('--githubBranch [branch]', 'The GitHub branch used to infer relative links in README.md. Can be overriden by --baseContentUrl and --baseImagesUrl.') + .option( + '--githubBranch [branch]', + 'The GitHub branch used to infer relative links in README.md. Can be overriden by --baseContentUrl and --baseImagesUrl.' + ) .option('--baseContentUrl [url]', 'Prepend all relative links in README.md with this url.') .option('--baseImagesUrl [url]', 'Prepend all relative image links in README.md with this url.') .option('--yarn', 'Use yarn instead of npm while packing extension files') .option('--noVerify') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') - .option('--web', 'Experimental flag to enable publishing web extensions. Note: This is supported only for selected extensions.') - .action((version, { pat, message, packagePath, githubBranch, baseContentUrl, baseImagesUrl, yarn, noVerify, ignoreFile, web }) => main(publish({ pat, commitMessage: message, version, packagePath, githubBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, noVerify, ignoreFile, web }))); + .option( + '--web', + 'Experimental flag to enable publishing web extensions. Note: This is supported only for selected extensions.' + ) + .action( + ( + version, + { pat, message, packagePath, githubBranch, baseContentUrl, baseImagesUrl, yarn, noVerify, ignoreFile, web } + ) => + main( + publish({ + pat, + commitMessage: message, + version, + packagePath, + githubBranch, + baseContentUrl, + baseImagesUrl, + useYarn: yarn, + noVerify, + ignoreFile, + web, + }) + ) + ); program .command('unpublish []') @@ -137,19 +185,17 @@ module.exports = function (argv: string[]): void { .description('search extension gallery') .action((text, { json }) => main(search(text, json))); - program - .command('*', '', { noHelp: true }) - .action((cmd: string) => { - program.help(help => { - const availableCommands = program.commands.map(c => c._name); - const suggestion = availableCommands.find(c => leven(c, cmd) < c.length * 0.4); + program.command('*', '', { noHelp: true }).action((cmd: string) => { + program.help(help => { + const availableCommands = program.commands.map(c => c._name); + const suggestion = availableCommands.find(c => leven(c, cmd) < c.length * 0.4); - help = `${help} + help = `${help} Unknown command '${cmd}'`; - return suggestion ? `${help}, did you mean '${suggestion}'?\n` : `${help}.\n`; - }); + return suggestion ? `${help}, did you mean '${suggestion}'?\n` : `${help}.\n`; }); + }); program.parse(argv); diff --git a/src/manifest.ts b/src/manifest.ts index da1ac198..368598ec 100644 --- a/src/manifest.ts +++ b/src/manifest.ts @@ -17,7 +17,7 @@ export interface Localization { } export interface Contributions { - 'localizations'?: Localization[]; + localizations?: Localization[]; [contributionType: string]: any; } @@ -27,7 +27,7 @@ export interface Manifest { // mandatory (npm) name: string; version: string; - engines: { [name: string]: string; }; + engines: { [name: string]: string }; // vscode publisher: string; @@ -36,11 +36,11 @@ export interface Manifest { activationEvents?: string[]; extensionDependencies?: string[]; extensionPack?: string[]; - galleryBanner?: { color?: string; theme?: string; }; + galleryBanner?: { color?: string; theme?: string }; preview?: boolean; - badges?: { url: string; href: string; description: string; }[]; + badges?: { url: string; href: string; description: string }[]; markdown?: 'github' | 'standard'; - _bundling?: { [name: string]: string; }[]; + _bundling?: { [name: string]: string }[]; _testing?: string; enableProposedApi?: boolean; qna?: 'marketplace' | string | false; @@ -58,10 +58,10 @@ export interface Manifest { contributors?: string | Person[]; main?: string; browser?: string; - repository?: string | { type?: string; url?: string; }; - scripts?: { [name: string]: string; }; - dependencies?: { [name: string]: string; }; - devDependencies?: { [name: string]: string; }; + repository?: string | { type?: string; url?: string }; + scripts?: { [name: string]: string }; + dependencies?: { [name: string]: string }; + devDependencies?: { [name: string]: string }; private?: boolean; // not supported (npm) diff --git a/src/nls.ts b/src/nls.ts index 2ed36b98..01f40bd5 100644 --- a/src/nls.ts +++ b/src/nls.ts @@ -25,4 +25,4 @@ function patcher(translations: ITranslations) { export function patchNLS(manifest: Manifest, translations: ITranslations): Manifest { return cloneDeepWith(manifest, patcher(translations)) as Manifest; -} \ No newline at end of file +} diff --git a/src/npm.ts b/src/npm.ts index 71649a43..b5ac1ad6 100644 --- a/src/npm.ts +++ b/src/npm.ts @@ -19,7 +19,11 @@ function parseStdout({ stdout }: { stdout: string }): string { return stdout.split(/[\r\n]/).filter(line => !!line)[0]; } -function exec(command: string, options: IOptions = {}, cancellationToken?: CancellationToken): Promise<{ stdout: string; stderr: string; }> { +function exec( + command: string, + options: IOptions = {}, + cancellationToken?: CancellationToken +): Promise<{ stdout: string; stderr: string }> { return new Promise((c, e) => { let disposeCancellationListener: Function = null; @@ -29,7 +33,9 @@ function exec(command: string, options: IOptions = {}, cancellationToken?: Cance disposeCancellationListener = null; } - if (err) { return e(err); } + if (err) { + return e(err); + } c({ stdout, stderr }); }); @@ -54,10 +60,10 @@ function checkNPM(cancellationToken?: CancellationToken): Promise { function getNpmDependencies(cwd: string): Promise { return checkNPM() - .then(() => exec('npm list --production --parseable --depth=99999 --loglevel=error', { cwd, maxBuffer: 5000 * 1024 })) - .then(({ stdout }) => stdout - .split(/[\r\n]/) - .filter(dir => path.isAbsolute(dir))); + .then(() => + exec('npm list --production --parseable --depth=99999 --loglevel=error', { cwd, maxBuffer: 5000 * 1024 }) + ) + .then(({ stdout }) => stdout.split(/[\r\n]/).filter(dir => path.isAbsolute(dir))); } interface YarnTreeNode { @@ -88,7 +94,7 @@ function asYarnDependency(prefix: string, tree: YarnTreeNode, prune: boolean): Y const dependencyPath = path.join(prefix, name); const children: YarnDependency[] = []; - for (const child of (tree.children || [])) { + for (const child of tree.children || []) { const dep = asYarnDependency(path.join(prefix, name, 'node_modules'), child, prune); if (dep) { @@ -100,8 +106,7 @@ function asYarnDependency(prefix: string, tree: YarnTreeNode, prune: boolean): Y } function selectYarnDependencies(deps: YarnDependency[], packagedDependencies: string[]): YarnDependency[] { - - const index = new class { + const index = new (class { private data: { [name: string]: YarnDependency } = Object.create(null); constructor() { for (const dep of deps) { @@ -118,9 +123,9 @@ function selectYarnDependencies(deps: YarnDependency[], packagedDependencies: st } return result; } - }; + })(); - const reached = new class { + const reached = new (class { values: YarnDependency[] = []; add(dep: YarnDependency): boolean { if (this.values.indexOf(dep) < 0) { @@ -129,7 +134,7 @@ function selectYarnDependencies(deps: YarnDependency[], packagedDependencies: st } return false; } - }; + })(); const visit = (name: string) => { let dep = index.find(name); @@ -146,7 +151,13 @@ function selectYarnDependencies(deps: YarnDependency[], packagedDependencies: st } async function getYarnProductionDependencies(cwd: string, packagedDependencies?: string[]): Promise { - const raw = await new Promise((c, e) => cp.exec('yarn list --prod --json', { cwd, encoding: 'utf8', env: { ...process.env }, maxBuffer: 5000 * 1024 }, (err, stdout) => err ? e(err) : c(stdout))); + const raw = await new Promise((c, e) => + cp.exec( + 'yarn list --prod --json', + { cwd, encoding: 'utf8', env: { ...process.env }, maxBuffer: 5000 * 1024 }, + (err, stdout) => (err ? e(err) : c(stdout)) + ) + ); const match = /^{"type":"tree".*$/m.exec(raw); if (!match || match.length !== 1) { @@ -172,7 +183,10 @@ async function getYarnDependencies(cwd: string, packagedDependencies?: string[]) if (await new Promise(c => fs.exists(path.join(cwd, 'yarn.lock'), c))) { const deps = await getYarnProductionDependencies(cwd, packagedDependencies); - const flatten = (dep: YarnDependency) => { result.push(dep.path); dep.children.forEach(flatten); }; + const flatten = (dep: YarnDependency) => { + result.push(dep.path); + dep.children.forEach(flatten); + }; deps.forEach(flatten); } diff --git a/src/package.ts b/src/package.ts index 15b89def..92df4606 100644 --- a/src/package.ts +++ b/src/package.ts @@ -14,7 +14,13 @@ import * as cheerio from 'cheerio'; import * as url from 'url'; import { lookup } from 'mime'; import * as urljoin from 'url-join'; -import { validatePublisher, validateExtensionName, validateVersion, validateEngineCompatibility, validateVSCodeTypesCompatibility } from './validation'; +import { + validatePublisher, + validateExtensionName, + validateVersion, + validateEngineCompatibility, + validateVSCodeTypesCompatibility, +} from './validation'; import { getDependencies } from './npm'; import { IExtensionsReport } from './publicgalleryapi'; @@ -37,7 +43,7 @@ export interface IFile { export function read(file: IFile): Promise { if (file.contents) { - return Promise.resolve(file.contents).then(b => typeof b === 'string' ? b : b.toString('utf8')); + return Promise.resolve(file.contents).then(b => (typeof b === 'string' ? b : b.toString('utf8'))); } else { return readFile(file.localPath, 'utf8'); } @@ -79,15 +85,19 @@ export interface IProcessor { } export class BaseProcessor implements IProcessor { - constructor(protected manifest: Manifest) { } + constructor(protected manifest: Manifest) {} assets: IAsset[] = []; tags: string[] = []; vsix: any = Object.create(null); - onFile(file: IFile): Promise { return Promise.resolve(file); } - onEnd() { return Promise.resolve(null); } + onFile(file: IFile): Promise { + return Promise.resolve(file); + } + onEnd() { + return Promise.resolve(null); + } } -function getUrl(url: string | { url?: string; }): string { +function getUrl(url: string | { url?: string }): string { if (!url) { return null; } @@ -99,7 +109,7 @@ function getUrl(url: string | { url?: string; }): string { return (url).url; } -function getRepositoryUrl(url: string | { url?: string; }): string { +function getRepositoryUrl(url: string | { url?: string }): string { const result = getUrl(url); if (/^[^\/]+\/[^\/]+$/.test(result)) { @@ -112,7 +122,7 @@ function getRepositoryUrl(url: string | { url?: string; }): string { // Contributed by Mozilla develpoer authors // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string } function toExtensionTags(extensions: string[]): string[] { @@ -173,7 +183,7 @@ const TrustedSVGSources = [ 'visualstudio.com', 'vsmarketplacebadge.apphb.com', 'www.bithound.io', - 'www.versioneye.com' + 'www.versioneye.com', ]; function isGitHubRepository(repository: string): boolean { @@ -189,7 +199,6 @@ function isHostTrusted(url: url.UrlWithStringQuery): boolean { } class ManifestProcessor extends BaseProcessor { - constructor(manifest: Manifest) { super(manifest); @@ -228,18 +237,26 @@ class ManifestProcessor extends BaseProcessor { links: { repository, bugs: getUrl(manifest.bugs), - homepage: manifest.homepage + homepage: manifest.homepage, }, galleryBanner: manifest.galleryBanner || {}, badges: manifest.badges, githubMarkdown: manifest.markdown !== 'standard', enableMarketplaceQnA, customerQnALink, - extensionDependencies: _(manifest.extensionDependencies || []).uniq().join(','), - extensionPack: _(manifest.extensionPack || []).uniq().join(','), + extensionDependencies: _(manifest.extensionDependencies || []) + .uniq() + .join(','), + extensionPack: _(manifest.extensionPack || []) + .uniq() + .join(','), extensionKind: extensionKind.join(','), - localizedLanguages: (manifest.contributes && manifest.contributes.localizations) ? - manifest.contributes.localizations.map(loc => loc.localizedLanguageName || loc.languageName || loc.languageId).join(',') : '' + localizedLanguages: + manifest.contributes && manifest.contributes.localizations + ? manifest.contributes.localizations + .map(loc => loc.localizedLanguageName || loc.languageName || loc.languageId) + .join(',') + : '', }; if (isGitHub) { @@ -249,11 +266,15 @@ class ManifestProcessor extends BaseProcessor { async onEnd(): Promise { if (typeof this.manifest.extensionKind === 'string') { - util.log.warn(`The 'extensionKind' property should be of type 'string[]'. Learn more at: https://aka.ms/vscode/api/incorrect-execution-location`); + util.log.warn( + `The 'extensionKind' property should be of type 'string[]'. Learn more at: https://aka.ms/vscode/api/incorrect-execution-location` + ); } if (this.manifest.publisher === 'vscode-samples') { - throw new Error('It\'s not allowed to use the \'vscode-samples\' publisher. Learn more at: https://code.visualstudio.com/api/working-with-extensions/publishing-extension.'); + throw new Error( + "It's not allowed to use the 'vscode-samples' publisher. Learn more at: https://code.visualstudio.com/api/working-with-extensions/publishing-extension." + ); } if (!this.manifest.repository) { @@ -267,44 +288,43 @@ class ManifestProcessor extends BaseProcessor { } export class TagsProcessor extends BaseProcessor { - private static Keywords = { - 'git': ['git'], - 'npm': ['node'], - 'spell': ['markdown'], - 'bootstrap': ['bootstrap'], - 'lint': ['linters'], - 'linting': ['linters'], - 'react': ['javascript'], - 'js': ['javascript'], - 'node': ['javascript', 'node'], + git: ['git'], + npm: ['node'], + spell: ['markdown'], + bootstrap: ['bootstrap'], + lint: ['linters'], + linting: ['linters'], + react: ['javascript'], + js: ['javascript'], + node: ['javascript', 'node'], 'c++': ['c++'], - 'Cplusplus': ['c++'], - 'xml': ['xml'], - 'angular': ['javascript'], - 'jquery': ['javascript'], - 'php': ['php'], - 'python': ['python'], - 'latex': ['latex'], - 'ruby': ['ruby'], - 'java': ['java'], - 'erlang': ['erlang'], - 'sql': ['sql'], - 'nodejs': ['node'], + Cplusplus: ['c++'], + xml: ['xml'], + angular: ['javascript'], + jquery: ['javascript'], + php: ['php'], + python: ['python'], + latex: ['latex'], + ruby: ['ruby'], + java: ['java'], + erlang: ['erlang'], + sql: ['sql'], + nodejs: ['node'], 'c#': ['c#'], - 'css': ['css'], - 'javascript': ['javascript'], - 'ftp': ['ftp'], - 'haskell': ['haskell'], - 'unity': ['unity'], - 'terminal': ['terminal'], - 'powershell': ['powershell'], - 'laravel': ['laravel'], - 'meteor': ['meteor'], - 'emmet': ['emmet'], - 'eslint': ['linters'], - 'tfs': ['tfs'], - 'rust': ['rust'] + css: ['css'], + javascript: ['javascript'], + ftp: ['ftp'], + haskell: ['haskell'], + unity: ['unity'], + terminal: ['terminal'], + powershell: ['powershell'], + laravel: ['laravel'], + meteor: ['meteor'], + emmet: ['emmet'], + eslint: ['linters'], + tfs: ['tfs'], + rust: ['rust'], }; onEnd(): Promise { @@ -320,23 +340,31 @@ export class TagsProcessor extends BaseProcessor { const debuggers = doesContribute('debuggers') ? ['debuggers'] : []; const json = doesContribute('jsonValidation') ? ['json'] : []; - const localizationContributions = ((contributes && contributes['localizations']) || []) - .reduce((r, l) => [...r, `lp-${l.languageId}`, ...toLanguagePackTags(l.translations, l.languageId)], []); + const localizationContributions = ((contributes && contributes['localizations']) || []).reduce( + (r, l) => [...r, `lp-${l.languageId}`, ...toLanguagePackTags(l.translations, l.languageId)], + [] + ); - const languageContributions = ((contributes && contributes['languages']) || []) - .reduce((r, l) => [...r, l.id, ...(l.aliases || []), ...toExtensionTags(l.extensions || [])], []); + const languageContributions = ((contributes && contributes['languages']) || []).reduce( + (r, l) => [...r, l.id, ...(l.aliases || []), ...toExtensionTags(l.extensions || [])], + [] + ); const languageActivations = activationEvents .map(e => /^onLanguage:(.*)$/.exec(e)) .filter(r => !!r) .map(r => r[1]); - const grammars = ((contributes && contributes['grammars']) || []) - .map(g => g.language); + const grammars = ((contributes && contributes['grammars']) || []).map(g => g.language); const description = this.manifest.description || ''; - const descriptionKeywords = Object.keys(TagsProcessor.Keywords) - .reduce((r, k) => r.concat(new RegExp('\\b(?:' + escapeRegExp(k) + ')(?!\\w)', 'gi').test(description) ? TagsProcessor.Keywords[k] : []), []); + const descriptionKeywords = Object.keys(TagsProcessor.Keywords).reduce( + (r, k) => + r.concat( + new RegExp('\\b(?:' + escapeRegExp(k) + ')(?!\\w)', 'gi').test(description) ? TagsProcessor.Keywords[k] : [] + ), + [] + ); const tags = [ ...keywords, @@ -350,7 +378,7 @@ export class TagsProcessor extends BaseProcessor { ...languageContributions, ...languageActivations, ...grammars, - ...descriptionKeywords + ...descriptionKeywords, ]; this.tags = _(tags) @@ -363,23 +391,29 @@ export class TagsProcessor extends BaseProcessor { } export class MarkdownProcessor extends BaseProcessor { - private baseContentUrl: string; private baseImagesUrl: string; private isGitHub: boolean; private repositoryUrl: string; private expandGitHubIssueLinks: boolean; - constructor(manifest: Manifest, private name: string, private regexp: RegExp, private assetType: string, options: IPackageOptions = {}) { + constructor( + manifest: Manifest, + private name: string, + private regexp: RegExp, + private assetType: string, + options: IPackageOptions = {} + ) { super(manifest); const guess = this.guessBaseUrls(options.githubBranch); this.baseContentUrl = options.baseContentUrl || (guess && guess.content); this.baseImagesUrl = options.baseImagesUrl || options.baseContentUrl || (guess && guess.images); - this.repositoryUrl = (guess && guess.repository); + this.repositoryUrl = guess && guess.repository; this.isGitHub = isGitHubRepository(this.repositoryUrl); - this.expandGitHubIssueLinks = typeof options.expandGitHubIssueLinks === 'boolean' ? options.expandGitHubIssueLinks : true; + this.expandGitHubIssueLinks = + typeof options.expandGitHubIssueLinks === 'boolean' ? options.expandGitHubIssueLinks : true; } async onFile(file: IFile): Promise { @@ -409,7 +443,9 @@ export class MarkdownProcessor extends BaseProcessor { const asset = isImage ? 'image' : 'link'; if (isLinkRelative) { - throw new Error(`Couldn't detect the repository where this extension is published. The ${asset} '${link}' will be broken in ${this.name}. Please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.`); + throw new Error( + `Couldn't detect the repository where this extension is published. The ${asset} '${link}' will be broken in ${this.name}. Please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.` + ); } } @@ -431,7 +467,9 @@ export class MarkdownProcessor extends BaseProcessor { const isLinkRelative = !/^\w+:\/\//.test(link) && link[0] !== '#'; if (!this.baseImagesUrl && isLinkRelative) { - throw new Error(`Couldn't detect the repository where this extension is published. The image will be broken in ${this.name}. Please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.`); + throw new Error( + `Couldn't detect the repository where this extension is published. The image will be broken in ${this.name}. Please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.` + ); } const prefix = this.baseImagesUrl; @@ -443,8 +481,13 @@ export class MarkdownProcessor extends BaseProcessor { }); if (this.isGitHub && this.expandGitHubIssueLinks) { - const markdownIssueRegex = /(\s|\n)([\w\d_-]+\/[\w\d_-]+)?#(\d+)\b/g - const issueReplace = (all: string, prefix: string, ownerAndRepositoryName: string, issueNumber: string): string => { + const markdownIssueRegex = /(\s|\n)([\w\d_-]+\/[\w\d_-]+)?#(\d+)\b/g; + const issueReplace = ( + all: string, + prefix: string, + ownerAndRepositoryName: string, + issueNumber: string + ): string => { let result = all; let owner: string; let repositoryName: string; @@ -457,14 +500,13 @@ export class MarkdownProcessor extends BaseProcessor { // Issue in external repository const issueUrl = urljoin('https://github.com', owner, repositoryName, 'issues', issueNumber); result = prefix + `[${owner}/${repositoryName}#${issueNumber}](${issueUrl})`; - } else if (!owner && !repositoryName && issueNumber) { // Issue in own repository result = prefix + `[#${issueNumber}](${urljoin(this.repositoryUrl, 'issues', issueNumber)})`; } return result; - } + }; // Replace Markdown issue references with urls contents = contents.replace(markdownIssueRegex, issueReplace); } @@ -484,8 +526,10 @@ export class MarkdownProcessor extends BaseProcessor { throw new Error(`Images in ${this.name} must come from an HTTPS source: ${src}`); } - if (/\.svg$/i.test(srcUrl.pathname) && (!isHostTrusted(srcUrl))) { - throw new Error(`SVGs are restricted in ${this.name}; please use other file image formats, such as PNG: ${src}`); + if (/\.svg$/i.test(srcUrl.pathname) && !isHostTrusted(srcUrl)) { + throw new Error( + `SVGs are restricted in ${this.name}; please use other file image formats, such as PNG: ${src}` + ); } }); @@ -495,7 +539,7 @@ export class MarkdownProcessor extends BaseProcessor { return { path: file.path, - contents: Buffer.from(contents, 'utf8') + contents: Buffer.from(contents, 'utf8'), }; } @@ -527,26 +571,29 @@ export class MarkdownProcessor extends BaseProcessor { return { content: `https://github.com/${account}/${repositoryName}/blob/${branchName}`, images: `https://github.com/${account}/${repositoryName}/raw/${branchName}`, - repository: `https://github.com/${account}/${repositoryName}` + repository: `https://github.com/${account}/${repositoryName}`, }; } } export class ReadmeProcessor extends MarkdownProcessor { - constructor(manifest: Manifest, options: IPackageOptions = {}) { super(manifest, 'README.md', /^extension\/readme.md$/i, 'Microsoft.VisualStudio.Services.Content.Details', options); } } export class ChangelogProcessor extends MarkdownProcessor { - constructor(manifest: Manifest, options: IPackageOptions = {}) { - super(manifest, 'CHANGELOG.md', /^extension\/changelog.md$/i, 'Microsoft.VisualStudio.Services.Content.Changelog', options); + super( + manifest, + 'CHANGELOG.md', + /^extension\/changelog.md$/i, + 'Microsoft.VisualStudio.Services.Content.Changelog', + options + ); } } class LicenseProcessor extends BaseProcessor { - private didFindLicense = false; filter: (name: string) => boolean; @@ -586,7 +633,6 @@ class LicenseProcessor extends BaseProcessor { } class IconProcessor extends BaseProcessor { - private icon: string; private didFindIcon = false; @@ -618,8 +664,10 @@ class IconProcessor extends BaseProcessor { export function isSupportedWebExtension(manifest: Manifest, extensionsReport: IExtensionsReport): boolean { const id = `${manifest.publisher}.${manifest.name}`; - return extensionsReport.web.publishers.some(publisher => manifest.publisher === publisher) - || extensionsReport.web.extensions.some(extension => extension === id); + return ( + extensionsReport.web.publishers.some(publisher => manifest.publisher === publisher) || + extensionsReport.web.extensions.some(extension => extension === id) + ); } export function isWebKind(manifest: Manifest): boolean { @@ -634,7 +682,9 @@ function getExtensionKind(manifest: Manifest): ExtensionKind[] { if (manifest.extensionKind) { return Array.isArray(manifest.extensionKind) ? manifest.extensionKind - : manifest.extensionKind === 'ui' ? ['ui', 'workspace'] : [manifest.extensionKind] + : manifest.extensionKind === 'ui' + ? ['ui', 'workspace'] + : [manifest.extensionKind]; } // Not an UI extension if it has main @@ -668,7 +718,6 @@ function getExtensionKind(manifest: Manifest): ExtensionKind[] { } export class WebExtensionProcessor extends BaseProcessor { - private readonly isWebKind: boolean = false; constructor(manifest: Manifest, options: IPackageOptions) { @@ -689,27 +738,31 @@ export class WebExtensionProcessor extends BaseProcessor { async onEnd(): Promise { if (this.assets.length > 25) { - throw new Error('Cannot pack more than 25 files in a web extension. Use `vsce ls` to see all the files that will be packed and exclude those which are not needed in .vscodeignore.'); + throw new Error( + 'Cannot pack more than 25 files in a web extension. Use `vsce ls` to see all the files that will be packed and exclude those which are not needed in .vscodeignore.' + ); } if (this.isWebKind) { this.vsix = { ...this.vsix, - webExtension: true - } + webExtension: true, + }; this.tags = ['__web_extension']; } } - } export class NLSProcessor extends BaseProcessor { - private translations: { [path: string]: string } = Object.create(null); constructor(manifest: Manifest) { super(manifest); - if (!manifest.contributes || !manifest.contributes.localizations || manifest.contributes.localizations.length === 0) { + if ( + !manifest.contributes || + !manifest.contributes.localizations || + manifest.contributes.localizations.length === 0 + ) { return; } @@ -745,7 +798,6 @@ export class NLSProcessor extends BaseProcessor { } export class ValidationProcessor extends BaseProcessor { - private files = new Map(); private duplicates = new Set(); @@ -768,7 +820,9 @@ export class ValidationProcessor extends BaseProcessor { return; } - const messages = [`The following files have the same case insensitive path, which isn't supported by the VSIX format:`]; + const messages = [ + `The following files have the same case insensitive path, which isn't supported by the VSIX format:`, + ]; for (const lower of this.duplicates) { for (const filePath of this.files.get(lower)) { @@ -816,14 +870,16 @@ export function validateManifest(manifest: Manifest): Manifest { throw new Error(`Badge URLs must come from an HTTPS source: ${badge.url}`); } - if (/\.svg$/i.test(srcUrl.pathname) && (!isHostTrusted(srcUrl))) { + if (/\.svg$/i.test(srcUrl.pathname) && !isHostTrusted(srcUrl)) { throw new Error(`Badge SVGs are restricted. Please use other file image formats, such as PNG: ${badge.url}`); } }); - Object.keys((manifest.dependencies || {})).forEach(dep => { + Object.keys(manifest.dependencies || {}).forEach(dep => { if (dep === 'vscode') { - throw new Error(`You should not depend on 'vscode' in your 'dependencies'. Did you mean to add it to 'devDependencies'?`); + throw new Error( + `You should not depend on 'vscode' in your 'dependencies'. Did you mean to add it to 'devDependencies'?` + ); } }); @@ -850,7 +906,7 @@ export function readManifest(cwd = process.cwd(), nls = true): Promise } const manifestNLS = readFile(manifestNLSPath, 'utf8') - .catch(err => err.code !== 'ENOENT' ? Promise.reject(err) : Promise.resolve('{}')) + .catch(err => (err.code !== 'ENOENT' ? Promise.reject(err) : Promise.resolve('{}'))) .then(raw => { try { return Promise.resolve(JSON.parse(raw)); @@ -862,7 +918,6 @@ export function readManifest(cwd = process.cwd(), nls = true): Promise return Promise.all([manifest, manifestNLS]).then(([manifest, translations]) => { return patchNLS(manifest, translations); }); - } export function toVsixManifest(vsix: any): Promise { @@ -873,7 +928,7 @@ export function toVsixManifest(vsix: any): Promise { const defaultExtensions = { '.json': 'application/json', - '.vsixmanifest': 'text/xml' + '.vsixmanifest': 'text/xml', }; export function toContentTypes(files: IFile[]): Promise { @@ -884,7 +939,7 @@ export function toContentTypes(files: IFile[]): Promise { const allExtensions = { ...extensions, ...defaultExtensions }; const contentTypes = Object.keys(allExtensions).map(extension => ({ extension, - contentType: allExtensions[extension] + contentType: allExtensions[extension], })); return readFile(contentTypesTemplatePath, 'utf8') @@ -916,44 +971,67 @@ const defaultIgnore = [ '**/*.vsix', '**/.DS_Store', '**/*.vsixmanifest', - '**/.vscode-test/**' + '**/.vscode-test/**', ]; function collectAllFiles(cwd: string, useYarn = false, dependencyEntryPoints?: string[]): Promise { return getDependencies(cwd, useYarn, dependencyEntryPoints).then(deps => { const promises: Promise[] = deps.map(dep => { - return glob('**', { cwd: dep, nodir: true, dot: true, ignore: 'node_modules/**' }) - .then(files => files - .map(f => path.relative(cwd, path.join(dep, f))) - .map(f => f.replace(/\\/g, '/'))); + return glob('**', { cwd: dep, nodir: true, dot: true, ignore: 'node_modules/**' }).then(files => + files.map(f => path.relative(cwd, path.join(dep, f))).map(f => f.replace(/\\/g, '/')) + ); }); return Promise.all(promises).then(util.flatten); }); } -function collectFiles(cwd: string, useYarn = false, dependencyEntryPoints?: string[], ignoreFile?: string): Promise { +function collectFiles( + cwd: string, + useYarn = false, + dependencyEntryPoints?: string[], + ignoreFile?: string +): Promise { return collectAllFiles(cwd, useYarn, dependencyEntryPoints).then(files => { files = files.filter(f => !/\r$/m.test(f)); - return readFile(ignoreFile ? ignoreFile : path.join(cwd, '.vscodeignore'), 'utf8') - .catch(err => err.code !== 'ENOENT' ? Promise.reject(err) : ignoreFile ? Promise.reject(err) : Promise.resolve('')) - - // Parse raw ignore by splitting output into lines and filtering out empty lines and comments - .then(rawIgnore => rawIgnore.split(/[\n\r]/).map(s => s.trim()).filter(s => !!s).filter(i => !/^\s*#/.test(i))) - - // Add '/**' to possible folder names - .then(ignore => [...ignore, ...ignore.filter(i => !/(^|\/)[^/]*\*[^/]*$/.test(i)).map(i => /\/$/.test(i) ? `${i}**` : `${i}/**`)]) - - // Combine with default ignore list - .then(ignore => [...defaultIgnore, ...ignore, '!package.json']) - - // Split into ignore and negate list - .then(ignore => _.partition(ignore, i => !/^\s*!/.test(i))) - .then(r => ({ ignore: r[0], negate: r[1] })) - - // Filter out files - .then(({ ignore, negate }) => files.filter(f => !ignore.some(i => minimatch(f, i, MinimatchOptions)) || negate.some(i => minimatch(f, i.substr(1), MinimatchOptions)))); + return ( + readFile(ignoreFile ? ignoreFile : path.join(cwd, '.vscodeignore'), 'utf8') + .catch(err => + err.code !== 'ENOENT' ? Promise.reject(err) : ignoreFile ? Promise.reject(err) : Promise.resolve('') + ) + + // Parse raw ignore by splitting output into lines and filtering out empty lines and comments + .then(rawIgnore => + rawIgnore + .split(/[\n\r]/) + .map(s => s.trim()) + .filter(s => !!s) + .filter(i => !/^\s*#/.test(i)) + ) + + // Add '/**' to possible folder names + .then(ignore => [ + ...ignore, + ...ignore.filter(i => !/(^|\/)[^/]*\*[^/]*$/.test(i)).map(i => (/\/$/.test(i) ? `${i}**` : `${i}/**`)), + ]) + + // Combine with default ignore list + .then(ignore => [...defaultIgnore, ...ignore, '!package.json']) + + // Split into ignore and negate list + .then(ignore => _.partition(ignore, i => !/^\s*!/.test(i))) + .then(r => ({ ignore: r[0], negate: r[1] })) + + // Filter out files + .then(({ ignore, negate }) => + files.filter( + f => + !ignore.some(i => minimatch(f, i, MinimatchOptions)) || + negate.some(i => minimatch(f, i.substr(1), MinimatchOptions)) + ) + ) + ); }); } @@ -973,7 +1051,7 @@ export function processFiles(processors: IProcessor[], files: IFile[]): Promise< return [ { path: 'extension.vsixmanifest', contents: Buffer.from(result[0], 'utf8') }, { path: '[Content_Types].xml', contents: Buffer.from(result[1], 'utf8') }, - ...files + ...files, ]; }); }); @@ -990,7 +1068,7 @@ export function createDefaultProcessors(manifest: Manifest, options: IPackageOpt new IconProcessor(manifest), new NLSProcessor(manifest), new WebExtensionProcessor(manifest, options), - new ValidationProcessor(manifest) + new ValidationProcessor(manifest), ]; } @@ -1010,19 +1088,26 @@ export function collect(manifest: Manifest, options: IPackageOptions = {}): Prom function writeVsix(files: IFile[], packagePath: string): Promise { return unlink(packagePath) - .catch(err => err.code !== 'ENOENT' ? Promise.reject(err) : Promise.resolve(null)) - .then(() => new Promise((c, e) => { - const zip = new yazl.ZipFile(); - files.forEach(f => f.contents ? zip.addBuffer(typeof f.contents === 'string' ? Buffer.from(f.contents, 'utf8') : f.contents, f.path) : zip.addFile(f.localPath, f.path)); - zip.end(); - - const zipStream = fs.createWriteStream(packagePath); - zip.outputStream.pipe(zipStream); - - zip.outputStream.once('error', e); - zipStream.once('error', e); - zipStream.once('finish', () => c()); - })); + .catch(err => (err.code !== 'ENOENT' ? Promise.reject(err) : Promise.resolve(null))) + .then( + () => + new Promise((c, e) => { + const zip = new yazl.ZipFile(); + files.forEach(f => + f.contents + ? zip.addBuffer(typeof f.contents === 'string' ? Buffer.from(f.contents, 'utf8') : f.contents, f.path) + : zip.addFile(f.localPath, f.path) + ); + zip.end(); + + const zipStream = fs.createWriteStream(packagePath); + zip.outputStream.pipe(zipStream); + + zip.outputStream.once('error', e); + zipStream.once('error', e); + zipStream.once('finish', () => c()); + }) + ); } function getDefaultPackageName(manifest: Manifest): string { @@ -1039,7 +1124,7 @@ async function prepublish(cwd: string, manifest: Manifest, useYarn: boolean = fa await new Promise((c, e) => { const tool = useYarn ? 'yarn' : 'npm'; const child = cp.spawn(tool, ['run', 'vscode:prepublish'], { cwd, shell: true, stdio: 'inherit' }); - child.on('exit', code => code === 0 ? c() : e(`${tool} failed with exit code ${code}`)); + child.on('exit', code => (code === 0 ? c() : e(`${tool} failed with exit code ${code}`))); child.on('error', e); }); } @@ -1073,7 +1158,9 @@ export async function pack(options: IPackageOptions = {}): Promise /\.js$/i.test(f.path)); if (files.length > 5000 || jsFiles.length > 100) { - console.log(`This extension consists of ${files.length} files, out of which ${jsFiles.length} are JavaScript files. For performance reasons, you should bundle your extension: https://aka.ms/vscode-bundle-extension . You should also exclude unnecessary files by adding them to your .vscodeignore: https://aka.ms/vscode-vscodeignore`); + console.log( + `This extension consists of ${files.length} files, out of which ${jsFiles.length} are JavaScript files. For performance reasons, you should bundle your extension: https://aka.ms/vscode-bundle-extension . You should also exclude unnecessary files by adding them to your .vscodeignore: https://aka.ms/vscode-vscodeignore` + ); } const packagePath = await getPackagePath(cwd, manifest, options); @@ -1103,15 +1190,24 @@ export async function packageCommand(options: IPackageOptions = {}): Promise { - return readManifest(cwd) - .then(() => collectFiles(cwd, useYarn, packagedDependencies, ignoreFile)); +export function listFiles( + cwd = process.cwd(), + useYarn = false, + packagedDependencies?: string[], + ignoreFile?: string +): Promise { + return readManifest(cwd).then(() => collectFiles(cwd, useYarn, packagedDependencies, ignoreFile)); } /** * Lists the files included in the extension's package. Runs prepublish. */ -export function ls(cwd = process.cwd(), useYarn = false, packagedDependencies?: string[], ignoreFile?: string): Promise { +export function ls( + cwd = process.cwd(), + useYarn = false, + packagedDependencies?: string[], + ignoreFile?: string +): Promise { return readManifest(cwd) .then(manifest => prepublish(cwd, manifest, useYarn)) .then(() => collectFiles(cwd, useYarn, packagedDependencies, ignoreFile)) diff --git a/src/publicgalleryapi.ts b/src/publicgalleryapi.ts index 32b98667..89a3ca8f 100644 --- a/src/publicgalleryapi.ts +++ b/src/publicgalleryapi.ts @@ -1,5 +1,11 @@ import { HttpClient, HttpClientResponse } from 'typed-rest-client/HttpClient'; -import { PublishedExtension, ExtensionQueryFlags, FilterCriteria, ExtensionQueryFilterType, TypeInfo } from 'azure-devops-node-api/interfaces/GalleryInterfaces'; +import { + PublishedExtension, + ExtensionQueryFlags, + FilterCriteria, + ExtensionQueryFilterType, + TypeInfo, +} from 'azure-devops-node-api/interfaces/GalleryInterfaces'; import { IHeaders } from 'azure-devops-node-api/interfaces/common/VsoBaseInterfaces'; import { ContractSerializer } from 'azure-devops-node-api/Serialization'; @@ -14,17 +20,16 @@ export interface ExtensionQuery { export interface IExtensionsReport { malicious: string[]; web: { - publishers: string[], - extensions: string[], + publishers: string[]; + extensions: string[]; }; } export class PublicGalleryAPI { - private readonly extensionsReportUrl = 'https://az764295.vo.msecnd.net/extensions/marketplace.json'; private readonly client = new HttpClient('vsce'); - constructor(private baseUrl: string, private apiVersion = '3.0-preview.1') { } + constructor(private baseUrl: string, private apiVersion = '3.0-preview.1') {} private post(url: string, data: string, additionalHeaders?: IHeaders): Promise { return this.client.post(`${this.baseUrl}/_apis/public${url}`, data, additionalHeaders); @@ -40,19 +45,25 @@ export class PublicGalleryAPI { const data = JSON.stringify({ filters: [{ pageNumber, pageSize, criteria }], assetTypes, - flags: flags.reduce((memo, flag) => memo | flag, 0) + flags: flags.reduce((memo, flag) => memo | flag, 0), }); - const res = await this.post('/gallery/extensionquery', data, { Accept: `application/json;api-version=${this.apiVersion}`, 'Content-Type': 'application/json', }); + const res = await this.post('/gallery/extensionquery', data, { + Accept: `application/json;api-version=${this.apiVersion}`, + 'Content-Type': 'application/json', + }); const raw = JSON.parse(await res.readBody()); return ContractSerializer.deserialize(raw.results[0].extensions, TypeInfo.PublishedExtension, false, false); } async getExtension(extensionId: string, flags: ExtensionQueryFlags[] = []): Promise { - const query = { criteria: [{ filterType: ExtensionQueryFilterType.Name, value: extensionId }], flags, }; + const query = { criteria: [{ filterType: ExtensionQueryFilterType.Name, value: extensionId }], flags }; const extensions = await this.extensionQuery(query); - return extensions.filter(({ publisher: { publisherName: publisher }, extensionName: name }) => extensionId.toLowerCase() === `${publisher}.${name}`.toLowerCase())[0]; + return extensions.filter( + ({ publisher: { publisherName: publisher }, extensionName: name }) => + extensionId.toLowerCase() === `${publisher}.${name}`.toLowerCase() + )[0]; } async getExtensionsReport(): Promise { @@ -60,7 +71,7 @@ export class PublicGalleryAPI { const raw = >JSON.parse(await res.readBody()); return { malicious: raw.malicious || [], - web: raw.web || { publishers: [], extensions: [] } - } + web: raw.web || { publishers: [], extensions: [] }, + }; } } diff --git a/src/publish.ts b/src/publish.ts index 11ffc03a..f8bfeee7 100644 --- a/src/publish.ts +++ b/src/publish.ts @@ -10,7 +10,10 @@ import * as yauzl from 'yauzl'; import * as semver from 'semver'; import * as cp from 'child_process'; -const exec = denodeify(cp.exec as any, (err, stdout, stderr) => [err, { stdout, stderr }]); +const exec = denodeify( + cp.exec as any, + (err, stdout, stderr) => [err, { stdout, stderr }] +); const tmpName = denodeify(tmp.tmpName); function readManifestFromPackage(packagePath: string): Promise { @@ -60,8 +63,9 @@ async function _publish(packagePath: string, pat: string, manifest: Manifest): P const fullName = `${name}@${manifest.version}`; console.log(`Publishing ${fullName}...`); - return api.getExtension(null, manifest.publisher, manifest.name, null, ExtensionQueryFlags.IncludeVersions) - .catch(err => err.statusCode === 404 ? null : Promise.reject(err)) + return api + .getExtension(null, manifest.publisher, manifest.name, null, ExtensionQueryFlags.IncludeVersions) + .catch(err => (err.statusCode === 404 ? null : Promise.reject(err))) .then(extension => { if (extension && extension.versions.some(v => v.version === manifest.version)) { return Promise.reject(`${fullName} already exists. Version number cannot be the same.`); @@ -73,10 +77,16 @@ async function _publish(packagePath: string, pat: string, manifest: Manifest): P return promise .catch(err => Promise.reject(err.statusCode === 409 ? `${fullName} already exists.` : err)) - .then(() => log.done(`Published ${fullName}\nYour extension will live at ${getPublishedUrl(name)} (might take a few minutes for it to show up).`)); + .then(() => + log.done( + `Published ${fullName}\nYour extension will live at ${getPublishedUrl( + name + )} (might take a few minutes for it to show up).` + ) + ); }) .catch(err => { - const message = err && err.message || ''; + const message = (err && err.message) || ''; if (/Invalid Resource/.test(message)) { err.message = `${err.message}\n\nYou're likely using an expired Personal Access Token, please get a new PAT.\nMore info: https://aka.ms/vscodepat`; @@ -157,8 +167,10 @@ export function publish(options: IPublishOptions = {}): Promise { return Promise.reject(`Not supported: packagePath and web.`); } - promise = readManifestFromPackage(options.packagePath) - .then(manifest => ({ manifest, packagePath: options.packagePath })); + promise = readManifestFromPackage(options.packagePath).then(manifest => ({ + manifest, + packagePath: options.packagePath, + })); } else { const cwd = options.cwd; const githubBranch = options.githubBranch; @@ -170,27 +182,27 @@ export function publish(options: IPublishOptions = {}): Promise { promise = versionBump(options.cwd, options.version, options.commitMessage) .then(() => tmpName()) - .then(packagePath => pack({ packagePath, cwd, githubBranch, baseContentUrl, baseImagesUrl, useYarn, ignoreFile, web })); + .then(packagePath => + pack({ packagePath, cwd, githubBranch, baseContentUrl, baseImagesUrl, useYarn, ignoreFile, web }) + ); } return promise.then(async ({ manifest, packagePath }) => { if (!options.noVerify && manifest.enableProposedApi) { - throw new Error('Extensions using proposed API (enableProposedApi: true) can\'t be published to the Marketplace'); + throw new Error("Extensions using proposed API (enableProposedApi: true) can't be published to the Marketplace"); } if (options.web) { if (!isWebKind(manifest)) { - throw new Error('Extensions which are not web kind can\'t be published to the Marketpalce as a web extension'); + throw new Error("Extensions which are not web kind can't be published to the Marketpalce as a web extension"); } const extensionsReport = await getPublicGalleryAPI().getExtensionsReport(); if (!isSupportedWebExtension(manifest, extensionsReport)) { - throw new Error('Extensions which are not supported can\'t be published to the Marketpalce as a web extension'); + throw new Error("Extensions which are not supported can't be published to the Marketpalce as a web extension"); } } - const patPromise = options.pat - ? Promise.resolve(options.pat) - : getPublisher(manifest.publisher).then(p => p.pat); + const patPromise = options.pat ? Promise.resolve(options.pat) : getPublisher(manifest.publisher).then(p => p.pat); return patPromise.then(pat => _publish(packagePath, pat, manifest)); }); diff --git a/src/search.ts b/src/search.ts index d91af332..8062bef8 100644 --- a/src/search.ts +++ b/src/search.ts @@ -9,9 +9,7 @@ export async function search(searchText: string, json: boolean = false): Promise const api = getPublicGalleryAPI(); const results = await api.extensionQuery({ pageSize, - criteria: [ - { filterType: ExtensionQueryFilterType.SearchText, value: searchText }, - ], + criteria: [{ filterType: ExtensionQueryFilterType.SearchText, value: searchText }], flags, }); @@ -25,18 +23,21 @@ export async function search(searchText: string, json: boolean = false): Promise return; } - console.log([ - `Search results:`, - '', - ...tableView([ - ['', ''], - ...results.map(({ publisher: { publisherName }, extensionName, shortDescription }) => - [publisherName + '.' + extensionName, (shortDescription || '').replace(/\n|\r|\t/g, ' ')] - ) - ]), - '', - 'For more information on an extension use "vsce show "', - ] - .map(line => wordTrim(line.replace(/\s+$/g, ''))) - .join('\n')); + console.log( + [ + `Search results:`, + '', + ...tableView([ + ['', ''], + ...results.map(({ publisher: { publisherName }, extensionName, shortDescription }) => [ + publisherName + '.' + extensionName, + (shortDescription || '').replace(/\n|\r|\t/g, ' '), + ]), + ]), + '', + 'For more information on an extension use "vsce show "', + ] + .map(line => wordTrim(line.replace(/\s+$/g, ''))) + .join('\n') + ); } diff --git a/src/show.ts b/src/show.ts index 36b53577..fd681fbc 100644 --- a/src/show.ts +++ b/src/show.ts @@ -38,63 +38,59 @@ function showOverview({ extensionName = 'unknown', shortDescription = '', versions = [], - publisher: { - displayName: publisherDisplayName, - publisherName - }, + publisher: { displayName: publisherDisplayName, publisherName }, categories = [], tags = [], statistics = [], publishedDate, lastUpdated, }: PublishedExtension) { - const [{ version = 'unknown' } = {}] = versions; // Create formatted table list of versions - const versionList = versions - .slice(0, limitVersions) - .map(({ version, lastUpdated }) => [version, formatDate(lastUpdated)]); + const versionList = ( + versions.slice(0, limitVersions).map(({ version, lastUpdated }) => [version, formatDate(lastUpdated)]) + ); - const { - install: installs = 0, - averagerating = 0, - ratingcount = 0, - } = statistics - .reduce((map, { statisticName, value }) => ({ ...map, [statisticName]: value }), {}); + const { install: installs = 0, averagerating = 0, ratingcount = 0 } = statistics.reduce( + (map, { statisticName, value }) => ({ ...map, [statisticName]: value }), + {} + ); // Render - console.log([ - `${displayName}`, - `${publisherDisplayName} | ${icons.download} ` + - `${Number(installs).toLocaleString()} installs |` + - ` ${ratingStars(averagerating)} (${ratingcount})`, - '', - `${shortDescription}`, - '', - 'Recent versions:', - ...(versionList.length ? tableView(versionList).map(indentRow) : ['no versions found']), - '', - 'Categories:', - ` ${categories.join(', ')}`, - '', - 'Tags:', - ` ${tags.filter(tag => !isExtensionTag.test(tag)).join(', ')}`, - '', - 'More info:', - ...tableView([ - ['Unique identifier:', `${publisherName}.${extensionName}`], - ['Version:', version], - ['Last updated:', formatDateTime(lastUpdated)], - ['Publisher:', publisherDisplayName], - ['Published at:', formatDate(publishedDate)], - ]) - .map(indentRow), - '', - 'Statistics:', - ...tableView(statistics.map(({ statisticName, value }) => [statisticName, Number(value).toFixed(2)])) - .map(indentRow), - ] - .map(line => wordWrap(line)) - .join('\n')); + console.log( + [ + `${displayName}`, + `${publisherDisplayName} | ${icons.download} ` + + `${Number(installs).toLocaleString()} installs |` + + ` ${ratingStars(averagerating)} (${ratingcount})`, + '', + `${shortDescription}`, + '', + 'Recent versions:', + ...(versionList.length ? tableView(versionList).map(indentRow) : ['no versions found']), + '', + 'Categories:', + ` ${categories.join(', ')}`, + '', + 'Tags:', + ` ${tags.filter(tag => !isExtensionTag.test(tag)).join(', ')}`, + '', + 'More info:', + ...tableView([ + ['Unique identifier:', `${publisherName}.${extensionName}`], + ['Version:', version], + ['Last updated:', formatDateTime(lastUpdated)], + ['Publisher:', publisherDisplayName], + ['Published at:', formatDate(publishedDate)], + ]).map(indentRow), + '', + 'Statistics:', + ...tableView( + statistics.map(({ statisticName, value }) => [statisticName, Number(value).toFixed(2)]) + ).map(indentRow), + ] + .map(line => wordWrap(line)) + .join('\n') + ); } diff --git a/src/store.ts b/src/store.ts index 911f5909..6edce323 100644 --- a/src/store.ts +++ b/src/store.ts @@ -25,7 +25,7 @@ export interface IGetOptions { function load(): Promise { return readFile(storePath, 'utf8') - .catch(err => err.code !== 'ENOENT' ? Promise.reject(err) : Promise.resolve('{}')) + .catch(err => (err.code !== 'ENOENT' ? Promise.reject(err) : Promise.resolve('{}'))) .then(rawStore => { try { return Promise.resolve(JSON.parse(rawStore)); @@ -40,8 +40,7 @@ function load(): Promise { } function save(store: IStore): Promise { - return writeFile(storePath, JSON.stringify(store), {mode: '0600'}) - .then(() => store); + return writeFile(storePath, JSON.stringify(store), { mode: '0600' }).then(() => store); } function addPublisherToStore(store: IStore, publisher: IPublisher): Promise { @@ -84,8 +83,9 @@ export function loginPublisher(publisherName: string): Promise { if (publisher) { console.log(`Publisher '${publisherName}' is already known`); - return read('Do you want to overwrite its PAT? [y/N] ') - .then(answer => /^y$/i.test(answer) ? store : Promise.reject('Aborted')); + return read('Do you want to overwrite its PAT? [y/N] ').then(answer => + /^y$/i.test(answer) ? store : Promise.reject('Aborted') + ); } return Promise.resolve(store); @@ -110,36 +110,37 @@ export function logoutPublisher(publisherName: string): Promise { export function createPublisher(publisherName: string): Promise { validatePublisher(publisherName); - return read(`Publisher human-friendly name: `, { default: publisherName }).then(displayName => { - return read(`E-mail: `).then(email => { - return read(`Personal Access Token:`, { silent: true, replace: '*' }) - .then(async pat => { - const api = await getGalleryAPI(pat); - const raw = { - publisherName, - displayName, - extensions: [], - flags: null, - lastUpdated: null, - longDescription: '', - publisherId: null, - shortDescription: '', - emailAddress: [email] - }; - - await api.createPublisher(raw); - return { name: publisherName, pat }; - }) - .then(publisher => load().then(store => addPublisherToStore(store, publisher))); - }); - }) + return read(`Publisher human-friendly name: `, { default: publisherName }) + .then(displayName => { + return read(`E-mail: `).then(email => { + return read(`Personal Access Token:`, { silent: true, replace: '*' }) + .then(async pat => { + const api = await getGalleryAPI(pat); + const raw = { + publisherName, + displayName, + extensions: [], + flags: null, + lastUpdated: null, + longDescription: '', + publisherId: null, + shortDescription: '', + emailAddress: [email], + }; + + await api.createPublisher(raw); + return { name: publisherName, pat }; + }) + .then(publisher => load().then(store => addPublisherToStore(store, publisher))); + }); + }) .then(() => log.done(`Created publisher '${publisherName}'.`)); } export function deletePublisher(publisherName: string): Promise { return getPublisher(publisherName).then(({ pat }) => { return read(`This will FOREVER delete '${publisherName}'! Are you sure? [y/N] `) - .then(answer => /^y$/i.test(answer) ? null : Promise.reject('Aborted')) + .then(answer => (/^y$/i.test(answer) ? null : Promise.reject('Aborted'))) .then(() => getGalleryAPI(pat)) .then(api => api.deletePublisher(publisherName)) .then(() => load().then(store => removePublisherFromStore(store, publisherName))) diff --git a/src/test/package.test.ts b/src/test/package.test.ts index f380806d..734048a5 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1,7 +1,18 @@ import { - readManifest, collect, toContentTypes, ReadmeProcessor, - read, processFiles, createDefaultProcessors, - toVsixManifest, IFile, validateManifest, isSupportedWebExtension, WebExtensionProcessor, IAsset, IPackageOptions + readManifest, + collect, + toContentTypes, + ReadmeProcessor, + read, + processFiles, + createDefaultProcessors, + toVsixManifest, + IFile, + validateManifest, + isSupportedWebExtension, + WebExtensionProcessor, + IAsset, + IPackageOptions, } from '../package'; import { Manifest } from '../manifest'; import * as path from 'path'; @@ -34,33 +45,35 @@ async function throws(fn: () => Promise): Promise { const fixture = name => path.join(path.dirname(path.dirname(__dirname)), 'src', 'test', 'fixtures', name); const readFile = denodeify(fs.readFile); -function createXMLParser(): (raw: string) => Promise { return denodeify(parseString); } +function createXMLParser(): (raw: string) => Promise { + return denodeify(parseString); +} type XMLManifest = { PackageManifest: { - $: { Version: string, xmlns: string, }, + $: { Version: string; xmlns: string }; Metadata: { - Description: { _: string; }[], - DisplayName: string[], - Identity: { $: { Id: string, Version: string, Publisher: string } }[], - Tags: string[], - GalleryFlags: string[], - License: string[], - Icon: string[], - Properties: { Property: { $: { Id: string, Value: string } }[] }[], - Categories: string[], - Badges: { Badge: { $: { Link: string, ImgUri: string, Description: string } }[] }[] - }[], - Installation: { InstallationTarget: { $: { Id: string } }[] }[] - Dependencies: string[] - Assets: { Asset: { $: { Type: string, Path: string } }[] }[] - } + Description: { _: string }[]; + DisplayName: string[]; + Identity: { $: { Id: string; Version: string; Publisher: string } }[]; + Tags: string[]; + GalleryFlags: string[]; + License: string[]; + Icon: string[]; + Properties: { Property: { $: { Id: string; Value: string } }[] }[]; + Categories: string[]; + Badges: { Badge: { $: { Link: string; ImgUri: string; Description: string } }[] }[]; + }[]; + Installation: { InstallationTarget: { $: { Id: string } }[] }[]; + Dependencies: string[]; + Assets: { Asset: { $: { Type: string; Path: string } }[] }[]; + }; }; type ContentTypes = { Types: { - Default: { $: { Extension: string, ContentType } }[] - } + Default: { $: { Extension: string; ContentType } }[]; + }; }; const parseXmlManifest = createXMLParser(); @@ -102,7 +115,7 @@ function createManifest(extra: Partial): Manifest { version: '0.0.1', description: 'test extension', engines: { vscode: '*' }, - ...extra + ...extra, }; } @@ -225,18 +238,16 @@ describe('collect', function () { }); describe('readManifest', () => { - it('should patch NLS', () => { const cwd = fixture('nls'); const raw = require(path.join(cwd, 'package.json')); const translations = require(path.join(cwd, 'package.nls.json')); - return readManifest(cwd) - .then((manifest: any) => { - assert.equal(manifest.name, raw.name); - assert.equal(manifest.description, translations['extension.description']); - assert.equal(manifest.contributes.debuggers[0].label, translations['node.label']); - }); + return readManifest(cwd).then((manifest: any) => { + assert.equal(manifest.name, raw.name); + assert.equal(manifest.description, translations['extension.description']); + assert.equal(manifest.contributes.debuggers[0].label, translations['node.label']); + }); }); it('should not patch NLS if required', () => { @@ -244,48 +255,109 @@ describe('readManifest', () => { const raw = require(path.join(cwd, 'package.json')); const translations = require(path.join(cwd, 'package.nls.json')); - return readManifest(cwd, false) - .then((manifest: any) => { - assert.equal(manifest.name, raw.name); - assert.notEqual(manifest.description, translations['extension.description']); - assert.notEqual(manifest.contributes.debuggers[0].label, translations['node.label']); - }); + return readManifest(cwd, false).then((manifest: any) => { + assert.equal(manifest.name, raw.name); + assert.notEqual(manifest.description, translations['extension.description']); + assert.notEqual(manifest.contributes.debuggers[0].label, translations['node.label']); + }); }); }); describe('validateManifest', () => { it('should catch missing fields', () => { assert(validateManifest({ publisher: 'demo', name: 'demo', version: '1.0.0', engines: { vscode: '0.10.1' } })); - assert.throws(() => { validateManifest({ publisher: null, name: 'demo', version: '1.0.0', engines: { vscode: '0.10.1' } }); }); - assert.throws(() => { validateManifest({ publisher: 'demo', name: null, version: '1.0.0', engines: { vscode: '0.10.1' } }); }); - assert.throws(() => { validateManifest({ publisher: 'demo', name: 'demo', version: null, engines: { vscode: '0.10.1' } }); }); - assert.throws(() => { validateManifest({ publisher: 'demo', name: 'demo', version: '1.0', engines: { vscode: '0.10.1' } }); }); - assert.throws(() => { validateManifest({ publisher: 'demo', name: 'demo', version: '1.0.0', engines: null }); }); - assert.throws(() => { validateManifest({ publisher: 'demo', name: 'demo', version: '1.0.0', engines: { vscode: null } }); }); + assert.throws(() => { + validateManifest({ publisher: null, name: 'demo', version: '1.0.0', engines: { vscode: '0.10.1' } }); + }); + assert.throws(() => { + validateManifest({ publisher: 'demo', name: null, version: '1.0.0', engines: { vscode: '0.10.1' } }); + }); + assert.throws(() => { + validateManifest({ publisher: 'demo', name: 'demo', version: null, engines: { vscode: '0.10.1' } }); + }); + assert.throws(() => { + validateManifest({ publisher: 'demo', name: 'demo', version: '1.0', engines: { vscode: '0.10.1' } }); + }); + assert.throws(() => { + validateManifest({ publisher: 'demo', name: 'demo', version: '1.0.0', engines: null }); + }); + assert.throws(() => { + validateManifest({ publisher: 'demo', name: 'demo', version: '1.0.0', engines: { vscode: null } }); + }); }); it('should prevent SVG icons', () => { assert(validateManifest(createManifest({ icon: 'icon.png' }))); - assert.throws(() => { validateManifest(createManifest({ icon: 'icon.svg' })); }); + assert.throws(() => { + validateManifest(createManifest({ icon: 'icon.svg' })); + }); }); it('should prevent badges from non HTTPS sources', () => { - assert.throws(() => { validateManifest(createManifest({ badges: [{ url: 'relative.png', href: 'http://badgeurl', description: 'this is a badge' }] })); }); - assert.throws(() => { validateManifest(createManifest({ badges: [{ url: 'relative.svg', href: 'http://badgeurl', description: 'this is a badge' }] })); }); - assert.throws(() => { validateManifest(createManifest({ badges: [{ url: 'http://badgeurl.png', href: 'http://badgeurl', description: 'this is a badge' }] })); }); + assert.throws(() => { + validateManifest( + createManifest({ badges: [{ url: 'relative.png', href: 'http://badgeurl', description: 'this is a badge' }] }) + ); + }); + assert.throws(() => { + validateManifest( + createManifest({ badges: [{ url: 'relative.svg', href: 'http://badgeurl', description: 'this is a badge' }] }) + ); + }); + assert.throws(() => { + validateManifest( + createManifest({ + badges: [{ url: 'http://badgeurl.png', href: 'http://badgeurl', description: 'this is a badge' }], + }) + ); + }); }); it('should allow non SVG badges', () => { - assert(validateManifest(createManifest({ badges: [{ url: 'https://host/badge.png', href: 'http://badgeurl', description: 'this is a badge' }] }))); + assert( + validateManifest( + createManifest({ + badges: [{ url: 'https://host/badge.png', href: 'http://badgeurl', description: 'this is a badge' }], + }) + ) + ); }); it('should allow SVG badges from trusted sources', () => { - assert(validateManifest(createManifest({ badges: [{ url: 'https://gemnasium.com/foo.svg', href: 'http://badgeurl', description: 'this is a badge' }] }))); + assert( + validateManifest( + createManifest({ + badges: [{ url: 'https://gemnasium.com/foo.svg', href: 'http://badgeurl', description: 'this is a badge' }], + }) + ) + ); }); it('should prevent SVG badges from non trusted sources', () => { - assert.throws(() => { assert(validateManifest(createManifest({ badges: [{ url: 'https://github.com/foo.svg', href: 'http://badgeurl', description: 'this is a badge' }] }))); }); - assert.throws(() => { assert(validateManifest(createManifest({ badges: [{ url: 'https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/410.sv%67', href: 'http://badgeurl', description: 'this is a badge' }] }))); }); + assert.throws(() => { + assert( + validateManifest( + createManifest({ + badges: [{ url: 'https://github.com/foo.svg', href: 'http://badgeurl', description: 'this is a badge' }], + }) + ) + ); + }); + assert.throws(() => { + assert( + validateManifest( + createManifest({ + badges: [ + { + url: 'https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/410.sv%67', + href: 'http://badgeurl', + description: 'this is a badge', + }, + ], + }) + ) + ); + }); }); }); @@ -296,7 +368,7 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', description: 'test extension', - engines: Object.create(null) + engines: Object.create(null), }; return _toVsixManifest(manifest, []) @@ -307,7 +379,10 @@ describe('toVsixManifest', () => { assert.ok(result.PackageManifest.$); assert.equal(result.PackageManifest.$.Version, '2.0.0'); assert.equal(result.PackageManifest.$.xmlns, 'http://schemas.microsoft.com/developer/vsx-schema/2011'); - assert.equal(result.PackageManifest.$['xmlns:d'], 'http://schemas.microsoft.com/developer/vsx-schema-design/2011'); + assert.equal( + result.PackageManifest.$['xmlns:d'], + 'http://schemas.microsoft.com/developer/vsx-schema-design/2011' + ); assert.ok(result.PackageManifest.Metadata); assert.equal(result.PackageManifest.Metadata.length, 1); assert.equal(result.PackageManifest.Metadata[0].Description[0]._, 'test extension'); @@ -328,7 +403,7 @@ describe('toVsixManifest', () => { }); }); - it("should escape special characters", () => { + it('should escape special characters', () => { const specialCharacters = '\'"<>&`'; const name = `name${specialCharacters}`; @@ -337,8 +412,11 @@ describe('toVsixManifest', () => { const description = `description${specialCharacters}`; const manifest = { - name, publisher, version, description, - engines: Object.create(null) + name, + publisher, + version, + description, + engines: Object.create(null), }; return _toVsixManifest(manifest, []) @@ -357,18 +435,19 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', description: 'test extension', - engines: Object.create(null) + engines: Object.create(null), }; - const files = [ - { path: 'extension/readme.md', contents: Buffer.from('') } - ]; + const files = [{ path: 'extension/readme.md', contents: Buffer.from('') }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) .then(result => { assert.equal(result.PackageManifest.Assets[0].Asset.length, 2); - assert.equal(result.PackageManifest.Assets[0].Asset[1].$.Type, 'Microsoft.VisualStudio.Services.Content.Details'); + assert.equal( + result.PackageManifest.Assets[0].Asset[1].$.Type, + 'Microsoft.VisualStudio.Services.Content.Details' + ); assert.equal(result.PackageManifest.Assets[0].Asset[1].$.Path, 'extension/readme.md'); }); }); @@ -379,18 +458,19 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', description: 'test extension', - engines: Object.create(null) + engines: Object.create(null), }; - const files = [ - { path: 'extension/changelog.md', contents: Buffer.from('') } - ]; + const files = [{ path: 'extension/changelog.md', contents: Buffer.from('') }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) .then(result => { assert.equal(result.PackageManifest.Assets[0].Asset.length, 2); - assert.equal(result.PackageManifest.Assets[0].Asset[1].$.Type, 'Microsoft.VisualStudio.Services.Content.Changelog'); + assert.equal( + result.PackageManifest.Assets[0].Asset[1].$.Type, + 'Microsoft.VisualStudio.Services.Content.Changelog' + ); assert.equal(result.PackageManifest.Assets[0].Asset[1].$.Path, 'extension/changelog.md'); }); }); @@ -401,7 +481,7 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', displayName: 'Test Extension', - engines: Object.create(null) + engines: Object.create(null), }; return _toVsixManifest(manifest, []) @@ -419,18 +499,19 @@ describe('toVsixManifest', () => { version: '0.0.1', description: 'test extension', license: 'SEE LICENSE IN thelicense.md', - engines: Object.create(null) + engines: Object.create(null), }; - const files = [ - { path: 'extension/thelicense.md' } - ]; + const files = [{ path: 'extension/thelicense.md' }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) .then(result => { assert.equal(result.PackageManifest.Assets[0].Asset.length, 2); - assert.equal(result.PackageManifest.Assets[0].Asset[1].$.Type, 'Microsoft.VisualStudio.Services.Content.License'); + assert.equal( + result.PackageManifest.Assets[0].Asset[1].$.Type, + 'Microsoft.VisualStudio.Services.Content.License' + ); assert.equal(result.PackageManifest.Assets[0].Asset[1].$.Path, 'extension/thelicense.md'); }); }); @@ -442,12 +523,10 @@ describe('toVsixManifest', () => { version: '0.0.1', description: 'test extension', license: 'SEE LICENSE IN thelicense.md', - engines: Object.create(null) + engines: Object.create(null), }; - const files = [ - { path: 'extension/thelicense.md' } - ]; + const files = [{ path: 'extension/thelicense.md' }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) @@ -464,12 +543,10 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', description: 'test extension', - engines: Object.create(null) + engines: Object.create(null), }; - const files = [ - { path: 'extension/LICENSE.md' } - ]; + const files = [{ path: 'extension/LICENSE.md' }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) @@ -478,7 +555,10 @@ describe('toVsixManifest', () => { assert.equal(result.PackageManifest.Metadata[0].License.length, 1); assert.equal(result.PackageManifest.Metadata[0].License[0], 'extension/LICENSE.md'); assert.equal(result.PackageManifest.Assets[0].Asset.length, 2); - assert.equal(result.PackageManifest.Assets[0].Asset[1].$.Type, 'Microsoft.VisualStudio.Services.Content.License'); + assert.equal( + result.PackageManifest.Assets[0].Asset[1].$.Type, + 'Microsoft.VisualStudio.Services.Content.License' + ); assert.equal(result.PackageManifest.Assets[0].Asset[1].$.Path, 'extension/LICENSE.md'); }); }); @@ -491,13 +571,10 @@ describe('toVsixManifest', () => { description: 'test extension', engines: Object.create(null), icon: 'fake.png', - license: 'SEE LICENSE IN thelicense.md' + license: 'SEE LICENSE IN thelicense.md', }; - const files = [ - { path: 'extension/fake.png' }, - { path: 'extension/thelicense.md' } - ]; + const files = [{ path: 'extension/fake.png' }, { path: 'extension/thelicense.md' }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) @@ -516,17 +593,19 @@ describe('toVsixManifest', () => { version: '0.0.1', description: 'test extension', engines: Object.create(null), - icon: 'fake.png' + icon: 'fake.png', }; - const files = [ - { path: 'extension/fake.png' } - ]; + const files = [{ path: 'extension/fake.png' }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) .then(result => { - assert.ok(result.PackageManifest.Assets[0].Asset.some(d => d.$.Type === 'Microsoft.VisualStudio.Services.Icons.Default' && d.$.Path === 'extension/fake.png')); + assert.ok( + result.PackageManifest.Assets[0].Asset.some( + d => d.$.Type === 'Microsoft.VisualStudio.Services.Icons.Default' && d.$.Path === 'extension/fake.png' + ) + ); }); }); @@ -538,13 +617,10 @@ describe('toVsixManifest', () => { description: 'test extension', engines: Object.create(null), icon: 'fake.png', - license: 'SEE LICENSE IN thelicense.md' + license: 'SEE LICENSE IN thelicense.md', }; - const files = [ - { path: 'extension\\fake.png' }, - { path: 'extension\\thelicense.md' } - ]; + const files = [{ path: 'extension\\fake.png' }, { path: 'extension\\thelicense.md' }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) @@ -564,16 +640,20 @@ describe('toVsixManifest', () => { engines: Object.create(null), galleryBanner: { color: '#5c2d91', - theme: 'dark' - } + theme: 'dark', + }, }; return _toVsixManifest(manifest, []) .then(xml => parseXmlManifest(xml)) .then(result => { const properties = result.PackageManifest.Metadata[0].Properties[0].Property.map(p => p.$); - assert.ok(properties.some(p => p.Id === 'Microsoft.VisualStudio.Services.Branding.Color' && p.Value === '#5c2d91')); - assert.ok(properties.some(p => p.Id === 'Microsoft.VisualStudio.Services.Branding.Theme' && p.Value === 'dark')); + assert.ok( + properties.some(p => p.Id === 'Microsoft.VisualStudio.Services.Branding.Color' && p.Value === '#5c2d91') + ); + assert.ok( + properties.some(p => p.Id === 'Microsoft.VisualStudio.Services.Branding.Theme' && p.Value === 'dark') + ); }); }); @@ -584,24 +664,54 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), repository: { - type: "git", - url: "https://server.com/Microsoft/vscode-spell-check.git" + type: 'git', + url: 'https://server.com/Microsoft/vscode-spell-check.git', }, bugs: { - url: "https://server.com/Microsoft/vscode-spell-check/issues" + url: 'https://server.com/Microsoft/vscode-spell-check/issues', }, - homepage: "https://server.com/Microsoft/vscode-spell-check", + homepage: 'https://server.com/Microsoft/vscode-spell-check', }; return _toVsixManifest(manifest, []) .then(xml => parseXmlManifest(xml)) .then(result => { const properties = result.PackageManifest.Metadata[0].Properties[0].Property.map(p => p.$); - assert.ok(properties.some(p => p.Id === 'Microsoft.VisualStudio.Services.Links.Source' && p.Value === 'https://server.com/Microsoft/vscode-spell-check.git')); - assert.ok(properties.some(p => p.Id === 'Microsoft.VisualStudio.Services.Links.Getstarted' && p.Value === 'https://server.com/Microsoft/vscode-spell-check.git')); - assert.ok(properties.some(p => p.Id === 'Microsoft.VisualStudio.Services.Links.Repository' && p.Value === 'https://server.com/Microsoft/vscode-spell-check.git')); - assert.ok(properties.some(p => p.Id === 'Microsoft.VisualStudio.Services.Links.Support' && p.Value === 'https://server.com/Microsoft/vscode-spell-check/issues')); - assert.ok(properties.some(p => p.Id === 'Microsoft.VisualStudio.Services.Links.Learn' && p.Value === 'https://server.com/Microsoft/vscode-spell-check')); + assert.ok( + properties.some( + p => + p.Id === 'Microsoft.VisualStudio.Services.Links.Source' && + p.Value === 'https://server.com/Microsoft/vscode-spell-check.git' + ) + ); + assert.ok( + properties.some( + p => + p.Id === 'Microsoft.VisualStudio.Services.Links.Getstarted' && + p.Value === 'https://server.com/Microsoft/vscode-spell-check.git' + ) + ); + assert.ok( + properties.some( + p => + p.Id === 'Microsoft.VisualStudio.Services.Links.Repository' && + p.Value === 'https://server.com/Microsoft/vscode-spell-check.git' + ) + ); + assert.ok( + properties.some( + p => + p.Id === 'Microsoft.VisualStudio.Services.Links.Support' && + p.Value === 'https://server.com/Microsoft/vscode-spell-check/issues' + ) + ); + assert.ok( + properties.some( + p => + p.Id === 'Microsoft.VisualStudio.Services.Links.Learn' && + p.Value === 'https://server.com/Microsoft/vscode-spell-check' + ) + ); }); }); @@ -612,16 +722,22 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), repository: { - type: "git", - url: "https://github.com/Microsoft/vscode-spell-check.git" - } + type: 'git', + url: 'https://github.com/Microsoft/vscode-spell-check.git', + }, }; return _toVsixManifest(manifest, []) .then(xml => parseXmlManifest(xml)) .then(result => { const properties = result.PackageManifest.Metadata[0].Properties[0].Property.map(p => p.$); - assert.ok(properties.some(p => p.Id === 'Microsoft.VisualStudio.Services.Links.GitHub' && p.Value === 'https://github.com/Microsoft/vscode-spell-check.git')); + assert.ok( + properties.some( + p => + p.Id === 'Microsoft.VisualStudio.Services.Links.GitHub' && + p.Value === 'https://github.com/Microsoft/vscode-spell-check.git' + ) + ); assert.ok(properties.every(p => p.Id !== 'Microsoft.VisualStudio.Services.Links.Repository')); }); }); @@ -632,14 +748,20 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', engines: Object.create(null), - repository: 'Microsoft/vscode-spell-check' + repository: 'Microsoft/vscode-spell-check', }; return _toVsixManifest(manifest, []) .then(xml => parseXmlManifest(xml)) .then(result => { const properties = result.PackageManifest.Metadata[0].Properties[0].Property.map(p => p.$); - assert.ok(properties.some(p => p.Id === 'Microsoft.VisualStudio.Services.Links.GitHub' && p.Value === 'https://github.com/Microsoft/vscode-spell-check.git')); + assert.ok( + properties.some( + p => + p.Id === 'Microsoft.VisualStudio.Services.Links.GitHub' && + p.Value === 'https://github.com/Microsoft/vscode-spell-check.git' + ) + ); assert.ok(properties.every(p => p.Id !== 'Microsoft.VisualStudio.Services.Links.Repository')); }); }); @@ -650,7 +772,7 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', engines: Object.create(null), - categories: ['hello', 'world'] + categories: ['hello', 'world'], }; return _toVsixManifest(manifest, []) @@ -668,7 +790,7 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', engines: Object.create(null), - preview: true + preview: true, }; return _toVsixManifest(manifest, []) @@ -685,8 +807,8 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - themes: [{ label: 'monokai', uiTheme: 'vs', path: 'monokai.tmTheme' }] - } + themes: [{ label: 'monokai', uiTheme: 'vs', path: 'monokai.tmTheme' }], + }, }; return _toVsixManifest(manifest, []) @@ -704,8 +826,8 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - themes: [] - } + themes: [], + }, }; return _toVsixManifest(manifest, []) @@ -720,8 +842,8 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - themes: [{ label: 'monokai', uiTheme: 'vs', path: 'monokai.tmTheme' }] - } + themes: [{ label: 'monokai', uiTheme: 'vs', path: 'monokai.tmTheme' }], + }, }; return _toVsixManifest(manifest, []) @@ -739,8 +861,8 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - iconThemes: [{ id: 'fakeicons', label: 'fakeicons', path: 'fake.icons' }] - } + iconThemes: [{ id: 'fakeicons', label: 'fakeicons', path: 'fake.icons' }], + }, }; return _toVsixManifest(manifest, []) @@ -758,8 +880,8 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - iconThemes: [{ id: 'fakeicons', label: 'fakeicons', path: 'fake.icons' }] - } + iconThemes: [{ id: 'fakeicons', label: 'fakeicons', path: 'fake.icons' }], + }, }; return _toVsixManifest(manifest, []) @@ -776,7 +898,7 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', engines: Object.create(null), - activationEvents: ['onLanguage:go'] + activationEvents: ['onLanguage:go'], }; return _toVsixManifest(manifest, []) @@ -791,8 +913,8 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - languages: [{ id: 'go' }] - } + languages: [{ id: 'go' }], + }, }; return _toVsixManifest(manifest, []) @@ -807,8 +929,8 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - snippets: [{ language: 'go', path: 'gosnippets.json' }] - } + snippets: [{ language: 'go', path: 'gosnippets.json' }], + }, }; return _toVsixManifest(manifest, []) @@ -822,7 +944,7 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', engines: Object.create(null), - keywords: ['theme', 'theme'] + keywords: ['theme', 'theme'], }; return _toVsixManifest(manifest, []) @@ -837,10 +959,8 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - keybindings: [ - { command: 'hello', 'key': 'ctrl+f1' } - ] - } + keybindings: [{ command: 'hello', key: 'ctrl+f1' }], + }, }; return _toVsixManifest(manifest, []) @@ -858,14 +978,16 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - debuggers: [{ - type: "node", - label: "Node Debug", - program: "./out/node/nodeDebug.js", - runtime: "node", - enableBreakpointsFor: { "languageIds": ["javascript", "javascriptreact"] } - }] - } + debuggers: [ + { + type: 'node', + label: 'Node Debug', + program: './out/node/nodeDebug.js', + runtime: 'node', + enableBreakpointsFor: { languageIds: ['javascript', 'javascriptreact'] }, + }, + ], + }, }; return _toVsixManifest(manifest, []) @@ -883,11 +1005,13 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - jsonValidation: [{ - fileMatch: ".jshintrc", - url: "http://json.schemastore.org/jshintrc" - }] - } + jsonValidation: [ + { + fileMatch: '.jshintrc', + url: 'http://json.schemastore.org/jshintrc', + }, + ], + }, }; return _toVsixManifest(manifest, []) @@ -904,16 +1028,25 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', engines: Object.create(null), - description: 'This C++ extension likes combines ftp with javascript' + description: 'This C++ extension likes combines ftp with javascript', }; return _toVsixManifest(manifest, []) .then(parseXmlManifest) .then(result => { const tags = result.PackageManifest.Metadata[0].Tags[0].split(',') as string[]; - assert(tags.some(tag => tag === 'c++'), 'detect c++'); - assert(tags.some(tag => tag === 'ftp'), 'detect ftp'); - assert(tags.some(tag => tag === 'javascript'), 'detect javascript'); + assert( + tags.some(tag => tag === 'c++'), + 'detect c++' + ); + assert( + tags.some(tag => tag === 'ftp'), + 'detect ftp' + ); + assert( + tags.some(tag => tag === 'javascript'), + 'detect javascript' + ); assert(!_.includes(tags, 'java'), "don't detect java"); }); }); @@ -925,12 +1058,14 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - grammars: [{ - language: "shellscript", - scopeName: "source.shell", - path: "./syntaxes/Shell-Unix-Bash.tmLanguage" - }] - } + grammars: [ + { + language: 'shellscript', + scopeName: 'source.shell', + path: './syntaxes/Shell-Unix-Bash.tmLanguage', + }, + ], + }, }; return _toVsixManifest(manifest, []) @@ -948,11 +1083,13 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - languages: [{ - id: 'go', - aliases: ['golang', 'google-go'] - }] - } + languages: [ + { + id: 'go', + aliases: ['golang', 'google-go'], + }, + ], + }, }; return _toVsixManifest(manifest, []) @@ -972,11 +1109,16 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - localizations: [{ - languageId: 'de', - translations: [{ id: 'vscode', path: 'fake.json' }, { id: 'vscode.go', path: 'what.json' }] - }] - } + localizations: [ + { + languageId: 'de', + translations: [ + { id: 'vscode', path: 'fake.json' }, + { id: 'vscode.go', path: 'what.json' }, + ], + }, + ], + }, }; return _toVsixManifest(manifest, []) @@ -1004,32 +1146,41 @@ describe('toVsixManifest', () => { languageName: 'German', translations: [ { id: 'vscode', path: 'de.json' }, - { id: 'vscode.go', path: 'what.json' } - ] + { id: 'vscode.go', path: 'what.json' }, + ], }, { languageId: 'pt', languageName: 'Portuguese', localizedLanguageName: 'Português', - translations: [ - { id: 'vscode', path: './translations/pt.json' } - ] - } - ] - } + translations: [{ id: 'vscode', path: './translations/pt.json' }], + }, + ], + }, }; const files = [ { path: 'extension/de.json', contents: Buffer.from('') }, - { path: 'extension/translations/pt.json', contents: Buffer.from('') } + { path: 'extension/translations/pt.json', contents: Buffer.from('') }, ]; return _toVsixManifest(manifest, files) .then(parseXmlManifest) .then(result => { const assets = result.PackageManifest.Assets[0].Asset; - assert(assets.some(asset => asset.$.Type === 'Microsoft.VisualStudio.Code.Translation.DE' && asset.$.Path === 'extension/de.json')); - assert(assets.some(asset => asset.$.Type === 'Microsoft.VisualStudio.Code.Translation.PT' && asset.$.Path === 'extension/translations/pt.json')); + assert( + assets.some( + asset => + asset.$.Type === 'Microsoft.VisualStudio.Code.Translation.DE' && asset.$.Path === 'extension/de.json' + ) + ); + assert( + assets.some( + asset => + asset.$.Type === 'Microsoft.VisualStudio.Code.Translation.PT' && + asset.$.Path === 'extension/translations/pt.json' + ) + ); const properties = result.PackageManifest.Metadata[0].Properties[0].Property; const localizedLangProp = properties.filter(p => p.$.Id === 'Microsoft.VisualStudio.Code.LocalizedLanguages'); @@ -1049,11 +1200,13 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - languages: [{ - id: 'go', - extensions: ['go', 'golang'] - }] - } + languages: [ + { + id: 'go', + extensions: ['go', 'golang'], + }, + ], + }, }; return _toVsixManifest(manifest, []) @@ -1072,11 +1225,13 @@ describe('toVsixManifest', () => { version: '0.0.1', engines: Object.create(null), contributes: { - languages: [{ - id: 'go', - extensions: ['.go'] - }] - } + languages: [ + { + id: 'go', + extensions: ['.go'], + }, + ], + }, }; return _toVsixManifest(manifest, []) @@ -1095,8 +1250,8 @@ describe('toVsixManifest', () => { engines: Object.create(null), badges: [ { url: 'http://badgeurl.png', href: 'http://badgeurl', description: 'this is a badge' }, - { url: 'http://anotherbadgeurl.png', href: 'http://anotherbadgeurl', description: 'this is another badge' } - ] + { url: 'http://anotherbadgeurl.png', href: 'http://anotherbadgeurl', description: 'this is another badge' }, + ], }; return _toVsixManifest(manifest, []) @@ -1119,19 +1274,19 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', engines: Object.create(null), - "contributes": { - "grammars": [ + contributes: { + grammars: [ { - "language": "javascript", - "scopeName": "source.js.jsx", - "path": "./syntaxes/Babel Language.json" + language: 'javascript', + scopeName: 'source.js.jsx', + path: './syntaxes/Babel Language.json', }, { - "scopeName": "source.regexp.babel", - "path": "./syntaxes/Babel Regex.json" - } - ] - } + scopeName: 'source.regexp.babel', + path: './syntaxes/Babel Regex.json', + }, + ], + }, }; return _toVsixManifest(manifest, []) @@ -1148,7 +1303,7 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', description: 'test extension', - engines: { vscode: '^1.0.0' } as any + engines: { vscode: '^1.0.0' } as any, }; return _toVsixManifest(manifest, []) @@ -1169,14 +1324,18 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', description: 'test extension', - engines: Object.create(null) + engines: Object.create(null), }; return _toVsixManifest(manifest, []) .then(parseXmlManifest) .then(result => { const properties = result.PackageManifest.Metadata[0].Properties[0].Property; - assert(properties.some(p => p.$.Id === 'Microsoft.VisualStudio.Services.GitHubFlavoredMarkdown' && p.$.Value === 'true')); + assert( + properties.some( + p => p.$.Id === 'Microsoft.VisualStudio.Services.GitHubFlavoredMarkdown' && p.$.Value === 'true' + ) + ); }); }); @@ -1187,14 +1346,18 @@ describe('toVsixManifest', () => { version: '0.0.1', description: 'test extension', markdown: 'standard' as 'standard', - engines: Object.create(null) + engines: Object.create(null), }; return _toVsixManifest(manifest, []) .then(parseXmlManifest) .then(result => { const properties = result.PackageManifest.Metadata[0].Properties[0].Property; - assert(properties.some(p => p.$.Id === 'Microsoft.VisualStudio.Services.GitHubFlavoredMarkdown' && p.$.Value === 'false')); + assert( + properties.some( + p => p.$.Id === 'Microsoft.VisualStudio.Services.GitHubFlavoredMarkdown' && p.$.Value === 'false' + ) + ); }); }); @@ -1205,14 +1368,18 @@ describe('toVsixManifest', () => { version: '0.0.1', description: 'test extension', markdown: 'wow' as any, - engines: Object.create(null) + engines: Object.create(null), }; return _toVsixManifest(manifest, []) .then(parseXmlManifest) .then(result => { const properties = result.PackageManifest.Metadata[0].Properties[0].Property; - assert(properties.some(p => p.$.Id === 'Microsoft.VisualStudio.Services.GitHubFlavoredMarkdown' && p.$.Value === 'true')); + assert( + properties.some( + p => p.$.Id === 'Microsoft.VisualStudio.Services.GitHubFlavoredMarkdown' && p.$.Value === 'true' + ) + ); }); }); @@ -1223,11 +1390,7 @@ describe('toVsixManifest', () => { version: '0.0.1', description: 'test extension', engines: Object.create(null), - extensionDependencies: [ - "foo.bar", - "foo.bar", - "monkey.hello" - ] + extensionDependencies: ['foo.bar', 'foo.bar', 'monkey.hello'], }; return _toVsixManifest(manifest, []) @@ -1250,13 +1413,10 @@ describe('toVsixManifest', () => { publisher: 'mocha', version: '0.0.1', description: 'test extension', - engines: Object.create(null) + engines: Object.create(null), }; - const files = [ - { path: 'extension/file.txt' }, - { path: 'extension/FILE.txt' }, - ]; + const files = [{ path: 'extension/file.txt' }, { path: 'extension/FILE.txt' }]; try { await _toVsixManifest(manifest, files); @@ -1273,14 +1433,18 @@ describe('toVsixManifest', () => { browser: 'browser.js', extensionKind: ['web'], }); - const files = [ - { path: 'extension/browser.js', contents: Buffer.from('') }, - ]; + const files = [{ path: 'extension/browser.js', contents: Buffer.from('') }]; - const vsixManifest = await _toVsixManifest(manifest, files, { web: true }) + const vsixManifest = await _toVsixManifest(manifest, files, { web: true }); const result = await parseXmlManifest(vsixManifest); const assets = result.PackageManifest.Assets[0].Asset; - assert(assets.some(asset => asset.$.Type === 'Microsoft.VisualStudio.Code.WebResources/extension/browser.js' && asset.$.Path === 'extension/browser.js')); + assert( + assets.some( + asset => + asset.$.Type === 'Microsoft.VisualStudio.Code.WebResources/extension/browser.js' && + asset.$.Path === 'extension/browser.js' + ) + ); const properties = result.PackageManifest.Metadata[0].Properties[0].Property; const webExtensionProps = properties.filter(p => p.$.Id === 'Microsoft.VisualStudio.Code.WebExtension'); @@ -1292,14 +1456,18 @@ describe('toVsixManifest', () => { const manifest = createManifest({ browser: 'browser.js', }); - const files = [ - { path: 'extension/browser.js', contents: Buffer.from('') }, - ]; + const files = [{ path: 'extension/browser.js', contents: Buffer.from('') }]; - const vsixManifest = await _toVsixManifest(manifest, files, { web: true }) + const vsixManifest = await _toVsixManifest(manifest, files, { web: true }); const result = await parseXmlManifest(vsixManifest); const assets = result.PackageManifest.Assets[0].Asset; - assert(assets.some(asset => asset.$.Type === 'Microsoft.VisualStudio.Code.WebResources/extension/browser.js' && asset.$.Path === 'extension/browser.js')); + assert( + assets.some( + asset => + asset.$.Type === 'Microsoft.VisualStudio.Code.WebResources/extension/browser.js' && + asset.$.Path === 'extension/browser.js' + ) + ); const properties = result.PackageManifest.Metadata[0].Properties[0].Property; const webExtensionProps = properties.filter(p => p.$.Id === 'Microsoft.VisualStudio.Code.WebExtension'); @@ -1312,11 +1480,9 @@ describe('toVsixManifest', () => { browser: 'browser.js', extensionKind: ['web'], }); - const files = [ - { path: 'extension/browser.js', contents: Buffer.from('') }, - ]; + const files = [{ path: 'extension/browser.js', contents: Buffer.from('') }]; - const vsixManifest = await _toVsixManifest(manifest, files) + const vsixManifest = await _toVsixManifest(manifest, files); const result = await parseXmlManifest(vsixManifest); const assets = result.PackageManifest.Assets[0].Asset; assert(assets.every(asset => !asset.$.Type.startsWith('Microsoft.VisualStudio.Code.WebResources'))); @@ -1330,11 +1496,9 @@ describe('toVsixManifest', () => { const manifest = createManifest({ main: 'main.js', }); - const files = [ - { path: 'extension/main.js', contents: Buffer.from('') }, - ]; + const files = [{ path: 'extension/main.js', contents: Buffer.from('') }]; - const vsixManifest = await _toVsixManifest(manifest, files, { web: true }) + const vsixManifest = await _toVsixManifest(manifest, files, { web: true }); const result = await parseXmlManifest(vsixManifest); const assets = result.PackageManifest.Assets[0].Asset; assert(assets.every(asset => !asset.$.Type.startsWith('Microsoft.VisualStudio.Code.WebResources'))); @@ -1348,11 +1512,9 @@ describe('toVsixManifest', () => { const manifest = createManifest({ extensionKind: ['ui', 'workspace', 'web'], }); - const files = [ - { path: 'extension/main.js', contents: Buffer.from('') }, - ]; + const files = [{ path: 'extension/main.js', contents: Buffer.from('') }]; - const vsixManifest = await _toVsixManifest(manifest, files, { web: true }) + const vsixManifest = await _toVsixManifest(manifest, files, { web: true }); const result = await parseXmlManifest(vsixManifest); const properties = result.PackageManifest.Metadata[0].Properties[0].Property; const extensionKindProps = properties.filter(p => p.$.Id === 'Microsoft.VisualStudio.Code.ExtensionKind'); @@ -1363,17 +1525,14 @@ describe('toVsixManifest', () => { const manifest = createManifest({ main: 'main.js', }); - const files = [ - { path: 'extension/main.js', contents: Buffer.from('') }, - ]; + const files = [{ path: 'extension/main.js', contents: Buffer.from('') }]; - const vsixManifest = await _toVsixManifest(manifest, files, { web: true }) + const vsixManifest = await _toVsixManifest(manifest, files, { web: true }); const result = await parseXmlManifest(vsixManifest); const properties = result.PackageManifest.Metadata[0].Properties[0].Property; const extensionKindProps = properties.filter(p => p.$.Id === 'Microsoft.VisualStudio.Code.ExtensionKind'); assert.equal(extensionKindProps[0].$.Value, 'workspace'); }); - }); describe('qna', () => { @@ -1382,7 +1541,7 @@ describe('qna', () => { name: 'test', publisher: 'mocha', version: '0.0.1', - engines: Object.create(null) + engines: Object.create(null), }); assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA'); @@ -1395,7 +1554,7 @@ describe('qna', () => { publisher: 'mocha', version: '0.0.1', engines: Object.create(null), - repository: 'https://github.com/username/repository' + repository: 'https://github.com/username/repository', }); assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA'); @@ -1409,7 +1568,7 @@ describe('qna', () => { version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository', - qna: 'marketplace' + qna: 'marketplace', }); assertProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA', 'true'); @@ -1422,7 +1581,7 @@ describe('qna', () => { publisher: 'mocha', version: '0.0.1', engines: Object.create(null), - qna: 'marketplace' + qna: 'marketplace', }); assertProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA', 'true'); @@ -1435,7 +1594,7 @@ describe('qna', () => { publisher: 'mocha', version: '0.0.1', engines: Object.create(null), - qna: false + qna: false, }); assertProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA', 'false'); @@ -1448,7 +1607,7 @@ describe('qna', () => { publisher: 'mocha', version: '0.0.1', engines: Object.create(null), - qna: 'http://myqna' + qna: 'http://myqna', }); assertMissingProperty(xmlManifest, 'Microsoft.VisualStudio.Services.EnableMarketplaceQnA'); @@ -1471,41 +1630,44 @@ describe('toContentTypes', () => { }); it('should include extra extensions', () => { - const files = [ - { path: 'hello.txt' }, - { path: 'hello.png' }, - { path: 'hello.md' }, - { path: 'hello' } - ]; + const files = [{ path: 'hello.txt' }, { path: 'hello.png' }, { path: 'hello.md' }, { path: 'hello' }]; return toContentTypes(files) .then(xml => parseContentTypes(xml)) .then(result => { assert.ok(result.Types.Default, 'there are content types'); - assert.ok(result.Types.Default.some(d => d.$.Extension === '.txt' && d.$.ContentType === 'text/plain'), 'there are txt'); - assert.ok(result.Types.Default.some(d => d.$.Extension === '.png' && d.$.ContentType === 'image/png'), 'there are png'); - assert.ok(result.Types.Default.some(d => d.$.Extension === '.md' && /^text\/(x-)?markdown$/.test(d.$.ContentType)), 'there are md'); + assert.ok( + result.Types.Default.some(d => d.$.Extension === '.txt' && d.$.ContentType === 'text/plain'), + 'there are txt' + ); + assert.ok( + result.Types.Default.some(d => d.$.Extension === '.png' && d.$.ContentType === 'image/png'), + 'there are png' + ); + assert.ok( + result.Types.Default.some(d => d.$.Extension === '.md' && /^text\/(x-)?markdown$/.test(d.$.ContentType)), + 'there are md' + ); assert.ok(!result.Types.Default.some(d => d.$.Extension === '')); }); }); }); describe('MarkdownProcessor', () => { - it('should throw when no baseContentUrl is provided', async () => { const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', description: 'test extension', - engines: Object.create(null) + engines: Object.create(null), }; const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', - localPath: path.join(root, 'readme.md') + localPath: path.join(root, 'readme.md'), }; let didThrow = false; @@ -1525,26 +1687,26 @@ describe('MarkdownProcessor', () => { publisher: 'mocha', version: '0.0.1', description: 'test extension', - engines: Object.create(null) + engines: Object.create(null), }; const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, { baseContentUrl: 'https://github.com/username/repository/blob/master', - baseImagesUrl: 'https://github.com/username/repository/raw/master' + baseImagesUrl: 'https://github.com/username/repository/raw/master', }); const readme = { path: 'extension/readme.md', - localPath: path.join(root, 'readme.md') + localPath: path.join(root, 'readme.md'), }; - return processor.onFile(readme) + return processor + .onFile(readme) .then(file => read(file)) .then(actual => { - return readFile(path.join(root, 'readme.expected.md'), 'utf8') - .then(expected => { - assert.equal(actual, expected); - }); + return readFile(path.join(root, 'readme.expected.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); }); }); @@ -1555,23 +1717,23 @@ describe('MarkdownProcessor', () => { version: '0.0.1', description: 'test extension', engines: Object.create(null), - repository: 'https://github.com/username/repository' + repository: 'https://github.com/username/repository', }; const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', - localPath: path.join(root, 'readme.md') + localPath: path.join(root, 'readme.md'), }; - return processor.onFile(readme) + return processor + .onFile(readme) .then(file => read(file)) .then(actual => { - return readFile(path.join(root, 'readme.expected.md'), 'utf8') - .then(expected => { - assert.equal(actual, expected); - }); + return readFile(path.join(root, 'readme.expected.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); }); }); @@ -1582,90 +1744,84 @@ describe('MarkdownProcessor', () => { version: '0.0.1', description: 'test extension', engines: Object.create(null), - repository: 'https://github.com/username/repository' + repository: 'https://github.com/username/repository', }; const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, { - githubBranch: 'main' + githubBranch: 'main', }); const readme = { path: 'extension/readme.md', - localPath: path.join(root, 'readme.md') + localPath: path.join(root, 'readme.md'), }; - return processor.onFile(readme) + return processor + .onFile(readme) .then(file => read(file)) .then(actual => { - return readFile(path.join(root, 'readme.branch.main.expected.md'), 'utf8') - .then(expected => { - assert.equal(actual, expected); - }); + return readFile(path.join(root, 'readme.branch.main.expected.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); }); }); - it("should override image URLs with baseImagesUrl while also respecting githubBranch", () => { + it('should override image URLs with baseImagesUrl while also respecting githubBranch', () => { const manifest = { - name: "test", - publisher: "mocha", - version: "0.0.1", - description: "test extension", + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', engines: Object.create(null), - repository: "https://github.com/username/repository", + repository: 'https://github.com/username/repository', }; - const root = fixture("readme"); + const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, { - githubBranch: "main", + githubBranch: 'main', // Override image relative links to point to different base URL - baseImagesUrl: "https://github.com/base", + baseImagesUrl: 'https://github.com/base', }); const readme = { - path: "extension/readme.md", - localPath: path.join(root, "readme.md"), + path: 'extension/readme.md', + localPath: path.join(root, 'readme.md'), }; return processor .onFile(readme) - .then((file) => read(file)) - .then((actual) => { - return readFile( - path.join(root, "readme.branch.override.images.expected.md"), - "utf8" - ).then((expected) => { + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.branch.override.images.expected.md'), 'utf8').then(expected => { assert.equal(actual, expected); }); }); }); - it("should override githubBranch setting with baseContentUrl", () => { + it('should override githubBranch setting with baseContentUrl', () => { const manifest = { - name: "test", - publisher: "mocha", - version: "0.0.1", - description: "test extension", + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', engines: Object.create(null), - repository: "https://github.com/username/repository", + repository: 'https://github.com/username/repository', }; - const root = fixture("readme"); + const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, { - githubBranch: "main", - baseContentUrl: "https://github.com/base", + githubBranch: 'main', + baseContentUrl: 'https://github.com/base', }); const readme = { - path: "extension/readme.md", - localPath: path.join(root, "readme.md"), + path: 'extension/readme.md', + localPath: path.join(root, 'readme.md'), }; return processor .onFile(readme) - .then((file) => read(file)) - .then((actual) => { - return readFile( - path.join(root, "readme.branch.override.content.expected.md"), - "utf8" - ).then((expected) => { + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.branch.override.content.expected.md'), 'utf8').then(expected => { assert.equal(actual, expected); }); }); @@ -1678,23 +1834,23 @@ describe('MarkdownProcessor', () => { version: '0.0.1', description: 'test extension', engines: Object.create(null), - repository: 'https://github.com/username/repository.git' + repository: 'https://github.com/username/repository.git', }; const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', - localPath: path.join(root, 'readme.md') + localPath: path.join(root, 'readme.md'), }; - return processor.onFile(readme) + return processor + .onFile(readme) .then(file => read(file)) .then(actual => { - return readFile(path.join(root, 'readme.expected.md'), 'utf8') - .then(expected => { - assert.equal(actual, expected); - }); + return readFile(path.join(root, 'readme.expected.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); }); }); @@ -1705,27 +1861,27 @@ describe('MarkdownProcessor', () => { version: '0.0.1', description: 'test extension', engines: Object.create(null), - repository: 'https://github.com/username/repository.git' + repository: 'https://github.com/username/repository.git', }; const options = { - baseImagesUrl: 'https://github.com/username/repository/path/to' + baseImagesUrl: 'https://github.com/username/repository/path/to', }; const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, options); const readme = { path: 'extension/readme.md', - localPath: path.join(root, 'readme.md') + localPath: path.join(root, 'readme.md'), }; - return processor.onFile(readme) + return processor + .onFile(readme) .then(file => read(file)) .then(actual => { - return readFile(path.join(root, 'readme.images.expected.md'), 'utf8') - .then(expected => { - assert.equal(actual, expected); - }); + return readFile(path.join(root, 'readme.images.expected.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); }); }); @@ -1736,23 +1892,23 @@ describe('MarkdownProcessor', () => { version: '0.0.1', description: 'test extension', engines: Object.create(null), - repository: 'https://github.com/username/repository.git' + repository: 'https://github.com/username/repository.git', }; const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', - localPath: path.join(root, 'readme.github.md') + localPath: path.join(root, 'readme.github.md'), }; - return processor.onFile(readme) + return processor + .onFile(readme) .then(file => read(file)) .then(actual => { - return readFile(path.join(root, 'readme.github.expected.md'), 'utf8') - .then(expected => { - assert.equal(actual, expected); - }); + return readFile(path.join(root, 'readme.github.expected.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); }); }); @@ -1763,23 +1919,23 @@ describe('MarkdownProcessor', () => { version: '0.0.1', description: 'test extension', engines: Object.create(null), - repository: 'https://github.com/username/repository.git' + repository: 'https://github.com/username/repository.git', }; const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, { expandGitHubIssueLinks: false }); const readme = { path: 'extension/readme.md', - localPath: path.join(root, 'readme.github.md') + localPath: path.join(root, 'readme.github.md'), }; - return processor.onFile(readme) + return processor + .onFile(readme) .then(file => read(file)) .then(actual => { - return readFile(path.join(root, 'readme.github.md'), 'utf8') - .then(expected => { - assert.equal(actual, expected); - }); + return readFile(path.join(root, 'readme.github.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); }); }); @@ -1790,28 +1946,34 @@ describe('MarkdownProcessor', () => { version: '0.0.1', description: 'test extension', engines: Object.create(null), - repository: 'https://some-other-provider.com/username/repository.git' + repository: 'https://some-other-provider.com/username/repository.git', }; const root = fixture('readme'); const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', - localPath: path.join(root, 'readme.github.md') + localPath: path.join(root, 'readme.github.md'), }; - return processor.onFile(readme) + return processor + .onFile(readme) .then(file => read(file)) .then(actual => { - return readFile(path.join(root, 'readme.github.md'), 'utf8') - .then(expected => { - assert.equal(actual, expected); - }); + return readFile(path.join(root, 'readme.github.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); }); }); it('should prevent non-HTTPS images', async () => { - const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; const contents = `![title](http://foo.png)`; const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', contents }; @@ -1820,7 +1982,13 @@ describe('MarkdownProcessor', () => { }); it('should prevent non-HTTPS img tags', async () => { - const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; const contents = ``; const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', contents }; @@ -1829,7 +1997,13 @@ describe('MarkdownProcessor', () => { }); it('should prevent SVGs from not trusted sources', async () => { - const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; const contents = `![title](https://foo/hello.svg)`; const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', contents }; @@ -1838,7 +2012,13 @@ describe('MarkdownProcessor', () => { }); it('should allow SVGs from trusted sources', async () => { - const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; const contents = `![title](https://badges.gitter.im/hello.svg)`; const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', contents }; @@ -1848,7 +2028,13 @@ describe('MarkdownProcessor', () => { }); it('should allow SVG from GitHub actions in image tag', async () => { - const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; const contents = `![title](https://github.com/fakeuser/fakerepo/workflows/fakeworkflowname/badge.svg)`; const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', contents }; @@ -1858,7 +2044,13 @@ describe('MarkdownProcessor', () => { }); it('should prevent SVG from a GitHub repo in image tag', async () => { - const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; const contents = `![title](https://github.com/eviluser/evilrepo/blob/master/malicious.svg)`; const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', contents }; @@ -1867,7 +2059,13 @@ describe('MarkdownProcessor', () => { }); it('should prevent SVGs from not trusted sources in img tags', async () => { - const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; const contents = ``; const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', contents }; @@ -1876,7 +2074,13 @@ describe('MarkdownProcessor', () => { }); it('should allow SVGs from trusted sources in img tags', async () => { - const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; const contents = ``; const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', contents }; @@ -1886,7 +2090,13 @@ describe('MarkdownProcessor', () => { }); it('should prevent SVG tags', async () => { - const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; const contents = ``; const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', contents }; @@ -1895,7 +2105,13 @@ describe('MarkdownProcessor', () => { }); it('should prevent SVG data urls in img tags', async () => { - const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; const contents = ``; const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', contents }; @@ -1904,17 +2120,22 @@ describe('MarkdownProcessor', () => { }); it('should catch an unchanged README.md', async () => { - const manifest = { name: 'test', publisher: 'mocha', version: '0.0.1', engines: Object.create(null), repository: 'https://github.com/username/repository' }; + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; const contents = `This is the README for your extension `; const processor = new ReadmeProcessor(manifest, {}); const readme = { path: 'extension/readme.md', contents }; await throws(() => processor.onFile(readme)); - }) + }); }); describe('isSupportedWebExtension', () => { - it('should return true if extension report has extension', () => { const manifest = createManifest({ name: 'test', publisher: 'mocha' }); const extensionReport: IExtensionsReport = { malicious: [], web: { extensions: ['mocha.test'], publishers: [] } }; @@ -1932,11 +2153,9 @@ describe('isSupportedWebExtension', () => { const extensionReport: IExtensionsReport = { malicious: [], web: { extensions: [], publishers: [] } }; assert.ok(!isSupportedWebExtension(manifest, extensionReport)); }); - }); describe('WebExtensionProcessor', () => { - it('should include file', async () => { const manifest = createManifest({ extensionKind: ['web'] }); const processor = new WebExtensionProcessor(manifest, { web: true }); @@ -1991,7 +2210,9 @@ describe('WebExtensionProcessor', () => { await processor.onFile(manifestFile); await processor.onEnd(); - const expected: IAsset[] = [{ type: `Microsoft.VisualStudio.Code.WebResources/${manifestFile.path}`, path: manifestFile.path }]; + const expected: IAsset[] = [ + { type: `Microsoft.VisualStudio.Code.WebResources/${manifestFile.path}`, path: manifestFile.path }, + ]; assert.deepEqual(processor.assets, expected); }); @@ -2080,6 +2301,4 @@ describe('WebExtensionProcessor', () => { assert.equal(processor.vsix.webExtension, undefined); assert.deepEqual(processor.tags, []); }); - - -}); \ No newline at end of file +}); diff --git a/src/test/validation.test.ts b/src/test/validation.test.ts index b98a3d9b..f7d30419 100644 --- a/src/test/validation.test.ts +++ b/src/test/validation.test.ts @@ -1,5 +1,11 @@ import * as assert from 'assert'; -import { validatePublisher, validateExtensionName, validateVersion, validateEngineCompatibility, validateVSCodeTypesCompatibility } from '../validation'; +import { + validatePublisher, + validateExtensionName, + validateVersion, + validateEngineCompatibility, + validateVSCodeTypesCompatibility, +} from '../validation'; describe('validatePublisher', () => { it('should throw with empty', () => { @@ -101,7 +107,6 @@ describe('validateEngineCompatibility', () => { }); describe('validateVSCodeTypesCompatibility', () => { - it('should validate', () => { validateVSCodeTypesCompatibility('*', '1.30.0'); validateVSCodeTypesCompatibility('*', '^1.30.0'); @@ -126,4 +131,4 @@ describe('validateVSCodeTypesCompatibility', () => { assert.throws(() => validateVSCodeTypesCompatibility('1.5', '1.30.0')); assert.throws(() => validateVSCodeTypesCompatibility('1.5', '1.30')); }); -}); \ No newline at end of file +}); diff --git a/src/util.ts b/src/util.ts index d9968cec..da791d20 100644 --- a/src/util.ts +++ b/src/util.ts @@ -67,10 +67,11 @@ export function isCancelledError(error: any) { } export class CancellationToken { - private listeners: Function[] = []; private _cancelled: boolean = false; - get isCancelled(): boolean { return this._cancelled; } + get isCancelled(): boolean { + return this._cancelled; + } subscribe(fn: Function): Function { this.listeners.push(fn); @@ -105,7 +106,7 @@ enum LogMessageType { DONE, INFO, WARNING, - ERROR + ERROR, } const LogPrefix = { @@ -135,5 +136,5 @@ export const log = { done: _log.bind(null, LogMessageType.DONE) as LogFn, info: _log.bind(null, LogMessageType.INFO) as LogFn, warn: _log.bind(null, LogMessageType.WARNING) as LogFn, - error: _log.bind(null, LogMessageType.ERROR) as LogFn -}; \ No newline at end of file + error: _log.bind(null, LogMessageType.ERROR) as LogFn, +}; diff --git a/src/validation.ts b/src/validation.ts index 3b0cec75..c16fdf83 100644 --- a/src/validation.ts +++ b/src/validation.ts @@ -5,11 +5,15 @@ const nameRegex = /^[a-z0-9][a-z0-9\-]*$/i; export function validatePublisher(publisher: string): void { if (!publisher) { - throw new Error(`Missing publisher name. Learn more: https://code.visualstudio.com/api/working-with-extensions/publishing-extension#publishing-extensions`); + throw new Error( + `Missing publisher name. Learn more: https://code.visualstudio.com/api/working-with-extensions/publishing-extension#publishing-extensions` + ); } if (!nameRegex.test(publisher)) { - throw new Error(`Invalid publisher name '${publisher}'. Expected the identifier of a publisher, not its human-friendly name. Learn more: https://code.visualstudio.com/api/working-with-extensions/publishing-extension#publishing-extensions`); + throw new Error( + `Invalid publisher name '${publisher}'. Expected the identifier of a publisher, not its human-friendly name. Learn more: https://code.visualstudio.com/api/working-with-extensions/publishing-extension#publishing-extensions` + ); } } @@ -44,7 +48,7 @@ export function validateEngineCompatibility(version: string): void { } /** - * User shouldn't use a newer version of @types/vscode than the one specified in engines.vscode + * User shouldn't use a newer version of @types/vscode than the one specified in engines.vscode */ export function validateVSCodeTypesCompatibility(engineVersion: string, typeVersion: string): void { if (engineVersion === '*') { @@ -89,7 +93,9 @@ export function validateVSCodeTypesCompatibility(engineVersion: string, typeVers } }); - const error = new Error(`@types/vscode ${typeVersion} greater than engines.vscode ${engineVersion}. Consider upgrade engines.vscode or use an older @types/vscode version`); + const error = new Error( + `@types/vscode ${typeVersion} greater than engines.vscode ${engineVersion}. Consider upgrade engines.vscode or use an older @types/vscode version` + ); if (typeMajor > engineMajor) { throw error; @@ -100,4 +106,4 @@ export function validateVSCodeTypesCompatibility(engineVersion: string, typeVers if (typeMajor === engineMajor && typeMinor === engineMinor && typePatch > enginePatch) { throw error; } -} \ No newline at end of file +} diff --git a/src/viewutils.ts b/src/viewutils.ts index 26366e6e..539dad3c 100644 --- a/src/viewutils.ts +++ b/src/viewutils.ts @@ -14,12 +14,18 @@ const columns = process.stdout.columns ? process.stdout.columns : 80; const useFallbackIcons = process.platform === 'win32'; export const icons = useFallbackIcons - ? { download: '\u{2193}', star: '\u{2665}', emptyStar: '\u{2022}', } - : { download: '\u{2913}', star: '\u{2605}', emptyStar: '\u{2606}', }; + ? { download: '\u{2193}', star: '\u{2665}', emptyStar: '\u{2022}' } + : { download: '\u{2913}', star: '\u{2605}', emptyStar: '\u{2606}' }; -export function formatDate(date) { return date.toLocaleString(fixedLocale, format.date); } -export function formatTime(date) { return date.toLocaleString(fixedLocale, format.time); } -export function formatDateTime(date) { return date.toLocaleString(fixedLocale, { ...format.date, ...format.time }); } +export function formatDate(date) { + return date.toLocaleString(fixedLocale, format.date); +} +export function formatTime(date) { + return date.toLocaleString(fixedLocale, format.time); +} +export function formatDateTime(date) { + return date.toLocaleString(fixedLocale, { ...format.date, ...format.time }); +} export function repeatString(text: string, count: number): string { let result: string = ''; @@ -36,8 +42,10 @@ export function ratingStars(rating: number, total = 5): string { export function tableView(table: ViewTable, spacing: number = 2): string[] { const maxLen = {}; - table.forEach(row => row.forEach((cell, i) => maxLen[i] = Math.max(maxLen[i] || 0, cell.length))); - return table.map(row => row.map((cell, i) => `${cell}${repeatString(' ', maxLen[i] - cell.length + spacing)}`).join('')); + table.forEach(row => row.forEach((cell, i) => (maxLen[i] = Math.max(maxLen[i] || 0, cell.length)))); + return table.map(row => + row.map((cell, i) => `${cell}${repeatString(' ', maxLen[i] - cell.length + spacing)}`).join('') + ); } export function wordWrap(text: string, width: number = columns): string { @@ -46,17 +54,21 @@ export function wordWrap(text: string, width: number = columns): string { return text .replace(/^\s+/, '') .split('') - .reduce(([out, buffer, pos], ch) => { - const nl = pos === maxWidth ? `\n${indent}` : ''; - const newPos: number = nl ? 0 : +pos + 1; - return / |-|,|\./.test(ch) ? - [`${out}${buffer}${ch}${nl}`, '', newPos] : [`${out}${nl}`, buffer + ch, newPos]; - }, [indent, '', 0]) + .reduce( + ([out, buffer, pos], ch) => { + const nl = pos === maxWidth ? `\n${indent}` : ''; + const newPos: number = nl ? 0 : +pos + 1; + return / |-|,|\./.test(ch) ? [`${out}${buffer}${ch}${nl}`, '', newPos] : [`${out}${nl}`, buffer + ch, newPos]; + }, + [indent, '', 0] + ) .slice(0, 2) .join(''); -}; +} -export function indentRow(row: string) { return ` ${row}`; }; +export function indentRow(row: string) { + return ` ${row}`; +} export function wordTrim(text: string, width: number = columns, indicator = '...') { if (text.length > width) { diff --git a/tsconfig.json b/tsconfig.json index 558af2dc..7664aa22 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,5 @@ "noUnusedLocals": true, "noUnusedParameters": true }, - "include": [ - "src" - ] -} \ No newline at end of file + "include": ["src"] +} diff --git a/yarn.lock b/yarn.lock index 258ece48..d4205b73 100644 --- a/yarn.lock +++ b/yarn.lock @@ -886,6 +886,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +prettier@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5" + integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg== + read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" @@ -1239,15 +1244,7 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yargs-parser@13.1.2, yargs-parser@^13.1.1: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^13.1.2: +yargs-parser@13.1.2, yargs-parser@^13.1.1, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== From 81b527c6450d262d21f0d90e466b2137f17553e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 18 Sep 2020 14:38:07 +0200 Subject: [PATCH 059/131] add husky, pretty-quick --- package.json | 7 + yarn.lock | 422 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 427 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a0e16e6f..8ea6bc2d 100644 --- a/package.json +++ b/package.json @@ -72,8 +72,10 @@ "@types/tmp": "^0.1.0", "@types/xml2js": "^0.4.4", "concurrently": "^5.1.0", + "husky": "^4.3.0", "mocha": "^7.1.1", "prettier": "2.1.2", + "pretty-quick": "^3.0.2", "source-map-support": "^0.4.2", "typescript": "^3.4.3", "xml2js": "^0.4.12" @@ -84,6 +86,11 @@ ], "spec": "out/test" }, + "husky": { + "hooks": { + "pre-commit": "pretty-quick --staged" + } + }, "prettier": { "useTabs": true, "printWidth": 120, diff --git a/yarn.lock b/yarn.lock index d4205b73..74f111a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,11 +2,37 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@types/cheerio@^0.22.1": version "0.22.10" resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.10.tgz#780d552467824be4a241b29510a7873a7432c4a6" integrity sha512-fOM/Jhv51iyugY7KOBZz2ThfT1gwvsGCfWxpLpZDgkGjpEO4Le9cld07OdskikLjDUQJ43dzDaVRSFwQlpdqVg== +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + "@types/denodeify@^1.2.31": version "1.2.31" resolved "https://registry.yarnpkg.com/@types/denodeify/-/denodeify-1.2.31.tgz#9a737b063bf1a8e3a63cc006cbbb0de601ce3584" @@ -61,6 +87,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.38.tgz#e05c201a668492e534b48102aca0294898f449f6" integrity sha512-EibsnbJerd0hBFaDjJStFrVbVBAtOy4dgL8zZFw0uOvPqzBAX59Ci8cgjg3+RgJIWhsB5A4c+pi+D4P9tQQh/A== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/read@^0.0.28": version "0.0.28" resolved "https://registry.yarnpkg.com/@types/read/-/read-0.0.28.tgz#cd0be409b192c6119f17e67d434f4c6e9418f1b5" @@ -105,6 +136,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" @@ -120,6 +159,21 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + azure-devops-node-api@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz#131d4e01cf12ebc6e45569b5e0c5c249e4114d6d" @@ -170,12 +224,17 @@ buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -184,6 +243,22 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + cheerio@^1.0.0-rc.1: version "1.0.0-rc.2" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" @@ -211,6 +286,11 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -227,16 +307,33 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + commander@^2.8.1: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +compare-versions@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -257,6 +354,26 @@ concurrently@^5.1.0: tree-kill "^1.2.2" yargs "^13.3.0" +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -352,6 +469,13 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + entities@^1.1.1, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -405,6 +529,21 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +execa@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" + integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -426,6 +565,21 @@ find-up@3.0.0, find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-versions@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" + integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== + dependencies: + semver-regex "^2.0.0" + flat@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" @@ -453,6 +607,13 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" @@ -482,6 +643,11 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has-symbols@^1.0.0, has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" @@ -516,6 +682,40 @@ htmlparser2@^3.9.1: inherits "^2.0.1" readable-stream "^3.0.6" +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +husky@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz#0b2ec1d66424e9219d359e26a51c58ec5278f0de" + integrity sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA== + dependencies: + chalk "^4.0.0" + ci-info "^2.0.0" + compare-versions "^3.6.0" + cosmiconfig "^7.0.0" + find-versions "^3.2.0" + opencollective-postinstall "^2.0.2" + pkg-dir "^4.2.0" + please-upgrade-node "^3.2.0" + slash "^3.0.0" + which-pm-runs "^1.0.0" + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +import-fresh@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -585,6 +785,11 @@ is-regex@^1.0.5: dependencies: has "^1.0.3" +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + is-symbol@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -597,6 +802,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -610,11 +820,21 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + linkify-it@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.1.0.tgz#c4caf38a6cd7ac2212ef3c7d2bde30a91561f9db" @@ -630,6 +850,13 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + lodash@^4.15.0, lodash@^4.17.15: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" @@ -658,11 +885,21 @@ mdurl@^1.0.1: resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -712,6 +949,11 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" +mri@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.6.tgz#49952e1044db21dbf90f6cd92bc9c9a777d415a6" + integrity sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ== + ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" @@ -722,6 +964,17 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +multimatch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" + integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -750,6 +1003,13 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -785,13 +1045,25 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +opencollective-postinstall@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -822,6 +1094,13 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -829,11 +1108,25 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -842,6 +1135,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-semver@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/parse-semver/-/parse-semver-1.1.1.tgz#9a4afd6df063dc4826f93fba4a99cf223f666cb8" @@ -861,16 +1164,31 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -886,11 +1204,45 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + prettier@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5" integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg== +pretty-quick@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.0.2.tgz#7ed460f7e43a647b1044ad8b7f41a0c8a7f1c51c" + integrity sha512-4rWOs/Ifdkg7G/YX7Xbco4jZkuXPx445KdhuMI6REnl3nXRDb9+zysb29c76R59jsJzcnkcpAaGi8D/RjAVfSQ== + dependencies: + chalk "^3.0.0" + execa "^4.0.0" + find-up "^4.1.0" + ignore "^5.1.4" + mri "^1.1.5" + multimatch "^4.0.0" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" @@ -933,6 +1285,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" @@ -957,6 +1314,16 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +semver-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== + "semver@2 || 3 || 4 || 5": version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" @@ -977,6 +1344,28 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + source-map-support@^0.4.2: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" @@ -1097,6 +1486,11 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-json-comments@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -1123,6 +1517,13 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + tmp@0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" @@ -1198,6 +1599,11 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + which@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -1205,6 +1611,13 @@ which@1.3.1: dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wide-align@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -1244,6 +1657,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +yaml@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + yargs-parser@13.1.2, yargs-parser@^13.1.1, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" From d412e3f161799af81d6fd1d3e48ddd05dcb6c5b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 18 Sep 2020 16:17:06 +0200 Subject: [PATCH 060/131] tigher types --- src/package.ts | 20 +++++++++++++++----- src/test/package.test.ts | 30 ++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/package.ts b/src/package.ts index 92df4606..15ed74c0 100644 --- a/src/package.ts +++ b/src/package.ts @@ -35,14 +35,24 @@ const contentTypesTemplatePath = path.join(resourcesPath, '[Content_Types].xml') const MinimatchOptions: minimatch.IOptions = { dot: true }; -export interface IFile { +export interface IInMemoryFile { path: string; - contents?: Buffer | string; - localPath?: string; + readonly contents: Buffer | string; +} + +export interface ILocalFile { + path: string; + readonly localPath: string; +} + +export type IFile = IInMemoryFile | ILocalFile; + +function isInMemoryFile(file: IFile): file is IInMemoryFile { + return !!(file as IInMemoryFile).contents; } export function read(file: IFile): Promise { - if (file.contents) { + if (isInMemoryFile(file)) { return Promise.resolve(file.contents).then(b => (typeof b === 'string' ? b : b.toString('utf8'))); } else { return readFile(file.localPath, 'utf8'); @@ -1094,7 +1104,7 @@ function writeVsix(files: IFile[], packagePath: string): Promise { new Promise((c, e) => { const zip = new yazl.ZipFile(); files.forEach(f => - f.contents + isInMemoryFile(f) ? zip.addBuffer(typeof f.contents === 'string' ? Buffer.from(f.contents, 'utf8') : f.contents, f.path) : zip.addFile(f.localPath, f.path) ); diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 734048a5..56a10aba 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -502,7 +502,7 @@ describe('toVsixManifest', () => { engines: Object.create(null), }; - const files = [{ path: 'extension/thelicense.md' }]; + const files = [{ path: 'extension/thelicense.md', contents: '' }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) @@ -526,7 +526,7 @@ describe('toVsixManifest', () => { engines: Object.create(null), }; - const files = [{ path: 'extension/thelicense.md' }]; + const files = [{ path: 'extension/thelicense.md', contents: '' }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) @@ -546,7 +546,7 @@ describe('toVsixManifest', () => { engines: Object.create(null), }; - const files = [{ path: 'extension/LICENSE.md' }]; + const files = [{ path: 'extension/LICENSE.md', contents: '' }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) @@ -574,7 +574,10 @@ describe('toVsixManifest', () => { license: 'SEE LICENSE IN thelicense.md', }; - const files = [{ path: 'extension/fake.png' }, { path: 'extension/thelicense.md' }]; + const files = [ + { path: 'extension/fake.png', contents: '' }, + { path: 'extension/thelicense.md', contents: '' }, + ]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) @@ -596,7 +599,7 @@ describe('toVsixManifest', () => { icon: 'fake.png', }; - const files = [{ path: 'extension/fake.png' }]; + const files = [{ path: 'extension/fake.png', contents: '' }]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) @@ -620,7 +623,10 @@ describe('toVsixManifest', () => { license: 'SEE LICENSE IN thelicense.md', }; - const files = [{ path: 'extension\\fake.png' }, { path: 'extension\\thelicense.md' }]; + const files = [ + { path: 'extension\\fake.png', contents: '' }, + { path: 'extension\\thelicense.md', contents: '' }, + ]; return _toVsixManifest(manifest, files) .then(xml => parseXmlManifest(xml)) @@ -1416,7 +1422,10 @@ describe('toVsixManifest', () => { engines: Object.create(null), }; - const files = [{ path: 'extension/file.txt' }, { path: 'extension/FILE.txt' }]; + const files = [ + { path: 'extension/file.txt', contents: '' }, + { path: 'extension/FILE.txt', contents: '' }, + ]; try { await _toVsixManifest(manifest, files); @@ -1630,7 +1639,12 @@ describe('toContentTypes', () => { }); it('should include extra extensions', () => { - const files = [{ path: 'hello.txt' }, { path: 'hello.png' }, { path: 'hello.md' }, { path: 'hello' }]; + const files = [ + { path: 'hello.txt', contents: '' }, + { path: 'hello.png', contents: '' }, + { path: 'hello.md', contents: '' }, + { path: 'hello', contents: '' }, + ]; return toContentTypes(files) .then(xml => parseContentTypes(xml)) From d688399d701a4517b77d5cd568fda66c5e273b04 Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 23 Sep 2020 08:44:29 -0700 Subject: [PATCH 061/131] support --web in vsce package --- src/main.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 36588955..1d2ff991 100644 --- a/src/main.ts +++ b/src/main.ts @@ -86,7 +86,11 @@ module.exports = function (argv: string[]): void { .option('--yarn', 'Use yarn instead of npm') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') .option('--noGitHubIssueLinking', 'Prevent automatic expansion of GitHub-style issue syntax into links') - .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking }) => + .option( + '--web', + 'Experimental flag to enable publishing web extensions. Note: This is supported only for selected extensions.' + ) + .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking, web }) => main( packageCommand({ packagePath: out, @@ -96,6 +100,7 @@ module.exports = function (argv: string[]): void { useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking, + web }) ) ); From 6cb161475cabf940494c76b678311b140295ca35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 24 Sep 2020 10:38:57 +0200 Subject: [PATCH 062/131] deprecate creating publishers --- src/store.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/store.ts b/src/store.ts index 6edce323..be0daad5 100644 --- a/src/store.ts +++ b/src/store.ts @@ -110,6 +110,10 @@ export function logoutPublisher(publisherName: string): Promise { export function createPublisher(publisherName: string): Promise { validatePublisher(publisherName); + log.warn( + 'Creating a publisher via vsce is deprecated and will be removed soon. You can create a publisher directly in the Marketplace: https://aka.ms/vscode-create-publisher' + ); + return read(`Publisher human-friendly name: `, { default: publisherName }) .then(displayName => { return read(`E-mail: `).then(email => { From e7648bff8ac58f0c21a9b859ad9c846c1a9b5560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 24 Sep 2020 10:39:34 +0200 Subject: [PATCH 063/131] 1.80.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8ea6bc2d..52e11f6a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.79.5", + "version": "1.80.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 6b1bb9216c294e6dc2e9ef3139d538db1ec87b57 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Thu, 24 Sep 2020 12:12:02 -0700 Subject: [PATCH 064/131] Adds detection for yarn, and '--no-yarn' to suppress detection --- src/main.ts | 9 ++++++--- src/npm.ts | 5 ++++- src/package.ts | 24 +++++++++++++++++------- src/test/package.test.ts | 17 +++++++++++++++++ 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/main.ts b/src/main.ts index 1d2ff991..a5731282 100644 --- a/src/main.ts +++ b/src/main.ts @@ -61,7 +61,8 @@ module.exports = function (argv: string[]): void { program .command('ls') .description('Lists all the files that will be published') - .option('--yarn', 'Use yarn instead of npm') + .option('--yarn', 'Use yarn instead of npm (default inferred from presense of yarn.lock or .yarnrc)') + .option('--no-yarn', 'Use npm instead of yarn (default inferred from lack of yarn.lock or .yarnrc)') .option( '--packagedDependencies ', 'Select packages that should be published only (includes dependencies)', @@ -83,7 +84,8 @@ module.exports = function (argv: string[]): void { ) .option('--baseContentUrl [url]', 'Prepend all relative links in README.md with this url.') .option('--baseImagesUrl [url]', 'Prepend all relative image links in README.md with this url.') - .option('--yarn', 'Use yarn instead of npm') + .option('--yarn', 'Use yarn instead of npm (default inferred from presense of yarn.lock or .yarnrc)') + .option('--no-yarn', 'Use npm instead of yarn (default inferred from lack of yarn.lock or .yarnrc)') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') .option('--noGitHubIssueLinking', 'Prevent automatic expansion of GitHub-style issue syntax into links') .option( @@ -117,7 +119,8 @@ module.exports = function (argv: string[]): void { ) .option('--baseContentUrl [url]', 'Prepend all relative links in README.md with this url.') .option('--baseImagesUrl [url]', 'Prepend all relative image links in README.md with this url.') - .option('--yarn', 'Use yarn instead of npm while packing extension files') + .option('--yarn', 'Use yarn instead of npm (default inferred from presense of yarn.lock or .yarnrc)') + .option('--no-yarn', 'Use npm instead of yarn (default inferred from lack of yarn.lock or .yarnrc)') .option('--noVerify') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') .option( diff --git a/src/npm.ts b/src/npm.ts index b5ac1ad6..f76af71a 100644 --- a/src/npm.ts +++ b/src/npm.ts @@ -181,7 +181,10 @@ async function getYarnProductionDependencies(cwd: string, packagedDependencies?: async function getYarnDependencies(cwd: string, packagedDependencies?: string[]): Promise { const result: string[] = [cwd]; - if (await new Promise(c => fs.exists(path.join(cwd, 'yarn.lock'), c))) { + // Using 'existsSync' instead of 'exists' since 'exists' is deprecated. While 'fs.existsSync' + // is a blocking IO operation, this won't affect the CLI as every code path that calls + // 'getYarnDependencies' essentially blocks the CLI anyways while waiting for `exists` to complete. + if (fs.existsSync(path.join(cwd, 'yarn.lock'))) { const deps = await getYarnProductionDependencies(cwd, packagedDependencies); const flatten = (dep: YarnDependency) => { result.push(dep.path); diff --git a/src/package.ts b/src/package.ts index 15ed74c0..e9a3e620 100644 --- a/src/package.ts +++ b/src/package.ts @@ -984,7 +984,7 @@ const defaultIgnore = [ '**/.vscode-test/**', ]; -function collectAllFiles(cwd: string, useYarn = false, dependencyEntryPoints?: string[]): Promise { +function collectAllFiles(cwd: string, useYarn = detectYarn(cwd), dependencyEntryPoints?: string[]): Promise { return getDependencies(cwd, useYarn, dependencyEntryPoints).then(deps => { const promises: Promise[] = deps.map(dep => { return glob('**', { cwd: dep, nodir: true, dot: true, ignore: 'node_modules/**' }).then(files => @@ -998,7 +998,7 @@ function collectAllFiles(cwd: string, useYarn = false, dependencyEntryPoints?: s function collectFiles( cwd: string, - useYarn = false, + useYarn = detectYarn(cwd), dependencyEntryPoints?: string[], ignoreFile?: string ): Promise { @@ -1084,7 +1084,7 @@ export function createDefaultProcessors(manifest: Manifest, options: IPackageOpt export function collect(manifest: Manifest, options: IPackageOptions = {}): Promise { const cwd = options.cwd || process.cwd(); - const useYarn = options.useYarn || false; + const useYarn = options.useYarn === undefined ? detectYarn(cwd) : options.useYarn; const packagedDependencies = options.dependencyEntryPoints || undefined; const ignoreFile = options.ignoreFile || undefined; const processors = createDefaultProcessors(manifest, options); @@ -1124,14 +1124,14 @@ function getDefaultPackageName(manifest: Manifest): string { return `${manifest.name}-${manifest.version}.vsix`; } -async function prepublish(cwd: string, manifest: Manifest, useYarn: boolean = false): Promise { +async function prepublish(cwd: string, manifest: Manifest, useYarn: boolean = detectYarn(cwd)): Promise { if (!manifest.scripts || !manifest.scripts['vscode:prepublish']) { return; } console.log(`Executing prepublish script '${useYarn ? 'yarn' : 'npm'} run vscode:prepublish'...`); - await new Promise((c, e) => { + await new Promise((c, e) => { const tool = useYarn ? 'yarn' : 'npm'; const child = cp.spawn(tool, ['run', 'vscode:prepublish'], { cwd, shell: true, stdio: 'inherit' }); child.on('exit', code => (code === 0 ? c() : e(`${tool} failed with exit code ${code}`))); @@ -1157,6 +1157,16 @@ async function getPackagePath(cwd: string, manifest: Manifest, options: IPackage } } +function detectYarn(cwd: string) { + for (const file of ["yarn.lock", ".yarnrc"]) { + if (fs.existsSync(path.join(cwd, file))) { + console.log(`Detected presense of ${file}. Using 'yarn' instead of 'npm' (to override this pass '--no-yarn' on the command line).`); + return true; + } + } + return false; +} + export async function pack(options: IPackageOptions = {}): Promise { const cwd = options.cwd || process.cwd(); @@ -1202,7 +1212,7 @@ export async function packageCommand(options: IPackageOptions = {}): Promise { @@ -1214,7 +1224,7 @@ export function listFiles( */ export function ls( cwd = process.cwd(), - useYarn = false, + useYarn = detectYarn(cwd), packagedDependencies?: string[], ignoreFile?: string ): Promise { diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 56a10aba..16b29502 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -209,6 +209,23 @@ describe('collect', function () { }); }); + it('should detect yarn', () => { + const cwd = fixture('packagedDependencies'); + + return readManifest(cwd) + .then(manifest => collect(manifest, { cwd, dependencyEntryPoints: ['isexe'] })) + .then(files => { + let seenWhich: boolean; + let seenIsexe: boolean; + files.forEach(file => { + seenWhich = file.path.indexOf('/node_modules/which/') >= 0; + seenIsexe = file.path.indexOf('/node_modules/isexe/') >= 0; + }); + assert.equal(seenWhich, false); + assert.equal(seenIsexe, true); + }); + }); + it('should include all node_modules when dependencyEntryPoints is not defined', () => { const cwd = fixture('packagedDependencies'); From 473928890fca4c5503440c0bb1ed469cadd9d6d6 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Thu, 24 Sep 2020 13:18:04 -0700 Subject: [PATCH 065/131] Bump node version in azure-pipelines.yml --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c96b30c8..d61c8119 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -7,7 +7,7 @@ trigger: steps: - task: NodeTool@0 inputs: - versionSpec: '8.x' + versionSpec: '10.x' - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 inputs: From 1ef7f26e7db30b6b92be00627301a416e963ea5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 25 Sep 2020 08:25:05 +0200 Subject: [PATCH 066/131] require node 10 --- azure-pipelines.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c96b30c8..d61c8119 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -7,7 +7,7 @@ trigger: steps: - task: NodeTool@0 inputs: - versionSpec: '8.x' + versionSpec: '10.x' - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 inputs: diff --git a/package.json b/package.json index 52e11f6a..e00330da 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "vsce": "out/vsce" }, "engines": { - "node": ">= 8" + "node": ">= 10" }, "dependencies": { "azure-devops-node-api": "^7.2.0", From 32ff62348db09e699492b0f141c0095b20a214a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 25 Sep 2020 08:37:43 +0200 Subject: [PATCH 067/131] update requirements --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e2f828a..b287d73a 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ## Requirements -- [Node.js](https://nodejs.org/en/) at least `8.x.x` +- [Node.js](https://nodejs.org/en/) at least `10.x.x` ## Usage From 9716aeebf2741399dbfd8977d3cdd8dec58ba71d Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Wed, 30 Sep 2020 15:26:16 -0700 Subject: [PATCH 068/131] PR feedback --- src/npm.ts | 37 ++++++++++++++++++++++++++++++------- src/package.ts | 32 ++++++++++++-------------------- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/npm.ts b/src/npm.ts index f76af71a..11c8a15c 100644 --- a/src/npm.ts +++ b/src/npm.ts @@ -1,9 +1,17 @@ import * as path from 'path'; import * as fs from 'fs'; +import * as denodeify from 'denodeify'; import * as cp from 'child_process'; import * as parseSemver from 'parse-semver'; import * as _ from 'lodash'; -import { CancellationToken } from './util'; +import { CancellationToken, log } from './util'; + +const stat = denodeify(fs.stat); +const exists = (file: string) => + stat(file).then( + _ => true, + _ => false + ); interface IOptions { cwd?: string; @@ -181,10 +189,7 @@ async function getYarnProductionDependencies(cwd: string, packagedDependencies?: async function getYarnDependencies(cwd: string, packagedDependencies?: string[]): Promise { const result: string[] = [cwd]; - // Using 'existsSync' instead of 'exists' since 'exists' is deprecated. While 'fs.existsSync' - // is a blocking IO operation, this won't affect the CLI as every code path that calls - // 'getYarnDependencies' essentially blocks the CLI anyways while waiting for `exists` to complete. - if (fs.existsSync(path.join(cwd, 'yarn.lock'))) { + if (await exists(path.join(cwd, 'yarn.lock'))) { const deps = await getYarnProductionDependencies(cwd, packagedDependencies); const flatten = (dep: YarnDependency) => { result.push(dep.path); @@ -196,8 +201,26 @@ async function getYarnDependencies(cwd: string, packagedDependencies?: string[]) return _.uniq(result); } -export function getDependencies(cwd: string, useYarn = false, packagedDependencies?: string[]): Promise { - return useYarn ? getYarnDependencies(cwd, packagedDependencies) : getNpmDependencies(cwd); +export async function detectYarn(cwd: string) { + for (const file of ['yarn.lock', '.yarnrc']) { + if (await exists(path.join(cwd, file))) { + log.info( + `Detected presense of ${file}. Using 'yarn' instead of 'npm' (to override this pass '--no-yarn' on the command line).` + ); + return true; + } + } + return false; +} + +export async function getDependencies( + cwd: string, + useYarn?: boolean, + packagedDependencies?: string[] +): Promise { + return (useYarn !== undefined ? useYarn : await detectYarn(cwd)) + ? await getYarnDependencies(cwd, packagedDependencies) + : await getNpmDependencies(cwd); } export function getLatestVersion(name: string, cancellationToken?: CancellationToken): Promise { diff --git a/src/package.ts b/src/package.ts index e9a3e620..3e7f76fb 100644 --- a/src/package.ts +++ b/src/package.ts @@ -21,7 +21,7 @@ import { validateEngineCompatibility, validateVSCodeTypesCompatibility, } from './validation'; -import { getDependencies } from './npm'; +import { detectYarn, getDependencies } from './npm'; import { IExtensionsReport } from './publicgalleryapi'; const readFile = denodeify(fs.readFile); @@ -984,7 +984,7 @@ const defaultIgnore = [ '**/.vscode-test/**', ]; -function collectAllFiles(cwd: string, useYarn = detectYarn(cwd), dependencyEntryPoints?: string[]): Promise { +function collectAllFiles(cwd: string, useYarn?: boolean, dependencyEntryPoints?: string[]): Promise { return getDependencies(cwd, useYarn, dependencyEntryPoints).then(deps => { const promises: Promise[] = deps.map(dep => { return glob('**', { cwd: dep, nodir: true, dot: true, ignore: 'node_modules/**' }).then(files => @@ -998,7 +998,7 @@ function collectAllFiles(cwd: string, useYarn = detectYarn(cwd), dependencyEntry function collectFiles( cwd: string, - useYarn = detectYarn(cwd), + useYarn?: boolean, dependencyEntryPoints?: string[], ignoreFile?: string ): Promise { @@ -1084,12 +1084,11 @@ export function createDefaultProcessors(manifest: Manifest, options: IPackageOpt export function collect(manifest: Manifest, options: IPackageOptions = {}): Promise { const cwd = options.cwd || process.cwd(); - const useYarn = options.useYarn === undefined ? detectYarn(cwd) : options.useYarn; const packagedDependencies = options.dependencyEntryPoints || undefined; const ignoreFile = options.ignoreFile || undefined; const processors = createDefaultProcessors(manifest, options); - return collectFiles(cwd, useYarn, packagedDependencies, ignoreFile).then(fileNames => { + return collectFiles(cwd, options.useYarn, packagedDependencies, ignoreFile).then(fileNames => { const files = fileNames.map(f => ({ path: `extension/${f}`, localPath: path.join(cwd, f) })); return processFiles(processors, files); @@ -1124,11 +1123,13 @@ function getDefaultPackageName(manifest: Manifest): string { return `${manifest.name}-${manifest.version}.vsix`; } -async function prepublish(cwd: string, manifest: Manifest, useYarn: boolean = detectYarn(cwd)): Promise { +async function prepublish(cwd: string, manifest: Manifest, useYarn?: boolean): Promise { if (!manifest.scripts || !manifest.scripts['vscode:prepublish']) { return; } + if (useYarn === undefined) useYarn = await detectYarn(cwd); + console.log(`Executing prepublish script '${useYarn ? 'yarn' : 'npm'} run vscode:prepublish'...`); await new Promise((c, e) => { @@ -1157,16 +1158,6 @@ async function getPackagePath(cwd: string, manifest: Manifest, options: IPackage } } -function detectYarn(cwd: string) { - for (const file of ["yarn.lock", ".yarnrc"]) { - if (fs.existsSync(path.join(cwd, file))) { - console.log(`Detected presense of ${file}. Using 'yarn' instead of 'npm' (to override this pass '--no-yarn' on the command line).`); - return true; - } - } - return false; -} - export async function pack(options: IPackageOptions = {}): Promise { const cwd = options.cwd || process.cwd(); @@ -1210,13 +1201,14 @@ export async function packageCommand(options: IPackageOptions = {}): Promise { - return readManifest(cwd).then(() => collectFiles(cwd, useYarn, packagedDependencies, ignoreFile)); + await readManifest(cwd); + return await collectFiles(cwd, useYarn, packagedDependencies, ignoreFile); } /** @@ -1224,7 +1216,7 @@ export function listFiles( */ export function ls( cwd = process.cwd(), - useYarn = detectYarn(cwd), + useYarn?: boolean, packagedDependencies?: string[], ignoreFile?: string ): Promise { From 6987ca525c4409f840f1d0f00501ee45a30b9ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 1 Oct 2020 12:18:07 +0200 Subject: [PATCH 069/131] Update src/package.ts --- src/package.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/package.ts b/src/package.ts index 3e7f76fb..9d0f7baa 100644 --- a/src/package.ts +++ b/src/package.ts @@ -1128,7 +1128,9 @@ async function prepublish(cwd: string, manifest: Manifest, useYarn?: boolean): P return; } - if (useYarn === undefined) useYarn = await detectYarn(cwd); + if (useYarn === undefined) { + useYarn = await detectYarn(cwd); + } console.log(`Executing prepublish script '${useYarn ? 'yarn' : 'npm'} run vscode:prepublish'...`); From 5d440b4a901b0dfc25f434dfede00eee33b0b11a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 2 Oct 2020 10:39:43 +0000 Subject: [PATCH 070/131] 1.81.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e00330da..88f0c29d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.80.0", + "version": "1.81.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 7f2ccd582c949e2a73a8dbc5174ff8f53207f120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 5 Oct 2020 11:42:08 +0200 Subject: [PATCH 071/131] update commander fixes #494 --- package.json | 2 +- src/npm.ts | 8 +++++--- yarn.lock | 8 ++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 88f0c29d..f8b60b9a 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "azure-devops-node-api": "^7.2.0", "chalk": "^2.4.2", "cheerio": "^1.0.0-rc.1", - "commander": "^2.8.1", + "commander": "^6.1.0", "denodeify": "^1.2.1", "glob": "^7.0.6", "leven": "^3.1.0", diff --git a/src/npm.ts b/src/npm.ts index 11c8a15c..d3ec89c6 100644 --- a/src/npm.ts +++ b/src/npm.ts @@ -204,9 +204,11 @@ async function getYarnDependencies(cwd: string, packagedDependencies?: string[]) export async function detectYarn(cwd: string) { for (const file of ['yarn.lock', '.yarnrc']) { if (await exists(path.join(cwd, file))) { - log.info( - `Detected presense of ${file}. Using 'yarn' instead of 'npm' (to override this pass '--no-yarn' on the command line).` - ); + if (!process.env['VSCE_TESTS']) { + log.info( + `Detected presense of ${file}. Using 'yarn' instead of 'npm' (to override this pass '--no-yarn' on the command line).` + ); + } return true; } } diff --git a/yarn.lock b/yarn.lock index 74f111a3..b71a403a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -324,10 +324,10 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -commander@^2.8.1: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +commander@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" + integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== compare-versions@^3.6.0: version "3.6.0" From b529c9f31f613874dfe41feb41fd3d5aefadc973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 5 Oct 2020 11:43:14 +0200 Subject: [PATCH 072/131] 1.81.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f8b60b9a..dd1e51a7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.81.0", + "version": "1.81.1", "description": "VSCode Extension Manager", "repository": { "type": "git", From 6f3eb18dfc6303996b005e9012e5c3a07106d19c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 6 Oct 2020 16:40:36 +0200 Subject: [PATCH 073/131] fixes #499 --- src/publish.ts | 72 ++++++++++++++++++++++++++++++-------------------- src/util.ts | 4 +++ 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/src/publish.ts b/src/publish.ts index f8bfeee7..070616cc 100644 --- a/src/publish.ts +++ b/src/publish.ts @@ -3,7 +3,7 @@ import { ExtensionQueryFlags, PublishedExtension } from 'azure-devops-node-api/i import { pack, readManifest, IPackage, isWebKind, isSupportedWebExtension } from './package'; import * as tmp from 'tmp'; import { getPublisher } from './store'; -import { getGalleryAPI, read, getPublishedUrl, log, getPublicGalleryAPI } from './util'; +import { getGalleryAPI, read, getPublishedUrl, log, getPublicGalleryAPI, getHubUrl } from './util'; import { Manifest } from './manifest'; import * as denodeify from 'denodeify'; import * as yauzl from 'yauzl'; @@ -63,37 +63,53 @@ async function _publish(packagePath: string, pat: string, manifest: Manifest): P const fullName = `${name}@${manifest.version}`; console.log(`Publishing ${fullName}...`); - return api - .getExtension(null, manifest.publisher, manifest.name, null, ExtensionQueryFlags.IncludeVersions) - .catch(err => (err.statusCode === 404 ? null : Promise.reject(err))) - .then(extension => { - if (extension && extension.versions.some(v => v.version === manifest.version)) { - return Promise.reject(`${fullName} already exists. Version number cannot be the same.`); + let extension: PublishedExtension | null = null; + + try { + try { + extension = await api.getExtension( + null, + manifest.publisher, + manifest.name, + null, + ExtensionQueryFlags.IncludeVersions + ); + } catch (err) { + if (err.statusCode !== 404) { + throw err; } + } - var promise = extension - ? api.updateExtension(undefined, packageStream, manifest.publisher, manifest.name) - : api.createExtension(undefined, packageStream); - - return promise - .catch(err => Promise.reject(err.statusCode === 409 ? `${fullName} already exists.` : err)) - .then(() => - log.done( - `Published ${fullName}\nYour extension will live at ${getPublishedUrl( - name - )} (might take a few minutes for it to show up).` - ) - ); - }) - .catch(err => { - const message = (err && err.message) || ''; - - if (/Invalid Resource/.test(message)) { - err.message = `${err.message}\n\nYou're likely using an expired Personal Access Token, please get a new PAT.\nMore info: https://aka.ms/vscodepat`; + if (extension && extension.versions.some(v => v.version === manifest.version)) { + throw new Error(`${fullName} already exists. Version number cannot be the same.`); + } + + if (extension) { + try { + await api.updateExtension(undefined, packageStream, manifest.publisher, manifest.name); + } catch (err) { + if (err.statusCode === 409) { + throw new Error(`${fullName} already exists.`); + } else { + throw err; + } } + } else { + await api.createExtension(undefined, packageStream); + } + } catch (err) { + const message = (err && err.message) || ''; - return Promise.reject(err); - }); + if (/Invalid Resource/.test(message)) { + err.message = `${err.message}\n\nYou're likely using an expired Personal Access Token, please get a new PAT.\nMore info: https://aka.ms/vscodepat`; + } + + throw err; + } + + log.info(`Extension URL (might take a few minutes): ${getPublishedUrl(name)}`); + log.info(`Hub URL: ${getHubUrl(manifest.publisher, manifest.name)}`); + log.done(`Published ${fullName}.`); } export interface IPublishOptions { diff --git a/src/util.ts b/src/util.ts index da791d20..4a0f9f4d 100644 --- a/src/util.ts +++ b/src/util.ts @@ -21,6 +21,10 @@ export function getPublishedUrl(extension: string): string { return `${marketplaceUrl}/items?itemName=${extension}`; } +export function getHubUrl(publisher: string, name: string): string { + return `${marketplaceUrl}/manage/publishers/${publisher}/extensions/${name}/hub`; +} + export async function getGalleryAPI(pat: string): Promise { // from https://github.com/Microsoft/tfs-cli/blob/master/app/exec/extension/default.ts#L287-L292 const authHandler = getBasicHandler('OAuth', pat); From 39c8c8326dd5d3202480f780d18178e9e33cc4d8 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Fri, 16 Oct 2020 22:33:24 +0530 Subject: [PATCH 074/131] fix: handle unknown args --- src/main.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main.ts b/src/main.ts index a5731282..a6437a0a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -102,7 +102,7 @@ module.exports = function (argv: string[]): void { useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking, - web + web, }) ) ); @@ -193,21 +193,17 @@ module.exports = function (argv: string[]): void { .description('search extension gallery') .action((text, { json }) => main(search(text, json))); - program.command('*', '', { noHelp: true }).action((cmd: string) => { + program.on('command:*', (cmd: string) => { program.help(help => { const availableCommands = program.commands.map(c => c._name); - const suggestion = availableCommands.find(c => leven(c, cmd) < c.length * 0.4); + const suggestion = availableCommands.find(c => leven(c, cmd[0]) < c.length * 0.4); help = `${help} -Unknown command '${cmd}'`; +Unknown command '${cmd[0]}'`; return suggestion ? `${help}, did you mean '${suggestion}'?\n` : `${help}.\n`; }); }); program.parse(argv); - - if (process.argv.length <= 2) { - program.help(); - } }; From df15d2da2054eec39fde0b0841d125f590c5d6eb Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Fri, 16 Oct 2020 22:36:24 +0530 Subject: [PATCH 075/131] refactor: use array destructuring --- src/main.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main.ts b/src/main.ts index a6437a0a..100b7fc6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -102,7 +102,7 @@ module.exports = function (argv: string[]): void { useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking, - web, + web }) ) ); @@ -193,17 +193,21 @@ module.exports = function (argv: string[]): void { .description('search extension gallery') .action((text, { json }) => main(search(text, json))); - program.on('command:*', (cmd: string) => { + program.on('command:*', ([cmd]: string) => { program.help(help => { const availableCommands = program.commands.map(c => c._name); - const suggestion = availableCommands.find(c => leven(c, cmd[0]) < c.length * 0.4); + const suggestion = availableCommands.find(c => leven(c, cmd) < c.length * 0.4); help = `${help} -Unknown command '${cmd[0]}'`; +Unknown command '${cmd}'`; return suggestion ? `${help}, did you mean '${suggestion}'?\n` : `${help}.\n`; }); }); program.parse(argv); + + if (process.argv.length <= 2) { + program.help(); + } }; From f8760253ec3208064ced6aab6d0e3461eda9aa2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 19 Oct 2020 11:01:53 +0200 Subject: [PATCH 076/131] 1.81.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dd1e51a7..9f2d314b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.81.1", + "version": "1.81.2", "description": "VSCode Extension Manager", "repository": { "type": "git", From 3ef89858ecd86b59d5926503efc661bdfc7ee7df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 30 Oct 2020 10:59:36 +0100 Subject: [PATCH 077/131] remove create-publisher command --- src/main.ts | 20 ++++++++++++-------- src/store.ts | 34 ---------------------------------- 2 files changed, 12 insertions(+), 42 deletions(-) diff --git a/src/main.ts b/src/main.ts index 100b7fc6..b8516b5b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,7 +5,7 @@ import { packageCommand, ls } from './package'; import { publish, unpublish } from './publish'; import { show } from './show'; import { search } from './search'; -import { listPublishers, createPublisher, deletePublisher, loginPublisher, logoutPublisher } from './store'; +import { listPublishers, deletePublisher, loginPublisher, logoutPublisher } from './store'; import { getLatestVersion } from './npm'; import { CancellationToken, log } from './util'; import * as semver from 'semver'; @@ -102,7 +102,7 @@ module.exports = function (argv: string[]): void { useYarn: yarn, ignoreFile, expandGitHubIssueLinks: noGitHubIssueLinking, - web + web, }) ) ); @@ -161,11 +161,6 @@ module.exports = function (argv: string[]): void { .description('List all known publishers') .action(() => main(listPublishers())); - program - .command('create-publisher ') - .description('Creates a new publisher') - .action(publisher => main(createPublisher(publisher))); - program .command('delete-publisher ') .description('Deletes a publisher') @@ -194,7 +189,15 @@ module.exports = function (argv: string[]): void { .action((text, { json }) => main(search(text, json))); program.on('command:*', ([cmd]: string) => { - program.help(help => { + if (cmd === 'create-publisher') { + log.error( + `The 'create-publisher' command is no longer available. You can create a publisher directly in the Marketplace: https://aka.ms/vscode-create-publisher` + ); + + process.exit(1); + } + + program.outputHelp(help => { const availableCommands = program.commands.map(c => c._name); const suggestion = availableCommands.find(c => leven(c, cmd) < c.length * 0.4); @@ -203,6 +206,7 @@ Unknown command '${cmd}'`; return suggestion ? `${help}, did you mean '${suggestion}'?\n` : `${help}.\n`; }); + process.exit(1); }); program.parse(argv); diff --git a/src/store.ts b/src/store.ts index be0daad5..1fc7f87b 100644 --- a/src/store.ts +++ b/src/store.ts @@ -107,40 +107,6 @@ export function logoutPublisher(publisherName: string): Promise { }); } -export function createPublisher(publisherName: string): Promise { - validatePublisher(publisherName); - - log.warn( - 'Creating a publisher via vsce is deprecated and will be removed soon. You can create a publisher directly in the Marketplace: https://aka.ms/vscode-create-publisher' - ); - - return read(`Publisher human-friendly name: `, { default: publisherName }) - .then(displayName => { - return read(`E-mail: `).then(email => { - return read(`Personal Access Token:`, { silent: true, replace: '*' }) - .then(async pat => { - const api = await getGalleryAPI(pat); - const raw = { - publisherName, - displayName, - extensions: [], - flags: null, - lastUpdated: null, - longDescription: '', - publisherId: null, - shortDescription: '', - emailAddress: [email], - }; - - await api.createPublisher(raw); - return { name: publisherName, pat }; - }) - .then(publisher => load().then(store => addPublisherToStore(store, publisher))); - }); - }) - .then(() => log.done(`Created publisher '${publisherName}'.`)); -} - export function deletePublisher(publisherName: string): Promise { return getPublisher(publisherName).then(({ pat }) => { return read(`This will FOREVER delete '${publisherName}'! Are you sure? [y/N] `) From f8869d70fc78970c8910025c66ea743d1d5e677a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 30 Oct 2020 10:59:48 +0100 Subject: [PATCH 078/131] 1.82.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9f2d314b..73b42fab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.81.2", + "version": "1.82.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From cf01d654e557073c065933e50e8489b968345a4a Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Fri, 20 Nov 2020 08:05:16 +0100 Subject: [PATCH 079/131] Ensure package.json is writable in *.vsix VSC requires the manifest file unpacked from the .vsix archive to be marked as writable (see [1]). Since generating writable artifacts is difficult in some build systems (such as Bazel), it would be helpful if vsce itself could ensure that the file mode of the manifest is correct. With this commit, the correct file mode on `package.json` is set automatically by the packaging process via a new `Processor` and yazl's `mode` argument. [1]: https://github.com/microsoft/vscode/blob/88144f6d31718288c7a2c6fb741e0646d40804cf/src/vs/platform/extensionManagement/node/extensionsScanner.ts#L144 --- src/package.ts | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/package.ts b/src/package.ts index 9d0f7baa..2b4ecf67 100644 --- a/src/package.ts +++ b/src/package.ts @@ -37,11 +37,13 @@ const MinimatchOptions: minimatch.IOptions = { dot: true }; export interface IInMemoryFile { path: string; + mode?: number; readonly contents: Buffer | string; } export interface ILocalFile { path: string; + mode?: number; readonly localPath: string; } @@ -274,6 +276,18 @@ class ManifestProcessor extends BaseProcessor { } } + async onFile(file: IFile): Promise { + const path = util.normalize(file.path); + + if (!/^extension\/package.json$/i.test(path)) { + return Promise.resolve(file); + } + + // Ensure that package.json is writable as VS Code needs to + // store metadata in the extracted file. + return { ...file, mode: 0o100644 }; + } + async onEnd(): Promise { if (typeof this.manifest.extensionKind === 'string') { util.log.warn( @@ -1104,8 +1118,10 @@ function writeVsix(files: IFile[], packagePath: string): Promise { const zip = new yazl.ZipFile(); files.forEach(f => isInMemoryFile(f) - ? zip.addBuffer(typeof f.contents === 'string' ? Buffer.from(f.contents, 'utf8') : f.contents, f.path) - : zip.addFile(f.localPath, f.path) + ? zip.addBuffer(typeof f.contents === 'string' ? Buffer.from(f.contents, 'utf8') : f.contents, f.path, { + mode: f.mode, + }) + : zip.addFile(f.localPath, f.path, { mode: f.mode }) ); zip.end(); From 98635036f479dea3ddd165c2e0f2e51647f5f6ac Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Fri, 20 Nov 2020 11:51:54 +0100 Subject: [PATCH 080/131] Test for writable package.json --- src/package.ts | 2 +- src/test/package.test.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/package.ts b/src/package.ts index 2b4ecf67..cbe0e0f6 100644 --- a/src/package.ts +++ b/src/package.ts @@ -210,7 +210,7 @@ function isHostTrusted(url: url.UrlWithStringQuery): boolean { return TrustedSVGSources.indexOf(url.host.toLowerCase()) > -1 || isGitHubBadge(url.href); } -class ManifestProcessor extends BaseProcessor { +export class ManifestProcessor extends BaseProcessor { constructor(manifest: Manifest) { super(manifest); diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 16b29502..e324aea7 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -13,6 +13,7 @@ import { WebExtensionProcessor, IAsset, IPackageOptions, + ManifestProcessor, } from '../package'; import { Manifest } from '../manifest'; import * as path from 'path'; @@ -1684,6 +1685,21 @@ describe('toContentTypes', () => { }); }); +describe('ManifestProcessor', () => { + it('should ensure that package.json is writable', async () => { + const root = fixture('uuid'); + const manifest = JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8')); + const processor = new ManifestProcessor(manifest); + const packageJson = { + path: 'extension/package.json', + localPath: path.join(root, 'package.json'), + }; + + const outPackageJson = await processor.onFile(packageJson); + assert.ok(outPackageJson.mode & 0o200); + }); +}); + describe('MarkdownProcessor', () => { it('should throw when no baseContentUrl is provided', async () => { const manifest = { From 1530b64f573b5d2ecfb53f58f13d54561181b580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 26 Nov 2020 09:21:42 +0100 Subject: [PATCH 081/131] fixes #509 --- src/package.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/package.ts b/src/package.ts index cbe0e0f6..24ac5e23 100644 --- a/src/package.ts +++ b/src/package.ts @@ -978,7 +978,6 @@ const defaultIgnore = [ '.editorconfig', '.npmrc', '.yarnrc', - '.gitattributes', '*.todo', 'tslint.yaml', '.eslintrc*', @@ -991,7 +990,9 @@ const defaultIgnore = [ '.github', '.travis.yml', 'appveyor.yml', + '**/.git', '**/.git/**', + '**/{.gitignore,.gitattributes,.gitmodules}', '**/*.vsix', '**/.DS_Store', '**/*.vsixmanifest', From 0d62e8fe9024de685f31fff2b68bd25646173d00 Mon Sep 17 00:00:00 2001 From: Matan Gover Date: Sat, 28 Nov 2020 20:34:38 +0100 Subject: [PATCH 082/131] presense -> presence --- src/main.ts | 6 +++--- src/npm.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.ts b/src/main.ts index b8516b5b..2c186724 100644 --- a/src/main.ts +++ b/src/main.ts @@ -61,7 +61,7 @@ module.exports = function (argv: string[]): void { program .command('ls') .description('Lists all the files that will be published') - .option('--yarn', 'Use yarn instead of npm (default inferred from presense of yarn.lock or .yarnrc)') + .option('--yarn', 'Use yarn instead of npm (default inferred from presence of yarn.lock or .yarnrc)') .option('--no-yarn', 'Use npm instead of yarn (default inferred from lack of yarn.lock or .yarnrc)') .option( '--packagedDependencies ', @@ -84,7 +84,7 @@ module.exports = function (argv: string[]): void { ) .option('--baseContentUrl [url]', 'Prepend all relative links in README.md with this url.') .option('--baseImagesUrl [url]', 'Prepend all relative image links in README.md with this url.') - .option('--yarn', 'Use yarn instead of npm (default inferred from presense of yarn.lock or .yarnrc)') + .option('--yarn', 'Use yarn instead of npm (default inferred from presence of yarn.lock or .yarnrc)') .option('--no-yarn', 'Use npm instead of yarn (default inferred from lack of yarn.lock or .yarnrc)') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') .option('--noGitHubIssueLinking', 'Prevent automatic expansion of GitHub-style issue syntax into links') @@ -119,7 +119,7 @@ module.exports = function (argv: string[]): void { ) .option('--baseContentUrl [url]', 'Prepend all relative links in README.md with this url.') .option('--baseImagesUrl [url]', 'Prepend all relative image links in README.md with this url.') - .option('--yarn', 'Use yarn instead of npm (default inferred from presense of yarn.lock or .yarnrc)') + .option('--yarn', 'Use yarn instead of npm (default inferred from presence of yarn.lock or .yarnrc)') .option('--no-yarn', 'Use npm instead of yarn (default inferred from lack of yarn.lock or .yarnrc)') .option('--noVerify') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') diff --git a/src/npm.ts b/src/npm.ts index d3ec89c6..d3a6a372 100644 --- a/src/npm.ts +++ b/src/npm.ts @@ -206,7 +206,7 @@ export async function detectYarn(cwd: string) { if (await exists(path.join(cwd, file))) { if (!process.env['VSCE_TESTS']) { log.info( - `Detected presense of ${file}. Using 'yarn' instead of 'npm' (to override this pass '--no-yarn' on the command line).` + `Detected presence of ${file}. Using 'yarn' instead of 'npm' (to override this pass '--no-yarn' on the command line).` ); } return true; From 79a42b5903c7c1e32a1d6c425c24170f4d3728c0 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Sun, 29 Nov 2020 20:29:53 +0530 Subject: [PATCH 083/131] chore: remove stale code --- src/main.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main.ts b/src/main.ts index b8516b5b..b19a0989 100644 --- a/src/main.ts +++ b/src/main.ts @@ -210,8 +210,4 @@ Unknown command '${cmd}'`; }); program.parse(argv); - - if (process.argv.length <= 2) { - program.help(); - } }; From ced298598a3bf748d3f8848e238e17fe4e1e847b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 30 Nov 2020 10:16:24 +0100 Subject: [PATCH 084/131] 1.83.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 73b42fab..19947be5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.82.0", + "version": "1.83.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 20378752b7931016bd43886184d623b157703639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 17 Dec 2020 20:09:51 +0100 Subject: [PATCH 085/131] empty From 402bd98ac0e222a08286eadfe03962765498f98e Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Mon, 28 Dec 2020 01:00:33 +0900 Subject: [PATCH 086/131] Fix typo in package.nls.json ommitted -> omitted --- src/test/fixtures/nls/package.nls.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/fixtures/nls/package.nls.json b/src/test/fixtures/nls/package.nls.json index 1b0b60b2..0c1390f8 100644 --- a/src/test/fixtures/nls/package.nls.json +++ b/src/test/fixtures/nls/package.nls.json @@ -18,7 +18,7 @@ "node.launch.console.description": "Where to launch the debug target: internal console, integrated terminal, or external terminal.", "node.launch.args.description": "Command line arguments passed to the program.", "node.launch.cwd.description": "Absolute path to the working directory of the program being debugged.", - "node.launch.runtimeExecutable.description": "Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If ommitted 'node' is assumed.", + "node.launch.runtimeExecutable.description": "Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted 'node' is assumed.", "node.launch.runtimeArgs.description": "Optional arguments passed to the runtime executable.", "node.launch.env.description": "Environment variables passed to the program.", @@ -44,4 +44,4 @@ "extensionHost.smartStep.description": "Automatically step through generated code that cannot be mapped back to the original source.", "extensionHost.launch.config.name": "Launch Extension" -} \ No newline at end of file +} From 44922d4269095f1d2c6a90fac76a85bdc63a7698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 19 Jan 2021 16:38:54 +0100 Subject: [PATCH 087/131] 1.84.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19947be5..c29550e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.83.0", + "version": "1.84.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 06156a87d862f81d964a01313ec66d3328b53923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 21 Jan 2021 10:52:40 +0100 Subject: [PATCH 088/131] #527 --- src/package.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/package.ts b/src/package.ts index 24ac5e23..24dd83b8 100644 --- a/src/package.ts +++ b/src/package.ts @@ -468,7 +468,7 @@ export class MarkdownProcessor extends BaseProcessor { if (isLinkRelative) { throw new Error( - `Couldn't detect the repository where this extension is published. The ${asset} '${link}' will be broken in ${this.name}. Please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.` + `Couldn't detect the repository where this extension is published. The ${asset} '${link}' will be broken in ${this.name}. GitHub repositories will be automatically detected. Otherwise, please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.` ); } } @@ -492,7 +492,7 @@ export class MarkdownProcessor extends BaseProcessor { if (!this.baseImagesUrl && isLinkRelative) { throw new Error( - `Couldn't detect the repository where this extension is published. The image will be broken in ${this.name}. Please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.` + `Couldn't detect the repository where this extension is published. The image will be broken in ${this.name}. GitHub repositories will be automatically detected. Otherwise, please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.` ); } const prefix = this.baseImagesUrl; From 24f4a24c3757751235c56a56083b64aed61aced7 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 21 Jan 2021 17:31:08 +0000 Subject: [PATCH 089/131] support for productIconThemes --- src/package.ts | 2 ++ src/test/package.test.ts | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/package.ts b/src/package.ts index 24dd83b8..22a13906 100644 --- a/src/package.ts +++ b/src/package.ts @@ -359,6 +359,7 @@ export class TagsProcessor extends BaseProcessor { const colorThemes = doesContribute('themes') ? ['theme', 'color-theme'] : []; const iconThemes = doesContribute('iconThemes') ? ['theme', 'icon-theme'] : []; + const productIconThemes = doesContribute('productIconThemes') ? ['theme', 'product-icon-theme'] : []; const snippets = doesContribute('snippets') ? ['snippet'] : []; const keybindings = doesContribute('keybindings') ? ['keybindings'] : []; const debuggers = doesContribute('debuggers') ? ['debuggers'] : []; @@ -394,6 +395,7 @@ export class TagsProcessor extends BaseProcessor { ...keywords, ...colorThemes, ...iconThemes, + ...productIconThemes, ...snippets, ...keybindings, ...debuggers, diff --git a/src/test/package.test.ts b/src/test/package.test.ts index e324aea7..e7efeef8 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -916,6 +916,25 @@ describe('toVsixManifest', () => { }); }); + it('should automatically add product-icon-theme tag', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + contributes: { + productIconThemes: [{ id: 'fakeicons', label: 'fakeicons', path: 'fake.icons' }], + }, + }; + + return _toVsixManifest(manifest, []) + .then(parseXmlManifest) + .then(result => { + const tags = result.PackageManifest.Metadata[0].Tags[0].split(',') as string[]; + assert(tags.some(tag => tag === 'product-icon-theme')); + }); + }); + it('should automatically add language tag with activationEvent', () => { const manifest = { name: 'test', From 1b8c9d697c4155ee7be83fb4d9dc6e64c51f65e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 28 Jan 2021 10:08:48 +0100 Subject: [PATCH 090/131] gallery search: exclude non validated and include latest version only --- src/search.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/search.ts b/src/search.ts index 8062bef8..826d1450 100644 --- a/src/search.ts +++ b/src/search.ts @@ -1,16 +1,15 @@ import { getPublicGalleryAPI } from './util'; -import { ExtensionQueryFilterType } from 'azure-devops-node-api/interfaces/GalleryInterfaces'; +import { ExtensionQueryFilterType, ExtensionQueryFlags } from 'azure-devops-node-api/interfaces/GalleryInterfaces'; import { tableView, wordTrim } from './viewutils'; const pageSize = 100; export async function search(searchText: string, json: boolean = false): Promise { - const flags = []; const api = getPublicGalleryAPI(); const results = await api.extensionQuery({ pageSize, criteria: [{ filterType: ExtensionQueryFilterType.SearchText, value: searchText }], - flags, + flags: [ExtensionQueryFlags.ExcludeNonValidated, ExtensionQueryFlags.IncludeLatestVersionOnly], }); if (json) { From 9f200a5ec31eee2b5e886dd202b73bcd225f1553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 29 Jan 2021 11:11:09 +0100 Subject: [PATCH 091/131] fixes #531 --- src/package.ts | 16 ++++++++++++++++ src/test/package.test.ts | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/package.ts b/src/package.ts index 22a13906..75e51ff2 100644 --- a/src/package.ts +++ b/src/package.ts @@ -880,6 +880,22 @@ export function validateManifest(manifest: Manifest): Manifest { validateEngineCompatibility(manifest.engines['vscode']); + const hasActivationEvents = !!manifest.activationEvents; + const hasMain = !!manifest.main; + const hasBrowser = !!manifest.browser; + + if (hasActivationEvents) { + if (!hasMain && !hasBrowser) { + throw new Error( + "Manifest needs either a 'main' or 'browser' property, given it has a 'activationEvents' property." + ); + } + } else if (hasMain) { + throw new Error("Manifest needs the 'activationEvents' property, given it has a 'main' property."); + } else if (hasBrowser) { + throw new Error("Manifest needs the 'activationEvents' property, given it has a 'browser' property."); + } + if (manifest.devDependencies && manifest.devDependencies['@types/vscode']) { validateVSCodeTypesCompatibility(manifest.engines['vscode'], manifest.devDependencies['@types/vscode']); } diff --git a/src/test/package.test.ts b/src/test/package.test.ts index e7efeef8..e86d5a5f 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -377,6 +377,16 @@ describe('validateManifest', () => { ); }); }); + + it('should validate activationEvents against main and browser', () => { + assert.throws(() => validateManifest(createManifest({ activationEvents: ['any'] }))); + assert.throws(() => validateManifest(createManifest({ main: 'main.js' }))); + assert.throws(() => validateManifest(createManifest({ browser: 'browser.js' }))); + assert.throws(() => validateManifest(createManifest({ main: 'main.js', browser: 'browser.js' }))); + validateManifest(createManifest({ activationEvents: ['any'], main: 'main.js' })); + validateManifest(createManifest({ activationEvents: ['any'], browser: 'browser.js' })); + validateManifest(createManifest({ activationEvents: ['any'], main: 'main.js', browser: 'browser.js' })); + }); }); describe('toVsixManifest', () => { From 7d96666d190295acbb9626c60f6c4375bf5a269d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 1 Feb 2021 10:29:44 +0100 Subject: [PATCH 092/131] 1.85.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c29550e1..6337d593 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.84.0", + "version": "1.85.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 3e356546de3bec07288ab78c77fe24966c2091dd Mon Sep 17 00:00:00 2001 From: Felipe Santos Date: Tue, 2 Feb 2021 21:54:32 -0300 Subject: [PATCH 093/131] Add verify-pat command Closes #525 --- src/main.ts | 18 ++++++++++++++++-- src/store.ts | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/main.ts b/src/main.ts index a8faa23a..79a980e5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,7 +5,7 @@ import { packageCommand, ls } from './package'; import { publish, unpublish } from './publish'; import { show } from './show'; import { search } from './search'; -import { listPublishers, deletePublisher, loginPublisher, logoutPublisher } from './store'; +import { listPublishers, deletePublisher, loginPublisher, logoutPublisher, verifyPat } from './store'; import { getLatestVersion } from './npm'; import { CancellationToken, log } from './util'; import * as semver from 'semver'; @@ -110,7 +110,11 @@ module.exports = function (argv: string[]): void { program .command('publish []') .description('Publishes an extension') - .option('-p, --pat ', 'Personal Access Token', process.env['VSCE_PAT']) + .option( + '-p, --pat ', + 'Personal Access Token (defaults to VSCE_PAT environment variable)', + process.env['VSCE_PAT'] + ) .option('-m, --message ', 'Commit message used when calling `npm version`.') .option('--packagePath [path]', 'Publish the VSIX package located at the specified path.') .option( @@ -176,6 +180,16 @@ module.exports = function (argv: string[]): void { .description('Remove a publisher from the known publishers list') .action(name => main(logoutPublisher(name))); + program + .command('verify-pat []') + .option( + '-p, --pat ', + 'Personal Access Token (defaults to VSCE_PAT environment variable)', + process.env['VSCE_PAT'] + ) + .description('Verify if the Personal Access Token has publish rights for the publisher.') + .action((name, { pat }) => main(verifyPat(pat, name))); + program .command('show ') .option('--json', 'Output data in json format', false) diff --git a/src/store.ts b/src/store.ts index 1fc7f87b..42d4eb43 100644 --- a/src/store.ts +++ b/src/store.ts @@ -4,6 +4,7 @@ import { home } from 'osenv'; import { read, getGalleryAPI, getSecurityRolesAPI, log } from './util'; import { validatePublisher } from './validation'; import * as denodeify from 'denodeify'; +import { readManifest } from './package'; const readFile = denodeify(fs.readFile); const writeFile = denodeify(fs.writeFile as any); @@ -53,14 +54,39 @@ function removePublisherFromStore(store: IStore, publisherName: string): Promise return save(store); } +export async function verifyPat(pat: string, publisherName?: string): Promise { + if (!pat) { + throw new Error('The Personal Access Token is mandatory.'); + } + + if (!publisherName) { + try { + publisherName = (await readManifest()).publisher; + } catch (error) { + throw new Error( + 'Can not read the publisher name. Either supply it as argument or call from the package root folder. Additional information:\n\n' + + error + ); + } + } + + try { + // If the caller of the `getRoleAssignments` API has any of the roles + // (Creator, Owner, Contributor, Reader) on the publisher, we get a 200, + // otherwise we get a 403. + const api = await getSecurityRolesAPI(pat); + await api.getRoleAssignments('gallery.publisher', publisherName); + } catch (error) { + throw new Error('The Personal Access Token verification has failed. Additional information:\n\n' + error); + } + + console.log(`The Personal Access Token verification succeeded for the publisher '${publisherName}'.`); +} + async function requestPAT(store: IStore, publisherName: string): Promise { const pat = await read(`Personal Access Token for publisher '${publisherName}':`, { silent: true, replace: '*' }); - // If the caller of the `getRoleAssignments` API has any of the roles - // (Creator, Owner, Contributor, Reader) on the publisher, we get a 200, - // otherwise we get a 403. - const api = await getSecurityRolesAPI(pat); - await api.getRoleAssignments('gallery.publisher', publisherName); + await verifyPat(pat, publisherName); return await addPublisherToStore(store, { name: publisherName, pat }); } From 5ba4c622a1f10114e6742f2cdeff76ad08489d97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 3 Feb 2021 09:30:26 +0100 Subject: [PATCH 094/131] Update src/store.ts --- src/store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store.ts b/src/store.ts index 42d4eb43..0e3960ed 100644 --- a/src/store.ts +++ b/src/store.ts @@ -64,7 +64,7 @@ export async function verifyPat(pat: string, publisherName?: string): Promise Date: Fri, 26 Feb 2021 15:36:57 +0100 Subject: [PATCH 095/131] upgade lodash --- yarn.lock | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index b71a403a..9318b5e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -857,11 +857,16 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash@^4.15.0, lodash@^4.17.15: +lodash@^4.15.0: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" From 0b789f6dba376bdd7c644bc6055c8b70332a659f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 26 Feb 2021 15:37:23 +0100 Subject: [PATCH 096/131] 1.85.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6337d593..2b748762 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.85.0", + "version": "1.85.1", "description": "VSCode Extension Manager", "repository": { "type": "git", From 850bae2aeb7450c4441afe851f2a0eb9fbc54a2f Mon Sep 17 00:00:00 2001 From: Felipe Santos Date: Thu, 4 Mar 2021 10:32:46 -0300 Subject: [PATCH 097/131] Use HEAD as default branch rather than master --- README.md | 4 +- src/package.ts | 2 +- src/test/fixtures/readme/readme.default.md | 48 +++++++++++++++++++ .../fixtures/readme/readme.images.expected.md | 4 +- src/test/package.test.ts | 4 +- 5 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 src/test/fixtures/readme/readme.default.md diff --git a/README.md b/README.md index b287d73a..11378aa7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ > _The Visual Studio Code Extension Manager_ -[![Build Status](https://dev.azure.com/vscode/VSCE/_apis/build/status/VSCE?branchName=master)](https://dev.azure.com/vscode/VSCE/_build/latest?definitionId=16&branchName=master) [![npm version](https://badge.fury.io/js/vsce.svg)](https://badge.fury.io/js/vsce) +[![Build Status](https://dev.azure.com/vscode/VSCE/_apis/build/status/VSCE?branchName=main)](https://dev.azure.com/vscode/VSCE/_build/latest?definitionId=16&branchName=main) [![npm version](https://badge.fury.io/js/vsce.svg)](https://badge.fury.io/js/vsce) ## Requirements @@ -10,7 +10,7 @@ ## Usage -`vsce` is meant to be mainly used as a command line tool. It can also be used a library since it exposes a small [API](https://github.com/microsoft/vscode-vsce/blob/master/src/api.ts). +`vsce` is meant to be mainly used as a command line tool. It can also be used a library since it exposes a small [API](https://github.com/microsoft/vscode-vsce/blob/main/src/api.ts). > **Warning:** When using vsce as a library be sure to sanitize any user input used in API calls, as a security measure. diff --git a/src/package.ts b/src/package.ts index 75e51ff2..2e825c99 100644 --- a/src/package.ts +++ b/src/package.ts @@ -592,7 +592,7 @@ export class MarkdownProcessor extends BaseProcessor { const account = match[1]; const repositoryName = match[2].replace(/\.git$/i, ''); - const branchName = githubBranch ? githubBranch : 'master'; + const branchName = githubBranch ? githubBranch : 'HEAD'; return { content: `https://github.com/${account}/${repositoryName}/blob/${branchName}`, diff --git a/src/test/fixtures/readme/readme.default.md b/src/test/fixtures/readme/readme.default.md new file mode 100644 index 00000000..311ed321 --- /dev/null +++ b/src/test/fixtures/readme/readme.default.md @@ -0,0 +1,48 @@ +# README + +>**Important:** Once installed the checker will only update if you add the setting `"spellMD.enable": true` to your `.vscode\settings.json` file. + +This README covers off: +* [Functionality](#functionality) +* [Install](#install) +* [Run and Configure](#run-and-configure) +* [Known Issues/Bugs](#known-issuesbugs) +* [Backlog](#backlog) +* [How to Debug](#how-to-debug) + +# Functionality + +Load up a Markdown file and get highlights and hovers for existing issues. Checking will occur as you type in the document. + +![Underscores and hovers](https://github.com/username/repository/raw/HEAD/images/SpellMDDemo1.gif) + +The status bar lets you quickly navigate to any issue and you can see all positions in the gutter. + +[![Jump to issues](https://github.com/username/repository/raw/HEAD/images/SpellMDDemo2.gif)](http://shouldnottouchthis/) +[![Jump to issues](https://github.com/username/repository/raw/HEAD/images/SpellMDDemo2.gif)](https://github.com/username/repository/blob/HEAD/monkey) +![](https://github.com/username/repository/raw/HEAD/images/SpellMDDemo2.gif) + + +The `spellMD.json` config file is watched so you can add more ignores or change mappings at will. + +![Add to dictionary](https://github.com/username/repository/raw/HEAD/images/SpellMDDemo3.gif) + +![issue](https://github.com/username/repository/raw/HEAD/issue) + +[mono](https://github.com/username/repository/blob/HEAD/monkey) +[not](http://shouldnottouchthis/) +[Email me](mailto:example@example.com) + +# Install +This extension is published in the VS Code Gallery. So simply hit 'F1' and type 'ext inst' from there select `SpellMD` and follow instructions. + + +To clone the extension and load locally... + +``` +git clone https://github.com/Microsoft/vscode-SpellMD.git +npm install +tsc +``` + +>**Note:** TypeScript 1.6 or higher is required you can check with `tsc -v` and if you need to upgrade then run `npm install -g typescript`. diff --git a/src/test/fixtures/readme/readme.images.expected.md b/src/test/fixtures/readme/readme.images.expected.md index 19dc6d7f..c0f6ec21 100644 --- a/src/test/fixtures/readme/readme.images.expected.md +++ b/src/test/fixtures/readme/readme.images.expected.md @@ -19,7 +19,7 @@ Load up a Markdown file and get highlights and hovers for existing issues. Chec The status bar lets you quickly navigate to any issue and you can see all positions in the gutter. [![Jump to issues](https://github.com/username/repository/path/to/images/SpellMDDemo2.gif)](http://shouldnottouchthis/) -[![Jump to issues](https://github.com/username/repository/path/to/images/SpellMDDemo2.gif)](https://github.com/username/repository/blob/master/monkey) +[![Jump to issues](https://github.com/username/repository/path/to/images/SpellMDDemo2.gif)](https://github.com/username/repository/blob/HEAD/monkey) ![](https://github.com/username/repository/path/to/images/SpellMDDemo2.gif) @@ -29,7 +29,7 @@ The `spellMD.json` config file is watched so you can add more ignores or change ![issue](https://github.com/username/repository/path/to/issue) -[mono](https://github.com/username/repository/blob/master/monkey) +[mono](https://github.com/username/repository/blob/HEAD/monkey) [not](http://shouldnottouchthis/) [Email me](mailto:example@example.com) diff --git a/src/test/package.test.ts b/src/test/package.test.ts index e86d5a5f..1e10ebed 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1807,7 +1807,7 @@ describe('MarkdownProcessor', () => { .onFile(readme) .then(file => read(file)) .then(actual => { - return readFile(path.join(root, 'readme.expected.md'), 'utf8').then(expected => { + return readFile(path.join(root, 'readme.default.md'), 'utf8').then(expected => { assert.equal(actual, expected); }); }); @@ -1924,7 +1924,7 @@ describe('MarkdownProcessor', () => { .onFile(readme) .then(file => read(file)) .then(actual => { - return readFile(path.join(root, 'readme.expected.md'), 'utf8').then(expected => { + return readFile(path.join(root, 'readme.default.md'), 'utf8').then(expected => { assert.equal(actual, expected); }); }); From c0e077093a7c442f8526d17a3cbd4c0a49c6267e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 5 Mar 2021 15:29:52 +0100 Subject: [PATCH 098/131] :lipstick: Docker --- .dockerignore | 6 +++++- .npmignore | 4 +++- Dockerfile | 8 ++++---- README.md | 38 +++++++++++++++++++++++++++----------- 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/.dockerignore b/.dockerignore index 2711dc52..978c0570 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,4 +3,8 @@ out/ npm-debug.log !src/test/**/node_modules package-lock.json -Dockerfile \ No newline at end of file +Dockerfile +.gitignore +LICENSE +README.md +ThirdPartyNotices.txt \ No newline at end of file diff --git a/.npmignore b/.npmignore index b5f48676..9ddb2ce1 100644 --- a/.npmignore +++ b/.npmignore @@ -9,4 +9,6 @@ yarn.lock .travis.yml .vscode/ out/**/*.d.ts -!out/api.d.ts \ No newline at end of file +!out/api.d.ts +.dockerignore +Dockerfile \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 2a111dfc..e6330543 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,10 @@ FROM node:12-alpine -VOLUME /usr/share/vsce -WORKDIR /src +WORKDIR /opt/vsce COPY package.json . COPY yarn.lock . RUN yarn COPY . . RUN yarn compile -WORKDIR /usr/share/vsce -ENTRYPOINT ["/src/out/vsce"] \ No newline at end of file +VOLUME /workspace +WORKDIR /workspace +ENTRYPOINT ["/opt/vsce/out/vsce"] \ No newline at end of file diff --git a/README.md b/README.md index 87b5d6e6..bc71e979 100644 --- a/README.md +++ b/README.md @@ -6,30 +6,46 @@ ## Requirements -- [Node.js](https://nodejs.org/en/) at least `8.x.x` or -- [Docker](https://docker.com/) +- [Node.js](https://nodejs.org/en/) at least `8.x.x` -## Usage +Or simply [Docker](#via-docker). -`vsce` is meant to be mainly used as a command line tool. It can also be used a library since it exposes a small [API](https://github.com/microsoft/vscode-vsce/blob/master/src/api.ts). +## Usage -> **Warning:** When using vsce as a library be sure to sanitize any user input used in API calls, as a security measurement. +Install vsce globally: -### via Node.js +```sh +npm install -g vsce +``` -To install vsce globally, you can use the following command: +Verify the installation: ```sh -npm install -g vsce +vsce --version ``` -### via Docker +`vsce` is meant to be mainly used as a command line tool. It can also be used a library since it exposes a small [API](https://github.com/microsoft/vscode-vsce/blob/master/src/api.ts). When using vsce as a library be sure to sanitize any user input used in API calls, as a security measurement. -To build your own Docker image, first clone this repository and then run the following commands: +## Usage via Docker + +You can also build a container for running vsce: ```sh +git clone https://github.com/microsoft/vscode-vsce +cd vscode-vsce docker build -t vsce . -docker run -it -v /host/path/extension:/usr/share/vsce vsce # change /host/path/extension to your actual vsce extension path +``` + +Validate the container: + +```sh +docker run -it vsce --version +``` + +Publish your local extension: + +```sh +docker run -it -v $(pwd):/workspace vsce publish ``` ## Development From 26d1acf7bbb22f3d378600a2566d80c6a1babe62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 10 Mar 2021 14:47:09 +0100 Subject: [PATCH 099/131] 1.86.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2b748762..55c33316 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.85.1", + "version": "1.86.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 88c77f5d4b4c9d0ce0c9820799325c44b4922e87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 10 Mar 2021 05:49:15 -0800 Subject: [PATCH 100/131] Create SECURITY.md --- SECURITY.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..a050f362 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). + + From 83163ed09e26b2218832f60acbe7aad215c77a02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 12 Mar 2021 10:11:34 +0100 Subject: [PATCH 101/131] fixes #542 --- src/main.ts | 6 +++--- src/package.ts | 27 +++++++++++++-------------- src/test/package.test.ts | 2 +- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/main.ts b/src/main.ts index 79a980e5..8215a8cd 100644 --- a/src/main.ts +++ b/src/main.ts @@ -87,12 +87,12 @@ module.exports = function (argv: string[]): void { .option('--yarn', 'Use yarn instead of npm (default inferred from presence of yarn.lock or .yarnrc)') .option('--no-yarn', 'Use npm instead of yarn (default inferred from lack of yarn.lock or .yarnrc)') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') - .option('--noGitHubIssueLinking', 'Prevent automatic expansion of GitHub-style issue syntax into links') + .option('--no-gitHubIssueLinking', 'Disable automatic expansion of GitHub-style issue syntax into links') .option( '--web', 'Experimental flag to enable publishing web extensions. Note: This is supported only for selected extensions.' ) - .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, noGitHubIssueLinking, web }) => + .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, gitHubIssueLinking, web }) => main( packageCommand({ packagePath: out, @@ -101,7 +101,7 @@ module.exports = function (argv: string[]): void { baseImagesUrl, useYarn: yarn, ignoreFile, - expandGitHubIssueLinks: noGitHubIssueLinking, + gitHubIssueLinking, web, }) ) diff --git a/src/package.ts b/src/package.ts index 2e825c99..0b35d858 100644 --- a/src/package.ts +++ b/src/package.ts @@ -76,16 +76,16 @@ export interface IAsset { } export interface IPackageOptions { - cwd?: string; - packagePath?: string; - githubBranch?: string; - baseContentUrl?: string; - baseImagesUrl?: string; - useYarn?: boolean; - dependencyEntryPoints?: string[]; - ignoreFile?: string; - expandGitHubIssueLinks?: boolean; - web?: boolean; + readonly cwd?: string; + readonly packagePath?: string; + readonly githubBranch?: string; + readonly baseContentUrl?: string; + readonly baseImagesUrl?: string; + readonly useYarn?: boolean; + readonly dependencyEntryPoints?: string[]; + readonly ignoreFile?: string; + readonly gitHubIssueLinking?: boolean; + readonly web?: boolean; } export interface IProcessor { @@ -421,7 +421,7 @@ export class MarkdownProcessor extends BaseProcessor { private baseImagesUrl: string; private isGitHub: boolean; private repositoryUrl: string; - private expandGitHubIssueLinks: boolean; + private gitHubIssueLinking: boolean; constructor( manifest: Manifest, @@ -438,8 +438,7 @@ export class MarkdownProcessor extends BaseProcessor { this.baseImagesUrl = options.baseImagesUrl || options.baseContentUrl || (guess && guess.images); this.repositoryUrl = guess && guess.repository; this.isGitHub = isGitHubRepository(this.repositoryUrl); - this.expandGitHubIssueLinks = - typeof options.expandGitHubIssueLinks === 'boolean' ? options.expandGitHubIssueLinks : true; + this.gitHubIssueLinking = typeof options.gitHubIssueLinking === 'boolean' ? options.gitHubIssueLinking : true; } async onFile(file: IFile): Promise { @@ -506,7 +505,7 @@ export class MarkdownProcessor extends BaseProcessor { return all.replace(link, urljoin(prefix, link)); }); - if (this.isGitHub && this.expandGitHubIssueLinks) { + if (this.gitHubIssueLinking && this.isGitHub) { const markdownIssueRegex = /(\s|\n)([\w\d_-]+\/[\w\d_-]+)?#(\d+)\b/g; const issueReplace = ( all: string, diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 1e10ebed..957f35b0 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1999,7 +1999,7 @@ describe('MarkdownProcessor', () => { }; const root = fixture('readme'); - const processor = new ReadmeProcessor(manifest, { expandGitHubIssueLinks: false }); + const processor = new ReadmeProcessor(manifest, { gitHubIssueLinking: false }); const readme = { path: 'extension/readme.md', localPath: path.join(root, 'readme.github.md'), From e55275a757b1125a42db014f0da365aa18d9403e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 12 Mar 2021 10:12:25 +0100 Subject: [PATCH 102/131] 1.87.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 55c33316..0e157bc3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.86.0", + "version": "1.87.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From e06fee16dc78949f92e0746c6204f08740b41016 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Fri, 12 Mar 2021 17:21:28 +0530 Subject: [PATCH 103/131] chore: improve error message --- src/store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store.ts b/src/store.ts index 0e3960ed..1ec2035d 100644 --- a/src/store.ts +++ b/src/store.ts @@ -64,7 +64,7 @@ export async function verifyPat(pat: string, publisherName?: string): Promise Date: Fri, 12 Mar 2021 17:24:21 +0530 Subject: [PATCH 104/131] refactor: leverage template literals --- src/store.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/store.ts b/src/store.ts index 1ec2035d..52640d85 100644 --- a/src/store.ts +++ b/src/store.ts @@ -64,8 +64,7 @@ export async function verifyPat(pat: string, publisherName?: string): Promise Date: Tue, 30 Mar 2021 15:28:49 +0000 Subject: [PATCH 105/131] Bump y18n from 4.0.0 to 4.0.1 Bumps [y18n](https://github.com/yargs/y18n) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/commits) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9318b5e9..4c773a3c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1658,9 +1658,9 @@ xmlbuilder@~9.0.1: integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== yaml@^1.10.0: version "1.10.0" From a2275de1c54fd197d5d88202d59f187578966abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 31 Mar 2021 14:27:59 +0200 Subject: [PATCH 106/131] add footer --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1b294e6a..aac7cd01 100644 --- a/README.md +++ b/README.md @@ -77,3 +77,5 @@ git push --follow-tags This tool assists in packaging and publishing Visual Studio Code extensions. Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. + +Microsoft \ No newline at end of file From 4f8d7e84c8798c393aa6d88a463b9d565c5b4b22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 31 Mar 2021 14:29:13 +0200 Subject: [PATCH 107/131] remove footer --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index aac7cd01..fa1bc867 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,4 @@ git push --follow-tags This tool assists in packaging and publishing Visual Studio Code extensions. -Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. - -Microsoft \ No newline at end of file +Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. \ No newline at end of file From 05b3a2770dd7711efa6fb932a7846decc08f3454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 31 Mar 2021 16:24:37 +0200 Subject: [PATCH 108/131] Revert "fixes #509" This reverts commit 1530b64f573b5d2ecfb53f58f13d54561181b580. --- src/package.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/package.ts b/src/package.ts index 0b35d858..1029436e 100644 --- a/src/package.ts +++ b/src/package.ts @@ -995,6 +995,7 @@ const defaultIgnore = [ '.editorconfig', '.npmrc', '.yarnrc', + '.gitattributes', '*.todo', 'tslint.yaml', '.eslintrc*', @@ -1007,9 +1008,7 @@ const defaultIgnore = [ '.github', '.travis.yml', 'appveyor.yml', - '**/.git', '**/.git/**', - '**/{.gitignore,.gitattributes,.gitmodules}', '**/*.vsix', '**/.DS_Store', '**/*.vsixmanifest', From f0cc23c5c7c8ef2e539da302e688639f6ef348a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 31 Mar 2021 16:24:50 +0200 Subject: [PATCH 109/131] 1.87.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0e157bc3..e18b7491 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.87.0", + "version": "1.87.1", "description": "VSCode Extension Manager", "repository": { "type": "git", From be59ca2de6f5f8564020b3c575580ecff6c49cef Mon Sep 17 00:00:00 2001 From: Felipe Santos Date: Fri, 9 Apr 2021 00:57:56 +0000 Subject: [PATCH 110/131] Do not ignore README.md --- src/package.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/package.ts b/src/package.ts index 1029436e..d6b04f46 100644 --- a/src/package.ts +++ b/src/package.ts @@ -1015,6 +1015,8 @@ const defaultIgnore = [ '**/.vscode-test/**', ]; +const notIgnored = ['!package.json', '!README.md']; + function collectAllFiles(cwd: string, useYarn?: boolean, dependencyEntryPoints?: string[]): Promise { return getDependencies(cwd, useYarn, dependencyEntryPoints).then(deps => { const promises: Promise[] = deps.map(dep => { @@ -1058,7 +1060,7 @@ function collectFiles( ]) // Combine with default ignore list - .then(ignore => [...defaultIgnore, ...ignore, '!package.json']) + .then(ignore => [...defaultIgnore, ...ignore, ...notIgnored]) // Split into ignore and negate list .then(ignore => _.partition(ignore, i => !/^\s*!/.test(i))) From fcdfb1f4b69a1efa5aef71965137f23e974bb36c Mon Sep 17 00:00:00 2001 From: Felipe Santos Date: Tue, 13 Apr 2021 09:58:58 -0300 Subject: [PATCH 111/131] Add npm-shrinkwrap and webpack config to ignore list --- src/package.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/package.ts b/src/package.ts index d6b04f46..a99eb5ed 100644 --- a/src/package.ts +++ b/src/package.ts @@ -992,6 +992,7 @@ const defaultIgnore = [ '.vscodeignore', 'package-lock.json', 'yarn.lock', + 'npm-shrinkwrap.json', '.editorconfig', '.npmrc', '.yarnrc', @@ -1001,6 +1002,7 @@ const defaultIgnore = [ '.eslintrc*', '.babelrc*', '.prettierrc', + 'webpack.config.js', 'ISSUE_TEMPLATE.md', 'CONTRIBUTING.md', 'PULL_REQUEST_TEMPLATE.md', From 8e5ff166014b1e550456e851cf915251c12b2c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 19 Apr 2021 14:46:52 +0200 Subject: [PATCH 112/131] update deps --- package.json | 4 +-- yarn.lock | 86 +++++++++++++++++++++++++++++++++++----------------- 2 files changed, 61 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index e18b7491..e4e15e20 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "node": ">= 10" }, "dependencies": { - "azure-devops-node-api": "^7.2.0", + "azure-devops-node-api": "^10.2.2", "chalk": "^2.4.2", "cheerio": "^1.0.0-rc.1", "commander": "^6.1.0", @@ -52,7 +52,7 @@ "read": "^1.0.7", "semver": "^5.1.0", "tmp": "0.0.29", - "typed-rest-client": "1.2.0", + "typed-rest-client": "^1.8.4", "url-join": "^1.1.0", "yauzl": "^2.3.1", "yazl": "^2.2.2" diff --git a/yarn.lock b/yarn.lock index 4c773a3c..75d7baec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -174,15 +174,13 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -azure-devops-node-api@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz#131d4e01cf12ebc6e45569b5e0c5c249e4114d6d" - integrity sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w== +azure-devops-node-api@^10.2.2: + version "10.2.2" + resolved "https://registry.yarnpkg.com/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz#9f557e622dd07bbaa9bd5e7e84e17c761e2151b2" + integrity sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow== dependencies: - os "0.1.1" - tunnel "0.0.4" - typed-rest-client "1.2.0" - underscore "1.8.3" + tunnel "0.0.6" + typed-rest-client "^1.8.4" balanced-match@^1.0.0: version "1.0.0" @@ -224,6 +222,14 @@ buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -607,6 +613,15 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-stream@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -1027,6 +1042,11 @@ object-inspect@^1.7.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.9.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30" + integrity sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA== + object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -1079,11 +1099,6 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -os@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/os/-/os-0.1.1.tgz#208845e89e193ad4d971474b93947736a56d13f3" - integrity sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M= - osenv@^0.1.3: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" @@ -1248,6 +1263,13 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +qs@^6.9.1: + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + dependencies: + side-channel "^1.0.4" + read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" @@ -1361,6 +1383,15 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -1553,18 +1584,19 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== -tunnel@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.4.tgz#2d3785a158c174c9a16dc2c046ec5fc5f1742213" - integrity sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM= +tunnel@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== -typed-rest-client@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.2.0.tgz#723085d203f38d7d147271e5ed3a75488eb44a02" - integrity sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw== +typed-rest-client@^1.8.4: + version "1.8.4" + resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.8.4.tgz#ba3fb788e5b9322547406392533f12d660a5ced6" + integrity sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg== dependencies: - tunnel "0.0.4" - underscore "1.8.3" + qs "^6.9.1" + tunnel "0.0.6" + underscore "^1.12.1" typescript@^3.4.3: version "3.4.3" @@ -1576,10 +1608,10 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== -underscore@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= +underscore@^1.12.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" + integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== url-join@^1.1.0: version "1.1.0" From 06c8d3be7ea3d3f39ac58a54cde9a6c59726305b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 20 Apr 2021 14:20:18 +0200 Subject: [PATCH 113/131] test --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fa1bc867..aac7cd01 100644 --- a/README.md +++ b/README.md @@ -76,4 +76,6 @@ git push --follow-tags This tool assists in packaging and publishing Visual Studio Code extensions. -Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. \ No newline at end of file +Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. + +Microsoft \ No newline at end of file From 7e1dd2db973ff37a69d1310dc5964122ff0fec46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 20 Apr 2021 14:20:44 +0200 Subject: [PATCH 114/131] revert --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index aac7cd01..fa1bc867 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,4 @@ git push --follow-tags This tool assists in packaging and publishing Visual Studio Code extensions. -Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. - -Microsoft \ No newline at end of file +Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. \ No newline at end of file From ad2cdcd3d1560a574666a0e9a3387d642e1e0183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 28 Apr 2021 09:20:18 +0200 Subject: [PATCH 115/131] test commit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fa1bc867..c59695c6 100644 --- a/README.md +++ b/README.md @@ -76,4 +76,6 @@ git push --follow-tags This tool assists in packaging and publishing Visual Studio Code extensions. -Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. \ No newline at end of file +Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. + +Microsoft 2021 \ No newline at end of file From 635e84987d3c938cd4610a13e000ecf2e1fdcb6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 28 Apr 2021 09:23:21 +0200 Subject: [PATCH 116/131] revert --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index c59695c6..fa1bc867 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,4 @@ git push --follow-tags This tool assists in packaging and publishing Visual Studio Code extensions. -Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. - -Microsoft 2021 \ No newline at end of file +Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. \ No newline at end of file From 62a80dc514b20866271d021528d8184641dfb6f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 30 Apr 2021 10:42:32 +0200 Subject: [PATCH 117/131] add copyright --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fa1bc867..be23da85 100644 --- a/README.md +++ b/README.md @@ -76,4 +76,6 @@ git push --follow-tags This tool assists in packaging and publishing Visual Studio Code extensions. -Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. \ No newline at end of file +Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. + +Microsoft 2020 \ No newline at end of file From 94477176795eae5af0d8ce4cc706825b62aa9d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 30 Apr 2021 10:43:16 +0200 Subject: [PATCH 118/131] remote footer --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index be23da85..fa1bc867 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,4 @@ git push --follow-tags This tool assists in packaging and publishing Visual Studio Code extensions. -Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. - -Microsoft 2020 \ No newline at end of file +Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. \ No newline at end of file From c1db3cc98a5283b27ee7c35cfedd642590182166 Mon Sep 17 00:00:00 2001 From: Abhijit Hota Date: Fri, 30 Apr 2021 17:43:28 +0530 Subject: [PATCH 119/131] update regex to support repository shorthand (#561) --- src/package.ts | 6 +++--- src/test/package.test.ts | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/package.ts b/src/package.ts index a99eb5ed..65964589 100644 --- a/src/package.ts +++ b/src/package.ts @@ -582,15 +582,15 @@ export class MarkdownProcessor extends BaseProcessor { return null; } - const regex = /github\.com\/([^/]+)\/([^/]+)(\/|$)/; + const regex = /github(\.com\/|:)([^/]+)\/([^/]+)(\/|$)/; const match = regex.exec(repository); if (!match) { return null; } - const account = match[1]; - const repositoryName = match[2].replace(/\.git$/i, ''); + const account = match[2]; + const repositoryName = match[3].replace(/\.git$/i, ''); const branchName = githubBranch ? githubBranch : 'HEAD'; return { diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 957f35b0..c8812461 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1930,6 +1930,33 @@ describe('MarkdownProcessor', () => { }); }); + it('should infer baseContentUrl if its a github repo (short format)', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', + engines: Object.create(null), + repository: 'github:username/repository', + }; + + const root = fixture('readme'); + const processor = new ReadmeProcessor(manifest, {}); + const readme = { + path: 'extension/readme.md', + localPath: path.join(root, 'readme.md'), + }; + + return processor + .onFile(readme) + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.default.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); + }); + }); + it('should replace img urls with baseImagesUrl', () => { const manifest = { name: 'test', From b0c820449b7df5e34d0ebc5bd80cb3a6ecc90ea0 Mon Sep 17 00:00:00 2001 From: Ethan Reesor Date: Fri, 30 Apr 2021 06:34:22 -0600 Subject: [PATCH 120/131] Add support for GitLab.com (#558) --- src/main.ts | 64 +++-- src/package.ts | 64 +++-- src/publish.ts | 4 +- .../readme.gitlab.branch.main.expected.md | 48 ++++ ...gitlab.branch.override.content.expected.md | 48 ++++ ....gitlab.branch.override.images.expected.md | 48 ++++ .../fixtures/readme/readme.gitlab.default.md | 48 ++++ .../fixtures/readme/readme.gitlab.expected.md | 15 ++ src/test/fixtures/readme/readme.gitlab.md | 15 ++ src/test/package.test.ts | 225 ++++++++++++++++++ 10 files changed, 547 insertions(+), 32 deletions(-) create mode 100644 src/test/fixtures/readme/readme.gitlab.branch.main.expected.md create mode 100644 src/test/fixtures/readme/readme.gitlab.branch.override.content.expected.md create mode 100644 src/test/fixtures/readme/readme.gitlab.branch.override.images.expected.md create mode 100644 src/test/fixtures/readme/readme.gitlab.default.md create mode 100644 src/test/fixtures/readme/readme.gitlab.expected.md create mode 100644 src/test/fixtures/readme/readme.gitlab.md diff --git a/src/main.ts b/src/main.ts index 8215a8cd..dafa2a06 100644 --- a/src/main.ts +++ b/src/main.ts @@ -82,29 +82,48 @@ module.exports = function (argv: string[]): void { '--githubBranch [branch]', 'The GitHub branch used to infer relative links in README.md. Can be overriden by --baseContentUrl and --baseImagesUrl.' ) + .option( + '--gitlabBranch [branch]', + 'The GitLab branch used to infer relative links in README.md. Can be overriden by --baseContentUrl and --baseImagesUrl.' + ) .option('--baseContentUrl [url]', 'Prepend all relative links in README.md with this url.') .option('--baseImagesUrl [url]', 'Prepend all relative image links in README.md with this url.') .option('--yarn', 'Use yarn instead of npm (default inferred from presence of yarn.lock or .yarnrc)') .option('--no-yarn', 'Use npm instead of yarn (default inferred from lack of yarn.lock or .yarnrc)') .option('--ignoreFile [path]', 'Indicate alternative .vscodeignore') .option('--no-gitHubIssueLinking', 'Disable automatic expansion of GitHub-style issue syntax into links') + .option('--no-gitLabIssueLinking', 'Disable automatic expansion of GitLab-style issue syntax into links') .option( '--web', 'Experimental flag to enable publishing web extensions. Note: This is supported only for selected extensions.' ) - .action(({ out, githubBranch, baseContentUrl, baseImagesUrl, yarn, ignoreFile, gitHubIssueLinking, web }) => - main( - packageCommand({ - packagePath: out, - githubBranch, - baseContentUrl, - baseImagesUrl, - useYarn: yarn, - ignoreFile, - gitHubIssueLinking, - web, - }) - ) + .action( + ({ + out, + githubBranch, + gitlabBranch, + baseContentUrl, + baseImagesUrl, + yarn, + ignoreFile, + gitHubIssueLinking, + gitLabIssueLinking, + web, + }) => + main( + packageCommand({ + packagePath: out, + githubBranch, + gitlabBranch, + baseContentUrl, + baseImagesUrl, + useYarn: yarn, + ignoreFile, + gitHubIssueLinking, + gitLabIssueLinking, + web, + }) + ) ); program @@ -121,6 +140,10 @@ module.exports = function (argv: string[]): void { '--githubBranch [branch]', 'The GitHub branch used to infer relative links in README.md. Can be overriden by --baseContentUrl and --baseImagesUrl.' ) + .option( + '--gitlabBranch [branch]', + 'The GitLab branch used to infer relative links in README.md. Can be overriden by --baseContentUrl and --baseImagesUrl.' + ) .option('--baseContentUrl [url]', 'Prepend all relative links in README.md with this url.') .option('--baseImagesUrl [url]', 'Prepend all relative image links in README.md with this url.') .option('--yarn', 'Use yarn instead of npm (default inferred from presence of yarn.lock or .yarnrc)') @@ -134,7 +157,19 @@ module.exports = function (argv: string[]): void { .action( ( version, - { pat, message, packagePath, githubBranch, baseContentUrl, baseImagesUrl, yarn, noVerify, ignoreFile, web } + { + pat, + message, + packagePath, + githubBranch, + gitlabBranch, + baseContentUrl, + baseImagesUrl, + yarn, + noVerify, + ignoreFile, + web, + } ) => main( publish({ @@ -143,6 +178,7 @@ module.exports = function (argv: string[]): void { version, packagePath, githubBranch, + gitlabBranch, baseContentUrl, baseImagesUrl, useYarn: yarn, diff --git a/src/package.ts b/src/package.ts index 65964589..ebac8b61 100644 --- a/src/package.ts +++ b/src/package.ts @@ -79,12 +79,14 @@ export interface IPackageOptions { readonly cwd?: string; readonly packagePath?: string; readonly githubBranch?: string; + readonly gitlabBranch?: string; readonly baseContentUrl?: string; readonly baseImagesUrl?: string; readonly useYarn?: boolean; readonly dependencyEntryPoints?: string[]; readonly ignoreFile?: string; readonly gitHubIssueLinking?: boolean; + readonly gitLabIssueLinking?: boolean; readonly web?: boolean; } @@ -202,6 +204,10 @@ function isGitHubRepository(repository: string): boolean { return /^https:\/\/github\.com\/|^git@github\.com:/.test(repository || ''); } +function isGitLabRepository(repository: string): boolean { + return /^https:\/\/gitlab\.com\/|^git@gitlab\.com:/.test(repository || ''); +} + function isGitHubBadge(href: string): boolean { return /^https:\/\/github\.com\/[^/]+\/[^/]+\/workflows\/.*badge\.svg/.test(href || ''); } @@ -420,8 +426,10 @@ export class MarkdownProcessor extends BaseProcessor { private baseContentUrl: string; private baseImagesUrl: string; private isGitHub: boolean; + private isGitLab: boolean; private repositoryUrl: string; private gitHubIssueLinking: boolean; + private gitLabIssueLinking: boolean; constructor( manifest: Manifest, @@ -432,13 +440,15 @@ export class MarkdownProcessor extends BaseProcessor { ) { super(manifest); - const guess = this.guessBaseUrls(options.githubBranch); + const guess = this.guessBaseUrls(options.githubBranch || options.gitlabBranch); this.baseContentUrl = options.baseContentUrl || (guess && guess.content); this.baseImagesUrl = options.baseImagesUrl || options.baseContentUrl || (guess && guess.images); this.repositoryUrl = guess && guess.repository; this.isGitHub = isGitHubRepository(this.repositoryUrl); + this.isGitLab = isGitLabRepository(this.repositoryUrl); this.gitHubIssueLinking = typeof options.gitHubIssueLinking === 'boolean' ? options.gitHubIssueLinking : true; + this.gitLabIssueLinking = typeof options.gitLabIssueLinking === 'boolean' ? options.gitLabIssueLinking : true; } async onFile(file: IFile): Promise { @@ -469,7 +479,7 @@ export class MarkdownProcessor extends BaseProcessor { if (isLinkRelative) { throw new Error( - `Couldn't detect the repository where this extension is published. The ${asset} '${link}' will be broken in ${this.name}. GitHub repositories will be automatically detected. Otherwise, please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.` + `Couldn't detect the repository where this extension is published. The ${asset} '${link}' will be broken in ${this.name}. GitHub/GitLab repositories will be automatically detected. Otherwise, please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.` ); } } @@ -493,7 +503,7 @@ export class MarkdownProcessor extends BaseProcessor { if (!this.baseImagesUrl && isLinkRelative) { throw new Error( - `Couldn't detect the repository where this extension is published. The image will be broken in ${this.name}. GitHub repositories will be automatically detected. Otherwise, please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.` + `Couldn't detect the repository where this extension is published. The image will be broken in ${this.name}. GitHub/GitLab repositories will be automatically detected. Otherwise, please provide the repository URL in package.json or use the --baseContentUrl and --baseImagesUrl options.` ); } const prefix = this.baseImagesUrl; @@ -505,7 +515,7 @@ export class MarkdownProcessor extends BaseProcessor { return all.replace(link, urljoin(prefix, link)); }); - if (this.gitHubIssueLinking && this.isGitHub) { + if ((this.gitHubIssueLinking && this.isGitHub) || (this.gitLabIssueLinking && this.isGitLab)) { const markdownIssueRegex = /(\s|\n)([\w\d_-]+\/[\w\d_-]+)?#(\d+)\b/g; const issueReplace = ( all: string, @@ -523,11 +533,19 @@ export class MarkdownProcessor extends BaseProcessor { if (owner && repositoryName && issueNumber) { // Issue in external repository - const issueUrl = urljoin('https://github.com', owner, repositoryName, 'issues', issueNumber); + const issueUrl = this.isGitHub + ? urljoin('https://github.com', owner, repositoryName, 'issues', issueNumber) + : urljoin('https://gitlab.com', owner, repositoryName, '-', 'issues', issueNumber); result = prefix + `[${owner}/${repositoryName}#${issueNumber}](${issueUrl})`; } else if (!owner && !repositoryName && issueNumber) { // Issue in own repository - result = prefix + `[#${issueNumber}](${urljoin(this.repositoryUrl, 'issues', issueNumber)})`; + result = + prefix + + `[#${issueNumber}](${ + this.isGitHub + ? urljoin(this.repositoryUrl, 'issues', issueNumber) + : urljoin(this.repositoryUrl, '-', 'issues', issueNumber) + })`; } return result; @@ -569,7 +587,7 @@ export class MarkdownProcessor extends BaseProcessor { } // GitHub heuristics - private guessBaseUrls(githubBranch: string | undefined): { content: string; images: string; repository: string } { + private guessBaseUrls(githostBranch: string | undefined): { content: string; images: string; repository: string } { let repository = null; if (typeof this.manifest.repository === 'string') { @@ -582,22 +600,34 @@ export class MarkdownProcessor extends BaseProcessor { return null; } - const regex = /github(\.com\/|:)([^/]+)\/([^/]+)(\/|$)/; - const match = regex.exec(repository); + const gitHubRegex = /(?github(\.com\/|:))(?(?:[^/]+)\/(?:[^/]+))(\/|$)/; + const gitLabRegex = /(?gitlab(\.com\/|:))(?(?:[^/]+)(\/(?:[^/]+))+)(\/|$)/; + const match = ((gitHubRegex.exec(repository) || gitLabRegex.exec(repository)) as unknown) as { + groups: Record; + }; if (!match) { return null; } - const account = match[2]; - const repositoryName = match[3].replace(/\.git$/i, ''); - const branchName = githubBranch ? githubBranch : 'HEAD'; + const project = match.groups.project.replace(/\.git$/i, ''); + const branchName = githostBranch ? githostBranch : 'HEAD'; - return { - content: `https://github.com/${account}/${repositoryName}/blob/${branchName}`, - images: `https://github.com/${account}/${repositoryName}/raw/${branchName}`, - repository: `https://github.com/${account}/${repositoryName}`, - }; + if (/^github/.test(match.groups.domain)) { + return { + content: `https://github.com/${project}/blob/${branchName}`, + images: `https://github.com/${project}/raw/${branchName}`, + repository: `https://github.com/${project}`, + }; + } else if (/^gitlab/.test(match.groups.domain)) { + return { + content: `https://gitlab.com/${project}/-/blob/${branchName}`, + images: `https://gitlab.com/${project}/-/raw/${branchName}`, + repository: `https://gitlab.com/${project}`, + }; + } + + return null; } } diff --git a/src/publish.ts b/src/publish.ts index 070616cc..d1056984 100644 --- a/src/publish.ts +++ b/src/publish.ts @@ -119,6 +119,7 @@ export interface IPublishOptions { cwd?: string; pat?: string; githubBranch?: string; + gitlabBranch?: string; baseContentUrl?: string; baseImagesUrl?: string; useYarn?: boolean; @@ -190,6 +191,7 @@ export function publish(options: IPublishOptions = {}): Promise { } else { const cwd = options.cwd; const githubBranch = options.githubBranch; + const gitlabBranch = options.gitlabBranch; const baseContentUrl = options.baseContentUrl; const baseImagesUrl = options.baseImagesUrl; const useYarn = options.useYarn; @@ -199,7 +201,7 @@ export function publish(options: IPublishOptions = {}): Promise { promise = versionBump(options.cwd, options.version, options.commitMessage) .then(() => tmpName()) .then(packagePath => - pack({ packagePath, cwd, githubBranch, baseContentUrl, baseImagesUrl, useYarn, ignoreFile, web }) + pack({ packagePath, cwd, githubBranch, gitlabBranch, baseContentUrl, baseImagesUrl, useYarn, ignoreFile, web }) ); } diff --git a/src/test/fixtures/readme/readme.gitlab.branch.main.expected.md b/src/test/fixtures/readme/readme.gitlab.branch.main.expected.md new file mode 100644 index 00000000..6bcde929 --- /dev/null +++ b/src/test/fixtures/readme/readme.gitlab.branch.main.expected.md @@ -0,0 +1,48 @@ +# README + +>**Important:** Once installed the checker will only update if you add the setting `"spellMD.enable": true` to your `.vscode\settings.json` file. + +This README covers off: +* [Functionality](#functionality) +* [Install](#install) +* [Run and Configure](#run-and-configure) +* [Known Issues/Bugs](#known-issuesbugs) +* [Backlog](#backlog) +* [How to Debug](#how-to-debug) + +# Functionality + +Load up a Markdown file and get highlights and hovers for existing issues. Checking will occur as you type in the document. + +![Underscores and hovers](https://gitlab.com/username/repository/-/raw/main/images/SpellMDDemo1.gif) + +The status bar lets you quickly navigate to any issue and you can see all positions in the gutter. + +[![Jump to issues](https://gitlab.com/username/repository/-/raw/main/images/SpellMDDemo2.gif)](http://shouldnottouchthis/) +[![Jump to issues](https://gitlab.com/username/repository/-/raw/main/images/SpellMDDemo2.gif)](https://gitlab.com/username/repository/-/blob/main/monkey) +![](https://gitlab.com/username/repository/-/raw/main/images/SpellMDDemo2.gif) + + +The `spellMD.json` config file is watched so you can add more ignores or change mappings at will. + +![Add to dictionary](https://gitlab.com/username/repository/-/raw/main/images/SpellMDDemo3.gif) + +![issue](https://gitlab.com/username/repository/-/raw/main/issue) + +[mono](https://gitlab.com/username/repository/-/blob/main/monkey) +[not](http://shouldnottouchthis/) +[Email me](mailto:example@example.com) + +# Install +This extension is published in the VS Code Gallery. So simply hit 'F1' and type 'ext inst' from there select `SpellMD` and follow instructions. + + +To clone the extension and load locally... + +``` +git clone https://github.com/Microsoft/vscode-SpellMD.git +npm install +tsc +``` + +>**Note:** TypeScript 1.6 or higher is required you can check with `tsc -v` and if you need to upgrade then run `npm install -g typescript`. diff --git a/src/test/fixtures/readme/readme.gitlab.branch.override.content.expected.md b/src/test/fixtures/readme/readme.gitlab.branch.override.content.expected.md new file mode 100644 index 00000000..6bb9682e --- /dev/null +++ b/src/test/fixtures/readme/readme.gitlab.branch.override.content.expected.md @@ -0,0 +1,48 @@ +# README + +>**Important:** Once installed the checker will only update if you add the setting `"spellMD.enable": true` to your `.vscode\settings.json` file. + +This README covers off: +* [Functionality](#functionality) +* [Install](#install) +* [Run and Configure](#run-and-configure) +* [Known Issues/Bugs](#known-issuesbugs) +* [Backlog](#backlog) +* [How to Debug](#how-to-debug) + +# Functionality + +Load up a Markdown file and get highlights and hovers for existing issues. Checking will occur as you type in the document. + +![Underscores and hovers](https://gitlab.com/base/images/SpellMDDemo1.gif) + +The status bar lets you quickly navigate to any issue and you can see all positions in the gutter. + +[![Jump to issues](https://gitlab.com/base/images/SpellMDDemo2.gif)](http://shouldnottouchthis/) +[![Jump to issues](https://gitlab.com/base/images/SpellMDDemo2.gif)](https://gitlab.com/base/monkey) +![](https://gitlab.com/base/images/SpellMDDemo2.gif) + + +The `spellMD.json` config file is watched so you can add more ignores or change mappings at will. + +![Add to dictionary](https://gitlab.com/base/images/SpellMDDemo3.gif) + +![issue](https://gitlab.com/base/issue) + +[mono](https://gitlab.com/base/monkey) +[not](http://shouldnottouchthis/) +[Email me](mailto:example@example.com) + +# Install +This extension is published in the VS Code Gallery. So simply hit 'F1' and type 'ext inst' from there select `SpellMD` and follow instructions. + + +To clone the extension and load locally... + +``` +git clone https://github.com/Microsoft/vscode-SpellMD.git +npm install +tsc +``` + +>**Note:** TypeScript 1.6 or higher is required you can check with `tsc -v` and if you need to upgrade then run `npm install -g typescript`. diff --git a/src/test/fixtures/readme/readme.gitlab.branch.override.images.expected.md b/src/test/fixtures/readme/readme.gitlab.branch.override.images.expected.md new file mode 100644 index 00000000..c0ec04d9 --- /dev/null +++ b/src/test/fixtures/readme/readme.gitlab.branch.override.images.expected.md @@ -0,0 +1,48 @@ +# README + +>**Important:** Once installed the checker will only update if you add the setting `"spellMD.enable": true` to your `.vscode\settings.json` file. + +This README covers off: +* [Functionality](#functionality) +* [Install](#install) +* [Run and Configure](#run-and-configure) +* [Known Issues/Bugs](#known-issuesbugs) +* [Backlog](#backlog) +* [How to Debug](#how-to-debug) + +# Functionality + +Load up a Markdown file and get highlights and hovers for existing issues. Checking will occur as you type in the document. + +![Underscores and hovers](https://gitlab.com/base/images/SpellMDDemo1.gif) + +The status bar lets you quickly navigate to any issue and you can see all positions in the gutter. + +[![Jump to issues](https://gitlab.com/base/images/SpellMDDemo2.gif)](http://shouldnottouchthis/) +[![Jump to issues](https://gitlab.com/base/images/SpellMDDemo2.gif)](https://gitlab.com/username/repository/-/blob/main/monkey) +![](https://gitlab.com/base/images/SpellMDDemo2.gif) + + +The `spellMD.json` config file is watched so you can add more ignores or change mappings at will. + +![Add to dictionary](https://gitlab.com/base/images/SpellMDDemo3.gif) + +![issue](https://gitlab.com/base/issue) + +[mono](https://gitlab.com/username/repository/-/blob/main/monkey) +[not](http://shouldnottouchthis/) +[Email me](mailto:example@example.com) + +# Install +This extension is published in the VS Code Gallery. So simply hit 'F1' and type 'ext inst' from there select `SpellMD` and follow instructions. + + +To clone the extension and load locally... + +``` +git clone https://github.com/Microsoft/vscode-SpellMD.git +npm install +tsc +``` + +>**Note:** TypeScript 1.6 or higher is required you can check with `tsc -v` and if you need to upgrade then run `npm install -g typescript`. diff --git a/src/test/fixtures/readme/readme.gitlab.default.md b/src/test/fixtures/readme/readme.gitlab.default.md new file mode 100644 index 00000000..314b2365 --- /dev/null +++ b/src/test/fixtures/readme/readme.gitlab.default.md @@ -0,0 +1,48 @@ +# README + +>**Important:** Once installed the checker will only update if you add the setting `"spellMD.enable": true` to your `.vscode\settings.json` file. + +This README covers off: +* [Functionality](#functionality) +* [Install](#install) +* [Run and Configure](#run-and-configure) +* [Known Issues/Bugs](#known-issuesbugs) +* [Backlog](#backlog) +* [How to Debug](#how-to-debug) + +# Functionality + +Load up a Markdown file and get highlights and hovers for existing issues. Checking will occur as you type in the document. + +![Underscores and hovers](https://gitlab.com/username/repository/-/raw/HEAD/images/SpellMDDemo1.gif) + +The status bar lets you quickly navigate to any issue and you can see all positions in the gutter. + +[![Jump to issues](https://gitlab.com/username/repository/-/raw/HEAD/images/SpellMDDemo2.gif)](http://shouldnottouchthis/) +[![Jump to issues](https://gitlab.com/username/repository/-/raw/HEAD/images/SpellMDDemo2.gif)](https://gitlab.com/username/repository/-/blob/HEAD/monkey) +![](https://gitlab.com/username/repository/-/raw/HEAD/images/SpellMDDemo2.gif) + + +The `spellMD.json` config file is watched so you can add more ignores or change mappings at will. + +![Add to dictionary](https://gitlab.com/username/repository/-/raw/HEAD/images/SpellMDDemo3.gif) + +![issue](https://gitlab.com/username/repository/-/raw/HEAD/issue) + +[mono](https://gitlab.com/username/repository/-/blob/HEAD/monkey) +[not](http://shouldnottouchthis/) +[Email me](mailto:example@example.com) + +# Install +This extension is published in the VS Code Gallery. So simply hit 'F1' and type 'ext inst' from there select `SpellMD` and follow instructions. + + +To clone the extension and load locally... + +``` +git clone https://github.com/Microsoft/vscode-SpellMD.git +npm install +tsc +``` + +>**Note:** TypeScript 1.6 or higher is required you can check with `tsc -v` and if you need to upgrade then run `npm install -g typescript`. diff --git a/src/test/fixtures/readme/readme.gitlab.expected.md b/src/test/fixtures/readme/readme.gitlab.expected.md new file mode 100644 index 00000000..6d24c294 --- /dev/null +++ b/src/test/fixtures/readme/readme.gitlab.expected.md @@ -0,0 +1,15 @@ +# Replace + +[#8](https://gitlab.com/username/repository/-/issues/8) + +* Some issue in same repository: [#7](https://gitlab.com/username/repository/-/issues/7) +* Some issue in other repository: [other/repositoryName#8](https://gitlab.com/other/repositoryName/-/issues/8) +* Some issue in other repository with fancy name: [my_user-name/my-rep_o12#6](https://gitlab.com/my_user-name/my-rep_o12/-/issues/6) + +# Do not touch this: + * username#4 (no valid gitlab link) + * /#7 + * foo/$234/#7 + * [#7](http://shouldnottouchthis/) + * [other/repositoryName#8](http://shouldnottouchthis/) + * [Email me](MAILTO:example@example.com) diff --git a/src/test/fixtures/readme/readme.gitlab.md b/src/test/fixtures/readme/readme.gitlab.md new file mode 100644 index 00000000..b3caa4e4 --- /dev/null +++ b/src/test/fixtures/readme/readme.gitlab.md @@ -0,0 +1,15 @@ +# Replace + +#8 + +* Some issue in same repository: #7 +* Some issue in other repository: other/repositoryName#8 +* Some issue in other repository with fancy name: my_user-name/my-rep_o12#6 + +# Do not touch this: + * username#4 (no valid gitlab link) + * /#7 + * foo/$234/#7 + * [#7](http://shouldnottouchthis/) + * [other/repositoryName#8](http://shouldnottouchthis/) + * [Email me](MAILTO:example@example.com) diff --git a/src/test/package.test.ts b/src/test/package.test.ts index c8812461..4896c097 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -1957,6 +1957,177 @@ describe('MarkdownProcessor', () => { }); }); + it('should infer baseContentUrl if its a gitlab repo', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', + engines: Object.create(null), + repository: 'https://gitlab.com/username/repository', + }; + + const root = fixture('readme'); + const processor = new ReadmeProcessor(manifest, {}); + const readme = { + path: 'extension/readme.md', + localPath: path.join(root, 'readme.md'), + }; + + return processor + .onFile(readme) + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.gitlab.default.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); + }); + }); + + it('should infer baseContentUrl if its a gitlab repo (.git)', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', + engines: Object.create(null), + repository: 'https://gitlab.com/username/repository.git', + }; + + const root = fixture('readme'); + const processor = new ReadmeProcessor(manifest, {}); + const readme = { + path: 'extension/readme.md', + localPath: path.join(root, 'readme.md'), + }; + + return processor + .onFile(readme) + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.gitlab.default.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); + }); + }); + + it('should infer baseContentUrl if its a gitlab repo (short format)', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', + engines: Object.create(null), + repository: 'gitlab:username/repository', + }; + + const root = fixture('readme'); + const processor = new ReadmeProcessor(manifest, {}); + const readme = { + path: 'extension/readme.md', + localPath: path.join(root, 'readme.md'), + }; + + return processor + .onFile(readme) + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.gitlab.default.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); + }); + }); + + it('should replace relative links with GitLab URLs while respecting gitlabBranch', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', + engines: Object.create(null), + repository: 'https://gitlab.com/username/repository', + }; + + const root = fixture('readme'); + const processor = new ReadmeProcessor(manifest, { + gitlabBranch: 'main', + }); + const readme = { + path: 'extension/readme.md', + localPath: path.join(root, 'readme.md'), + }; + + return processor + .onFile(readme) + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.gitlab.branch.main.expected.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); + }); + }); + + it('should override image URLs with baseImagesUrl while also respecting gitlabBranch', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', + engines: Object.create(null), + repository: 'https://gitlab.com/username/repository', + }; + + const root = fixture('readme'); + const processor = new ReadmeProcessor(manifest, { + gitlabBranch: 'main', + // Override image relative links to point to different base URL + baseImagesUrl: 'https://gitlab.com/base', + }); + const readme = { + path: 'extension/readme.md', + localPath: path.join(root, 'readme.md'), + }; + + return processor + .onFile(readme) + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.gitlab.branch.override.images.expected.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); + }); + }); + + it('should override gitlabBranch setting with baseContentUrl', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', + engines: Object.create(null), + repository: 'https://gitlab.com/username/repository', + }; + + const root = fixture('readme'); + const processor = new ReadmeProcessor(manifest, { + gitlabBranch: 'main', + baseContentUrl: 'https://gitlab.com/base', + }); + const readme = { + path: 'extension/readme.md', + localPath: path.join(root, 'readme.md'), + }; + + return processor + .onFile(readme) + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.gitlab.branch.override.content.expected.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); + }); + }); + it('should replace img urls with baseImagesUrl', () => { const manifest = { name: 'test', @@ -2069,6 +2240,60 @@ describe('MarkdownProcessor', () => { }); }); + it('should replace issue links with urls if its a gitlab repo.', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', + engines: Object.create(null), + repository: 'https://gitlab.com/username/repository.git', + }; + + const root = fixture('readme'); + const processor = new ReadmeProcessor(manifest, {}); + const readme = { + path: 'extension/readme.md', + localPath: path.join(root, 'readme.gitlab.md'), + }; + + return processor + .onFile(readme) + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.gitlab.expected.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); + }); + }); + + it('should not replace issue links with urls if its a gitlab repo but issue link expansion is disabled.', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + description: 'test extension', + engines: Object.create(null), + repository: 'https://gitlab.com/username/repository.git', + }; + + const root = fixture('readme'); + const processor = new ReadmeProcessor(manifest, { gitLabIssueLinking: false }); + const readme = { + path: 'extension/readme.md', + localPath: path.join(root, 'readme.gitlab.md'), + }; + + return processor + .onFile(readme) + .then(file => read(file)) + .then(actual => { + return readFile(path.join(root, 'readme.gitlab.md'), 'utf8').then(expected => { + assert.equal(actual, expected); + }); + }); + }); + it('should prevent non-HTTPS images', async () => { const manifest = { name: 'test', From 2356041bfce796fdf749de14266d16484eea2c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 30 Apr 2021 14:36:43 +0200 Subject: [PATCH 121/131] 1.88.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e4e15e20..90cf99f6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.87.1", + "version": "1.88.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 65600e2fba3d77945e5351c7b2dc7b5ac1dcdd9f Mon Sep 17 00:00:00 2001 From: Oliver Salzburg Date: Tue, 4 May 2021 16:43:18 +0200 Subject: [PATCH 122/131] fix: Missing error response handling Fixes #563 --- src/publicgalleryapi.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/publicgalleryapi.ts b/src/publicgalleryapi.ts index 89a3ca8f..92b28a17 100644 --- a/src/publicgalleryapi.ts +++ b/src/publicgalleryapi.ts @@ -54,6 +54,10 @@ export class PublicGalleryAPI { }); const raw = JSON.parse(await res.readBody()); + if (raw.errorCode !== undefined) { + throw new Error(raw.message); + } + return ContractSerializer.deserialize(raw.results[0].extensions, TypeInfo.PublishedExtension, false, false); } From a0f032e38a8740d2a61e5a45f064f4290437760a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 6 May 2021 17:51:37 +0200 Subject: [PATCH 123/131] move to npm --- .gitignore | 2 +- package-lock.json | 2197 +++++++++++++++++++++++++++++++++++++++++++++ yarn.lock | 1764 ------------------------------------ 3 files changed, 2198 insertions(+), 1765 deletions(-) create mode 100644 package-lock.json delete mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index f5217e9c..b0911f55 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ node_modules/ out/ npm-debug.log !src/test/**/node_modules -package-lock.json \ No newline at end of file +yarn.lock \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..08c8812e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2197 @@ +{ + "name": "vsce", + "version": "1.88.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha1-Fo2ho26Q2miujUnA8bSMfGJJITo= sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI= sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha1-fRvf1ldTU4+r5sOFls23bZrGAUM= sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@types/cheerio": { + "version": "0.22.10", + "resolved": "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.10.tgz", + "integrity": "sha1-eA1VJGeCS+SiQbKVEKeHOnQyxKY= sha512-fOM/Jhv51iyugY7KOBZz2ThfT1gwvsGCfWxpLpZDgkGjpEO4Le9cld07OdskikLjDUQJ43dzDaVRSFwQlpdqVg==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-HBJhu+qhCoBVu8XYq4S3sq/IRqA= sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/denodeify": { + "version": "1.2.31", + "resolved": "https://registry.yarnpkg.com/@types/denodeify/-/denodeify-1.2.31.tgz", + "integrity": "sha1-mnN7BjvxqOOmPMAGy7sN5gHONYQ= sha512-Jgy3dvCyIxhNb5RstVJkubeHZifw8KJXca13ov8OO4IqhDLPRHiJJ6VArJbZZ4HuEMJEB83yCuABodNMlYylzQ==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz", + "integrity": "sha1-KGLz9Yqaf3w+eNefEw3U1xwlwqc= sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-qlmhxuP7xCHgfM0xqUTDDrpSFXU= sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "10.12.15", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-10.12.15.tgz", + "integrity": "sha1-IOhWUbYv2GZW5Xycm8dxqxVwvFk= sha512-9kROxduaN98QghwwHmxXO2Xz3MaWf+I1sLVAA6KJDF5xix+IyXVhds0MAfdNwtcpSrzhaTsNB0/jnL86fgUhqA==", + "dev": true + } + } + }, + "@types/lodash": { + "version": "4.14.123", + "resolved": "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.123.tgz", + "integrity": "sha1-Ob5dIRR4yN072umO51u37+Sr/k0= sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==", + "dev": true + }, + "@types/markdown-it": { + "version": "0.0.2", + "resolved": "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-0.0.2.tgz", + "integrity": "sha1-XZrRnm5lCM3S8llt+G/Qqt5ZhmA=", + "dev": true + }, + "@types/mime": { + "version": "1.3.1", + "resolved": "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.1.tgz", + "integrity": "sha1-LPQpctCTHBBgx9X6Zif85r2Hby8= sha512-rek8twk9C58gHYqIrUlJsx8NQMhlxqHzln9Z9ODqiNgv3/s+ZwIrfr+djqzsnVM12xe9hL98iJ20lj2RvCBv6A==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0= sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/mocha": { + "version": "7.0.2", + "resolved": "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha1-sX8Wz5M1l+ENbXjq4yUeaSzosM4= sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "dev": true + }, + "@types/node": { + "version": "8.10.38", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-8.10.38.tgz", + "integrity": "sha1-4FwgGmaEkuU0tIECrKApSJj0SfY= sha512-EibsnbJerd0hBFaDjJStFrVbVBAtOy4dgL8zZFw0uOvPqzBAX59Ci8cgjg3+RgJIWhsB5A4c+pi+D4P9tQQh/A==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA= sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/read": { + "version": "0.0.28", + "resolved": "https://registry.yarnpkg.com/@types/read/-/read-0.0.28.tgz", + "integrity": "sha1-zQvkCbGSxhGfF+Z9Q09MbpQY8bU=", + "dev": true + }, + "@types/semver": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/@types/semver/-/semver-6.0.0.tgz", + "integrity": "sha1-hrqJ8CpBTjnGjQKzUYcuTtMb13M= sha512-OO0srjOGH99a4LUN2its3+r6CBYcplhJ466yLqs+zvAWgphCpS8hYZEZ797tRDP/QKcqTdb/YCN6ifASoAWkrQ==", + "dev": true + }, + "@types/tmp": { + "version": "0.1.0", + "resolved": "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha1-Gc9zp7z2QZZUhRGXJjl6CW8ASb0= sha512-6IwZ9HzWbCq6XoQWhxLpDjuADodH/MKXRUIDFudvgjcVdjFknvmR+DNsoUeer4XPrEnrZs04Jj+kfV9pFsrhmA==", + "dev": true + }, + "@types/xml2js": { + "version": "0.4.4", + "resolved": "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.4.tgz", + "integrity": "sha1-IJPZQ1miAYBtmX3M78gBU9sxHGY= sha512-O6Xgai01b9PB3IGA0lRIp1Ex3JBcxGDhdO0n3NIIpCyDOAjxcIGQFmkvgJpP8anTrthxOUQjBfLdRRi0Zn/TXA==", + "dev": true, + "requires": { + "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "10.12.15", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-10.12.15.tgz", + "integrity": "sha1-IOhWUbYv2GZW5Xycm8dxqxVwvFk= sha512-9kROxduaN98QghwwHmxXO2Xz3MaWf+I1sLVAA6KJDF5xix+IyXVhds0MAfdNwtcpSrzhaTsNB0/jnL86fgUhqA==", + "dev": true + } + } + }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM= sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI= sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha1-PLs9DzFoEOr8xHYkc0I31q7krms= sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0= sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha1-yWVekzHgq81YjSp8rX6ZVvZnAfo= sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.yarnpkg.com/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha1-n1V+Yi3Qe7qpvV5+hOF8dh4hUbI= sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha1-I8DfFPaogHf1+YbA0WfsA8PVU3w= sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc= sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA= sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw= sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M= sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA= sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha1-5I3e2+MLMyF4PFtDAfvTU7weSks= sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } + } + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha1-EsBxRmjFWAD2WeJi1JYql/r1VKY= sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y= sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U= sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "commander": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz", + "integrity": "sha1-+Ncit4EDFBAGtm9Me6HpcxW6dbw= sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==" + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha1-GlaJkTaF5ah2N7jT/8p1UU7EHWI= sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concurrently": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/concurrently/-/concurrently-5.1.0.tgz", + "integrity": "sha1-BVI5hrp6r0tYpJ3dZY+riPp4MTI= sha512-9ViZMu3OOCID3rBgU31mjBftro2chOop0G2u1olq1OuwRBVRw/GxHTg80TVJBUTJfoswMmEUeuOg1g1yu1X2dA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "date-fns": "^2.0.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^6.1.0", + "tree-kill": "^1.2.2", + "yargs": "^13.3.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM= sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha1-75tE13OVnK5j3ezRIt4jhTtg+NM= sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "dependencies": { + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha1-+WCIzfJKj6qa6poAny2dlCyZlkY= sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY= sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz", + "integrity": "sha1-wIdtnQSAkn19SSDc1yrzWVZJVU0= sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==" + }, + "date-fns": { + "version": "2.9.0", + "resolved": "https://registry.yarnpkg.com/date-fns/-/date-fns-2.9.0.tgz", + "integrity": "sha1-0LF1pcN+1fF7l+InK7wfpa7Gd9I= sha512-khbFLu/MlzLjEzy9Gh8oY1hNt/Dvxw3J6Rbc28cVoYWQaC1S3YI4xwkF9ZWcjDLscbZlY9hISMr66RFzZagLsA==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps= sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk= sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE= sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=" + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz", + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI= sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8= sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM= sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA= sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY= sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8= sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha1-2MnR1myJgfuSAOIlHXme7pJ3Suk= sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "dependencies": { + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc= sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo= sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz", + "integrity": "sha1-CjTau61tZhAL1vLFdshmlAPzF/I= sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA= sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M= sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha1-ECl/mAMKeGgpaBaQVF72We0dJU4= sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz", + "integrity": "sha1-CQvsiwXjnLowl0fx1YjwTbr5jbI= sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y= sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha1-SWaheV7lrOZecGxLe+txJX1uItM= sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz", + "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE= sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik= sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz", + "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4= sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg= sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8= sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc= sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.0", + "resolved": "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz", + "integrity": "sha1-X15CLc9hGcDZg+02Jgzp3tC+5GQ= sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", + "requires": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.0.6" + }, + "dependencies": { + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo= sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha1-xbHNFPUK6uCatsWf5jujOV/k36M= sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "4.3.0", + "resolved": "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz", + "integrity": "sha1-Cy7B1mQk6SGdNZ4mpRxY7FJ48N4= sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k= sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo= sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM= sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI= sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha1-8VCotQo0KJsz4i9YiavU2AFvDlc= sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY= sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk= sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM= sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs= sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4= sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw= sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4= sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha1-venDJoDW+uBBKdasnZIc54FfeOM= sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc= sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk= sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc= sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk= sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0= sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz", + "integrity": "sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I= sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "linkify-it": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.1.0.tgz", + "integrity": "sha1-xMrzimzXrCIS7zx9K94wqRVh+ds= sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4= sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw= sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha1-86CFFqXeqJMzan3uFNGKHP2rd8Q= sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha1-q/xk8UGxci1mNAIETkOSfx9QqNw= sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "entities": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz", + "integrity": "sha1-aNYITKsbB5dnVA2A5Wo5tCPkq/Q= sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + } + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A= sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI= sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha1-WlFLcXklkoeVKIHpRBDsVGVln4w= sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "7.1.1", + "resolved": "https://registry.yarnpkg.com/mocha/-/mocha-7.1.1.tgz", + "integrity": "sha1-ifuzDQlCmEWxu4k6gwv1dxBJpEE= sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.3", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha1-ds/nQs8fQbubHCmtAwaMBbTA5Ao= sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0= sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + } + } + }, + "mri": { + "version": "1.1.6", + "resolved": "https://registry.yarnpkg.com/mri/-/mri-1.1.6.tgz", + "integrity": "sha1-SZUuEETbIdv5D2zZK8nJp3fUFaY= sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "multimatch": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha1-jDwPbj6ESa2grz3SnvtJGjdRkbM= sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha1-owrBNiH299Z0JgpU3t4EjDmCwIg= sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc= sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz", + "integrity": "sha1-eQp89v6lRZuslhELKbYEEtyP+Ws= sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo= sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw= sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "object-inspect": { + "version": "1.10.2", + "resolved": "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha1-tjhaPit8rgter8+Qzd+F0Sh2fzA= sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4= sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo= sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk= sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4= sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha1-eg//l49tv6TQBiOPusmO1BmMMlk= sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA= sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha1-QXyZQeYCepq8ulCS3SkE4lW1+8I= sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ= sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI= sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.yarnpkg.com/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", + "requires": { + "semver": "^5.1.0" + } + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha1-BC95L/3TaFFVHPTp4Gazh0q0W1w= sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "requires": { + "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "10.12.15", + "resolved": "https://registry.yarnpkg.com/@types/node/-/node-10.12.15.tgz", + "integrity": "sha1-IOhWUbYv2GZW5Xycm8dxqxVwvFk= sha512-9kROxduaN98QghwwHmxXO2Xz3MaWf+I1sLVAA6KJDF5xix+IyXVhds0MAfdNwtcpSrzhaTsNB0/jnL86fgUhqA==" + } + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw= sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs= sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0= sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM= sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc= sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha1-rt3T+ZTJM+StmLmdmlVu+g4v6UI= sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "prettier": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha1-MFBwDa4uTItnxMP2Zs24r0BeHOU= sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true + }, + "pretty-quick": { + "version": "3.0.2", + "resolved": "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.0.2.tgz", + "integrity": "sha1-ftRg9+Q6ZHsQRK2Lf0GgyKfxxRw= sha512-4rWOs/Ifdkg7G/YX7Xbco4jZkuXPx445KdhuMI6REnl3nXRDb9+zysb29c76R59jsJzcnkcpAaGi8D/RjAVfSQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "execa": "^4.0.0", + "find-up": "^4.1.0", + "ignore": "^5.1.4", + "mri": "^1.1.5", + "multimatch": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k= sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ= sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM= sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI= sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc= sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ= sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz", + "integrity": "sha1-STFIL6jWR6Wqt5nFJx0hM7mB+2o= sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "readable-stream": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.0.tgz", + "integrity": "sha1-GcLpwc5DUHxT9u77zx7j1KqnhvU= sha512-vpydAvIJvPODZNagCPuHG87O9JNPtvFEtjHHRVwNVsVVRBqemvPJkc2SYbxJsiZXawJdtZNmkmnsPuE3IgsG0A==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha1-wwwzNSsSyW37S4lUIaSf1alZODk= sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs= sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha1-O9qur0XMB/N1ZW39LlTtCBCxAbo= sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY= sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha1-4Hd/4NGEzseHLfFH8wNXLUFOIRw= sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0= sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk= sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz", + "integrity": "sha1-fnQlb7qknHWqfHogXMInmcrIAAQ= sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha1-qTwsWERTmncCMzeRB7OMe0rJ0zg= sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha1-785cj9wQTudRslxY1CkAEfpeos8= sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw= sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ= sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8= sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ= sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc= sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA= sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha1-dezRqI3owYTvAV6vtRtbSL/RG7E= sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE= sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz", + "integrity": "sha1-7kl/0pdoZG2EviybgZ4pJDlhQ3M= sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha1-RAiqLl1t3QyagHObCH+8BnwDs8w= sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha1-x28c7zDyG7rYr+uNsVEUls+w8qM= sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz", + "integrity": "sha1-r+WWp86d6QVJaRlAbJc0hF8BovI= sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha1-/obnOLGVRK/nBGkkOyoe6SQOro0= sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0= sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo= sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + } + } + }, + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha1-TKCakJLIi3OnzcXooBtQeweQoMw= sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY= sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw= sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.4", + "resolved": "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.8.4.tgz", + "integrity": "sha1-uj+3iOW5MiVHQGOSUz8S1mClztY= sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typescript": { + "version": "3.4.3", + "resolved": "https://registry.yarnpkg.com/typescript/-/typescript-3.4.3.tgz", + "integrity": "sha1-DrMg5KzpsQ6t9bxhAyhrD4t8Ik8= sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ==", + "dev": true + }, + "uc.micro": { + "version": "1.0.5", + "resolved": "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz", + "integrity": "sha1-DGXxX4FaoItWCmHOi023/8P0U3Y= sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==" + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha1-DBxr0t9UtrafIxQGbWW2zeb8+dE= sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "url-join": { + "version": "1.1.0", + "resolved": "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz", + "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo= sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc= sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk= sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c= sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha1-jbK4PDHF11CZu4kLI/MJSJHiR9Q= sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha1-O1k63ZRIdgd9TWg/7gEIG9n/8x4= sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha1-TGV6VeB+Xyz5R/ijZlZ8BKDe3IM= sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg= sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha1-7yXCx2n/a9CeSw+dfGBfsnhG6p8= sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yazl": { + "version": "2.5.1", + "resolved": "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha1-o9ZdPdZZpbCTeFDoYJ8i//orXDU= sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "requires": { + "buffer-crc32": "~0.2.3" + } + } + } +} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 75d7baec..00000000 --- a/yarn.lock +++ /dev/null @@ -1,1764 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@types/cheerio@^0.22.1": - version "0.22.10" - resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.10.tgz#780d552467824be4a241b29510a7873a7432c4a6" - integrity sha512-fOM/Jhv51iyugY7KOBZz2ThfT1gwvsGCfWxpLpZDgkGjpEO4Le9cld07OdskikLjDUQJ43dzDaVRSFwQlpdqVg== - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/denodeify@^1.2.31": - version "1.2.31" - resolved "https://registry.yarnpkg.com/@types/denodeify/-/denodeify-1.2.31.tgz#9a737b063bf1a8e3a63cc006cbbb0de601ce3584" - integrity sha512-Jgy3dvCyIxhNb5RstVJkubeHZifw8KJXca13ov8OO4IqhDLPRHiJJ6VArJbZZ4HuEMJEB83yCuABodNMlYylzQ== - -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - -"@types/lodash@^4.14.123": - version "4.14.123" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.123.tgz#39be5d211478c8dd3bdae98ee75bb7efe4abfe4d" - integrity sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q== - -"@types/markdown-it@0.0.2": - version "0.0.2" - resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-0.0.2.tgz#5d9ad19e6e6508cdd2f2596df86fd0aade598660" - integrity sha1-XZrRnm5lCM3S8llt+G/Qqt5ZhmA= - -"@types/mime@^1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.1.tgz#2cf42972d0931c1060c7d5fa6627fce6bd876f2f" - integrity sha512-rek8twk9C58gHYqIrUlJsx8NQMhlxqHzln9Z9ODqiNgv3/s+ZwIrfr+djqzsnVM12xe9hL98iJ20lj2RvCBv6A== - -"@types/minimatch@*", "@types/minimatch@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/mocha@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce" - integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w== - -"@types/node@*": - version "10.12.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.15.tgz#20e85651b62fd86656e57c9c9bc771ab1570bc59" - integrity sha512-9kROxduaN98QghwwHmxXO2Xz3MaWf+I1sLVAA6KJDF5xix+IyXVhds0MAfdNwtcpSrzhaTsNB0/jnL86fgUhqA== - -"@types/node@^8": - version "8.10.38" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.38.tgz#e05c201a668492e534b48102aca0294898f449f6" - integrity sha512-EibsnbJerd0hBFaDjJStFrVbVBAtOy4dgL8zZFw0uOvPqzBAX59Ci8cgjg3+RgJIWhsB5A4c+pi+D4P9tQQh/A== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/read@^0.0.28": - version "0.0.28" - resolved "https://registry.yarnpkg.com/@types/read/-/read-0.0.28.tgz#cd0be409b192c6119f17e67d434f4c6e9418f1b5" - integrity sha1-zQvkCbGSxhGfF+Z9Q09MbpQY8bU= - -"@types/semver@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.0.0.tgz#86ba89f02a414e39c68d02b351872e4ed31bd773" - integrity sha512-OO0srjOGH99a4LUN2its3+r6CBYcplhJ466yLqs+zvAWgphCpS8hYZEZ797tRDP/QKcqTdb/YCN6ifASoAWkrQ== - -"@types/tmp@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.1.0.tgz#19cf73a7bcf641965485119726397a096f0049bd" - integrity sha512-6IwZ9HzWbCq6XoQWhxLpDjuADodH/MKXRUIDFudvgjcVdjFknvmR+DNsoUeer4XPrEnrZs04Jj+kfV9pFsrhmA== - -"@types/xml2js@^0.4.4": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.4.tgz#2093d94359a201806d997dccefc80153db311c66" - integrity sha512-O6Xgai01b9PB3IGA0lRIp1Ex3JBcxGDhdO0n3NIIpCyDOAjxcIGQFmkvgJpP8anTrthxOUQjBfLdRRi0Zn/TXA== - dependencies: - "@types/node" "*" - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-differ@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" - integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - -azure-devops-node-api@^10.2.2: - version "10.2.2" - resolved "https://registry.yarnpkg.com/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz#9f557e622dd07bbaa9bd5e7e84e17c761e2151b2" - integrity sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow== - dependencies: - tunnel "0.0.6" - typed-rest-client "^1.8.4" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== - -boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -cheerio@^1.0.0-rc.1: - version "1.0.0-rc.2" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" - integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs= - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" - -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" - integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== - -compare-versions@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" - integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concurrently@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.1.0.tgz#05523986ba7aaf4b58a49ddd658fab88fa783132" - integrity sha512-9ViZMu3OOCID3rBgU31mjBftro2chOop0G2u1olq1OuwRBVRw/GxHTg80TVJBUTJfoswMmEUeuOg1g1yu1X2dA== - dependencies: - chalk "^2.4.2" - date-fns "^2.0.1" - lodash "^4.17.15" - read-pkg "^4.0.1" - rxjs "^6.5.2" - spawn-command "^0.0.2-1" - supports-color "^6.1.0" - tree-kill "^1.2.2" - yargs "^13.3.0" - -cosmiconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" - integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cross-spawn@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - -css-what@2.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" - integrity sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ== - -date-fns@^2.0.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.9.0.tgz#d0b175a5c37ed5f17b97e2272bbc1fa5aec677d2" - integrity sha512-khbFLu/MlzLjEzy9Gh8oY1hNt/Dvxw3J6Rbc28cVoYWQaC1S3YI4xwkF9ZWcjDLscbZlY9hISMr66RFzZagLsA== - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -denodeify@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" - integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= - -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -dom-serializer@0, dom-serializer@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" - integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= - dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" - -domelementtype@1, domelementtype@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@~1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" - integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -entities@^1.1.1, entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -entities@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -execa@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" - integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-versions@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" - integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== - dependencies: - semver-regex "^2.0.0" - -flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== - dependencies: - is-buffer "~2.0.3" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob@7.1.3, glob@^7.0.6: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== - -htmlparser2@^3.9.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464" - integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ== - dependencies: - domelementtype "^1.3.0" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.0.6" - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -husky@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz#0b2ec1d66424e9219d359e26a51c58ec5278f0de" - integrity sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA== - dependencies: - chalk "^4.0.0" - ci-info "^2.0.0" - compare-versions "^3.6.0" - cosmiconfig "^7.0.0" - find-versions "^3.2.0" - opencollective-postinstall "^2.0.2" - pkg-dir "^4.2.0" - please-upgrade-node "^3.2.0" - slash "^3.0.0" - which-pm-runs "^1.0.0" - -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - -import-fresh@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" - -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -linkify-it@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.1.0.tgz#c4caf38a6cd7ac2212ef3c7d2bde30a91561f9db" - integrity sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg== - dependencies: - uc.micro "^1.0.1" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash@^4.15.0: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== - -lodash@^4.17.15: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - -markdown-it@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" - integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== - dependencies: - argparse "^1.0.7" - entities "~2.0.0" - linkify-it "^2.0.0" - mdurl "^1.0.1" - uc.micro "^1.0.5" - -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -mime@^1.3.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" - integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== - dependencies: - minimist "^1.2.5" - -mocha@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.1.tgz#89fbb30d09429845b1bb893a830bf5771049a441" - integrity sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.3" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -mri@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.6.tgz#49952e1044db21dbf90f6cd92bc9c9a777d415a6" - integrity sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ== - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -multimatch@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" - integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== - dependencies: - "@types/minimatch" "^3.0.3" - array-differ "^3.0.0" - array-union "^2.1.0" - arrify "^2.0.1" - minimatch "^3.0.4" - -mute-stream@~0.0.4: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-inspect@^1.9.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30" - integrity sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@4.1.0, object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -opencollective-postinstall@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" - integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-limit@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" - integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== - dependencies: - p-try "^2.0.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" - integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-semver@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/parse-semver/-/parse-semver-1.1.1.tgz#9a4afd6df063dc4826f93fba4a99cf223f666cb8" - integrity sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg= - dependencies: - semver "^5.1.0" - -parse5@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== - dependencies: - "@types/node" "*" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - -picomatch@^2.0.4: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -please-upgrade-node@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" - integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== - dependencies: - semver-compare "^1.0.0" - -prettier@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5" - integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg== - -pretty-quick@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.0.2.tgz#7ed460f7e43a647b1044ad8b7f41a0c8a7f1c51c" - integrity sha512-4rWOs/Ifdkg7G/YX7Xbco4jZkuXPx445KdhuMI6REnl3nXRDb9+zysb29c76R59jsJzcnkcpAaGi8D/RjAVfSQ== - dependencies: - chalk "^3.0.0" - execa "^4.0.0" - find-up "^4.1.0" - ignore "^5.1.4" - mri "^1.1.5" - multimatch "^4.0.0" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -qs@^6.9.1: - version "6.10.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" - integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== - dependencies: - side-channel "^1.0.4" - -read-pkg@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" - integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= - dependencies: - normalize-package-data "^2.3.2" - parse-json "^4.0.0" - pify "^3.0.0" - -read@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= - dependencies: - mute-stream "~0.0.4" - -readable-stream@^3.0.6: - version "3.1.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.0.tgz#19c2e9c1ce43507c53f6eefbcf1ee3d4aaa786f5" - integrity sha512-vpydAvIJvPODZNagCPuHG87O9JNPtvFEtjHHRVwNVsVVRBqemvPJkc2SYbxJsiZXawJdtZNmkmnsPuE3IgsG0A== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" - integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== - dependencies: - path-parse "^1.0.6" - -rxjs@^6.5.2: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== - dependencies: - tslib "^1.9.0" - -safe-buffer@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - -semver-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" - integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== - -"semver@2 || 3 || 4 || 5": - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== - -semver@^5.1.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== - -semver@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-support@^0.4.2: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -spawn-command@^0.0.2-1: - version "0.0.2-1" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" - integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" - integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trimend@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz#ee497fd29768646d84be2c9b819e292439614373" - integrity sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trimleft@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" - integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimstart "^1.0.0" - -string.prototype.trimright@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" - integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimend "^1.0.0" - -string.prototype.trimstart@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz#afe596a7ce9de905496919406c9734845f01a2f2" - integrity sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string_decoder@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" - integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -tmp@0.0.29: - version "0.0.29" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" - integrity sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA= - dependencies: - os-tmpdir "~1.0.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -tslib@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== - -tunnel@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - -typed-rest-client@^1.8.4: - version "1.8.4" - resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.8.4.tgz#ba3fb788e5b9322547406392533f12d660a5ced6" - integrity sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg== - dependencies: - qs "^6.9.1" - tunnel "0.0.6" - underscore "^1.12.1" - -typescript@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.3.tgz#0eb320e4ace9b10eadf5bc6103286b0f8b7c224f" - integrity sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ== - -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" - integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== - -underscore@^1.12.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" - integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== - -url-join@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78" - integrity sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg= - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which-pm-runs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" - integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= - -which@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xml2js@^0.4.12: - version "0.4.19" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" - integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== - dependencies: - sax ">=0.6.0" - xmlbuilder "~9.0.1" - -xmlbuilder@~9.0.1: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= - -y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== - -yaml@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== - -yargs-parser@13.1.2, yargs-parser@^13.1.1, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs@13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.1" - -yauzl@^2.3.1: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yazl@^2.2.2: - version "2.5.1" - resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35" - integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== - dependencies: - buffer-crc32 "~0.2.3" From da1e574dfe631371ffd3092cff84c2385c82a7de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 6 May 2021 17:52:02 +0200 Subject: [PATCH 124/131] update docs --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fa1bc867..6af547cd 100644 --- a/README.md +++ b/README.md @@ -53,14 +53,14 @@ docker run -it -v $(pwd):/workspace vsce publish First clone this repository, then: ```sh -yarn -yarn watch # or `watch-test` to also run tests +npm i +npm run watch # or `watch-test` to also run tests ``` Once the watcher is up and running, you can run out of sources with: ```sh -yarn vsce +npm run vsce ``` ### Publish to NPM @@ -76,4 +76,4 @@ git push --follow-tags This tool assists in packaging and publishing Visual Studio Code extensions. -Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. \ No newline at end of file +Read the [**Documentation**](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code website. From 2c7b7092e121b3ca535fd73b1c138160ec335ab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Thu, 6 May 2021 17:52:06 +0200 Subject: [PATCH 125/131] 1.89.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 08c8812e..ab513db8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.88.0", + "version": "1.89.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 90cf99f6..2daadc7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.88.0", + "version": "1.89.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 6b2fa7b7dd471dc0823b5fcca5dc5bc0d4fd1eec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 May 2021 23:56:26 +0000 Subject: [PATCH 126/131] Bump hosted-git-info from 2.7.1 to 2.8.9 Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.7.1 to 2.8.9. - [Release notes](https://github.com/npm/hosted-git-info/releases) - [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) - [Commits](https://github.com/npm/hosted-git-info/compare/v2.7.1...v2.8.9) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab513db8..ec97efe3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -789,9 +789,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc= sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "htmlparser2": { From 60aee6756eccc1d514e7c8c64b96c799c04b4be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 12 May 2021 09:36:12 +0200 Subject: [PATCH 127/131] fixes #553 --- src/package.ts | 2 +- src/test/package.test.ts | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/package.ts b/src/package.ts index ebac8b61..499b81f4 100644 --- a/src/package.ts +++ b/src/package.ts @@ -209,7 +209,7 @@ function isGitLabRepository(repository: string): boolean { } function isGitHubBadge(href: string): boolean { - return /^https:\/\/github\.com\/[^/]+\/[^/]+\/workflows\/.*badge\.svg/.test(href || ''); + return /^https:\/\/github\.com\/[^/]+\/[^/]+\/(actions\/)?workflows\/.*badge\.svg/.test(href || ''); } function isHostTrusted(url: url.UrlWithStringQuery): boolean { diff --git a/src/test/package.test.ts b/src/test/package.test.ts index 4896c097..d1f0c628 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -2355,7 +2355,7 @@ describe('MarkdownProcessor', () => { assert(file); }); - it('should allow SVG from GitHub actions in image tag', async () => { + it('should allow SVG from GitHub actions in image tag (old url format)', async () => { const manifest = { name: 'test', publisher: 'mocha', @@ -2371,6 +2371,22 @@ describe('MarkdownProcessor', () => { assert(file); }); + it('should allow SVG from GitHub actions in image tag', async () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + repository: 'https://github.com/username/repository', + }; + const contents = `![title](https://github.com/fakeuser/fakerepo/actions/workflows/fakeworkflowname/badge.svg)`; + const processor = new ReadmeProcessor(manifest, {}); + const readme = { path: 'extension/readme.md', contents }; + + const file = await processor.onFile(readme); + assert(file); + }); + it('should prevent SVG from a GitHub repo in image tag', async () => { const manifest = { name: 'test', From 22a3e7fe4f216341247459ca982d090c3d8e6799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 12 May 2021 09:44:12 +0200 Subject: [PATCH 128/131] 1.90.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec97efe3..03363373 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.89.0", + "version": "1.90.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2daadc7b..3c43622d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.89.0", + "version": "1.90.0", "description": "VSCode Extension Manager", "repository": { "type": "git", From 63362ea17ef47a29638d3e34dc05243d15e7a136 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 14 May 2021 15:58:16 +0000 Subject: [PATCH 129/131] add remote-menu tag --- src/package.ts | 13 ++++++++++++- src/test/package.test.ts | 25 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/package.ts b/src/package.ts index 499b81f4..18da7338 100644 --- a/src/package.ts +++ b/src/package.ts @@ -361,7 +361,16 @@ export class TagsProcessor extends BaseProcessor { const keywords = this.manifest.keywords || []; const contributes = this.manifest.contributes; const activationEvents = this.manifest.activationEvents || []; - const doesContribute = name => contributes && contributes[name] && contributes[name].length > 0; + const doesContribute = (...properties: string[]) => { + let obj = contributes; + for (const property of properties) { + if (!obj) { + return false; + } + obj = obj[property]; + } + return obj && obj.length > 0; + }; const colorThemes = doesContribute('themes') ? ['theme', 'color-theme'] : []; const iconThemes = doesContribute('iconThemes') ? ['theme', 'icon-theme'] : []; @@ -370,6 +379,7 @@ export class TagsProcessor extends BaseProcessor { const keybindings = doesContribute('keybindings') ? ['keybindings'] : []; const debuggers = doesContribute('debuggers') ? ['debuggers'] : []; const json = doesContribute('jsonValidation') ? ['json'] : []; + const remoteMenu = doesContribute('menus', 'statusBar/remoteIndicator') ? ['remote-menu'] : []; const localizationContributions = ((contributes && contributes['localizations']) || []).reduce( (r, l) => [...r, `lp-${l.languageId}`, ...toLanguagePackTags(l.translations, l.languageId)], @@ -406,6 +416,7 @@ export class TagsProcessor extends BaseProcessor { ...keybindings, ...debuggers, ...json, + ...remoteMenu, ...localizationContributions, ...languageContributions, ...languageActivations, diff --git a/src/test/package.test.ts b/src/test/package.test.ts index d1f0c628..23315f5a 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -945,6 +945,31 @@ describe('toVsixManifest', () => { }); }); + it('should automatically add remote-menu tag', () => { + const manifest = { + name: 'test', + publisher: 'mocha', + version: '0.0.1', + engines: Object.create(null), + contributes: { + menus: { + 'statusBar/remoteIndicator': [ + { + command: 'remote-wsl.newWindow', + }, + ], + }, + }, + }; + + return _toVsixManifest(manifest, []) + .then(parseXmlManifest) + .then(result => { + const tags = result.PackageManifest.Metadata[0].Tags[0].split(',') as string[]; + assert(tags.some(tag => tag === 'remote-menu')); + }); + }); + it('should automatically add language tag with activationEvent', () => { const manifest = { name: 'test', From ddf46709a8b9b8d6c5067ed6f2b3aa1008e494a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 1 Jun 2021 11:30:53 +0200 Subject: [PATCH 130/131] fix compilation errors, update ts --- package-lock.json | 227 +++++++++++++++++++++------------------------- package.json | 8 +- src/package.ts | 2 +- 3 files changed, 107 insertions(+), 130 deletions(-) diff --git a/package-lock.json b/package-lock.json index 03363373..45143b00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,10 +31,13 @@ } }, "@types/cheerio": { - "version": "0.22.10", - "resolved": "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.10.tgz", - "integrity": "sha1-eA1VJGeCS+SiQbKVEKeHOnQyxKY= sha512-fOM/Jhv51iyugY7KOBZz2ThfT1gwvsGCfWxpLpZDgkGjpEO4Le9cld07OdskikLjDUQJ43dzDaVRSFwQlpdqVg==", - "dev": true + "version": "0.22.29", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.29.tgz", + "integrity": "sha512-rNX1PsrDPxiNiyLnRKiW2NXHJFHqx0Fl3J2WsZq0MTBspa/FgwlqhXJE2crIcc+/2IglLHtSWw7g053oUR8fOg==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/color-name": { "version": "1.1.1", @@ -104,9 +107,9 @@ "dev": true }, "@types/node": { - "version": "8.10.38", - "resolved": "https://registry.yarnpkg.com/@types/node/-/node-8.10.38.tgz", - "integrity": "sha1-4FwgGmaEkuU0tIECrKApSJj0SfY= sha512-EibsnbJerd0hBFaDjJStFrVbVBAtOy4dgL8zZFw0uOvPqzBAX59Ci8cgjg3+RgJIWhsB5A4c+pi+D4P9tQQh/A==", + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", "dev": true }, "@types/parse-json": { @@ -302,25 +305,38 @@ } }, "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.9.tgz", + "integrity": "sha512-QF6XVdrLONO6DXRF5iaolY+odmhj2CLj+xzNod7INPWMi/x9X4SOylH0S/vaPpX+AUU6t04s34SQNh7DbkuCng==", + "requires": { + "cheerio-select": "^1.4.0", + "dom-serializer": "^1.3.1", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" }, "dependencies": { - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha1-5I3e2+MLMyF4PFtDAfvTU7weSks= sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" } } }, + "cheerio-select": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.4.0.tgz", + "integrity": "sha512-sobR3Yqz27L553Qa7cK6rtJlMDbiKPdNywtR95Sj/YgfpLfy0u6CGJuaBKe5YE/vTc23SCRKxWSdlon/w6I/Ew==", + "requires": { + "css-select": "^4.1.2", + "css-what": "^5.0.0", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0" + } + }, "chokidar": { "version": "3.3.0", "resolved": "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz", @@ -329,6 +345,7 @@ "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", + "fsevents": "~2.1.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -460,20 +477,21 @@ } }, "css-select": { - "version": "1.2.0", - "resolved": "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.2.tgz", + "integrity": "sha512-nu5ye2Hg/4ISq4XqdLY2bEatAcLIdt3OYGFc9Tm9n7VSlFBcfRv0gBNksHRgSdUDQGtN3XrZ94ztW+NfzkFSUw==", "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" } }, "css-what": { - "version": "2.1.2", - "resolved": "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz", - "integrity": "sha1-wIdtnQSAkn19SSDc1yrzWVZJVU0= sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" }, "date-fns": { "version": "2.9.0", @@ -525,41 +543,36 @@ "dev": true }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" - } + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" } }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8= sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM= sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", "requires": { - "domelementtype": "1" + "domelementtype": "^2.2.0" } }, "domutils": { - "version": "1.5.1", - "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.6.0.tgz", + "integrity": "sha512-y0BezHuy4MDYxh6OvolXYsH+1EMGmFbwv5FKW7ovwMG6zTPWqNPq3WF9ayZssFq+UlKdffGLbOEaghNdaOm1WA==", "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } }, "emoji-regex": { @@ -578,9 +591,9 @@ } }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz", - "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY= sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, "error-ex": { "version": "1.3.2", @@ -706,6 +719,13 @@ "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz", @@ -795,27 +815,14 @@ "dev": true }, "htmlparser2": { - "version": "3.10.0", - "resolved": "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz", - "integrity": "sha1-X15CLc9hGcDZg+02Jgzp3tC+5GQ= sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.0.6" - }, - "dependencies": { - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo= sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, "human-signals": { @@ -1279,11 +1286,11 @@ } }, "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw= sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", "requires": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" } }, "object-inspect": { @@ -1413,18 +1420,16 @@ } }, "parse5": { - "version": "3.0.3", - "resolved": "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha1-BC95L/3TaFFVHPTp4Gazh0q0W1w= sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "requires": { - "@types/node": "*" - }, - "dependencies": { - "@types/node": { - "version": "10.12.15", - "resolved": "https://registry.yarnpkg.com/@types/node/-/node-10.12.15.tgz", - "integrity": "sha1-IOhWUbYv2GZW5Xycm8dxqxVwvFk= sha512-9kROxduaN98QghwwHmxXO2Xz3MaWf+I1sLVAA6KJDF5xix+IyXVhds0MAfdNwtcpSrzhaTsNB0/jnL86fgUhqA==" - } + "parse5": "^6.0.1" } }, "path-exists": { @@ -1673,16 +1678,6 @@ "pify": "^3.0.0" } }, - "readable-stream": { - "version": "3.1.0", - "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.0.tgz", - "integrity": "sha1-GcLpwc5DUHxT9u77zx7j1KqnhvU= sha512-vpydAvIJvPODZNagCPuHG87O9JNPtvFEtjHHRVwNVsVVRBqemvPJkc2SYbxJsiZXawJdtZNmkmnsPuE3IgsG0A==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, "readdirp": { "version": "3.2.0", "resolved": "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz", @@ -1728,11 +1723,6 @@ "tslib": "^1.9.0" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0= sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "sax": { "version": "1.2.4", "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz", @@ -1910,14 +1900,6 @@ "es-abstract": "^1.17.5" } }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha1-/obnOLGVRK/nBGkkOyoe6SQOro0= sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -2001,9 +1983,9 @@ } }, "typescript": { - "version": "3.4.3", - "resolved": "https://registry.yarnpkg.com/typescript/-/typescript-3.4.3.tgz", - "integrity": "sha1-DrMg5KzpsQ6t9bxhAyhrD4t8Ik8= sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", + "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", "dev": true }, "uc.micro": { @@ -2021,11 +2003,6 @@ "resolved": "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz", "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=" }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", diff --git a/package.json b/package.json index 3c43622d..a9992cf6 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "dependencies": { "azure-devops-node-api": "^10.2.2", "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.1", + "cheerio": "^1.0.0-rc.9", "commander": "^6.1.0", "denodeify": "^1.2.1", "glob": "^7.0.6", @@ -58,7 +58,7 @@ "yazl": "^2.2.2" }, "devDependencies": { - "@types/cheerio": "^0.22.1", + "@types/cheerio": "^0.22.29", "@types/denodeify": "^1.2.31", "@types/glob": "^7.1.1", "@types/lodash": "^4.14.123", @@ -66,7 +66,7 @@ "@types/mime": "^1", "@types/minimatch": "^3.0.3", "@types/mocha": "^7.0.2", - "@types/node": "^8", + "@types/node": "^10.17.60", "@types/read": "^0.0.28", "@types/semver": "^6.0.0", "@types/tmp": "^0.1.0", @@ -77,7 +77,7 @@ "prettier": "2.1.2", "pretty-quick": "^3.0.2", "source-map-support": "^0.4.2", - "typescript": "^3.4.3", + "typescript": "^4.3.2", "xml2js": "^0.4.12" }, "mocha": { diff --git a/src/package.ts b/src/package.ts index 18da7338..d82130d5 100644 --- a/src/package.ts +++ b/src/package.ts @@ -569,7 +569,7 @@ export class MarkdownProcessor extends BaseProcessor { const $ = cheerio.load(html); $('img').each((_, img) => { - const src = decodeURI(img.attribs.src); + const src = decodeURI($(img).attr('src')); const srcUrl = url.parse(src); if (/^data:$/i.test(srcUrl.protocol) && /^image$/i.test(srcUrl.host) && /\/svg/i.test(srcUrl.path)) { From e2a7ae77fe337a318ada54428f64d4c721c5bb9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 1 Jun 2021 11:32:48 +0200 Subject: [PATCH 131/131] 1.91.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 45143b00..b252c65f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.90.0", + "version": "1.91.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a9992cf6..60f598e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vsce", - "version": "1.90.0", + "version": "1.91.0", "description": "VSCode Extension Manager", "repository": { "type": "git",