From 754190f32699960178460e0da365d2f2256249ac Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 24 Nov 2021 13:45:17 +0100 Subject: [PATCH] Run unit tests against node.js too (#137790) * tests - run unit tests also against node.js * fixes * fail if major node.js version mismatch * -tfs is unsupported * Add `@ts-check` and remove `jsdom` * tests - process.env layer breaker * Improve loader config * skip one test * address todos * try to force color output * Use a file: URI as baseUrl Co-authored-by: Alex Dima --- .github/workflows/ci.yml | 10 ++ .../darwin/product-build-darwin.yml | 7 ++ .../linux/product-build-linux.yml | 7 ++ .../win32/product-build-win32.yml | 8 ++ package.json | 3 +- src/vs/base/test/common/event.test.ts | 1 - .../contrib/debug/test/node/debugger.test.ts | 5 +- .../fileDialogService.test.ts | 0 .../test/node/encoding/encoding.test.ts | 3 + .../test/browser/workbenchTestServices.ts | 3 +- test/unit/node/browser.js | 49 -------- test/unit/node/css.mock.js | 12 -- test/unit/node/index.html | 30 ----- test/unit/node/{all.js => index.js} | 105 ++++++++++++------ yarn.lock | 79 +------------ 15 files changed, 114 insertions(+), 208 deletions(-) rename src/vs/workbench/services/dialogs/test/{ => electron-sandbox}/fileDialogService.test.ts (100%) delete mode 100644 test/unit/node/browser.js delete mode 100644 test/unit/node/css.mock.js delete mode 100644 test/unit/node/index.html rename test/unit/node/{all.js => index.js} (59%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9a813b8901b..312852c4eeb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,6 +72,9 @@ jobs: - name: Run Unit Tests (Electron) run: .\scripts\test.bat + - name: Run Unit Tests (node.js) + run: yarn test-node + - name: Run Unit Tests (Browser) run: yarn test-browser --browser chromium @@ -147,6 +150,10 @@ jobs: id: electron-unit-tests run: DISPLAY=:10 ./scripts/test.sh + - name: Run Unit Tests (node.js) + id: nodejs-unit-tests + run: yarn test-node + - name: Run Unit Tests (Browser) id: browser-unit-tests run: DISPLAY=:10 yarn test-browser --browser chromium @@ -222,6 +229,9 @@ jobs: - name: Run Unit Tests (Electron) run: DISPLAY=:10 ./scripts/test.sh + - name: Run Unit Tests (node.js) + run: yarn test-node + - name: Run Unit Tests (Browser) run: DISPLAY=:10 yarn test-browser --browser chromium diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 0e9676b3842..93f575abbeb 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -179,6 +179,13 @@ steps: timeoutInMinutes: 7 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + - script: | + set -e + yarn test-node --build + displayName: Run unit tests (node.js) + timeoutInMinutes: 7 + condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + - script: | set -e yarn test-browser --build --browser chromium --browser webkit --browser firefox --tfs "Browser Unit Tests" diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 707b34e1800..23c03767a16 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -162,6 +162,13 @@ steps: timeoutInMinutes: 7 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + - script: | + set -e + yarn test-node --build + displayName: Run unit tests (node.js) + timeoutInMinutes: 7 + condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) + - script: | set -e yarn test-browser --build --browser chromium --tfs "Browser Unit Tests" diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index ff07bb2927b..8d3e0aab72b 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -150,6 +150,14 @@ steps: timeoutInMinutes: 7 condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) + - powershell: | + . build/azure-pipelines/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn test-node --build } + displayName: Run unit tests (node.js) + timeoutInMinutes: 7 + condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) + - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" diff --git a/package.json b/package.json index 5a7ab5e9d05..a6d858f5c11 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "scripts": { "test": "mocha", "test-browser": "node test/unit/browser/index.js", + "test-node": "mocha test/unit/node/index.js --delay --ui=tdd --exit", "preinstall": "node build/npm/preinstall.js", "postinstall": "node build/npm/postinstall.js", "compile": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js compile", @@ -27,7 +28,6 @@ "watch-extensions": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js watch-extensions watch-extension-media", "watch-extensionsd": "deemon yarn watch-extensions", "kill-watch-extensionsd": "deemon --kill yarn watch-extensions", - "mocha": "mocha test/unit/node/all.js --delay --ui=tdd", "precommit": "node build/hygiene.js", "gulp": "node --max_old_space_size=8192 ./node_modules/gulp/bin/gulp.js", "electron": "node build/lib/electron", @@ -169,7 +169,6 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.0", - "jsdom-no-contextify": "^3.1.0", "lazy.js": "^0.4.2", "merge-options": "^1.0.1", "mime": "^1.4.1", diff --git a/src/vs/base/test/common/event.test.ts b/src/vs/base/test/common/event.test.ts index 8df7267572b..9fa0a7fb49c 100644 --- a/src/vs/base/test/common/event.test.ts +++ b/src/vs/base/test/common/event.test.ts @@ -48,7 +48,6 @@ suite('Event', function () { let doc = new Samples.Document3(); - document.createElement('div').onclick = function () { }; let subscription = doc.onDidChange(counter.onEvent, counter); doc.setText('far'); diff --git a/src/vs/workbench/contrib/debug/test/node/debugger.test.ts b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts index a42e4d128d9..8f1278c1cd6 100644 --- a/src/vs/workbench/contrib/debug/test/node/debugger.test.ts +++ b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts @@ -149,7 +149,10 @@ suite('Debug - Debugger', () => { assert.deepStrictEqual(ae!.args, debuggerContribution.args); }); - test('merge platform specific attributes', () => { + test('merge platform specific attributes', function () { + if (!process.versions.electron) { + this.skip(); //TODO@debug this test fails when run in node.js environments + } const ae = ExecutableDebugAdapter.platformAdapterExecutable([extensionDescriptor1, extensionDescriptor2], 'mock')!; assert.strictEqual(ae.command, platform.isLinux ? 'linuxRuntime' : (platform.isMacintosh ? 'osxRuntime' : 'winRuntime')); const xprogram = platform.isLinux ? 'linuxProgram' : (platform.isMacintosh ? 'osxProgram' : 'winProgram'); diff --git a/src/vs/workbench/services/dialogs/test/fileDialogService.test.ts b/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts similarity index 100% rename from src/vs/workbench/services/dialogs/test/fileDialogService.test.ts rename to src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts diff --git a/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts b/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts index 1b1ab46198d..dccab33e1e9 100644 --- a/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts +++ b/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts @@ -322,6 +322,9 @@ suite('Encoding', () => { }); test('toDecodeStream - decodes buffer entirely', async function () { + if (!process.versions.electron) { + this.skip(); // TODO@bpasero enable once we ship Electron 16 + } const emojis = Buffer.from('🖥️💻💾'); const incompleteEmojis = emojis.slice(0, emojis.length - 1); diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index 4e68ef3f427..d41752d564c 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -144,6 +144,7 @@ import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/te import { FindReplaceState } from 'vs/editor/contrib/find/findState'; import { TerminalEditorInput } from 'vs/workbench/contrib/terminal/browser/terminalEditorInput'; import { DeserializedTerminalEditorInput } from 'vs/workbench/contrib/terminal/browser/terminalEditorSerializer'; +import { env } from 'vs/base/common/process'; export function createFileEditorInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { return instantiationService.createInstance(FileEditorInput, resource, undefined, undefined, undefined, undefined, undefined, undefined); @@ -1822,7 +1823,7 @@ export class TestTerminalProfileResolverService implements ITerminalProfileResol async getDefaultProfile(options: IShellLaunchConfigResolveOptions): Promise { return { path: '/default', profileName: 'Default', isDefault: true }; } async getDefaultShell(options: IShellLaunchConfigResolveOptions): Promise { return '/default'; } async getDefaultShellArgs(options: IShellLaunchConfigResolveOptions): Promise { return []; } - async getEnvironment(): Promise { return process.env; } + async getEnvironment(): Promise { return env; } getSafeConfigValue(key: string, os: OperatingSystem): unknown | undefined { return undefined; } getSafeConfigValueFullKey(key: string): unknown | undefined { return undefined; } createProfileFromShellAndShellArgs(shell?: unknown, shellArgs?: unknown): Promise { throw new Error('Method not implemented.'); } diff --git a/test/unit/node/browser.js b/test/unit/node/browser.js deleted file mode 100644 index a564b7672e2..00000000000 --- a/test/unit/node/browser.js +++ /dev/null @@ -1,49 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -const yaserver = require('yaserver'); -const http = require('http'); -const glob = require('glob'); -const path = require('path'); -const fs = require('fs'); - -const REPO_ROOT = path.join(__dirname, '../../../'); -const PORT = 8887; - -function template(str, env) { - return str.replace(/{{\s*([\w_\-]+)\s*}}/g, function (all, part) { - return env[part]; - }); -} - -yaserver.createServer({ rootDir: REPO_ROOT }).then((staticServer) => { - const server = http.createServer((req, res) => { - if (req.url === '' || req.url === '/') { - glob('**/vs/{base,platform,editor}/**/test/{common,browser}/**/*.test.js', { - cwd: path.join(REPO_ROOT, 'out'), - // ignore: ['**/test/{node,electron*}/**/*.js'] - }, function (err, files) { - if (err) { console.log(err); process.exit(0); } - - var modules = files - .map(function (file) { return file.replace(/\.js$/, ''); }); - - fs.readFile(path.join(__dirname, 'index.html'), 'utf8', function (err, templateString) { - if (err) { console.log(err); process.exit(0); } - - res.end(template(templateString, { - modules: JSON.stringify(modules) - })); - }); - }); - } else { - return staticServer.handle(req, res); - } - }); - - server.listen(PORT, () => { - console.log(`http://localhost:${PORT}/`); - }); -}); diff --git a/test/unit/node/css.mock.js b/test/unit/node/css.mock.js deleted file mode 100644 index 1829c6ae48e..00000000000 --- a/test/unit/node/css.mock.js +++ /dev/null @@ -1,12 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -define([], function() { - return { - load: function(name, req, load) { - load({}); - } - }; -}); diff --git a/test/unit/node/index.html b/test/unit/node/index.html deleted file mode 100644 index b0b65c6b2c8..00000000000 --- a/test/unit/node/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - VSCode Tests - - - -
- - - - - - - diff --git a/test/unit/node/all.js b/test/unit/node/index.js similarity index 59% rename from test/unit/node/all.js rename to test/unit/node/index.js index dc9b21fac2c..1be289b9a71 100644 --- a/test/unit/node/all.js +++ b/test/unit/node/index.js @@ -3,13 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -/*eslint-env mocha*/ -/*global define,run*/ +//@ts-check + +process.env.MOCHA_COLORS = '1'; // Force colors (note that this must come before any mocha imports) const assert = require('assert'); +const mocha = require('mocha'); const path = require('path'); +const fs = require('fs'); const glob = require('glob'); -const jsdom = require('jsdom-no-contextify'); const minimatch = require('minimatch'); const coverage = require('../coverage'); const optimist = require('optimist') @@ -17,13 +19,21 @@ const optimist = require('optimist') .describe('build', 'Run from out-build').boolean('build') .describe('run', 'Run a single file').string('run') .describe('coverage', 'Generate a coverage report').boolean('coverage') - .describe('browser', 'Run tests in a browser').boolean('browser') .alias('h', 'help').boolean('h') .describe('h', 'Show help'); + const TEST_GLOB = '**/test/**/*.test.js'; const excludeGlob = '**/{browser,electron-sandbox,electron-browser,electron-main,editor/contrib}/**/*.test.js'; +const excludeModules = [ + 'vs/platform/environment/test/node/nativeModules.test.js', + 'vs/base/parts/storage/test/node/storage.test.js', + 'vs/platform/files/test/common/files.test.js' // TODO@bpasero enable once we ship Electron 16 +] +/** + * @type {{ build: boolean; run: string; runGlob: string; coverage: boolean; help: boolean; }} + */ const argv = optimist.argv; if (argv.help) { @@ -36,21 +46,54 @@ const out = argv.build ? 'out-build' : 'out'; const loader = require(`../../../${out}/vs/loader`); const src = path.join(REPO_ROOT, out); +const majorRequiredNodeVersion = `v${/^target\s+"([^"]+)"$/m.exec(fs.readFileSync(path.join(REPO_ROOT, 'remote', '.yarnrc'), 'utf8'))[1]}`.substring(0, 3); +const currentMajorNodeVersion = process.version.substring(0, 3); +if (majorRequiredNodeVersion !== currentMajorNodeVersion) { + console.error(`node.js unit tests require a major node.js version of ${majorRequiredNodeVersion} (your version is: ${currentMajorNodeVersion})`); + process.exit(1); +} + function main() { process.on('uncaughtException', function (e) { console.error(e.stack || e); }); + /** + * @param {string} path + * @param {{ isWindows?: boolean, scheme?: string, fallbackAuthority?: string }} config + * @returns {string} + */ + function fileUriFromPath(path, config) { + + // Since we are building a URI, we normalize any backslash + // to slashes and we ensure that the path begins with a '/'. + let pathName = path.replace(/\\/g, '/'); + if (pathName.length > 0 && pathName.charAt(0) !== '/') { + pathName = `/${pathName}`; + } + + /** @type {string} */ + let uri; + + // Windows: in order to support UNC paths (which start with '//') + // that have their own authority, we do not use the provided authority + // but rather preserve it. + if (config.isWindows && pathName.startsWith('//')) { + uri = encodeURI(`${config.scheme || 'file'}:${pathName}`); + } + + // Otherwise we optionally add the provided authority if specified + else { + uri = encodeURI(`${config.scheme || 'file'}://${config.fallbackAuthority || ''}${pathName}`); + } + + return uri.replace(/#/g, '%23'); + } + const loaderConfig = { nodeRequire: require, nodeMain: __filename, - baseUrl: path.join(REPO_ROOT, 'src'), - paths: { - 'vs/css': '../test/unit/node/css.mock', - 'vs': `../${out}/vs`, - 'lib': `../${out}/lib`, - 'bootstrap-fork': `../${out}/bootstrap-fork` - }, + baseUrl: fileUriFromPath(src, { isWindows: process.platform === 'win32' }), catchError: true }; @@ -67,28 +110,19 @@ function main() { loader.config(loaderConfig); - global.define = loader; - global.document = jsdom.jsdom(''); - global.self = global.window = global.document.parentWindow; - - global.Element = global.window.Element; - global.HTMLElement = global.window.HTMLElement; - global.Node = global.window.Node; - global.navigator = global.window.navigator; - global.XMLHttpRequest = global.window.XMLHttpRequest; - let didErr = false; const write = process.stderr.write; - process.stderr.write = function (data) { - didErr = didErr || !!data; - write.apply(process.stderr, arguments); + process.stderr.write = function (...args) { + didErr = didErr || !!args[0]; + return write.apply(process.stderr, args); }; + /** @type { (callback:(err:any)=>void)=>void } */ let loadFunc = null; if (argv.runGlob) { loadFunc = (cb) => { - const doRun = tests => { + const doRun = /** @param {string[]} tests */(tests) => { const modulesToLoad = tests.map(test => { if (path.isAbsolute(test)) { test = path.relative(src, path.resolve(test)); @@ -96,7 +130,7 @@ function main() { return test.replace(/(\.js)|(\.d\.ts)|(\.js\.map)$/, ''); }); - define(modulesToLoad, () => cb(null), cb); + loader(modulesToLoad, () => cb(null), cb); }; glob(argv.runGlob, { cwd: src }, function (err, files) { doRun(files); }); @@ -109,18 +143,19 @@ function main() { return path.relative(src, path.resolve(test)).replace(/(\.js)|(\.js\.map)$/, '').replace(/\\/g, '/'); }); loadFunc = (cb) => { - define(modulesToLoad, () => cb(null), cb); + loader(modulesToLoad, () => cb(null), cb); }; } else { loadFunc = (cb) => { glob(TEST_GLOB, { cwd: src }, function (err, files) { + /** @type {string[]} */ const modules = []; for (let file of files) { - if (!minimatch(file, excludeGlob)) { + if (!minimatch(file, excludeGlob) && excludeModules.indexOf(file) === -1) { modules.push(file.replace(/\.js$/, '')); } } - define(modules, function () { cb(null); }, cb); + loader(modules, function () { cb(null); }, cb); }); }; } @@ -135,7 +170,7 @@ function main() { if (!argv.run && !argv.runGlob) { // set up last test - suite('Loader', function () { + mocha.suite('Loader', function () { test('should not explode while loading', function () { assert.ok(!didErr, 'should not explode while loading'); }); @@ -144,7 +179,7 @@ function main() { // report failing test for every unexpected error during any of the tests let unexpectedErrors = []; - suite('Errors', function () { + mocha.suite('Errors', function () { test('should not have unexpected errors in tests', function () { if (unexpectedErrors.length) { unexpectedErrors.forEach(function (stack) { @@ -165,13 +200,9 @@ function main() { }); // fire up mocha - run(); + mocha.run(); }); }); } -if (process.argv.some(function (a) { return /^--browser/.test(a); })) { - require('./browser'); -} else { - main(); -} +main(); diff --git a/yarn.lock b/yarn.lock index 6902acf0098..b6b77dee326 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1933,11 +1933,6 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -"browser-request@>= 0.3.1 < 0.4.0": - version "0.3.3" - resolved "https://registry.yarnpkg.com/browser-request/-/browser-request-0.3.3.tgz#9ece5b5aca89a29932242e18bf933def9876cc17" - integrity sha1-ns5bWsqJopkyJC4Yv5M975h2zBc= - browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -2994,18 +2989,6 @@ csso@^4.0.2: dependencies: css-tree "^1.1.2" -cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -"cssstyle@>= 0.2.21 < 0.3.0": - version "0.2.37" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" - integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= - dependencies: - cssom "0.3.x" - cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -3308,7 +3291,7 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@1, domelementtype@^1.3.1: +domelementtype@1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== @@ -3318,14 +3301,7 @@ domelementtype@^2.0.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== -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, domutils@^1.7.0: +domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== @@ -3478,11 +3454,6 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.8.0: graceful-fs "^4.2.4" tapable "^2.2.0" -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.1.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" @@ -5211,18 +5182,6 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== -"htmlparser2@>= 3.7.3 < 4.0.0": - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -6029,21 +5988,6 @@ jsdoctypeparser@^6.1.0: resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz#acfb936c26300d98f1405cb03e20b06748e512a8" integrity sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA== -jsdom-no-contextify@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsdom-no-contextify/-/jsdom-no-contextify-3.1.0.tgz#0d8beaf610c2ff23894f54dfa7f89dd22fd0f7ab" - integrity sha1-DYvq9hDC/yOJT1Tfp/id0i/Q96s= - dependencies: - browser-request ">= 0.3.1 < 0.4.0" - cssom ">= 0.3.0 < 0.4.0" - cssstyle ">= 0.2.21 < 0.3.0" - htmlparser2 ">= 3.7.3 < 4.0.0" - nwmatcher ">= 1.3.4 < 2.0.0" - parse5 ">= 1.3.1 < 2.0.0" - request ">= 2.44.0 < 3.0.0" - xml-name-validator "^1.0.0" - xmlhttprequest ">= 1.6.0 < 2.0.0" - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -7209,7 +7153,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -"nwmatcher@>= 1.3.4 < 2.0.0", nwmatcher@^1.4.4: +nwmatcher@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== @@ -7565,11 +7509,6 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= -"parse5@>= 1.3.1 < 2.0.0": - version "1.5.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" - integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= - pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -8582,7 +8521,7 @@ replacestream@^4.0.0: object-assign "^4.0.1" readable-stream "^2.0.2" -"request@>= 2.44.0 < 3.0.0", request@^2.85.0, request@^2.88.0: +request@^2.85.0, request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -10861,11 +10800,6 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.2.tgz#09cc8fea3bec1bc5ed44ef51b42f945be36900f6" integrity sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ== -xml-name-validator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-1.0.0.tgz#dcf82ee092322951ef8cc1ba596c9cbfd14a83f1" - integrity sha1-3Pgu4JIyKVHvjMG6WWycv9FKg/E= - xml2js@^0.4.17: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" @@ -10902,11 +10836,6 @@ xmlbuilder@~9.0.1: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f" integrity sha1-UZy0ymhtAFqEINNJbz8MruzKWA8= -"xmlhttprequest@>= 1.6.0 < 2.0.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= - xregexp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"