From c39b5f32a06400477a969ab008e8618a9dda9f44 Mon Sep 17 00:00:00 2001 From: mehrad-rafigh Date: Wed, 1 Jan 2020 14:16:06 +0100 Subject: [PATCH] feat(testing): update jest-preset-angular to v8.0.0 Closed issues: #1979, #2165 Co-authored-by: Joshua D. Mentzer --- CONTRIBUTING.md | 2 +- .../application/application.spec.ts | 111 +++++++++++------- packages/jest/migrations.json | 17 ++- .../update-8-10-0.spec.ts} | 24 +++- .../update-8-10-0.ts} | 48 +++++--- .../jest-project/files/jest.config.js__tmpl__ | 1 + .../jest-project/jest-project.spec.ts | 2 + yarn.lock | 59 ++++++---- 8 files changed, 173 insertions(+), 91 deletions(-) rename packages/jest/src/migrations/{update-8-8-0/update-8-8-0.spec.ts => update-8-10-0/update-8-10-0.spec.ts} (85%) rename packages/jest/src/migrations/{update-8-8-0/update-8-8-0.ts => update-8-10-0/update-8-10-0.ts} (81%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c677b411d30109..b57e0e4752df31 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -80,7 +80,7 @@ While developing you may want to try out the changes you have made. The easier w yarn create-playground ``` -You can then go to `tmp/nx` (this is set up to use Nx CLI) or `tmp/angular` (this is set up to use Angular CLI), where you will find an empty workspace with your changes in it, something this that: +You can then go to `tmp/nx` (this is set up to use Nx CLI) or `tmp/angular` (this is set up to use Angular CLI), where you will find an empty workspace with your changes in it.: ```bash yarn create-playground diff --git a/packages/angular/src/schematics/application/application.spec.ts b/packages/angular/src/schematics/application/application.spec.ts index ee41e27e0a3682..c2b5a0d91c4512 100644 --- a/packages/angular/src/schematics/application/application.spec.ts +++ b/packages/angular/src/schematics/application/application.spec.ts @@ -361,54 +361,75 @@ describe('app', () => { }); }); - describe('--unit-test-runner karma', () => { - it('should generate a karma config', async () => { - const tree = await runSchematic( - 'app', - { name: 'myApp', unitTestRunner: 'karma' }, - appTree - ); + describe('--unit-test-runner', () => { + describe('default (jest)', () => { + it('should generate jest.config.js with serializers', async () => { + const tree = await runSchematic('app', { name: 'myApp' }, appTree); - expect(tree.exists('apps/my-app/tsconfig.spec.json')).toBeTruthy(); - expect(tree.exists('apps/my-app/karma.conf.js')).toBeTruthy(); - const workspaceJson = readJsonInTree(tree, 'workspace.json'); - expect(workspaceJson.projects['my-app'].architect.test.builder).toEqual( - '@angular-devkit/build-angular:karma' - ); - expect( - workspaceJson.projects['my-app'].architect.lint.options.tsConfig - ).toEqual([ - 'apps/my-app/tsconfig.app.json', - 'apps/my-app/tsconfig.spec.json' - ]); - const tsconfigAppJson = readJsonInTree( - tree, - 'apps/my-app/tsconfig.app.json' - ); - expect(tsconfigAppJson.exclude).toEqual(['src/test.ts', '**/*.spec.ts']); - expect(tsconfigAppJson.compilerOptions.outDir).toEqual( - '../../dist/out-tsc' - ); + expect(tree.readContent('apps/my-app/jest.config.js')).toContain( + `'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js'` + ); + expect(tree.readContent('apps/my-app/jest.config.js')).toContain( + `'jest-preset-angular/build/AngularSnapshotSerializer.js'` + ); + expect(tree.readContent('apps/my-app/jest.config.js')).toContain( + `'jest-preset-angular/build/HTMLCommentSerializer.js'` + ); + }); }); - }); - describe('--unit-test-runner none', () => { - it('should not generate test configuration', async () => { - const tree = await runSchematic( - 'app', - { name: 'myApp', unitTestRunner: 'none' }, - appTree - ); - expect(tree.exists('apps/my-app/src/test-setup.ts')).toBeFalsy(); - expect(tree.exists('apps/my-app/src/test.ts')).toBeFalsy(); - expect(tree.exists('apps/my-app/tsconfig.spec.json')).toBeFalsy(); - expect(tree.exists('apps/my-app/jest.config.js')).toBeFalsy(); - expect(tree.exists('apps/my-app/karma.config.js')).toBeFalsy(); - const workspaceJson = readJsonInTree(tree, 'workspace.json'); - expect(workspaceJson.projects['my-app'].architect.test).toBeUndefined(); - expect( - workspaceJson.projects['my-app'].architect.lint.options.tsConfig - ).toEqual(['apps/my-app/tsconfig.app.json']); + describe('karma', () => { + it('should generate a karma config', async () => { + const tree = await runSchematic( + 'app', + { name: 'myApp', unitTestRunner: 'karma' }, + appTree + ); + + expect(tree.exists('apps/my-app/tsconfig.spec.json')).toBeTruthy(); + expect(tree.exists('apps/my-app/karma.conf.js')).toBeTruthy(); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['my-app'].architect.test.builder).toEqual( + '@angular-devkit/build-angular:karma' + ); + expect( + workspaceJson.projects['my-app'].architect.lint.options.tsConfig + ).toEqual([ + 'apps/my-app/tsconfig.app.json', + 'apps/my-app/tsconfig.spec.json' + ]); + const tsconfigAppJson = readJsonInTree( + tree, + 'apps/my-app/tsconfig.app.json' + ); + expect(tsconfigAppJson.exclude).toEqual([ + 'src/test.ts', + '**/*.spec.ts' + ]); + expect(tsconfigAppJson.compilerOptions.outDir).toEqual( + '../../dist/out-tsc' + ); + }); + }); + + describe('none', () => { + it('should not generate test configuration', async () => { + const tree = await runSchematic( + 'app', + { name: 'myApp', unitTestRunner: 'none' }, + appTree + ); + expect(tree.exists('apps/my-app/src/test-setup.ts')).toBeFalsy(); + expect(tree.exists('apps/my-app/src/test.ts')).toBeFalsy(); + expect(tree.exists('apps/my-app/tsconfig.spec.json')).toBeFalsy(); + expect(tree.exists('apps/my-app/jest.config.js')).toBeFalsy(); + expect(tree.exists('apps/my-app/karma.config.js')).toBeFalsy(); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['my-app'].architect.test).toBeUndefined(); + expect( + workspaceJson.projects['my-app'].architect.lint.options.tsConfig + ).toEqual(['apps/my-app/tsconfig.app.json']); + }); }); }); diff --git a/packages/jest/migrations.json b/packages/jest/migrations.json index 18b4c18158ac3d..a5eac085bf1fb0 100644 --- a/packages/jest/migrations.json +++ b/packages/jest/migrations.json @@ -10,10 +10,21 @@ "description": "Update Jest testPathPattern option", "factory": "./src/migrations/update-8-7-0/update-8-7-0" }, - "update-8.8.0": { - "version": "8.8.0", + "update-8.10.0": { + "version": "8.10.0", "description": "Upgrades jest-preset-angular and runs migrations for breaking changes", - "factory": "./src/migrations/update-8-8-0/update-8-8-0" + "factory": "./src/migrations/update-8-10-0/update-8-10-0" + } + }, + "packageJsonUpdates": { + "8.10.0": { + "version": "8.10.0-beta.1", + "packages": { + "jest-preset-angular": { + "version": "8.0.0", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/jest/src/migrations/update-8-8-0/update-8-8-0.spec.ts b/packages/jest/src/migrations/update-8-10-0/update-8-10-0.spec.ts similarity index 85% rename from packages/jest/src/migrations/update-8-8-0/update-8-8-0.spec.ts rename to packages/jest/src/migrations/update-8-10-0/update-8-10-0.spec.ts index 9450b7e4dd3d77..9a3318a0191599 100644 --- a/packages/jest/src/migrations/update-8-8-0/update-8-8-0.spec.ts +++ b/packages/jest/src/migrations/update-8-10-0/update-8-10-0.spec.ts @@ -5,7 +5,7 @@ import * as path from 'path'; import { createEmptyWorkspace } from '@nrwl/workspace/testing'; import { serializeJson } from '@nrwl/workspace'; -describe.only('Update 8.8.0', () => { +describe('Update 8.10.0', () => { let initialTree: Tree; let schematicRunner: SchematicTestRunner; @@ -105,7 +105,7 @@ describe.only('Update 8.8.0', () => { it('should update jest-preset-angular to 8.0.0', async () => { const result = await schematicRunner - .runSchematicAsync('update-8.8.0', {}, initialTree) + .runSchematicAsync('update-8.10.0', {}, initialTree) .toPromise(); const { devDependencies } = readJsonInTree(result, 'package.json'); @@ -114,7 +114,7 @@ describe.only('Update 8.8.0', () => { it(`it should add '/build' into jest-preset-angular snapshotSerializers in any jest.config.js where it exists`, async () => { const result = await schematicRunner - .runSchematicAsync('update-8.8.0', {}, initialTree) + .runSchematicAsync('update-8.10.0', {}, initialTree) .toPromise(); const updateJestAngularOne = result.readContent( @@ -139,17 +139,35 @@ describe.only('Update 8.8.0', () => { expect(updateJestAngularTwo).not.toContain( 'jest-preset-angular/HTMLCommentSerializer.js' ); + + expect(updateJestAngularOne).toContain( + 'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js' + ); expect(updateJestAngularOne).toContain( 'jest-preset-angular/build/AngularSnapshotSerializer.js' ); expect(updateJestAngularOne).toContain( 'jest-preset-angular/build/HTMLCommentSerializer.js' ); + + expect(updateJestAngularTwo).toContain( + 'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js' + ); expect(updateJestAngularTwo).toContain( 'jest-preset-angular/build/AngularSnapshotSerializer.js' ); expect(updateJestAngularTwo).toContain( 'jest-preset-angular/build/HTMLCommentSerializer.js' ); + + expect(updateJestNonAngularOne).not.toContain( + 'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js' + ); + expect(updateJestNonAngularOne).not.toContain( + 'jest-preset-angular/build/AngularSnapshotSerializer.js' + ); + expect(updateJestNonAngularOne).not.toContain( + 'jest-preset-angular/build/HTMLCommentSerializer.js' + ); }); }); diff --git a/packages/jest/src/migrations/update-8-8-0/update-8-8-0.ts b/packages/jest/src/migrations/update-8-10-0/update-8-10-0.ts similarity index 81% rename from packages/jest/src/migrations/update-8-8-0/update-8-8-0.ts rename to packages/jest/src/migrations/update-8-10-0/update-8-10-0.ts index 3a458d23c1eadd..0a0733bdcdde13 100644 --- a/packages/jest/src/migrations/update-8-8-0/update-8-8-0.ts +++ b/packages/jest/src/migrations/update-8-10-0/update-8-10-0.ts @@ -1,23 +1,33 @@ import { - Tree, - Rule, chain, - SchematicContext + Rule, + SchematicContext, + Tree } from '@angular-devkit/schematics'; -import { readWorkspace, insert, formatFiles } from '@nrwl/workspace'; +import { + formatFiles, + insert, + readWorkspace, + updatePackagesInPackageJson +} from '@nrwl/workspace'; import * as ts from 'typescript'; +import * as path from 'path'; import { - ReplaceChange, - updateJsonInTree, + Change, + getSourceNodes, + InsertChange, readJsonInTree, - getSourceNodes + ReplaceChange } from '@nrwl/workspace/src/utils/ast-utils'; import { stripIndents } from '@angular-devkit/core/src/utils/literals'; export default function update(): Rule { return chain([ displayInformation, - updateDependencies, + updatePackagesInPackageJson( + path.join(__dirname, '../../../', 'migrations.json'), + '8.10.0' + ), updateJestConfigs, formatFiles() ]); @@ -37,16 +47,6 @@ function displayInformation(host: Tree, context: SchematicContext) { } } -const updateDependencies = updateJsonInTree('package.json', json => { - json.devDependencies = json.devDependencies || {}; - - if (json.devDependencies['jest-preset-angular']) { - json.devDependencies['jest-preset-angular'] = '8.0.0'; - } - - return json; -}); - function updateJestConfigs(host: Tree) { const config = readJsonInTree(host, 'package.json'); @@ -77,14 +77,24 @@ function updateJestConfigs(host: Tree) { ts.ScriptTarget.Latest ); - const changes: ReplaceChange[] = []; + const changes: Change[] = []; getSourceNodes(sourceFile).forEach(node => { if (node && ts.isStringLiteral(node)) { const nodeText = node.text; + if ( nodeText === 'jest-preset-angular/AngularSnapshotSerializer.js' ) { + // add new serializer from v8 of jest-preset-angular + changes.push( + new InsertChange( + configPath, + node.getStart(sourceFile), + `'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js'\n` + ) + ); + changes.push( new ReplaceChange( configPath, diff --git a/packages/jest/src/schematics/jest-project/files/jest.config.js__tmpl__ b/packages/jest/src/schematics/jest-project/files/jest.config.js__tmpl__ index 634ee07c2edf06..20d7cea386a376 100644 --- a/packages/jest/src/schematics/jest-project/files/jest.config.js__tmpl__ +++ b/packages/jest/src/schematics/jest-project/files/jest.config.js__tmpl__ @@ -7,6 +7,7 @@ module.exports = { moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html'],<% } %> coverageDirectory: '<%= offsetFromRoot %>coverage/<%= projectRoot %>'<% if(!skipSerializers) { %>, snapshotSerializers: [ + 'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js', 'jest-preset-angular/build/AngularSnapshotSerializer.js', 'jest-preset-angular/build/HTMLCommentSerializer.js' ]<% } %> diff --git a/packages/jest/src/schematics/jest-project/jest-project.spec.ts b/packages/jest/src/schematics/jest-project/jest-project.spec.ts index e65ccf91523a49..cbed157c47b806 100644 --- a/packages/jest/src/schematics/jest-project/jest-project.spec.ts +++ b/packages/jest/src/schematics/jest-project/jest-project.spec.ts @@ -89,6 +89,7 @@ describe('jestProject', () => { preset: '../../jest.config.js', coverageDirectory: '../../coverage/libs/lib1', snapshotSerializers: [ + 'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js', 'jest-preset-angular/build/AngularSnapshotSerializer.js', 'jest-preset-angular/build/HTMLCommentSerializer.js' ] @@ -234,6 +235,7 @@ describe('jestProject', () => { const jestConfig = resultTree.readContent('libs/lib1/jest.config.js'); expect(jestConfig).not.toContain(` snapshotSerializers: [ + 'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js, 'jest-preset-angular/build/AngularSnapshotSerializer.js', 'jest-preset-angular/build/HTMLCommentSerializer.js' ] diff --git a/yarn.lock b/yarn.lock index 725697db8eabb7..19f5cc9c0c8808 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5256,7 +5256,7 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-limiter@^1.0.0, async-limiter@~1.0.0: +async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== @@ -8512,9 +8512,9 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@~0.3.6: integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssom@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.1.tgz#b24111d236b6dbd00cdfacb5ab67a20473381fe3" - integrity sha512-6Aajq0XmukE7HdXUU6IoSWuH1H6gH9z6qmagsstTiN7cW2FNTsb+J2Chs+ufPgZCsV/yo8oaEudQLrb9dGxSVQ== + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== cssstyle@^1.0.0: version "1.4.0" @@ -12655,16 +12655,16 @@ jest-each@^24.9.0: pretty-format "^24.9.0" jest-environment-jsdom-fifteen@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom-fifteen/-/jest-environment-jsdom-fifteen-1.0.0.tgz#9634f78d7cedcc1fdf55b4052051c422935a68ab" - integrity sha512-TNGpp8HUzpvrpweantzipQo6M2YbvmKkj1WGsdf29xpU0fgSa8nrL2fQgZDxpvrh77AexXtuXuwee0cl2iiLvg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom-fifteen/-/jest-environment-jsdom-fifteen-1.0.2.tgz#49a0af55e0d32737a6114a1575dd714702ad63b0" + integrity sha512-nfrnAfwklE1872LIB31HcjM65cWTh1wzvMSp10IYtPJjLDUbTTvDpajZgIxUnhRmzGvogdHDayCIlerLK0OBBg== dependencies: "@jest/environment" "^24.3.0" "@jest/fake-timers" "^24.3.0" "@jest/types" "^24.3.0" jest-mock "^24.0.0" jest-util "^24.0.0" - jsdom "^15.1.0" + jsdom "^15.2.1" jest-environment-jsdom@^24.9.0: version "24.9.0" @@ -13018,10 +13018,10 @@ jsdom@^11.5.1: ws "^5.2.0" xml-name-validator "^3.0.0" -jsdom@^15.1.0: - version "15.2.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.0.tgz#4baead4f464e733533ed6ac607ce440918cf5cbb" - integrity sha512-+hRyEfjRPFwTYMmSQ3/f7U9nP8ZNZmbkmUek760ZpxnCPWJIhaaLRuUSvpJ36fZKCGENxLwxClzwpOpnXNfChQ== +jsdom@^15.2.1: + version "15.2.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" + integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== dependencies: abab "^2.0.0" acorn "^7.1.0" @@ -13033,7 +13033,7 @@ jsdom@^15.1.0: domexception "^1.0.1" escodegen "^1.11.1" html-encoding-sniffer "^1.0.2" - nwsapi "^2.1.4" + nwsapi "^2.2.0" parse5 "5.1.0" pn "^1.1.0" request "^2.88.0" @@ -14976,11 +14976,16 @@ 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= -nwsapi@^2.0.7, nwsapi@^2.1.4: +nwsapi@^2.0.7: version "2.1.4" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -17749,7 +17754,14 @@ request-promise-core@1.1.2: dependencies: lodash "^4.17.11" -request-promise-native@^1.0.5, request-promise-native@^1.0.7: +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== @@ -17758,6 +17770,15 @@ request-promise-native@^1.0.5, request-promise-native@^1.0.7: stealthy-require "^1.1.1" tough-cookie "^2.3.3" +request-promise-native@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@2.88.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" @@ -21071,11 +21092,9 @@ ws@^6.2.1: async-limiter "~1.0.0" ws@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.0.tgz#422eda8c02a4b5dba7744ba66eebbd84bcef0ec7" - integrity sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg== - dependencies: - async-limiter "^1.0.0" + version "7.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.1.tgz#03ed52423cd744084b2cf42ed197c8b65a936b8e" + integrity sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A== ws@~3.3.1: version "3.3.3"