From 2b646f8eb4839d7b3b47bf703016e33bf1dbd2fe Mon Sep 17 00:00:00 2001 From: Victor Savkin Date: Tue, 23 Jul 2019 12:27:29 -0400 Subject: [PATCH] feat(nx): standalone version of nx --- .travis.yml | 18 +- .../api-cypress/schematics/cypress-project.md | 8 + docs/api-node/schematics/application.md | 8 + docs/api-react/schematics/application.md | 8 + docs/api-react/schematics/component.md | 2 +- docs/api-react/schematics/library.md | 8 + docs/api-web/schematics/application.md | 8 + docs/api-workspace/builders/run-commands.md | 2 +- docs/api-workspace/schematics/library.md | 8 + docs/api-workspace/schematics/tao-new.md | 72 + docs/api-workspace/schematics/workspace.md | 8 + e2e/affected.test.ts | 389 +-- e2e/command-line.test.ts | 601 ++--- e2e/cypress.test.ts | 93 +- e2e/delegate-to-cli.test.ts | 46 +- e2e/downgrade-module.test.ts | 40 +- e2e/help.test.ts | 47 + e2e/jest.test.ts | 42 +- e2e/karma.test.ts | 61 +- e2e/new.test.ts | 111 + e2e/ng-add.test.ts | 665 +++-- e2e/ng-new.test.ts | 115 - e2e/ngrx.test.ts | 111 +- e2e/node.test.ts | 285 +- e2e/react.test.ts | 203 +- e2e/upgrade-module.test.ts | 52 +- e2e/utils.ts | 229 +- e2e/web.test.ts | 92 +- package.json | 4 +- .../application/application.spec.ts | 85 +- .../src/schematics/application/application.ts | 29 +- .../karma-project/karma-project.spec.ts | 16 +- .../schematics/karma-project/karma-project.ts | 9 +- .../schematics/library/files/lib/README.md | 2 +- .../src/schematics/library/library.spec.ts | 57 +- .../angular/src/schematics/library/library.ts | 4 +- .../src/schematics/ng-add/ng-add.spec.ts | 24 +- packages/angular/src/utils/testing.ts | 2 +- packages/angular/src/utils/versions.ts | 2 +- packages/cli/package.json | 3 +- .../bin/create-nx-workspace.ts | 377 ++- packages/create-nx-workspace/package.json | 3 +- .../cypress-project/cypress-project.spec.ts | 14 +- .../cypress-project/cypress-project.ts | 32 +- .../schematics/cypress-project/schema.d.ts | 1 + .../schematics/cypress-project/schema.json | 6 + .../src/schematics/ng-add/ng-add.spec.ts | 16 +- .../jest-project/jest-project.spec.ts | 26 +- .../schematics/jest-project/jest-project.ts | 16 +- .../nest/src/schematics/ng-add/ng-add.spec.ts | 16 +- .../application/application.spec.ts | 54 +- .../src/schematics/application/application.ts | 39 +- .../src/environments/environment.ts__tmpl__ | 4 - .../src/schematics/application/schema.d.ts | 4 +- .../src/schematics/application/schema.json | 6 + .../node/src/schematics/ng-add/ng-add.spec.ts | 16 +- .../application/application.spec.ts | 46 +- .../src/schematics/application/application.ts | 27 +- .../src/schematics/application/schema.d.ts | 7 +- .../src/schematics/application/schema.json | 6 + .../src/schematics/component/schema.json | 2 +- .../schematics/library/files/lib/README.md | 2 +- .../src/schematics/library/library.spec.ts | 25 +- .../react/src/schematics/library/library.ts | 23 +- .../react/src/schematics/library/schema.d.ts | 5 +- .../react/src/schematics/library/schema.json | 6 + .../src/schematics/ng-add/ng-add.spec.ts | 16 +- .../20171211-create-tsconfigapp-per-app.ts | 4 +- .../20180507-create-nx-json.ts | 8 +- .../20180515-switch-to-nx6.ts | 2 +- .../migrations/update-6-0-0/update-6-0-0.ts | 25 +- .../migrations/update-6-1-0/update-6-1-0.ts | 2 +- .../update-7-2-0/update-7-2-0.spec.ts | 10 +- .../migrations/update-7-2-0/update-7-2-0.ts | 16 +- .../update-7-5-0/update-7-5-0.spec.ts | 5 +- .../update-7-6-0/update-7-6-0.spec.ts | 13 +- .../migrations/update-7-6-0/update-7-6-0.ts | 5 +- .../update-7-7-0/update-7-7-0.spec.ts | 7 +- .../migrations/update-7-7-0/update-7-7-0.ts | 4 +- .../update-7-8-1/update-7-8-1.spec.ts | 5 +- .../update-8-0-0/update-8-0-0.spec.ts | 21 +- .../migrations/update-8-0-0/update-8-0-0.ts | 9 +- packages/schematics/src/migrator/migrator.ts | 4 +- packages/tao/index.ts | 44 + packages/tao/package.json | 41 + packages/tao/src/commands/generate.ts | 354 +++ packages/tao/src/commands/help.ts | 35 + packages/tao/src/commands/run.ts | 123 + packages/tao/src/compat/angular-cli-compat.ts | 24 + packages/tao/src/shared/logger.ts | 13 + packages/tao/src/shared/params.spec.ts | 35 + packages/tao/src/shared/params.ts | 50 + packages/tao/src/shared/print-help.ts | 44 + .../application/application.spec.ts | 43 +- .../src/schematics/application/application.ts | 22 +- .../src/schematics/application/schema.d.ts | 7 +- .../src/schematics/application/schema.json | 6 + .../web/src/schematics/ng-add/ng-add.spec.ts | 16 +- packages/web/src/utils/serve-path.ts | 6 +- packages/workspace/collection.json | 7 + packages/workspace/index.ts | 12 +- packages/workspace/migrations.json | 5 + .../src/builders/run-commands/schema.json | 2 +- .../workspace/src/command-line/affected.ts | 42 +- .../workspace/src/command-line/dep-graph.ts | 6 +- packages/workspace/src/command-line/lint.ts | 4 +- .../workspace/src/command-line/nx-commands.ts | 20 +- .../workspace/src/command-line/nx-migrate.ts | 4 +- .../workspace/src/command-line/shared.spec.ts | 64 +- packages/workspace/src/command-line/shared.ts | 82 +- .../workspace/src/command-line/touched.ts | 8 +- .../workspace-integrity-checks.spec.ts | 2 +- .../workspace-integrity-checks.ts | 3 +- .../src/command-line/workspace-schematic.ts | 2 +- .../update-8-2-0/update-8-2-0.spec.ts | 6 +- .../migrations/update-8-4-0/add-nx-script.ts | 12 + .../src/schematics/library/library.spec.ts | 24 +- .../src/schematics/library/library.ts | 21 +- .../src/schematics/library/schema.d.ts | 4 +- .../src/schematics/library/schema.json | 6 + .../workspace/src/schematics/ng-add/ng-add.ts | 45 +- .../src/schematics/ng-new/ng-new.spec.ts | 3 - .../workspace/src/schematics/ng-new/ng-new.ts | 180 +- .../src/schematics/ng-new/schema.d.ts | 10 - .../src/schematics/ng-new/schema.json | 13 +- .../src/schematics/preset/preset.spec.ts | 6 +- .../workspace/src/schematics/preset/preset.ts | 22 +- .../src/schematics/preset/schema.d.ts | 8 +- .../src/schematics/shared-new/shared-new.ts | 192 ++ .../src/schematics/tao-new/schema.json | 122 + .../src/schematics/tao-new/tao-new.ts | 6 + ...xtensions.json => extensions.json__tmpl__} | 4 +- .../workspace/files/__workspaceFile__.json | 7 + .../schematics/workspace/files/angular.json | 14 - .../src/schematics/workspace/files/nx.json | 2 +- .../workspace/files/package.json__tmpl__ | 20 +- .../src/schematics/workspace/schema.d.ts | 1 + .../src/schematics/workspace/schema.json | 6 + .../schematics/workspace/workspace.spec.ts | 21 +- .../src/schematics/workspace/workspace.ts | 4 +- .../tslint/nxEnforceModuleBoundariesRule.ts | 6 +- packages/workspace/src/utils/app-root.ts | 24 +- packages/workspace/src/utils/ast-utils.ts | 18 +- .../workspace/src/utils/cli-config-utils.ts | 12 +- packages/workspace/src/utils/fileutils.ts | 8 +- .../files/tslint.json => utils/lint.ts} | 45 + .../src/utils/rules/update-karma-conf.spec.ts | 6 +- packages/workspace/src/utils/testing-utils.ts | 19 +- scripts/build.sh | 5 + scripts/check-imports.js | 1 + .../documentation/generate-npmscripts-data.ts | 1 + scripts/e2e-rerun.sh | 4 +- scripts/e2e.sh | 15 +- scripts/nx-release.js | 3 +- scripts/package.sh | 9 +- scripts/test.sh | 2 +- tsconfig.json | 2 + yarn.lock | 2343 +++++++++-------- 158 files changed, 5268 insertions(+), 3644 deletions(-) create mode 100644 docs/api-workspace/schematics/tao-new.md create mode 100644 e2e/help.test.ts create mode 100644 e2e/new.test.ts delete mode 100644 e2e/ng-new.test.ts create mode 100644 packages/tao/index.ts create mode 100644 packages/tao/package.json create mode 100644 packages/tao/src/commands/generate.ts create mode 100644 packages/tao/src/commands/help.ts create mode 100644 packages/tao/src/commands/run.ts create mode 100644 packages/tao/src/compat/angular-cli-compat.ts create mode 100644 packages/tao/src/shared/logger.ts create mode 100644 packages/tao/src/shared/params.spec.ts create mode 100644 packages/tao/src/shared/params.ts create mode 100644 packages/tao/src/shared/print-help.ts create mode 100644 packages/workspace/src/migrations/update-8-4-0/add-nx-script.ts delete mode 100644 packages/workspace/src/schematics/ng-new/ng-new.spec.ts delete mode 100644 packages/workspace/src/schematics/ng-new/schema.d.ts create mode 100644 packages/workspace/src/schematics/shared-new/shared-new.ts create mode 100644 packages/workspace/src/schematics/tao-new/schema.json create mode 100644 packages/workspace/src/schematics/tao-new/tao-new.ts rename packages/workspace/src/schematics/workspace/files/.vscode/{extensions.json => extensions.json__tmpl__} (64%) create mode 100644 packages/workspace/src/schematics/workspace/files/__workspaceFile__.json delete mode 100644 packages/workspace/src/schematics/workspace/files/angular.json rename packages/workspace/src/{schematics/workspace/files/tslint.json => utils/lint.ts} (61%) diff --git a/.travis.yml b/.travis.yml index 1778e4620c..a750480bcc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,7 +34,23 @@ matrix: - yarn install --network-timeout 1000000 script: - 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then yarn checkformat --head=$TRAVIS_PULL_REQUEST_SHA --base=$(git merge-base HEAD $TRAVIS_BRANCH); fi' - - yarn e2e + - yarn e2e --cli nx + - os: linux + language: node_js + node_js: 10 + dist: trusty + sudo: required + cache: + npm: false + addons: + chrome: stable + before_install: + - export DISPLAY=:99.0; sh -e /etc/init.d/xvfb start; + install: + - yarn install --network-timeout 1000000 + script: + - 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then yarn checkformat --head=$TRAVIS_PULL_REQUEST_SHA --base=$(git merge-base HEAD $TRAVIS_BRANCH); fi' + - yarn e2e --cli angular notifications: email: false diff --git a/docs/api-cypress/schematics/cypress-project.md b/docs/api-cypress/schematics/cypress-project.md index 940dbcfcbe..62d60a4a43 100644 --- a/docs/api-cypress/schematics/cypress-project.md +++ b/docs/api-cypress/schematics/cypress-project.md @@ -17,6 +17,14 @@ Type: `string` A directory where the app is placed +### linter + +Default: `tslint` + +Type: `string` + +The tool to use for running lint checks. + ### name Type: `string` diff --git a/docs/api-node/schematics/application.md b/docs/api-node/schematics/application.md index 4fdf490095..60234b2311 100644 --- a/docs/api-node/schematics/application.md +++ b/docs/api-node/schematics/application.md @@ -23,6 +23,14 @@ Type: `string` Frontend project that needs to access this application. This sets up proxy configuration. +### linter + +Default: `tslint` + +Type: `string` + +The tool to use for running lint checks. + ### name Type: `string` diff --git a/docs/api-react/schematics/application.md b/docs/api-react/schematics/application.md index 8b1dd6812e..6afa5d74cf 100644 --- a/docs/api-react/schematics/application.md +++ b/docs/api-react/schematics/application.md @@ -33,6 +33,14 @@ Type: `string` Test runner to use for end to end (e2e) tests +### linter + +Default: `tslint` + +Type: `string` + +The tool to use for running lint checks. + ### name Type: `string` diff --git a/docs/api-react/schematics/component.md b/docs/api-react/schematics/component.md index 5cefec1817..6ebc22f7dd 100644 --- a/docs/api-react/schematics/component.md +++ b/docs/api-react/schematics/component.md @@ -45,7 +45,7 @@ Use pascal case component file name (e.g. App.tsx) Type: `string` -The name of the project (as specified in angular.json). +The name of the project. ### routing diff --git a/docs/api-react/schematics/library.md b/docs/api-react/schematics/library.md index 66a7ae8618..d4a2cd9b80 100644 --- a/docs/api-react/schematics/library.md +++ b/docs/api-react/schematics/library.md @@ -17,6 +17,14 @@ Type: `string` A directory where the app is placed +### linter + +Default: `tslint` + +Type: `string` + +The tool to use for running lint checks. + ### name Type: `string` diff --git a/docs/api-web/schematics/application.md b/docs/api-web/schematics/application.md index 6183773619..c238a60440 100644 --- a/docs/api-web/schematics/application.md +++ b/docs/api-web/schematics/application.md @@ -25,6 +25,14 @@ Type: `string` Test runner to use for end to end (e2e) tests +### linter + +Default: `tslint` + +Type: `string` + +The tool to use for running lint checks. + ### name Type: `string` diff --git a/docs/api-workspace/builders/run-commands.md b/docs/api-workspace/builders/run-commands.md index 1307ee8a32..f8352e9eaf 100644 --- a/docs/api-workspace/builders/run-commands.md +++ b/docs/api-workspace/builders/run-commands.md @@ -8,7 +8,7 @@ Run commands Type: `string` -Extra arguments. You can pass them as follows: ng run project:target --args='--wait=100'. You can them use {args.wait} syntax to interpolate them in angular.json +Extra arguments. You can pass them as follows: ng run project:target --args='--wait=100'. You can them use {args.wait} syntax to interpolate them in the workspace config file. ### commands diff --git a/docs/api-workspace/schematics/library.md b/docs/api-workspace/schematics/library.md index ae4d4cac50..2723b6d247 100644 --- a/docs/api-workspace/schematics/library.md +++ b/docs/api-workspace/schematics/library.md @@ -17,6 +17,14 @@ Type: `string` A directory where the app is placed +### linter + +Default: `tslint` + +Type: `string` + +The tool to use for running lint checks. + ### name Type: `string` diff --git a/docs/api-workspace/schematics/tao-new.md b/docs/api-workspace/schematics/tao-new.md new file mode 100644 index 0000000000..1375e6308e --- /dev/null +++ b/docs/api-workspace/schematics/tao-new.md @@ -0,0 +1,72 @@ +# tao-new [hidden] + +Create a workspace + +## Usage + +```bash +ng generate tao-new ... + +``` + +## Options + +### commit + +Default: `true` + +Type: `boolean` + +Initial repository commit information. + +### directory + +Type: `string` + +The directory name to create the workspace in. + +### name + +Type: `string` + +The name of the workspace. + +### npmScope + +Type: `string` + +Npm scope for importing libs. + +### preset + +Default: `empty` + +Type: `string` + +What to create in the new workspace + +### skipGit + +Alias(es): g + +Default: `false` + +Type: `boolean` + +Skip initializing a git repository. + +### skipInstall + +Default: `false` + +Type: `boolean` + +Skip installing dependency packages. + +### style + +Default: `css` + +Type: `string` + +The file extension to be used for style files. diff --git a/docs/api-workspace/schematics/workspace.md b/docs/api-workspace/schematics/workspace.md index c2ca021c29..1adc0adfe4 100644 --- a/docs/api-workspace/schematics/workspace.md +++ b/docs/api-workspace/schematics/workspace.md @@ -11,6 +11,14 @@ ng generate workspace ... ## Options +### cli + +Default: `nx` + +Type: `string` + +CLI used for generating code and running tasks + ### commit Default: `true` diff --git a/e2e/affected.test.ts b/e2e/affected.test.ts index e8332e17f2..28be375325 100644 --- a/e2e/affected.test.ts +++ b/e2e/affected.test.ts @@ -3,15 +3,16 @@ import { readFile, readJson, runCommand, - runsInWSL, uniq, updateFile, - runCLI + runCLI, + forEachCli, + supportUi } from './utils'; let originalCIValue; -describe('Affected', () => { +forEachCli(() => { /** * Setting CI=true makes it simpler to configure assertions around output, as there * won't be any colors. @@ -24,210 +25,210 @@ describe('Affected', () => { process.env.CI = originalCIValue; }); - it('should print, build, and test affected apps', () => { - ensureProject(); - const myapp = uniq('myapp'); - const myapp2 = uniq('myapp2'); - const mylib = uniq('mylib'); - const mylib2 = uniq('mylib2'); - const mypublishablelib = uniq('mypublishablelib'); - runCLI(`generate @nrwl/angular:app ${myapp}`); - runCLI(`generate @nrwl/angular:app ${myapp2}`); - runCLI(`generate @nrwl/angular:lib ${mylib}`); - runCLI(`generate @nrwl/angular:lib ${mylib2}`); - runCLI(`generate @nrwl/angular:lib ${mypublishablelib} --publishable`); + describe('Affected', () => { + it('should print, build, and test affected apps', () => { + ensureProject(); + const myapp = uniq('myapp'); + const myapp2 = uniq('myapp2'); + const mylib = uniq('mylib'); + const mylib2 = uniq('mylib2'); + const mypublishablelib = uniq('mypublishablelib'); + runCLI(`generate @nrwl/angular:app ${myapp}`); + runCLI(`generate @nrwl/angular:app ${myapp2}`); + runCLI(`generate @nrwl/angular:lib ${mylib}`); + runCLI(`generate @nrwl/angular:lib ${mylib2}`); + runCLI(`generate @nrwl/angular:lib ${mypublishablelib} --publishable`); - updateFile( - `apps/${myapp}/src/app/app.component.spec.ts`, - ` - import '@proj/${mylib}'; - describe('sample test', () => { - it('should test', () => { - expect(1).toEqual(1); + updateFile( + `apps/${myapp}/src/app/app.component.spec.ts`, + ` + import '@proj/${mylib}'; + describe('sample test', () => { + it('should test', () => { + expect(1).toEqual(1); + }); }); - }); - ` - ); - updateFile( - `libs/${mypublishablelib}/src/lib/${mypublishablelib}.module.spec.ts`, - ` - import '@proj/${mylib}'; - describe('sample test', () => { - it('should test', () => { - expect(1).toEqual(1); - }); - }); - ` - ); - - const affectedApps = runCommand( - `npm run affected:apps -- --files="libs/${mylib}/src/index.ts"` - ); - expect(affectedApps).toContain(myapp); - expect(affectedApps).not.toContain(myapp2); - expect(affectedApps).not.toContain(`${myapp}-e2e`); - - const implicitlyAffectedApps = runCommand( - 'npm run affected:apps -- --files="package.json"' - ); - expect(implicitlyAffectedApps).toContain(myapp); - expect(implicitlyAffectedApps).toContain(myapp2); - - const noAffectedApps = runCommand( - 'npm run affected:apps -- --files="README.md"' - ); - expect(noAffectedApps).not.toContain(myapp); - expect(noAffectedApps).not.toContain(myapp2); - - const affectedLibs = runCommand( - `npm run affected:libs -- --files="libs/${mylib}/src/index.ts"` - ); - expect(affectedLibs).toContain(mypublishablelib); - expect(affectedLibs).toContain(mylib); - expect(affectedLibs).not.toContain(mylib2); - - const implicitlyAffectedLibs = runCommand( - 'npm run affected:libs -- --files="package.json"' - ); - expect(implicitlyAffectedLibs).toContain(mypublishablelib); - expect(implicitlyAffectedLibs).toContain(mylib); - expect(implicitlyAffectedLibs).toContain(mylib2); - - const noAffectedLibs = runCommand( - 'npm run affected:libs -- --files="README.md"' - ); - expect(noAffectedLibs).not.toContain(mypublishablelib); - expect(noAffectedLibs).not.toContain(mylib); - expect(noAffectedLibs).not.toContain(mylib2); - - const build = runCommand( - `npm run affected:build -- --files="libs/${mylib}/src/index.ts"` - ); - expect(build).toContain(`Running target build for projects:`); - expect(build).toContain(myapp); - expect(build).toContain(mypublishablelib); - - expect(build).not.toContain('is not registered with the build command'); - expect(build).not.toContain('with flags:'); - - // Should work in parallel - const buildParallel = runCommand( - `npm run affected:build -- --files="libs/${mylib}/src/index.ts" --parallel` - ); - expect(buildParallel).toContain(`Running target build for projects:`); - expect(buildParallel).toContain(myapp); - expect(buildParallel).toContain(mypublishablelib); - expect(buildParallel).toContain( - 'Running target "build" for affected projects succeeded' - ); - - const buildExcluded = runCommand( - `npm run affected:build -- --files="libs/${mylib}/src/index.ts" --exclude ${myapp}` - ); - expect(buildExcluded).toContain(`Running target build for projects:`); - expect(buildExcluded).toContain(mypublishablelib); - - // affected:build should pass non-nx flags to the CLI - const buildWithFlags = runCommand( - `npm run affected:build -- --files="libs/${mylib}/src/index.ts" --stats-json` - ); - expect(buildWithFlags).toContain(`Running target build for projects:`); - expect(buildWithFlags).toContain(myapp); - expect(buildWithFlags).toContain(mypublishablelib); - expect(buildWithFlags).toContain('With flags: --stats-json=true'); - - if (!runsInWSL()) { - const e2e = runCommand( - `npm run affected:e2e -- --files="libs/${mylib}/src/index.ts" --headless --no-watch` + ` + ); + updateFile( + `libs/${mypublishablelib}/src/lib/${mypublishablelib}.module.spec.ts`, + ` + import '@proj/${mylib}'; + describe('sample test', () => { + it('should test', () => { + expect(1).toEqual(1); + }); + }); + ` ); - expect(e2e).toContain('should display welcome message'); - } - const unitTests = runCommand( - `npm run affected:test -- --files="libs/${mylib}/src/index.ts"` - ); - expect(unitTests).toContain(`Running target test for projects:`); - expect(unitTests).toContain(mylib); - expect(unitTests).toContain(myapp); - expect(unitTests).toContain(mypublishablelib); + const affectedApps = runCommand( + `npm run affected:apps -- --files="libs/${mylib}/src/index.ts"` + ); + expect(affectedApps).toContain(myapp); + expect(affectedApps).not.toContain(myapp2); + expect(affectedApps).not.toContain(`${myapp}-e2e`); - // Fail a Unit Test - updateFile( - `apps/${myapp}/src/app/app.component.spec.ts`, - readFile(`apps/${myapp}/src/app/app.component.spec.ts`).replace( - '.toEqual(1)', - '.toEqual(2)' - ) - ); + const implicitlyAffectedApps = runCommand( + 'npm run affected:apps -- --files="package.json"' + ); + expect(implicitlyAffectedApps).toContain(myapp); + expect(implicitlyAffectedApps).toContain(myapp2); - const failedTests = runCommand( - `npm run affected:test -- --files="libs/${mylib}/src/index.ts"` - ); - expect(failedTests).toContain(`Running target test for projects:`); - expect(failedTests).toContain(mylib); - expect(failedTests).toContain(myapp); - expect(failedTests).toContain(mypublishablelib); + const noAffectedApps = runCommand( + 'npm run affected:apps -- --files="README.md"' + ); + expect(noAffectedApps).not.toContain(myapp); + expect(noAffectedApps).not.toContain(myapp2); - expect(failedTests).toContain(`Failed projects:`); - expect(failedTests).toContain(myapp); - expect(failedTests).toContain( - 'You can isolate the above projects by passing: --only-failed' - ); - expect(readJson('dist/.nx-results')).toEqual({ - command: 'test', - results: { - [myapp]: false, - [mylib]: true, - [mypublishablelib]: true + const affectedLibs = runCommand( + `npm run affected:libs -- --files="libs/${mylib}/src/index.ts"` + ); + expect(affectedLibs).toContain(mypublishablelib); + expect(affectedLibs).toContain(mylib); + expect(affectedLibs).not.toContain(mylib2); + + const implicitlyAffectedLibs = runCommand( + 'npm run affected:libs -- --files="package.json"' + ); + expect(implicitlyAffectedLibs).toContain(mypublishablelib); + expect(implicitlyAffectedLibs).toContain(mylib); + expect(implicitlyAffectedLibs).toContain(mylib2); + + const noAffectedLibs = runCommand( + 'npm run affected:libs -- --files="README.md"' + ); + expect(noAffectedLibs).not.toContain(mypublishablelib); + expect(noAffectedLibs).not.toContain(mylib); + expect(noAffectedLibs).not.toContain(mylib2); + + const build = runCommand( + `npm run affected:build -- --files="libs/${mylib}/src/index.ts"` + ); + expect(build).toContain(`Running target build for projects:`); + + expect(build).toContain(`- ${myapp}`); + expect(build).toContain(`- ${mypublishablelib}`); + expect(build).not.toContain('is not registered with the build command'); + expect(build).not.toContain('with flags:'); + + // Should work in parallel + const buildParallel = runCommand( + `npm run affected:build -- --files="libs/${mylib}/src/index.ts" --parallel` + ); + expect(buildParallel).toContain(`Running target build for projects:`); + expect(buildParallel).toContain(`- ${myapp}`); + expect(buildParallel).toContain(`- ${mypublishablelib}`); + expect(buildParallel).toContain( + 'Running target "build" for affected projects succeeded' + ); + + const buildExcluded = runCommand( + `npm run affected:build -- --files="libs/${mylib}/src/index.ts" --exclude ${myapp}` + ); + expect(buildExcluded).toContain(`Running target build for projects:`); + expect(buildExcluded).toContain(`- ${mypublishablelib}`); + + // affected:build should pass non-nx flags to the CLI + const buildWithFlags = runCommand( + `npm run affected:build -- --files="libs/${mylib}/src/index.ts" --stats-json` + ); + + expect(buildWithFlags).toContain(`Running target build for projects:`); + expect(buildWithFlags).toContain(`- ${myapp}`); + expect(buildWithFlags).toContain(`- ${mypublishablelib}`); + expect(buildWithFlags).toContain('With flags: --stats-json=true'); + + if (supportUi()) { + const e2e = runCommand( + `npm run affected:e2e -- --files="libs/${mylib}/src/index.ts" --headless` + ); + expect(e2e).toContain('should display welcome message'); } - }); - // Fix failing Unit Test - updateFile( - `apps/${myapp}/src/app/app.component.spec.ts`, - readFile(`apps/${myapp}/src/app/app.component.spec.ts`).replace( - '.toEqual(2)', - '.toEqual(1)' - ) - ); + const unitTests = runCommand( + `npm run affected:test -- --files="libs/${mylib}/src/index.ts"` + ); + expect(unitTests).toContain(`Running target test for projects:`); + expect(unitTests).toContain(`- ${mylib}`); + expect(unitTests).toContain(`- ${myapp}`); + expect(unitTests).toContain(`- ${mypublishablelib}`); + // Fail a Unit Test + updateFile( + `apps/${myapp}/src/app/app.component.spec.ts`, + readFile(`apps/${myapp}/src/app/app.component.spec.ts`).replace( + '.toEqual(1)', + '.toEqual(2)' + ) + ); - const isolatedTests = runCommand( - `npm run affected:test -- --files="libs/${mylib}/src/index.ts" --only-failed` - ); - expect(isolatedTests).toContain(`Running target test for projects:`); - expect(isolatedTests).toContain(myapp); + const failedTests = runCommand( + `npm run affected:test -- --files="libs/${mylib}/src/index.ts"` + ); + expect(failedTests).toContain(`Running target test for projects:`); + expect(failedTests).toContain(`- ${mylib}`); + expect(failedTests).toContain(`- ${myapp}`); + expect(failedTests).toContain(`- ${mypublishablelib}`); + expect(failedTests).toContain(`Failed projects:`); + expect(failedTests).toContain( + 'You can isolate the above projects by passing: --only-failed' + ); + expect(readJson('dist/.nx-results')).toEqual({ + command: 'test', + results: { + [myapp]: false, + [mylib]: true, + [mypublishablelib]: true + } + }); - const linting = runCommand( - `npm run affected:lint -- --files="libs/${mylib}/src/index.ts"` - ); - expect(linting).toContain(`Running target lint for projects:`); - expect(linting).toContain(mylib); - expect(linting).toContain(myapp); - expect(linting).toContain(`${myapp}-e2e`); - expect(linting).toContain(mypublishablelib); + // Fix failing Unit Test + updateFile( + `apps/${myapp}/src/app/app.component.spec.ts`, + readFile(`apps/${myapp}/src/app/app.component.spec.ts`).replace( + '.toEqual(2)', + '.toEqual(1)' + ) + ); - const lintWithJsonFormating = runCommand( - `npm run affected:lint -- --files="libs/${mylib}/src/index.ts" -- --format json` - ); - expect(lintWithJsonFormating).toContain('With flags: --format json'); + const isolatedTests = runCommand( + `npm run affected:test -- --files="libs/${mylib}/src/index.ts" --only-failed` + ); + expect(isolatedTests).toContain(`Running target test for projects`); + expect(isolatedTests).toContain(`- ${myapp}`); - const unitTestsExcluded = runCommand( - `npm run affected:test -- --files="libs/${mylib}/src/index.ts" --exclude=${myapp},${mypublishablelib}` - ); - expect(unitTestsExcluded).toContain(`Running target test for projects:`); - expect(unitTestsExcluded).toContain(mylib); + const linting = runCommand( + `npm run affected:lint -- --files="libs/${mylib}/src/index.ts"` + ); + expect(linting).toContain(`Running target lint for projects:`); + expect(linting).toContain(`- ${mylib}`); + expect(linting).toContain(`- ${myapp}`); + expect(linting).toContain(`- ${myapp}-e2e`); + expect(linting).toContain(`- ${mypublishablelib}`); - const i18n = runCommand( - `npm run affected -- --target extract-i18n --files="libs/${mylib}/src/index.ts"` - ); - expect(i18n).toContain(`Running target extract-i18n for projects:`); - expect(i18n).toContain(myapp); + const lintWithJsonFormating = runCommand( + `npm run affected:lint -- --files="libs/${mylib}/src/index.ts" -- --format json` + ); + expect(lintWithJsonFormating).toContain('With flags: --format json'); - const interpolatedTests = runCommand( - `npm run affected -- --target test --files="libs/${mylib}/src/index.ts" -- --jest-config {project.root}/jest.config.js` - ); - expect(interpolatedTests).toContain( - `Running target "test" for affected projects succeeded` - ); - }, 1000000); + const unitTestsExcluded = runCommand( + `npm run affected:test -- --files="libs/${mylib}/src/index.ts" --exclude=${myapp},${mypublishablelib}` + ); + expect(unitTestsExcluded).toContain(`Running target test for projects:`); + expect(unitTestsExcluded).toContain(`- ${mylib}`); + + const i18n = runCommand( + `npm run affected -- --target extract-i18n --files="libs/${mylib}/src/index.ts"` + ); + expect(i18n).toContain(`Running target extract-i18n for projects:`); + expect(i18n).toContain(`- ${myapp}`); + + const interpolatedTests = runCommand( + `npm run affected -- --target test --files="libs/${mylib}/src/index.ts" -- --jest-config {project.root}/jest.config.js` + ); + expect(interpolatedTests).toContain( + `Running target \"test\" for affected projects succeeded` + ); + }, 1000000); + }); }); diff --git a/e2e/command-line.test.ts b/e2e/command-line.test.ts index e88195ab76..fa45d9ef7b 100644 --- a/e2e/command-line.test.ts +++ b/e2e/command-line.test.ts @@ -8,37 +8,40 @@ import { updateFile, exists, ensureProject, - uniq + uniq, + forEachCli, + workspaceConfigName } from './utils'; -describe('Command line', () => { - it('lint should ensure module boundaries', () => { - ensureProject(); +forEachCli(() => { + describe('Command line', () => { + it('lint should ensure module boundaries', () => { + ensureProject(); - const myapp = uniq('myapp'); - const myapp2 = uniq('myapp2'); - const mylib = uniq('mylib'); - const lazylib = uniq('lazylib'); - const invalidtaglib = uniq('invalidtaglib'); - const validtaglib = uniq('validtaglib'); + const myapp = uniq('myapp'); + const myapp2 = uniq('myapp2'); + const mylib = uniq('mylib'); + const lazylib = uniq('lazylib'); + const invalidtaglib = uniq('invalidtaglib'); + const validtaglib = uniq('validtaglib'); - runCLI(`generate @nrwl/angular:app ${myapp} --tags=validtag`); - runCLI(`generate @nrwl/angular:app ${myapp2}`); - runCLI(`generate @nrwl/angular:lib ${mylib}`); - runCLI(`generate @nrwl/angular:lib ${lazylib}`); - runCLI(`generate @nrwl/angular:lib ${invalidtaglib} --tags=invalidtag`); - runCLI(`generate @nrwl/angular:lib ${validtaglib} --tags=validtag`); + runCLI(`generate @nrwl/angular:app ${myapp} --tags=validtag`); + runCLI(`generate @nrwl/angular:app ${myapp2}`); + runCLI(`generate @nrwl/angular:lib ${mylib}`); + runCLI(`generate @nrwl/angular:lib ${lazylib}`); + runCLI(`generate @nrwl/angular:lib ${invalidtaglib} --tags=invalidtag`); + runCLI(`generate @nrwl/angular:lib ${validtaglib} --tags=validtag`); - const tslint = readJson('tslint.json'); - tslint.rules['nx-enforce-module-boundaries'][1].depConstraints = [ - { sourceTag: 'validtag', onlyDependOnLibsWithTags: ['validtag'] }, - ...tslint.rules['nx-enforce-module-boundaries'][1].depConstraints - ]; - updateFile('tslint.json', JSON.stringify(tslint, null, 2)); + const tslint = readJson('tslint.json'); + tslint.rules['nx-enforce-module-boundaries'][1].depConstraints = [ + { sourceTag: 'validtag', onlyDependOnLibsWithTags: ['validtag'] }, + ...tslint.rules['nx-enforce-module-boundaries'][1].depConstraints + ]; + updateFile('tslint.json', JSON.stringify(tslint, null, 2)); - updateFile( - `apps/${myapp}/src/main.ts`, - ` + updateFile( + `apps/${myapp}/src/main.ts`, + ` import '../../../libs/${mylib}'; import '@proj/${lazylib}'; import '@proj/${mylib}/deep'; @@ -48,305 +51,313 @@ describe('Command line', () => { const s = {loadChildren: '@proj/${lazylib}'}; ` - ); + ); - const out = runCLI(`lint ${myapp}`, { silenceError: true }); - expect(out).toContain('library imports must start with @proj/'); - expect(out).toContain('imports of lazy-loaded libraries are forbidden'); - expect(out).toContain('deep imports into libraries are forbidden'); - expect(out).toContain('imports of apps are forbidden'); - expect(out).toContain( - 'A project tagged with "validtag" can only depend on libs tagged with "validtag"' - ); - }, 1000000); + const out = runCLI(`lint ${myapp}`, { silenceError: true }); + expect(out).toContain('library imports must start with @proj/'); + expect(out).toContain('imports of lazy-loaded libraries are forbidden'); + expect(out).toContain('deep imports into libraries are forbidden'); + expect(out).toContain('imports of apps are forbidden'); + expect(out).toContain( + 'A project tagged with "validtag" can only depend on libs tagged with "validtag"' + ); + }, 1000000); - describe('nx lint', () => { - afterAll(() => { - newProject(); + describe('nx lint', () => { + afterAll(() => { + newProject(); + }); + + it('should run nx lint', () => { + ensureProject(); + const appBefore = uniq('before'); + const appAfter = uniq('after'); + + runCLI(`generate @nrwl/angular:app ${appBefore}`); + runCommand(`mv apps/${appBefore} apps/${appAfter}`); + + const stdout = runCommand('./node_modules/.bin/nx workspace-lint'); + expect(stdout).toContain( + `- Cannot find project '${appBefore}' in 'apps/${appBefore}'` + ); + expect(stdout).toContain( + 'The following file(s) do not belong to any projects:' + ); + expect(stdout).toContain(`- apps/${appAfter}/browserslist`); + expect(stdout).toContain( + `- apps/${appAfter}/src/app/app.component.css` + ); + expect(stdout).toContain( + `- apps/${appAfter}/src/app/app.component.html` + ); + expect(stdout).toContain( + `- apps/${appAfter}/src/app/app.component.spec.ts` + ); + }); }); - it('should run nx lint', () => { + it('format should check and reformat the code', () => { ensureProject(); - const appBefore = uniq('before'); - const appAfter = uniq('after'); + const myapp = uniq('myapp'); + const mylib = uniq('mylib'); - runCLI(`generate @nrwl/angular:app ${appBefore}`); - runCommand(`mv apps/${appBefore} apps/${appAfter}`); - - const stdout = runCommand('./node_modules/.bin/nx workspace-lint'); - expect(stdout).toContain( - `- Cannot find project '${appBefore}' in 'apps/${appBefore}'` - ); - expect(stdout).toContain( - 'The following file(s) do not belong to any projects:' - ); - expect(stdout).toContain(`- apps/${appAfter}/browserslist`); - expect(stdout).toContain(`- apps/${appAfter}/src/app/app.component.css`); - expect(stdout).toContain(`- apps/${appAfter}/src/app/app.component.html`); - expect(stdout).toContain( - `- apps/${appAfter}/src/app/app.component.spec.ts` - ); - }); - }); - - it('format should check and reformat the code', () => { - ensureProject(); - const myapp = uniq('myapp'); - const mylib = uniq('mylib'); - - runCLI(`generate @nrwl/angular:app ${myapp}`); - runCLI(`generate @nrwl/angular:lib ${mylib}`); - updateFile( - `apps/${myapp}/src/main.ts`, - ` + runCLI(`generate @nrwl/angular:app ${myapp}`); + runCLI(`generate @nrwl/angular:lib ${mylib}`); + updateFile( + `apps/${myapp}/src/main.ts`, + ` const x = 1111; ` - ); - - updateFile( - `apps/${myapp}/src/app/app.module.ts`, - ` - const y = 1111; - ` - ); - - updateFile( - `apps/${myapp}/src/app/app.component.ts`, - ` - const z = 1111; - ` - ); - - updateFile( - `libs/${mylib}/index.ts`, - ` - const x = 1111; - ` - ); - updateFile( - `libs/${mylib}/src/${mylib}.module.ts`, - ` - const y = 1111; - ` - ); - - let stdout = runCommand( - `npm run -s format:check -- --files="libs/${mylib}/index.ts" --libs-and-apps` - ); - expect(stdout).toContain(`libs/${mylib}/index.ts`); - expect(stdout).toContain(`libs/${mylib}/src/${mylib}.module.ts`); - - stdout = runCommand(`npm run -s format:check -- --all`); - expect(stdout).toContain(`apps/${myapp}/src/main.ts`); - expect(stdout).toContain(`apps/${myapp}/src/app/app.module.ts`); - expect(stdout).toContain(`apps/${myapp}/src/app/app.component.ts`); - - runCommand( - `npm run format:write -- --files="apps/${myapp}/src/app/app.module.ts,apps/${myapp}/src/app/app.component.ts"` - ); - - stdout = runCommand('npm run -s format:check -- --all'); - - expect(stdout).toContain(`apps/${myapp}/src/main.ts`); - expect(stdout).not.toContain(`apps/${myapp}/src/app/app.module.ts`); - expect(stdout).not.toContain(`apps/${myapp}/src/app/app.component.ts`); - - runCommand('npm run format:write -- --all'); - expect(runCommand('npm run -s format:check -- --all')).toEqual(''); - }); - - it('should support workspace-specific schematics', () => { - ensureProject(); - const custom = uniq('custom'); - runCLI(`g workspace-schematic ${custom} --no-interactive`); - checkFilesExist( - `tools/schematics/${custom}/index.ts`, - `tools/schematics/${custom}/schema.json` - ); - - const json = readJson(`tools/schematics/${custom}/schema.json`); - json.properties['directory'] = { - type: 'string', - description: 'lib directory' - }; - updateFile(`tools/schematics/${custom}/schema.json`, JSON.stringify(json)); - - const indexFile = readFile(`tools/schematics/${custom}/index.ts`); - updateFile( - `tools/schematics/${custom}/index.ts`, - indexFile.replace( - 'name: schema.name', - 'name: schema.name, directory: schema.directory' - ) - ); - - const workspace = uniq('workspace'); - const dryRunOutput = runCommand( - `npm run workspace-schematic ${custom} ${workspace} -- --no-interactive --directory=dir -d` - ); - expect(exists(`libs/dir/${workspace}/src/index.ts`)).toEqual(false); - expect(dryRunOutput).toContain('update angular.json'); - expect(dryRunOutput).toContain('update nx.json'); - - const output = runCommand( - `npm run workspace-schematic ${custom} ${workspace} -- --no-interactive --directory=dir` - ); - checkFilesExist(`libs/dir/${workspace}/src/index.ts`); - expect(output).toContain('update angular.json'); - expect(output).toContain('update nx.json'); - - const another = uniq('another'); - runCLI(`g workspace-schematic ${another} --no-interactive`); - - const listSchematicsOutput = runCommand( - 'npm run workspace-schematic -- --list-schematics' - ); - expect(listSchematicsOutput).toContain( - 'nx workspace-schematic "--list-schematics"' - ); - expect(listSchematicsOutput).toContain(custom); - expect(listSchematicsOutput).toContain(another); - - const promptOutput = runCommand( - `npm run workspace-schematic ${custom} mylib2 --` - ); - expect(promptOutput).toContain( - 'In which directory should the library be generated?' - ); - }, 1000000); - - describe('dep-graph', () => { - beforeAll(() => { - newProject(); - runCLI('generate @nrwl/angular:app myapp'); - runCLI('generate @nrwl/angular:app myapp2'); - runCLI('generate @nrwl/angular:app myapp3'); - runCLI('generate @nrwl/angular:lib mylib'); - runCLI('generate @nrwl/angular:lib mylib2'); + ); updateFile( - 'apps/myapp/src/main.ts', + `apps/${myapp}/src/app/app.module.ts`, ` + const y = 1111; + ` + ); + + updateFile( + `apps/${myapp}/src/app/app.component.ts`, + ` + const z = 1111; + ` + ); + + updateFile( + `libs/${mylib}/index.ts`, + ` + const x = 1111; + ` + ); + updateFile( + `libs/${mylib}/src/${mylib}.module.ts`, + ` + const y = 1111; + ` + ); + + let stdout = runCommand( + `npm run -s format:check -- --files="libs/${mylib}/index.ts" --libs-and-apps` + ); + expect(stdout).toContain(`libs/${mylib}/index.ts`); + expect(stdout).toContain(`libs/${mylib}/src/${mylib}.module.ts`); + + stdout = runCommand(`npm run -s format:check -- --all`); + expect(stdout).toContain(`apps/${myapp}/src/main.ts`); + expect(stdout).toContain(`apps/${myapp}/src/app/app.module.ts`); + expect(stdout).toContain(`apps/${myapp}/src/app/app.component.ts`); + + runCommand( + `npm run format:write -- --files="apps/${myapp}/src/app/app.module.ts,apps/${myapp}/src/app/app.component.ts"` + ); + + stdout = runCommand('npm run -s format:check -- --all'); + + expect(stdout).toContain(`apps/${myapp}/src/main.ts`); + expect(stdout).not.toContain(`apps/${myapp}/src/app/app.module.ts`); + expect(stdout).not.toContain(`apps/${myapp}/src/app/app.component.ts`); + + runCommand('npm run format:write -- --all'); + expect(runCommand('npm run -s format:check -- --all')).toEqual(''); + }); + + it('should support workspace-specific schematics', () => { + ensureProject(); + const custom = uniq('custom'); + runCLI(`g workspace-schematic ${custom} --no-interactive`); + checkFilesExist( + `tools/schematics/${custom}/index.ts`, + `tools/schematics/${custom}/schema.json` + ); + + const json = readJson(`tools/schematics/${custom}/schema.json`); + json.properties['directory'] = { + type: 'string', + description: 'lib directory' + }; + updateFile( + `tools/schematics/${custom}/schema.json`, + JSON.stringify(json) + ); + + const indexFile = readFile(`tools/schematics/${custom}/index.ts`); + updateFile( + `tools/schematics/${custom}/index.ts`, + indexFile.replace( + 'name: schema.name', + 'name: schema.name, directory: schema.directory' + ) + ); + + const workspace = uniq('workspace'); + const dryRunOutput = runCommand( + `npm run workspace-schematic ${custom} ${workspace} -- --no-interactive --directory=dir -d` + ); + expect(exists(`libs/dir/${workspace}/src/index.ts`)).toEqual(false); + expect(dryRunOutput).toContain(`update ${workspaceConfigName()}`); + expect(dryRunOutput).toContain('update nx.json'); + + const output = runCommand( + `npm run workspace-schematic ${custom} ${workspace} -- --no-interactive --directory=dir` + ); + checkFilesExist(`libs/dir/${workspace}/src/index.ts`); + expect(output).toContain(`update ${workspaceConfigName()}`); + expect(output).toContain('update nx.json'); + + const another = uniq('another'); + runCLI(`g workspace-schematic ${another} --no-interactive`); + + const listSchematicsOutput = runCommand( + 'npm run workspace-schematic -- --list-schematics' + ); + expect(listSchematicsOutput).toContain( + 'nx workspace-schematic "--list-schematics"' + ); + expect(listSchematicsOutput).toContain(custom); + expect(listSchematicsOutput).toContain(another); + + const promptOutput = runCommand( + `npm run workspace-schematic ${custom} mylib2 --` + ); + expect(promptOutput).toContain( + 'In which directory should the library be generated?' + ); + }, 1000000); + + describe('dep-graph', () => { + beforeAll(() => { + newProject(); + runCLI('generate @nrwl/angular:app myapp'); + runCLI('generate @nrwl/angular:app myapp2'); + runCLI('generate @nrwl/angular:app myapp3'); + runCLI('generate @nrwl/angular:lib mylib'); + runCLI('generate @nrwl/angular:lib mylib2'); + + updateFile( + 'apps/myapp/src/main.ts', + ` import '@proj/mylib'; const s = {loadChildren: '@proj/mylib2'}; ` - ); + ); - updateFile( - 'apps/myapp2/src/app/app.component.spec.ts', - `import '@proj/mylib';` - ); + updateFile( + 'apps/myapp2/src/app/app.component.spec.ts', + `import '@proj/mylib';` + ); - updateFile( - 'libs/mylib/src/mylib.module.spec.ts', - `import '@proj/mylib2';` - ); - }); - - it('dep-graph should output json (without critical path) to file', () => { - const file = 'dep-graph.json'; - - runCommand(`npm run dep-graph -- --file="${file}"`); - - expect(() => checkFilesExist(file)).not.toThrow(); - - const jsonFileContents = readJson(file); - - expect(jsonFileContents).toEqual({ - deps: { - mylib2: [], - myapp3: [], - 'myapp3-e2e': [ - { - projectName: 'myapp3', - type: 'implicit' - } - ], - myapp2: [ - { - projectName: 'mylib', - type: 'es6Import' - } - ], - 'myapp2-e2e': [ - { - projectName: 'myapp2', - type: 'implicit' - } - ], - mylib: [ - { - projectName: 'mylib2', - type: 'es6Import' - } - ], - myapp: [ - { - projectName: 'mylib', - type: 'es6Import' - }, - { - projectName: 'mylib2', - type: 'loadChildren' - } - ], - 'myapp-e2e': [ - { - projectName: 'myapp', - type: 'implicit' - } - ] - }, - criticalPath: [] + updateFile( + 'libs/mylib/src/mylib.module.spec.ts', + `import '@proj/mylib2';` + ); }); - }, 1000000); - it('dep-graph should output json with critical path to file', () => { - const file = 'dep-graph.json'; + it('dep-graph should output json (without critical path) to file', () => { + const file = 'dep-graph.json'; - runCommand( - `npm run affected:dep-graph -- --files="libs/mylib/src/index.ts" --file="${file}"` - ); + runCommand(`npm run dep-graph -- --file="${file}"`); - expect(() => checkFilesExist(file)).not.toThrow(); + expect(() => checkFilesExist(file)).not.toThrow(); - const jsonFileContents = readJson(file); + const jsonFileContents = readJson(file); - expect(jsonFileContents.criticalPath).toContain('myapp'); - expect(jsonFileContents.criticalPath).toContain('myapp2'); - expect(jsonFileContents.criticalPath).toContain('mylib'); - expect(jsonFileContents.criticalPath).not.toContain('mylib2'); - }, 1000000); + expect(jsonFileContents).toEqual({ + deps: { + mylib2: [], + myapp3: [], + 'myapp3-e2e': [ + { + projectName: 'myapp3', + type: 'implicit' + } + ], + myapp2: [ + { + projectName: 'mylib', + type: 'es6Import' + } + ], + 'myapp2-e2e': [ + { + projectName: 'myapp2', + type: 'implicit' + } + ], + mylib: [ + { + projectName: 'mylib2', + type: 'es6Import' + } + ], + myapp: [ + { + projectName: 'mylib', + type: 'es6Import' + }, + { + projectName: 'mylib2', + type: 'loadChildren' + } + ], + 'myapp-e2e': [ + { + projectName: 'myapp', + type: 'implicit' + } + ] + }, + criticalPath: [] + }); + }, 1000000); - it('dep-graph should output dot to file', () => { - const file = 'dep-graph.dot'; + it('dep-graph should output json with critical path to file', () => { + const file = 'dep-graph.json'; - runCommand( - `npm run dep-graph -- --files="libs/mylib/index.ts" --file="${file}"` - ); + runCommand( + `npm run affected:dep-graph -- --files="libs/mylib/src/index.ts" --file="${file}"` + ); - expect(() => checkFilesExist(file)).not.toThrow(); + expect(() => checkFilesExist(file)).not.toThrow(); - const fileContents = readFile(file); - expect(fileContents).toContain('"myapp" -> "mylib"'); - expect(fileContents).toContain('"myapp2" -> "mylib"'); - expect(fileContents).toContain('"mylib" -> "mylib2"'); - }, 1000000); + const jsonFileContents = readJson(file); - it('dep-graph should output html to file', () => { - const file = 'dep-graph.html'; - runCommand( - `npm run dep-graph -- --files="libs/mylib/index.ts" --file="${file}"` - ); + expect(jsonFileContents.criticalPath).toContain('myapp'); + expect(jsonFileContents.criticalPath).toContain('myapp2'); + expect(jsonFileContents.criticalPath).toContain('mylib'); + expect(jsonFileContents.criticalPath).not.toContain('mylib2'); + }, 1000000); - expect(() => checkFilesExist(file)).not.toThrow(); + it('dep-graph should output dot to file', () => { + const file = 'dep-graph.dot'; - const fileContents = readFile(file); - expect(fileContents).toContain(''); - expect(fileContents).toContain('myapp->mylib'); - expect(fileContents).toContain('myapp->mylib2'); - expect(fileContents).toContain('mylib->mylib2'); - }, 1000000); + runCommand( + `npm run dep-graph -- --files="libs/mylib/index.ts" --file="${file}"` + ); + + expect(() => checkFilesExist(file)).not.toThrow(); + + const fileContents = readFile(file); + expect(fileContents).toContain('"myapp" -> "mylib"'); + expect(fileContents).toContain('"myapp2" -> "mylib"'); + expect(fileContents).toContain('"mylib" -> "mylib2"'); + }, 1000000); + + it('dep-graph should output html to file', () => { + const file = 'dep-graph.html'; + runCommand( + `npm run dep-graph -- --files="libs/mylib/index.ts" --file="${file}"` + ); + + expect(() => checkFilesExist(file)).not.toThrow(); + + const fileContents = readFile(file); + expect(fileContents).toContain(''); + expect(fileContents).toContain('myapp->mylib'); + expect(fileContents).toContain('myapp->mylib2'); + expect(fileContents).toContain('mylib->mylib2'); + }, 1000000); + }); }); }); diff --git a/e2e/cypress.test.ts b/e2e/cypress.test.ts index 8cee646147..eb28f51914 100644 --- a/e2e/cypress.test.ts +++ b/e2e/cypress.test.ts @@ -6,58 +6,61 @@ import { readFile, ensureProject, uniq, - runsInWSL, - newProject + newProject, + forEachCli, + supportUi } from './utils'; -describe('Cypress E2E Test runner', () => { - describe('project scaffolding', () => { - it('should generate an app with the Cypress as e2e test runner', () => { - ensureProject(); - const myapp = uniq('myapp'); - runCLI(`generate @nrwl/angular:app ${myapp} --e2eTestRunner=cypress`); - - // Making sure the package.json file contains the Cypress dependency - const packageJson = readJson('package.json'); - expect(packageJson.devDependencies['cypress']).toBeTruthy(); - - // Making sure the cypress folders & files are created - checkFilesExist(`apps/${myapp}-e2e/cypress.json`); - checkFilesExist(`apps/${myapp}-e2e/tsconfig.e2e.json`); - - checkFilesExist(`apps/${myapp}-e2e/src/fixtures/example.json`); - checkFilesExist(`apps/${myapp}-e2e/src/integration/app.spec.ts`); - checkFilesExist(`apps/${myapp}-e2e/src/plugins/index.js`); - checkFilesExist(`apps/${myapp}-e2e/src/support/app.po.ts`); - checkFilesExist(`apps/${myapp}-e2e/src/support/index.ts`); - checkFilesExist(`apps/${myapp}-e2e/src/support/commands.ts`); - }, 1000000); - }); - - if (!runsInWSL()) { - describe('running Cypress', () => { - it('should execute e2e tests using Cypress', () => { - newProject(); +forEachCli(() => { + describe('Cypress E2E Test runner', () => { + describe('project scaffolding', () => { + it('should generate an app with the Cypress as e2e test runner', () => { + ensureProject(); const myapp = uniq('myapp'); runCLI(`generate @nrwl/angular:app ${myapp} --e2eTestRunner=cypress`); - expect( - runCLI(`e2e --project=${myapp}-e2e --headless --watch=false`) - ).toContain('All specs passed!'); + // Making sure the package.json file contains the Cypress dependency + const packageJson = readJson('package.json'); + expect(packageJson.devDependencies['cypress']).toBeTruthy(); - const originalContents = JSON.parse( - readFile(`apps/${myapp}-e2e/cypress.json`) - ); - delete originalContents.fixturesFolder; - updateFile( - `apps/${myapp}-e2e/cypress.json`, - JSON.stringify(originalContents) - ); + // Making sure the cypress folders & files are created + checkFilesExist(`apps/${myapp}-e2e/cypress.json`); + checkFilesExist(`apps/${myapp}-e2e/tsconfig.e2e.json`); - expect( - runCLI(`e2e --project=${myapp}-e2e --headless --watch=false`) - ).toContain('All specs passed!'); + checkFilesExist(`apps/${myapp}-e2e/src/fixtures/example.json`); + checkFilesExist(`apps/${myapp}-e2e/src/integration/app.spec.ts`); + checkFilesExist(`apps/${myapp}-e2e/src/plugins/index.js`); + checkFilesExist(`apps/${myapp}-e2e/src/support/app.po.ts`); + checkFilesExist(`apps/${myapp}-e2e/src/support/index.ts`); + checkFilesExist(`apps/${myapp}-e2e/src/support/commands.ts`); }, 1000000); }); - } + + if (supportUi()) { + describe('running Cypress', () => { + fit('should execute e2e tests using Cypress', () => { + newProject(); + const myapp = uniq('myapp'); + runCLI(`generate @nrwl/angular:app ${myapp} --e2eTestRunner=cypress`); + + expect(runCLI(`e2e ${myapp}-e2e --headless --no-watch`)).toContain( + 'All specs passed!' + ); + + const originalContents = JSON.parse( + readFile(`apps/${myapp}-e2e/cypress.json`) + ); + delete originalContents.fixturesFolder; + updateFile( + `apps/${myapp}-e2e/cypress.json`, + JSON.stringify(originalContents) + ); + + expect(runCLI(`e2e ${myapp}-e2e --headless --no-watch`)).toContain( + 'All specs passed!' + ); + }, 1000000); + }); + } + }); }); diff --git a/e2e/delegate-to-cli.test.ts b/e2e/delegate-to-cli.test.ts index 8203b22bbf..90a6158d9b 100644 --- a/e2e/delegate-to-cli.test.ts +++ b/e2e/delegate-to-cli.test.ts @@ -1,23 +1,31 @@ -import { ensureProject, uniq, runCommand, checkFilesExist } from './utils'; +import { + ensureProject, + uniq, + runCommand, + checkFilesExist, + forEachCli +} from './utils'; -describe('Delegate to CLI', () => { - it('should delegate to the Angular CLI all non-standard commands', async () => { - ensureProject(); +forEachCli(() => { + describe('Delegate to CLI', () => { + it('should delegate to the cli all non-standard commands', async () => { + ensureProject(); - const appName = uniq('app'); - runCommand(`npm run nx -- g app ${appName}`); - runCommand(`npm run nx -- build ${appName}`); + const appName = uniq('app'); + runCommand(`npm run nx -- g @nrwl/web:app ${appName}`); + runCommand(`npm run nx -- build ${appName}`); - checkFilesExist( - `dist/apps/${appName}/index.html`, - `dist/apps/${appName}/polyfills-es2015.js`, - `dist/apps/${appName}/runtime-es2015.js`, - `dist/apps/${appName}/main-es2015.js`, - `dist/apps/${appName}/styles-es2015.js`, - `dist/apps/${appName}/polyfills-es5.js`, - `dist/apps/${appName}/runtime-es5.js`, - `dist/apps/${appName}/main-es5.js`, - `dist/apps/${appName}/styles-es5.js` - ); - }, 120000); + checkFilesExist( + `dist/apps/${appName}/index.html`, + `dist/apps/${appName}/polyfills-es2015.js`, + `dist/apps/${appName}/runtime-es2015.js`, + `dist/apps/${appName}/main-es2015.js`, + `dist/apps/${appName}/styles-es2015.js`, + `dist/apps/${appName}/polyfills-es5.js`, + `dist/apps/${appName}/runtime-es5.js`, + `dist/apps/${appName}/main-es5.js`, + `dist/apps/${appName}/styles-es5.js` + ); + }, 120000); + }); }); diff --git a/e2e/downgrade-module.test.ts b/e2e/downgrade-module.test.ts index 794ba908bb..19d63a0557 100644 --- a/e2e/downgrade-module.test.ts +++ b/e2e/downgrade-module.test.ts @@ -1,29 +1,33 @@ import { ensureProject, - patchKarmaToWorkOnWSL, runCLI, uniq, - updateFile + updateFile, + forEachCli, + supportUi } from './utils'; -describe('DowngradeModule', () => { - it('should generate a downgradeModule setup', async () => { - ensureProject(); +forEachCli(() => { + xdescribe('DowngradeModule', () => { + it('should generate a downgradeModule setup', async () => { + ensureProject(); - const myapp = uniq('myapp'); - runCLI(`generate @nrwl/angular:app ${myapp} --unit-test-runner=karma`); - patchKarmaToWorkOnWSL(); + const myapp = uniq('myapp'); + runCLI(`generate @nrwl/angular:app ${myapp} --unit-test-runner=karma`); - updateFile( - `apps/${myapp}/src/legacy.js`, - `window.angular.module('legacy', []);` - ); + updateFile( + `apps/${myapp}/src/legacy.js`, + `window.angular.module('legacy', []);` + ); - runCLI( - `generate @nrwl/angular:downgrade-module legacy --angularJsImport=./legacy --project=${myapp}` - ); + runCLI( + `generate @nrwl/angular:downgrade-module legacy --angularJsImport=./legacy --project=${myapp}` + ); - runCLI(`build ${myapp}`); - expect(runCLI(`test ${myapp} --no-watch`)).toContain('3 SUCCESS'); - }, 1000000); + runCLI(`build ${myapp}`); + if (supportUi()) { + expect(runCLI(`test ${myapp} --no-watch`)).toContain('3 SUCCESS'); + } + }, 1000000); + }); }); diff --git a/e2e/help.test.ts b/e2e/help.test.ts new file mode 100644 index 0000000000..4d50900012 --- /dev/null +++ b/e2e/help.test.ts @@ -0,0 +1,47 @@ +import { forEachCli, ensureProject, runCommand, runCLI, cli } from './utils'; + +forEachCli('nx', () => { + describe('Help', () => { + it('should should help', async () => { + ensureProject(); + + const mainHelp = runCLI(`--help`); + expect(mainHelp).toContain('Run a target for a project'); + expect(mainHelp).toContain('Run task for affected projects'); + + const genHelp = runCLI(`g @nrwl/web:app --help`); + expect(genHelp).toContain( + 'The file extension to be used for style files. (default: css)' + ); + + const affectedHelp = runCLI(`affected --help`); + expect(affectedHelp).toContain('Run task for affected projects'); + + const version = runCLI(`--version`); + expect(version).toContain('*'); // stub value + }, 120000); + }); +}); + +forEachCli('angular', () => { + describe('Help', () => { + it('should should help', async () => { + ensureProject(); + + const mainHelp = runCLI(`--help`); + expect(mainHelp).toContain('Run a target for a project'); + expect(mainHelp).toContain('Run task for affected projects'); + + const genHelp = runCLI(`g @nrwl/web:app --help`); + expect(genHelp).toContain( + 'The file extension to be used for style files.' + ); + + const affectedHelp = runCLI(`affected --help`); + expect(affectedHelp).toContain('Run task for affected projects'); + + const version = runCLI(`--version`); + expect(version).toContain('*'); // stub value + }, 120000); + }); +}); diff --git a/e2e/jest.test.ts b/e2e/jest.test.ts index 290f4c9929..a07baebd4b 100644 --- a/e2e/jest.test.ts +++ b/e2e/jest.test.ts @@ -1,23 +1,25 @@ -import { runCLIAsync, ensureProject, uniq, runCLI } from './utils'; +import { runCLIAsync, ensureProject, uniq, runCLI, forEachCli } from './utils'; -describe('Jest', () => { - it('should be able test projects using jest', async done => { - ensureProject(); - const mylib = uniq('mylib'); - const myapp = uniq('myapp'); - runCLI(`generate @nrwl/angular:app ${myapp} --unit-test-runner jest`); - runCLI(`generate @nrwl/angular:lib ${mylib} --unit-test-runner jest`); +forEachCli(() => { + describe('Jest', () => { + it('should be able test projects using jest', async done => { + ensureProject(); + const mylib = uniq('mylib'); + const myapp = uniq('myapp'); + runCLI(`generate @nrwl/angular:app ${myapp} --unit-test-runner jest`); + runCLI(`generate @nrwl/angular:lib ${mylib} --unit-test-runner jest`); - await Promise.all([ - runCLIAsync(`generate @nrwl/angular:service test --project ${myapp}`), - runCLIAsync(`generate @nrwl/angular:component test --project ${myapp}`), - runCLIAsync(`generate @nrwl/angular:service test --project ${mylib}`), - runCLIAsync(`generate @nrwl/angular:component test --project ${mylib}`) - ]); - const appResult = await runCLIAsync(`test ${myapp}`); - expect(appResult.stderr).toContain('Test Suites: 3 passed, 3 total'); - const libResult = await runCLIAsync(`test ${mylib}`); - expect(libResult.stderr).toContain('Test Suites: 3 passed, 3 total'); - done(); - }, 45000); + await Promise.all([ + runCLIAsync(`generate @nrwl/angular:service test --project ${myapp}`), + runCLIAsync(`generate @nrwl/angular:component test --project ${myapp}`), + runCLIAsync(`generate @nrwl/angular:service test --project ${mylib}`), + runCLIAsync(`generate @nrwl/angular:component test --project ${mylib}`) + ]); + const appResult = await runCLIAsync(`test ${myapp} --no-watch`); + expect(appResult.stderr).toContain('Test Suites: 3 passed, 3 total'); + const libResult = await runCLIAsync(`test ${mylib}`); + expect(libResult.stderr).toContain('Test Suites: 3 passed, 3 total'); + done(); + }, 45000); + }); }); diff --git a/e2e/karma.test.ts b/e2e/karma.test.ts index 82bdcd457a..29c1419618 100644 --- a/e2e/karma.test.ts +++ b/e2e/karma.test.ts @@ -3,37 +3,42 @@ import { runCLIAsync, ensureProject, uniq, - patchKarmaToWorkOnWSL + forEachCli, + supportUi } from './utils'; -describe('Karma', () => { - it('should be able to generate a testable library using karma', async done => { - ensureProject(); - const mylib = uniq('mylib'); - runCLI(`generate @nrwl/angular:lib ${mylib} --unit-test-runner karma`); - patchKarmaToWorkOnWSL(); +forEachCli(() => { + xdescribe('Karma', () => { + it('should be able to generate a testable library using karma', async done => { + ensureProject(); + const mylib = uniq('mylib'); + runCLI(`generate @nrwl/angular:lib ${mylib} --unit-test-runner karma`); - await Promise.all([ - runCLIAsync(`generate @nrwl/angular:service test --project ${mylib}`), - runCLIAsync(`generate @nrwl/angular:component test --project ${mylib}`) - ]); - const karmaResult = await runCLIAsync(`test ${mylib}`); - expect(karmaResult.stdout).toContain('3 SUCCESS'); - done(); - }, 30000); + await Promise.all([ + runCLIAsync(`generate @nrwl/angular:service test --project ${mylib}`), + runCLIAsync(`generate @nrwl/angular:component test --project ${mylib}`) + ]); + if (supportUi()) { + const karmaResult = await runCLIAsync(`test ${mylib}`); + expect(karmaResult.stdout).toContain('3 SUCCESS'); + } + done(); + }, 30000); - it('should be able to generate a testable application using karma', async done => { - ensureProject(); - const myapp = uniq('myapp'); - runCLI(`generate @nrwl/angular:app ${myapp} --unit-test-runner karma`); - patchKarmaToWorkOnWSL(); + it('should be able to generate a testable application using karma', async done => { + ensureProject(); + const myapp = uniq('myapp'); + runCLI(`generate @nrwl/angular:app ${myapp} --unit-test-runner karma`); - await Promise.all([ - runCLIAsync(`generate @nrwl/angular:service test --project ${myapp}`), - runCLIAsync(`generate @nrwl/angular:component test --project ${myapp}`) - ]); - const karmaResult = await runCLIAsync(`test ${myapp}`); - expect(karmaResult.stdout).toContain('5 SUCCESS'); - done(); - }, 30000); + await Promise.all([ + runCLIAsync(`generate @nrwl/angular:service test --project ${myapp}`), + runCLIAsync(`generate @nrwl/angular:component test --project ${myapp}`) + ]); + if (supportUi()) { + const karmaResult = await runCLIAsync(`test ${myapp}`); + expect(karmaResult.stdout).toContain('5 SUCCESS'); + } + done(); + }, 30000); + }); }); diff --git a/e2e/new.test.ts b/e2e/new.test.ts new file mode 100644 index 0000000000..f510d10b99 --- /dev/null +++ b/e2e/new.test.ts @@ -0,0 +1,111 @@ +import { + ensureProject, + exists, + expectTestsPass, + getSize, + runCLI, + runCLIAsync, + uniq, + updateFile, + forEachCli, + checkFilesExist, + tmpProjPath, + supportUi +} from './utils'; +import { toClassName } from '@nrwl/workspace'; + +forEachCli(() => { + describe('Create New Workspace', () => { + beforeEach(() => { + ensureProject(); + }); + + it('should work', async () => { + const myapp = uniq('myapp'); + const mylib = uniq('mylib'); + runCLI( + `generate @nrwl/angular:app ${myapp} --directory=myDir --no-interactive` + ); + runCLI( + `generate @nrwl/angular:lib ${mylib} --directory=myDir --no-interactive` + ); + + updateFile( + `apps/my-dir/${myapp}/src/app/app.module.ts`, + ` + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { MyDir${toClassName( + mylib + )}Module } from '@proj/my-dir/${mylib}'; + import { AppComponent } from './app.component'; + + @NgModule({ + imports: [BrowserModule, MyDir${toClassName(mylib)}Module], + declarations: [AppComponent], + bootstrap: [AppComponent] + }) + export class AppModule {} + ` + ); + runCLI(`build my-dir-${myapp} --prod --output-hashing none`); + + checkFilesExist( + `dist/apps/my-dir/${myapp}/main-es2015.js`, + `dist/apps/my-dir/${myapp}/main-es5.js` + ); + + // This is a loose requirement because there are a lot of + // influences external from this project that affect this. + const es2015BundleSize = getSize( + tmpProjPath(`dist/apps/my-dir/${myapp}/main-es2015.js`) + ); + console.log( + `The current es2015 bundle size is ${es2015BundleSize / 1000} KB` + ); + expect(es2015BundleSize).toBeLessThanOrEqual(150000); + + const es5BundleSize = getSize( + tmpProjPath(`dist/apps/my-dir/${myapp}/main-es5.js`) + ); + console.log(`The current es5 bundle size is ${es5BundleSize / 1000} KB`); + expect(es5BundleSize).toBeLessThanOrEqual(175000); + + // running tests for the app + expectTestsPass(await runCLIAsync(`test my-dir-${myapp} --no-watch`)); + + // running tests for the lib + expectTestsPass(await runCLIAsync(`test my-dir-${mylib} --no-watch`)); + + if (supportUi()) { + expect( + runCLI(`e2e my-dir-${myapp}-e2e --headless --no-watch`) + ).toContain('All specs passed!'); + } + }, 1000000); + + it('should support router config generation (lazy)', async () => { + const myapp = uniq('myapp'); + const mylib = uniq('mylib'); + runCLI(`generate @nrwl/angular:app ${myapp} --directory=myDir --routing`); + runCLI( + `generate @nrwl/angular:lib ${mylib} --directory=myDir --routing --lazy --parentModule=apps/my-dir/${myapp}/src/app/app.module.ts` + ); + + runCLI(`build my-dir-${myapp} --aot`); + expectTestsPass(await runCLIAsync(`test my-dir-${myapp} --no-watch`)); + }, 1000000); + + it('should support router config generation (eager)', async () => { + const myapp = uniq('myapp'); + runCLI(`generate @nrwl/angular:app ${myapp} --directory=myDir --routing`); + const mylib = uniq('mylib'); + runCLI( + `generate @nrwl/angular:lib ${mylib} --directory=myDir --routing --parentModule=apps/my-dir/${myapp}/src/app/app.module.ts` + ); + + runCLI(`build my-dir-${myapp} --aot`); + expectTestsPass(await runCLIAsync(`test my-dir-${myapp} --no-watch`)); + }, 1000000); + }); +}); diff --git a/e2e/ng-add.test.ts b/e2e/ng-add.test.ts index 6c0ad316b2..6039492bed 100644 --- a/e2e/ng-add.test.ts +++ b/e2e/ng-add.test.ts @@ -6,363 +6,356 @@ import { runCLI, runCLIAsync, runCommand, - runNgNew, - updateFile + runNew, + updateFile, + forEachCli, + runNgAdd } from './utils'; -describe('Nrwl Convert to Nx Workspace', () => { - beforeEach(cleanup); - afterAll(cleanup); +forEachCli('angular', () => { + describe('Nrwl Convert to Nx Workspace', () => { + beforeEach(cleanup); + afterAll(cleanup); - it('should generate a workspace', () => { - runNgNew(); + it('should generate a workspace', () => { + runNew('', false, false); - // update package.json - const packageJson = readJson('package.json'); - packageJson.description = 'some description'; - updateFile('package.json', JSON.stringify(packageJson, null, 2)); - // confirm that @nrwl and @ngrx dependencies do not exist yet - expect(packageJson.devDependencies['@nrwl/workspace']).not.toBeDefined(); - expect(packageJson.dependencies['@ngrx/store']).not.toBeDefined(); - expect(packageJson.dependencies['@ngrx/effects']).not.toBeDefined(); - expect(packageJson.dependencies['@ngrx/router-store']).not.toBeDefined(); - expect( - packageJson.devDependencies['@ngrx/store-devtools'] - ).not.toBeDefined(); + // update package.json + const packageJson = readJson('package.json'); + packageJson.description = 'some description'; + updateFile('package.json', JSON.stringify(packageJson, null, 2)); + // confirm that @nrwl and @ngrx dependencies do not exist yet + expect(packageJson.devDependencies['@nrwl/workspace']).not.toBeDefined(); + expect(packageJson.dependencies['@ngrx/store']).not.toBeDefined(); + expect(packageJson.dependencies['@ngrx/effects']).not.toBeDefined(); + expect(packageJson.dependencies['@ngrx/router-store']).not.toBeDefined(); + expect( + packageJson.devDependencies['@ngrx/store-devtools'] + ).not.toBeDefined(); - // update tsconfig.json - const tsconfigJson = readJson('tsconfig.json'); - tsconfigJson.compilerOptions.paths = { a: ['b'] }; - updateFile('tsconfig.json', JSON.stringify(tsconfigJson, null, 2)); + // update tsconfig.json + const tsconfigJson = readJson('tsconfig.json'); + tsconfigJson.compilerOptions.paths = { a: ['b'] }; + updateFile('tsconfig.json', JSON.stringify(tsconfigJson, null, 2)); - updateFile('src/scripts.ts', ''); + updateFile('src/scripts.ts', ''); - // update angular-cli.json - const angularCLIJson = readJson('angular.json'); - angularCLIJson.projects.proj.architect.build.options.scripts = angularCLIJson.projects.proj.architect.test.options.scripts = [ - 'src/scripts.ts' - ]; - angularCLIJson.projects.proj.architect.test.options.styles = [ - 'src/styles.css' - ]; - updateFile('angular.json', JSON.stringify(angularCLIJson, null, 2)); + // update angular-cli.json + const angularCLIJson = readJson('angular.json'); + angularCLIJson.projects.proj.architect.build.options.scripts = angularCLIJson.projects.proj.architect.test.options.scripts = [ + 'src/scripts.ts' + ]; + angularCLIJson.projects.proj.architect.test.options.styles = [ + 'src/styles.css' + ]; + updateFile('angular.json', JSON.stringify(angularCLIJson, null, 2)); - // run the command - runCLI('add @nrwl/workspace --npmScope projscope --skip-install'); - copyMissingPackages(); + // run the command + runNgAdd('add @nrwl/workspace --npmScope projscope --skip-install'); + copyMissingPackages(); - // check that prettier config exits and that files have been moved! - checkFilesExist( - '.vscode/extensions.json', - '.prettierrc', - 'apps/proj/src/main.ts', - 'apps/proj/src/app/app.module.ts' - ); + // check that prettier config exits and that files have been moved! + checkFilesExist( + '.vscode/extensions.json', + '.prettierrc', + 'apps/proj/src/main.ts', + 'apps/proj/src/app/app.module.ts' + ); - expect(readJson('.vscode/extensions.json').recommendations).toEqual([ - 'nrwl.angular-console', - 'angular.ng-template', - 'ms-vscode.vscode-typescript-tslint-plugin', - 'esbenp.prettier-vscode' - ]); + expect(readJson('.vscode/extensions.json').recommendations).toEqual([ + 'nrwl.angular-console', + 'angular.ng-template', + 'ms-vscode.vscode-typescript-tslint-plugin', + 'esbenp.prettier-vscode' + ]); - // check that package.json got merged - const updatedPackageJson = readJson('package.json'); - expect(updatedPackageJson.description).toEqual('some description'); - expect(updatedPackageJson.scripts).toEqual({ - ng: 'ng', - nx: 'nx', - start: 'ng serve', - build: 'ng build', - test: 'ng test', - lint: 'nx workspace-lint && ng lint', - e2e: 'ng e2e', - 'affected:apps': 'nx affected:apps', - 'affected:libs': 'nx affected:libs', - 'affected:build': 'nx affected:build', - 'affected:e2e': 'nx affected:e2e', - 'affected:test': 'nx affected:test', - 'affected:lint': 'nx affected:lint', - 'affected:dep-graph': 'nx affected:dep-graph', - affected: 'nx affected', - format: 'nx format:write', - 'format:write': 'nx format:write', - 'format:check': 'nx format:check', - update: 'ng update @nrwl/workspace', - 'update:check': 'ng update', - 'dep-graph': 'nx dep-graph', - 'workspace-schematic': 'nx workspace-schematic', - help: 'nx help' - }); - expect(updatedPackageJson.devDependencies['@nrwl/workspace']).toBeDefined(); - expect(updatedPackageJson.devDependencies['@angular/cli']).toBeDefined(); + // check that package.json got merged + const updatedPackageJson = readJson('package.json'); + expect(updatedPackageJson.description).toEqual('some description'); + expect(updatedPackageJson.scripts).toEqual({ + ng: 'ng', + nx: 'nx', + start: 'ng serve', + build: 'ng build', + test: 'ng test', + lint: 'nx workspace-lint && ng lint', + e2e: 'ng e2e', + 'affected:apps': 'nx affected:apps', + 'affected:libs': 'nx affected:libs', + 'affected:build': 'nx affected:build', + 'affected:e2e': 'nx affected:e2e', + 'affected:test': 'nx affected:test', + 'affected:lint': 'nx affected:lint', + 'affected:dep-graph': 'nx affected:dep-graph', + affected: 'nx affected', + format: 'nx format:write', + 'format:write': 'nx format:write', + 'format:check': 'nx format:check', + update: 'ng update @nrwl/workspace', + 'update:check': 'ng update', + 'dep-graph': 'nx dep-graph', + 'workspace-schematic': 'nx workspace-schematic', + help: 'nx help' + }); + expect( + updatedPackageJson.devDependencies['@nrwl/workspace'] + ).toBeDefined(); + expect(updatedPackageJson.devDependencies['@angular/cli']).toBeDefined(); - const nxJson = readJson('nx.json'); - expect(nxJson).toEqual({ - npmScope: 'projscope', - implicitDependencies: { - 'angular.json': '*', - 'package.json': '*', - 'tslint.json': '*', - 'tsconfig.json': '*', - 'nx.json': '*' - }, - projects: { - proj: { - tags: [] + const nxJson = readJson('nx.json'); + expect(nxJson).toEqual({ + npmScope: 'projscope', + implicitDependencies: { + 'angular.json': '*', + 'package.json': '*', + 'tslint.json': '*', + 'tsconfig.json': '*', + 'nx.json': '*' }, - 'proj-e2e': { - tags: [] + projects: { + proj: { + tags: [] + }, + 'proj-e2e': { + tags: [] + } } - } - }); + }); - // check if angular-cli.json get merged - const updatedAngularCLIJson = readJson('angular.json'); - expect(updatedAngularCLIJson.projects.proj.root).toEqual('apps/proj'); - expect(updatedAngularCLIJson.projects.proj.sourceRoot).toEqual( - 'apps/proj/src' - ); - - expect(updatedAngularCLIJson.projects.proj.architect.build).toEqual({ - builder: '@angular-devkit/build-angular:browser', - options: { - outputPath: 'dist/apps/proj', - index: 'apps/proj/src/index.html', - main: 'apps/proj/src/main.ts', - polyfills: 'apps/proj/src/polyfills.ts', - tsConfig: 'apps/proj/tsconfig.app.json', - assets: ['apps/proj/src/favicon.ico', 'apps/proj/src/assets'], - styles: ['apps/proj/src/styles.css'], - scripts: ['apps/proj/src/scripts.ts'] - }, - configurations: { - production: { - fileReplacements: [ - { - replace: 'apps/proj/src/environments/environment.ts', - with: 'apps/proj/src/environments/environment.prod.ts' - } - ], - budgets: [ - { - maximumError: '5mb', - maximumWarning: '2mb', - type: 'initial' - } - ], - optimization: true, - outputHashing: 'all', - sourceMap: false, - extractCss: true, - namedChunks: false, - aot: true, - extractLicenses: true, - vendorChunk: false, - buildOptimizer: true - } - } - }); - expect(updatedAngularCLIJson.projects.proj.architect.serve).toEqual({ - builder: '@angular-devkit/build-angular:dev-server', - options: { - browserTarget: 'proj:build' - }, - configurations: { - production: { - browserTarget: 'proj:build:production' - } - } - }); - - expect(updatedAngularCLIJson.projects.proj.architect.test).toEqual({ - builder: '@angular-devkit/build-angular:karma', - options: { - main: 'apps/proj/src/test.ts', - polyfills: 'apps/proj/src/polyfills.ts', - tsConfig: 'apps/proj/tsconfig.spec.json', - karmaConfig: 'apps/proj/karma.conf.js', - styles: ['apps/proj/src/styles.css'], - scripts: ['apps/proj/src/scripts.ts'], - assets: ['apps/proj/src/favicon.ico', 'apps/proj/src/assets'] - } - }); - - expect(updatedAngularCLIJson.projects.proj.architect.lint).toEqual({ - builder: '@angular-devkit/build-angular:tslint', - options: { - tsConfig: [ - 'apps/proj/tsconfig.app.json', - 'apps/proj/tsconfig.spec.json' - ], - exclude: ['**/node_modules/**'] - } - }); - - expect(updatedAngularCLIJson.projects['proj-e2e'].root).toEqual( - 'apps/proj-e2e' - ); - expect(updatedAngularCLIJson.projects['proj-e2e'].architect.e2e).toEqual({ - builder: '@angular-devkit/build-angular:protractor', - configurations: { - production: { - devServerTarget: 'proj:serve:production' - } - }, - options: { - protractorConfig: 'apps/proj-e2e/protractor.conf.js', - devServerTarget: 'proj:serve' - } - }); - expect(updatedAngularCLIJson.projects['proj-e2e'].architect.lint).toEqual({ - builder: '@angular-devkit/build-angular:tslint', - options: { - tsConfig: 'apps/proj-e2e/tsconfig.json', - exclude: ['**/node_modules/**'] - } - }); - - const updatedTslint = readJson('tslint.json'); - expect(updatedTslint.rules['nx-enforce-module-boundaries']).toEqual([ - true, - { - allow: [], - depConstraints: [{ sourceTag: '*', onlyDependOnLibsWithTags: ['*'] }] - } - ]); - - runCLI('build --prod --outputHashing none'); - checkFilesExist('dist/apps/proj/main-es2015.js'); - }); - - it('should generate a workspace and not change dependencies, devDependencies, or vscode extensions if they already exist', () => { - // create a new AngularCLI app - runNgNew(); - const nxVersion = '0.0.0'; - const schematicsVersion = '0.0.0'; - const ngrxVersion = '0.0.0'; - // update package.json - const existingPackageJson = readJson('package.json'); - existingPackageJson.devDependencies['@nrwl/workspace'] = schematicsVersion; - existingPackageJson.dependencies['@ngrx/store'] = ngrxVersion; - existingPackageJson.dependencies['@ngrx/effects'] = ngrxVersion; - existingPackageJson.dependencies['@ngrx/router-store'] = ngrxVersion; - existingPackageJson.devDependencies['@ngrx/store-devtools'] = ngrxVersion; - updateFile('package.json', JSON.stringify(existingPackageJson, null, 2)); - - updateFile( - '.vscode/extensions.json', - JSON.stringify({ - recommendations: ['eamodio.gitlens', 'angular.ng-template'] - }) - ); - // run the command - runCLI('add @nrwl/workspace --npmScope projscope --skip-install'); - - // check that dependencies and devDependencies remained the same - const packageJson = readJson('package.json'); - expect(packageJson.devDependencies['@nrwl/workspace']).toEqual( - schematicsVersion - ); - expect(packageJson.dependencies['@ngrx/store']).toEqual(ngrxVersion); - expect(packageJson.dependencies['@ngrx/effects']).toEqual(ngrxVersion); - expect(packageJson.dependencies['@ngrx/router-store']).toEqual(ngrxVersion); - expect(packageJson.devDependencies['@ngrx/store-devtools']).toEqual( - ngrxVersion - ); - - expect(readJson('.vscode/extensions.json').recommendations).toEqual([ - 'eamodio.gitlens', - 'angular.ng-template', - 'nrwl.angular-console', - 'ms-vscode.vscode-typescript-tslint-plugin', - 'esbenp.prettier-vscode' - ]); - }); - - it('should convert a project with common libraries in the ecosystem', () => { - // create a new AngularCLI app - runNgNew(); - - // Add some Angular libraries - runCLI('add @angular/elements'); - runCLI('add @angular/material'); - runCLI('add @angular/pwa'); - runCLI('add @ngrx/store'); - runCLI('add @ngrx/effects'); - - // Add Nx - runCLI('add @nrwl/workspace --skip-install'); - }); - - it('should handle workspaces with no e2e project', async () => { - // create a new AngularCLI app - runNgNew(); - - // Remove e2e - runCommand('rm -rf e2e'); - const existingAngularJson = readJson('angular.json'); - delete existingAngularJson.projects['proj'].architect.e2e; - updateFile('angular.json', JSON.stringify(existingAngularJson, null, 2)); - - // Add @nrwl/workspace - const result = await runCLIAsync( - 'add @nrwl/workspace --npmScope projscope --skip-install' - ); - - checkFilesExist( - '.prettierrc', - 'apps/proj/src/main.ts', - 'apps/proj/src/app/app.module.ts' - ); - - expect(result.stderr).toContain( - 'No e2e project was migrated because there was none declared in angular.json' - ); - }); - - it('should handle different types of errors', () => { - // create a new AngularCLI app - runNgNew(); - - // Only remove e2e directory - runCommand('mv e2e e2e-bak'); - try { - runCLI('add @nrwl/workspace --npmScope projscope --skip-install'); - fail('Did not handle not having a e2e directory'); - } catch (e) { - expect(e.stderr.toString()).toContain( - 'Your workspace could not be converted into an Nx Workspace because of the above error.' + // check if angular-cli.json get merged + const updatedAngularCLIJson = readJson('angular.json'); + expect(updatedAngularCLIJson.projects.proj.root).toEqual('apps/proj'); + expect(updatedAngularCLIJson.projects.proj.sourceRoot).toEqual( + 'apps/proj/src' ); - } - // Put e2e back - runCommand('mv e2e-bak e2e'); + expect(updatedAngularCLIJson.projects.proj.architect.build).toEqual({ + builder: '@angular-devkit/build-angular:browser', + options: { + aot: false, + outputPath: 'dist/apps/proj', + index: 'apps/proj/src/index.html', + main: 'apps/proj/src/main.ts', + polyfills: 'apps/proj/src/polyfills.ts', + tsConfig: 'apps/proj/tsconfig.app.json', + assets: ['apps/proj/src/favicon.ico', 'apps/proj/src/assets'], + styles: ['apps/proj/src/styles.css'], + scripts: ['apps/proj/src/scripts.ts'] + }, + configurations: { + production: { + fileReplacements: [ + { + replace: 'apps/proj/src/environments/environment.ts', + with: 'apps/proj/src/environments/environment.prod.ts' + } + ], + budgets: [ + { + maximumError: '5mb', + maximumWarning: '2mb', + type: 'initial' + } + ], + optimization: true, + outputHashing: 'all', + sourceMap: false, + extractCss: true, + namedChunks: false, + aot: true, + extractLicenses: true, + vendorChunk: false, + buildOptimizer: true + } + } + }); + expect(updatedAngularCLIJson.projects.proj.architect.serve).toEqual({ + builder: '@angular-devkit/build-angular:dev-server', + options: { + browserTarget: 'proj:build' + }, + configurations: { + production: { + browserTarget: 'proj:build:production' + } + } + }); - // Remove package.json - runCommand('mv package.json package.json.bak'); - try { - runCLI('add @nrwl/workspace --npmScope projscope --skip-install'); - fail('Did not handle not having a package.json'); - } catch (e) { - expect(e.stderr.toString()).toContain( - 'Your workspace could not be converted into an Nx Workspace because of the above error.' + expect(updatedAngularCLIJson.projects.proj.architect.test).toEqual({ + builder: '@angular-devkit/build-angular:karma', + options: { + main: 'apps/proj/src/test.ts', + polyfills: 'apps/proj/src/polyfills.ts', + tsConfig: 'apps/proj/tsconfig.spec.json', + karmaConfig: 'apps/proj/karma.conf.js', + styles: ['apps/proj/src/styles.css'], + scripts: ['apps/proj/src/scripts.ts'], + assets: ['apps/proj/src/favicon.ico', 'apps/proj/src/assets'] + } + }); + + expect(updatedAngularCLIJson.projects.proj.architect.lint).toEqual({ + builder: '@angular-devkit/build-angular:tslint', + options: { + tsConfig: [ + 'apps/proj/tsconfig.app.json', + 'apps/proj/tsconfig.spec.json' + ], + exclude: ['**/node_modules/**'] + } + }); + + expect(updatedAngularCLIJson.projects['proj-e2e'].root).toEqual( + 'apps/proj-e2e' + ); + expect(updatedAngularCLIJson.projects['proj-e2e'].architect.e2e).toEqual({ + builder: '@angular-devkit/build-angular:protractor', + configurations: { + production: { + devServerTarget: 'proj:serve:production' + } + }, + options: { + protractorConfig: 'apps/proj-e2e/protractor.conf.js', + devServerTarget: 'proj:serve' + } + }); + expect(updatedAngularCLIJson.projects['proj-e2e'].architect.lint).toEqual( + { + builder: '@angular-devkit/build-angular:tslint', + options: { + tsConfig: 'apps/proj-e2e/tsconfig.json', + exclude: ['**/node_modules/**'] + } + } ); - } - // Put package.json back - runCommand('mv package.json.bak package.json'); + const updatedTslint = readJson('tslint.json'); + expect(updatedTslint.rules['nx-enforce-module-boundaries']).toEqual([ + true, + { + allow: [], + depConstraints: [{ sourceTag: '*', onlyDependOnLibsWithTags: ['*'] }] + } + ]); - // Remove src - runCommand('mv src src-bak'); - try { - runCLI('add @nrwl/workspace --npmScope projscope --skip-install'); - fail('Did not handle not having a src directory'); - } catch (e) { - expect(e.stderr.toString()).toContain('Path: src does not exist'); - } + runCLI('build --prod --outputHashing none'); + checkFilesExist('dist/apps/proj/main-es2015.js'); + }); - // Put src back - runCommand('mv src-bak src'); + it('should generate a workspace and not change dependencies, devDependencies, or vscode extensions if they already exist', () => { + // create a new AngularCLI app + runNew(); + const nxVersion = '0.0.0'; + const schematicsVersion = '0.0.0'; + const ngrxVersion = '0.0.0'; + // update package.json + const existingPackageJson = readJson('package.json'); + existingPackageJson.devDependencies[ + '@nrwl/workspace' + ] = schematicsVersion; + existingPackageJson.dependencies['@ngrx/store'] = ngrxVersion; + existingPackageJson.dependencies['@ngrx/effects'] = ngrxVersion; + existingPackageJson.dependencies['@ngrx/router-store'] = ngrxVersion; + existingPackageJson.devDependencies['@ngrx/store-devtools'] = ngrxVersion; + updateFile('package.json', JSON.stringify(existingPackageJson, null, 2)); + + updateFile( + '.vscode/extensions.json', + JSON.stringify({ + recommendations: ['eamodio.gitlens', 'angular.ng-template'] + }) + ); + // run the command + runNgAdd('add @nrwl/workspace --npmScope projscope --skip-install'); + + // check that dependencies and devDependencies remained the same + const packageJson = readJson('package.json'); + expect(packageJson.devDependencies['@nrwl/workspace']).toEqual( + schematicsVersion + ); + expect(packageJson.dependencies['@ngrx/store']).toEqual(ngrxVersion); + expect(packageJson.dependencies['@ngrx/effects']).toEqual(ngrxVersion); + expect(packageJson.dependencies['@ngrx/router-store']).toEqual( + ngrxVersion + ); + expect(packageJson.devDependencies['@ngrx/store-devtools']).toEqual( + ngrxVersion + ); + + expect(readJson('.vscode/extensions.json').recommendations).toEqual([ + 'eamodio.gitlens', + 'angular.ng-template', + 'nrwl.angular-console', + 'ms-vscode.vscode-typescript-tslint-plugin', + 'esbenp.prettier-vscode' + ]); + }); + + it('should convert a project with common libraries in the ecosystem', () => { + // create a new AngularCLI app + runNew(); + + // Add some Angular libraries + runNgAdd('add @angular/elements'); + runNgAdd('add @angular/material'); + runNgAdd('add @angular/pwa'); + runNgAdd('add @ngrx/store'); + runNgAdd('add @ngrx/effects'); + + // Add Nx + runNgAdd('add @nrwl/workspace --skip-install'); + }); + + it('should handle different types of errors', () => { + // create a new AngularCLI app + runNew(); + + // Only remove e2e directory + runCommand('mv e2e e2e-bak'); + try { + runNgAdd('add @nrwl/workspace --npmScope projscope --skip-install'); + fail('Did not handle not having a e2e directory'); + } catch (e) { + expect(e.stderr.toString()).toContain( + 'Your workspace could not be converted into an Nx Workspace because of the above error.' + ); + } + + // Put e2e back + runCommand('mv e2e-bak e2e'); + + // Remove package.json + runCommand('mv package.json package.json.bak'); + try { + runNgAdd('add @nrwl/workspace --npmScope projscope --skip-install'); + fail('Did not handle not having a package.json'); + } catch (e) { + expect(e.stderr.toString()).toContain( + 'Your workspace could not be converted into an Nx Workspace because of the above error.' + ); + } + + // Put package.json back + runCommand('mv package.json.bak package.json'); + + // Remove src + runCommand('mv src src-bak'); + try { + runNgAdd('add @nrwl/workspace --npmScope projscope --skip-install'); + fail('Did not handle not having a src directory'); + } catch (e) { + expect(e.stderr.toString()).toContain('Path: src does not exist'); + } + + // Put src back + runCommand('mv src-bak src'); + }); + }); +}); + +forEachCli('nx', () => { + describe('ng-add', () => { + it('is not supported', () => {}); }); }); diff --git a/e2e/ng-new.test.ts b/e2e/ng-new.test.ts deleted file mode 100644 index 384008dd7f..0000000000 --- a/e2e/ng-new.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { - ensureProject, - exists, - expectTestsPass, - getSize, - runCLI, - runCLIAsync, - runsInWSL, - uniq, - updateFile -} from './utils'; -import { toClassName } from '@nrwl/workspace'; - -describe('Nrwl Workspace', () => { - beforeEach(() => { - ensureProject(); - }); - - it('should work', async () => { - const myapp = uniq('myapp'); - const mylib = uniq('mylib'); - runCLI( - `generate @nrwl/angular:app ${myapp} --directory=myDir --no-interactive` - ); - runCLI( - `generate @nrwl/angular:lib ${mylib} --directory=myDir --no-interactive` - ); - - updateFile( - `apps/my-dir/${myapp}/src/app/app.module.ts`, - ` - import { NgModule } from '@angular/core'; - import { BrowserModule } from '@angular/platform-browser'; - import { MyDir${toClassName( - mylib - )}Module } from '@proj/my-dir/${mylib}'; - import { AppComponent } from './app.component'; - - @NgModule({ - imports: [BrowserModule, MyDir${toClassName(mylib)}Module], - declarations: [AppComponent], - bootstrap: [AppComponent] - }) - export class AppModule {} - ` - ); - runCLI(`build --prod --project=my-dir-${myapp} --output-hashing none`); - expect( - exists(`./tmp/proj/dist/apps/my-dir/${myapp}/main-es2015.js`) - ).toEqual(true); - expect(exists(`./tmp/proj/dist/apps/my-dir/${myapp}/main-es5.js`)).toEqual( - true - ); - - // This is a loose requirement because there are a lot of - // influences external from this project that affect this. - const es2015BundleSize = getSize( - `./tmp/proj/dist/apps/my-dir/${myapp}/main-es2015.js` - ); - console.log( - `The current es2015 bundle size is ${es2015BundleSize / 1000} KB` - ); - expect(es2015BundleSize).toBeLessThanOrEqual(150000); - - const es5BundleSize = getSize( - `./tmp/proj/dist/apps/my-dir/${myapp}/main-es5.js` - ); - console.log(`The current es5 bundle size is ${es5BundleSize / 1000} KB`); - expect(es5BundleSize).toBeLessThanOrEqual(175000); - - // running tests for the app - expectTestsPass( - await runCLIAsync(`test --project=my-dir-${myapp} --no-watch`) - ); - - // running tests for the lib - expectTestsPass( - await runCLIAsync(`test --project=my-dir-${mylib} --no-watch`) - ); - - if (!runsInWSL()) { - expect( - runCLI(`e2e --project=my-dir-${myapp}-e2e --headless --watch=false`) - ).toContain('All specs passed!'); - } - }, 1000000); - - it('should support router config generation (lazy)', async () => { - const myapp = uniq('myapp'); - const mylib = uniq('mylib'); - runCLI(`generate @nrwl/angular:app ${myapp} --directory=myDir --routing`); - runCLI( - `generate @nrwl/angular:lib ${mylib} --directory=myDir --routing --lazy --parentModule=apps/my-dir/${myapp}/src/app/app.module.ts` - ); - - runCLI(`build --aot --project=my-dir-${myapp}`); - expectTestsPass( - await runCLIAsync(`test --project=my-dir-${myapp} --no-watch`) - ); - }, 1000000); - - it('should support router config generation (eager)', async () => { - const myapp = uniq('myapp'); - runCLI(`generate @nrwl/angular:app ${myapp} --directory=myDir --routing`); - const mylib = uniq('mylib'); - runCLI( - `generate @nrwl/angular:lib ${mylib} --directory=myDir --routing --parentModule=apps/my-dir/${myapp}/src/app/app.module.ts` - ); - - runCLI(`build --aot --project=my-dir-${myapp}`); - expectTestsPass( - await runCLIAsync(`test --project=my-dir-${myapp} --no-watch`) - ); - }, 1000000); -}); diff --git a/e2e/ngrx.test.ts b/e2e/ngrx.test.ts index 5d75163b6d..22778b5f93 100644 --- a/e2e/ngrx.test.ts +++ b/e2e/ngrx.test.ts @@ -4,67 +4,74 @@ import { runCLIAsync, uniq, ensureProject, - readJson + readJson, + forEachCli } from './utils'; -describe('ngrx', () => { - it('should work', async () => { - ensureProject(); +forEachCli(() => { + describe('ngrx', () => { + it('should work', async () => { + ensureProject(); - const myapp = uniq('myapp'); - runCLI(`generate @nrwl/angular:app ${myapp} --no-interactive`); + const myapp = uniq('myapp'); + runCLI(`generate @nrwl/angular:app ${myapp} --no-interactive`); - // Generate root ngrx state management - runCLI( - `generate @nrwl/angular:ngrx users --module=apps/${myapp}/src/app/app.module.ts --root` - ); - const packageJson = readJson('package.json'); - expect(packageJson.dependencies['@ngrx/store']).toBeDefined(); - expect(packageJson.dependencies['@ngrx/effects']).toBeDefined(); - expect(packageJson.dependencies['@ngrx/router-store']).toBeDefined(); - expect(packageJson.devDependencies['@ngrx/store-devtools']).toBeDefined(); + // Generate root ngrx state management + runCLI( + `generate @nrwl/angular:ngrx users --module=apps/${myapp}/src/app/app.module.ts --root` + ); + const packageJson = readJson('package.json'); + expect(packageJson.dependencies['@ngrx/store']).toBeDefined(); + expect(packageJson.dependencies['@ngrx/effects']).toBeDefined(); + expect(packageJson.dependencies['@ngrx/router-store']).toBeDefined(); + expect(packageJson.devDependencies['@ngrx/store-devtools']).toBeDefined(); - const mylib = uniq('mylib'); - // Generate feature library and ngrx state within that library - runCLI(`g @nrwl/angular:lib ${mylib} --prefix=fl`); - runCLI( - `generate @nrwl/angular:ngrx flights --module=libs/${mylib}/src/lib/${mylib}.module.ts --facade` - ); + const mylib = uniq('mylib'); + // Generate feature library and ngrx state within that library + runCLI(`g @nrwl/angular:lib ${mylib} --prefix=fl`); + runCLI( + `generate @nrwl/angular:ngrx flights --module=libs/${mylib}/src/lib/${mylib}.module.ts --facade` + ); - expect(runCLI(`build ${myapp}`)).toContain('chunk {main} main-es2015.js,'); - expect(runCLI(`build ${myapp}`)).toContain('chunk {main} main-es5.js,'); - expectTestsPass(await runCLIAsync(`test ${myapp} --no-watch`)); - expectTestsPass(await runCLIAsync(`test ${mylib} --no-watch`)); - }, 1000000); + expect(runCLI(`build ${myapp}`)).toContain( + 'chunk {main} main-es2015.js,' + ); + expect(runCLI(`build ${myapp}`)).toContain('chunk {main} main-es5.js,'); + expectTestsPass(await runCLIAsync(`test ${myapp} --no-watch`)); + expectTestsPass(await runCLIAsync(`test ${mylib} --no-watch`)); + }, 1000000); - it('should work with creators', async () => { - ensureProject(); + it('should work with creators', async () => { + ensureProject(); - const myapp = uniq('myapp'); - runCLI(`generate @nrwl/angular:app ${myapp} --routing --no-interactive`); + const myapp = uniq('myapp'); + runCLI(`generate @nrwl/angular:app ${myapp} --routing --no-interactive`); - // Generate root ngrx state management - runCLI( - `generate @nrwl/angular:ngrx users --module=apps/${myapp}/src/app/app.module.ts --root --minimal --syntax=creators` - ); - const packageJson = readJson('package.json'); - expect(packageJson.dependencies['@ngrx/entity']).toBeDefined(); - expect(packageJson.dependencies['@ngrx/store']).toBeDefined(); - expect(packageJson.dependencies['@ngrx/effects']).toBeDefined(); - expect(packageJson.dependencies['@ngrx/router-store']).toBeDefined(); - expect(packageJson.devDependencies['@ngrx/schematics']).toBeDefined(); - expect(packageJson.devDependencies['@ngrx/store-devtools']).toBeDefined(); + // Generate root ngrx state management + runCLI( + `generate @nrwl/angular:ngrx users --module=apps/${myapp}/src/app/app.module.ts --root --minimal --syntax=creators` + ); + const packageJson = readJson('package.json'); + expect(packageJson.dependencies['@ngrx/entity']).toBeDefined(); + expect(packageJson.dependencies['@ngrx/store']).toBeDefined(); + expect(packageJson.dependencies['@ngrx/effects']).toBeDefined(); + expect(packageJson.dependencies['@ngrx/router-store']).toBeDefined(); + expect(packageJson.devDependencies['@ngrx/schematics']).toBeDefined(); + expect(packageJson.devDependencies['@ngrx/store-devtools']).toBeDefined(); - const mylib = uniq('mylib'); - // Generate feature library and ngrx state within that library - runCLI(`g @nrwl/angular:lib ${mylib} --prefix=fl`); - runCLI( - `generate @nrwl/angular:ngrx flights --module=libs/${mylib}/src/lib/${mylib}.module.ts --facade --syntax=creators` - ); + const mylib = uniq('mylib'); + // Generate feature library and ngrx state within that library + runCLI(`g @nrwl/angular:lib ${mylib} --prefix=fl`); + runCLI( + `generate @nrwl/angular:ngrx flights --module=libs/${mylib}/src/lib/${mylib}.module.ts --facade --syntax=creators` + ); - expect(runCLI(`build ${myapp}`)).toContain('chunk {main} main-es2015.js,'); - expect(runCLI(`build ${myapp}`)).toContain('chunk {main} main-es5.js,'); - expectTestsPass(await runCLIAsync(`test ${myapp} --no-watch`)); - expectTestsPass(await runCLIAsync(`test ${mylib} --no-watch`)); - }, 1000000); + expect(runCLI(`build ${myapp}`)).toContain( + 'chunk {main} main-es2015.js,' + ); + expect(runCLI(`build ${myapp}`)).toContain('chunk {main} main-es5.js,'); + expectTestsPass(await runCLIAsync(`test ${myapp} --no-watch`)); + expectTestsPass(await runCLIAsync(`test ${mylib} --no-watch`)); + }, 1000000); + }); }); diff --git a/e2e/node.test.ts b/e2e/node.test.ts index 07a5073206..6153b06fe7 100644 --- a/e2e/node.test.ts +++ b/e2e/node.test.ts @@ -9,7 +9,11 @@ import { runCLI, runCLIAsync, uniq, - updateFile + updateFile, + forEachCli, + checkFilesExist, + tmpProjPath, + workspaceConfigName } from './utils'; function getData(): Promise { @@ -27,168 +31,167 @@ function getData(): Promise { }); } -describe('Node Applications', () => { - fit('should be able to generate an express application', async done => { - ensureProject(); - const nodeapp = uniq('nodeapp'); - runCLI(`generate @nrwl/express:app ${nodeapp}`); +forEachCli(() => { + describe('Node Applications', () => { + it('should be able to generate an express application', async done => { + ensureProject(); + const nodeapp = uniq('nodeapp'); + runCLI(`generate @nrwl/express:app ${nodeapp}`); - updateFile( - `apps/${nodeapp}/src/app/test.spec.ts`, - ` + updateFile( + `apps/${nodeapp}/src/app/test.spec.ts`, + ` describe('test', () => { it('should work', () => { expect(true).toEqual(true); }) }) ` - ); + ); - updateFile(`apps/${nodeapp}/src/assets/file.txt`, ``); - const jestResult = await runCLIAsync(`test ${nodeapp}`); - expect(jestResult.stderr).toContain('Test Suites: 1 passed, 1 total'); - await runCLIAsync(`build ${nodeapp}`); + updateFile(`apps/${nodeapp}/src/assets/file.txt`, ``); + const jestResult = await runCLIAsync(`test ${nodeapp}`); + expect(jestResult.stderr).toContain('Test Suites: 1 passed, 1 total'); + await runCLIAsync(`build ${nodeapp}`); - expect(exists(`./tmp/proj/dist/apps/${nodeapp}/main.js`)).toBeTruthy(); - expect( - exists(`./tmp/proj/dist/apps/${nodeapp}/assets/file.txt`) - ).toBeTruthy(); - expect(exists(`./tmp/proj/dist/apps/${nodeapp}/main.js.map`)).toBeTruthy(); - const server = fork( - path.join(__dirname, '../../tmp/proj', `./dist/apps/${nodeapp}/main.js`), - [], - { - cwd: './tmp/proj', + checkFilesExist( + `dist/apps/${nodeapp}/main.js`, + `dist/apps/${nodeapp}/assets/file.txt`, + `dist/apps/${nodeapp}/main.js.map` + ); + + const server = fork(`./dist/apps/${nodeapp}/main.js`, [], { + cwd: tmpProjPath(), silent: true - } - ); - expect(server).toBeTruthy(); - await new Promise(resolve => { - server.stdout.once('data', async data => { - expect(data.toString()).toContain('Listening at http://localhost:3333'); - const result = await getData(); - - expect(result.message).toEqual(`Welcome to ${nodeapp}!`); - treeKill(server.pid, 'SIGTERM', err => { - expect(err).toBeFalsy(); - resolve(); - }); }); - }); - const config = readJson('angular.json'); - config.projects[nodeapp].architect.waitAndPrint = { - builder: '@nrwl/workspace:run-commands', - options: { - commands: [ - { - command: 'sleep 1 && echo DONE' - } - ], - readyWhen: 'DONE' - } - }; - config.projects[nodeapp].architect.serve.options.waitUntilTargets = [ - `${nodeapp}:waitAndPrint` - ]; - updateFile('angular.json', JSON.stringify(config)); - const process = spawn( - 'node', - ['./node_modules/.bin/ng', 'serve', nodeapp], - { - cwd: './tmp/proj' - } - ); - let collectedOutput = ''; - process.stdout.on('data', async (data: Buffer) => { - collectedOutput += data.toString(); - if (!data.toString().includes('Listening at http://localhost:3333')) { - return; - } - - const result = await getData(); - expect(result.message).toEqual(`Welcome to ${nodeapp}!`); - treeKill(process.pid, 'SIGTERM', err => { - expect(collectedOutput.startsWith('DONE')).toBeTruthy(); - expect(err).toBeFalsy(); - done(); - }); - }); - }, 30000); - - it('should be able to generate a nest application', async done => { - ensureProject(); - const nestapp = uniq('nestapp'); - runCLI(`generate @nrwl/nest:app ${nestapp}`); - - updateFile(`apps/${nestapp}/src/assets/file.txt`, ``); - const jestResult = await runCLIAsync(`test ${nestapp}`); - expect(jestResult.stderr).toContain('Test Suites: 2 passed, 2 total'); - - await runCLIAsync(`build ${nestapp}`); - - expect(exists(`./tmp/proj/dist/apps/${nestapp}/main.js`)).toBeTruthy(); - expect( - exists(`./tmp/proj/dist/apps/${nestapp}/assets/file.txt`) - ).toBeTruthy(); - expect(exists(`./tmp/proj/dist/apps/${nestapp}/main.js.map`)).toBeTruthy(); - - const server = fork( - path.join(__dirname, '../../tmp/proj', `./dist/apps/${nestapp}/main.js`), - [], - { - cwd: './tmp/proj', - silent: true - } - ); - expect(server).toBeTruthy(); - - await new Promise(resolve => { - server.stdout.on('data', async data => { - const message = data.toString(); - if (message.includes('Listening at http://localhost:3333')) { + expect(server).toBeTruthy(); + await new Promise(resolve => { + server.stdout.once('data', async data => { + expect(data.toString()).toContain( + 'Listening at http://localhost:3333' + ); const result = await getData(); - expect(result.message).toEqual(`Welcome to ${nestapp}!`); + expect(result.message).toEqual(`Welcome to ${nodeapp}!`); treeKill(server.pid, 'SIGTERM', err => { expect(err).toBeFalsy(); resolve(); }); + }); + }); + const config = readJson(workspaceConfigName()); + config.projects[nodeapp].architect.waitAndPrint = { + builder: '@nrwl/workspace:run-commands', + options: { + commands: [ + { + command: 'sleep 1 && echo DONE' + } + ], + readyWhen: 'DONE' } + }; + + config.projects[nodeapp].architect.serve.options.waitUntilTargets = [ + `${nodeapp}:waitAndPrint` + ]; + updateFile(workspaceConfigName(), JSON.stringify(config)); + const process = spawn( + 'node', + ['./node_modules/.bin/nx', 'serve', nodeapp], + { + cwd: tmpProjPath() + } + ); + let collectedOutput = ''; + process.stdout.on('data', async (data: Buffer) => { + collectedOutput += data.toString(); + if (!data.toString().includes('Listening at http://localhost:3333')) { + return; + } + + const result = await getData(); + expect(result.message).toEqual(`Welcome to ${nodeapp}!`); + treeKill(process.pid, 'SIGTERM', err => { + expect(collectedOutput.startsWith('DONE')).toBeTruthy(); + expect(err).toBeFalsy(); + done(); + }); }); - }); + }, 30000); - const process = spawn( - 'node', - ['./node_modules/.bin/ng', 'serve', nestapp], - { - cwd: './tmp/proj' - } - ); + it('should be able to generate a nest application', async done => { + ensureProject(); + const nestapp = uniq('nestapp'); + runCLI(`generate @nrwl/nest:app ${nestapp}`); - process.stdout.on('data', async (data: Buffer) => { - if (!data.toString().includes('Listening at http://localhost:3333')) { - return; - } - const result = await getData(); - expect(result.message).toEqual(`Welcome to ${nestapp}!`); - treeKill(process.pid, 'SIGTERM', err => { - expect(err).toBeFalsy(); - done(); + updateFile(`apps/${nestapp}/src/assets/file.txt`, ``); + const jestResult = await runCLIAsync(`test ${nestapp}`); + expect(jestResult.stderr).toContain('Test Suites: 2 passed, 2 total'); + + await runCLIAsync(`build ${nestapp}`); + + checkFilesExist( + `dist/apps/${nestapp}/main.js`, + `dist/apps/${nestapp}/assets/file.txt`, + `dist/apps/${nestapp}/main.js.map` + ); + + const server = fork(`./dist/apps/${nestapp}/main.js`, [], { + cwd: tmpProjPath(), + silent: true }); - }); - }, 30000); + expect(server).toBeTruthy(); - it('should be able to generate an empty application', async () => { - ensureProject(); - const nodeapp = uniq('nodeapp'); + await new Promise(resolve => { + server.stdout.on('data', async data => { + const message = data.toString(); + if (message.includes('Listening at http://localhost:3333')) { + const result = await getData(); - runCLI(`generate @nrwl/node:app ${nodeapp}`); - updateFile(`apps/${nodeapp}/src/main.ts`, `console.log('Hello World!');`); - await runCLIAsync(`build ${nodeapp}`); - expect(exists(`./tmp/proj/dist/apps/${nodeapp}/main.js`)).toBeTruthy(); - const result = execSync(`node dist/apps/${nodeapp}/main.js`, { - cwd: './tmp/proj' - }).toString(); - expect(result).toContain('Hello World!'); - }, 30000); + expect(result.message).toEqual(`Welcome to ${nestapp}!`); + treeKill(server.pid, 'SIGTERM', err => { + expect(err).toBeFalsy(); + resolve(); + }); + } + }); + }); + + const process = spawn( + 'node', + ['./node_modules/.bin/nx', 'serve', nestapp], + { + cwd: tmpProjPath() + } + ); + + process.stdout.on('data', async (data: Buffer) => { + if (!data.toString().includes('Listening at http://localhost:3333')) { + return; + } + const result = await getData(); + expect(result.message).toEqual(`Welcome to ${nestapp}!`); + treeKill(process.pid, 'SIGTERM', err => { + expect(err).toBeFalsy(); + done(); + }); + }); + }, 30000); + + it('should be able to generate an empty application', async () => { + ensureProject(); + const nodeapp = uniq('nodeapp'); + + runCLI(`generate @nrwl/node:app ${nodeapp}`); + updateFile(`apps/${nodeapp}/src/main.ts`, `console.log('Hello World!');`); + await runCLIAsync(`build ${nodeapp}`); + + checkFilesExist(`dist/apps/${nodeapp}/main.js`); + const result = execSync(`node dist/apps/${nodeapp}/main.js`, { + cwd: tmpProjPath() + }).toString(); + expect(result).toContain('Hello World!'); + }, 30000); + }); }); diff --git a/e2e/react.test.ts b/e2e/react.test.ts index 569fb2e0fa..5b1655ae2d 100644 --- a/e2e/react.test.ts +++ b/e2e/react.test.ts @@ -7,120 +7,131 @@ import { runCLIAsync, checkFilesExist, renameFile, - readJson + readJson, + forEachCli, + supportUi, + workspaceConfigName } from './utils'; import { serializeJson } from '@nrwl/workspace'; -describe('React Applications', () => { - it('should be able to generate a react app + lib', async () => { - ensureProject(); - const appName = uniq('app'); - const libName = uniq('lib'); +forEachCli(() => { + describe('React Applications', () => { + it('should be able to generate a react app + lib', async () => { + ensureProject(); + const appName = uniq('app'); + const libName = uniq('lib'); - runCLI(`generate @nrwl/react:app ${appName} --no-interactive`); - runCLI(`generate @nrwl/react:lib ${libName} --no-interactive`); + runCLI(`generate @nrwl/react:app ${appName} --no-interactive`); + runCLI(`generate @nrwl/react:lib ${libName} --no-interactive`); - const mainPath = `apps/${appName}/src/main.tsx`; - updateFile( - `apps/${appName}/src/app/app.css`, - `body { + const mainPath = `apps/${appName}/src/main.tsx`; + updateFile( + `apps/${appName}/src/app/app.css`, + `body { display: block; }` - ); - updateFile(mainPath, `import '@proj/${libName}';\n` + readFile(mainPath)); + ); + updateFile(mainPath, `import '@proj/${libName}';\n` + readFile(mainPath)); - const libTestResults = await runCLIAsync(`test ${libName}`); - expect(libTestResults.stderr).toContain('Test Suites: 1 passed, 1 total'); + const libTestResults = await runCLIAsync(`test ${libName}`); + expect(libTestResults.stderr).toContain('Test Suites: 1 passed, 1 total'); - await testGeneratedApp(appName); - }, 120000); + await testGeneratedApp(appName); + }, 120000); - it('should generate app with routing', async () => { - ensureProject(); - const appName = uniq('app'); + it('should generate app with routing', async () => { + ensureProject(); + const appName = uniq('app'); - runCLI(`generate @nrwl/react:app ${appName} --routing --no-interactive`); + runCLI(`generate @nrwl/react:app ${appName} --routing --no-interactive`); - await testGeneratedApp(appName); - }, 120000); + await testGeneratedApp(appName); + }, 120000); - it('should be able to use JSX', async () => { - ensureProject(); - const appName = uniq('app'); - const libName = uniq('lib'); + it('should be able to use JSX', async () => { + ensureProject(); + const appName = uniq('app'); + const libName = uniq('lib'); - runCLI(`generate @nrwl/react:app ${appName} --no-interactive`); - runCLI(`generate @nrwl/react:lib ${libName} --no-interactive`); + runCLI(`generate @nrwl/react:app ${appName} --no-interactive`); + runCLI(`generate @nrwl/react:lib ${libName} --no-interactive`); - renameFile(`apps/${appName}/src/main.tsx`, `apps/${appName}/src/main.jsx`); - renameFile( - `apps/${appName}/src/app/app.tsx`, - `apps/${appName}/src/app/app.jsx` - ); - renameFile( - `apps/${appName}/src/app/app.spec.tsx`, - `apps/${appName}/src/app/app.spec.jsx` - ); - renameFile( - `apps/${appName}/src/polyfills.ts`, - `apps/${appName}/src/polyfills.js` - ); - const angularJson = readJson('angular.json'); + renameFile( + `apps/${appName}/src/main.tsx`, + `apps/${appName}/src/main.jsx` + ); + renameFile( + `apps/${appName}/src/app/app.tsx`, + `apps/${appName}/src/app/app.jsx` + ); + renameFile( + `apps/${appName}/src/app/app.spec.tsx`, + `apps/${appName}/src/app/app.spec.jsx` + ); + renameFile( + `apps/${appName}/src/polyfills.ts`, + `apps/${appName}/src/polyfills.js` + ); + const angularJson = readJson(workspaceConfigName()); - angularJson.projects[ - appName - ].architect.build.options.main = `apps/${appName}/src/main.jsx`; - angularJson.projects[ - appName - ].architect.build.options.polyfills = `apps/${appName}/src/polyfills.js`; - updateFile('angular.json', serializeJson(angularJson)); + angularJson.projects[ + appName + ].architect.build.options.main = `apps/${appName}/src/main.jsx`; + angularJson.projects[ + appName + ].architect.build.options.polyfills = `apps/${appName}/src/polyfills.js`; + updateFile(workspaceConfigName(), serializeJson(angularJson)); - const mainPath = `apps/${appName}/src/main.jsx`; - updateFile(mainPath, `import '@proj/${libName}';\n` + readFile(mainPath)); + const mainPath = `apps/${appName}/src/main.jsx`; + updateFile(mainPath, `import '@proj/${libName}';\n` + readFile(mainPath)); - await testGeneratedApp(appName); - }, 30000); + await testGeneratedApp(appName); + }, 30000); - async function testGeneratedApp(appName) { - const lintResults = runCLI(`lint ${appName}`); - expect(lintResults).toContain('All files pass linting.'); + async function testGeneratedApp(appName) { + const lintResults = runCLI(`lint ${appName}`); + expect(lintResults).toContain('All files pass linting.'); - runCLI(`build ${appName}`); - checkFilesExist( - `dist/apps/${appName}/index.html`, - `dist/apps/${appName}/polyfills-es2015.js`, - `dist/apps/${appName}/runtime-es2015.js`, - `dist/apps/${appName}/vendor-es2015.js`, - `dist/apps/${appName}/main-es2015.js`, - `dist/apps/${appName}/styles-es2015.js`, - `dist/apps/${appName}/polyfills-es5.js`, - `dist/apps/${appName}/runtime-es5.js`, - `dist/apps/${appName}/vendor-es5.js`, - `dist/apps/${appName}/main-es5.js`, - `dist/apps/${appName}/styles-es5.js` - ); - expect(readFile(`dist/apps/${appName}/main-es5.js`)).toContain( - 'var App = function () {' - ); - expect(readFile(`dist/apps/${appName}/main-es2015.js`)).toContain( - 'const App = () => {' - ); - runCLI(`build ${appName} --prod --output-hashing none`); - checkFilesExist( - `dist/apps/${appName}/index.html`, - `dist/apps/${appName}/polyfills-es2015.js`, - `dist/apps/${appName}/runtime-es2015.js`, - `dist/apps/${appName}/main-es2015.js`, - `dist/apps/${appName}/polyfills-es5.js`, - `dist/apps/${appName}/runtime-es5.js`, - `dist/apps/${appName}/main-es5.js`, - `dist/apps/${appName}/styles.css` - ); - const testResults = await runCLIAsync(`test ${appName}`); - expect(testResults.stderr).toContain('Test Suites: 1 passed, 1 total'); - const lintE2eResults = runCLI(`lint ${appName}-e2e`); - expect(lintE2eResults).toContain('All files pass linting.'); - const e2eResults = runCLI(`e2e ${appName}-e2e`); - expect(e2eResults).toContain('All specs passed!'); - } + runCLI(`build ${appName}`); + checkFilesExist( + `dist/apps/${appName}/index.html`, + `dist/apps/${appName}/polyfills-es2015.js`, + `dist/apps/${appName}/runtime-es2015.js`, + `dist/apps/${appName}/vendor-es2015.js`, + `dist/apps/${appName}/main-es2015.js`, + `dist/apps/${appName}/styles-es2015.js`, + `dist/apps/${appName}/polyfills-es5.js`, + `dist/apps/${appName}/runtime-es5.js`, + `dist/apps/${appName}/vendor-es5.js`, + `dist/apps/${appName}/main-es5.js`, + `dist/apps/${appName}/styles-es5.js` + ); + expect(readFile(`dist/apps/${appName}/main-es5.js`)).toContain( + 'var App = function () {' + ); + expect(readFile(`dist/apps/${appName}/main-es2015.js`)).toContain( + 'const App = () => {' + ); + runCLI(`build ${appName} --prod --output-hashing none`); + checkFilesExist( + `dist/apps/${appName}/index.html`, + `dist/apps/${appName}/polyfills-es2015.js`, + `dist/apps/${appName}/runtime-es2015.js`, + `dist/apps/${appName}/main-es2015.js`, + `dist/apps/${appName}/polyfills-es5.js`, + `dist/apps/${appName}/runtime-es5.js`, + `dist/apps/${appName}/main-es5.js`, + `dist/apps/${appName}/styles.css` + ); + const testResults = await runCLIAsync(`test ${appName}`); + expect(testResults.stderr).toContain('Test Suites: 1 passed, 1 total'); + const lintE2eResults = runCLI(`lint ${appName}-e2e`); + expect(lintE2eResults).toContain('All files pass linting.'); + + if (supportUi()) { + const e2eResults = runCLI(`e2e ${appName}-e2e`); + expect(e2eResults).toContain('All specs passed!'); + } + } + }); }); diff --git a/e2e/upgrade-module.test.ts b/e2e/upgrade-module.test.ts index 93dd65f2d7..2dc3c53a1b 100644 --- a/e2e/upgrade-module.test.ts +++ b/e2e/upgrade-module.test.ts @@ -1,43 +1,47 @@ import { ensureProject, - patchKarmaToWorkOnWSL, runCLI, uniq, - updateFile + updateFile, + forEachCli, + supportUi } from './utils'; -describe('Upgrade', () => { - it('should generate an UpgradeModule setup', async () => { - ensureProject(); - const myapp = uniq('myapp'); - runCLI(`generate @nrwl/angular:app ${myapp} --unit-test-runner=karma`); - patchKarmaToWorkOnWSL(); +forEachCli(() => { + xdescribe('Upgrade', () => { + it('should generate an UpgradeModule setup', async () => { + ensureProject(); + const myapp = uniq('myapp'); + runCLI(`generate @nrwl/angular:app ${myapp} --unit-test-runner=karma`); - updateFile( - `apps/${myapp}/src/legacy.js`, - ` + updateFile( + `apps/${myapp}/src/legacy.js`, + ` const angular = window.angular.module('legacy', []); angular.component('proj-root-legacy', { template: 'Expected Value' }); ` - ); + ); - updateFile( - `apps/${myapp}/src/app/app.component.html`, - ` + updateFile( + `apps/${myapp}/src/app/app.component.html`, + ` EXPECTED [] ` - ); + ); - updateFile(`apps/${myapp}/src/app/app.component.spec.ts`, ``); + updateFile(`apps/${myapp}/src/app/app.component.spec.ts`, ``); - runCLI( - 'generate @nrwl/angular:upgrade-module legacy --angularJsImport=./legacy ' + - `--angularJsCmpSelector=proj-root-legacy --project=${myapp}` - ); + runCLI( + 'generate @nrwl/angular:upgrade-module legacy --angularJsImport=./legacy ' + + `--angularJsCmpSelector=proj-root-legacy --project=${myapp}` + ); - runCLI(`build ${myapp}`); - expect(runCLI(`test ${myapp} --no-watch`)).toContain('1 SUCCESS'); - }, 1000000); + runCLI(`build ${myapp}`); + if (supportUi()) { + expect(runCLI(`test ${myapp} --no-watch`)).toContain('1 SUCCESS'); + } + }, 1000000); + }); }); diff --git a/e2e/utils.ts b/e2e/utils.ts index ef187f2e17..333498a94f 100644 --- a/e2e/utils.ts +++ b/e2e/utils.ts @@ -3,57 +3,107 @@ import { readFileSync, statSync, writeFileSync, renameSync } from 'fs'; import { ensureDirSync } from 'fs-extra'; import * as path from 'path'; -const projectName: string = 'proj'; +export let cli; export function uniq(prefix: string) { return `${prefix}${Math.floor(Math.random() * 10000000)}`; } -function patchPackageJsonDeps() { - const p = readFileSync('./tmp/proj/package.json').toString(); +export function forEachCli( + selectedCliOrFunction: string | Function, + callback?: Function +) { + let clis; + if (process.env.SELECTED_CLI && selectedCliOrFunction && callback) { + if (selectedCliOrFunction == process.env.SELECTED_CLI) { + clis = [process.env.SELECTED_CLI]; + } else { + clis = []; + } + } else if (process.env.SELECTED_CLI) { + clis = [process.env.SELECTED_CLI]; + } else { + clis = callback ? [selectedCliOrFunction] : ['nx', 'angular']; + } + + const cb: any = callback ? callback : selectedCliOrFunction; + clis.forEach(c => { + describe(`[${c}]`, () => { + beforeEach(() => { + cli = c; + }); + cb(); + }); + }); +} + +export function workspaceConfigName() { + return cli === 'angular' ? 'angular.json' : 'workspace.json'; +} + +function patchPackageJsonDeps(addWorkspace = true) { + const p = JSON.parse(readFileSync(tmpProjPath('package.json')).toString()); const workspacePath = path.join(getCwd(), 'build', 'packages', 'workspace'); const angularPath = path.join(getCwd(), 'build', 'packages', 'angular'); - writeFileSync( - './tmp/proj/package.json', - p - .replace( - '"@nrwl/workspace": "*"', - `"@nrwl/workspace": "file:${workspacePath}"` - ) - .replace('"@nrwl/angular": "*"', `"@nrwl/angular": "file:${angularPath}"`) - ); + const reactPath = path.join(getCwd(), 'build', 'packages', 'react'); + + if (addWorkspace) { + p.devDependencies['@nrwl/workspace'] = `file:${workspacePath}`; + } + p.devDependencies['@nrwl/angular'] = `file:${angularPath}`; + p.devDependencies['@nrwl/react'] = `file:${reactPath}`; + writeFileSync(tmpProjPath('package.json'), JSON.stringify(p, null, 2)); } function runYarnInstall(silent: boolean = true) { const install = execSync('yarn install', { - cwd: './tmp/proj', + cwd: tmpProjPath(), ...(silent ? { stdio: ['ignore', 'ignore', 'ignore'] } : {}) }); return install ? install.toString() : ''; } -export function runNgNew(command?: string, silent?: boolean): string { - const gen = execSync( - `../node_modules/.bin/ng new proj --no-interactive --skip-install ${command || - ''}`, - { - cwd: `./tmp`, - ...(silent ? { stdio: ['ignore', 'ignore', 'ignore'] } : {}) - } - ); - patchPackageJsonDeps(); - const install = runYarnInstall(silent); +export function runNew( + command?: string, + silent?: boolean, + addWorkspace = true +): string { + let gen; + if (cli === 'angular') { + gen = execSync( + `../../node_modules/.bin/ng new proj --no-interactive --skip-install ${command || + ''}`, + { + cwd: `./tmp/${cli}`, + ...(silent ? { stdio: ['ignore', 'ignore', 'ignore'] } : {}) + } + ); + } else { + gen = execSync( + `node ../../node_modules/@nrwl/tao/index.js new proj --no-interactive --skip-install ${command || + ''}`, + { + cwd: `./tmp/${cli}`, + ...(silent && false ? { stdio: ['ignore', 'ignore', 'ignore'] } : {}) + } + ); + } + + patchPackageJsonDeps(addWorkspace); + const install = runYarnInstall(silent && false); return silent ? null : `${gen ? gen.toString() : ''}${install}`; } export function newProject(): void { cleanup(); - if (!directoryExists('./tmp/proj_backup')) { - runNgNew('--collection=@nrwl/workspace --npmScope=proj', true); + if (!directoryExists(tmpBackupProjPath())) { + runNew('--collection=@nrwl/workspace --npmScope=proj', true); copyMissingPackages(); writeFileSync( - './tmp/proj/node_modules/@angular-devkit/schematics/tasks/node-package/executor.js', + tmpProjPath( + 'node_modules/@angular-devkit/schematics/tasks/node-package/executor.js' + ), ` "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); @@ -67,45 +117,28 @@ function default_1(factoryOptions = {}) { } exports.default = default_1;` ); - runCLI('add @nrwl/jest'); - runCLI('add @nrwl/cypress'); - runCLI('add @nrwl/web'); - runCLI('add @nrwl/react'); - runCLI('add @nrwl/angular'); - runCLI('add @nrwl/node'); - runCLI('add @nrwl/express'); - runCLI('add @nrwl/nest'); - execSync('mv ./tmp/proj ./tmp/proj_backup'); + + execSync(`mv ${tmpProjPath()} ${tmpBackupProjPath()}`); } - execSync('cp -a ./tmp/proj_backup ./tmp/proj'); + execSync(`cp -a ${tmpBackupProjPath()} ${tmpProjPath()}`); } export function ensureProject(): void { - if (!directoryExists('./tmp/proj')) { + if (!directoryExists(tmpProjPath())) { newProject(); } } -export function runsInWSL() { - return !!process.env['WINDOWSTMP']; -} - -export function patchKarmaToWorkOnWSL(): void { +export function supportUi() { + // powershell => wsl => no ui for now try { - const karma = readFile('karma.conf.js'); - if (process.env['WINDOWSTMP']) { - updateFile( - 'karma.conf.js', - karma.replace( - `const { constants } = require('karma');`, - ` - const { constants } = require('karma'); - process.env['TMPDIR']="${process.env['WINDOWSTMP']}"; - ` - ) - ); - } - } catch (e) {} + execSync(`powershell.exe echo 1`, { + stdio: ['ignore', 'ignore', 'ignore'] + }); + return false; + } catch (e) { + return true; + } } export function copyMissingPackages(): void { @@ -150,7 +183,7 @@ export function copyMissingPackages(): void { 'document-register-element' ]; - modulesToCopy.forEach(m => copyNodeModule(projectName, m)); + modulesToCopy.forEach(m => copyNodeModule(m)); updateFile( 'node_modules/@angular-devkit/schematics/tasks/node-package/executor.js', ` @@ -167,17 +200,18 @@ export function copyMissingPackages(): void { ` ); - execSync('rm -rf tmp/proj/node_modules/.bin/webpack'); + execSync(`rm -rf ${tmpProjPath('node_modules/.bin/webpack')}`); execSync( - `cp -a node_modules/.bin/webpack tmp/proj/node_modules/.bin/webpack` + `cp -a node_modules/.bin/webpack ${tmpProjPath( + 'node_modules/.bin/webpack' + )}` ); - execSync(`rm -rf ./tmp/proj/node_modules/cypress/node_modules/@types`); - execSync(`rm -rf ./tmp/proj/@types/sinon-chai/node_modules/@types`); + execSync(`rm -rf ${tmpProjPath('node_modules/cypress/node_modules/@types')}`); } -function copyNodeModule(path: string, name: string) { - execSync(`rm -rf tmp/${path}/node_modules/${name}`); - execSync(`cp -a node_modules/${name} tmp/${path}/node_modules/${name}`); +function copyNodeModule(name: string) { + execSync(`rm -rf ${tmpProjPath('node_modules/' + name)}`); + execSync(`cp -a node_modules/${name} ${tmpProjPath('node_modules/' + name)}`); } export function runCommandAsync( @@ -190,7 +224,7 @@ export function runCommandAsync( exec( command, { - cwd: `./tmp/proj` + cwd: tmpProjPath() }, (err, stdout, stderr) => { if (!opts.silenceError && err) { @@ -208,7 +242,35 @@ export function runCLIAsync( silenceError: false } ): Promise<{ stdout: string; stderr: string }> { - return runCommandAsync(`./node_modules/.bin/ng ${command}`, opts); + return runCommandAsync( + `node ./node_modules/@nrwl/cli/bin/nx.js ${command}`, + opts + ); +} + +export function runNgAdd( + command?: string, + opts = { + silenceError: false + } +): string { + try { + return execSync(`./node_modules/.bin/ng ${command}`, { + cwd: tmpProjPath() + }) + .toString() + .replace( + /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, + '' + ); + } catch (e) { + if (opts.silenceError) { + return e.stdout.toString(); + } else { + console.log(e.stdout.toString(), e.stderr.toString()); + throw e; + } + } } export function runCLI( @@ -218,8 +280,8 @@ export function runCLI( } ): string { try { - return execSync(`./node_modules/.bin/ng ${command}`, { - cwd: `./tmp/${projectName}` + return execSync(`node ./node_modules/@nrwl/cli/bin/nx.js ${command}`, { + cwd: tmpProjPath() }) .toString() .replace( @@ -244,7 +306,7 @@ export function expectTestsPass(v: { stdout: string; stderr: string }) { export function runCommand(command: string): string { try { return execSync(command, { - cwd: `./tmp/${projectName}`, + cwd: tmpProjPath(), stdio: ['pipe', 'pipe', 'pipe'] }).toString(); } catch (e) { @@ -253,23 +315,18 @@ export function runCommand(command: string): string { } export function updateFile(f: string, content: string): void { - ensureDirSync(path.dirname(path.join(getCwd(), 'tmp', 'proj', f))); - writeFileSync(path.join(getCwd(), 'tmp', 'proj', f), content); + ensureDirSync(path.dirname(tmpProjPath(f))); + writeFileSync(tmpProjPath(f), content); } export function renameFile(f: string, newPath: string): void { - ensureDirSync(path.dirname(path.join(getCwd(), 'tmp', 'proj', newPath))); - renameSync( - path.join(getCwd(), 'tmp', 'proj', f), - path.join(getCwd(), 'tmp', 'proj', newPath) - ); + ensureDirSync(path.dirname(tmpProjPath(newPath))); + renameSync(tmpProjPath(f), tmpProjPath(newPath)); } export function checkFilesExist(...expectedFiles: string[]) { expectedFiles.forEach(f => { - const ff = f.startsWith('/') - ? f - : path.join(getCwd(), 'tmp', projectName, f); + const ff = f.startsWith('/') ? f : tmpProjPath(f); if (!exists(ff)) { throw new Error(`File '${ff}' does not exist`); } @@ -281,12 +338,12 @@ export function readJson(f: string): any { } export function readFile(f: string) { - const ff = f.startsWith('/') ? f : path.join(getCwd(), 'tmp', projectName, f); + const ff = f.startsWith('/') ? f : tmpProjPath(f); return readFileSync(ff).toString(); } export function cleanup() { - execSync('rm -rf ./tmp/proj'); + execSync(`rm -rf ${tmpProjPath()}`); } export function getCwd(): string { @@ -316,3 +373,11 @@ export function exists(filePath: string): boolean { export function getSize(filePath: string): number { return statSync(filePath).size; } + +export function tmpProjPath(path?: string) { + return path ? `./tmp/${cli}/proj/${path}` : `./tmp/${cli}/proj`; +} + +function tmpBackupProjPath(path?: string) { + return path ? `./tmp/${cli}/proj-backup/${path}` : `./tmp/${cli}/proj-backup`; +} diff --git a/e2e/web.test.ts b/e2e/web.test.ts index 21f10ab4f0..748d4277cc 100644 --- a/e2e/web.test.ts +++ b/e2e/web.test.ts @@ -4,53 +4,57 @@ import { readFile, runCLI, runCLIAsync, - uniq + uniq, + forEachCli, + supportUi } from './utils'; -describe('Web Components Applications', () => { - it('should be able to generate a web app', async () => { - ensureProject(); - const appName = uniq('app'); +forEachCli(() => { + describe('Web Components Applications', () => { + it('should be able to generate a web app', async () => { + ensureProject(); + const appName = uniq('app'); - runCLI(`generate @nrwl/web:app ${appName} --no-interactive`); + runCLI(`generate @nrwl/web:app ${appName} --no-interactive`); - const lintResults = runCLI(`lint ${appName}`); - expect(lintResults).toContain('All files pass linting.'); + const lintResults = runCLI(`lint ${appName}`); + expect(lintResults).toContain('All files pass linting.'); - runCLI(`build ${appName}`); - checkFilesExist( - `dist/apps/${appName}/index.html`, - `dist/apps/${appName}/polyfills-es2015.js`, - `dist/apps/${appName}/runtime-es2015.js`, - `dist/apps/${appName}/main-es2015.js`, - `dist/apps/${appName}/styles-es2015.js`, - `dist/apps/${appName}/polyfills-es5.js`, - `dist/apps/${appName}/runtime-es5.js`, - `dist/apps/${appName}/main-es5.js`, - `dist/apps/${appName}/styles-es5.js` - ); - expect(readFile(`dist/apps/${appName}/main-es5.js`)).toContain( - 'var AppElement = /** @class */ (function (_super) {' - ); - expect(readFile(`dist/apps/${appName}/main-es2015.js`)).toContain( - 'class AppElement' - ); - runCLI(`build ${appName} --prod --output-hashing none`); - checkFilesExist( - `dist/apps/${appName}/index.html`, - `dist/apps/${appName}/polyfills-es2015.js`, - `dist/apps/${appName}/runtime-es2015.js`, - `dist/apps/${appName}/main-es2015.js`, - `dist/apps/${appName}/polyfills-es5.js`, - `dist/apps/${appName}/runtime-es5.js`, - `dist/apps/${appName}/main-es5.js`, - `dist/apps/${appName}/styles.css` - ); - const testResults = await runCLIAsync(`test ${appName}`); - expect(testResults.stderr).toContain('Test Suites: 1 passed, 1 total'); - const lintE2eResults = runCLI(`lint ${appName}-e2e`); - expect(lintE2eResults).toContain('All files pass linting.'); - const e2eResults = runCLI(`e2e ${appName}-e2e`); - expect(e2eResults).toContain('All specs passed!'); - }, 120000); + runCLI(`build ${appName}`); + checkFilesExist( + `dist/apps/${appName}/index.html`, + `dist/apps/${appName}/polyfills-es2015.js`, + `dist/apps/${appName}/runtime-es2015.js`, + `dist/apps/${appName}/main-es2015.js`, + `dist/apps/${appName}/styles-es2015.js`, + `dist/apps/${appName}/polyfills-es5.js`, + `dist/apps/${appName}/runtime-es5.js`, + `dist/apps/${appName}/main-es5.js`, + `dist/apps/${appName}/styles-es5.js` + ); + expect(readFile(`dist/apps/${appName}/main-es5.js`)).toContain( + 'var AppElement = /** @class */ (function (_super) {' + ); + expect(readFile(`dist/apps/${appName}/main-es2015.js`)).toContain( + 'class AppElement' + ); + runCLI(`build ${appName} --prod --output-hashing none`); + checkFilesExist( + `dist/apps/${appName}/index.html`, + `dist/apps/${appName}/polyfills-es2015.js`, + `dist/apps/${appName}/runtime-es2015.js`, + `dist/apps/${appName}/main-es2015.js`, + `dist/apps/${appName}/polyfills-es5.js`, + `dist/apps/${appName}/runtime-es5.js`, + `dist/apps/${appName}/main-es5.js`, + `dist/apps/${appName}/styles.css` + ); + const testResults = await runCLIAsync(`test ${appName}`); + expect(testResults.stderr).toContain('Test Suites: 1 passed, 1 total'); + const lintE2eResults = runCLI(`lint ${appName}-e2e`); + expect(lintE2eResults).toContain('All files pass linting.'); + const e2eResults = runCLI(`e2e ${appName}-e2e`); + expect(e2eResults).toContain('All specs passed!'); + }, 120000); + }); }); diff --git a/package.json b/package.json index 273f047ebf..27af2e06b4 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@ngrx/schematics": "8.1.0", "@ngrx/store": "8.1.0", "@ngrx/store-devtools": "8.1.0", - "@schematics/angular": "8.0.0", + "@schematics/angular": "8.1.1", "@testing-library/react": "8.0.5", "@types/express": "4.16.0", "@types/jasmine": "~2.8.6", @@ -94,7 +94,7 @@ "karma-jasmine-html-reporter": "^0.2.2", "karma-webpack": "2.0.4", "license-webpack-plugin": "^1.4.0", - "ng-packagr": "5.1.0", + "ng-packagr": "5.3.0", "ngrx-store-freeze": "0.2.4", "npm-run-all": "^4.1.5", "opn": "^5.3.0", diff --git a/packages/angular/src/schematics/application/application.spec.ts b/packages/angular/src/schematics/application/application.spec.ts index 0ca0ce1595..4d97023715 100644 --- a/packages/angular/src/schematics/application/application.spec.ts +++ b/packages/angular/src/schematics/application/application.spec.ts @@ -13,27 +13,27 @@ describe('app', () => { }); describe('not nested', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic('app', { name: 'myApp' }, appTree); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-app'].root).toEqual('apps/my-app'); - expect(angularJson.projects['my-app-e2e'].root).toEqual( + expect(workspaceJson.projects['my-app'].root).toEqual('apps/my-app'); + expect(workspaceJson.projects['my-app-e2e'].root).toEqual( 'apps/my-app-e2e' ); expect( - angularJson.projects['my-app'].architect.lint.options.exclude + workspaceJson.projects['my-app'].architect.lint.options.exclude ).toEqual(['**/node_modules/**', '!apps/my-app/**']); expect( - angularJson.projects['my-app-e2e'].architect.lint.options.exclude + workspaceJson.projects['my-app-e2e'].architect.lint.options.exclude ).toEqual(['**/node_modules/**', '!apps/my-app-e2e/**']); }); it('should remove the e2e target on the application', async () => { const tree = await runSchematic('app', { name: 'myApp' }, appTree); - const angularJson = readJsonInTree(tree, '/angular.json'); - expect(angularJson.projects['my-app'].architect.e2e).not.toBeDefined(); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); + expect(workspaceJson.projects['my-app'].architect.e2e).not.toBeDefined(); }); it('should update nx.json', async () => { @@ -107,8 +107,10 @@ describe('app', () => { let appE2eSpec = noPrefix .read('apps/my-app-e2e/src/app.e2e-spec.ts') .toString(); - let angularJson = JSON.parse(noPrefix.read('angular.json').toString()); - let myAppPrefix = angularJson.projects['my-app'].prefix; + let workspaceJson = JSON.parse( + noPrefix.read('workspace.json').toString() + ); + let myAppPrefix = workspaceJson.projects['my-app'].prefix; expect(myAppPrefix).toEqual('proj'); expect(appE2eSpec).toContain('Welcome to my-app!'); @@ -118,8 +120,8 @@ describe('app', () => { appE2eSpec = withPrefix .read('apps/my-app-e2e/src/app.e2e-spec.ts') .toString(); - angularJson = JSON.parse(withPrefix.read('angular.json').toString()); - myAppPrefix = angularJson.projects['my-app'].prefix; + workspaceJson = JSON.parse(withPrefix.read('workspace.json').toString()); + myAppPrefix = workspaceJson.projects['my-app'].prefix; expect(myAppPrefix).toEqual('custom'); expect(appE2eSpec).toContain('Welcome to my-app!'); @@ -127,7 +129,7 @@ describe('app', () => { xit('should work if the new project root is changed', async () => { appTree = await callRule( - updateJsonInTree('/angular.json', json => ({ + updateJsonInTree('/workspace.json', json => ({ ...json, newProjectRoot: 'newProjectRoot' })), @@ -141,26 +143,27 @@ describe('app', () => { }); describe('nested', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic( 'app', { name: 'myApp', directory: 'myDir' }, appTree ); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-dir-my-app'].root).toEqual( + expect(workspaceJson.projects['my-dir-my-app'].root).toEqual( 'apps/my-dir/my-app' ); - expect(angularJson.projects['my-dir-my-app-e2e'].root).toEqual( + expect(workspaceJson.projects['my-dir-my-app-e2e'].root).toEqual( 'apps/my-dir/my-app-e2e' ); expect( - angularJson.projects['my-dir-my-app'].architect.lint.options.exclude + workspaceJson.projects['my-dir-my-app'].architect.lint.options.exclude ).toEqual(['**/node_modules/**', '!apps/my-dir/my-app/**']); expect( - angularJson.projects['my-dir-my-app-e2e'].architect.lint.options.exclude + workspaceJson.projects['my-dir-my-app-e2e'].architect.lint.options + .exclude ).toEqual(['**/node_modules/**', '!apps/my-dir/my-app-e2e/**']); }); @@ -314,9 +317,9 @@ describe('app', () => { { name: 'myApp', style: 'scss' }, appTree ); - const angularJson = readJsonInTree(result, 'angular.json'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); - expect(angularJson.projects['my-app'].schematics).toEqual({ + expect(workspaceJson.projects['my-app'].schematics).toEqual({ '@nrwl/workspace:component': { style: 'scss' } @@ -334,12 +337,12 @@ describe('app', () => { expect(tree.exists('apps/my-app/tsconfig.spec.json')).toBeTruthy(); expect(tree.exists('apps/my-app/karma.conf.js')).toBeTruthy(); - const angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['my-app'].architect.test.builder).toEqual( + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['my-app'].architect.test.builder).toEqual( '@angular-devkit/build-angular:karma' ); expect( - angularJson.projects['my-app'].architect.lint.options.tsConfig + workspaceJson.projects['my-app'].architect.lint.options.tsConfig ).toEqual([ 'apps/my-app/tsconfig.app.json', 'apps/my-app/tsconfig.spec.json' @@ -367,26 +370,28 @@ describe('app', () => { 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 angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['my-app'].architect.test).toBeUndefined(); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['my-app'].architect.test).toBeUndefined(); expect( - angularJson.projects['my-app'].architect.lint.options.tsConfig + workspaceJson.projects['my-app'].architect.lint.options.tsConfig ).toEqual(['apps/my-app/tsconfig.app.json']); }); }); describe('--e2e-test-runner', () => { describe('protractor', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic( 'app', { name: 'myApp', e2eTestRunner: 'protractor' }, appTree ); expect(tree.exists('apps/my-app-e2e')).toBeFalsy(); - const angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['my-app'].architect.e2e).not.toBeDefined(); - expect(angularJson.projects['my-app-e2e']).toEqual({ + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect( + workspaceJson.projects['my-app'].architect.e2e + ).not.toBeDefined(); + expect(workspaceJson.projects['my-app-e2e']).toEqual({ root: 'apps/my-app-e2e', projectType: 'application', architect: { @@ -422,30 +427,30 @@ describe('app', () => { appTree ); expect(tree.exists('apps/my-app-e2e')).toBeFalsy(); - const angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['my-app-e2e']).toBeUndefined(); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['my-app-e2e']).toBeUndefined(); }); }); }); describe('replaceAppNameWithPath', () => { - it('should protect `angular.json` commands and properties', async () => { + it('should protect `workspace.json` commands and properties', async () => { const tree = await runSchematic('app', { name: 'ui' }, appTree); - const angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['ui']).toBeDefined(); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['ui']).toBeDefined(); expect( - angularJson.projects['ui']['architect']['build']['builder'] + workspaceJson.projects['ui']['architect']['build']['builder'] ).toEqual('@angular-devkit/build-angular:browser'); }); - it('should protect `angular.json` sensible properties value to be renamed', async () => { + it('should protect `workspace.json` sensible properties value to be renamed', async () => { const tree = await runSchematic( 'app', { name: 'ui', prefix: 'ui' }, appTree ); - const angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['ui'].prefix).toEqual('ui'); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['ui'].prefix).toEqual('ui'); }); }); }); diff --git a/packages/angular/src/schematics/application/application.ts b/packages/angular/src/schematics/application/application.ts index 6da754e4c4..e893cbe06a 100644 --- a/packages/angular/src/schematics/application/application.ts +++ b/packages/angular/src/schematics/application/application.ts @@ -15,7 +15,6 @@ import { import { Schema } from './schema'; import * as ts from 'typescript'; import { - angularSchematicNames, formatFiles, getNpmScope, getWorkspacePath, @@ -26,7 +25,8 @@ import { replaceNodeValue, toFileName, updateJsonInTree, - updateWorkspace + updateWorkspace, + addGlobalLint } from '@nrwl/workspace'; import { join, normalize } from '@angular-devkit/core'; import ngAdd from '../ng-add/ng-add'; @@ -202,6 +202,16 @@ function updateProject(options: NormalizedSchema): Rule { options.appProjectRoot ); + const angularSchematicNames = [ + 'class', + 'component', + 'directive', + 'guard', + 'module', + 'pipe', + 'service' + ]; + if (fixedProject.schematics) { angularSchematicNames.forEach(type => { const schematic = `@schematics/angular:${type}`; @@ -345,13 +355,13 @@ export default function(schema: Schema): Rule { // Determine the roots where @schematics/angular will place the projects // This is not where the projects actually end up - const angularJson = readJsonInTree(host, getWorkspacePath(host)); + const workspaceJson = readJsonInTree(host, getWorkspacePath(host)); - const appProjectRoot = angularJson.newProjectRoot - ? `${angularJson.newProjectRoot}/${options.name}` + const appProjectRoot = workspaceJson.newProjectRoot + ? `${workspaceJson.newProjectRoot}/${options.name}` : options.name; - const e2eProjectRoot = angularJson.newProjectRoot - ? `${angularJson.newProjectRoot}/${options.e2eProjectName}` + const e2eProjectRoot = workspaceJson.newProjectRoot + ? `${workspaceJson.newProjectRoot}/${options.e2eProjectName}` : `${options.name}/e2e`; return chain([ @@ -359,6 +369,7 @@ export default function(schema: Schema): Rule { ...options, skipFormat: true }), + addGlobalLint('tslint'), externalSchematic('@schematics/angular', 'application', { name: options.name, inlineStyle: options.inlineStyle, @@ -373,11 +384,9 @@ export default function(schema: Schema): Rule { skipPackageJson: false }), addTsconfigs(options), - options.e2eTestRunner === 'protractor' ? move(e2eProjectRoot, options.e2eProjectRoot) : removeE2e(options, e2eProjectRoot), - options.e2eTestRunner === 'protractor' ? updateE2eProject(options) : noop(), @@ -388,10 +397,8 @@ export default function(schema: Schema): Rule { project: options.name }) : noop(), - move(appProjectRoot, options.appProjectRoot), updateProject(options), - updateComponentTemplate(options), options.routing ? addRouterRootConfiguration(options) : noop(), updateLinting(options), diff --git a/packages/angular/src/schematics/karma-project/karma-project.spec.ts b/packages/angular/src/schematics/karma-project/karma-project.spec.ts index 29610e8724..b3e65243e4 100644 --- a/packages/angular/src/schematics/karma-project/karma-project.spec.ts +++ b/packages/angular/src/schematics/karma-project/karma-project.spec.ts @@ -81,7 +81,7 @@ module.exports = function(config) { }); describe('library', () => { - it('should alter angular.json', async () => { + it('should alter workspace.json', async () => { const resultTree = await runSchematic( 'karma-project', { @@ -89,8 +89,8 @@ module.exports = function(config) { }, appTree ); - const angularJson = readJsonInTree(resultTree, 'angular.json'); - expect(angularJson.projects.lib1.architect.test).toEqual({ + const workspaceJson = readJsonInTree(resultTree, 'workspace.json'); + expect(workspaceJson.projects.lib1.architect.test).toEqual({ builder: '@angular-devkit/build-angular:karma', options: { main: 'libs/lib1/src/test.ts', @@ -99,7 +99,7 @@ module.exports = function(config) { } }); expect( - angularJson.projects.lib1.architect.lint.options.tsConfig + workspaceJson.projects.lib1.architect.lint.options.tsConfig ).toContain('libs/lib1/tsconfig.spec.json'); }); @@ -141,7 +141,7 @@ module.exports = function(config) { }); describe('applications', () => { - it('should alter angular.json', async () => { + it('should alter workspace.json', async () => { const resultTree = await runSchematic( 'karma-project', { @@ -149,8 +149,8 @@ module.exports = function(config) { }, appTree ); - const angularJson = readJsonInTree(resultTree, 'angular.json'); - expect(angularJson.projects.app1.architect.test).toEqual({ + const workspaceJson = readJsonInTree(resultTree, 'workspace.json'); + expect(workspaceJson.projects.app1.architect.test).toEqual({ builder: '@angular-devkit/build-angular:karma', options: { main: 'apps/app1/src/test.ts', @@ -163,7 +163,7 @@ module.exports = function(config) { } }); expect( - angularJson.projects.app1.architect.lint.options.tsConfig + workspaceJson.projects.app1.architect.lint.options.tsConfig ).toContain('apps/app1/tsconfig.spec.json'); }); diff --git a/packages/angular/src/schematics/karma-project/karma-project.ts b/packages/angular/src/schematics/karma-project/karma-project.ts index 35d6c6c236..63e4401dcb 100644 --- a/packages/angular/src/schematics/karma-project/karma-project.ts +++ b/packages/angular/src/schematics/karma-project/karma-project.ts @@ -13,7 +13,8 @@ import { import { readJsonInTree, updateJsonInTree, - offsetFromRoot + offsetFromRoot, + updateWorkspaceInTree } from '@nrwl/workspace'; import { join, normalize } from '@angular-devkit/core'; import { getProjectConfig } from '@nrwl/workspace'; @@ -76,8 +77,8 @@ function updateTsSpecConfig(options: KarmaProjectSchema): Rule { }; } -function updateAngularJson(options: KarmaProjectSchema): Rule { - return updateJsonInTree('angular.json', json => { +function updateworkspaceJson(options: KarmaProjectSchema): Rule { + return updateWorkspaceInTree(json => { const projectConfig = json.projects[options.project]; projectConfig.architect.test = { builder: '@angular-devkit/build-angular:karma', @@ -124,6 +125,6 @@ export default function(options: KarmaProjectSchema): Rule { generateFiles(options), updateTsConfig(options), updateTsSpecConfig(options), - updateAngularJson(options) + updateworkspaceJson(options) ]); } diff --git a/packages/angular/src/schematics/library/files/lib/README.md b/packages/angular/src/schematics/library/files/lib/README.md index 3bb17a0ee5..b72e16d5b1 100644 --- a/packages/angular/src/schematics/library/files/lib/README.md +++ b/packages/angular/src/schematics/library/files/lib/README.md @@ -5,5 +5,5 @@ This library was generated with [Nx](https://nx.dev). ## Running unit tests -Run `ng test <%= name %>` to execute the unit tests. +Run `nx test <%= name %>` to execute the unit tests. <% } %> diff --git a/packages/angular/src/schematics/library/library.spec.ts b/packages/angular/src/schematics/library/library.spec.ts index fc866e611e..97ab5be0ec 100644 --- a/packages/angular/src/schematics/library/library.spec.ts +++ b/packages/angular/src/schematics/library/library.spec.ts @@ -79,37 +79,39 @@ describe('lib', () => { expect(packageJson.name).toEqual('@proj/my-lib'); }); - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic( 'lib', { name: 'myLib', framework: 'angular', publishable: true }, appTree ); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-lib'].root).toEqual('libs/my-lib'); - expect(angularJson.projects['my-lib'].architect.build).toBeDefined(); + expect(workspaceJson.projects['my-lib'].root).toEqual('libs/my-lib'); + expect(workspaceJson.projects['my-lib'].architect.build).toBeDefined(); expect( - angularJson.projects['my-lib'].architect.lint.options.tsConfig + workspaceJson.projects['my-lib'].architect.lint.options.tsConfig ).toEqual([ 'libs/my-lib/tsconfig.lib.json', 'libs/my-lib/tsconfig.spec.json' ]); expect( - angularJson.projects['my-lib'].architect.lint.options.exclude + workspaceJson.projects['my-lib'].architect.lint.options.exclude ).toEqual(['**/node_modules/**', '!libs/my-lib/**']); }); - it('should remove "build" target from angular.json when a library is not publishable', async () => { + it('should remove "build" target from workspace.json when a library is not publishable', async () => { const tree = await runSchematic( 'lib', { name: 'myLib', publishable: false }, appTree ); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-lib'].root).toEqual('libs/my-lib'); - expect(angularJson.projects['my-lib'].architect.build).not.toBeDefined(); + expect(workspaceJson.projects['my-lib'].root).toEqual('libs/my-lib'); + expect( + workspaceJson.projects['my-lib'].architect.build + ).not.toBeDefined(); }); it('should update nx.json', async () => { @@ -216,8 +218,9 @@ describe('lib', () => { it('should default the prefix to npmScope', async () => { const noPrefix = await runSchematic('lib', { name: 'myLib' }, appTree); expect( - JSON.parse(noPrefix.read('angular.json').toString()).projects['my-lib'] - .prefix + JSON.parse(noPrefix.read('workspace.json').toString()).projects[ + 'my-lib' + ].prefix ).toEqual('proj'); const withPrefix = await runSchematic( @@ -226,7 +229,7 @@ describe('lib', () => { appTree ); expect( - JSON.parse(withPrefix.read('angular.json').toString()).projects[ + JSON.parse(withPrefix.read('workspace.json').toString()).projects[ 'my-lib' ].prefix ).toEqual('custom'); @@ -381,26 +384,26 @@ describe('lib', () => { expect(ngPackage.dest).toEqual('../../../dist/libs/my-dir/my-lib'); }); - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic( 'lib', { name: 'myLib', directory: 'myDir' }, appTree ); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-dir-my-lib'].root).toEqual( + expect(workspaceJson.projects['my-dir-my-lib'].root).toEqual( 'libs/my-dir/my-lib' ); expect( - angularJson.projects['my-dir-my-lib'].architect.lint.options.tsConfig + workspaceJson.projects['my-dir-my-lib'].architect.lint.options.tsConfig ).toEqual([ 'libs/my-dir/my-lib/tsconfig.lib.json', 'libs/my-dir/my-lib/tsconfig.spec.json' ]); expect( - angularJson.projects['my-dir-my-lib'].architect.lint.options.exclude + workspaceJson.projects['my-dir-my-lib'].architect.lint.options.exclude ).toEqual(['**/node_modules/**', '!libs/my-dir/my-lib/**']); }); @@ -763,9 +766,9 @@ describe('lib', () => { appTree ); - const angularJson = readJsonInTree(result, 'angular.json'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); - expect(angularJson.projects['my-lib'].schematics).toEqual({ + expect(workspaceJson.projects['my-lib'].schematics).toEqual({ '@nrwl/angular:component': { styleext: 'scss' } @@ -785,18 +788,18 @@ describe('lib', () => { expect(resultTree.exists('libs/my-lib/tsconfig.spec.json')).toBeTruthy(); expect(resultTree.exists('libs/my-lib/karma.conf.js')).toBeTruthy(); expect(resultTree.exists('karma.conf.js')).toBeTruthy(); - const angularJson = readJsonInTree(resultTree, 'angular.json'); - expect(angularJson.projects['my-lib'].architect.test.builder).toEqual( + const workspaceJson = readJsonInTree(resultTree, 'workspace.json'); + expect(workspaceJson.projects['my-lib'].architect.test.builder).toEqual( '@angular-devkit/build-angular:karma' ); expect( - angularJson.projects['my-lib'].architect.lint.options.tsConfig + workspaceJson.projects['my-lib'].architect.lint.options.tsConfig ).toEqual([ 'libs/my-lib/tsconfig.lib.json', 'libs/my-lib/tsconfig.spec.json' ]); expect( - angularJson.projects['my-lib'].architect.lint.options.exclude + workspaceJson.projects['my-lib'].architect.lint.options.exclude ).toEqual(['**/node_modules/**', '!libs/my-lib/**']); }); }); @@ -816,10 +819,10 @@ describe('lib', () => { expect(resultTree.exists('libs/my-lib/tsconfig.spec.json')).toBeFalsy(); expect(resultTree.exists('libs/my-lib/jest.config.js')).toBeFalsy(); expect(resultTree.exists('libs/my-lib/karma.conf.js')).toBeFalsy(); - const angularJson = readJsonInTree(resultTree, 'angular.json'); - expect(angularJson.projects['my-lib'].architect.test).toBeUndefined(); + const workspaceJson = readJsonInTree(resultTree, 'workspace.json'); + expect(workspaceJson.projects['my-lib'].architect.test).toBeUndefined(); expect( - angularJson.projects['my-lib'].architect.lint.options.tsConfig + workspaceJson.projects['my-lib'].architect.lint.options.tsConfig ).toEqual(['libs/my-lib/tsconfig.lib.json']); }); }); diff --git a/packages/angular/src/schematics/library/library.ts b/packages/angular/src/schematics/library/library.ts index c9ce47364e..6ca319a176 100644 --- a/packages/angular/src/schematics/library/library.ts +++ b/packages/angular/src/schematics/library/library.ts @@ -22,7 +22,8 @@ import { NxJson, updateJsonInTree, readJsonInTree, - offsetFromRoot + offsetFromRoot, + addGlobalLint } from '@nrwl/workspace'; import { addGlobal, addIncludeToTsConfig, insert } from '@nrwl/workspace'; import { toClassName, toFileName, toPropertyName } from '@nrwl/workspace'; @@ -430,6 +431,7 @@ export default function(schema: Schema): Rule { } return chain([ + addGlobalLint('tslint'), addUnitTestRunner(options), externalSchematic('@schematics/angular', 'library', { name: options.name, diff --git a/packages/angular/src/schematics/ng-add/ng-add.spec.ts b/packages/angular/src/schematics/ng-add/ng-add.spec.ts index 332d706bce..108c844e66 100644 --- a/packages/angular/src/schematics/ng-add/ng-add.spec.ts +++ b/packages/angular/src/schematics/ng-add/ng-add.spec.ts @@ -74,7 +74,7 @@ describe('ng-add', () => { }, appTree ); - const { schematics } = readJsonInTree(tree, 'angular.json'); + const { schematics } = readJsonInTree(tree, 'workspace.json'); expect(schematics['@nrwl/angular:application'].unitTestRunner).toEqual( 'karma' ); @@ -118,7 +118,7 @@ describe('ng-add', () => { }, appTree ); - const { schematics } = readJsonInTree(tree, 'angular.json'); + const { schematics } = readJsonInTree(tree, 'workspace.json'); expect(schematics['@nrwl/angular:application'].unitTestRunner).toEqual( 'jest' ); @@ -153,7 +153,7 @@ describe('ng-add', () => { }, appTree ); - const { schematics } = readJsonInTree(tree, 'angular.json'); + const { schematics } = readJsonInTree(tree, 'workspace.json'); expect(schematics['@nrwl/angular:application'].e2eTestRunner).toEqual( 'cypress' ); @@ -185,7 +185,7 @@ describe('ng-add', () => { }, appTree ); - const { schematics } = readJsonInTree(tree, 'angular.json'); + const { schematics } = readJsonInTree(tree, 'workspace.json'); expect(schematics['@nrwl/angular:application'].e2eTestRunner).toEqual( 'protractor' ); @@ -196,13 +196,13 @@ describe('ng-add', () => { describe('defaultCollection', () => { it('should be set if none was set before', async () => { const result = await runSchematic('ng-add', {}, appTree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/angular'); }); it('should be set if @nrwl/workspace was set before', async () => { appTree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/workspace' }; @@ -212,13 +212,13 @@ describe('ng-add', () => { appTree ); const result = await runSchematic('ng-add', {}, appTree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/angular'); }); it('should not be set if something else was set before', async () => { appTree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/react' }; @@ -228,8 +228,8 @@ describe('ng-add', () => { appTree ); const result = await runSchematic('ng-add', {}, appTree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/react'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/react'); }); }); }); diff --git a/packages/angular/src/utils/testing.ts b/packages/angular/src/utils/testing.ts index efbf18f424..63385af099 100644 --- a/packages/angular/src/utils/testing.ts +++ b/packages/angular/src/utils/testing.ts @@ -94,7 +94,7 @@ export function createApp( }) ); tree.overwrite( - '/angular.json', + '/workspace.json', JSON.stringify({ newProjectRoot: '', version: 1, diff --git a/packages/angular/src/utils/versions.ts b/packages/angular/src/utils/versions.ts index bd48c74396..fb3ee55442 100644 --- a/packages/angular/src/utils/versions.ts +++ b/packages/angular/src/utils/versions.ts @@ -1,6 +1,6 @@ export const nxVersion = '*'; export const angularVersion = '^8.0.0'; -export const angularDevkitVersion = '^0.800.0'; +export const angularDevkitVersion = '^0.800.1'; export const angularJsVersion = '1.6.6'; export const ngrxVersion = '8.1.0'; export const rxjsVersion = '~6.4.0'; diff --git a/packages/cli/package.json b/packages/cli/package.json index 970a3e2377..cd2c4be8b2 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -29,6 +29,7 @@ "dependencies": { "tmp": "0.0.33", "yargs-parser": "10.0.0", - "yargs": "^11.0.0" + "yargs": "^11.0.0", + "@nrwl/tao": "*" } } diff --git a/packages/create-nx-workspace/bin/create-nx-workspace.ts b/packages/create-nx-workspace/bin/create-nx-workspace.ts index 836ea3379e..7498e99bf6 100644 --- a/packages/create-nx-workspace/bin/create-nx-workspace.ts +++ b/packages/create-nx-workspace/bin/create-nx-workspace.ts @@ -4,130 +4,289 @@ import { output } from '@nrwl/workspace/src/command-line/output'; import { execSync } from 'child_process'; import { writeFileSync } from 'fs'; +import * as inquirer from 'inquirer'; import * as path from 'path'; import { dirSync } from 'tmp'; import * as yargsParser from 'yargs-parser'; +const presetOptions = [ + { + value: 'empty', + name: 'empty [an empty workspace]' + }, + { + value: 'angular', + name: 'angular [a workspace with a single Angular application]' + }, + { + value: 'react', + name: 'react [a workspace with a single React application]' + }, + { + value: 'web-components', + name: + 'web components [a workspace with a single app built using web components]' + }, + { + value: 'full-stack', + name: + 'full-stack [a workspace with a full stack application (NestJS + Angular Ivy)]' + } +]; + +const tsVersion = 'TYPESCRIPT_VERSION'; +const cliVersion = 'NX_VERSION'; +const nxVersion = 'NX_VERSION'; +const angularCliVersion = 'ANGULAR_CLI_VERSION'; + const parsedArgs = yargsParser(process.argv, { - string: ['directory'], + string: ['cli', 'preset'], boolean: ['help'] }); if (parsedArgs.help) { - console.log(` - Usage: create-nx-workspace [options] [ng new options] - - Create a new Nx workspace - - Options: - - directory path to the workspace root directory - - [ng new options] any 'ng new' options - run 'ng new --help' for more information - `); + showHelp(); process.exit(0); } - -const nxTool = { - name: 'Schematics', - packageName: '@nrwl/workspace' -}; - -let packageManager: string; -try { - packageManager = execSync('ng config -g cli.packageManager', { - stdio: ['ignore', 'pipe', 'ignore'] - }) - .toString() - .trim(); -} catch (e) { - packageManager = 'yarn'; -} -try { - execSync(`${packageManager} --version`, { - stdio: ['ignore', 'ignore', 'ignore'] +validateInput(parsedArgs); +const packageManager = determinePackageManager(); +determinePreset(parsedArgs).then(preset => { + return determineCli(preset, parsedArgs).then(cli => { + const tmpDir = createSandbox(packageManager, cli); + createApp(tmpDir, cli, parsedArgs, preset); + showNxWarning(); + showCliWarning(preset, parsedArgs); }); -} catch (e) { - packageManager = 'npm'; -} - -const projectName = parsedArgs._[2]; - -// check that the workspace name is passed in -if (!projectName) { - output.error({ - title: 'A project name is required when creating a new workspace', - bodyLines: [ - output.colors.gray('For example:'), - '', - `${output.colors.gray('>')} create-nx-workspace my-new-workspace` - ] - }); - process.exit(1); -} - -// creating the sandbox -output.logSingleLine(`Creating a sandbox...`); -const tmpDir = dirSync().name; - -const nxVersion = 'NX_VERSION'; -const cliVersion = 'ANGULAR_CLI_VERSION'; -const typescriptVersion = 'TYPESCRIPT_VERSION'; - -writeFileSync( - path.join(tmpDir, 'package.json'), - JSON.stringify({ - dependencies: { - [nxTool.packageName]: nxVersion, - '@angular/cli': cliVersion, - typescript: typescriptVersion - }, - license: 'MIT' - }) -); - -execSync(`${packageManager} install --silent`, { - cwd: tmpDir, - stdio: [0, 1, 2] }); -// creating the app itself -const args = process.argv - .slice(2) - .map(a => `"${a}"`) - .join(' '); +function showHelp() { + console.log(` + Usage: create-nx-workspace [options] [new workspace options] -output.logSingleLine( - `${output.colors.gray('Running:')} ng new ${args} --collection=${ - nxTool.packageName - }` -); + Create a new Nx workspace -execSync( - `"${path.join( - tmpDir, - 'node_modules', - '.bin', - 'ng' - )}" new ${args} --collection=${nxTool.packageName}`, - { - stdio: [0, 1, 2] + Options: + + name workspace name + + preset What to create in a new workspace (options: ${presetOptions + .map(o => '"' + o.value + '"') + .join(', ')}) + + cli CLI to power the Nx workspace (options: "nx", "angular") + + [new workspace options] any 'new workspace' options +`); +} + +function determinePackageManager() { + // If you have Angular CLI installed, read Angular CLI config. + // If it isn't not installed, default to 'yarn'. + let packageManager: string; + try { + packageManager = execSync('ng config -g cli.packageManager', { + stdio: ['ignore', 'pipe', 'ignore'], + timeout: 500 + }) + .toString() + .trim(); + } catch (e) { + packageManager = 'yarn'; } -); + try { + execSync(`${packageManager} --version`, { + stdio: ['ignore', 'ignore', 'ignore'] + }); + } catch (e) { + packageManager = 'npm'; + } + return packageManager; +} -// TODO: vsavkin: reenable for 8.4 -// try { -// execSync('nx --version'); -// } catch (e) { -// // no nx found -// console.log('-----------------------------------------------------------'); -// console.log(`It looks like you don't have the Nx CLI installed globally.`); -// console.log( -// `This means that you might have to use "yarn nx" or "npm nx" to execute commands in your workspace.` -// ); -// console.log( -// `If you want to execute the nx command directly, run "yarn global add @nrwl/cli" or "npm install -g @nrwl/cli"` -// ); -// console.log('-----------------------------------------------------------'); -// } +function validateInput(parsedArgs: any) { + const projectName = parsedArgs._[2]; + + if (!projectName) { + output.error({ + title: 'A project name is required when creating a new workspace', + bodyLines: [ + output.colors.gray('For example:'), + '', + `${output.colors.gray('>')} create-nx-workspace my-new-workspace` + ] + }); + process.exit(1); + } + + return projectName; +} + +function determinePreset(parsedArgs: any): Promise { + if (parsedArgs.preset) { + if (presetOptions.map(o => o.value).indexOf(parsedArgs.preset) === -1) { + console.error( + `Invalid preset. It must be one of the following: ${presetOptions + .map(o => '"' + o.value + '"') + .join(', ')}.` + ); + process.exit(1); + } else { + return Promise.resolve(parsedArgs.preset); + } + } else { + return inquirer + .prompt([ + { + name: 'Preset', + message: `What to create in the new workspace`, + default: 'empty', + type: 'list', + choices: presetOptions + } + ]) + .then(a => a.Preset); + } +} + +function determineCli(preset: string, parsedArgs: any) { + const angular = { + package: '@angular/cli', + version: angularCliVersion, + command: 'ng' + }; + + const nx = { + package: '@nrwl/tao', + version: cliVersion, + command: 'tao' + }; + + if (parsedArgs.cli) { + if (['nx', 'angular'].indexOf(parsedArgs.cli) === -1) { + console.error( + `Invalid cli. It must be one of the following: "nx", "angular".` + ); + process.exit(1); + } + return Promise.resolve(parsedArgs.cli === 'angular' ? angular : nx); + } + + if (preset == 'angular' || preset == 'full-stack') { + return Promise.resolve(angular); + } else if (preset === 'web-components' || preset === 'react') { + return Promise.resolve(nx); + } else { + return inquirer + .prompt([ + { + name: 'CLI', + message: `CLI to power the Nx workspace`, + default: 'nx', + type: 'list', + choices: [ + { + value: 'nx', + name: + 'Nx [Extensible CLI for JavaScript and TypeScript applications]' + }, + + { + value: 'angular', + name: 'Angular CLI [Extensible CLI for Angular applications]' + } + ] + } + ]) + .then(a => (a.CLI === 'angular' ? angular : nx)); + } +} + +function createSandbox( + packageManager: string, + cli: { package: string; version: string } +) { + console.log(`Creating a sandbox with Nx...`); + const tmpDir = dirSync().name; + writeFileSync( + path.join(tmpDir, 'package.json'), + JSON.stringify({ + dependencies: { + '@nrwl/workspace': nxVersion, + [cli.package]: cli.version, + typescript: tsVersion + }, + license: 'MIT' + }) + ); + + execSync(`${packageManager} install --silent`, { + cwd: tmpDir, + stdio: [0, 1, 2] + }); + + return tmpDir; +} + +function createApp( + tmpDir: string, + cli: { command: string }, + parsedArgs: any, + preset: string +) { + // creating the app itself + const args = process.argv + .slice(2) + .filter(a => !a.startsWith('--cli')) // not used by the new command + .map(a => `"${a}"`) + .join(' '); + + const presetArg = parsedArgs.preset ? '' : ` --preset=${preset}`; + + console.log(`new ${args}${presetArg} --collection=@nrwl/workspace`); + execSync( + `"${path.join( + tmpDir, + 'node_modules', + '.bin', + cli.command + )}" new ${args}${presetArg} --collection=@nrwl/workspace`, + { + stdio: [0, 1, 2] + } + ); +} + +function showNxWarning() { + try { + execSync('nx --version', { stdio: ['ignore', 'ignore', 'ignore'] }); + } catch (e) { + // no nx found + console.log('-----------------------------------------------------------'); + console.log(`It looks like you don't have the Nx CLI installed globally.`); + console.log( + `This means that you might have to use "yarn nx" or "npm nx" to execute commands in your workspace.` + ); + console.log( + `If you want to execute the nx command directly, run "yarn global add @nrwl/cli" or "npm install -g @nrwl/cli"` + ); + console.log('-----------------------------------------------------------'); + } +} + +function showCliWarning(preset: string, parsedArgs: any) { + if (!parsedArgs.cli) { + if (preset == 'angular' || preset == 'full-stack') { + console.log( + 'Because you selected an Angular-specific preset, we generated an Nx workspace powered by the Angular CLi.' + ); + console.log( + `If you want want to power the workspace using a different CLI, you can pass it using '--cli'. Find out more by running 'create-nx-workspace --help'.` + ); + } else if (preset === 'web-components' || preset === 'react') { + console.log('We generated an Nx workspace powered by the Nx CLi.'); + console.log( + `If you want want to power the workspace using a different CLI, you can pass it using '--cli'. Find out more by running 'create-nx-workspace --help'.` + ); + } + } +} diff --git a/packages/create-nx-workspace/package.json b/packages/create-nx-workspace/package.json index ed9d95bcd9..a89ce4a959 100644 --- a/packages/create-nx-workspace/package.json +++ b/packages/create-nx-workspace/package.json @@ -30,6 +30,7 @@ "@nrwl/workspace": "*", "tmp": "0.0.33", "yargs-parser": "10.0.0", - "yargs": "^11.0.0" + "yargs": "^11.0.0", + "inquirer": "^6.3.1" } } diff --git a/packages/cypress/src/schematics/cypress-project/cypress-project.spec.ts b/packages/cypress/src/schematics/cypress-project/cypress-project.spec.ts index d8305a1e04..9b2cb39fbd 100644 --- a/packages/cypress/src/schematics/cypress-project/cypress-project.spec.ts +++ b/packages/cypress/src/schematics/cypress-project/cypress-project.spec.ts @@ -37,21 +37,21 @@ describe('schematic:cypress-project', () => { expect(tree.exists('apps/my-app-e2e/src/support/index.ts')).toBeTruthy(); }); - it('should add update `angular.json` file', async () => { + it('should add update `workspace.json` file', async () => { const tree = await runSchematic( 'cypress-project', { name: 'my-app-e2e', project: 'my-app' }, appTree ); - const angularJson = readJsonInTree(tree, 'angular.json'); - const project = angularJson.projects['my-app-e2e']; + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + const project = workspaceJson.projects['my-app-e2e']; expect(project.root).toEqual('apps/my-app-e2e'); expect(project.architect.lint).toEqual({ builder: '@angular-devkit/build-angular:tslint', options: { - tsConfig: 'apps/my-app-e2e/tsconfig.e2e.json', + tsConfig: ['apps/my-app-e2e/tsconfig.e2e.json'], exclude: ['**/node_modules/**', '!apps/my-app-e2e/**'] } }); @@ -107,13 +107,13 @@ describe('schematic:cypress-project', () => { }); describe('nested', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic( 'cypress-project', { name: 'my-app-e2e', project: 'my-dir-my-app', directory: 'my-dir' }, appTree ); - const projectConfig = readJsonInTree(tree, 'angular.json').projects[ + const projectConfig = readJsonInTree(tree, 'workspace.json').projects[ 'my-dir-my-app-e2e' ]; @@ -121,7 +121,7 @@ describe('schematic:cypress-project', () => { expect(projectConfig.architect.lint).toEqual({ builder: '@angular-devkit/build-angular:tslint', options: { - tsConfig: 'apps/my-dir/my-app-e2e/tsconfig.e2e.json', + tsConfig: ['apps/my-dir/my-app-e2e/tsconfig.e2e.json'], exclude: ['**/node_modules/**', '!apps/my-dir/my-app-e2e/**'] } }); diff --git a/packages/cypress/src/schematics/cypress-project/cypress-project.ts b/packages/cypress/src/schematics/cypress-project/cypress-project.ts index dfaa841743..fd92a1d8ad 100644 --- a/packages/cypress/src/schematics/cypress-project/cypress-project.ts +++ b/packages/cypress/src/schematics/cypress-project/cypress-project.ts @@ -9,7 +9,13 @@ import { } from '@angular-devkit/schematics'; import { join, normalize } from '@angular-devkit/core'; // app -import { updateJsonInTree, NxJson } from '@nrwl/workspace'; +import { + updateJsonInTree, + NxJson, + updateWorkspaceInTree, + generateProjectLint, + addGlobalLint +} from '@nrwl/workspace'; import { offsetFromRoot } from '@nrwl/workspace'; import { toFileName } from '@nrwl/workspace'; import { Schema } from './schema'; @@ -44,8 +50,8 @@ function updateNxJson(options: CypressProjectSchema): Rule { }); } -function updateAngularJson(options: CypressProjectSchema): Rule { - return updateJsonInTree('angular.json', json => { +function updateWorkspaceJson(options: CypressProjectSchema): Rule { + return updateWorkspaceInTree(json => { const architect: any = {}; architect.e2e = { @@ -61,16 +67,13 @@ function updateAngularJson(options: CypressProjectSchema): Rule { } } }; - architect.lint = { - builder: '@angular-devkit/build-angular:tslint', - options: { - tsConfig: join(normalize(options.projectRoot), 'tsconfig.e2e.json'), - exclude: [ - '**/node_modules/**', - '!' + join(normalize(options.projectRoot), '**') - ] - } - }; + + architect.lint = generateProjectLint( + normalize(options.projectRoot), + join(normalize(options.projectRoot), 'tsconfig.e2e.json'), + options.linter + ); + json.projects[options.projectName] = { root: options.projectRoot, sourceRoot: join(normalize(options.projectRoot), 'src'), @@ -84,8 +87,9 @@ function updateAngularJson(options: CypressProjectSchema): Rule { export default function(options: CypressProjectSchema): Rule { options = normalizeOptions(options); return chain([ + addGlobalLint(options.linter), generateFiles(options), - updateAngularJson(options), + updateWorkspaceJson(options), updateNxJson(options) ]); } diff --git a/packages/cypress/src/schematics/cypress-project/schema.d.ts b/packages/cypress/src/schematics/cypress-project/schema.d.ts index e8c6a1a478..1670b779eb 100644 --- a/packages/cypress/src/schematics/cypress-project/schema.d.ts +++ b/packages/cypress/src/schematics/cypress-project/schema.d.ts @@ -2,4 +2,5 @@ export interface Schema { project: string; name: string; directory: string; + linter: 'eslint' | 'tslint'; } diff --git a/packages/cypress/src/schematics/cypress-project/schema.json b/packages/cypress/src/schematics/cypress-project/schema.json index 97c0782420..55133554eb 100644 --- a/packages/cypress/src/schematics/cypress-project/schema.json +++ b/packages/cypress/src/schematics/cypress-project/schema.json @@ -24,6 +24,12 @@ "type": "string", "description": "A directory where the app is placed", "x-prompt": "In which directory should the library be generated?" + }, + "linter": { + "description": "The tool to use for running lint checks.", + "type": "string", + "enum": ["eslint", "tslint"], + "default": "tslint" } }, "required": ["name"] diff --git a/packages/express/src/schematics/ng-add/ng-add.spec.ts b/packages/express/src/schematics/ng-add/ng-add.spec.ts index e311de4957..9ee3897f7e 100644 --- a/packages/express/src/schematics/ng-add/ng-add.spec.ts +++ b/packages/express/src/schematics/ng-add/ng-add.spec.ts @@ -32,13 +32,13 @@ describe('ng-add', () => { describe('defaultCollection', () => { it('should be set if none was set before', async () => { const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/express'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/express'); }); it('should be set if @nrwl/workspace was set before', async () => { tree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/workspace' }; @@ -48,13 +48,13 @@ describe('ng-add', () => { tree ); const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/express'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/express'); }); it('should not be set if something else was set before', async () => { tree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/angular' }; @@ -64,8 +64,8 @@ describe('ng-add', () => { tree ); const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/angular'); }); }); }); 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 b859c5aed1..18e2f72270 100644 --- a/packages/jest/src/schematics/jest-project/jest-project.spec.ts +++ b/packages/jest/src/schematics/jest-project/jest-project.spec.ts @@ -10,7 +10,7 @@ describe('jestProject', () => { appTree = Tree.empty(); appTree = createEmptyWorkspace(appTree); appTree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.projects.lib1 = { root: 'libs/lib1', architect: { @@ -52,7 +52,7 @@ describe('jestProject', () => { expect(resultTree.exists('/libs/lib1/tsconfig.spec.json')).toBeTruthy(); }); - it('should alter angular.json', async () => { + it('should alter workspace.json', async () => { const resultTree = await runSchematic( 'jest-project', { @@ -61,8 +61,8 @@ describe('jestProject', () => { }, appTree ); - const angularJson = readJsonInTree(resultTree, 'angular.json'); - expect(angularJson.projects.lib1.architect.test).toEqual({ + const workspaceJson = readJsonInTree(resultTree, 'workspace.json'); + expect(workspaceJson.projects.lib1.architect.test).toEqual({ builder: '@nrwl/jest:jest', options: { jestConfig: 'libs/lib1/jest.config.js', @@ -70,9 +70,9 @@ describe('jestProject', () => { tsConfig: 'libs/lib1/tsconfig.spec.json' } }); - expect(angularJson.projects.lib1.architect.lint.options.tsConfig).toContain( - 'libs/lib1/tsconfig.spec.json' - ); + expect( + workspaceJson.projects.lib1.architect.lint.options.tsConfig + ).toContain('libs/lib1/tsconfig.spec.json'); }); it('should create a jest.config.js', async () => { @@ -144,7 +144,7 @@ describe('jestProject', () => { expect(resultTree.exists('src/test-setup.ts')).toBeFalsy(); }); - it('should not list the setup file in angular.json', async () => { + it('should not list the setup file in workspace.json', async () => { const resultTree = await runSchematic( 'jest-project', { @@ -153,9 +153,9 @@ describe('jestProject', () => { }, appTree ); - const angularJson = readJsonInTree(resultTree, 'angular.json'); + const workspaceJson = readJsonInTree(resultTree, 'workspace.json'); expect( - angularJson.projects.lib1.architect.test.options.setupFile + workspaceJson.projects.lib1.architect.test.options.setupFile ).toBeUndefined(); }); @@ -189,7 +189,7 @@ describe('jestProject', () => { expect(resultTree.exists('src/test-setup.ts')).toBeFalsy(); }); - it('should not list the setup file in angular.json', async () => { + it('should not list the setup file in workspace.json', async () => { const resultTree = await runSchematic( 'jest-project', { @@ -198,9 +198,9 @@ describe('jestProject', () => { }, appTree ); - const angularJson = readJsonInTree(resultTree, 'angular.json'); + const workspaceJson = readJsonInTree(resultTree, 'workspace.json'); expect( - angularJson.projects.lib1.architect.test.options.setupFile + workspaceJson.projects.lib1.architect.test.options.setupFile ).toBeUndefined(); }); diff --git a/packages/jest/src/schematics/jest-project/jest-project.ts b/packages/jest/src/schematics/jest-project/jest-project.ts index 5c143372dc..f84aecb11b 100644 --- a/packages/jest/src/schematics/jest-project/jest-project.ts +++ b/packages/jest/src/schematics/jest-project/jest-project.ts @@ -11,7 +11,11 @@ import { noop, filter } from '@angular-devkit/schematics'; -import { readJsonInTree, updateJsonInTree } from '@nrwl/workspace'; +import { + readJsonInTree, + updateJsonInTree, + updateWorkspaceInTree +} from '@nrwl/workspace'; import { getProjectConfig, addDepsToPackageJson } from '@nrwl/workspace'; import { offsetFromRoot } from '@nrwl/workspace'; import { join, normalize } from '@angular-devkit/core'; @@ -69,8 +73,8 @@ function updateTsConfig(options: JestProjectSchema): Rule { }; } -function updateAngularJson(options: JestProjectSchema): Rule { - return updateJsonInTree('angular.json', json => { +function updateWorkspaceJson(options: JestProjectSchema): Rule { + return updateWorkspaceInTree(json => { const projectConfig = json.projects[options.project]; projectConfig.architect.test = { builder: '@nrwl/jest:jest', @@ -106,7 +110,9 @@ function check(options: JestProjectSchema): Rule { const packageJson = readJsonInTree(host, 'package.json'); if (!packageJson.devDependencies.jest) { context.logger.warn(`"jest" is not installed as a dependency.`); - context.logger.info(`Add "jest" via "ng add @nrwl/jest"`); + context.logger.info( + `Add "jest" via "yarn add --dev @nrwl/jest" or "npm install -D @nrwl/jest"` + ); } return host; }; @@ -128,6 +134,6 @@ export default function(options: JestProjectSchema): Rule { check(options), generateFiles(options), updateTsConfig(options), - updateAngularJson(options) + updateWorkspaceJson(options) ]); } diff --git a/packages/nest/src/schematics/ng-add/ng-add.spec.ts b/packages/nest/src/schematics/ng-add/ng-add.spec.ts index bb48dd8de1..01d1d1e6e4 100644 --- a/packages/nest/src/schematics/ng-add/ng-add.spec.ts +++ b/packages/nest/src/schematics/ng-add/ng-add.spec.ts @@ -23,13 +23,13 @@ describe('ng-add', () => { describe('defaultCollection', () => { it('should be set if none was set before', async () => { const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/nest'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/nest'); }); it('should be set if @nrwl/workspace was set before', async () => { tree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/workspace' }; @@ -39,13 +39,13 @@ describe('ng-add', () => { tree ); const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/nest'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/nest'); }); it('should not be set if something else was set before', async () => { tree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/angular' }; @@ -55,8 +55,8 @@ describe('ng-add', () => { tree ); const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/angular'); }); }); }); diff --git a/packages/node/src/schematics/application/application.spec.ts b/packages/node/src/schematics/application/application.spec.ts index 8fbe6a3198..d1bf4eaf57 100644 --- a/packages/node/src/schematics/application/application.spec.ts +++ b/packages/node/src/schematics/application/application.spec.ts @@ -14,10 +14,10 @@ describe('app', () => { }); describe('not nested', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic('app', { name: 'myNodeApp' }, appTree); - const angularJson = readJsonInTree(tree, '/angular.json'); - const project = angularJson.projects['my-node-app']; + const workspaceJson = readJsonInTree(tree, '/workspace.json'); + const project = workspaceJson.projects['my-node-app']; expect(project.root).toEqual('apps/my-node-app'); expect(project.architect).toEqual( jasmine.objectContaining({ @@ -52,7 +52,7 @@ describe('app', () => { } }) ); - expect(angularJson.projects['my-node-app'].architect.lint).toEqual({ + expect(workspaceJson.projects['my-node-app'].architect.lint).toEqual({ builder: '@angular-devkit/build-angular:tslint', options: { tsConfig: [ @@ -62,8 +62,8 @@ describe('app', () => { exclude: ['**/node_modules/**', '!apps/my-node-app/**'] } }); - expect(angularJson.projects['my-node-app-e2e']).toBeUndefined(); - expect(angularJson.defaultProject).toEqual('my-node-app'); + expect(workspaceJson.projects['my-node-app-e2e']).toBeUndefined(); + expect(workspaceJson.defaultProject).toEqual('my-node-app'); }); it('should update nx.json', async () => { @@ -109,33 +109,33 @@ describe('app', () => { }); describe('nested', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic( 'app', { name: 'myNodeApp', directory: 'myDir' }, appTree ); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-dir-my-node-app'].root).toEqual( + expect(workspaceJson.projects['my-dir-my-node-app'].root).toEqual( 'apps/my-dir/my-node-app' ); - expect(angularJson.projects['my-dir-my-node-app'].architect.lint).toEqual( - { - builder: '@angular-devkit/build-angular:tslint', - options: { - tsConfig: [ - 'apps/my-dir/my-node-app/tsconfig.app.json', - 'apps/my-dir/my-node-app/tsconfig.spec.json' - ], - exclude: ['**/node_modules/**', '!apps/my-dir/my-node-app/**'] - } + expect( + workspaceJson.projects['my-dir-my-node-app'].architect.lint + ).toEqual({ + builder: '@angular-devkit/build-angular:tslint', + options: { + tsConfig: [ + 'apps/my-dir/my-node-app/tsconfig.app.json', + 'apps/my-dir/my-node-app/tsconfig.spec.json' + ], + exclude: ['**/node_modules/**', '!apps/my-dir/my-node-app/**'] } - ); + }); - expect(angularJson.projects['my-dir-my-node-app-e2e']).toBeUndefined(); - expect(angularJson.defaultProject).toEqual('my-dir-my-node-app'); + expect(workspaceJson.projects['my-dir-my-node-app-e2e']).toBeUndefined(); + expect(workspaceJson.defaultProject).toEqual('my-dir-my-node-app'); }); it('should update nx.json', async () => { @@ -213,12 +213,12 @@ describe('app', () => { expect(tree.exists('apps/my-node-app/src/test.ts')).toBeFalsy(); expect(tree.exists('apps/my-node-app/tsconfig.spec.json')).toBeFalsy(); expect(tree.exists('apps/my-node-app/jest.config.js')).toBeFalsy(); - const angularJson = readJsonInTree(tree, 'angular.json'); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); expect( - angularJson.projects['my-node-app'].architect.test + workspaceJson.projects['my-node-app'].architect.test ).toBeUndefined(); expect( - angularJson.projects['my-node-app'].architect.lint.options.tsConfig + workspaceJson.projects['my-node-app'].architect.lint.options.tsConfig ).toEqual(['apps/my-node-app/tsconfig.app.json']); }); }); @@ -234,7 +234,7 @@ describe('app', () => { ); expect(tree.exists('apps/my-frontend/proxy.conf.json')).toBeTruthy(); - const serve = JSON.parse(tree.readContent('angular.json')).projects[ + const serve = JSON.parse(tree.readContent('workspace.json')).projects[ 'my-frontend' ].architect.serve; expect(serve.options.proxyConfig).toEqual( @@ -252,7 +252,7 @@ describe('app', () => { ); expect(tree.exists('apps/my-frontend/proxy.conf.json')).toBeTruthy(); - const serve = JSON.parse(tree.readContent('angular.json')).projects[ + const serve = JSON.parse(tree.readContent('workspace.json')).projects[ 'my-frontend' ].architect.serve; expect(serve.options.proxyConfig).toEqual( diff --git a/packages/node/src/schematics/application/application.ts b/packages/node/src/schematics/application/application.ts index 715e77ea7b..e5fbe5a66e 100644 --- a/packages/node/src/schematics/application/application.ts +++ b/packages/node/src/schematics/application/application.ts @@ -13,7 +13,12 @@ import { } from '@angular-devkit/schematics'; import { join, normalize, Path } from '@angular-devkit/core'; import { Schema } from './schema'; -import { updateJsonInTree } from '@nrwl/workspace'; +import { + updateJsonInTree, + updateWorkspaceInTree, + generateProjectLint, + addGlobalLint +} from '@nrwl/workspace'; import { toFileName } from '@nrwl/workspace'; import { getProjectConfig } from '@nrwl/workspace'; import { offsetFromRoot } from '@nrwl/workspace'; @@ -61,16 +66,6 @@ function getBuildConfig(project: any, options: NormalizedSchema) { }; } -function getLintConfig(project: any) { - return { - builder: '@angular-devkit/build-angular:tslint', - options: { - tsConfig: [join(project.root, 'tsconfig.app.json')], - exclude: ['**/node_modules/**', '!' + join(project.root, '**')] - } - }; -} - function getServeConfig(options: NormalizedSchema) { return { builder: '@nrwl/node:execute', @@ -80,8 +75,8 @@ function getServeConfig(options: NormalizedSchema) { }; } -function updateAngularJson(options: NormalizedSchema): Rule { - return updateJsonInTree('angular.json', angularJson => { +function updateWorkspaceJson(options: NormalizedSchema): Rule { + return updateWorkspaceInTree(workspaceJson => { const project = { root: options.appProjectRoot, sourceRoot: join(options.appProjectRoot, 'src'), @@ -93,12 +88,17 @@ function updateAngularJson(options: NormalizedSchema): Rule { project.architect.build = getBuildConfig(project, options); project.architect.serve = getServeConfig(options); - project.architect.lint = getLintConfig(project); - angularJson.projects[options.name] = project; + project.architect.lint = generateProjectLint( + normalize(project.root), + join(normalize(project.root), 'tsconfig.app.json'), + options.linter + ); - angularJson.defaultProject = angularJson.defaultProject || options.name; + workspaceJson.projects[options.name] = project; - return angularJson; + workspaceJson.defaultProject = workspaceJson.defaultProject || options.name; + + return workspaceJson; }); } @@ -135,7 +135,7 @@ function addProxy(options: NormalizedSchema): Rule { ) ); - updateJsonInTree('angular.json', json => { + updateWorkspaceInTree(json => { projectConfig.architect.serve.options.proxyConfig = pathToProxyFile; json.projects[options.frontendProject] = projectConfig; return json; @@ -151,8 +151,9 @@ export default function(schema: Schema): Rule { ngAdd({ skipFormat: true }), + addGlobalLint(options.linter), addAppFiles(options), - updateAngularJson(options), + updateWorkspaceJson(options), updateNxJson(options), options.unitTestRunner === 'jest' ? externalSchematic('@nrwl/jest', 'jest-project', { diff --git a/packages/node/src/schematics/application/files/app/src/environments/environment.ts__tmpl__ b/packages/node/src/schematics/application/files/app/src/environments/environment.ts__tmpl__ index ee37b495d5..ffe8aed766 100644 --- a/packages/node/src/schematics/application/files/app/src/environments/environment.ts__tmpl__ +++ b/packages/node/src/schematics/application/files/app/src/environments/environment.ts__tmpl__ @@ -1,7 +1,3 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - export const environment = { production: false }; diff --git a/packages/node/src/schematics/application/schema.d.ts b/packages/node/src/schematics/application/schema.d.ts index 415d9c1d94..4a42c9e1e9 100644 --- a/packages/node/src/schematics/application/schema.d.ts +++ b/packages/node/src/schematics/application/schema.d.ts @@ -1,10 +1,10 @@ -import { UnitTestRunner } from '../../utils/test-runners'; export interface Schema { name: string; skipFormat: boolean; skipPackageJson: boolean; directory?: string; - unitTestRunner: UnitTestRunner; + unitTestRunner: 'jest' | 'none'; + linter: 'eslint' | 'tslint'; tags?: string; frontendProject?: string; } diff --git a/packages/node/src/schematics/application/schema.json b/packages/node/src/schematics/application/schema.json index 8f771fa76c..86c60724f9 100644 --- a/packages/node/src/schematics/application/schema.json +++ b/packages/node/src/schematics/application/schema.json @@ -28,6 +28,12 @@ "default": false, "description": "Do not add dependencies to package.json." }, + "linter": { + "description": "The tool to use for running lint checks.", + "type": "string", + "enum": ["eslint", "tslint"], + "default": "tslint" + }, "unitTestRunner": { "type": "string", "enum": ["jest", "none"], diff --git a/packages/node/src/schematics/ng-add/ng-add.spec.ts b/packages/node/src/schematics/ng-add/ng-add.spec.ts index 4f61c940c5..625f88cec9 100644 --- a/packages/node/src/schematics/ng-add/ng-add.spec.ts +++ b/packages/node/src/schematics/ng-add/ng-add.spec.ts @@ -21,13 +21,13 @@ describe('ng-add', () => { describe('defaultCollection', () => { it('should be set if none was set before', async () => { const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/node'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/node'); }); it('should be set if @nrwl/workspace was set before', async () => { tree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/workspace' }; @@ -37,13 +37,13 @@ describe('ng-add', () => { tree ); const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/node'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/node'); }); it('should not be set if something else was set before', async () => { tree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/angular' }; @@ -53,8 +53,8 @@ describe('ng-add', () => { tree ); const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/angular'); }); }); }); diff --git a/packages/react/src/schematics/application/application.spec.ts b/packages/react/src/schematics/application/application.spec.ts index 46adda06b6..47d0322e88 100644 --- a/packages/react/src/schematics/application/application.spec.ts +++ b/packages/react/src/schematics/application/application.spec.ts @@ -13,15 +13,15 @@ describe('app', () => { }); describe('not nested', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic('app', { name: 'myApp' }, appTree); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-app'].root).toEqual('apps/my-app'); - expect(angularJson.projects['my-app-e2e'].root).toEqual( + expect(workspaceJson.projects['my-app'].root).toEqual('apps/my-app'); + expect(workspaceJson.projects['my-app-e2e'].root).toEqual( 'apps/my-app-e2e' ); - expect(angularJson.defaultProject).toEqual('my-app'); + expect(workspaceJson.defaultProject).toEqual('my-app'); }); it('should update nx.json', async () => { @@ -76,18 +76,18 @@ describe('app', () => { }); describe('nested', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic( 'app', { name: 'myApp', directory: 'myDir' }, appTree ); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-dir-my-app'].root).toEqual( + expect(workspaceJson.projects['my-dir-my-app'].root).toEqual( 'apps/my-dir/my-app' ); - expect(angularJson.projects['my-dir-my-app-e2e'].root).toEqual( + expect(workspaceJson.projects['my-dir-my-app-e2e'].root).toEqual( 'apps/my-dir/my-app-e2e' ); }); @@ -225,8 +225,8 @@ describe('app', () => { }, appTree ); - const angularJson = readJsonInTree(tree, 'angular.json'); - const architectConfig = angularJson.projects['my-app'].architect; + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + const architectConfig = workspaceJson.projects['my-app'].architect; expect(architectConfig.build.builder).toEqual('@nrwl/web:build'); expect(architectConfig.build.options).toEqual({ assets: ['apps/my-app/src/favicon.ico', 'apps/my-app/src/assets'], @@ -270,8 +270,8 @@ describe('app', () => { }, appTree ); - const angularJson = readJsonInTree(tree, 'angular.json'); - const architectConfig = angularJson.projects['my-app'].architect; + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + const architectConfig = workspaceJson.projects['my-app'].architect; expect(architectConfig.serve.builder).toEqual('@nrwl/web:dev-server'); expect(architectConfig.serve.options).toEqual({ buildTarget: 'my-app:build' @@ -289,8 +289,8 @@ describe('app', () => { }, appTree ); - const angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['my-app'].architect.lint).toEqual({ + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['my-app'].architect.lint).toEqual({ builder: '@angular-devkit/build-angular:tslint', options: { exclude: ['**/node_modules/**', '!apps/my-app/**'], @@ -312,10 +312,10 @@ describe('app', () => { expect(tree.exists('apps/my-app/src/app/app.spec.tsx')).toBeFalsy(); expect(tree.exists('apps/my-app/tsconfig.spec.json')).toBeFalsy(); expect(tree.exists('apps/my-app/jest.config.js')).toBeFalsy(); - const angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['my-app'].architect.test).toBeUndefined(); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['my-app'].architect.test).toBeUndefined(); expect( - angularJson.projects['my-app'].architect.lint.options.tsConfig + workspaceJson.projects['my-app'].architect.lint.options.tsConfig ).toEqual(['apps/my-app/tsconfig.app.json']); }); }); @@ -328,8 +328,8 @@ describe('app', () => { appTree ); expect(tree.exists('apps/my-app-e2e')).toBeFalsy(); - const angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['my-app-e2e']).toBeUndefined(); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['my-app-e2e']).toBeUndefined(); }); }); @@ -417,17 +417,17 @@ describe('app', () => { expect(content).toContain(''); }); - it('should exclude styles from angular.json', async () => { + it('should exclude styles from workspace.json', async () => { const tree = await runSchematic( 'app', { name: 'myApp', style: '@emotion/styled' }, appTree ); - const angularJSON = readJsonInTree(tree, 'angular.json'); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); expect( - angularJSON.projects['my-app'].architect.build.options.styles + workspaceJson.projects['my-app'].architect.build.options.styles ).toEqual([]); }); diff --git a/packages/react/src/schematics/application/application.ts b/packages/react/src/schematics/application/application.ts index 130be2677c..bc3c6578ce 100644 --- a/packages/react/src/schematics/application/application.ts +++ b/packages/react/src/schematics/application/application.ts @@ -19,9 +19,14 @@ import { NxJson, offsetFromRoot, toFileName, - updateJsonInTree + updateJsonInTree, + generateProjectLint, + addGlobalLint } from '@nrwl/workspace'; -import { addDepsToPackageJson } from '@nrwl/workspace/src/utils/ast-utils'; +import { + addDepsToPackageJson, + updateWorkspaceInTree +} from '@nrwl/workspace/src/utils/ast-utils'; import ngAdd from '../ng-add/ng-add'; import * as ts from 'typescript'; @@ -48,6 +53,7 @@ export default function(schema: Schema): Rule { ngAdd({ skipFormat: true }), + addGlobalLint(options.linter), createApplicationFiles(options), updateNxJson(options), addProject(options), @@ -102,7 +108,7 @@ function updateNxJson(options: NormalizedSchema): Rule { } function addProject(options: NormalizedSchema): Rule { - return updateJsonInTree('angular.json', json => { + return updateWorkspaceInTree(json => { const architect: { [key: string]: any } = {}; architect.build = { @@ -166,16 +172,11 @@ function addProject(options: NormalizedSchema): Rule { } }; - architect.lint = { - builder: '@angular-devkit/build-angular:tslint', - options: { - tsConfig: [join(options.appProjectRoot, 'tsconfig.app.json')], - exclude: [ - '**/node_modules/**', - '!' + join(options.appProjectRoot, '**') - ] - } - }; + architect.lint = generateProjectLint( + normalize(options.appProjectRoot), + join(normalize(options.appProjectRoot), 'tsconfig.app.json'), + options.linter + ); json.projects[options.projectName] = { root: options.appProjectRoot, diff --git a/packages/react/src/schematics/application/schema.d.ts b/packages/react/src/schematics/application/schema.d.ts index 6d7a039516..94e61b6bda 100644 --- a/packages/react/src/schematics/application/schema.d.ts +++ b/packages/react/src/schematics/application/schema.d.ts @@ -1,13 +1,12 @@ -import { E2eTestRunner, UnitTestRunner } from '../../utils/test-runners'; - export interface Schema { name: string; style?: string; skipFormat: boolean; directory?: string; tags?: string; - unitTestRunner: UnitTestRunner; - e2eTestRunner: E2eTestRunner; + unitTestRunner: 'jest' | 'none'; + e2eTestRunner: 'cypress' | 'none'; + linter: 'eslint' | 'tslint'; pascalCaseFiles?: boolean; classComponent?: boolean; routing?: boolean; diff --git a/packages/react/src/schematics/application/schema.json b/packages/react/src/schematics/application/schema.json index 621303275e..e4e0c5c074 100644 --- a/packages/react/src/schematics/application/schema.json +++ b/packages/react/src/schematics/application/schema.json @@ -50,6 +50,12 @@ ] } }, + "linter": { + "description": "The tool to use for running lint checks.", + "type": "string", + "enum": ["eslint", "tslint"], + "default": "tslint" + }, "routing": { "type": "boolean", "description": "Generate application with routes", diff --git a/packages/react/src/schematics/component/schema.json b/packages/react/src/schematics/component/schema.json index ab092172b7..a15dc4ea22 100644 --- a/packages/react/src/schematics/component/schema.json +++ b/packages/react/src/schematics/component/schema.json @@ -6,7 +6,7 @@ "properties": { "project": { "type": "string", - "description": "The name of the project (as specified in angular.json).", + "description": "The name of the project.", "$default": { "$source": "projectName" }, diff --git a/packages/react/src/schematics/library/files/lib/README.md b/packages/react/src/schematics/library/files/lib/README.md index 708b246ffe..99ec9c8e3c 100644 --- a/packages/react/src/schematics/library/files/lib/README.md +++ b/packages/react/src/schematics/library/files/lib/README.md @@ -4,4 +4,4 @@ This library was generated with [Nx](https://nx.dev). ## Running unit tests -Run `ng test <%= name %>` to execute the unit tests via [Jest](https://jestjs.io). +Run `yarn test <%= name %>` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/packages/react/src/schematics/library/library.spec.ts b/packages/react/src/schematics/library/library.spec.ts index c74819c369..ad62865983 100644 --- a/packages/react/src/schematics/library/library.spec.ts +++ b/packages/react/src/schematics/library/library.spec.ts @@ -13,13 +13,12 @@ describe('lib', () => { }); describe('not nested', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic('lib', { name: 'myLib' }, appTree); - const angularJson = readJsonInTree(tree, '/angular.json'); - - expect(angularJson.projects['my-lib'].root).toEqual('libs/my-lib'); - expect(angularJson.projects['my-lib'].architect.build).toBeUndefined(); - expect(angularJson.projects['my-lib'].architect.lint).toEqual({ + const workspaceJson = readJsonInTree(tree, '/workspace.json'); + expect(workspaceJson.projects['my-lib'].root).toEqual('libs/my-lib'); + expect(workspaceJson.projects['my-lib'].architect.build).toBeUndefined(); + expect(workspaceJson.projects['my-lib'].architect.lint).toEqual({ builder: '@angular-devkit/build-angular:tslint', options: { exclude: ['**/node_modules/**', '!libs/my-lib/**'], @@ -172,18 +171,18 @@ describe('lib', () => { ).toBeTruthy(); }); - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic( 'lib', { name: 'myLib', directory: 'myDir' }, appTree ); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-dir-my-lib'].root).toEqual( + expect(workspaceJson.projects['my-dir-my-lib'].root).toEqual( 'libs/my-dir/my-lib' ); - expect(angularJson.projects['my-dir-my-lib'].architect.lint).toEqual({ + expect(workspaceJson.projects['my-dir-my-lib'].architect.lint).toEqual({ builder: '@angular-devkit/build-angular:tslint', options: { exclude: ['**/node_modules/**', '!libs/my-dir/my-lib/**'], @@ -256,10 +255,10 @@ describe('lib', () => { ); expect(resultTree.exists('libs/my-lib/tsconfig.spec.json')).toBeFalsy(); expect(resultTree.exists('libs/my-lib/jest.config.js')).toBeFalsy(); - const angularJson = readJsonInTree(resultTree, 'angular.json'); - expect(angularJson.projects['my-lib'].architect.test).toBeUndefined(); + const workspaceJson = readJsonInTree(resultTree, 'workspace.json'); + expect(workspaceJson.projects['my-lib'].architect.test).toBeUndefined(); expect( - angularJson.projects['my-lib'].architect.lint.options.tsConfig + workspaceJson.projects['my-lib'].architect.lint.options.tsConfig ).toEqual(['libs/my-lib/tsconfig.lib.json']); }); }); diff --git a/packages/react/src/schematics/library/library.ts b/packages/react/src/schematics/library/library.ts index 6bc54e764c..b817f74049 100644 --- a/packages/react/src/schematics/library/library.ts +++ b/packages/react/src/schematics/library/library.ts @@ -22,7 +22,10 @@ import { readJsonInTree, toClassName, toFileName, - updateJsonInTree + updateJsonInTree, + updateWorkspaceInTree, + addGlobalLint, + generateProjectLint } from '@nrwl/workspace'; import { join, normalize, Path } from '@angular-devkit/core'; import * as ts from 'typescript'; @@ -44,6 +47,7 @@ export default function(schema: Schema): Rule { const options = normalizeOptions(schema); return chain([ + addGlobalLint(options.linter), createFiles(options), !options.skipTsConfig ? updateTsConfig(options) : noop(), addProject(options), @@ -71,19 +75,14 @@ export default function(schema: Schema): Rule { } function addProject(options: NormalizedSchema): Rule { - return updateJsonInTree('angular.json', json => { + return updateWorkspaceInTree(json => { const architect: { [key: string]: any } = {}; - architect.lint = { - builder: '@angular-devkit/build-angular:tslint', - options: { - tsConfig: [join(normalize(options.projectRoot), 'tsconfig.lib.json')], - exclude: [ - '**/node_modules/**', - '!' + join(normalize(options.projectRoot), '**') - ] - } - }; + architect.lint = generateProjectLint( + normalize(options.projectRoot), + join(normalize(options.projectRoot), 'tsconfig.lib.json'), + options.linter + ); json.projects[options.name] = { root: options.projectRoot, diff --git a/packages/react/src/schematics/library/schema.d.ts b/packages/react/src/schematics/library/schema.d.ts index 7608df91ac..0ba6d4e459 100644 --- a/packages/react/src/schematics/library/schema.d.ts +++ b/packages/react/src/schematics/library/schema.d.ts @@ -1,5 +1,3 @@ -import { UnitTestRunner } from '../../utils/test-runners'; - export interface Schema { name: string; directory?: string; @@ -11,5 +9,6 @@ export interface Schema { pascalCaseFiles?: boolean; routing?: boolean; parentRoute?: string; - unitTestRunner: UnitTestRunner; + unitTestRunner: 'jest' | 'none'; + linter: 'eslint' | 'tslint'; } diff --git a/packages/react/src/schematics/library/schema.json b/packages/react/src/schematics/library/schema.json index 8cdb958b2a..d36da86a41 100644 --- a/packages/react/src/schematics/library/schema.json +++ b/packages/react/src/schematics/library/schema.json @@ -50,6 +50,12 @@ ] } }, + "linter": { + "description": "The tool to use for running lint checks.", + "type": "string", + "enum": ["eslint", "tslint"], + "default": "tslint" + }, "unitTestRunner": { "type": "string", "enum": ["jest", "none"], diff --git a/packages/react/src/schematics/ng-add/ng-add.spec.ts b/packages/react/src/schematics/ng-add/ng-add.spec.ts index 33d4c0a8b1..9d83c40cd5 100644 --- a/packages/react/src/schematics/ng-add/ng-add.spec.ts +++ b/packages/react/src/schematics/ng-add/ng-add.spec.ts @@ -27,13 +27,13 @@ describe('ng-add', () => { describe('defaultCollection', () => { it('should be set if none was set before', async () => { const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/react'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/react'); }); it('should be set if @nrwl/workspace was set before', async () => { tree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/workspace' }; @@ -43,13 +43,13 @@ describe('ng-add', () => { tree ); const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/react'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/react'); }); it('should not be set if something else was set before', async () => { tree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/angular' }; @@ -59,8 +59,8 @@ describe('ng-add', () => { tree ); const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/angular'); }); }); }); diff --git a/packages/schematics/migrations/legacy-migrations/20171211-create-tsconfigapp-per-app.ts b/packages/schematics/migrations/legacy-migrations/20171211-create-tsconfigapp-per-app.ts index a625bf083d..952dfe7c02 100644 --- a/packages/schematics/migrations/legacy-migrations/20171211-create-tsconfigapp-per-app.ts +++ b/packages/schematics/migrations/legacy-migrations/20171211-create-tsconfigapp-per-app.ts @@ -1,4 +1,4 @@ -import { readCliConfigFile, updateJsonFile } from '@nrwl/workspace'; +import { readWorkspaceConfigPath, updateJsonFile } from '@nrwl/workspace'; import { writeFileSync, unlinkSync } from 'fs'; import { offsetFromRoot } from '@nrwl/workspace'; import * as path from 'path'; @@ -6,7 +6,7 @@ import * as path from 'path'; export default { description: 'Create tsconfig.app.json for every app', run: () => { - const config = readCliConfigFile(); + const config = readWorkspaceConfigPath(); config.apps.forEach(app => { if (!app.root.startsWith('apps/')) return; const offset = offsetFromRoot(app.root); diff --git a/packages/schematics/migrations/legacy-migrations/20180507-create-nx-json.ts b/packages/schematics/migrations/legacy-migrations/20180507-create-nx-json.ts index 3879150681..b875e216c1 100644 --- a/packages/schematics/migrations/legacy-migrations/20180507-create-nx-json.ts +++ b/packages/schematics/migrations/legacy-migrations/20180507-create-nx-json.ts @@ -5,7 +5,7 @@ import { stripIndents } from '@angular-devkit/core/src/utils/literals'; export default { description: `Create nx.json before migrating to Angular CLI 6.`, run: () => { - if (!existsSync('.angular-cli.json') && existsSync('angular.json')) { + if (!existsSync('.angular-cli.json') && existsSync('workspace.json')) { console.warn(stripIndents` You have already upgraded to Angular CLI 6. We will not be able to recover information about your project's tags for you. @@ -13,8 +13,8 @@ export default { return; } - const angularJson = readJsonFile('.angular-cli.json'); - const projects = angularJson.apps.reduce((projects, app) => { + const workspaceJson = readJsonFile('.angular-cli.json'); + const projects = workspaceJson.apps.reduce((projects, app) => { if (app.name === '$workspaceRoot') { return projects; } @@ -33,7 +33,7 @@ export default { writeFileSync( 'nx.json', serializeJson({ - npmScope: angularJson.project.npmScope, + npmScope: workspaceJson.project.npmScope, projects: projects }) ); diff --git a/packages/schematics/migrations/legacy-migrations/20180515-switch-to-nx6.ts b/packages/schematics/migrations/legacy-migrations/20180515-switch-to-nx6.ts index 03d511e373..a98b67ba6d 100644 --- a/packages/schematics/migrations/legacy-migrations/20180515-switch-to-nx6.ts +++ b/packages/schematics/migrations/legacy-migrations/20180515-switch-to-nx6.ts @@ -7,7 +7,7 @@ import { join } from 'path'; export default { description: `Switch to Nx 6.0`, run: () => { - if (!existsSync('.angular-cli.json') && existsSync('angular.json')) { + if (!existsSync('.angular-cli.json') && existsSync('workspace.json')) { console.warn(stripIndents` You have already upgraded to Angular CLI 6. We will not be able to recover information about your project's tags for you. diff --git a/packages/schematics/migrations/update-6-0-0/update-6-0-0.ts b/packages/schematics/migrations/update-6-0-0/update-6-0-0.ts index 4d31812621..150e618f43 100644 --- a/packages/schematics/migrations/update-6-0-0/update-6-0-0.ts +++ b/packages/schematics/migrations/update-6-0-0/update-6-0-0.ts @@ -10,7 +10,8 @@ import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; import { createOrUpdate, readJsonInTree, - updateJsonInTree + updateJsonInTree, + updateWorkspaceInTree } from '@nrwl/workspace'; import { serializeJson, renameSync } from '@nrwl/workspace'; import { parseTarget, serializeTarget } from '@nrwl/workspace'; @@ -256,8 +257,8 @@ function createTsconfigLibJson(host: Tree, project: any) { } function createAdditionalFiles(host: Tree) { - const angularJson = readJsonInTree(host, 'angular.json'); - Object.entries(angularJson.projects).forEach(([key, project]) => { + const workspaceJson = readJsonInTree(host, 'workspace.json'); + Object.entries(workspaceJson.projects).forEach(([key, project]) => { if (project.architect.test) { createTsconfigSpecJson(host, project); createKarma(host, project); @@ -282,9 +283,9 @@ function createAdditionalFiles(host: Tree) { } function moveE2eTests(host: Tree, context: SchematicContext) { - const angularJson = readJsonInTree(host, 'angular.json'); + const workspaceJson = readJsonInTree(host, 'workspace.json'); - Object.entries(angularJson.projects).forEach(([key, p]) => { + Object.entries(workspaceJson.projects).forEach(([key, p]) => { if (p.projectType === 'application' && !p.architect.e2e) { renameSync(`${p.root}/e2e`, `${p.root}-e2e/src`, err => { if (!err) { @@ -320,9 +321,9 @@ function deleteUnneededFiles(host: Tree) { } function patchLibIndexFiles(host: Tree, context: SchematicContext) { - const angularJson = readJsonInTree(host, 'angular.json'); + const workspaceJson = readJsonInTree(host, 'workspace.json'); - Object.entries(angularJson.projects).forEach(([key, p]) => { + Object.entries(workspaceJson.projects).forEach(([key, p]) => { if (p.projectType === 'library') { try { // TODO: incorporate this into fileutils.renameSync @@ -489,8 +490,8 @@ function createDefaultE2eTsConfig(host: Tree, project: any) { } function updateTsConfigs(host: Tree) { - const angularJson = readJsonInTree(host, 'angular.json'); - Object.entries(angularJson.projects).forEach(([key, project]) => { + const workspaceJson = readJsonInTree(host, 'workspace.json'); + Object.entries(workspaceJson.projects).forEach(([key, project]) => { if ( project.architect.build && project.architect.build.options.main.startsWith('apps') @@ -562,7 +563,7 @@ function updateTsConfigs(host: Tree) { return host; } -const updateAngularJson = updateJsonInTree('angular.json', json => { +const updateworkspaceJson = updateWorkspaceInTree(json => { json.newProjectRoot = ''; json.cli = { ...json.cli, @@ -681,7 +682,7 @@ function addInstallTask(host: Tree, context: SchematicContext) { } function checkCli6Upgraded(host: Tree) { - if (!host.exists('angular.json') && host.exists('.angular-cli.json')) { + if (!host.exists('workspace.json') && host.exists('.angular-cli.json')) { throw new Error( 'Please install the latest version and run ng update @angular/cli first' ); @@ -701,7 +702,7 @@ export default function(): Rule { return chain([ checkCli6Upgraded, updatePackageJson, - updateAngularJson, + updateworkspaceJson, moveE2eTests, updateTsConfigs, createAdditionalFiles, diff --git a/packages/schematics/migrations/update-6-1-0/update-6-1-0.ts b/packages/schematics/migrations/update-6-1-0/update-6-1-0.ts index 34047c2f27..25249af17f 100644 --- a/packages/schematics/migrations/update-6-1-0/update-6-1-0.ts +++ b/packages/schematics/migrations/update-6-1-0/update-6-1-0.ts @@ -25,7 +25,7 @@ const addImplicitDependencies = updateJsonInTree('nx.json', nxJson => { return { ...nxJson, implicitDependencies: { - 'angular.json': '*', + 'workspace.json': '*', 'package.json': '*', 'tsconfig.json': '*', 'tslint.json': '*', diff --git a/packages/schematics/migrations/update-7-2-0/update-7-2-0.spec.ts b/packages/schematics/migrations/update-7-2-0/update-7-2-0.spec.ts index 00a22ab5fb..cc09e63930 100644 --- a/packages/schematics/migrations/update-7-2-0/update-7-2-0.spec.ts +++ b/packages/schematics/migrations/update-7-2-0/update-7-2-0.spec.ts @@ -15,7 +15,7 @@ describe('Update 7.2.0', () => { scripts: {} }); createJson('tsconfig.json', {}); - createJson('angular.json', { + createJson('workspace.json', { projects: { app1: { root: 'apps/app1', @@ -321,7 +321,7 @@ describe('Update 7.2.0', () => { it('should fix cypress lint configs', async () => { initialTree = await schematicRunner .callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.projects['app2-e2e'].architect.lint.options.tsConfig = 'e2e/tsconfig.e2e.json'; return json; @@ -333,8 +333,8 @@ describe('Update 7.2.0', () => { .runSchematicAsync('update-7.2.0', {}, initialTree) .toPromise(); expect( - readJsonInTree(result, 'angular.json').projects['app2-e2e'].architect.lint - .options.tsConfig + readJsonInTree(result, 'workspace.json').projects['app2-e2e'].architect + .lint.options.tsConfig ).toEqual('apps/app2-e2e/tsconfig.e2e.json'); [ '/apps/app1/tsconfig.app.json', @@ -358,7 +358,7 @@ describe('Update 7.2.0', () => { it('should not fail for non-existing tsconfigs', async () => { initialTree = await schematicRunner .callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.projects['app2'].architect.lint.options.tsConfig = 'apps/nonexistent/tsconfig.app.json'; return json; diff --git a/packages/schematics/migrations/update-7-2-0/update-7-2-0.ts b/packages/schematics/migrations/update-7-2-0/update-7-2-0.ts index 1255eb1be8..73ba20cff7 100644 --- a/packages/schematics/migrations/update-7-2-0/update-7-2-0.ts +++ b/packages/schematics/migrations/update-7-2-0/update-7-2-0.ts @@ -10,7 +10,11 @@ import { normalize, join, Path, dirname } from '@angular-devkit/core'; import { relative } from 'path'; -import { updateJsonInTree, readJsonInTree } from '@nrwl/workspace'; +import { + updateJsonInTree, + readJsonInTree, + updateWorkspaceInTree +} from '@nrwl/workspace'; import { getWorkspacePath } from '@nrwl/workspace'; import { offsetFromRoot, addUpdateTask } from '@nrwl/workspace'; import { stripIndents } from '@angular-devkit/core/src/utils/literals'; @@ -159,9 +163,9 @@ function updateTsConfigs(project: any): Rule { } function fixCypressConfigs(host: Tree, context: SchematicContext): Rule { - const angularJson = readJsonInTree(host, 'angular.json'); + const workspaceJson = readJsonInTree(host, 'workspace.json'); return chain( - Object.entries(angularJson.projects) + Object.entries(workspaceJson.projects) .filter( ([key, project]) => project.architect.e2e && @@ -175,12 +179,12 @@ function fixCypressConfigs(host: Tree, context: SchematicContext): Rule { } function fixCypressConfig(project: any, projectKey: string): Rule { - return updateJsonInTree('angular.json', angularJson => { - angularJson.projects[projectKey].architect.lint.options.tsConfig = join( + return updateWorkspaceInTree(workspaceJson => { + workspaceJson.projects[projectKey].architect.lint.options.tsConfig = join( project.root, 'tsconfig.e2e.json' ); - return angularJson; + return workspaceJson; }); } diff --git a/packages/schematics/migrations/update-7-5-0/update-7-5-0.spec.ts b/packages/schematics/migrations/update-7-5-0/update-7-5-0.spec.ts index a2573e1301..c9bf69bf57 100644 --- a/packages/schematics/migrations/update-7-5-0/update-7-5-0.spec.ts +++ b/packages/schematics/migrations/update-7-5-0/update-7-5-0.spec.ts @@ -5,15 +5,16 @@ import * as path from 'path'; import { serializeJson } from '@nrwl/workspace'; import { readJsonInTree } from '@nrwl/workspace'; +import { createEmptyWorkspace } from '@nrwl/workspace/testing'; describe('Update 7.5.0', () => { let initialTree: Tree; let schematicRunner: SchematicTestRunner; beforeEach(() => { - initialTree = Tree.empty(); + initialTree = createEmptyWorkspace(Tree.empty()); - initialTree.create( + initialTree.overwrite( 'package.json', serializeJson({ devDependencies: { diff --git a/packages/schematics/migrations/update-7-6-0/update-7-6-0.spec.ts b/packages/schematics/migrations/update-7-6-0/update-7-6-0.spec.ts index 55c9079d5e..00bd15cbf6 100644 --- a/packages/schematics/migrations/update-7-6-0/update-7-6-0.spec.ts +++ b/packages/schematics/migrations/update-7-6-0/update-7-6-0.spec.ts @@ -9,6 +9,7 @@ import { join } from 'path'; import { serializeJson } from '@nrwl/workspace'; import { readJsonInTree, updateJsonInTree } from '@nrwl/workspace'; import { stripIndents } from '@angular-devkit/core/src/utils/literals'; +import { createEmptyWorkspace } from '@nrwl/workspace/testing'; const effectContents = ` import { Injectable } from '@angular/core'; @@ -77,9 +78,9 @@ describe('Update 7.6.0', () => { let schematicRunner: SchematicTestRunner; beforeEach(() => { - initialTree = new UnitTestTree(Tree.empty()); + initialTree = createEmptyWorkspace(Tree.empty()); - initialTree.create( + initialTree.overwrite( 'package.json', serializeJson({ dependencies: { @@ -159,22 +160,22 @@ describe('Update 7.6.0', () => { .toPromise(); expect( - readJsonInTree(result, 'angular.json').schematics[ + readJsonInTree(result, 'workspace.json').schematics[ '@nrwl/schematics:library' ].unitTestRunner ).toEqual('karma'); expect( - readJsonInTree(result, 'angular.json').schematics[ + readJsonInTree(result, 'workspace.json').schematics[ '@nrwl/schematics:application' ].unitTestRunner ).toEqual('karma'); expect( - readJsonInTree(result, 'angular.json').schematics[ + readJsonInTree(result, 'workspace.json').schematics[ '@nrwl/schematics:application' ].e2eTestRunner ).toEqual('protractor'); expect( - readJsonInTree(result, 'angular.json').schematics[ + readJsonInTree(result, 'workspace.json').schematics[ '@nrwl/schematics:node-application' ].framework ).toEqual('express'); diff --git a/packages/schematics/migrations/update-7-6-0/update-7-6-0.ts b/packages/schematics/migrations/update-7-6-0/update-7-6-0.ts index 9103f827d3..9ba073301e 100644 --- a/packages/schematics/migrations/update-7-6-0/update-7-6-0.ts +++ b/packages/schematics/migrations/update-7-6-0/update-7-6-0.ts @@ -8,7 +8,8 @@ import { formatFiles, insert, readJsonInTree, - updateJsonInTree + updateJsonInTree, + updateWorkspaceInTree } from '@nrwl/workspace'; import { getSourceNodes, @@ -371,7 +372,7 @@ const addDotEnv = updateJsonInTree('package.json', json => { return json; }); -const setDefaults = updateJsonInTree('angular.json', json => { +const setDefaults = updateWorkspaceInTree(json => { if (!json.schematics) { json.schematics = {}; } diff --git a/packages/schematics/migrations/update-7-7-0/update-7-7-0.spec.ts b/packages/schematics/migrations/update-7-7-0/update-7-7-0.spec.ts index 065fca10b3..b58cc1a4a9 100644 --- a/packages/schematics/migrations/update-7-7-0/update-7-7-0.spec.ts +++ b/packages/schematics/migrations/update-7-7-0/update-7-7-0.spec.ts @@ -7,13 +7,14 @@ import { import { join } from 'path'; import { readJsonInTree } from '@nrwl/workspace'; import { serializeJson } from '@nrwl/workspace'; +import { createEmptyWorkspace } from '@nrwl/workspace/testing'; describe('Update 7.7.0', () => { let initialTree: Tree; let schematicRunner: SchematicTestRunner; beforeEach(() => { - initialTree = new UnitTestTree(Tree.empty()); + initialTree = createEmptyWorkspace(Tree.empty()); schematicRunner = new SchematicTestRunner( '@nrwl/schematics', @@ -28,7 +29,7 @@ describe('Update 7.7.0', () => { .toPromise(); expect( - readJsonInTree(result, 'angular.json').schematics[ + readJsonInTree(result, 'workspace.json').schematics[ '@nrwl/schematics:library' ].framework ).toEqual('angular'); @@ -37,7 +38,7 @@ describe('Update 7.7.0', () => { describe('jest update', () => { beforeEach(() => { - initialTree.create( + initialTree.overwrite( 'package.json', serializeJson({ devDependencies: { diff --git a/packages/schematics/migrations/update-7-7-0/update-7-7-0.ts b/packages/schematics/migrations/update-7-7-0/update-7-7-0.ts index 4cf434c6d6..9a5fa7b271 100644 --- a/packages/schematics/migrations/update-7-7-0/update-7-7-0.ts +++ b/packages/schematics/migrations/update-7-7-0/update-7-7-0.ts @@ -1,7 +1,7 @@ import { chain, Rule, Tree } from '@angular-devkit/schematics'; import { updateJsonInTree, insert } from '@nrwl/workspace'; -import { formatFiles } from '@nrwl/workspace'; +import { formatFiles, updateWorkspaceInTree } from '@nrwl/workspace'; import * as ts from 'typescript'; import { @@ -9,7 +9,7 @@ import { ReplaceChange } from '@nrwl/workspace/src/utils/ast-utils'; -const setDefaults = updateJsonInTree('angular.json', json => { +const setDefaults = updateWorkspaceInTree(json => { if (!json.schematics) { json.schematics = {}; } diff --git a/packages/schematics/migrations/update-7-8-1/update-7-8-1.spec.ts b/packages/schematics/migrations/update-7-8-1/update-7-8-1.spec.ts index 28e8c20343..e2fb9090ef 100644 --- a/packages/schematics/migrations/update-7-8-1/update-7-8-1.spec.ts +++ b/packages/schematics/migrations/update-7-8-1/update-7-8-1.spec.ts @@ -3,14 +3,15 @@ import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; import { serializeJson } from '@nrwl/workspace'; import * as path from 'path'; +import { createEmptyWorkspace } from '@nrwl/workspace/testing'; describe('Update 7.8.1', () => { let initialTree: Tree; let schematicRunner: SchematicTestRunner; beforeEach(() => { - initialTree = Tree.empty(); - initialTree.create( + initialTree = createEmptyWorkspace(Tree.empty()); + initialTree.overwrite( 'package.json', serializeJson({ scripts: {} diff --git a/packages/schematics/migrations/update-8-0-0/update-8-0-0.spec.ts b/packages/schematics/migrations/update-8-0-0/update-8-0-0.spec.ts index 05de036863..5a1a25d9c9 100644 --- a/packages/schematics/migrations/update-8-0-0/update-8-0-0.spec.ts +++ b/packages/schematics/migrations/update-8-0-0/update-8-0-0.spec.ts @@ -3,13 +3,14 @@ import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; import { updateJsonInTree, readJsonInTree } from '@nrwl/workspace'; import * as path from 'path'; +import { createEmptyWorkspace } from '@nrwl/workspace/testing'; describe('Update 8-0-0', () => { let initialTree: Tree; let schematicRunner: SchematicTestRunner; beforeEach(async () => { - initialTree = Tree.empty(); + initialTree = createEmptyWorkspace(Tree.empty()); schematicRunner = new SchematicTestRunner( '@nrwl/schematics', path.join(__dirname, '../migrations.json') @@ -56,7 +57,7 @@ describe('Update 8-0-0', () => { .toPromise(); initialTree = await schematicRunner .callRule( - updateJsonInTree('angular.json', json => ({ + updateJsonInTree('workspace.json', json => ({ projects: { 'my-app': { architect: { @@ -158,7 +159,7 @@ describe('Update 8-0-0', () => { const tree = await schematicRunner .runSchematicAsync('update-8.0.0', {}, initialTree) .toPromise(); - const { projects } = readJsonInTree(tree, 'angular.json'); + const { projects } = readJsonInTree(tree, 'workspace.json'); const { architect } = projects['my-app']; expect(architect.cypress.builder).toEqual('@nrwl/cypress:cypress'); expect(architect.jest.builder).toEqual('@nrwl/jest:jest'); @@ -281,7 +282,7 @@ describe('Update 8-0-0', () => { .runSchematicAsync('update-8.0.0', {}, initialTree) .toPromise(); - const defaultCollection = readJsonInTree(tree, 'angular.json').cli + const defaultCollection = readJsonInTree(tree, 'workspace.json').cli .defaultCollection; expect(defaultCollection).toEqual('@nrwl/angular'); }); @@ -304,7 +305,7 @@ describe('Update 8-0-0', () => { .runSchematicAsync('update-8.0.0', {}, initialTree) .toPromise(); - const defaultCollection = readJsonInTree(tree, 'angular.json').cli + const defaultCollection = readJsonInTree(tree, 'workspace.json').cli .defaultCollection; expect(defaultCollection).toEqual('@nrwl/react'); }); @@ -326,7 +327,7 @@ describe('Update 8-0-0', () => { .runSchematicAsync('update-8.0.0', {}, initialTree) .toPromise(); - const defaultCollection = readJsonInTree(tree, 'angular.json').cli + const defaultCollection = readJsonInTree(tree, 'workspace.json').cli .defaultCollection; expect(defaultCollection).toEqual('@nrwl/nest'); }); @@ -347,7 +348,7 @@ describe('Update 8-0-0', () => { .runSchematicAsync('update-8.0.0', {}, initialTree) .toPromise(); - const defaultCollection = readJsonInTree(tree, 'angular.json').cli + const defaultCollection = readJsonInTree(tree, 'workspace.json').cli .defaultCollection; expect(defaultCollection).toEqual('@nrwl/express'); }); @@ -368,7 +369,7 @@ describe('Update 8-0-0', () => { .runSchematicAsync('update-8.0.0', {}, initialTree) .toPromise(); - const defaultCollection = readJsonInTree(tree, 'angular.json').cli + const defaultCollection = readJsonInTree(tree, 'workspace.json').cli .defaultCollection; expect(defaultCollection).toEqual('@nrwl/express'); }); @@ -385,7 +386,7 @@ describe('Update 8-0-0', () => { .toPromise(); initialTree = await schematicRunner .callRule( - updateJsonInTree('angular.json', json => ({ + updateJsonInTree('workspace.json', json => ({ ...json, projects: {} })), @@ -396,7 +397,7 @@ describe('Update 8-0-0', () => { .runSchematicAsync('update-8.0.0', {}, initialTree) .toPromise(); - const defaultCollection = readJsonInTree(tree, 'angular.json').cli + const defaultCollection = readJsonInTree(tree, 'workspace.json').cli .defaultCollection; expect(defaultCollection).toEqual('@nrwl/workspace'); }); diff --git a/packages/schematics/migrations/update-8-0-0/update-8-0-0.ts b/packages/schematics/migrations/update-8-0-0/update-8-0-0.ts index 187da9be1c..7b043d9995 100644 --- a/packages/schematics/migrations/update-8-0-0/update-8-0-0.ts +++ b/packages/schematics/migrations/update-8-0-0/update-8-0-0.ts @@ -11,7 +11,8 @@ import { insert, readJsonInTree, updateJsonInTree, - addUpdateTask + addUpdateTask, + updateWorkspaceInTree } from '@nrwl/workspace'; import { createSourceFile, @@ -31,7 +32,7 @@ function addDependencies() { return (host: Tree, context: SchematicContext) => { const dependencies = readJsonInTree(host, 'package.json').dependencies; const builders = new Set(); - const projects = readJsonInTree(host, 'angular.json').projects; + const projects = readJsonInTree(host, 'workspace.json').projects; Object.values(projects) .filter( project => @@ -110,7 +111,7 @@ const updateUpdateScript = updateJsonInTree('package.json', json => { return json; }); -const updateBuilders = updateJsonInTree('angular.json', json => { +const updateBuilders = updateWorkspaceInTree(json => { if (!json.projects) { return json; } @@ -285,7 +286,7 @@ const updateDefaultCollection = (host: Tree, context: SchematicContext) => { 'package.json' ); - return updateJsonInTree('angular.json', json => { + return updateWorkspaceInTree(json => { json.cli = json.cli || {}; if (dependencies['@nrwl/angular']) { json.cli.defaultCollection = '@nrwl/angular'; diff --git a/packages/schematics/src/migrator/migrator.ts b/packages/schematics/src/migrator/migrator.ts index 5be556b8d5..5b1edd6a35 100644 --- a/packages/schematics/src/migrator/migrator.ts +++ b/packages/schematics/src/migrator/migrator.ts @@ -1,7 +1,7 @@ import * as fs from 'fs'; import * as path from 'path'; -import { updateJsonFile, readCliConfigFile } from '@nrwl/workspace'; +import { updateJsonFile, readWorkspaceConfigPath } from '@nrwl/workspace'; type Migration = { description: string; run(): void }; type MigrationName = { name: string; migration: Migration }; @@ -32,7 +32,7 @@ updateLatestMigration(); console.log('All migrations run successfully'); function readLatestMigration(): string { - const angularCli = readCliConfigFile(); + const angularCli = readWorkspaceConfigPath(); return angularCli.project.latestMigration; } diff --git a/packages/tao/index.ts b/packages/tao/index.ts new file mode 100644 index 0000000000..538d814790 --- /dev/null +++ b/packages/tao/index.ts @@ -0,0 +1,44 @@ +#!/usr/bin/env node +import './src/compat/angular-cli-compat'; + +export async function invokeCommand( + command: string, + root: string, + commandArgs: string[] +) { + if (command === undefined) { + command = 'help'; + } + switch (command) { + case 'new': + return (await import('./src/commands/generate')).taoNew( + root, + commandArgs + ); + case 'generate': + case 'g': + return (await import('./src/commands/generate')).generate( + root, + commandArgs + ); + case 'run': + case 'r': + return (await import('./src/commands/run')).run(root, commandArgs); + case 'help': + case '--help': + return (await import('./src/commands/help')).printHelp(); + default: + // this is to make `tao test mylib` same as `tao run mylib:test` + return (await import('./src/commands/run')).run(root, [ + `${commandArgs[0]}:${command}`, + ...commandArgs.slice(1) + ]); + } +} + +export async function invokeCli(root: string, args: string[]) { + const [command, ...commandArgs] = args; + process.exit(await invokeCommand(command, root, commandArgs)); +} + +invokeCli(process.cwd(), process.argv.slice(2)); diff --git a/packages/tao/package.json b/packages/tao/package.json new file mode 100644 index 0000000000..8911fa4a71 --- /dev/null +++ b/packages/tao/package.json @@ -0,0 +1,41 @@ +{ + "name": "@nrwl/tao", + "version": "0.0.1", + "description": "CLI for generating code and running commands", + "repository": { + "type": "git", + "url": "git+https://github.com/nrwl/nx.git" + }, + "keywords": [ + "Monorepo", + "Angular", + "React", + "Web", + "Node", + "Nest", + "Jest", + "Cypress", + "CLI" + ], + "main": "index.js", + "types": "index.d.ts", + "author": "Victor Savkin", + "license": "MIT", + "bugs": { + "url": "https://github.com/nrwl/nx/issues" + }, + "bin": { + "tao": "./index.js" + }, + "homepage": "https://nx.dev", + "peerDependencies": { + "@nrwl/workspace": "*" + }, + "dependencies": { + "@angular-devkit/schematics": "8.1.1", + "@angular-devkit/core": "8.1.1", + "@angular-devkit/architect": "0.801.1", + "inquirer": "^6.3.1", + "minimist": "^1.2.0" + } +} diff --git a/packages/tao/src/commands/generate.ts b/packages/tao/src/commands/generate.ts new file mode 100644 index 0000000000..9f53090a53 --- /dev/null +++ b/packages/tao/src/commands/generate.ts @@ -0,0 +1,354 @@ +import { + convertToCamelCase, + handleErrors, + Schema, + coerceTypes +} from '../shared/params'; +import { + JsonObject, + logging, + normalize, + schema, + tags, + terminal, + virtualFs, + experimental +} from '@angular-devkit/core'; +import { DryRunEvent, HostTree, Schematic } from '@angular-devkit/schematics'; +import { NodeJsSyncHost } from '@angular-devkit/core/node'; +import { NodeWorkflow } from '@angular-devkit/schematics/tools'; +import * as inquirer from 'inquirer'; +import { logger } from '../shared/logger'; +import { printHelp, commandName } from '../shared/print-help'; +import * as fs from 'fs'; +import minimist = require('minimist'); + +interface GenerateOptions { + collectionName: string; + schematicName: string; + schematicOptions: { [k: string]: string }; + help: boolean; + debug: boolean; + dryRun: boolean; + force: boolean; + interactive: boolean; + defaults: boolean; +} + +function throwInvalidInvocation() { + throw new Error( + `Specify the schematic name (e.g., ${commandName} generate collection-name:schematic-name)` + ); +} + +function parseGenerateOpts( + args: string[], + mode: 'generate' | 'new', + defaultCollection: string | null +): GenerateOptions { + const schematicOptions = convertToCamelCase( + minimist(args, { + boolean: ['help', 'dryRun', 'debug', 'force', 'interactive'], + alias: { + dryRun: 'dry-run' + }, + default: { + debug: false, + dryRun: false, + interactive: true + } + }) + ); + + let collectionName = null; + let schematicName = null; + if (mode === 'generate') { + if (!schematicOptions['_'] || schematicOptions['_'].length === 0) { + throwInvalidInvocation(); + } + [collectionName, schematicName] = schematicOptions['_'].shift()!.split(':'); + if (!schematicName) { + schematicName = collectionName; + collectionName = defaultCollection; + } + } else { + collectionName = schematicOptions.collection; + schematicName = ''; + } + + if (!collectionName) { + throwInvalidInvocation(); + } + + const res = { + collectionName, + schematicName, + schematicOptions, + help: schematicOptions.help, + debug: schematicOptions.debug, + dryRun: schematicOptions.dryRun, + force: schematicOptions.force, + interactive: schematicOptions.interactive, + defaults: schematicOptions.defaults + }; + + delete schematicOptions.debug; + delete schematicOptions.dryRun; + delete schematicOptions.force; + delete schematicOptions.interactive; + delete schematicOptions.defaults; + delete schematicOptions.help; + delete schematicOptions['--']; + return res; +} + +function createRecorder(record: any, logger: logging.Logger) { + return (event: DryRunEvent) => { + const eventPath = event.path.startsWith('/') + ? event.path.substr(1) + : event.path; + if (event.kind === 'error') { + record.error = true; + logger.warn( + `ERROR! ${eventPath} ${ + event.description == 'alreadyExist' + ? 'already exists' + : 'does not exist.' + }.` + ); + } else if (event.kind === 'update') { + record.loggingQueue.push( + tags.oneLine`${terminal.white('UPDATE')} ${eventPath} (${ + event.content.length + } bytes)` + ); + } else if (event.kind === 'create') { + record.loggingQueue.push( + tags.oneLine`${terminal.green('CREATE')} ${eventPath} (${ + event.content.length + } bytes)` + ); + } else if (event.kind === 'delete') { + record.loggingQueue.push(`${terminal.yellow('DELETE')} ${eventPath}`); + } else if (event.kind === 'rename') { + record.loggingQueue.push( + `${terminal.blue('RENAME')} ${eventPath} => ${event.to}` + ); + } + }; +} + +function createWorkflow( + fsHost: virtualFs.Host, + root: string, + opts: GenerateOptions +) { + const workflow = new NodeWorkflow(fsHost, { + force: opts.force, + dryRun: opts.dryRun, + packageManager: 'yarn', + root: normalize(root) + }); + const _params = opts.schematicOptions._; + delete opts.schematicOptions._; + workflow.registry.addSmartDefaultProvider('argv', (schema: JsonObject) => { + if ('index' in schema) { + return _params[Number(schema['index'])]; + } else { + return _params; + } + }); + + if (opts.interactive !== false && isTTY()) { + workflow.registry.usePromptProvider( + (definitions: Array) => { + const questions: inquirer.Questions = definitions.map(definition => { + const question = { + name: definition.id, + message: definition.message, + default: definition.default as any + } as any; + + const validator = definition.validator; + if (validator) { + question.validate = (input: any) => validator(input); + } + + switch (definition.type) { + case 'confirmation': + question.type = 'confirm'; + break; + case 'list': + question.type = !!definition.multiselect ? 'checkbox' : 'list'; + question.choices = + definition.items && + definition.items.map(item => { + if (typeof item == 'string') { + return item; + } else { + return { + name: item.label, + value: item.value + }; + } + }); + break; + default: + question.type = definition.type; + break; + } + return question; + }); + + return inquirer.prompt(questions); + } + ); + } + return workflow; +} + +function getCollection(workflow: NodeWorkflow, name: string) { + const collection = workflow.engine.createCollection(name); + if (!collection) throw new Error(`Cannot find collection '${name}'`); + return collection; +} + +function printGenHelp(opts: GenerateOptions, schema: Schema) { + printHelp( + `${commandName} generate ${opts.collectionName}:${opts.schematicName}`, + schema + ); +} + +async function getSchematicDefaults( + root: string, + collection: string, + schematic: string +) { + const workspace = await new experimental.workspace.Workspace( + normalize(root) as any, + new NodeJsSyncHost() + ) + .loadWorkspaceFromHost('workspace.json' as any) + .toPromise(); + + let result = {}; + if (workspace.getSchematics()) { + const schematicObject = workspace.getSchematics()[ + `${collection}:${schematic}` + ]; + if (schematicObject) { + result = { ...result, ...(schematicObject as {}) }; + } + const collectionObject = workspace.getSchematics()[collection]; + if ( + typeof collectionObject == 'object' && + !Array.isArray(collectionObject) + ) { + result = { ...result, ...(collectionObject[schematic] as {}) }; + } + } + return result; +} + +async function runSchematic( + root: string, + workflow: NodeWorkflow, + logger: logging.Logger, + opts: GenerateOptions, + schematic: Schematic +): Promise { + const flattenedSchema = await workflow.registry + .flatten(schematic.description.schemaJson!) + .toPromise(); + + if (opts.help) { + printGenHelp(opts, flattenedSchema as any); + } else { + const defaults = + opts.schematicName === 'tao-new' + ? {} + : await getSchematicDefaults( + root, + opts.collectionName, + opts.schematicName + ); + const record = { loggingQueue: [] as string[], error: false }; + workflow.reporter.subscribe(createRecorder(record, logger)); + const schematicOptions = coerceTypes( + opts.schematicOptions, + flattenedSchema as any + ); + await workflow + .execute({ + collection: opts.collectionName, + schematic: opts.schematicName, + options: { ...defaults, ...schematicOptions }, + debug: opts.debug, + logger + }) + .toPromise(); + if (!record.error) { + record.loggingQueue.forEach(log => logger.info(log)); + } + if (opts.dryRun) { + logger.warn(`\nNOTE: The "dryRun" flag means no changes were made.`); + } + } + return 0; +} + +export async function generate(root: string, args: string[]) { + return handleErrors(logger, async () => { + const fsHost = new virtualFs.ScopedHost( + new NodeJsSyncHost(), + normalize(root) + ); + const opts = parseGenerateOpts( + args, + 'generate', + await readDefaultCollection(fsHost) + ); + const workflow = createWorkflow(fsHost, root, opts); + const collection = getCollection(workflow, opts.collectionName); + const schematic = collection.createSchematic(opts.schematicName, true); + return runSchematic( + root, + workflow, + logger, + { ...opts, schematicName: schematic.description.name }, + schematic + ); + }); +} + +async function readDefaultCollection(host: virtualFs.Host) { + const workspaceJson = JSON.parse( + new HostTree(host).read('workspace.json')!.toString() + ); + return workspaceJson.cli ? workspaceJson.cli.defaultCollection : null; +} + +export async function taoNew(root: string, args: string[]) { + return handleErrors(logger, async () => { + const fsHost = new virtualFs.ScopedHost( + new NodeJsSyncHost(), + normalize(root) + ); + const opts = parseGenerateOpts(args, 'new', null); + const workflow = createWorkflow(fsHost, root, opts); + const collection = getCollection(workflow, opts.collectionName); + const schematic = collection.createSchematic('tao-new', true); + return runSchematic( + root, + workflow, + logger, + { ...opts, schematicName: schematic.description.name }, + schematic + ); + }); +} + +function isTTY(): boolean { + return !!process.stdout.isTTY && !!process.env['CI']; +} diff --git a/packages/tao/src/commands/help.ts b/packages/tao/src/commands/help.ts new file mode 100644 index 0000000000..9b50bcf218 --- /dev/null +++ b/packages/tao/src/commands/help.ts @@ -0,0 +1,35 @@ +import { tags } from '@angular-devkit/core'; +import { logger } from '../shared/logger'; +import { toolDescription, commandName } from '../shared/print-help'; +import { terminal } from '@angular-devkit/core'; + +export function printHelp() { + logger.info(tags.stripIndent` + ${terminal.bold(toolDescription)} + + ${terminal.bold('Create a new project.')} + ${commandName} new ${terminal.grey( + '[project-name] [--collection=schematic-collection] [options, ...]' + )} + + ${terminal.bold('Generate code.')} + ${commandName} generate ${terminal.grey( + '[schematic-collection:][schematic] [options, ...]' + )} + ${commandName} g ${terminal.grey( + '[schematic-collection:][schematic] [options, ...]' + )} + + ${terminal.bold('Run target.')} + ${commandName} run ${terminal.grey( + '[project][:target][:configuration] [options, ...]' + )} + ${commandName} r ${terminal.grey( + '[project][:target][:configuration] [options, ...]' + )} + + You can also use the infix notation to run a target: + ${commandName} [target] [project] [options, ...] + `); + return 0; +} diff --git a/packages/tao/src/commands/run.ts b/packages/tao/src/commands/run.ts new file mode 100644 index 0000000000..ba9d237420 --- /dev/null +++ b/packages/tao/src/commands/run.ts @@ -0,0 +1,123 @@ +import { + convertToCamelCase, + handleErrors, + Schema, + coerceTypes +} from '../shared/params'; +import { + experimental, + json, + normalize, + schema, + tags +} from '@angular-devkit/core'; +import { NodeJsSyncHost } from '@angular-devkit/core/node'; +import { WorkspaceNodeModulesArchitectHost } from '@angular-devkit/architect/node'; +import { Architect } from '@angular-devkit/architect'; +import { logger } from '../shared/logger'; +import minimist = require('minimist'); +import { printHelp, commandName } from '../shared/print-help'; + +export interface RunOptions { + project: string; + target: string; + configuration: string; + help: boolean; + runOptions: { [k: string]: any }; +} + +function throwInvalidInvocation() { + throw new Error( + `Specify the project name and the target (e.g., ${commandName} run proj:build)` + ); +} + +function parseRunOpts( + args: string[], + defaultProjectName: string | null +): RunOptions { + const runOptions = convertToCamelCase( + minimist(args, { + boolean: ['help', 'prod'], + string: ['configuration', 'project'] + }) + ); + const help = runOptions.help; + if (!runOptions._ || !runOptions._[0]) { + throwInvalidInvocation(); + } + let [project, target, configuration] = runOptions._[0].split(':'); + if (!project && defaultProjectName) project = defaultProjectName; + if (!project || !target) { + throwInvalidInvocation(); + } + if (runOptions.configuration) { + configuration = runOptions.configuration; + } + if (runOptions.prod) { + configuration = 'production'; + } + if (runOptions.project) { + project = runOptions.project; + } + const res = { project, target, configuration, help, runOptions }; + delete runOptions['help']; + delete runOptions['_']; + delete runOptions['configuration']; + delete runOptions['prod']; + delete runOptions['project']; + + return res; +} + +function printRunHelp(opts: RunOptions, schema: Schema) { + printHelp(`${commandName} run ${opts.project}:${opts.target}`, schema); +} + +export async function run(root: string, args: string[]) { + return handleErrors(logger, async () => { + const fsHost = new NodeJsSyncHost(); + const workspace = await new experimental.workspace.Workspace( + normalize(root) as any, + fsHost + ) + .loadWorkspaceFromHost('workspace.json' as any) + .toPromise(); + const opts = parseRunOpts(args, workspace.getDefaultProjectName()); + + const registry = new json.schema.CoreSchemaRegistry(); + registry.addPostTransform(schema.transforms.addUndefinedDefaults); + const architectHost = new WorkspaceNodeModulesArchitectHost( + workspace, + root + ); + const architect = new Architect(architectHost, registry); + + const builderConf = await architectHost.getBuilderNameForTarget({ + project: opts.project, + target: opts.target + }); + const builderDesc = await architectHost.resolveBuilder(builderConf); + const flattenedSchema = await registry + .flatten(builderDesc.optionSchema! as json.JsonObject) + .toPromise(); + if (opts.help) { + printRunHelp(opts, flattenedSchema as any); + return 0; + } else { + const runOptions = coerceTypes(opts.runOptions, flattenedSchema as any); + const run = await architect.scheduleTarget( + { + project: opts.project, + target: opts.target, + configuration: opts.configuration + }, + runOptions, + { logger } + ); + const result = await run.output.toPromise(); + await run.stop(); + return result.success ? 0 : 1; + } + }); +} diff --git a/packages/tao/src/compat/angular-cli-compat.ts b/packages/tao/src/compat/angular-cli-compat.ts new file mode 100644 index 0000000000..9a47abd1dd --- /dev/null +++ b/packages/tao/src/compat/angular-cli-compat.ts @@ -0,0 +1,24 @@ +const Module = require('module'); +const originalRequire = Module.prototype.require; + +Module.prototype.require = function() { + const result = originalRequire.apply(this, arguments); + if (arguments[0].startsWith('@angular-devkit/core')) { + const Workspace = originalRequire.apply(this, [ + `@angular-devkit/core/src/experimental/workspace` + ]).Workspace; + Workspace._workspaceFileNames = [ + 'workspace.json', + ...Workspace._workspaceFileNames + ]; + const core = originalRequire.apply(this, [ + `@angular-devkit/core/src/workspace/core` + ]); + core._test_addWorkspaceFile('workspace.json', core.WorkspaceFormat.JSON); + } + return result; +}; + +try { + require('@angular-devkit/build-angular/src/utils/version').Version.assertCompatibleAngularVersion = () => {}; +} catch (e) {} diff --git a/packages/tao/src/shared/logger.ts b/packages/tao/src/shared/logger.ts new file mode 100644 index 0000000000..09d4c19d45 --- /dev/null +++ b/packages/tao/src/shared/logger.ts @@ -0,0 +1,13 @@ +import { createConsoleLogger } from '@angular-devkit/core/node'; +import { terminal } from '@angular-devkit/core'; + +export const logger = createConsoleLogger( + false, + process.stdout, + process.stderr, + { + warn: s => terminal.bold(terminal.yellow(s)), + error: s => terminal.bold(terminal.red(s)), + fatal: s => terminal.bold(terminal.red(s)) + } +); diff --git a/packages/tao/src/shared/params.spec.ts b/packages/tao/src/shared/params.spec.ts new file mode 100644 index 0000000000..63cb76a6f7 --- /dev/null +++ b/packages/tao/src/shared/params.spec.ts @@ -0,0 +1,35 @@ +import { convertToCamelCase } from './params'; + +describe('params', () => { + describe('convertToCamelCase', () => { + it('should convert dash case to camel case', () => { + expect( + convertToCamelCase({ + 'one-two': 1 + }) + ).toEqual({ + oneTwo: 1 + }); + }); + + it('should not convert camel case', () => { + expect( + convertToCamelCase({ + oneTwo: 1 + }) + ).toEqual({ + oneTwo: 1 + }); + }); + + it('should handle mixed case', () => { + expect( + convertToCamelCase({ + 'one-Two': 1 + }) + ).toEqual({ + oneTwo: 1 + }); + }); + }); +}); diff --git a/packages/tao/src/shared/params.ts b/packages/tao/src/shared/params.ts new file mode 100644 index 0000000000..8a30a61b1f --- /dev/null +++ b/packages/tao/src/shared/params.ts @@ -0,0 +1,50 @@ +import { logging } from '@angular-devkit/core'; +import { UnsuccessfulWorkflowExecution } from '@angular-devkit/schematics'; + +export type Schema = { + properties: { [p: string]: any }; + required: string[]; + description: string; +}; + +export async function handleErrors(logger: logging.Logger, fn: Function) { + try { + return await fn(); + } catch (err) { + if (err instanceof UnsuccessfulWorkflowExecution) { + logger.fatal('The Schematic workflow failed. See above.'); + } else { + logger.fatal(err.message); + } + return 1; + } +} + +export function convertToCamelCase(parsed: { + [k: string]: any; +}): { [k: string]: any } { + return Object.keys(parsed).reduce( + (m, c) => ({ ...m, [camelCase(c)]: parsed[c] }), + {} + ); +} +function camelCase(input: string): string { + if (input.indexOf('-') > 1) { + return input + .toLowerCase() + .replace(/-(.)/g, (match, group1) => group1.toUpperCase()); + } else { + return input; + } +} + +export function coerceTypes(opts: { [k: string]: any }, schema: Schema) { + Object.keys(opts).forEach(k => { + if (schema.properties[k] && schema.properties[k].type == 'boolean') { + opts[k] = opts[k] === true || opts[k] === 'true'; + } else if (schema.properties[k] && schema.properties[k].type == 'number') { + opts[k] = Number(opts[k]); + } + }); + return opts; +} diff --git a/packages/tao/src/shared/print-help.ts b/packages/tao/src/shared/print-help.ts new file mode 100644 index 0000000000..8223904ce9 --- /dev/null +++ b/packages/tao/src/shared/print-help.ts @@ -0,0 +1,44 @@ +import { Schema } from './params'; +import { logger } from './logger'; +import { tags } from '@angular-devkit/core'; +import { terminal } from '@angular-devkit/core'; + +export function printHelp(header: string, schema: Schema) { + const allPositional = Object.keys(schema.properties).filter(key => { + const p = schema.properties[key]; + return p['$default'] && p['$default']['$source'] === 'argv'; + }); + const positional = allPositional.length > 0 ? ` [${allPositional[0]}]` : ''; + const args = Object.keys(schema.properties) + .map(name => { + const d = schema.properties[name]; + const def = d.default ? ` (default: ${d.default})` : ''; + return formatOption(name, `${d.description}${def}`); + }) + .join('\n'); + + logger.info(tags.stripIndent` +${terminal.bold(header + positional + ' [options,...]')} + +${terminal.bold('Options')}: +${args} +${formatOption('help', 'Show available options for project target.')} + `); +} + +function formatOption(name: string, description: string) { + return ` --${(name + ' ').substr(0, 22)}${terminal.grey( + description + )}`; +} + +export let commandName = 'nx'; +export let toolDescription = 'Nx - Extensible Dev Tools for Monorepos.'; + +export function setCommandNameAndDescription( + name: string, + description: string +) { + commandName = name; + toolDescription = description; +} diff --git a/packages/web/src/schematics/application/application.spec.ts b/packages/web/src/schematics/application/application.spec.ts index 3a3c64a58a..99f752e313 100644 --- a/packages/web/src/schematics/application/application.spec.ts +++ b/packages/web/src/schematics/application/application.spec.ts @@ -13,15 +13,15 @@ describe('app', () => { }); describe('not nested', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic('app', { name: 'myApp' }, appTree); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-app'].root).toEqual('apps/my-app'); - expect(angularJson.projects['my-app-e2e'].root).toEqual( + expect(workspaceJson.projects['my-app'].root).toEqual('apps/my-app'); + expect(workspaceJson.projects['my-app-e2e'].root).toEqual( 'apps/my-app-e2e' ); - expect(angularJson.defaultProject).toEqual('my-app'); + expect(workspaceJson.defaultProject).toEqual('my-app'); }); it('should update nx.json', async () => { @@ -78,18 +78,18 @@ describe('app', () => { }); describe('nested', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic( 'app', { name: 'myApp', directory: 'myDir' }, appTree ); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-dir-my-app'].root).toEqual( + expect(workspaceJson.projects['my-dir-my-app'].root).toEqual( 'apps/my-dir/my-app' ); - expect(angularJson.projects['my-dir-my-app-e2e'].root).toEqual( + expect(workspaceJson.projects['my-dir-my-app-e2e'].root).toEqual( 'apps/my-dir/my-app-e2e' ); }); @@ -217,8 +217,8 @@ describe('app', () => { }, appTree ); - const angularJson = readJsonInTree(tree, 'angular.json'); - const architectConfig = angularJson.projects['my-app'].architect; + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + const architectConfig = workspaceJson.projects['my-app'].architect; expect(architectConfig.build.builder).toEqual('@nrwl/web:build'); expect(architectConfig.build.options).toEqual({ assets: ['apps/my-app/src/favicon.ico', 'apps/my-app/src/assets'], @@ -262,8 +262,8 @@ describe('app', () => { }, appTree ); - const angularJson = readJsonInTree(tree, 'angular.json'); - const architectConfig = angularJson.projects['my-app'].architect; + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + const architectConfig = workspaceJson.projects['my-app'].architect; expect(architectConfig.serve.builder).toEqual('@nrwl/web:dev-server'); expect(architectConfig.serve.options).toEqual({ buildTarget: 'my-app:build' @@ -281,11 +281,12 @@ describe('app', () => { }, appTree ); - const angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['my-app'].architect.lint).toEqual({ + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + + expect(workspaceJson.projects['my-app'].architect.lint).toEqual({ builder: '@angular-devkit/build-angular:tslint', options: { - exclude: ['**/node_modules/**'], + exclude: ['**/node_modules/**', '!apps/my-app/**'], tsConfig: [ 'apps/my-app/tsconfig.app.json', 'apps/my-app/tsconfig.spec.json' @@ -318,10 +319,10 @@ describe('app', () => { expect(tree.exists('apps/my-app/src/app/app.spec.ts')).toBeFalsy(); expect(tree.exists('apps/my-app/tsconfig.spec.json')).toBeFalsy(); expect(tree.exists('apps/my-app/jest.config.js')).toBeFalsy(); - const angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['my-app'].architect.test).toBeUndefined(); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['my-app'].architect.test).toBeUndefined(); expect( - angularJson.projects['my-app'].architect.lint.options.tsConfig + workspaceJson.projects['my-app'].architect.lint.options.tsConfig ).toEqual(['apps/my-app/tsconfig.app.json']); }); }); @@ -334,8 +335,8 @@ describe('app', () => { appTree ); expect(tree.exists('apps/my-app-e2e')).toBeFalsy(); - const angularJson = readJsonInTree(tree, 'angular.json'); - expect(angularJson.projects['my-app-e2e']).toBeUndefined(); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + expect(workspaceJson.projects['my-app-e2e']).toBeUndefined(); }); }); }); diff --git a/packages/web/src/schematics/application/application.ts b/packages/web/src/schematics/application/application.ts index 89e10dc1ef..4f3d4fbcd3 100644 --- a/packages/web/src/schematics/application/application.ts +++ b/packages/web/src/schematics/application/application.ts @@ -21,7 +21,10 @@ import { names, offsetFromRoot, getNpmScope, - formatFiles + formatFiles, + updateWorkspaceInTree, + generateProjectLint, + addGlobalLint } from '@nrwl/workspace'; import ngAdd from '../ng-add/ng-add'; @@ -58,7 +61,7 @@ function updateNxJson(options: NormalizedSchema): Rule { } function addProject(options: NormalizedSchema): Rule { - return updateJsonInTree('angular.json', json => { + return updateWorkspaceInTree(json => { const architect: { [key: string]: any } = {}; architect.build = { @@ -122,15 +125,11 @@ function addProject(options: NormalizedSchema): Rule { } }; - architect.lint = { - builder: '@angular-devkit/build-angular:tslint', - options: { - tsConfig: [ - join(normalize(options.appProjectRoot), 'tsconfig.app.json') - ], - exclude: ['**/node_modules/**'] - } - }; + architect.lint = generateProjectLint( + normalize(options.appProjectRoot), + join(normalize(options.appProjectRoot), 'tsconfig.app.json'), + options.linter + ); json.projects[options.projectName] = { root: options.appProjectRoot, @@ -154,6 +153,7 @@ export default function(schema: Schema): Rule { ngAdd({ skipFormat: true }), + addGlobalLint(options.linter), createApplicationFiles(options), updateNxJson(options), addProject(options), diff --git a/packages/web/src/schematics/application/schema.d.ts b/packages/web/src/schematics/application/schema.d.ts index 15edf64391..786900442e 100644 --- a/packages/web/src/schematics/application/schema.d.ts +++ b/packages/web/src/schematics/application/schema.d.ts @@ -1,5 +1,3 @@ -import { E2eTestRunner, UnitTestRunner } from '../../utils/test-runners'; - export interface Schema { name: string; prefix?: string; @@ -7,6 +5,7 @@ export interface Schema { skipFormat: boolean; directory?: string; tags?: string; - unitTestRunner: UnitTestRunner; - e2eTestRunner: E2eTestRunner; + unitTestRunner: 'jest' | 'none'; + e2eTestRunner: 'cypress' | 'none'; + linter: 'eslint' | 'tslint'; } diff --git a/packages/web/src/schematics/application/schema.json b/packages/web/src/schematics/application/schema.json index 31599003b5..83d2a389ef 100644 --- a/packages/web/src/schematics/application/schema.json +++ b/packages/web/src/schematics/application/schema.json @@ -42,6 +42,12 @@ ] } }, + "linter": { + "description": "The tool to use for running lint checks.", + "type": "string", + "enum": ["eslint", "tslint"], + "default": "tslint" + }, "skipFormat": { "description": "Skip formatting files", "type": "boolean", diff --git a/packages/web/src/schematics/ng-add/ng-add.spec.ts b/packages/web/src/schematics/ng-add/ng-add.spec.ts index e3c062b51b..f93293e852 100644 --- a/packages/web/src/schematics/ng-add/ng-add.spec.ts +++ b/packages/web/src/schematics/ng-add/ng-add.spec.ts @@ -23,13 +23,13 @@ describe('ng-add', () => { describe('defaultCollection', () => { it('should be set if none was set before', async () => { const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/web'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/web'); }); it('should be set if @nrwl/workspace was set before', async () => { tree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/workspace' }; @@ -39,13 +39,13 @@ describe('ng-add', () => { tree ); const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/web'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/web'); }); it('should not be set if something else was set before', async () => { tree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.cli = { defaultCollection: '@nrwl/angular' }; @@ -55,8 +55,8 @@ describe('ng-add', () => { tree ); const result = await runSchematic('ng-add', {}, tree); - const angularJson = readJsonInTree(result, 'angular.json'); - expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular'); + const workspaceJson = readJsonInTree(result, 'workspace.json'); + expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/angular'); }); }); }); diff --git a/packages/web/src/utils/serve-path.ts b/packages/web/src/utils/serve-path.ts index 86fade44bd..bfce3d9b4c 100644 --- a/packages/web/src/utils/serve-path.ts +++ b/packages/web/src/utils/serve-path.ts @@ -26,12 +26,12 @@ export function _findDefaultServePath( /^(\w+:)?\/\//.test(baseHref || '') || /^(\w+:)?\/\//.test(deployUrl || '') ) { - // If baseHref or deployUrl is absolute, unsupported by ng serve + // If baseHref or deployUrl is absolute, unsupported by nx serve return null; } // normalize baseHref - // for ng serve the starting base is always `/` so a relative + // for nx serve the starting base is always `/` so a relative // and root relative value are identical const baseHrefParts = (baseHref || '').split('/').filter(part => part !== ''); if (baseHref && !baseHref.endsWith('/')) { @@ -42,7 +42,7 @@ export function _findDefaultServePath( if (deployUrl && deployUrl[0] === '/') { if (baseHref && baseHref[0] === '/' && normalizedBaseHref !== deployUrl) { - // If baseHref and deployUrl are root relative and not equivalent, unsupported by ng serve + // If baseHref and deployUrl are root relative and not equivalent, unsupported by nx serve return null; } diff --git a/packages/workspace/collection.json b/packages/workspace/collection.json index e2ecbe2742..68e54b96a1 100644 --- a/packages/workspace/collection.json +++ b/packages/workspace/collection.json @@ -30,6 +30,13 @@ "hidden": true }, + "tao-new": { + "factory": "./src/schematics/tao-new/tao-new", + "schema": "./src/schematics/tao-new/schema.json", + "description": "Create a workspace", + "hidden": true + }, + "library": { "factory": "./src/schematics/library/library", "schema": "./src/schematics/library/schema.json", diff --git a/packages/workspace/index.ts b/packages/workspace/index.ts index 8ee83c9d5c..340762a715 100644 --- a/packages/workspace/index.ts +++ b/packages/workspace/index.ts @@ -11,7 +11,7 @@ export { renameSync, updateJsonFile, readJsonFile, - readCliConfigFile, + readWorkspaceConfigPath, copyFile } from './src/utils/fileutils'; export { @@ -24,10 +24,15 @@ export { commandsObject, supportedNxCommands } from './src/command-line/nx-commands'; -export { readAngularJson, readNxJson, NxJson } from './src/command-line/shared'; +export { + readWorkspaceJson, + readNxJson, + NxJson +} from './src/command-line/shared'; export { readJsonInTree, updateJsonInTree, + updateWorkspaceInTree, insert, replaceNodeValue, addDepsToPackageJson, @@ -45,7 +50,6 @@ export { getNpmScope, getWorkspacePath, replaceAppNameWithPath, - angularSchematicNames, editTarget, parseTarget, serializeTarget @@ -53,8 +57,8 @@ export { export { getWorkspace, updateWorkspace } from './src/utils/workspace'; export { addUpdateTask } from './src/utils/update-task'; +export { addGlobalLint, generateProjectLint } from './src/utils/lint'; -export { closestCli } from './src/utils/app-root'; export { formatFiles } from './src/utils/rules/format-files'; export { deleteFile } from './src/utils/rules/deleteFile'; export * from './src/utils/rules/ng-add'; diff --git a/packages/workspace/migrations.json b/packages/workspace/migrations.json index 05a285fd44..f91f2ee54b 100644 --- a/packages/workspace/migrations.json +++ b/packages/workspace/migrations.json @@ -19,6 +19,11 @@ "version": "8.3.0-beta.1", "description": "Update Cypress to 3.4", "factory": "./src/migrations/update-8-3-0/update-cypress-to-34" + }, + "add-nx-script": { + "version": "8.4.0-beta.1", + "description": "Add 'nx' script to package.json", + "factory": "./src/migrations/update-8-4-0/add-nx-script" } } } diff --git a/packages/workspace/src/builders/run-commands/schema.json b/packages/workspace/src/builders/run-commands/schema.json index db7759bb34..79e368e3e5 100644 --- a/packages/workspace/src/builders/run-commands/schema.json +++ b/packages/workspace/src/builders/run-commands/schema.json @@ -28,7 +28,7 @@ }, "args": { "type": "string", - "description": "Extra arguments. You can pass them as follows: ng run project:target --args='--wait=100'. You can them use {args.wait} syntax to interpolate them in angular.json" + "description": "Extra arguments. You can pass them as follows: ng run project:target --args='--wait=100'. You can them use {args.wait} syntax to interpolate them in the workspace config file." } }, "required": ["commands"] diff --git a/packages/workspace/src/command-line/affected.ts b/packages/workspace/src/command-line/affected.ts index 4962763b2d..7c2b962ee3 100644 --- a/packages/workspace/src/command-line/affected.ts +++ b/packages/workspace/src/command-line/affected.ts @@ -15,7 +15,7 @@ import { parseFiles, getAllProjectsWithTarget, getAffectedProjectsWithTarget, - readAngularJson, + readWorkspaceJson, printArgsWarning } from './shared'; import { generateGraph } from './dep-graph'; @@ -46,8 +46,7 @@ export interface AffectedOptions { quiet?: boolean; } -// Commands that can do `ng [command]` -const ngCommands = ['build', 'test', 'lint', 'e2e']; +const commonCommands = ['build', 'test', 'lint', 'e2e']; export function affected(parsedArgs: YargsAffectedOptions): void { const target = parsedArgs.target; @@ -187,25 +186,25 @@ async function runCommand( output.addVerticalSeparator(); - const angularJson = readAngularJson(); + const workspaceJson = readWorkspaceJson(); const projectMetadata = new Map(); projects.forEach(project => { - projectMetadata.set(project, angularJson.projects[project]); + projectMetadata.set(project, workspaceJson.projects[project]); }); - // Make sure the `package.json` has the `ng: "ng"` command needed by `npm-run-all` + // Make sure the `package.json` has the `nx: "nx"` command needed by `npm-run-all` const packageJson = JSON.parse( fs.readFileSync('./package.json').toString('utf-8') ); - if (!packageJson.scripts || !packageJson.scripts.ng) { + if (!packageJson.scripts || !packageJson.scripts.nx) { output.error({ title: - 'The "scripts" section of your `package.json` must contain `"ng": "ng"`', + 'The "scripts" section of your `package.json` must contain `"nx": "nx"`', bodyLines: [ output.colors.gray('...'), ' "scripts": {', output.colors.gray(' ...'), - ' "ng": "ng"', + ' "nx": "nx"', output.colors.gray(' ...'), ' }', output.colors.gray('...') @@ -216,17 +215,17 @@ async function runCommand( try { await runAll( - projects.map(app => { - return ngCommands.includes(targetName) - ? `ng -- ${targetName} --project=${app} ${transformArgs( + projects.map(proj => { + return commonCommands.includes(targetName) + ? `nx -- ${targetName} ${proj} ${transformArgs( args, - app, - projectMetadata.get(app) + proj, + projectMetadata.get(proj) ).join(' ')} ` - : `ng -- run ${app}:${targetName} ${transformArgs( + : `nx -- run ${proj}:${targetName} ${transformArgs( args, - app, - projectMetadata.get(app) + proj, + projectMetadata.get(proj) ).join(' ')} `; }), { @@ -310,15 +309,6 @@ function filterNxSpecificArgs(parsedArgs: YargsAffectedOptions): string[] { }); } -function ngPath() { - const basePath = path.dirname( - path.dirname( - path.dirname(resolve.sync('@angular/cli', { basedir: __dirname })) - ) - ); - return `"${path.join(basePath, 'bin', 'ng')}"`; -} - /** * These options are only for getting an array with properties of AffectedOptions. * diff --git a/packages/workspace/src/command-line/dep-graph.ts b/packages/workspace/src/command-line/dep-graph.ts index a28472a8ea..4a78f4c043 100644 --- a/packages/workspace/src/command-line/dep-graph.ts +++ b/packages/workspace/src/command-line/dep-graph.ts @@ -4,7 +4,7 @@ import * as opn from 'opn'; import { ProjectNode, ProjectType } from './affected-apps'; import * as yargs from 'yargs'; -import { getProjectNodes, readAngularJson, readNxJson } from './shared'; +import { getProjectNodes, readWorkspaceJson, readNxJson } from './shared'; import * as path from 'path'; import { tmpNameSync } from 'tmp'; import { @@ -340,9 +340,9 @@ export function generateGraph( args: UserOptions, criticalPath?: string[] ): void { - const angularJson = readAngularJson(); + const workspaceJson = readWorkspaceJson(); const nxJson = readNxJson(); - const projects: ProjectNode[] = getProjectNodes(angularJson, nxJson); + const projects: ProjectNode[] = getProjectNodes(workspaceJson, nxJson); const json = generateGraphJson(projects, criticalPath || []); const config = { diff --git a/packages/workspace/src/command-line/lint.ts b/packages/workspace/src/command-line/lint.ts index 40d3febd6f..34016af5bc 100644 --- a/packages/workspace/src/command-line/lint.ts +++ b/packages/workspace/src/command-line/lint.ts @@ -1,7 +1,7 @@ import { getProjectNodes, allFilesInDir, - readAngularJson, + readWorkspaceJson, readNxJson } from './shared'; import { WorkspaceIntegrityChecks } from './workspace-integrity-checks'; @@ -10,7 +10,7 @@ import { appRootPath } from '../utils/app-root'; import { output } from './output'; export function workspaceLint() { - const nodes = getProjectNodes(readAngularJson(), readNxJson()); + const nodes = getProjectNodes(readWorkspaceJson(), readNxJson()); const cliErrorOutputConfigs = new WorkspaceIntegrityChecks( nodes, diff --git a/packages/workspace/src/command-line/nx-commands.ts b/packages/workspace/src/command-line/nx-commands.ts index 9b2952dc42..afdb2301c9 100644 --- a/packages/workspace/src/command-line/nx-commands.ts +++ b/packages/workspace/src/command-line/nx-commands.ts @@ -6,6 +6,7 @@ import { format } from './format'; import { workspaceLint } from './lint'; import { workspaceSchematic } from './workspace-schematic'; import { generateGraph, OutputType } from './dep-graph'; +import { nxVersion } from '../utils/versions'; const noop = (yargs: yargs.Argv): yargs.Argv => yargs; @@ -37,6 +38,23 @@ export const supportedNxCommands = [ */ export const commandsObject = yargs .usage('Extensible Dev Tools for Monorepos') + .command( + 'run [project][:target][:configuration] [options, ...]', + ` + Run a target for a project + (e.g., nx run myapp:serve:production). + + You can also use the infix notation to run a target: + (e.g., nx serve myapp --configuration=production) + ` + ) + .command( + 'generate [schematic-collection:][schematic] [options, ...]', + ` + Generate code + (e.g., nx generate @nrwl/web:app myapp). + ` + ) .command( 'affected', 'Run task for affected projects', @@ -161,7 +179,7 @@ export const commandsObject = yargs () => workspaceSchematic(process.argv.slice(3)) ) .help('help') - .version() + .version(nxVersion) .option('quiet', { type: 'boolean', hidden: true }); function withFormatOptions(yargs: yargs.Argv): yargs.Argv { diff --git a/packages/workspace/src/command-line/nx-migrate.ts b/packages/workspace/src/command-line/nx-migrate.ts index 493405bee1..5e137949ba 100644 --- a/packages/workspace/src/command-line/nx-migrate.ts +++ b/packages/workspace/src/command-line/nx-migrate.ts @@ -1,7 +1,7 @@ import * as fs from 'fs'; import * as path from 'path'; -import { readCliConfigFile, updateJsonFile } from '../utils/fileutils'; +import { readWorkspaceConfigPath, updateJsonFile } from '../utils/fileutils'; type Migration = { description: string; run(): void }; type MigrationName = { name: string; migration: Migration }; @@ -32,7 +32,7 @@ updateLatestMigration(); console.log('All migrations run successfully'); function readLatestMigration(): string { - const angularCli = readCliConfigFile(); + const angularCli = readWorkspaceConfigPath(); return angularCli.project.latestMigration; } diff --git a/packages/workspace/src/command-line/shared.spec.ts b/packages/workspace/src/command-line/shared.spec.ts index 55944140f7..8d2d5a0db5 100644 --- a/packages/workspace/src/command-line/shared.spec.ts +++ b/packages/workspace/src/command-line/shared.spec.ts @@ -8,7 +8,7 @@ import { ProjectType, ProjectNode } from './affected-apps'; describe('assertWorkspaceValidity', () => { let mockNxJson; - let mockAngularJson; + let mockWorkspaceJson; beforeEach(() => { mockNxJson = { @@ -33,7 +33,7 @@ describe('assertWorkspaceValidity', () => { } } }; - mockAngularJson = { + mockWorkspaceJson = { projects: { app1: {}, 'app1-e2e': {}, @@ -46,23 +46,23 @@ describe('assertWorkspaceValidity', () => { }); it('should not throw for a valid workspace', () => { - assertWorkspaceValidity(mockAngularJson, mockNxJson); + assertWorkspaceValidity(mockWorkspaceJson, mockNxJson); }); - it('should throw for a missing project in angular.json', () => { - delete mockAngularJson.projects.app1; + it('should throw for a missing project in workspace.json', () => { + delete mockWorkspaceJson.projects.app1; try { - assertWorkspaceValidity(mockAngularJson, mockNxJson); + assertWorkspaceValidity(mockWorkspaceJson, mockNxJson); fail('Did not throw'); } catch (e) { - expect(e.message).toContain('projects are missing in angular.json'); + expect(e.message).toContain('projects are missing in'); } }); it('should throw for a missing project in nx.json', () => { delete mockNxJson.projects.app1; try { - assertWorkspaceValidity(mockAngularJson, mockNxJson); + assertWorkspaceValidity(mockWorkspaceJson, mockNxJson); fail('Did not throw'); } catch (e) { expect(e.message).toContain('projects are missing in nx.json'); @@ -74,7 +74,7 @@ describe('assertWorkspaceValidity', () => { 'README.md': ['invalidproj'] }; try { - assertWorkspaceValidity(mockAngularJson, mockNxJson); + assertWorkspaceValidity(mockWorkspaceJson, mockNxJson); fail('Did not throw'); } catch (e) { expect(e.message).toContain( @@ -89,7 +89,7 @@ describe('assertWorkspaceValidity', () => { mockNxJson.projects.app2.implicitDependencies = ['invalidproj']; try { - assertWorkspaceValidity(mockAngularJson, mockNxJson); + assertWorkspaceValidity(mockWorkspaceJson, mockNxJson); fail('Did not throw'); } catch (e) { expect(e.message).toContain( @@ -103,7 +103,7 @@ describe('assertWorkspaceValidity', () => { describe('getImplicitDependencies', () => { let mockNxJson: NxJson; - let mockAngularJson: any; + let mockworkspaceJson: any; beforeEach(() => { mockNxJson = { @@ -129,7 +129,7 @@ describe('getImplicitDependencies', () => { } } }; - mockAngularJson = { + mockworkspaceJson = { projects: { app1: { projectType: 'application' @@ -160,8 +160,8 @@ describe('getImplicitDependencies', () => { }; const result = getImplicitDependencies( - getProjectNodes(mockAngularJson, mockNxJson), - mockAngularJson, + getProjectNodes(mockworkspaceJson, mockNxJson), + mockworkspaceJson, mockNxJson ); @@ -182,8 +182,8 @@ describe('getImplicitDependencies', () => { }; const result = getImplicitDependencies( - getProjectNodes(mockAngularJson, mockNxJson), - mockAngularJson, + getProjectNodes(mockworkspaceJson, mockNxJson), + mockworkspaceJson, mockNxJson ); @@ -209,8 +209,8 @@ describe('getImplicitDependencies', () => { delete mockNxJson.projects.app1; try { getImplicitDependencies( - getProjectNodes(mockAngularJson, mockNxJson), - mockAngularJson, + getProjectNodes(mockworkspaceJson, mockNxJson), + mockworkspaceJson, mockNxJson ); fail('did not throw'); @@ -221,8 +221,8 @@ describe('getImplicitDependencies', () => { describe('project-based implicit dependencies', () => { it('should default appropriately', () => { const result = getImplicitDependencies( - getProjectNodes(mockAngularJson, mockNxJson), - mockAngularJson, + getProjectNodes(mockworkspaceJson, mockNxJson), + mockworkspaceJson, mockNxJson ); @@ -240,8 +240,8 @@ describe('getImplicitDependencies', () => { mockNxJson.projects.lib2.implicitDependencies = ['lib1']; const result = getImplicitDependencies( - getProjectNodes(mockAngularJson, mockNxJson), - mockAngularJson, + getProjectNodes(mockworkspaceJson, mockNxJson), + mockworkspaceJson, mockNxJson ); @@ -261,8 +261,8 @@ describe('getImplicitDependencies', () => { mockNxJson.projects['app1-e2e'].implicitDependencies = ['app2']; const result = getImplicitDependencies( - getProjectNodes(mockAngularJson, mockNxJson), - mockAngularJson, + getProjectNodes(mockworkspaceJson, mockNxJson), + mockworkspaceJson, mockNxJson ); @@ -278,8 +278,8 @@ describe('getImplicitDependencies', () => { mockNxJson.projects['app1-e2e'].implicitDependencies = []; const result = getImplicitDependencies( - getProjectNodes(mockAngularJson, mockNxJson), - mockAngularJson, + getProjectNodes(mockworkspaceJson, mockNxJson), + mockworkspaceJson, mockNxJson ); @@ -301,8 +301,8 @@ describe('getImplicitDependencies', () => { mockNxJson.projects.app2.implicitDependencies = ['app1']; const result = getImplicitDependencies( - getProjectNodes(mockAngularJson, mockNxJson), - mockAngularJson, + getProjectNodes(mockworkspaceJson, mockNxJson), + mockworkspaceJson, mockNxJson ); @@ -321,7 +321,7 @@ describe('getImplicitDependencies', () => { describe('getProjectNodes', () => { let mockNxJson; - let mockAngularJson; + let mockworkspaceJson; beforeEach(() => { mockNxJson = { @@ -343,7 +343,7 @@ describe('getProjectNodes', () => { } } }; - mockAngularJson = { + mockworkspaceJson = { projects: { app1: { projectType: 'application' @@ -366,7 +366,7 @@ describe('getProjectNodes', () => { it('should parse nodes as correct type', () => { const result: Pick[] = getProjectNodes( - mockAngularJson, + mockworkspaceJson, mockNxJson ).map(node => { return { name: node.name, type: node.type }; @@ -396,7 +396,7 @@ describe('getProjectNodes', () => { }); it('should normalize missing architect configurations to an empty object', () => { - const result = getProjectNodes(mockAngularJson, mockNxJson).map(node => { + const result = getProjectNodes(mockworkspaceJson, mockNxJson).map(node => { return { name: node.name, architect: node.architect }; }); expect(result).toEqual([ diff --git a/packages/workspace/src/command-line/shared.ts b/packages/workspace/src/command-line/shared.ts index c3396a2a7e..2e950bf53c 100644 --- a/packages/workspace/src/command-line/shared.ts +++ b/packages/workspace/src/command-line/shared.ts @@ -1,20 +1,20 @@ import { execSync } from 'child_process'; +import * as fs from 'fs'; import * as path from 'path'; +import { appRootPath } from '../utils/app-root'; +import { readJsonFile } from '../utils/fileutils'; +import { YargsAffectedOptions } from './affected'; import { affectedAppNames, AffectedFetcher, affectedLibNames, affectedProjectNames, + affectedProjectNamesWithTarget, ProjectNode, - ProjectType, - affectedProjectNamesWithTarget + ProjectType } from './affected-apps'; -import * as fs from 'fs'; -import { readJsonFile } from '../utils/fileutils'; -import { YargsAffectedOptions } from './affected'; -import { readDependencies, DepGraph, Deps } from './deps-calculator'; +import { Deps, readDependencies } from './deps-calculator'; import { touchedProjects } from './touched'; -import { appRootPath } from '../utils/app-root'; import { output } from './output'; const ignore = require('ignore'); @@ -214,10 +214,10 @@ function detectAndSetInvalidProjectValues( export function getImplicitDependencies( projects: ProjectNode[], - angularJson: any, + workspaceJson: any, nxJson: NxJson ): ImplicitDependencies { - assertWorkspaceValidity(angularJson, nxJson); + assertWorkspaceValidity(workspaceJson, nxJson); const implicitFileDeps = getFileLevelImplicitDependencies(projects, nxJson); const implicitProjectDeps = getProjectLevelImplicitDependencies(projects); @@ -228,30 +228,30 @@ export function getImplicitDependencies( }; } -export function assertWorkspaceValidity(angularJson, nxJson) { - const angularJsonProjects = Object.keys(angularJson.projects); +export function assertWorkspaceValidity(workspaceJson, nxJson) { + const workspaceJsonProjects = Object.keys(workspaceJson.projects); const nxJsonProjects = Object.keys(nxJson.projects); - if (minus(angularJsonProjects, nxJsonProjects).length > 0) { + if (minus(workspaceJsonProjects, nxJsonProjects).length > 0) { throw new Error( - `angular.json and nx.json are out of sync. The following projects are missing in nx.json: ${minus( - angularJsonProjects, + `${workspaceFileName()} and nx.json are out of sync. The following projects are missing in nx.json: ${minus( + workspaceJsonProjects, nxJsonProjects ).join(', ')}` ); } - if (minus(nxJsonProjects, angularJsonProjects).length > 0) { + if (minus(nxJsonProjects, workspaceJsonProjects).length > 0) { throw new Error( - `angular.json and nx.json are out of sync. The following projects are missing in angular.json: ${minus( + `${workspaceFileName()} and nx.json are out of sync. The following projects are missing in ${workspaceFileName()}: ${minus( nxJsonProjects, - angularJsonProjects + workspaceJsonProjects ).join(', ')}` ); } const projects = { - ...angularJson.projects, + ...workspaceJson.projects, ...nxJson.projects }; @@ -296,15 +296,15 @@ export function assertWorkspaceValidity(angularJson, nxJson) { } export function getProjectNodes( - angularJson: any, + workspaceJson: any, nxJson: NxJson ): ProjectNode[] { - assertWorkspaceValidity(angularJson, nxJson); + assertWorkspaceValidity(workspaceJson, nxJson); - const angularJsonProjects = Object.keys(angularJson.projects); + const workspaceJsonProjects = Object.keys(workspaceJson.projects); - return angularJsonProjects.map(key => { - const p = angularJson.projects[key]; + return workspaceJsonProjects.map(key => { + const p = workspaceJson.projects[key]; const tags = nxJson.projects[key].tags; const projectType = @@ -348,8 +348,24 @@ function minus(a: string[], b: string[]): string[] { return res; } -export function readAngularJson(): any { - return readJsonFile(`${appRootPath}/angular.json`); +export function readWorkspaceJson(): any { + return readJsonFile(`${appRootPath}/${workspaceFileName()}`); +} + +export function workspaceFileName() { + const packageJson = readPackageJson(); + if ( + packageJson.devDependencies['@angular/cli'] || + packageJson.dependencies['@angular/cli'] + ) { + return 'angular.json'; + } else { + return 'workspace.json'; + } +} + +export function readPackageJson(): any { + return readJsonFile(`${appRootPath}/package.json`); } export function readNxJson(): NxJson { @@ -363,10 +379,10 @@ export function readNxJson(): NxJson { export const getAffected = (affectedNamesFetcher: AffectedFetcher) => ( touchedFiles: string[] ): string[] => { - const angularJson = readAngularJson(); + const workspaceJson = readWorkspaceJson(); const nxJson = readNxJson(); - const projects = getProjectNodes(angularJson, nxJson); - const implicitDeps = getImplicitDependencies(projects, angularJson, nxJson); + const projects = getProjectNodes(workspaceJson, nxJson); + const implicitDeps = getImplicitDependencies(projects, workspaceJson, nxJson); const dependencies = readDependencies(nxJson.npmScope, projects); const sortedProjects = topologicallySortProjects(projects, dependencies); const tp = touchedProjects(implicitDeps, projects, touchedFiles); @@ -393,9 +409,9 @@ export function getAllProjectNamesWithTarget(target: string) { } export function getAllProjectsWithTarget(target: string) { - const angularJson = readAngularJson(); + const workspaceJson = readWorkspaceJson(); const nxJson = readNxJson(); - const projects = getProjectNodes(angularJson, nxJson); + const projects = getProjectNodes(workspaceJson, nxJson); const dependencies = readDependencies(nxJson.npmScope, projects); const sortedProjects = topologicallySortProjects(projects, dependencies); @@ -405,7 +421,7 @@ export function getAllProjectsWithTarget(target: string) { export function getProjectNames( predicate?: (projectNode: ProjectNode) => boolean ): string[] { - let projects = getProjectNodes(readAngularJson(), readNxJson()); + let projects = getProjectNodes(readWorkspaceJson(), readNxJson()); if (predicate) { projects = projects.filter(predicate); } @@ -414,7 +430,7 @@ export function getProjectNames( } export function getProjectRoots(projectNames: string[]): string[] { - const { projects } = readAngularJson(); + const { projects } = readWorkspaceJson(); return projectNames.map(name => projects[name].root); } @@ -454,7 +470,7 @@ export function lastModifiedAmongProjectFiles(projects: ProjectNode[]) { return Math.max( ...[ ...projects.map(project => getProjectMTime(project)), - mtime(`${appRootPath}/angular.json`), + mtime(`${appRootPath}/${workspaceFileName()}`), mtime(`${appRootPath}/nx.json`), mtime(`${appRootPath}/tslint.json`), mtime(`${appRootPath}/package.json`) diff --git a/packages/workspace/src/command-line/touched.ts b/packages/workspace/src/command-line/touched.ts index e86c143ee2..899779c9cf 100644 --- a/packages/workspace/src/command-line/touched.ts +++ b/packages/workspace/src/command-line/touched.ts @@ -1,6 +1,6 @@ import { ImplicitDependencies, - readAngularJson, + readWorkspaceJson, getProjectNodes, readNxJson, getImplicitDependencies @@ -26,10 +26,10 @@ export function touchedProjects( } export function getTouchedProjects(touchedFiles: string[]): string[] { - const angularJson = readAngularJson(); + const workspaceJson = readWorkspaceJson(); const nxJson = readNxJson(); - const projects = getProjectNodes(angularJson, nxJson); - const implicitDeps = getImplicitDependencies(projects, angularJson, nxJson); + const projects = getProjectNodes(workspaceJson, nxJson); + const implicitDeps = getImplicitDependencies(projects, workspaceJson, nxJson); return touchedProjects(implicitDeps, projects, touchedFiles).filter(p => !!p); } diff --git a/packages/workspace/src/command-line/workspace-integrity-checks.spec.ts b/packages/workspace/src/command-line/workspace-integrity-checks.spec.ts index 34c0a66334..01ca830928 100644 --- a/packages/workspace/src/command-line/workspace-integrity-checks.spec.ts +++ b/packages/workspace/src/command-line/workspace-integrity-checks.spec.ts @@ -3,7 +3,7 @@ import { ProjectType } from './affected-apps'; import chalk from 'chalk'; describe('WorkspaceIntegrityChecks', () => { - describe('angular.json is in sync with the filesystem', () => { + describe('workspace.json is in sync with the filesystem', () => { it('should not error when they are in sync', () => { const c = new WorkspaceIntegrityChecks( [ diff --git a/packages/workspace/src/command-line/workspace-integrity-checks.ts b/packages/workspace/src/command-line/workspace-integrity-checks.ts index 084273eb61..285595adc8 100644 --- a/packages/workspace/src/command-line/workspace-integrity-checks.ts +++ b/packages/workspace/src/command-line/workspace-integrity-checks.ts @@ -1,5 +1,6 @@ import { ProjectNode } from './affected-apps'; import { output, CLIErrorMessageConfig } from './output'; +import { workspaceFileName } from './shared'; export class WorkspaceIntegrityChecks { constructor(private projectNodes: ProjectNode[], private files: string[]) {} @@ -21,7 +22,7 @@ export class WorkspaceIntegrityChecks { ? [] : [ { - title: 'The angular.json file is out of sync', + title: `The ${workspaceFileName()} file is out of sync`, bodyLines: errorGroupBodyLines /** * TODO(JamesHenry): Add support for error documentation diff --git a/packages/workspace/src/command-line/workspace-schematic.ts b/packages/workspace/src/command-line/workspace-schematic.ts index e8bd4ce49e..23473a355e 100644 --- a/packages/workspace/src/command-line/workspace-schematic.ts +++ b/packages/workspace/src/command-line/workspace-schematic.ts @@ -125,7 +125,7 @@ function createWorkflow(dryRun: boolean) { function detectPackageManager(): string { try { - const packageManager = execSync(`ng config cli.packageManager`, { + const packageManager = execSync(`nx config cli.packageManager`, { stdio: ['ignore', 'pipe', 'ignore'] }) .toString() diff --git a/packages/workspace/src/migrations/update-8-2-0/update-8-2-0.spec.ts b/packages/workspace/src/migrations/update-8-2-0/update-8-2-0.spec.ts index 5655f0541d..67e990b6f7 100644 --- a/packages/workspace/src/migrations/update-8-2-0/update-8-2-0.spec.ts +++ b/packages/workspace/src/migrations/update-8-2-0/update-8-2-0.spec.ts @@ -12,7 +12,7 @@ describe('Update 8.2.0', () => { beforeEach(async () => { tree = createEmptyWorkspace(Tree.empty()); tree = await callRule( - updateJsonInTree('angular.json', json => { + updateJsonInTree('workspace.json', json => { json.projects['my-app'] = { root: 'my-app', architect: { @@ -34,8 +34,8 @@ describe('Update 8.2.0', () => { it('should add exclusions for files other than the project root', async () => { const result = await runMigration('update-8.2.0', {}, tree); - const angularJson = readJsonInTree(tree, 'angular.json'); - const project = angularJson.projects['my-app']; + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + const project = workspaceJson.projects['my-app']; expect(project.architect.lint).toEqual({ builder: '@angular-devkit/build-angular:tslint', options: { diff --git a/packages/workspace/src/migrations/update-8-4-0/add-nx-script.ts b/packages/workspace/src/migrations/update-8-4-0/add-nx-script.ts new file mode 100644 index 0000000000..fe1b817ead --- /dev/null +++ b/packages/workspace/src/migrations/update-8-4-0/add-nx-script.ts @@ -0,0 +1,12 @@ +import { updateJsonInTree } from '../../utils/ast-utils'; + +const addNxScript = updateJsonInTree('package.json', json => { + if (json.scripts && !json.scripts.nx) { + json.scripts.nx = 'nx'; + } + return json; +}); + +export default function() { + return addNxScript; +} diff --git a/packages/workspace/src/schematics/library/library.spec.ts b/packages/workspace/src/schematics/library/library.spec.ts index 09ced8ddf0..c5af8c33c2 100644 --- a/packages/workspace/src/schematics/library/library.spec.ts +++ b/packages/workspace/src/schematics/library/library.spec.ts @@ -13,13 +13,13 @@ describe('lib', () => { }); describe('not nested', () => { - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic('lib', { name: 'myLib' }, appTree); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-lib'].root).toEqual('libs/my-lib'); - expect(angularJson.projects['my-lib'].architect.build).toBeUndefined(); - expect(angularJson.projects['my-lib'].architect.lint).toEqual({ + expect(workspaceJson.projects['my-lib'].root).toEqual('libs/my-lib'); + expect(workspaceJson.projects['my-lib'].architect.build).toBeUndefined(); + expect(workspaceJson.projects['my-lib'].architect.lint).toEqual({ builder: '@angular-devkit/build-angular:tslint', options: { exclude: ['**/node_modules/**', '!libs/my-lib/**'], @@ -154,18 +154,18 @@ describe('lib', () => { expect(tree.exists(`libs/my-dir/my-lib/tslint.json`)).toBeTruthy(); }); - it('should update angular.json', async () => { + it('should update workspace.json', async () => { const tree = await runSchematic( 'lib', { name: 'myLib', directory: 'myDir' }, appTree ); - const angularJson = readJsonInTree(tree, '/angular.json'); + const workspaceJson = readJsonInTree(tree, '/workspace.json'); - expect(angularJson.projects['my-dir-my-lib'].root).toEqual( + expect(workspaceJson.projects['my-dir-my-lib'].root).toEqual( 'libs/my-dir/my-lib' ); - expect(angularJson.projects['my-dir-my-lib'].architect.lint).toEqual({ + expect(workspaceJson.projects['my-dir-my-lib'].architect.lint).toEqual({ builder: '@angular-devkit/build-angular:tslint', options: { exclude: ['**/node_modules/**', '!libs/my-dir/my-lib/**'], @@ -236,10 +236,10 @@ describe('lib', () => { ); expect(resultTree.exists('libs/my-lib/tsconfig.spec.json')).toBeFalsy(); expect(resultTree.exists('libs/my-lib/jest.config.js')).toBeFalsy(); - const angularJson = readJsonInTree(resultTree, 'angular.json'); - expect(angularJson.projects['my-lib'].architect.test).toBeUndefined(); + const workspaceJson = readJsonInTree(resultTree, 'workspace.json'); + expect(workspaceJson.projects['my-lib'].architect.test).toBeUndefined(); expect( - angularJson.projects['my-lib'].architect.lint.options.tsConfig + workspaceJson.projects['my-lib'].architect.lint.options.tsConfig ).toEqual(['libs/my-lib/tsconfig.lib.json']); }); }); diff --git a/packages/workspace/src/schematics/library/library.ts b/packages/workspace/src/schematics/library/library.ts index 6481d78066..a421dc3c0a 100644 --- a/packages/workspace/src/schematics/library/library.ts +++ b/packages/workspace/src/schematics/library/library.ts @@ -14,11 +14,12 @@ import { import { join, normalize } from '@angular-devkit/core'; import { Schema } from './schema'; -import { NxJson } from '@nrwl/workspace'; +import { NxJson, updateWorkspaceInTree } from '@nrwl/workspace'; import { updateJsonInTree, readJsonInTree } from '@nrwl/workspace'; import { toFileName, names } from '@nrwl/workspace'; import { formatFiles } from '@nrwl/workspace'; import { offsetFromRoot } from '@nrwl/workspace'; +import { generateProjectLint, addGlobalLint } from '../../utils/lint'; export interface NormalizedSchema extends Schema { name: string; @@ -29,19 +30,14 @@ export interface NormalizedSchema extends Schema { } function addProject(options: NormalizedSchema): Rule { - return updateJsonInTree('angular.json', json => { + return updateWorkspaceInTree(json => { const architect: { [key: string]: any } = {}; - architect.lint = { - builder: '@angular-devkit/build-angular:tslint', - options: { - tsConfig: [join(normalize(options.projectRoot), 'tsconfig.lib.json')], - exclude: [ - '**/node_modules/**', - '!' + join(normalize(options.projectRoot), '**') - ] - } - }; + architect.lint = generateProjectLint( + normalize(options.projectRoot), + join(normalize(options.projectRoot), 'tsconfig.lib.json'), + options.linter + ); json.projects[options.name] = { root: options.projectRoot, @@ -95,6 +91,7 @@ export default function(schema: Schema): Rule { return (host: Tree, context: SchematicContext) => { const options = normalizeOptions(schema); return chain([ + addGlobalLint(options.linter), createFiles(options), !options.skipTsConfig ? updateTsConfig(options) : noop(), addProject(options), diff --git a/packages/workspace/src/schematics/library/schema.d.ts b/packages/workspace/src/schematics/library/schema.d.ts index 5c8f50c1ae..d597b860ab 100644 --- a/packages/workspace/src/schematics/library/schema.d.ts +++ b/packages/workspace/src/schematics/library/schema.d.ts @@ -7,6 +7,6 @@ export interface Schema { skipFormat: boolean; tags?: string; simpleModuleName: boolean; - - unitTestRunner: UnitTestRunner; + unitTestRunner: 'jest' | 'none'; + linter: 'eslint' | 'tslint'; } diff --git a/packages/workspace/src/schematics/library/schema.json b/packages/workspace/src/schematics/library/schema.json index 2ca423e0a1..33d7522e81 100644 --- a/packages/workspace/src/schematics/library/schema.json +++ b/packages/workspace/src/schematics/library/schema.json @@ -18,6 +18,12 @@ "description": "A directory where the app is placed", "x-prompt": "In which directory should the library be generated?" }, + "linter": { + "description": "The tool to use for running lint checks.", + "type": "string", + "enum": ["eslint", "tslint"], + "default": "tslint" + }, "unitTestRunner": { "type": "string", "enum": ["jest", "none"], diff --git a/packages/workspace/src/schematics/ng-add/ng-add.ts b/packages/workspace/src/schematics/ng-add/ng-add.ts index 00428a67f1..c32802f99f 100755 --- a/packages/workspace/src/schematics/ng-add/ng-add.ts +++ b/packages/workspace/src/schematics/ng-add/ng-add.ts @@ -27,7 +27,8 @@ import { serializeJson, toFileName, updateJsonFile, - updateJsonInTree + updateJsonInTree, + getWorkspacePath } from '@nrwl/workspace'; import { DEFAULT_NRWL_PRETTIER_CONFIG } from '../workspace/workspace'; import { JsonArray } from '@angular-devkit/core'; @@ -239,9 +240,9 @@ function serializeLoadChildren({ function updateTsConfigsJson(options: Schema) { return (host: Tree) => { - const angularJson = readJsonInTree(host, 'angular.json'); - const app = angularJson.projects[options.name]; - const e2eProject = getE2eProject(angularJson); + const workspaceJson = readJsonInTree(host, 'angular.json'); + const app = workspaceJson.projects[options.name]; + const e2eProject = getE2eProject(workspaceJson); const offset = '../../'; updateJsonFile(app.architect.build.options.tsConfig, json => { @@ -300,8 +301,8 @@ function updateTsLint() { function updateProjectTsLint(options: Schema) { return (host: Tree) => { - const angularJson = readJsonInTree(host, '/angular.json'); - const app = angularJson.projects[options.name]; + const workspaceJson = readJsonInTree(host, getWorkspacePath(host)); + const app = workspaceJson.projects[options.name]; const offset = '../../'; if (host.exists(`${app.root}/tslint.json`)) { @@ -350,16 +351,16 @@ function getFilename(path: string) { return path.split('/').pop(); } -function getE2eKey(angularJson: any) { - return Object.keys(angularJson.projects).find(key => { - return !!angularJson.projects[key].architect.e2e; +function getE2eKey(workspaceJson: any) { + return Object.keys(workspaceJson.projects).find(key => { + return !!workspaceJson.projects[key].architect.e2e; }); } -function getE2eProject(angularJson: any) { - const key = getE2eKey(angularJson); +function getE2eProject(workspaceJson: any) { + const key = getE2eKey(workspaceJson); if (key) { - return angularJson.projects[key]; + return workspaceJson.projects[key]; } else { return null; } @@ -367,9 +368,9 @@ function getE2eProject(angularJson: any) { function moveExistingFiles(options: Schema) { return (host: Tree, context: SchematicContext) => { - const angularJson = readJsonInTree(host, 'angular.json'); - const app = angularJson.projects[options.name]; - const e2eApp = getE2eProject(angularJson); + const workspaceJson = readJsonInTree(host, getWorkspacePath(host)); + const app = workspaceJson.projects[options.name]; + const e2eApp = getE2eProject(workspaceJson); // No context is passed because it should not be required to have a browserslist moveOutOfSrc(options.name, 'browserslist'); @@ -410,7 +411,7 @@ function moveExistingFiles(options: Schema) { if (e2eApp) { const oldE2eRoot = 'e2e'; - const newE2eRoot = join('apps', getE2eKey(angularJson) + '-e2e'); + const newE2eRoot = join('apps', getE2eKey(workspaceJson) + '-e2e'); renameSync(oldE2eRoot, newE2eRoot, err => { if (!err) { context.logger.info(`Renamed ${oldE2eRoot} -> ${newE2eRoot}`); @@ -431,7 +432,7 @@ function moveExistingFiles(options: Schema) { function createAdditionalFiles(options: Schema): Rule { return (host: Tree, _context: SchematicContext) => { - const angularJson = readJsonInTree(host, 'angular.json'); + const workspaceJson = readJsonInTree(host, 'angular.json'); host.create( 'nx.json', serializeJson({ @@ -447,7 +448,7 @@ function createAdditionalFiles(options: Schema): Rule { [options.name]: { tags: [] }, - [getE2eKey(angularJson) + '-e2e']: { + [getE2eKey(workspaceJson) + '-e2e']: { tags: [] } } @@ -502,12 +503,12 @@ function checkCanConvertToWorkspace(options: Schema) { } // TODO: This restriction should be lited - const angularJson = readJsonInTree(host, 'angular.json'); - if (Object.keys(angularJson.projects).length > 2) { + const workspaceJson = readJsonInTree(host, 'angular.json'); + if (Object.keys(workspaceJson.projects).length > 2) { throw new Error('Can only convert projects with one app'); } - const e2eKey = getE2eKey(angularJson); - const e2eApp = getE2eProject(angularJson); + const e2eKey = getE2eKey(workspaceJson); + const e2eApp = getE2eProject(workspaceJson); if ( e2eApp && diff --git a/packages/workspace/src/schematics/ng-new/ng-new.spec.ts b/packages/workspace/src/schematics/ng-new/ng-new.spec.ts deleted file mode 100644 index 3f506e552e..0000000000 --- a/packages/workspace/src/schematics/ng-new/ng-new.spec.ts +++ /dev/null @@ -1,3 +0,0 @@ -describe('ng-new', () => { - it('one day we will have a test here', () => {}); -}); diff --git a/packages/workspace/src/schematics/ng-new/ng-new.ts b/packages/workspace/src/schematics/ng-new/ng-new.ts index 30c2002394..b74025ada4 100644 --- a/packages/workspace/src/schematics/ng-new/ng-new.ts +++ b/packages/workspace/src/schematics/ng-new/ng-new.ts @@ -1,180 +1,6 @@ -import { - chain, - move, - noop, - Rule, - schematic, - SchematicContext, - Tree -} from '@angular-devkit/schematics'; -import { Schema } from './schema'; -import { - NodePackageInstallTask, - RepositoryInitializerTask -} from '@angular-devkit/schematics/tasks'; - -import { addDepsToPackageJson } from '../../utils/ast-utils'; - -import { toFileName } from '../../utils/name-utils'; - -import { formatFiles } from '../../utils/rules/format-files'; - -import { nxVersion } from '../../utils/versions'; -import * as path from 'path'; -import { Observable } from 'rxjs'; -import { spawn } from 'child_process'; -import { platform } from 'os'; - -class RunPresetTask { - toConfiguration() { - return { - name: 'RunPreset' - }; - } -} - -function createPresetTaskExecutor(opts: Schema) { - return { - name: 'RunPreset', - create: () => { - return Promise.resolve(() => { - const spawnOptions = { - stdio: [process.stdin, process.stdout, process.stderr], - shell: true, - cwd: path.join(process.cwd(), opts.directory) - }; - const ng = - platform() === 'win32' - ? '.\\node_modules\\.bin\\ng' - : './node_modules/.bin/ng'; - const args = [ - `g`, - `@nrwl/workspace:preset`, - `--name=${opts.name}`, - opts.style ? `--style=${opts.style}` : null, - opts.npmScope ? `--npmScope=${opts.npmScope}` : null, - opts.preset ? `--preset=${opts.preset}` : null - ].filter(e => !!e); - return new Observable(obs => { - spawn(ng, args, spawnOptions).on('close', (code: number) => { - if (code === 0) { - obs.next(); - obs.complete(); - } else { - const message = 'Workspace creation failed, see above.'; - obs.error(new Error(message)); - } - }); - }); - }); - } - }; -} +import { Rule } from '@angular-devkit/schematics'; +import { sharedNew, Schema } from '../shared-new/shared-new'; export default function(options: Schema): Rule { - if (options.skipInstall && options.preset !== 'empty') { - throw new Error(`Cannot select a preset when skipInstall is set to true.`); - } - - options = normalizeOptions(options); - const workspaceOpts = { ...options, preset: undefined }; - return (host: Tree, context: SchematicContext) => { - const engineHost = (context.engine.workflow as any).engineHost; - engineHost.registerTaskExecutor(createPresetTaskExecutor(options)); - - return chain([ - schematic('workspace', workspaceOpts), - addDependencies(options), - move('/', options.directory), - addTasks(options), - formatFiles() - ])(Tree.empty(), context); - }; -} - -function addDependencies(options: Schema) { - if (options.preset === 'empty') { - return noop(); - } else if (options.preset === 'angular') { - return addDepsToPackageJson( - { - '@nrwl/angular': nxVersion - }, - {}, - false - ); - } else if (options.preset === 'react') { - return addDepsToPackageJson( - {}, - { - '@nrwl/react': nxVersion - }, - false - ); - } else if (options.preset === 'web-components') { - return addDepsToPackageJson( - {}, - { - '@nrwl/web': nxVersion - }, - false - ); - } else { - return addDepsToPackageJson( - { - '@nrwl/angular': nxVersion - }, - { - '@nrwl/nest': nxVersion - }, - false - ); - } -} - -function addTasks(options: Schema) { - return (host: Tree, context: SchematicContext) => { - let packageTask; - let presetInstallTask; - if (!options.skipInstall) { - packageTask = context.addTask( - new NodePackageInstallTask(options.directory) - ); - } - if (options.preset !== 'empty') { - const createPresetTask = context.addTask(new RunPresetTask(), [ - packageTask - ]); - - presetInstallTask = context.addTask( - new NodePackageInstallTask(options.directory), - [createPresetTask] - ); - } - if (!options.skipGit) { - const commit = - typeof options.commit == 'object' - ? options.commit - : !!options.commit - ? {} - : false; - context.addTask( - new RepositoryInitializerTask(options.directory, commit), - presetInstallTask - ? [presetInstallTask] - : packageTask - ? [packageTask] - : [] - ); - } - }; -} - -function normalizeOptions(options: Schema): Schema { - options.name = toFileName(options.name); - if (!options.directory) { - options.directory = options.name; - } - - return options; + return sharedNew('angular', options); } diff --git a/packages/workspace/src/schematics/ng-new/schema.d.ts b/packages/workspace/src/schematics/ng-new/schema.d.ts deleted file mode 100644 index 2895a51e8d..0000000000 --- a/packages/workspace/src/schematics/ng-new/schema.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface Schema { - directory: string; - name: string; - npmScope?: string; - skipInstall?: boolean; - skipGit?: boolean; - style?: string; - preset: 'empty' | 'angular' | 'react' | 'web-components' | 'full-stack'; - commit?: { name: string; email: string; message?: string }; -} diff --git a/packages/workspace/src/schematics/ng-new/schema.json b/packages/workspace/src/schematics/ng-new/schema.json index da4bbd5fc4..c632e655ea 100644 --- a/packages/workspace/src/schematics/ng-new/schema.json +++ b/packages/workspace/src/schematics/ng-new/schema.json @@ -89,14 +89,7 @@ }, "preset": { "description": "What to create in the new workspace", - "enum": [ - "angular", - "angular-ivy", - "react", - "web-components", - "full-stack", - "empty" - ], + "enum": ["angular", "react", "web-components", "full-stack", "empty"], "default": "empty", "x-prompt": { "message": "What to create in the new workspace (You can create other applications and libraries at any point using 'ng g')", @@ -110,10 +103,6 @@ "value": "angular", "label": "angular [a workspace with a single Angular application]" }, - { - "value": "angular-ivy", - "label": "angular-ivy [a workspace with a single Angular application built using Ivy]" - }, { "value": "react", "label": "react [a workspace with a single React application]" diff --git a/packages/workspace/src/schematics/preset/preset.spec.ts b/packages/workspace/src/schematics/preset/preset.spec.ts index b6696ec844..b867729229 100644 --- a/packages/workspace/src/schematics/preset/preset.spec.ts +++ b/packages/workspace/src/schematics/preset/preset.spec.ts @@ -18,7 +18,7 @@ describe('preset', () => { expect(tree.exists('/apps/proj/src/app/app.component.ts')).toBe(true); expect( - JSON.parse(tree.readContent('/angular.json')).cli.defaultCollection + JSON.parse(tree.readContent('/workspace.json')).cli.defaultCollection ).toBe('@nrwl/angular'); }); @@ -30,7 +30,7 @@ describe('preset', () => { ); expect(tree.exists('/apps/proj/src/main.tsx')).toBe(true); expect( - JSON.parse(tree.readContent('/angular.json')).cli.defaultCollection + JSON.parse(tree.readContent('/workspace.json')).cli.defaultCollection ).toBe('@nrwl/react'); }); @@ -42,7 +42,7 @@ describe('preset', () => { ); expect(tree.exists('/apps/proj/src/main.ts')).toBe(true); expect( - JSON.parse(tree.readContent('/angular.json')).cli.defaultCollection + JSON.parse(tree.readContent('/workspace.json')).cli.defaultCollection ).toBe('@nrwl/web'); }); diff --git a/packages/workspace/src/schematics/preset/preset.ts b/packages/workspace/src/schematics/preset/preset.ts index 41f4b9421e..ce337d331e 100644 --- a/packages/workspace/src/schematics/preset/preset.ts +++ b/packages/workspace/src/schematics/preset/preset.ts @@ -9,7 +9,11 @@ import { } from '@angular-devkit/schematics'; import { Schema } from './schema'; -import { insert, insertImport, updateJsonInTree } from '../../utils/ast-utils'; +import { + insert, + insertImport, + updateWorkspaceInTree +} from '../../utils/ast-utils'; import { formatFiles } from '../../utils/rules/format-files'; @@ -39,20 +43,6 @@ function createPreset(options: Schema): Rule { ), setDefaultCollection('@nrwl/angular') ]); - } else if (options.preset === 'angular-ivy') { - return chain([ - externalSchematic( - '@nrwl/angular', - 'application', - { - name: options.name, - style: options.style, - enableIvy: true - }, - { interactive: false } - ), - setDefaultCollection('@nrwl/angular') - ]); } else if (options.preset === 'react') { return chain([ externalSchematic( @@ -235,7 +225,7 @@ export class AppService { } function setDefaultCollection(defaultCollection: string) { - return updateJsonInTree('angular.json', json => { + return updateWorkspaceInTree(json => { if (!json.cli) { json.cli = {}; } diff --git a/packages/workspace/src/schematics/preset/schema.d.ts b/packages/workspace/src/schematics/preset/schema.d.ts index 2d5833a591..4e72a47fbb 100644 --- a/packages/workspace/src/schematics/preset/schema.d.ts +++ b/packages/workspace/src/schematics/preset/schema.d.ts @@ -2,11 +2,5 @@ export interface Schema { name: string; npmScope?: string; style?: string; - preset: - | 'empty' - | 'angular' - | 'angular-ivy' - | 'react' - | 'web-components' - | 'full-stack'; + preset: 'empty' | 'angular' | 'react' | 'web-components' | 'full-stack'; } diff --git a/packages/workspace/src/schematics/shared-new/shared-new.ts b/packages/workspace/src/schematics/shared-new/shared-new.ts new file mode 100644 index 0000000000..42315ef54b --- /dev/null +++ b/packages/workspace/src/schematics/shared-new/shared-new.ts @@ -0,0 +1,192 @@ +import { + chain, + move, + noop, + Rule, + schematic, + SchematicContext, + Tree +} from '@angular-devkit/schematics'; +import { + NodePackageInstallTask, + RepositoryInitializerTask +} from '@angular-devkit/schematics/tasks'; + +import { addDepsToPackageJson } from '../../utils/ast-utils'; + +import { toFileName } from '../../utils/name-utils'; + +import { formatFiles } from '../../utils/rules/format-files'; + +import { nxVersion } from '../../utils/versions'; +import * as path from 'path'; +import { Observable } from 'rxjs'; +import { spawn } from 'child_process'; +import { platform } from 'os'; + +export interface Schema { + directory: string; + name: string; + npmScope?: string; + skipInstall?: boolean; + skipGit?: boolean; + style?: string; + preset: 'empty' | 'angular' | 'react' | 'web-components' | 'full-stack'; + commit?: { name: string; email: string; message?: string }; +} + +class RunPresetTask { + toConfiguration() { + return { + name: 'RunPreset' + }; + } +} + +function createPresetTaskExecutor(cli: string, opts: Schema) { + const cliCommand = cli === 'angular' ? 'ng' : 'nx'; + + return { + name: 'RunPreset', + create: () => { + return Promise.resolve(() => { + const spawnOptions = { + stdio: [process.stdin, process.stdout, process.stderr], + shell: true, + cwd: path.join(process.cwd(), opts.directory) + }; + const executable = + platform() === 'win32' + ? `.\\node_modules\\.bin\\${cliCommand}` + : `./node_modules/.bin/${cliCommand}`; + const args = [ + `g`, + `@nrwl/workspace:preset`, + `--name=${opts.name}`, + opts.style ? `--style=${opts.style}` : null, + opts.npmScope ? `--npmScope=${opts.npmScope}` : null, + opts.preset ? `--preset=${opts.preset}` : null + ].filter(e => !!e); + return new Observable(obs => { + spawn(executable, args, spawnOptions).on('close', (code: number) => { + if (code === 0) { + obs.next(); + obs.complete(); + } else { + const message = 'Workspace creation failed, see above.'; + obs.error(new Error(message)); + } + }); + }); + }); + } + }; +} + +export function sharedNew(cli: string, options: Schema): Rule { + if (options.skipInstall && options.preset !== 'empty') { + throw new Error(`Cannot select a preset when skipInstall is set to true.`); + } + + options = normalizeOptions(options); + const workspaceOpts = { ...options, preset: undefined }; + return (host: Tree, context: SchematicContext) => { + const engineHost = (context.engine.workflow as any).engineHost; + engineHost.registerTaskExecutor(createPresetTaskExecutor(cli, options)); + + return chain([ + schematic('workspace', { ...workspaceOpts, cli }), + addDependencies(options), + move('/', options.directory), + addTasks(options), + formatFiles() + ])(Tree.empty(), context); + }; +} + +function addDependencies(options: Schema) { + if (options.preset === 'empty') { + return noop(); + } else if (options.preset === 'angular') { + return addDepsToPackageJson( + { + '@nrwl/angular': nxVersion + }, + {}, + false + ); + } else if (options.preset === 'react') { + return addDepsToPackageJson( + {}, + { + '@nrwl/react': nxVersion + }, + false + ); + } else if (options.preset === 'web-components') { + return addDepsToPackageJson( + {}, + { + '@nrwl/web': nxVersion + }, + false + ); + } else { + return addDepsToPackageJson( + { + '@nrwl/angular': nxVersion + }, + { + '@nrwl/nest': nxVersion + }, + false + ); + } +} + +function addTasks(options: Schema) { + return (host: Tree, context: SchematicContext) => { + let packageTask; + let presetInstallTask; + if (!options.skipInstall) { + packageTask = context.addTask( + new NodePackageInstallTask(options.directory) + ); + } + if (options.preset !== 'empty') { + const createPresetTask = context.addTask(new RunPresetTask(), [ + packageTask + ]); + + presetInstallTask = context.addTask( + new NodePackageInstallTask(options.directory), + [createPresetTask] + ); + } + if (!options.skipGit) { + const commit = + typeof options.commit == 'object' + ? options.commit + : !!options.commit + ? {} + : false; + context.addTask( + new RepositoryInitializerTask(options.directory, commit), + presetInstallTask + ? [presetInstallTask] + : packageTask + ? [packageTask] + : [] + ); + } + }; +} + +function normalizeOptions(options: Schema): Schema { + options.name = toFileName(options.name); + if (!options.directory) { + options.directory = options.name; + } + + return options; +} diff --git a/packages/workspace/src/schematics/tao-new/schema.json b/packages/workspace/src/schematics/tao-new/schema.json new file mode 100644 index 0000000000..c632e655ea --- /dev/null +++ b/packages/workspace/src/schematics/tao-new/schema.json @@ -0,0 +1,122 @@ +{ + "$schema": "http://json-schema.org/schema", + "id": "NxWorkspaceNew", + "title": "Create an empty workspace", + "type": "object", + "properties": { + "name": { + "description": "The name of the workspace.", + "type": "string", + "format": "html-selector", + "$default": { + "$source": "argv", + "index": 0 + }, + "x-prompt": "What name would you like to use for the workspace?" + }, + "style": { + "description": "The file extension to be used for style files.", + "type": "string", + "default": "css", + "x-prompt": { + "message": "Which stylesheet format would you like to use?", + "type": "list", + "items": [ + { + "value": "css", + "label": "CSS" + }, + { + "value": "scss", + "label": "SASS(.scss) [ http://sass-lang.com ]" + }, + { + "value": "styl", + "label": "Stylus(.styl)[ http://stylus-lang.com ]" + }, + { + "value": "less", + "label": "LESS [ http://lesscss.org ]" + } + ] + } + }, + "directory": { + "type": "string", + "format": "path", + "description": "The directory name to create the workspace in.", + "default": "" + }, + "npmScope": { + "type": "string", + "description": "Npm scope for importing libs." + }, + "skipInstall": { + "description": "Skip installing dependency packages.", + "type": "boolean", + "default": false + }, + "skipGit": { + "description": "Skip initializing a git repository.", + "type": "boolean", + "default": false, + "alias": "g" + }, + "commit": { + "description": "Initial repository commit information.", + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string", + "format": "email" + }, + "message": { + "type": "string" + } + }, + "required": ["name", "email"] + } + ], + "default": true + }, + "preset": { + "description": "What to create in the new workspace", + "enum": ["angular", "react", "web-components", "full-stack", "empty"], + "default": "empty", + "x-prompt": { + "message": "What to create in the new workspace (You can create other applications and libraries at any point using 'ng g')", + "type": "list", + "items": [ + { + "value": "empty", + "label": "empty [an empty workspace]" + }, + { + "value": "angular", + "label": "angular [a workspace with a single Angular application]" + }, + { + "value": "react", + "label": "react [a workspace with a single React application]" + }, + { + "value": "web-components", + "label": "web components [a workspace with a single app built using web components]" + }, + { + "value": "full-stack", + "label": "full-stack [a workspace with a full stack application (NestJS + Angular Ivy)]" + } + ] + } + } + } +} diff --git a/packages/workspace/src/schematics/tao-new/tao-new.ts b/packages/workspace/src/schematics/tao-new/tao-new.ts new file mode 100644 index 0000000000..a35eb91528 --- /dev/null +++ b/packages/workspace/src/schematics/tao-new/tao-new.ts @@ -0,0 +1,6 @@ +import { Rule } from '@angular-devkit/schematics'; +import { sharedNew, Schema } from '../shared-new/shared-new'; + +export default function(options: Schema): Rule { + return sharedNew('nx', options); +} diff --git a/packages/workspace/src/schematics/workspace/files/.vscode/extensions.json b/packages/workspace/src/schematics/workspace/files/.vscode/extensions.json__tmpl__ similarity index 64% rename from packages/workspace/src/schematics/workspace/files/.vscode/extensions.json rename to packages/workspace/src/schematics/workspace/files/.vscode/extensions.json__tmpl__ index 7804e26027..c912f2f744 100644 --- a/packages/workspace/src/schematics/workspace/files/.vscode/extensions.json +++ b/packages/workspace/src/schematics/workspace/files/.vscode/extensions.json__tmpl__ @@ -1,7 +1,9 @@ { "recommendations": [ + <% if(cli === 'angular') { %> "nrwl.angular-console", - "angular.ng-template", + "angular.ng-template",<% } + %> "ms-vscode.vscode-typescript-tslint-plugin", "esbenp.prettier-vscode" ] diff --git a/packages/workspace/src/schematics/workspace/files/__workspaceFile__.json b/packages/workspace/src/schematics/workspace/files/__workspaceFile__.json new file mode 100644 index 0000000000..ae27a80047 --- /dev/null +++ b/packages/workspace/src/schematics/workspace/files/__workspaceFile__.json @@ -0,0 +1,7 @@ +{ + "version": 1, + "projects": {}, + "cli": { + "defaultCollection": "@nrwl/workspace" + } +} diff --git a/packages/workspace/src/schematics/workspace/files/angular.json b/packages/workspace/src/schematics/workspace/files/angular.json deleted file mode 100644 index b4ac9118e0..0000000000 --- a/packages/workspace/src/schematics/workspace/files/angular.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "", - "projects": {}, - "cli": { - "warnings": { - "typescriptMismatch": false, - "versionMismatch": false - }, - "defaultCollection": "@nrwl/workspace" - }, - "schematics": {} -} diff --git a/packages/workspace/src/schematics/workspace/files/nx.json b/packages/workspace/src/schematics/workspace/files/nx.json index 4b3423e31d..846335099d 100644 --- a/packages/workspace/src/schematics/workspace/files/nx.json +++ b/packages/workspace/src/schematics/workspace/files/nx.json @@ -1,7 +1,7 @@ { "npmScope": "<%= npmScope %>", "implicitDependencies": { - "angular.json": "*", + "<%= workspaceFile %>.json": "*", "package.json": "*", "tsconfig.json": "*", "tslint.json": "*", diff --git a/packages/workspace/src/schematics/workspace/files/package.json__tmpl__ b/packages/workspace/src/schematics/workspace/files/package.json__tmpl__ index 5697c93694..ab9c20f770 100644 --- a/packages/workspace/src/schematics/workspace/files/package.json__tmpl__ +++ b/packages/workspace/src/schematics/workspace/files/package.json__tmpl__ @@ -3,13 +3,15 @@ "version": "0.0.0", "license": "MIT", "scripts": { + <% if(cli === 'angular') { %> "ng": "ng", + <% } %> "nx": "nx", - "start": "ng serve", - "build": "ng build", - "test": "ng test", - "lint": "nx workspace-lint && ng lint", - "e2e": "ng e2e", + "start": "<%= cliCommand %> serve", + "build": "<%= cliCommand %> build", + "test": "<%= cliCommand %> test", + "lint": "nx lint && <%= cliCommand %> lint", + "e2e": "<%= cliCommand %> e2e", "affected:apps": "nx affected:apps", "affected:libs": "nx affected:libs", "affected:build": "nx affected:build", @@ -21,8 +23,12 @@ "format": "nx format:write", "format:write": "nx format:write", "format:check": "nx format:check", + + <% if(cli === 'angular') { %> "update": "ng update @nrwl/workspace", "update:check": "ng update", + <% } %> + "workspace-schematic": "nx workspace-schematic", "dep-graph": "nx dep-graph", "help": "nx help" @@ -30,13 +36,13 @@ "private": true, "dependencies": {}, "devDependencies": { + <% if(cli === 'angular') { %>"@angular/cli": "<%= angularCliVersion %>",<% } %> "@nrwl/workspace": "<%= nxVersion %>", "@types/node": "~8.9.4", "dotenv": "6.2.0", "ts-node": "~7.0.0", "tslint": "~5.11.0", "typescript": "<%= typescriptVersion %>", - "prettier": "<%= prettierVersion %>"<% if(!nxCli) { %>, - "@angular/cli": "<%= angularCliVersion %>"<% } %> + "prettier": "<%= prettierVersion %>" } } diff --git a/packages/workspace/src/schematics/workspace/schema.d.ts b/packages/workspace/src/schematics/workspace/schema.d.ts index 89f184af90..b235ccb329 100644 --- a/packages/workspace/src/schematics/workspace/schema.d.ts +++ b/packages/workspace/src/schematics/workspace/schema.d.ts @@ -8,4 +8,5 @@ export interface Schema { skipGit?: boolean; style?: string; commit?: { name: string; email: string; message?: string }; + cli: 'nx' | 'angular'; } diff --git a/packages/workspace/src/schematics/workspace/schema.json b/packages/workspace/src/schematics/workspace/schema.json index 482ec70792..4e439c8763 100644 --- a/packages/workspace/src/schematics/workspace/schema.json +++ b/packages/workspace/src/schematics/workspace/schema.json @@ -81,6 +81,12 @@ } ], "default": true + }, + "cli": { + "description": "CLI used for generating code and running tasks", + "type": "string", + "enum": ["nx", "angular"], + "default": "nx" } } } diff --git a/packages/workspace/src/schematics/workspace/workspace.spec.ts b/packages/workspace/src/schematics/workspace/workspace.spec.ts index 913960235e..f4c2b1c4ca 100644 --- a/packages/workspace/src/schematics/workspace/workspace.spec.ts +++ b/packages/workspace/src/schematics/workspace/workspace.spec.ts @@ -12,7 +12,7 @@ describe('workspace', () => { it('should create files', async () => { const tree = await runSchematic('workspace', { name: 'proj' }, projectTree); expect(tree.exists('/nx.json')).toBe(true); - expect(tree.exists('/angular.json')).toBe(true); + expect(tree.exists('/workspace.json')).toBe(true); expect(tree.exists('/.prettierrc')).toBe(true); expect(tree.exists('/.prettierignore')).toBe(true); }); @@ -23,7 +23,7 @@ describe('workspace', () => { expect(nxJson).toEqual({ npmScope: 'proj', implicitDependencies: { - 'angular.json': '*', + 'workspace.json': '*', 'package.json': '*', 'tsconfig.json': '*', 'tslint.json': '*', @@ -40,6 +40,23 @@ describe('workspace', () => { '/.vscode/extensions.json' ).recommendations; + expect(recommendations).toEqual([ + 'ms-vscode.vscode-typescript-tslint-plugin', + 'esbenp.prettier-vscode' + ]); + }); + + it('should recommend vscode extensions (angular)', async () => { + const tree = await runSchematic( + 'workspace', + { name: 'proj', cli: 'angular' }, + projectTree + ); + const recommendations = readJsonInTree<{ recommendations: string[] }>( + tree, + '/.vscode/extensions.json' + ).recommendations; + expect(recommendations).toEqual([ 'nrwl.angular-console', 'angular.ng-template', diff --git a/packages/workspace/src/schematics/workspace/workspace.ts b/packages/workspace/src/schematics/workspace/workspace.ts index 195b6a72cd..c0724c3257 100644 --- a/packages/workspace/src/schematics/workspace/workspace.ts +++ b/packages/workspace/src/schematics/workspace/workspace.ts @@ -34,10 +34,12 @@ export default function(options: Schema): Rule { utils: strings, dot: '.', tmpl: '', + workspaceFile: options.cli === 'angular' ? 'angular' : 'workspace', + cliCommand: options.cli === 'angular' ? 'ng' : 'nx', nxCli: false, typescriptVersion, prettierVersion, - // angular cli and angular version are used only when workspace schematics is added to angular cli + // angular cli is used only when workspace schematics is added to angular cli angularCliVersion, ...(options as object), nxVersion, diff --git a/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.ts b/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.ts index c80bbeafd1..6cd31fd285 100644 --- a/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.ts +++ b/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.ts @@ -5,7 +5,7 @@ import * as ts from 'typescript'; import { getProjectNodes, normalizedProjectRoot, - readAngularJson, + readWorkspaceJson, readNxJson } from '../command-line/shared'; import { ProjectNode, ProjectType } from '../command-line/affected-apps'; @@ -28,10 +28,10 @@ export class Rule extends Lint.Rules.AbstractRule { if (!projectPath) { this.projectPath = appRootPath; if (!(global as any).projectNodes) { - const angularJson = readAngularJson(); + const workspaceJson = readWorkspaceJson(); const nxJson = readNxJson(); (global as any).npmScope = nxJson.npmScope; - (global as any).projectNodes = getProjectNodes(angularJson, nxJson); + (global as any).projectNodes = getProjectNodes(workspaceJson, nxJson); (global as any).deps = readDependencies( (global as any).npmScope, (global as any).projectNodes diff --git a/packages/workspace/src/utils/app-root.ts b/packages/workspace/src/utils/app-root.ts index 15eef8471f..82853b9213 100644 --- a/packages/workspace/src/utils/app-root.ts +++ b/packages/workspace/src/utils/app-root.ts @@ -5,28 +5,12 @@ export const appRootPath = pathInner(__dirname); function pathInner(dir: string): string { if (path.dirname(dir) === dir) return process.cwd(); - if (fileExists(path.join(dir, 'angular.json'))) { + if ( + fileExists(path.join(dir, 'workspace.json')) || + fileExists(path.join(dir, 'angular.json')) + ) { return dir; } else { return pathInner(path.dirname(dir)); } } - -export function closestCli(dir: string): string { - if (path.dirname(dir) === dir) { - throw new Error(`Cannot find the Angular CLI to invoke the command`); - } - const cliPath = path.join( - dir, - 'node_modules', - '@angular', - 'cli', - 'lib', - 'init.js' - ); - if (fileExists(cliPath)) { - return cliPath; - } else { - return closestCli(path.dirname(dir)); - } -} diff --git a/packages/workspace/src/utils/ast-utils.ts b/packages/workspace/src/utils/ast-utils.ts index b6365d7297..bf773d23e2 100644 --- a/packages/workspace/src/utils/ast-utils.ts +++ b/packages/workspace/src/utils/ast-utils.ts @@ -10,6 +10,7 @@ import * as ts from 'typescript'; import * as stripJsonComments from 'strip-json-comments'; import { serializeJson } from './fileutils'; import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; +import { getWorkspacePath } from './cli-config-utils'; function nodesByPosition(first: ts.Node, second: ts.Node): number { return first.getStart() - second.getStart(); @@ -393,6 +394,19 @@ export function updateJsonInTree( }; } +export function updateWorkspaceInTree( + callback: (json: T, context: SchematicContext) => O +): Rule { + return (host: Tree, context: SchematicContext): Tree => { + const path = getWorkspacePath(host); + host.overwrite( + path, + serializeJson(callback(readJsonInTree(host, path), context)) + ); + return host; + }; +} + let installAdded = false; export function addDepsToPackageJson( @@ -440,8 +454,8 @@ export function updatePackageJsonDependencies( } export function getProjectConfig(host: Tree, name: string): any { - const angularJson = readJsonInTree(host, '/angular.json'); - const projectConfig = angularJson.projects[name]; + const workspaceJson = readJsonInTree(host, getWorkspacePath(host)); + const projectConfig = workspaceJson.projects[name]; if (!projectConfig) { throw new Error(`Cannot find project '${name}'`); } else { diff --git a/packages/workspace/src/utils/cli-config-utils.ts b/packages/workspace/src/utils/cli-config-utils.ts index ceb0fb98fc..c8151d8c5a 100644 --- a/packages/workspace/src/utils/cli-config-utils.ts +++ b/packages/workspace/src/utils/cli-config-utils.ts @@ -2,18 +2,8 @@ import { Tree } from '@angular-devkit/schematics'; import { readJsonInTree } from './ast-utils'; import { NxJson } from '../command-line/shared'; -export const angularSchematicNames = [ - 'class', - 'component', - 'directive', - 'guard', - 'module', - 'pipe', - 'service' -]; - export function getWorkspacePath(host: Tree) { - const possibleFiles = ['/angular.json', '/.angular.json']; + const possibleFiles = ['/workspace.json', '/angular.json', '/.angular.json']; return possibleFiles.filter(path => host.exists(path))[0]; } diff --git a/packages/workspace/src/utils/fileutils.ts b/packages/workspace/src/utils/fileutils.ts index ff2683d7ac..ed32d70f73 100644 --- a/packages/workspace/src/utils/fileutils.ts +++ b/packages/workspace/src/utils/fileutils.ts @@ -59,8 +59,12 @@ export function writeJsonFile(path: string, json: any) { writeToFile(path, serializeJson(json)); } -export function readCliConfigFile(): any { - return readJsonFile('.angular-cli.json'); +export function readWorkspaceConfigPath(): any { + if (fileExists('workspace.json')) { + return readJsonFile('workspace.json'); + } else { + return readJsonFile('workspace.json'); + } } export function copyFile(file: string, target: string) { diff --git a/packages/workspace/src/schematics/workspace/files/tslint.json b/packages/workspace/src/utils/lint.ts similarity index 61% rename from packages/workspace/src/schematics/workspace/files/tslint.json rename to packages/workspace/src/utils/lint.ts index 9172f56fb4..1f8efb3cf6 100644 --- a/packages/workspace/src/schematics/workspace/files/tslint.json +++ b/packages/workspace/src/utils/lint.ts @@ -1,3 +1,42 @@ +import { Tree } from '@angular-devkit/schematics'; +import { join } from '@angular-devkit/core'; + +export function generateProjectLint( + projectRoot: string, + tsConfigPath: string, + linter: 'tslint' | 'eslint' | 'none' +) { + if (linter === 'tslint') { + return { + builder: '@angular-devkit/build-angular:tslint', + options: { + tsConfig: [tsConfigPath], + exclude: ['**/node_modules/**', '!' + projectRoot + '/**'] + } + }; + } else if (linter === 'eslint') { + return {}; + } else { + return undefined; + } +} + +export function addGlobalLint(linter: 'tslint' | 'eslint' | 'none') { + return (host: Tree) => { + if (linter === 'tslint') { + if (!host.exists('/tslint.json')) { + host.create('/tslint.json', globalTsLint); + } + } else if (linter === 'eslint') { + if (!host.exists('/.eslintrc')) { + host.create('/.eslintrc', globalTsLint); + } + } else { + } + }; +} + +const globalTsLint = ` { "rulesDirectory": ["node_modules/@nrwl/workspace/src/tslint"], "rules": { @@ -59,3 +98,9 @@ ] } } +`; + +const globalEsLit = ` +{ +} +`; diff --git a/packages/workspace/src/utils/rules/update-karma-conf.spec.ts b/packages/workspace/src/utils/rules/update-karma-conf.spec.ts index 5f2f283b3b..c172c5fc5d 100644 --- a/packages/workspace/src/utils/rules/update-karma-conf.spec.ts +++ b/packages/workspace/src/utils/rules/update-karma-conf.spec.ts @@ -18,8 +18,8 @@ describe('updateKarmaConf', () => { tree = createEmptyWorkspace(Tree.empty()); tree.create('apps/projectName/karma.conf.js', ''); const process$ = schematicRunner.callRule( - updateJsonInTree('/angular.json', angularJson => { - angularJson.projects.projectName = { + updateJsonInTree('/workspace.json', workspaceJson => { + workspaceJson.projects.projectName = { root: 'apps/projectName', architect: { test: { @@ -29,7 +29,7 @@ describe('updateKarmaConf', () => { } } }; - return angularJson; + return workspaceJson; }), tree ); diff --git a/packages/workspace/src/utils/testing-utils.ts b/packages/workspace/src/utils/testing-utils.ts index 0075308cbf..7200fee832 100644 --- a/packages/workspace/src/utils/testing-utils.ts +++ b/packages/workspace/src/utils/testing-utils.ts @@ -1,6 +1,17 @@ -import { Tree } from '@angular-devkit/schematics'; -import { names, toFileName } from './name-utils'; +import { + Tree, + MergeStrategy, + DirEntry, + FileEntry, + FilePredicate, + UpdateRecorder, + Action +} from '@angular-devkit/schematics'; import { NxJson } from '../command-line/shared'; +import { + _test_addWorkspaceFile, + WorkspaceFormat +} from '@angular-devkit/core/src/workspace/core'; export function getFileContent(tree: Tree, path: string): string { const fileEntry = tree.get(path); @@ -13,8 +24,10 @@ export function getFileContent(tree: Tree, path: string): string { } export function createEmptyWorkspace(tree: Tree): Tree { + _test_addWorkspaceFile('workspace.json', WorkspaceFormat.JSON); + tree.create( - '/angular.json', + '/workspace.json', JSON.stringify({ version: 1, projects: {}, newProjectRoot: '' }) ); tree.create( diff --git a/scripts/build.sh b/scripts/build.sh index c403547f99..7b1ee213cd 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -28,7 +28,9 @@ rm -rf build/packages/angular/bundles/nrwl-angular-testing.umd.js.bak rm -rf build/packages/angular/bundles/nrwl-angular-testing.umd.min.js.bak rsync -a --exclude=*.ts packages/ build/packages +chmod +x build/packages/create-nx-workspace/bin/create-nx-workspace.js chmod +x build/packages/cli/bin/nx.js +chmod +x build/packages/tao/index.js rm -rf build/packages/install rm -rf build/packages/nx/dist @@ -47,6 +49,8 @@ cp README.md build/packages/angular cp README.md build/packages/jest cp README.md build/packages/cypress cp README.md build/packages/cli +cp README.md build/packages/tao + cp LICENSE build/packages/builders cp LICENSE build/packages/schematics cp LICENSE build/packages/nx @@ -61,6 +65,7 @@ cp LICENSE build/packages/angular cp LICENSE build/packages/jest cp LICENSE build/packages/cypress cp LICENSE build/packages/cli +cp LICENSE build/packages/tao echo "Nx libraries available at build/packages:" ls build/packages diff --git a/scripts/check-imports.js b/scripts/check-imports.js index d77944b8db..49adabb0de 100644 --- a/scripts/check-imports.js +++ b/scripts/check-imports.js @@ -32,6 +32,7 @@ function check() { 'packages/web/src/utils/web.config.ts', 'packages/web/src/utils/web.config.spec.ts', 'packages/workspace/src/command-line/affected.ts', + 'packages/workspace/src/command-line/shared.ts', 'packages/workspace/src/schematics/preset/preset.ts', 'packages/workspace/src/schematics/ng-add/ng-add.ts', 'packages/workspace/src/utils/update-task.ts', diff --git a/scripts/documentation/generate-npmscripts-data.ts b/scripts/documentation/generate-npmscripts-data.ts index dffc19c3a3..fb5844fce3 100644 --- a/scripts/documentation/generate-npmscripts-data.ts +++ b/scripts/documentation/generate-npmscripts-data.ts @@ -80,6 +80,7 @@ function generateMarkdown(command) { const npmscripts = getCommands(commandsObject); Object.keys(npmscripts) + .filter(name => !name.startsWith('run') && !name.startsWith('generate')) .map(name => parseCommandInstance(name, npmscripts[name])) .map(command => generateMarkdown(command)) .forEach(templateObject => diff --git a/scripts/e2e-rerun.sh b/scripts/e2e-rerun.sh index 74fff2fde3..44a0f78d9a 100755 --- a/scripts/e2e-rerun.sh +++ b/scripts/e2e-rerun.sh @@ -3,9 +3,9 @@ ./scripts/link.sh fast if [ -n "$1" ]; then - jest --maxWorkers=1 ./build/e2e/schematics/$1.test.js + jest --maxWorkers=1 ./build/e2e/$1.test.js else - jest --maxWorkers=1 ./build/e2e/schematics + jest --maxWorkers=1 ./build/e2e fi diff --git a/scripts/e2e.sh b/scripts/e2e.sh index 0c959096bf..993837be25 100755 --- a/scripts/e2e.sh +++ b/scripts/e2e.sh @@ -1,13 +1,18 @@ #!/usr/bin/env bash ./scripts/link.sh -rm -rf tmp -mkdir tmp -if [ -n "$1" ]; then - jest --maxWorkers=1 ./build/e2e/$1.test.js +rm -rf tmp +mkdir -p tmp/angular +mkdir -p tmp/nx + +if test "$1" == "--cli"; then + export SELECTED_CLI=$2 + jest --maxWorkers=1 ./build/e2e/*.test.js +elif [ -n "$1" ]; then + jest --maxWorkers=1 ./build/e2e/$1.test.js else - jest --maxWorkers=1 ./build/e2e/*.test.js + jest --maxWorkers=1 ./build/e2e/*.test.js fi diff --git a/scripts/nx-release.js b/scripts/nx-release.js index 6cc575df35..fe8209e1f4 100755 --- a/scripts/nx-release.js +++ b/scripts/nx-release.js @@ -161,7 +161,8 @@ const options = { 'build/npm/express/package.json', 'build/npm/nest/package.json', 'build/npm/workspace/package.json', - 'build/npm/cli/package.json' + 'build/npm/cli/package.json', + 'build/npm/tao/package.json' ], increment: parsedVersion.version, requireUpstream: false, diff --git a/scripts/package.sh b/scripts/package.sh index ec37b7809d..f65e93f028 100755 --- a/scripts/package.sh +++ b/scripts/package.sh @@ -17,13 +17,13 @@ cd build/packages if [[ "$OSTYPE" == "darwin"* ]]; then sed -i "" "s|exports.nxVersion = '\*';|exports.nxVersion = '$NX_VERSION';|g" {react,web,jest,node,express,nest,cypress,angular,workspace}/src/utils/versions.js - sed -i "" "s|\*|$NX_VERSION|g" {schematics,react,web,jest,node,express,nest,cypress,angular,workspace,create-nx-workspace}/package.json + sed -i "" "s|\*|$NX_VERSION|g" {schematics,react,web,jest,node,express,nest,cypress,angular,workspace,cli,tao,create-nx-workspace}/package.json sed -i "" "s|NX_VERSION|$NX_VERSION|g" create-nx-workspace/bin/create-nx-workspace.js sed -i "" "s|ANGULAR_CLI_VERSION|$ANGULAR_CLI_VERSION|g" create-nx-workspace/bin/create-nx-workspace.js sed -i "" "s|TYPESCRIPT_VERSION|$TYPESCRIPT_VERSION|g" create-nx-workspace/bin/create-nx-workspace.js else sed -i "s|exports.nxVersion = '\*';|exports.nxVersion = '$NX_VERSION';|g" {react,web,jest,node,express,nest,cypress,angular,workspace}/src/utils/versions.js - sed -i "s|\*|$NX_VERSION|g" {schematics,react,web,jest,node,express,nest,cypress,angular,workspace,create-nx-workspace}/package.json + sed -i "s|\*|$NX_VERSION|g" {schematics,react,web,jest,node,express,nest,cypress,angular,workspace,cli,tao,create-nx-workspace}/package.json sed -i "s|NX_VERSION|$NX_VERSION|g" create-nx-workspace/bin/create-nx-workspace.js sed -i "s|ANGULAR_CLI_VERSION|$ANGULAR_CLI_VERSION|g" create-nx-workspace/bin/create-nx-workspace.js sed -i "s|TYPESCRIPT_VERSION|$TYPESCRIPT_VERSION|g" create-nx-workspace/bin/create-nx-workspace.js @@ -31,8 +31,9 @@ fi if [[ $NX_VERSION == "*" ]]; then if [[ "$OSTYPE" == "darwin"* ]]; then - sed -E -i "" "s/\"@nrwl\/([^\"]+)\": \"\\*\"/\"@nrwl\/\1\": \"file:..\/\1\"/" {schematics,jest,web,react,node,express,nest,cypress,angular,workspace,create-nx-workspace}/package.json + sed -E -i "" "s/\"@nrwl\/([^\"]+)\": \"\\*\"/\"@nrwl\/\1\": \"file:$PWD\/\1\"/" {schematics,jest,web,react,node,express,nest,cypress,angular,workspace,cli,tao,create-nx-workspace}/package.json else - sed -E -i "s/\"@nrwl\/([^\"]+)\": \"\\*\"/\"@nrwl\/\1\": \"file:..\/\1\"/" {schematics,jest,web,react,node,express,nest,cypress,angular,workspace,create-nx-workspace}/package.json + echo $PWD + sed -E -i "s|\"@nrwl\/([^\"]+)\": \"\\*\"|\"@nrwl\/\1\": \"file:$PWD\/\1\"|" {schematics,jest,web,react,node,express,nest,cypress,angular,workspace,cli,tao,create-nx-workspace}/package.json fi fi diff --git a/scripts/test.sh b/scripts/test.sh index a7bee2f2b3..0911767476 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -3,5 +3,5 @@ if [ -n "$1" ]; then jest --maxWorkers=1 ./build/packages/$1.spec.js else - jest --maxWorkers=1 ./build/packages/{schematics,bazel,builders,react,jest,web,node,express,nest,cypress,angular,workspace} --passWithNoTests + jest --maxWorkers=1 ./build/packages/{schematics,bazel,builders,react,jest,web,node,express,nest,cypress,angular,workspace,tao} --passWithNoTests fi diff --git a/tsconfig.json b/tsconfig.json index 19b23802be..af9d7a7656 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,6 +13,8 @@ "declaration": true, "baseUrl": ".", "paths": { + "@nrwl/tao": ["./packages/tao"], + "@nrwl/tao/*": ["./packages/tao/*"], "@nrwl/workspace": ["./packages/workspace"], "@nrwl/workspace/*": ["./packages/workspace/*"], "@nrwl/workspace/testing": ["./packages/workspace/testing"] diff --git a/yarn.lock b/yarn.lock index e0a96ebfdb..e3475e77b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -92,28 +92,6 @@ rxjs "6.4.0" webpack-merge "4.2.1" -"@angular-devkit/core@7.3.8": - version "7.3.8" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.8.tgz#702b0944a69c71cce3a1492e0d62de18df22a993" - integrity sha512-3X9uzaZXFpm5o2TSzhD6wEOtVU32CgeytKjD1Scxj+uMMVo48SWLlKiFh312T+smI9ko7tOT8VqxglwYkWosgg== - dependencies: - ajv "6.9.1" - chokidar "2.0.4" - fast-json-stable-stringify "2.0.0" - rxjs "6.3.3" - source-map "0.7.3" - -"@angular-devkit/core@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.0.0.tgz#a0ca65d8d0f928db9288316b1f3346d21f722213" - integrity sha512-wYf4zzpYj5Y673DG8iteK0GsDDuXBKN/TOXm4lUwmXcz8QHTD+BfR6qA5TBDqlMGpU7CP1/0vgbv2px17CDETQ== - dependencies: - ajv "6.10.0" - fast-json-stable-stringify "2.0.0" - magic-string "0.25.2" - rxjs "6.4.0" - source-map "0.7.3" - "@angular-devkit/core@8.1.1": version "8.1.1" resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.1.1.tgz#da7bb908ce42cb5c5fde08d600880b6fda486056" @@ -125,21 +103,16 @@ rxjs "6.4.0" source-map "0.7.3" -"@angular-devkit/schematics@7.3.8": - version "7.3.8" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.8.tgz#70bfc7876f7924ff53ab9310a00b62f20acf2f5c" - integrity sha512-mvaKoORZIaW/h0VNZ3IQWP0qThRCZRX6869FNlzV0jlW0mhn07XbiIGHCGGSCDRxS7qJ0VbuIVnKXntF+iDeWw== +"@angular-devkit/core@8.1.2": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.1.2.tgz#8220725a2251a415e0588e65febb5bf2a931f471" + integrity sha512-sNkqXbkHE9+ObtLOYmDKJL1bOf1zY0AwGVKemgDqCmu1mRUNqhb7CmF13DRscfU3MEcuiJYDjXqBQDjIszrFiw== dependencies: - "@angular-devkit/core" "7.3.8" - rxjs "6.3.3" - -"@angular-devkit/schematics@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.0.0.tgz#53d14646c6286b0397417990fc83e3e9a6ecf233" - integrity sha512-IXJOs/DkDqNbfG76sNNY5ePZ37rjkMUopmtvhN6/U1hQFwTpGa9N0bCHFphcKraXeS6Jfox5XwFEStc/1xyhfw== - dependencies: - "@angular-devkit/core" "8.0.0" + ajv "6.10.0" + fast-json-stable-stringify "2.0.0" + magic-string "0.25.3" rxjs "6.4.0" + source-map "0.7.3" "@angular-devkit/schematics@8.1.1": version "8.1.1" @@ -149,6 +122,14 @@ "@angular-devkit/core" "8.1.1" rxjs "6.4.0" +"@angular-devkit/schematics@8.1.2": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.1.2.tgz#2b8926d4af7992d6f99ddecd86cd81cb1a619d69" + integrity sha512-Di/3vPR4jwdYcMAk13t19sAF0qQUH8KSkFcmO/5E/gECTL1tXNvV690K1Vhn6zpeE17Z1MLB5HwRNcb6nJkD+Q== + dependencies: + "@angular-devkit/core" "8.1.2" + rxjs "6.4.0" + "@angular/cli@8.1.1": version "8.1.1" resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.1.1.tgz#c63e525c74046457f07d35cb3ec66818c8c6d7b1" @@ -174,16 +155,16 @@ uuid "^3.3.2" "@angular/common@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-8.0.0.tgz#700aeda9be8af96692fce0ea6bf6157f7c874c0e" - integrity sha512-iOAJZ0+1zTRHnHE/5G30+4Q66W1pfZkSkxZIXvgijZ+wtuNloYdWNy/IdZ/m7ayBI7A6FsYEhyMUoWz2HVEJNw== + version "8.1.2" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-8.1.2.tgz#43a7fd1179d179cae9142a3e6ae60a26a34dd062" + integrity sha512-bywFofN5RjcvygYEC/3eo+bfUnYBmARA6DPau8fm6D2ZGpXrWXJ3Thd99ZesuuffvpniaIHlAjbHGI83XSnixQ== dependencies: tslib "^1.9.0" "@angular/compiler-cli@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-8.0.0.tgz#b53ebb5accc34a68bf7a63d16130ca7c568f8a51" - integrity sha512-Z0U0Ih8A7V3J1gq7AXnXbrGAD2ERmz7JbREJJRHDWiUNxIqGQiV3Odo1V8FL5n/cKvLwSYM2Ubvk10gb0+3njA== + version "8.1.2" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-8.1.2.tgz#1b20c3e53520bf8bbece4ba88171dec79eb78e9c" + integrity sha512-Dxm99iuv265AlUf3aX3nRl+Iqrj3RvlQgPOYLsV1EEVnA2+4Mjj52zbKgdOOOfhCF48imVbaU45Sh8p2l1xdOw== dependencies: canonical-path "1.0.0" chokidar "^2.1.1" @@ -192,108 +173,87 @@ magic-string "^0.25.0" minimist "^1.2.0" reflect-metadata "^0.1.2" - shelljs "^0.8.1" source-map "^0.6.1" tslib "^1.9.0" yargs "13.1.0" "@angular/compiler@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-8.0.0.tgz#302c987737e1473db3a113ff70fbbb315aa41b58" - integrity sha512-4rKsVFMNykF83tPL1VE1+j9kZ3cWHUsLOAB/VqmF64EcR/GsbjKog2v23rSso5kqUtPiVq/FWGYllW6qMdxtJA== + version "8.1.2" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-8.1.2.tgz#db91a652a5c725b553ef946976446121c024bd0b" + integrity sha512-oRkHrstOV6imbb4mGf6q20d4N4iYfBbI6WfxtPL4dz08GipGg4Zvekn4e3R01vzhFBxssGcgmeEtFQJh/UzI8g== dependencies: tslib "^1.9.0" "@angular/core@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-8.0.0.tgz#bf7a582b818e9181d830219907470e2b865ba32f" - integrity sha512-mrkP1PTzqCmZGLYll+TDyawLXHzi+FcRPqSuRxCmDMthUUE93SLXT2yISDkx9aMPtFKgFr6KfrIkKuCz16BP/g== + version "8.1.2" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-8.1.2.tgz#d05a4965093a9ce7e7776088dc2b9e7e885e8d9f" + integrity sha512-Gm/UIUnIkeah39vxi4enVH/CUcPZOgGDyw4RNagw4pH8dTP8V0RUz8uteOr3DS+Eh49BcHkrT2oU5MBZSZ3lvw== dependencies: tslib "^1.9.0" "@angular/platform-browser-dynamic@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.0.0.tgz#c15f394579ff44f3752033de58edc1afa5065d59" - integrity sha512-dx7W7JoSFbsveexjZ/BPlsXbMDLWVLmRCo7IqLvibMrTbdpaaOCNJIXJk1X+f7JJrQ7SwlZaVkoLCMoDWw6fmA== + version "8.1.2" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.1.2.tgz#10297054900daf8728e9ad8531d7ea40d1270bc7" + integrity sha512-NmbGMwKPbYq3ZFt6nOqRslJsQNRS2E94cjkSLseEb5wauUmdUBX9stoHu8BOhvd+EIEcYhD7uxPB+L/qPsH46g== dependencies: tslib "^1.9.0" "@angular/platform-browser@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-8.0.0.tgz#fc7c55a0483e67e5606e499c129fda60ae8d4363" - integrity sha512-fTD+pTMbq+On9Uv3VXiei2lfuX7GX31dngm/Y4yWTFeW6eXy0+7kkfflzpLOb0hykCZvcXzarqCuEBBYNLrrOg== + version "8.1.2" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-8.1.2.tgz#5e136f10656a950d5a8e65da68a7270fadc83875" + integrity sha512-n61OtH3B0e+LTHCfHPjB7hiuo0ZxKxZvNWigczGyLZf2abga5jac2bNrdZnU8zXC44AUfasUD2qDS2IPIhNbqA== dependencies: tslib "^1.9.0" "@angular/router@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-8.0.0.tgz#26094fd473e17441b0ae8af4883ec1b4ea3ad569" - integrity sha512-DGUTb8qpndE5m716xh00GxuC8o7qamlqbUruGB+SQD6ynU7s5yLGxtKffxqb1BT63+YewpsVxc2Koruvb1qjDw== + version "8.1.2" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-8.1.2.tgz#83dbab106918225da9a3e03945380483f244085e" + integrity sha512-+SWoYZHyDBBUydDTbIu+hyoGzWtSA4VUsriUPWEOCplzQiabFhWxVvcT00mO0cim4XfupL1tmiPjE66sivLYBw== dependencies: tslib "^1.9.0" "@angular/upgrade@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@angular/upgrade/-/upgrade-8.0.0.tgz#7a756815c553350ba4cd64a0275ac6fc14286898" - integrity sha512-HRL99P13Mql3/kyrX/XUHqA8fdXC6QAmEnbcatAyCq6BGjJ047z1EFv/A6LHXXN5GFAgziyQbEqw3CnhjUeRVw== + version "8.1.2" + resolved "https://registry.yarnpkg.com/@angular/upgrade/-/upgrade-8.1.2.tgz#65a18d42e593fda7316cf4d4db925962b1dc84cb" + integrity sha512-VqpZC5ulA91s8CjlsrjjusPQ0RQgfJ5jeOBxVvfpZE6x213E0ONXHhjbvaHqarSOPJ2DPRJIdNKZLvY/rXBSDw== dependencies: tslib "^1.9.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.0.1": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" - integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== +"@babel/core@^7.0.1", "@babel/core@^7.1.0": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" + integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helpers" "^7.4.4" - "@babel/parser" "^7.4.5" + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" + "@babel/helpers" "^7.5.5" + "@babel/parser" "^7.5.5" "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.5" - "@babel/types" "^7.4.4" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" - lodash "^4.17.11" + lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.4.tgz#84055750b05fcd50f9915a826b44fa347a825250" - integrity sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ== +"@babel/generator@^7.4.0", "@babel/generator@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" + integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helpers" "^7.4.4" - "@babel/parser" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.11" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.4.0", "@babel/generator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" - integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== - dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.5.5" jsesc "^2.5.1" - lodash "^4.17.11" + lodash "^4.17.13" source-map "^0.5.0" trim-right "^1.0.1" @@ -321,14 +281,14 @@ "@babel/traverse" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/helper-define-map@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" - integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== +"@babel/helper-define-map@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" + integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== dependencies: "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.4.4" - lodash "^4.17.11" + "@babel/types" "^7.5.5" + lodash "^4.17.13" "@babel/helper-explode-assignable-expression@^7.1.0": version "7.1.0" @@ -361,12 +321,12 @@ dependencies: "@babel/types" "^7.4.4" -"@babel/helper-member-expression-to-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" - integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== +"@babel/helper-member-expression-to-functions@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" + integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.5.5" "@babel/helper-module-imports@^7.0.0": version "7.0.0" @@ -376,16 +336,16 @@ "@babel/types" "^7.0.0" "@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" - integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" + integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" "@babel/template" "^7.4.4" - "@babel/types" "^7.4.4" - lodash "^4.17.11" + "@babel/types" "^7.5.5" + lodash "^4.17.13" "@babel/helper-optimise-call-expression@^7.0.0": version "7.0.0" @@ -400,11 +360,11 @@ integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== "@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" - integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" + integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== dependencies: - lodash "^4.17.11" + lodash "^4.17.13" "@babel/helper-remap-async-to-generator@^7.1.0": version "7.1.0" @@ -417,15 +377,15 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" - integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== +"@babel/helper-replace-supers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" + integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-member-expression-to-functions" "^7.5.5" "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" "@babel/helper-simple-access@^7.1.0": version "7.1.0" @@ -452,33 +412,28 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" - integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== +"@babel/helpers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" + integrity sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g== dependencies: "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" "@babel/highlight@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" - integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" - integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w== - -"@babel/parser@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" - integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4", "@babel/parser@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" + integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -489,6 +444,14 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" +"@babel/plugin-proposal-dynamic-import@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" + integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-proposal-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" @@ -497,10 +460,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" - integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== +"@babel/plugin-proposal-object-rest-spread@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" + integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" @@ -529,6 +492,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-dynamic-import@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" @@ -557,10 +527,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" - integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== +"@babel/plugin-transform-async-to-generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" + integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -573,25 +543,25 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" - integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== +"@babel/plugin-transform-block-scoping@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" + integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.11" + lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" - integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== +"@babel/plugin-transform-classes@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" + integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.4.4" + "@babel/helper-define-map" "^7.5.5" "@babel/helper-function-name" "^7.1.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-replace-supers" "^7.5.5" "@babel/helper-split-export-declaration" "^7.4.4" globals "^11.1.0" @@ -602,10 +572,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" - integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== +"@babel/plugin-transform-destructuring@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" + integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -618,10 +588,10 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" -"@babel/plugin-transform-duplicate-keys@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" - integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== +"@babel/plugin-transform-duplicate-keys@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" + integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -662,30 +632,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" - integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== +"@babel/plugin-transform-modules-amd@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" + integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" - integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== +"@babel/plugin-transform-modules-commonjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" + integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== dependencies: "@babel/helper-module-transforms" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" + babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" - integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== +"@babel/plugin-transform-modules-systemjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" + integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== dependencies: "@babel/helper-hoist-variables" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" "@babel/plugin-transform-modules-umd@^7.2.0": version "7.2.0" @@ -709,13 +682,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-super@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" - integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== +"@babel/plugin-transform-object-super@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" + integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-replace-supers" "^7.5.5" "@babel/plugin-transform-parameters@^7.4.4": version "7.4.4" @@ -794,42 +767,44 @@ regexpu-core "^4.5.4" "@babel/preset-env@^7.0.0": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" - integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.5.tgz#bc470b53acaa48df4b8db24a570d6da1fef53c9a" + integrity sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-dynamic-import" "^7.5.0" "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-object-rest-spread" "^7.5.5" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" "@babel/plugin-syntax-json-strings" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-async-to-generator" "^7.5.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.4.4" - "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-block-scoping" "^7.5.5" + "@babel/plugin-transform-classes" "^7.5.5" "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-destructuring" "^7.5.0" "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.5.0" "@babel/plugin-transform-exponentiation-operator" "^7.2.0" "@babel/plugin-transform-for-of" "^7.4.4" "@babel/plugin-transform-function-name" "^7.4.4" "@babel/plugin-transform-literals" "^7.2.0" "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.4.4" - "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-amd" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.5.0" + "@babel/plugin-transform-modules-systemjs" "^7.5.0" "@babel/plugin-transform-modules-umd" "^7.2.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-object-super" "^7.5.5" "@babel/plugin-transform-parameters" "^7.4.4" "@babel/plugin-transform-property-literals" "^7.2.0" "@babel/plugin-transform-regenerator" "^7.4.5" @@ -840,7 +815,7 @@ "@babel/plugin-transform-template-literals" "^7.4.4" "@babel/plugin-transform-typeof-symbol" "^7.2.0" "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/types" "^7.5.5" browserslist "^4.6.0" core-js-compat "^3.1.1" invariant "^2.2.2" @@ -848,9 +823,9 @@ semver "^5.5.0" "@babel/runtime@^7.1.2", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.4": - version "7.5.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.4.tgz#cb7d1ad7c6d65676e66b47186577930465b5271b" - integrity sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q== + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" + integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== dependencies: regenerator-runtime "^0.13.2" @@ -863,43 +838,28 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8" - integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" + integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/parser" "^7.5.5" + "@babel/types" "^7.5.5" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.11" + lodash "^4.17.13" -"@babel/traverse@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" - integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.4.5" - "@babel/types" "^7.4.4" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.11" - -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" - integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" + integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== dependencies: esutils "^2.0.2" - lodash "^4.17.11" + lodash "^4.17.13" to-fast-properties "^2.0.0" "@cnakazawa/watch@^1.0.3": @@ -1103,50 +1063,50 @@ glob-to-regexp "^0.3.0" "@nestjs/common@^6.2.4": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-6.2.4.tgz#ee6ff8b07494ce7242b1e61fb7fae9f64ec963d6" - integrity sha512-YZvJ6/S7yVQZK+9rupCzMCg4tpbc9DyVvLoTx0NBDqExTCUNcNEcCtn0AZrO/hLqbeYODnJwGE2NxkH1R/qw+w== + version "6.5.3" + resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-6.5.3.tgz#25a3916b53f1e681640641bdb96a40bb37a15515" + integrity sha512-8d39grIMrUYGKM46BFWxB6csQFCu1S2aK7azPivg7gTRVSbvR84cVd6tgRVM0LwFpqQrtn3Q6G6Pa8FSk7Kh1w== dependencies: - axios "0.18.0" + axios "0.19.0" cli-color "1.4.0" uuid "3.3.2" "@nestjs/core@^6.2.4": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-6.2.4.tgz#ab2436ebfee356ae4ac66f19378f8ed57ac2c3c9" - integrity sha512-aYKi3QGKmpxF6w32STAcobIqOHFqSUXrU8nF+Y9dOlStRkXFBTuVchsoJk94sY+3y4SJAlHH4Q/8R4yFaixrug== + version "6.5.3" + resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-6.5.3.tgz#0cfd4388f07f15ab7b49aa0ff7ed594f51446378" + integrity sha512-ZhYfH49sVmUUw02qsaGozCFOOehlEABakYzRShyDDq30/2+ek3KpE0DfvA9tXlzX2KVrac2qDTBxMOPoJ+zY+g== dependencies: - "@nuxtjs/opencollective" "0.2.1" + "@nuxtjs/opencollective" "0.2.2" fast-safe-stringify "2.0.6" - iterare "1.1.2" + iterare "1.2.0" object-hash "1.3.1" optional "0.1.4" uuid "3.3.2" "@nestjs/platform-express@^6.2.4": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-6.2.4.tgz#cf7d8d758f185d5d2513d3916475c17ecd394e76" - integrity sha512-MmoQqFWO7nmgEvBIeO6ddz1CFVx3RIQluX1LMIzyfiyRghQzcZCGqTQsZSpck5ZnXNQNxrrI9bz/6a6cTwovmQ== + version "6.5.3" + resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-6.5.3.tgz#0260f2c13e5914dc121dbd3a221afb5305b9f813" + integrity sha512-c5n4XUbDDmF6MfBGYWM1jtsIDpVsOfOQtf3S0w3IeJNqm7dnmVAvO2Jk+RsYpt50tN4NAXntM3YTuTDqMb9uiA== dependencies: body-parser "1.19.0" cors "2.8.5" - express "4.17.0" - multer "1.4.1" + express "4.17.1" + multer "1.4.2" "@nestjs/schematics@^6.3.0": - version "6.3.0" - resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-6.3.0.tgz#d428d4f238d23f21434f58c4a20fce76fab19070" - integrity sha512-SIb5eGoFjXu1RpMgC5lqh2Khbyf391zBrNj9Xjy4rN+6eArdlr439CPT17SI2QlFAzHiFEOQOMbpqv2ipx6ufA== + version "6.4.1" + resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-6.4.1.tgz#f2748419ac8ddcd5ecb8b7ebc76bae40ee8d0103" + integrity sha512-2NSdJUZDbjA7GmFJ/bUORzcSj6rWDUMZuscwhSRtC++quYyMpK8xfZ2W3640427fRBzPfub6pJGytF399b8PaQ== dependencies: - "@angular-devkit/core" "7.3.8" - "@angular-devkit/schematics" "7.3.8" - ts-morph "^1.3.1" + "@angular-devkit/core" "8.1.2" + "@angular-devkit/schematics" "8.1.2" + ts-morph "^3.0.0" typescript "^3.2.2" "@nestjs/testing@^6.2.4": - version "6.2.4" - resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-6.2.4.tgz#23a3480fa6c46b24940187b3d6ed21c784709865" - integrity sha512-l5uxeNz+CksHaVcHxSlpo0vyJxvZP7BM1vS6BKuqtn/lNlIITAkdWmCVfBldN8Okayj3B2yhc04Zq6imU3aX9w== + version "6.5.3" + resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-6.5.3.tgz#fcc2a9ed77ae2f5626e6472e67964a0c401edec6" + integrity sha512-W8tPhkNVhmX+jaDu4R7WUOtIl0PK3ZDso434rEm/b1+S6ZRgAKwNVHWM/rwIuTi5+erPTEULtTsZgrXFrzC1sA== dependencies: optional "0.1.4" @@ -1196,15 +1156,36 @@ tree-kill "1.2.1" webpack-sources "1.3.0" +"@nodelib/fs.scandir@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz#7fa8fed654939e1a39753d286b48b4836d00e0eb" + integrity sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg== + dependencies: + "@nodelib/fs.stat" "2.0.1" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.1", "@nodelib/fs.stat@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz#814f71b1167390cfcb6a6b3d9cdeb0951a192c14" + integrity sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw== + "@nodelib/fs.stat@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@nuxtjs/opencollective@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.2.1.tgz#ddf3e6a22990997322bc2b82e2455a7fbffc518d" - integrity sha512-pzSib8NKquaTt/ns5Cc2G0BGRVJXaD+p1qfF6q7vNIMvRysorn/VF3y7gAuQpcxfF7wBbGE+dXjhIieWOUsWSw== +"@nodelib/fs.walk@^1.2.1": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz#6a6450c5e17012abd81450eb74949a4d970d2807" + integrity sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ== + dependencies: + "@nodelib/fs.scandir" "2.1.1" + fastq "^1.6.0" + +"@nuxtjs/opencollective@0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz#26a761ebf588cc92a422d7cee996a66bd6e2761e" + integrity sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw== dependencies: chalk "^2.4.1" consola "^2.3.0" @@ -1225,14 +1206,6 @@ universal-user-agent "^2.0.0" url-template "^2.0.8" -"@schematics/angular@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.0.0.tgz#47954888fb8acbc3600235db7a46229c47fe5d9c" - integrity sha512-c/cFpe+u7Xh4xX3/kn9BSRY4YhdO0OsDbRK0pGLDJFFs5JGvwoURtNXn4/4dVlsj3PWyNhxK0Ljl3dyw3NQBHA== - dependencies: - "@angular-devkit/core" "8.0.0" - "@angular-devkit/schematics" "8.0.0" - "@schematics/angular@8.1.1": version "8.1.1" resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.1.1.tgz#cfc2e68bef11a0de39a4f663f0a0a9c79ca3d88d" @@ -1260,11 +1233,23 @@ resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#8013f2af54a2b7d735f71560ff360d3a8176a87b" integrity sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q== +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + "@sindresorhus/is@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + "@testing-library/dom@^5.5.4": version "5.6.0" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-5.6.0.tgz#18a7c162a6a79964e731ad7b810022a28218047c" @@ -1290,9 +1275,9 @@ integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== "@types/babel__core@^7.1.0": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.1.tgz#ce9a9e5d92b7031421e1d0d74ae59f572ba48be6" - integrity sha512-+hjBtgcFPYyCTo0A15+nxrCVJL7aC6Acg87TXd5OW3QhHswdrOLoles+ldL2Uk8q++7yIfl4tURtztccdeeyOw== + version "7.1.2" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f" + integrity sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1316,9 +1301,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2" - integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw== + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" + integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== dependencies: "@babel/types" "^7.3.0" @@ -1348,9 +1333,9 @@ integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== "@types/express-serve-static-core@*": - version "4.16.4" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.4.tgz#56bb8be4559401d68af4a3624ae9dd3166103e60" - integrity sha512-x/8h6FHm14rPWnW2HP5likD/rsqJ3t/77OWx2PLxym0hXbeBWQmcPyHmwX+CtCQpjIfgrUdEoDFcLPwPZWiqzQ== + version "4.16.7" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.7.tgz#50ba6f8a691c08a3dd9fa7fba25ef3133d298049" + integrity sha512-847KvL8Q1y3TtFLRTXcVakErLJQgdpFSaq+k043xefz9raEf0C7HalpSY7OW5PyjCnY8P7bPW5t/Co9qqp+USg== dependencies: "@types/node" "*" "@types/range-parser" "*" @@ -1394,9 +1379,9 @@ "@types/istanbul-lib-report" "*" "@types/jasmine@*": - version "3.3.12" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.3.12.tgz#bf282cb540e9ad7a0a04b742082c073b655eab39" - integrity sha512-lXvr2xFQEVQLkIhuGaR3GC1L9lMU1IxeWnAF/wNY5ZWpC4p9dgxkKkzMp7pntpAdv9pZSnYqgsBkCg32MXSZMg== + version "3.3.15" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.3.15.tgz#545be0670e828ac570566c45be570bbffcbc66d8" + integrity sha512-MljubxUVLT9wh/0NiyRWlcxSu/0axK+UYheZ04N5yaQclQkE8JuFYMsmwltPap2LEsJrvSf5p49/1514IY+d1Q== "@types/jasmine@~2.8.6": version "2.8.16" @@ -1432,20 +1417,15 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== -"@types/minimatch@*": +"@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/node@*": - version "12.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.0.tgz#d11813b9c0ff8aaca29f04cbc12817f4c7d656e5" - integrity sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg== - -"@types/node@^11.13.9": - version "11.13.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.10.tgz#4df59e5966b56f512bac98898bcbee5067411f0f" - integrity sha512-leUNzbFTMX94TWaIKz8N15Chu55F9QSH+INKayQr5xpkasBQBRF3qQXfo3/dOnMU/dEIit+Y/SU8HyOjq++GwA== +"@types/node@*", "@types/node@^12.6.2": + version "12.6.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.8.tgz#e469b4bf9d1c9832aee4907ba8a051494357c12c" + integrity sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg== "@types/node@~8.9.4": version "8.9.5" @@ -1458,9 +1438,9 @@ integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== "@types/prettier@^1.10.0": - version "1.16.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.16.3.tgz#141bdf4dcbaac06fd2b3f05e233ff23b66866f9f" - integrity sha512-5Ksgx9H/Yjz6oamDbmDZstWlJGPTao7shNfambjf8o7OkHxDwAi0AJLQcFwS9pDKI4gQPdiKZXze3nT1eCOViQ== + version "1.18.0" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.18.0.tgz#d2dbe4d5f76b455138f13a2d881278e2c06a733d" + integrity sha512-5N6WK/XXs9PLPpge2KOmOSaIym2vIo32GsrxM5YOFs7uZ8R9L/acg+hQzWsfwoHEpasqQkH0+3LzLTbiF1GFLQ== "@types/prop-types@*": version "15.7.1" @@ -1480,9 +1460,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^16.8.4": - version "16.8.17" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.17.tgz#f287b76a5badb93bc9aa3f54521a3eb53d6c2374" - integrity sha512-pln3mgc6VfkNg92WXODul/ONo140huK9OMsx62GlBlZ2lvjNK86PQJhYMPLO1i66aF5O9OPyZefogvNltBIszA== + version "16.8.23" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.23.tgz#ec6be3ceed6353a20948169b6cb4c97b65b97ad2" + integrity sha512-abkEOIeljniUN9qB5onp++g0EY38h7atnDHxwKUFz1r3VH1+yG1OKi2sNPTyObL40goBmfKFpdii2lEzwLX1cA== dependencies: "@types/prop-types" "*" csstype "^2.2.0" @@ -1534,9 +1514,9 @@ source-map "^0.6.1" "@types/webpack@^4.4.24": - version "4.4.31" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.4.31.tgz#f59b9d8210cf4d2fd254fe6d1f5ba86e557867f5" - integrity sha512-WNALmv/wxy2+OoF7A5GD8BVotXnkuMHlojVWKj/neFHU3Ut2Azbu1A7Yi2Vr6eX3z+31XgR/dJ5NpX4pQZ7ieQ== + version "4.32.0" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.32.0.tgz#bd4a149964cd471538f2781f2be5f9815175463b" + integrity sha512-kpz5wHDyG/WEpzX9gcwFp/w0oSsq0n/rmFdJelk/QBMHmNIOZdiTDInV0Lj8itGKBahQrBgJGJRss/6UHgLuKg== dependencies: "@types/anymatch" "*" "@types/node" "*" @@ -1755,19 +1735,19 @@ acorn-globals@^4.1.0, acorn-globals@^4.3.0: acorn-walk "^6.0.1" acorn-walk@^6.0.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" - integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== acorn@^5.5.3: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.5, acorn@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" - integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== +acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.5, acorn@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51" + integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q== add-stream@^1.0.0: version "1.0.0" @@ -1779,7 +1759,14 @@ after@0.8.2: resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= -agent-base@4, agent-base@^4.1.0, agent-base@~4.2.1: +agent-base@4, agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +agent-base@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== @@ -1799,11 +1786,11 @@ ajv-errors@^1.0.0: integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" - integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@6.10.0, ajv@^6.1.0, ajv@^6.5.5: +ajv@6.10.0: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== @@ -1813,16 +1800,6 @@ ajv@6.10.0, ajv@^6.1.0, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@6.9.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.1.tgz#a4d3683d74abc5670e75f0b16520f70a20ea8dc1" - integrity sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^5.0.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -1833,6 +1810,16 @@ ajv@^5.0.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" +ajv@^6.1.0, ajv@^6.5.5: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -1850,6 +1837,13 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + ansi-colors@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.0.tgz#e1674bd61027c8c219b9edec929b6b57641b0c09" @@ -1954,9 +1948,9 @@ are-we-there-yet@~1.1.2: readable-stream "^2.0.6" arg@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0" - integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== + version "4.1.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.1.tgz#485f8e7c390ce4c5f78257dbea80d4be11feda4c" + integrity sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw== argparse@^1.0.7: version "1.0.10" @@ -1995,10 +1989,10 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= +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-equal@^1.0.0: version "1.0.0" @@ -2047,6 +2041,11 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" +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== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -2067,11 +2066,16 @@ arraybuffer.slice@~0.0.7: resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== -arrify@^1.0.0, arrify@^1.0.1: +arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -2121,7 +2125,7 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-each@^1.0.0, async-each@^1.0.1: +async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== @@ -2150,12 +2154,12 @@ async@^1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.5.0, async@^2.6.1, async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== +async@^2.5.0, async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== dependencies: - lodash "^4.17.11" + lodash "^4.17.14" async@~0.9.0: version "0.9.2" @@ -2185,17 +2189,18 @@ autoprefixer@9.6.0: postcss "^7.0.16" postcss-value-parser "^3.3.1" -autoprefixer@^9.0.0: - version "9.5.1" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.5.1.tgz#243b1267b67e7e947f28919d786b50d3bb0fb357" - integrity sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ== +autoprefixer@^9.6.0: + version "9.6.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47" + integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw== dependencies: - browserslist "^4.5.4" - caniuse-lite "^1.0.30000957" + browserslist "^4.6.3" + caniuse-lite "^1.0.30000980" + chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.14" - postcss-value-parser "^3.3.1" + postcss "^7.0.17" + postcss-value-parser "^4.0.0" aws-sign2@~0.7.0: version "0.7.0" @@ -2207,13 +2212,13 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -axios@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" - integrity sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI= +axios@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" + integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== dependencies: - follow-redirects "^1.3.0" - is-buffer "^1.1.5" + follow-redirects "1.5.10" + is-buffer "^2.0.2" axobject-query@^2.0.2: version "2.0.2" @@ -2420,11 +2425,19 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-istanbul@^5.1.0: - version "5.1.4" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz#841d16b9a58eeb407a0ddce622ba02fe87a752ba" - integrity sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ== +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" find-up "^3.0.0" istanbul-lib-instrument "^3.3.0" test-exclude "^5.2.3" @@ -2881,10 +2894,10 @@ bluebird@3.5.0: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw= -bluebird@^3.3.0, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3: - version "3.5.4" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" - integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== +bluebird@^3.3.0, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" @@ -2907,22 +2920,6 @@ body-parser@1.18.2: raw-body "2.3.2" type-is "~1.6.15" -body-parser@1.18.3: - version "1.18.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" - integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "~1.6.3" - iconv-lite "0.4.23" - on-finished "~2.3.0" - qs "6.5.2" - raw-body "2.3.3" - type-is "~1.6.16" - body-parser@1.19.0, body-parser@^1.16.1: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -2969,6 +2966,20 @@ boxen@^1.2.1: term-size "^1.2.0" widest-line "^2.0.0" +boxen@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-3.2.0.tgz#fbdff0de93636ab4450886b6ff45b92d098f45eb" + integrity sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A== + dependencies: + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^2.4.2" + cli-boxes "^2.2.0" + string-width "^3.0.0" + term-size "^1.2.0" + type-fest "^0.3.0" + widest-line "^2.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2986,7 +2997,7 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -3002,7 +3013,7 @@ braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.2: +braces@^3.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== @@ -3102,25 +3113,7 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.0.0, browserslist@^4.5.4: - version "4.5.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.6.tgz#ea42e8581ca2513fa7f371d4dd66da763938163d" - integrity sha512-o/hPOtbU9oX507lIqon+UvPYqpx3mHc8cV3QemSBTXwkG8gSQSK6UKvXcE/DcleU3+A59XTUHyCvZ5qGy8xVAg== - dependencies: - caniuse-lite "^1.0.30000963" - electron-to-chromium "^1.3.127" - node-releases "^1.1.17" - -browserslist@^4.6.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.2.tgz#574c665950915c2ac73a4594b8537a9eba26203f" - integrity sha512-2neU/V0giQy9h3XMPwLhEY3+Ao0uHSwHvU8Q1Ea6AgLVL1sXbX3dzPrJ8NWe5Hi4PoTkCYXOtVR9rfRLI0J/8Q== - dependencies: - caniuse-lite "^1.0.30000974" - electron-to-chromium "^1.3.150" - node-releases "^1.1.23" - -browserslist@^4.6.1: +browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.1, browserslist@^4.6.2, browserslist@^4.6.3: version "4.6.6" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.6.tgz#6e4bf467cde520bc9dbdf3747dafa03531cec453" integrity sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA== @@ -3137,9 +3130,9 @@ bs-logger@0.x: fast-json-stable-stringify "2.x" bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= + version "2.1.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" + integrity sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg== dependencies: node-int64 "^0.4.0" @@ -3241,22 +3234,22 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cacache@^11.0.1, cacache@^11.0.2, cacache@^11.3.2: - version "11.3.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" - integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== +cacache@^11.3.2, cacache@^11.3.3: + version "11.3.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" + integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== dependencies: - bluebird "^3.5.3" + bluebird "^3.5.5" chownr "^1.1.1" figgy-pudding "^3.5.1" - glob "^7.1.3" + glob "^7.1.4" graceful-fs "^4.1.15" lru-cache "^5.1.1" mississippi "^3.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" - rimraf "^2.6.2" + rimraf "^2.6.3" ssri "^6.0.1" unique-filename "^1.1.1" y18n "^4.0.0" @@ -3289,6 +3282,19 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + cachedir@1.3.0, cachedir@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-1.3.0.tgz#5e01928bf2d95b5edd94b0942188246740e0dbc4" @@ -3365,7 +3371,7 @@ camelcase@^4.0.0, camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^5.0.0: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -3375,20 +3381,10 @@ caniuse-lite@1.0.30000979: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000979.tgz#92f16d00186a6cf20d6c5711bb6e042a3d667029" integrity sha512-gcu45yfq3B7Y+WB05fOMfr0EiSlq+1u+m6rPHyJli/Wy3PVQNGaU7VA4bZE5qw+AU2UVOBR/N5g1bzADUqdvFw== -caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000957, caniuse-lite@^1.0.30000963: - version "1.0.30000967" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz#a5039577806fccee80a04aaafb2c0890b1ee2f73" - integrity sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ== - -caniuse-lite@^1.0.30000971, caniuse-lite@^1.0.30000975, caniuse-lite@^1.0.30000984: - version "1.0.30000984" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000984.tgz#dc96c3c469e9bcfc6ad5bdd24c77ec918ea76fe0" - integrity sha512-n5tKOjMaZ1fksIpQbjERuqCyfgec/m9pferkFQbLmWtqLUdmt12hNhjSwsmPdqeiG2NkITOQhr1VYIwWSAceiA== - -caniuse-lite@^1.0.30000974: - version "1.0.30000974" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8" - integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww== +caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000971, caniuse-lite@^1.0.30000975, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000984: + version "1.0.30000985" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000985.tgz#0eb40f6c8a8c219155cbe43c4975c0efb4a0f77f" + integrity sha512-1ngiwkgqAYPG0JSSUp3PUDGPKKY59EK7NrGGX+VOxaKCNzRbNc7uXMny+c3VJfZxtoK3wSImTvG9T9sXiTw2+w== canonical-path@1.0.0: version "1.0.0" @@ -3456,27 +3452,7 @@ check-more-types@2.24.0: resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= -chokidar@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" - optionalDependencies: - fsevents "^1.2.2" - -"chokidar@>=2.0.0 <4.0.0": +"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.2.tgz#0d1cd6d04eb2df0327446188cd13736a3367d681" integrity sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA== @@ -3491,26 +3467,7 @@ chokidar@2.0.4: optionalDependencies: fsevents "^2.0.6" -chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4, chokidar@^2.1.1: - version "2.1.5" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" - integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^2.1.6: +chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4, chokidar@^2.1.1, chokidar@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== @@ -3530,14 +3487,14 @@ chokidar@^2.1.6: fsevents "^1.2.7" chownr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + version "1.1.2" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" + integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== dependencies: tslib "^1.9.0" @@ -3586,6 +3543,11 @@ cli-boxes@^1.0.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= +cli-boxes@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" + integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== + cli-color@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f" @@ -3654,7 +3616,7 @@ clone-deep@^2.0.1: kind-of "^6.0.0" shallow-clone "^1.0.0" -clone-response@1.0.2: +clone-response@1.0.2, clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= @@ -3676,10 +3638,10 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -code-block-writer@7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-7.2.2.tgz#14ec0120de9a65d2cc5d214561d51d1660dddbb1" - integrity sha512-8SyXM1bWsMDCzvCoTdnDBhnnUbHntxcba4ApBIO3S3QX0M2Iq0xZCzs6SYdBOGaSUi4drysvrAK15JoXhlpsvQ== +code-block-writer@9.4.1: + version "9.4.1" + resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-9.4.1.tgz#1448fca79dfc7a3649000f4c85be6bc770604c4c" + integrity sha512-LHAB+DL4YZDcwK8y/kAxZ0Lf/ncwLh/Ux4cTVWbPwIdrf1gPxXiPcwpz8r8/KqXu1aD+Raz46EOxDjFlbyO6bA== code-point-at@^1.0.0: version "1.1.0" @@ -3748,7 +3710,7 @@ commander@2.17.x: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@^2.11.0, commander@^2.12.0, commander@^2.12.1, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0: +commander@^2.11.0, commander@^2.12.0, commander@^2.12.1, commander@^2.20.0, commander@~2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== @@ -3799,9 +3761,9 @@ compare-func@^1.3.1: dot-prop "^3.0.0" compare-versions@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" - integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== + version "3.5.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.5.0.tgz#85fc22a1ae9612ff730d77fb092295acd056d311" + integrity sha512-hX+4kt2Rcwu+x1U0SsEFCn1quURjEjPEGH/cPBlpME/IidGimAdwfMU+B+xDr7et/KTR7VH2+ZqWGerv4NGs2w== component-bind@1.0.0: version "1.0.0" @@ -3870,25 +3832,37 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +configstore@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" + integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + connect-history-api-fallback@^1.3.0, connect-history-api-fallback@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== connect@^3.6.0: - version "3.6.6" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" - integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== dependencies: debug "2.6.9" - finalhandler "1.1.0" - parseurl "~1.3.2" + finalhandler "1.1.2" + parseurl "~1.3.3" utils-merge "1.0.1" consola@^2.3.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/consola/-/consola-2.6.2.tgz#4c1238814bb80688b19f0db97123508889577752" - integrity sha512-GNJhwvF4bJ8eiAlyB8r4WNM8kBqkl+y4DvMehMbyywoJiv37N0M6/xrKqrrZw/5maZA+UagQV8UZ+XBeuGMzUg== + version "2.9.0" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.9.0.tgz#57760e3a65a53ec27337f4add31505802d902278" + integrity sha512-34Iue+LRcWbndFIfZc5boNizWlsrRjqIBJZTe591vImgbnq7nx2EzlrLtANj9TH2Fxm7puFJBJAOk5BhvZOddQ== console-browserify@^1.1.0: version "1.1.0" @@ -4108,9 +4082,9 @@ conventional-changelog-writer@^3.0.9: through2 "^2.0.0" conventional-changelog-writer@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.5.tgz#fb9e384bb294e8e8a9f2568a3f4d1e11953d8641" - integrity sha512-g/Myp4MaJ1A+f7Ai+SnVhkcWtaHk6flw0SYN7A+vQ+MTu0+gSovQWs4Pg4NtcNUcIztYQ9YHsoxHP+GGQplI7Q== + version "4.0.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.6.tgz#24db578ac8e7c89a409ef9bba12cf3c095990148" + integrity sha512-ou/sbrplJMM6KQpR5rKFYNVQYesFjN7WpNGdudQSWNi6X+RgyFUcSv871YBYkrUYV9EX8ijMohYVzn9RUb+4ag== dependencies: compare-func "^1.3.1" conventional-commits-filter "^2.0.2" @@ -4119,7 +4093,7 @@ conventional-changelog-writer@^4.0.5: json-stringify-safe "^5.0.1" lodash "^4.2.1" meow "^4.0.0" - semver "^5.5.0" + semver "^6.0.0" split "^1.0.0" through2 "^3.0.0" @@ -4213,12 +4187,12 @@ conventional-commits-parser@^3.0.0: trim-off-newlines "^1.0.0" conventional-commits-parser@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.2.tgz#1295590dd195f64f53d6f8eb7c41114bb9a60742" - integrity sha512-y5eqgaKR0F6xsBNVSQ/5cI5qIF3MojddSUi1vKIggRkqUTbkqFKH9P5YX/AT1BVZp9DtSzBTIkvjyVLotLsVog== + version "3.0.3" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.3.tgz#c3f972fd4e056aa8b9b4f5f3d0e540da18bf396d" + integrity sha512-KaA/2EeUkO4bKjinNfGUyqPTX/6w9JGshuQRik4r/wJz7rUw3+D3fDG6sZSEqJvKILzKXFQuFkpPLclcsAuZcg== dependencies: JSONStream "^1.0.4" - is-text-path "^1.0.0" + is-text-path "^2.0.0" lodash "^4.2.1" meow "^4.0.0" split2 "^2.0.0" @@ -4297,18 +4271,18 @@ copy-webpack-plugin@5.0.3: webpack-log "^2.0.0" core-js-compat@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.3.tgz#0cc3ba4c7f62928c2837e1cffbe8dc78b4f1ae14" - integrity sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA== + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.4.tgz#e4d0c40fbd01e65b1d457980fe4112d4358a7408" + integrity sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg== dependencies: - browserslist "^4.6.0" - core-js-pure "3.1.3" - semver "^6.1.0" + browserslist "^4.6.2" + core-js-pure "3.1.4" + semver "^6.1.1" -core-js-pure@3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.3.tgz#4c90752d5b9471f641514f3728f51c1e0783d0b5" - integrity sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA== +core-js-pure@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.4.tgz#5fa17dc77002a169a3566cc48dc774d2e13e3769" + integrity sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA== core-js@3.1.4: version "3.1.4" @@ -4316,9 +4290,9 @@ core-js@3.1.4: integrity sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ== core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0: - version "2.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" - integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -4343,7 +4317,7 @@ cosmiconfig@^4.0.0: parse-json "^4.0.0" require-from-string "^2.0.1" -cosmiconfig@^5.2.1: +cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== @@ -4496,21 +4470,21 @@ cssesc@^0.1.0: integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: - version "0.3.6" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" - integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^1.0.0, cssstyle@^1.1.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" - integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== dependencies: cssom "0.3.x" csstype@^2.2.0: - version "2.6.4" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.4.tgz#d585a6062096e324e7187f80e04f92bd0f00e37f" - integrity sha512-lAJUJP3M6HxFXbqtGRc0iZrdyeN+WzOWeY0q/VnFzI+kqVrYIzC7bWlKqCW7oCIdzoPkvfp82EVvrTlQ8zsWQg== + version "2.6.6" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.6.tgz#c34f8226a94bbb10c32cc0d714afdf942291fc41" + integrity sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg== cuint@^0.2.2: version "0.2.2" @@ -4595,11 +4569,12 @@ cz-conventional-changelog@^2.1.0: word-wrap "^1.0.3" d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: - es5-ext "^0.10.9" + es5-ext "^0.10.50" + type "^1.0.1" damerau-levenshtein@^1.0.4: version "1.0.5" @@ -4635,9 +4610,9 @@ date-fns@^1.27.2: integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== date-format@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.0.0.tgz#7cf7b172f1ec564f0003b39ea302c5498fb98c8f" - integrity sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" + integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== date-now@^0.1.4: version "0.1.4" @@ -4663,7 +4638,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: dependencies: ms "2.0.0" -debug@3.1.0, debug@~3.1.0: +debug@3.1.0, debug@=3.1.0, 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== @@ -4781,6 +4756,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e" + integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw== + define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -4938,11 +4918,16 @@ diff-sequences@^24.3.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== -diff@^3.1.0, diff@^3.2.0: +diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -4967,6 +4952,13 @@ dir-glob@^2.0.0: dependencies: path-type "^3.0.0" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -4988,9 +4980,9 @@ dns-txt@^2.0.2: buffer-indexof "^1.0.0" document-register-element@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/document-register-element/-/document-register-element-1.13.2.tgz#e1773941f6e39345aefec909cc753e82993b415d" - integrity sha512-zFmrflJsehS9r86gNiBdvShz+Iuvg8Xnxq715+mrTuHNBway5c24ldTdVmqKxpD4WQBo1HnSflvSJdPgSBb11A== + version "1.13.3" + resolved "https://registry.yarnpkg.com/document-register-element/-/document-register-element-1.13.3.tgz#81e44360a2e01ad0a56cf94bd1a7627e5cc2013e" + integrity sha512-hfggFwSF2bRJG2NLvzpMPLNOYaw3WC/cQ3ZWIl0zxiwfIimNaME53Mf6XFFVtQXpsAdCOf/Yw7tdQXIoSOvhTg== dependencies: lightercollective "^0.3.0" @@ -5107,24 +5099,14 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= ejs@^2.5.7: - version "2.6.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" - integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== + version "2.6.2" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.2.tgz#3a32c63d1cd16d11266cd4703b14fec4e74ab4f6" + integrity sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q== -electron-to-chromium@^1.3.127, electron-to-chromium@^1.3.47: - version "1.3.133" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.133.tgz#c47639c19b91feee3e22fad69f5556142007008c" - integrity sha512-lyoC8aoqbbDqsprb6aPdt9n3DpOZZzdz/T4IZKsR0/dkZIxnJVUjjcpOSwA66jPRIOyDAamCTAUqweU05kKNSg== - -electron-to-chromium@^1.3.150: - version "1.3.159" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.159.tgz#4292643c5cb77678821ce01557ba6dd0f562db5e" - integrity sha512-bhiEr8/A97GUBcUzNb9MFNhzQOjakbKmEKBEAa6UMY45zG2e8PM63LOgAPXEJE9bQiaQH6nOdYiYf8X821tZjQ== - -electron-to-chromium@^1.3.164, electron-to-chromium@^1.3.191: - version "1.3.193" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.193.tgz#de9b89959288070bffb14557daf8cf9f75b2caf8" - integrity sha512-WX01CG1UoPtTUFaKKwMn+u8nJ63loP6hNxePWtk1pN8ibWMyX1q6TiWPsz1ABBKXezvmaIdtP+0BwzjC1wyCaw== +electron-to-chromium@^1.3.164, electron-to-chromium@^1.3.191, electron-to-chromium@^1.3.47: + version "1.3.199" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.199.tgz#f9a62a74cda77854310a2abffde8b75591ea09a1" + integrity sha512-gachlDdHSK47s0N2e58GH9HMC6Z4ip0SfmYUa5iEbE50AKaOUXysaJnXMfKj0xB245jWbYcyFSH+th3rqsF8hA== elegant-spinner@^1.0.1: version "1.0.1" @@ -5132,9 +5114,9 @@ elegant-spinner@^1.0.1: integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + version "6.5.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.0.tgz#2b8ed4c891b7de3200e14412a5b8248c7af505ca" + integrity sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -5154,7 +5136,7 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -encodeurl@~1.0.1, encodeurl@~1.0.2: +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= @@ -5272,7 +5254,7 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: +es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: version "0.10.50" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== @@ -5281,7 +5263,7 @@ es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@ es6-symbol "~3.1.1" next-tick "^1.0.0" -es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: +es6-iterator@^2.0.3, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= @@ -5291,9 +5273,9 @@ es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: es6-symbol "^3.1.1" es6-promise@^4.0.3: - version "4.2.6" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" - integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== es6-promisify@^5.0.0: version "5.0.0" @@ -5311,13 +5293,13 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.1: es5-ext "~0.10.14" es6-weak-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== dependencies: d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" es6-symbol "^3.1.1" escape-html@~1.0.3: @@ -5372,10 +5354,10 @@ estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= -estree-walker@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.0.tgz#5d865327c44a618dde5699f763891ae31f257dae" - integrity sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw== +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== esutils@^2.0.2: version "2.0.2" @@ -5576,79 +5558,7 @@ express@4.16.3: utils-merge "1.0.1" vary "~1.1.2" -express@4.17.0: - version "4.17.0" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.0.tgz#288af62228a73f4c8ea2990ba3b791bb87cd4438" - integrity sha512-1Z7/t3Z5ZnBG252gKUPyItc4xdeaA0X934ca2ewckAsVsw9EG71i++ZHZPYnus8g/s5Bty8IMpSVEuRkmwwPRQ== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -express@^4.16.2: - version "4.16.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" - integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== - dependencies: - accepts "~1.3.5" - array-flatten "1.1.1" - body-parser "1.18.3" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.1" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.4" - qs "6.5.2" - range-parser "~1.2.0" - safe-buffer "5.1.2" - send "0.16.2" - serve-static "1.13.2" - setprototypeof "1.1.0" - statuses "~1.4.0" - type-is "~1.6.16" - utils-merge "1.0.1" - vary "~1.1.2" - -express@^4.17.1: +express@4.17.1, express@^4.16.2, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -5723,9 +5633,9 @@ external-editor@^2.0.1: tmp "^0.0.33" external-editor@^3.0.0, external-editor@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" - integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" @@ -5783,9 +5693,9 @@ fast-deep-equal@^2.0.1: integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= fast-glob@^2.0.2: - version "2.2.6" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" - integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== dependencies: "@mrmlnc/readdir-enhanced" "^2.2.1" "@nodelib/fs.stat" "^1.1.2" @@ -5794,6 +5704,18 @@ fast-glob@^2.0.2: merge2 "^1.2.3" micromatch "^3.1.10" +fast-glob@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.0.4.tgz#d484a41005cb6faeb399b951fd1bd70ddaebb602" + integrity sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg== + dependencies: + "@nodelib/fs.stat" "^2.0.1" + "@nodelib/fs.walk" "^1.2.1" + glob-parent "^5.0.0" + is-glob "^4.0.1" + merge2 "^1.2.3" + micromatch "^4.0.2" + fast-json-stable-stringify@2.0.0, fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -5814,6 +5736,13 @@ fastparse@^1.1.1: resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -5822,9 +5751,9 @@ faye-websocket@^0.10.0: websocket-driver ">=0.5.1" faye-websocket@~0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" - integrity sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg= + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== dependencies: websocket-driver ">=0.5.1" @@ -5918,19 +5847,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" - integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= - dependencies: - debug "2.6.9" - encodeurl "~1.0.1" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.3.1" - unpipe "~1.0.0" - finalhandler@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" @@ -5944,7 +5860,7 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" -finalhandler@~1.1.2: +finalhandler@1.1.2, finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== @@ -6025,9 +5941,9 @@ findup-sync@0.4.2: resolve-dir "^0.1.0" flatted@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" - integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== flush-write-stream@^1.0.0: version "1.1.1" @@ -6037,7 +5953,14 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.0.0, follow-redirects@^1.3.0: +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + +follow-redirects@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ== @@ -6142,7 +6065,7 @@ fs-extra@5.0.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@7.0.1, fs-extra@^7.0.0: +fs-extra@7.0.1, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -6160,10 +6083,19 @@ fs-extra@^1.0.0: jsonfile "^2.1.0" klaw "^1.0.0" +fs-extra@^8.0.0, fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + version "1.2.6" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" + integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== dependencies: minipass "^2.2.1" @@ -6182,7 +6114,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.2, fsevents@^1.2.7: +fsevents@^1.2.7: version "1.2.9" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== @@ -6262,6 +6194,13 @@ get-stream@^4.0.0, get-stream@^4.1.0: dependencies: pump "^3.0.0" +get-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -6405,7 +6344,7 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.4, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: +glob@7.1.4, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== @@ -6465,6 +6404,20 @@ globby@8.0.1: pify "^3.0.0" slash "^1.0.0" +globby@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" + integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -6541,10 +6494,27 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" + integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== graphviz@^0.0.8: version "0.0.8" @@ -6674,6 +6644,11 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -6815,6 +6790,11 @@ http-cache-semantics@3.8.1, http-cache-semantics@^3.8.1: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== +http-cache-semantics@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" + integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== + http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -6830,17 +6810,7 @@ http-errors@1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-errors@1.7.2, http-errors@~1.7.2: +http-errors@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== @@ -6851,10 +6821,31 @@ http-errors@1.7.2, http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-parser-js@>=0.4.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" - integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= http-proxy-agent@^2.1.0: version "2.1.0" @@ -6908,11 +6899,11 @@ https-browserify@^1.0.0: integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= https-proxy-agent@^2.2.0, https-proxy-agent@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" - integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== + version "2.2.2" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz#271ea8e90f836ac9f119daccd39c19ff7dfb0793" + integrity sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg== dependencies: - agent-base "^4.1.0" + agent-base "^4.3.0" debug "^3.1.0" humanize-ms@^1.2.1: @@ -6923,10 +6914,11 @@ humanize-ms@^1.2.1: ms "^2.0.0" husky@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/husky/-/husky-3.0.0.tgz#de63821a7049dc412b1afd753c259e2f6e227562" - integrity sha512-lKMEn7bRK+7f5eWPNGclDVciYNQt0GIkAQmhKl+uHP1qFzoN0h92kmH9HZ8PCwyVA2EQPD8KHf0FYWqnTxau+Q== + version "3.0.1" + resolved "https://registry.yarnpkg.com/husky/-/husky-3.0.1.tgz#06152c28e129622b05fa09c494209de8cf2dfb59" + integrity sha512-PXBv+iGKw23GHUlgELRlVX9932feFL407/wHFwtsGeArp0dDM4u+/QusSQwPKxmNgjpSL+ustbOdQ2jetgAZbA== dependencies: + chalk "^2.4.2" cosmiconfig "^5.2.1" execa "^1.0.0" get-stdin "^7.0.0" @@ -6943,13 +6935,6 @@ iconv-lite@0.4.19: resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== -iconv-lite@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -6986,10 +6971,10 @@ ignore@^3.3.5, ignore@^3.3.7: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^5.0.4: - version "5.1.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.1.tgz#2fc6b8f518aff48fef65a7f348ed85632448e4a5" - integrity sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA== +ignore@^5.0.4, ignore@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558" + integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ== image-size@~0.5.0: version "0.5.5" @@ -7061,16 +7046,21 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, 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= +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + ini@1.3.5, ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -7214,11 +7204,16 @@ ip@^1.1.0, ip@^1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -ipaddr.js@1.9.0, ipaddr.js@^1.5.2, ipaddr.js@^1.9.0: +ipaddr.js@1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== +ipaddr.js@^1.5.2, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" @@ -7265,6 +7260,11 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-buffer@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" + integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== + is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" @@ -7428,6 +7428,11 @@ is-npm@^1.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= +is-npm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-3.0.0.tgz#ec9147bfb629c43f494cf67936a961edec7e8053" + integrity sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA== + is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -7468,9 +7473,9 @@ is-path-cwd@^1.0.0: integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= is-path-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.1.0.tgz#2e0c7e463ff5b7a0eb60852d851a6809347a124c" - integrity sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== is-path-in-cwd@^1.0.0: version "1.0.1" @@ -7505,7 +7510,7 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -7532,6 +7537,13 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= +is-reference@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.3.tgz#e99059204b66fdbe09305cfca715a29caa5c8a51" + integrity sha512-W1iHHv/oyBb2pPxkBxtaewxa1BC58Pn5J0hogyCdefwUIvb6R+TGbAcIa4qPNYLqLhb3EnOgUf2MQkkF76BcKw== + dependencies: + "@types/estree" "0.0.39" + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -7575,6 +7587,13 @@ is-text-path@^1.0.0: dependencies: text-extensions "^1.0.0" +is-text-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" + integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== + dependencies: + text-extensions "^2.0.0" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -7607,6 +7626,11 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -7651,10 +7675,10 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-api@^2.1.1: - version "2.1.7" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.7.tgz#82786b79f3b93d481349c7aa1e2c2b4eeb48c8a8" - integrity sha512-LYTOa2UrYFyJ/aSczZi/6lBykVMjCCvUmT64gOe+jPZFy4w6FYfPGqFT2IiQ2BxVHHDOvCD7qrIXb0EOh4uGWw== +istanbul-api@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.6.tgz#d61702a9d1c66ad89d92e66d401e16b0bda4a35f" + integrity sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA== dependencies: async "^2.6.2" compare-versions "^3.4.0" @@ -7664,7 +7688,7 @@ istanbul-api@^2.1.1: istanbul-lib-instrument "^3.3.0" istanbul-lib-report "^2.0.8" istanbul-lib-source-maps "^3.0.6" - istanbul-reports "^2.2.5" + istanbul-reports "^2.2.4" js-yaml "^3.13.1" make-dir "^2.1.0" minimatch "^3.0.4" @@ -7743,17 +7767,10 @@ istanbul-lib-source-maps@^3.0.1, istanbul-lib-source-maps@^3.0.6: rimraf "^2.6.3" source-map "^0.6.1" -istanbul-reports@^2.1.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.4.tgz#4e0d0ddf0f0ad5b49a314069d31b4f06afe49ad3" - integrity sha512-QCHGyZEK0bfi9GR215QSm+NJwFKEShbtc7tfbUdLAEzn3kKhLDDZqvljn8rPZM9v8CEOhzL1nlYoO4r1ryl67w== - dependencies: - handlebars "^4.1.2" - -istanbul-reports@^2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.5.tgz#7fd354847124b46861365ac41165a4dfe5f67ea5" - integrity sha512-ilCSjE6f7elNIRxnSnIhnOpXdf3ryUT7Zkl+TaADItM638SWXjfNW40cujZCIjex4g4DTkzIy9kzwkaLruB50Q== +istanbul-reports@^2.1.1, istanbul-reports@^2.2.4: + version "2.2.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" + integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== dependencies: handlebars "^4.1.2" @@ -7765,10 +7782,10 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -iterare@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.1.2.tgz#32e65fe03c72f727b1ae5fd002ed6a215f523ae8" - integrity sha512-25rVYmj/dDvTR6zOa9jY1Ihd6USLa0J508Ub2iy7Aga+xu9JMbjDds2Uh03ReDGbva/YN3s3Ybi+Do0nOX6wAg== +iterare@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.0.tgz#7427f5ed45986e4b73e2fea903579f1117f3dd15" + integrity sha512-RxMV9p/UzdK0Iplnd8mVgRvNdXlsTOiuDrqMRnDi3wIhbT+JP4xDquAX9ay13R3CH72NBzQ91KWe0+C168QAyQ== jasmine-core@~2.99.1: version "2.99.1" @@ -7906,9 +7923,9 @@ jest-get-type@^24.8.0: integrity sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ== jest-haste-map@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.8.0.tgz#51794182d877b3ddfd6e6d23920e3fe72f305800" - integrity sha512-ZBPRGHdPt1rHajWelXdqygIDpJx8u3xOoLyUBWRW28r3tagrgoepPrzAozW7kW9HrQfhvmiv1tncsxqHJO1onQ== + version "24.8.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.8.1.tgz#f39cc1d2b1d907e014165b4bd5a957afcb992982" + integrity sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g== dependencies: "@jest/types" "^24.8.0" anymatch "^2.0.0" @@ -8326,9 +8343,9 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json3@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== json5@2.x, json5@^2.1.0: version "2.1.0" @@ -8392,11 +8409,11 @@ karma-chrome-launcher@~2.2.0: which "^1.2.1" karma-coverage-istanbul-reporter@~2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.5.tgz#ca5899d4905e44a5984dd4f963adfc1a74dce767" - integrity sha512-yPvAlKtY3y+rKKWbOo0CzBMVTvJEeMOgbMXuVv3yWvS8YtYKC98AU9vFF0mVBZ2RP1E9SgS90+PT6Kf14P3S4w== + version "2.0.6" + resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.6.tgz#7b6e9c88781447bb87aa6ac24bf74b93e558adc3" + integrity sha512-WFh77RI8bMIKdOvI/1/IBmgnM+Q7NOLhnwG91QJrM8lW+CIXCjTzhhUsT/svLvAkLmR10uWY4RyYbHMLkTglvg== dependencies: - istanbul-api "^2.1.1" + istanbul-api "^2.1.6" minimatch "^3.0.4" karma-jasmine-html-reporter@^0.2.2: @@ -8469,6 +8486,13 @@ keyv@3.0.0: dependencies: json-buffer "3.0.0" +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + killable@^1.0.0, killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -8517,6 +8541,13 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" +latest-version@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + lazy-ass@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" @@ -8607,6 +8638,11 @@ lightercollective@^0.3.0: resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.3.0.tgz#1f07638642ec645d70bdb69ab2777676f35a28f0" integrity sha512-RFOLSUVvwdK3xA0P8o6G7QGXLIyy1L2qv5caEI7zXN5ciaEjbAriRF182kbsoJ1S1TgvpyGcN485fMky6qxOPw== +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= + listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" @@ -8726,7 +8762,7 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash._reinterpolate@~3.0.0: +lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= @@ -8736,11 +8772,6 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" @@ -8767,21 +8798,21 @@ lodash.tail@^4.1.1: integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ= lodash.template@^4.0.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== dependencies: - lodash._reinterpolate "~3.0.0" + lodash._reinterpolate "^3.0.0" lodash.templatesettings "^4.0.0" lodash.templatesettings@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== dependencies: - lodash._reinterpolate "~3.0.0" + lodash._reinterpolate "^3.0.0" -lodash@4.17.11, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0: +lodash@4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -8796,6 +8827,11 @@ lodash@^3.8.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + log-symbols@2.2.0, log-symbols@^2.1.0, log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -8819,22 +8855,17 @@ log-update@^1.0.2: cli-cursor "^1.0.2" log4js@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.1.1.tgz#48ebed51e6989557b8a991c48f01879e82773545" - integrity sha512-tSQUF9bBMdcBtuLD6vD7hBM9Ci6Lng/NVHZEq4YbuRGo7ObmLiZuhxz33HKAmJItit74pAjvZgirqYX2LRaoGA== + version "4.5.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.5.1.tgz#e543625e97d9e6f3e6e7c9fc196dd6ab2cae30b5" + integrity sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw== dependencies: date-format "^2.0.0" debug "^4.1.1" flatted "^2.0.0" - rfdc "^1.1.2" - streamroller "^1.0.4" + rfdc "^1.1.4" + streamroller "^1.0.6" -loglevel@^1.4.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" - integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= - -loglevel@^1.6.3: +loglevel@^1.4.1, loglevel@^1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.3.tgz#77f2eb64be55a404c9fd04ad16d57c1d6d6b1280" integrity sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA== @@ -8869,12 +8900,17 @@ lowercase-keys@1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= -lowercase-keys@^1.0.0: +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.3: +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@4.1.x, lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -8902,18 +8938,11 @@ macos-release@^1.0.0: integrity sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA== macos-release@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.2.0.tgz#ab58d55dd4714f0a05ad4b0e90f4370fef5cdea8" - integrity sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" + integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== -magic-string@0.25.2, magic-string@^0.25.0, magic-string@^0.25.2: - version "0.25.2" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" - integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg== - dependencies: - sourcemap-codec "^1.4.4" - -magic-string@0.25.3: +magic-string@0.25.3, magic-string@^0.25.0, magic-string@^0.25.2: version "0.25.3" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.3.tgz#34b8d2a2c7fec9d9bdf9929a3fd81d271ef35be9" integrity sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA== @@ -8940,17 +8969,17 @@ make-error@1.x, make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== -make-fetch-happen@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083" - integrity sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ== +make-fetch-happen@^4.0.1, make-fetch-happen@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.2.tgz#2d156b11696fb32bffbafe1ac1bc085dd6c78a79" + integrity sha512-YMJrAjHSb/BordlsDEcVcPyTbiJKkzqMf48N8dAJZT9Zjctrkb6Yg4TY9Sq2AwSIQJFn5qBBKVTYt3vP5FMIHA== dependencies: agentkeepalive "^3.4.1" - cacache "^11.0.1" + cacache "^11.3.3" http-cache-semantics "^3.8.1" http-proxy-agent "^2.1.0" https-proxy-agent "^2.2.1" - lru-cache "^4.1.2" + lru-cache "^5.1.1" mississippi "^3.0.0" node-fetch-npm "^2.0.2" promise-retry "^1.1.1" @@ -9156,6 +9185,14 @@ micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -9198,12 +9235,7 @@ mime@1.6.0, mime@^1.4.1, mime@^1.5.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.3.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.2.tgz#ce5229a5e99ffc313abac806b482c10e7ba6ac78" - integrity sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg== - -mime@^2.4.2: +mime@^2.3.1, mime@^2.4.2: version "2.4.4" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== @@ -9218,7 +9250,7 @@ mimic-fn@^2.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0: +mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== @@ -9252,7 +9284,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.2, 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== @@ -9282,7 +9314,7 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.4, minipass@^2.3.5: +minipass@^2.2.1, minipass@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== @@ -9290,7 +9322,7 @@ minipass@^2.2.1, minipass@^2.3.4, minipass@^2.3.5: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.1: +minizlib@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== @@ -9314,9 +9346,9 @@ mississippi@^3.0.0: through2 "^2.0.0" mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -9368,15 +9400,20 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.1, ms@^2.0.0, ms@^2.1.1: +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== -multer@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.1.tgz#24b12a416a22fec2ade810539184bf138720159e" - integrity sha512-zzOLNRxzszwd+61JFuAo0fxdQfvku12aNJgnla0AQ+hHxFmfc/B7jBVuPr5Rmvu46Jze/iJrFpSOsD7afO8SDw== +ms@^2.0.0, 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== + +multer@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.2.tgz#2f1f4d12dbaeeba74cb37e623f234bf4d3d2057a" + integrity sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg== dependencies: append-field "^1.0.0" busboy "^0.2.11" @@ -9400,15 +9437,16 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -multimatch@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= +multimatch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" + integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" + "@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.6: version "0.0.6" @@ -9421,9 +9459,9 @@ mute-stream@0.0.7: integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= nan@^2.12.1: - version "2.13.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" - integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: version "1.2.13" @@ -9448,11 +9486,11 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.1.tgz#d272f2f4034afb9c4c9ab1379aabc17fc85c9388" - integrity sha512-CaLXV3W8Vnbps8ZANqDGz7j4x7Yj1LW4TWF/TQuDfj7Cfx4nAPTvw98qgTevtto1oHDrh3pQkaODbqupXlsWTg== + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== dependencies: - debug "^4.1.0" + debug "^3.2.6" iconv-lite "^0.4.4" sax "^1.2.4" @@ -9462,9 +9500,9 @@ negotiator@0.6.2: integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== neo-async@^2.5.0, neo-async@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" - integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== nested-error-stacks@^2.0.0: version "2.1.0" @@ -9476,39 +9514,38 @@ next-tick@1, next-tick@^1.0.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= -ng-packagr@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-5.1.0.tgz#4262775f29f7da72b3e5492c480a6857065d712e" - integrity sha512-sBQrn3jy0S2T8nN1gnptO3Dd55X6oNPSFlCckfHPp7G3T3eNUfo3o9dqeZc58PFiY1WOAi4z43LI7kFFeSrTTA== +ng-packagr@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-5.3.0.tgz#92434ca05ecbd1e01fe961a66c8a9a66b095f6fa" + integrity sha512-i+964lzZC7VVzatDCLDZndiXTog1XGozY7K1Bs78+uBF8O1YHNQP9wB9C5fR4uEaSKVhCWEBYekoS69flCugMA== dependencies: "@ngtools/json-schema" "^1.1.0" - autoprefixer "^9.0.0" + autoprefixer "^9.6.0" browserslist "^4.0.0" chalk "^2.3.1" - chokidar "^2.0.3" + chokidar "^3.0.0" clean-css "^4.1.11" commander "^2.12.0" - fs-extra "^7.0.0" + fs-extra "^8.0.0" glob "^7.1.2" injection-js "^2.2.1" less "^3.8.0" less-plugin-npm-import "^2.1.0" node-sass-tilde-importer "^1.0.0" - opencollective-postinstall "^2.0.1" postcss "^7.0.0" postcss-url "^8.0.0" read-pkg-up "^5.0.0" rimraf "^2.6.1" - rollup "^1.6.0" - rollup-plugin-commonjs "^9.1.3" + rollup "^1.12.1" + rollup-plugin-commonjs "^10.0.0" rollup-plugin-json "^4.0.0" - rollup-plugin-node-resolve "^4.0.1" + rollup-plugin-node-resolve "^5.0.0" rollup-plugin-sourcemaps "^0.4.2" rxjs "^6.0.0" sass "^1.17.3" stylus "^0.54.5" - terser "^3.16.1" - update-notifier "^2.3.0" + terser "^4.0.0" + update-notifier "^3.0.0" ngrx-store-freeze@0.2.4: version "0.2.4" @@ -9546,12 +9583,7 @@ node-fetch@1.6.3: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.1.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.5.0.tgz#8028c49fc1191bba56a07adc6e2a954644a48501" - integrity sha512-YuZKluhWGJwCcUu4RlZstdAxr8bFfOVHakc1mplwHkk8J+tqM1Y5yraYvIUpeX8aY7+crCwiELJq7Vl0o0LWXw== - -node-fetch@^2.3.0: +node-fetch@^2.1.1, node-fetch@^2.3.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== @@ -9567,9 +9599,9 @@ node-int64@^0.4.0: integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-libs-browser@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" - integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -9581,7 +9613,7 @@ node-libs-browser@^2.0.0: events "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" - path-browserify "0.0.0" + path-browserify "0.0.1" process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" @@ -9593,7 +9625,7 @@ node-libs-browser@^2.0.0: tty-browserify "0.0.0" url "^0.11.0" util "^0.11.0" - vm-browserify "0.0.4" + vm-browserify "^1.0.1" node-modules-regexp@^1.0.0: version "1.0.0" @@ -9627,21 +9659,7 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.17: - version "1.1.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.18.tgz#cc98fd75598a324a77188ebddf6650e9cbd8b1d5" - integrity sha512-/mnVgm6u/8OwlIsoyRXtTI0RfQcxZoAZbdwyXap0EeWwcOpDDymyCHM2/aR9XKmHXrvizHoPAOs0pcbiJ6RUaA== - dependencies: - semver "^5.3.0" - -node-releases@^1.1.23: - version "1.1.23" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.23.tgz#de7409f72de044a2fa59c097f436ba89c39997f0" - integrity sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w== - dependencies: - semver "^5.3.0" - -node-releases@^1.1.25: +node-releases@^1.1.23, node-releases@^1.1.25: version "1.1.25" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.25.tgz#0c2d7dbc7fed30fbe02a9ee3007b8c90bf0133d3" integrity sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ== @@ -9709,6 +9727,11 @@ normalize-url@2.0.1: query-string "^5.0.1" sort-keys "^2.0.0" +normalize-url@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee" + integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ== + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -9725,9 +9748,9 @@ npm-package-arg@6.1.0, npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: validate-npm-package-name "^3.0.0" npm-packlist@^1.1.12, npm-packlist@^1.1.6: - version "1.4.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" - integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + version "1.4.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" + integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -9742,15 +9765,15 @@ npm-pick-manifest@^2.2.3: semver "^5.4.1" npm-registry-fetch@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz#44d841780e2833f06accb34488f8c7450d1a6856" - integrity sha512-srwmt8YhNajAoSAaDWndmZgx89lJwIZ1GWxOuckH4Coek4uHv5S+o/l9FLQe/awA+JwTnj4FJHldxhlXdZEBmw== + version "3.9.1" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.9.1.tgz#00ff6e4e35d3f75a172b332440b53e93f4cb67de" + integrity sha512-VQCEZlydXw4AwLROAXWUR7QDfe2Y8Id/vpAgp6TI1/H78a4SiQ1kQrKZALm5/zxM5n4HIi+aYb+idUAV/RuY0Q== dependencies: JSONStream "^1.3.4" bluebird "^3.5.1" figgy-pudding "^3.4.1" - lru-cache "^4.1.3" - make-fetch-happen "^4.0.1" + lru-cache "^5.1.1" + make-fetch-happen "^4.0.2" npm-package-arg "^6.1.0" npm-run-all@^4.1.5: @@ -9841,7 +9864,7 @@ object-hash@1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-keys@^1.0.12: +object-keys@^1.0.11, object-keys@^1.0.12: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -9853,6 +9876,16 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.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.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -9919,7 +9952,7 @@ open@6.4.0: dependencies: is-wsl "^1.1.0" -opencollective-postinstall@^2.0.1, opencollective-postinstall@^2.0.2: +opencollective-postinstall@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== @@ -10082,6 +10115,11 @@ p-cancelable@^0.4.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -10193,6 +10231,16 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + pacote@9.5.1: version "9.5.1" resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.1.tgz#adb0d23daeef6d0b813ab5891d0c6459ccec998d" @@ -10296,6 +10344,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.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -10340,10 +10398,10 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-dirname@^1.0.0: version "1.0.2" @@ -10415,6 +10473,11 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +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== + pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" @@ -10436,7 +10499,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4: +picomatch@^2.0.4, picomatch@^2.0.5: version "2.0.7" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== @@ -10507,9 +10570,9 @@ pn@^1.1.0: integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== portfinder@^1.0.20, portfinder@^1.0.9: - version "1.0.20" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" - integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== + version "1.0.21" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.21.tgz#60e1397b95ac170749db70034ece306b9a27e324" + integrity sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA== dependencies: async "^1.5.2" debug "^2.2.0" @@ -10531,11 +10594,11 @@ postcss-import@12.0.1: resolve "^1.1.7" postcss-load-config@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" - integrity sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" + integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== dependencies: - cosmiconfig "^4.0.0" + cosmiconfig "^5.0.0" import-cwd "^2.0.0" postcss-loader@3.0.0: @@ -10564,7 +10627,12 @@ postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.1: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss@7.0.17, postcss@^7.0.16: +postcss-value-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz#99a983d365f7b2ad8d0f9b8c3094926eab4b936d" + integrity sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ== + +postcss@7.0.17, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2: version "7.0.17" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f" integrity sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ== @@ -10573,15 +10641,6 @@ postcss@7.0.17, postcss@^7.0.16: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.2: - version "7.0.16" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.16.tgz#48f64f1b4b558cb8b52c88987724359acb010da2" - integrity sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - precise-commits@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/precise-commits/-/precise-commits-1.0.2.tgz#4659be01a9c3310f50ce51ddf913fead1d7cc940" @@ -10644,9 +10703,9 @@ private@^0.1.6, private@^0.1.8: integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@^0.11.10: version "0.11.10" @@ -10681,9 +10740,9 @@ promise@~7.0.1: asap "~2.0.3" prompts@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682" - integrity sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.1.0.tgz#bf90bc71f6065d255ea2bdc0fe6520485c1b45db" + integrity sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg== dependencies: kleur "^3.0.2" sisteransi "^1.0.0" @@ -10704,7 +10763,7 @@ protoduck@^5.0.1: dependencies: genfun "^5.0.0" -proxy-addr@~2.0.3, proxy-addr@~2.0.4, proxy-addr@~2.0.5: +proxy-addr@~2.0.3, proxy-addr@~2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== @@ -10723,9 +10782,9 @@ pseudomap@^1.0.2: integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24, psl@^1.1.28: - version "1.1.31" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" - integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.2.0.tgz#df12b5b1b3a30f51c329eacbdef98f3a6e136dc6" + integrity sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA== public-encrypt@^4.0.0: version "4.0.3" @@ -10794,16 +10853,16 @@ qs@6.5.1: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== -qs@6.5.2, qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" @@ -10885,16 +10944,6 @@ raw-body@2.3.2: iconv-lite "0.4.19" unpipe "1.0.0" -raw-body@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" - integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== - dependencies: - bytes "3.0.0" - http-errors "1.6.3" - iconv-lite "0.4.23" - unpipe "1.0.0" - raw-body@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" @@ -10913,7 +10962,7 @@ raw-loader@1.0.0: loader-utils "^1.1.0" schema-utils "^1.0.0" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -11056,14 +11105,14 @@ read-pkg@^3.0.0: path-type "^3.0.0" read-pkg@^5.0.0, read-pkg@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.1.1.tgz#5cf234dde7a405c90c88a519ab73c467e9cb83f5" - integrity sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w== + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: "@types/normalize-package-data" "^2.4.0" normalize-package-data "^2.5.0" - parse-json "^4.0.0" - type-fest "^0.4.1" + parse-json "^5.0.0" + type-fest "^0.6.0" "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" @@ -11089,25 +11138,25 @@ readable-stream@1.1.x: string_decoder "~0.10.x" "readable-stream@2 || 3", readable-stream@^3.0.6, readable-stream@^3.1.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9" - integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw== + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" readdir-scoped-modules@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" - integrity sha1-n6+jfShr5dksuuve4DDcm19AZ0c= + version "1.1.0" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" + integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== dependencies: debuglog "^1.0.1" dezalgo "^1.0.0" graceful-fs "^4.1.2" once "^1.3.0" -readdirp@^2.0.0, readdirp@^2.2.1: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -11181,9 +11230,9 @@ regenerator-runtime@^0.11.0: integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" - integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== regenerator-transform@^0.10.0: version "0.10.1" @@ -11195,9 +11244,9 @@ regenerator-transform@^0.10.0: private "^0.1.6" regenerator-transform@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" - integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" + integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== dependencies: private "^0.1.6" @@ -11217,9 +11266,9 @@ regex-not@^1.0.0, regex-not@^1.0.2: safe-regex "^1.1.0" regexp-tree@^0.1.6: - version "0.1.10" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" - integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== + version "0.1.11" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.11.tgz#c9c7f00fcf722e0a56c7390983a7a63dd6c272f3" + integrity sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg== regexpu-core@^1.0.0: version "1.0.0" @@ -11259,6 +11308,14 @@ registry-auth-token@^3.0.1: rc "^1.1.6" safe-buffer "^5.0.1" +registry-auth-token@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.0.0.tgz#30e55961eec77379da551ea5c4cf43cbf03522be" + integrity sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw== + dependencies: + rc "^1.2.8" + safe-buffer "^5.0.1" + registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" @@ -11266,6 +11323,13 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -11470,14 +11534,14 @@ resolve@1.1.7, resolve@~1.1.6: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" - integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== +resolve@1.x, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.3.2, resolve@^1.5.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" + integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== dependencies: path-parse "^1.0.6" -responselike@1.0.2: +responselike@1.0.2, responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= @@ -11515,7 +11579,12 @@ retry@^0.10.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= -rfdc@^1.1.2: +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug== @@ -11540,15 +11609,16 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rollup-plugin-commonjs@^9.1.3: - version "9.3.4" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz#2b3dddbbbded83d45c36ff101cdd29e924fd23bc" - integrity sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w== +rollup-plugin-commonjs@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.0.1.tgz#fbfcadf4ce2e826068e056a9f5c19287d9744ddf" + integrity sha512-x0PcCVdEc4J8igv1qe2vttz8JKAKcTs3wfIA3L8xEty3VzxgORLrzZrNWaVMc+pBC4U3aDOb9BnWLAQ8J11vkA== dependencies: - estree-walker "^0.6.0" + estree-walker "^0.6.1" + is-reference "^1.1.2" magic-string "^0.25.2" - resolve "^1.10.0" - rollup-pluginutils "^2.6.0" + resolve "^1.11.0" + rollup-pluginutils "^2.8.1" rollup-plugin-json@^4.0.0: version "4.0.0" @@ -11557,15 +11627,16 @@ rollup-plugin-json@^4.0.0: dependencies: rollup-pluginutils "^2.5.0" -rollup-plugin-node-resolve@^4.0.1: - version "4.2.4" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.4.tgz#7d370f8d6fd3031006a0032c38262dd9be3c6250" - integrity sha512-t/64I6l7fZ9BxqD3XlX4ZeO6+5RLKyfpwE2CiPNUKa+GocPlQhf/C208ou8y3AwtNsc6bjSk/8/6y/YAyxCIvw== +rollup-plugin-node-resolve@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523" + integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw== dependencies: "@types/resolve" "0.0.8" builtin-modules "^3.1.0" is-module "^1.0.0" - resolve "^1.10.0" + resolve "^1.11.1" + rollup-pluginutils "^2.8.1" rollup-plugin-sourcemaps@^0.4.2: version "0.4.2" @@ -11575,27 +11646,26 @@ rollup-plugin-sourcemaps@^0.4.2: rollup-pluginutils "^2.0.1" source-map-resolve "^0.5.0" -rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.5.0, rollup-pluginutils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz#203706edd43dfafeaebc355d7351119402fc83ad" - integrity sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ== +rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.5.0, rollup-pluginutils@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz#8fa6dd0697344938ef26c2c09d2488ce9e33ce97" + integrity sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg== dependencies: - estree-walker "^0.6.0" - micromatch "^3.1.10" + estree-walker "^0.6.1" -rollup@^1.6.0: - version "1.11.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.11.3.tgz#6f436db2a2d6b63f808bf60ad01a177643dedb81" - integrity sha512-81MR7alHcFKxgWzGfG7jSdv+JQxSOIOD/Fa3iNUmpzbd7p+V19e1l9uffqT8/7YAHgGOzmoPGN3Fx3L2ptOf5g== +rollup@^1.12.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.17.0.tgz#47ee8b04514544fc93b39bae06271244c8db7dfa" + integrity sha512-k/j1m0NIsI4SYgCJR4MWPstGJOWfJyd6gycKoMhyoKPVXxm+L49XtbUwZyFsrSU2YXsOkM4u1ll9CS/ZgJBUpw== dependencies: "@types/estree" "0.0.39" - "@types/node" "^11.13.9" - acorn "^6.1.1" + "@types/node" "^12.6.2" + acorn "^6.2.0" rsvp@^4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" - integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== run-async@^2.2.0: version "2.3.0" @@ -11609,6 +11679,11 @@ run-node@^1.0.0: resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -11621,13 +11696,6 @@ rx@^4.1.0: resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= -rxjs@6.3.3: - version "6.3.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" - integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== - dependencies: - tslib "^1.9.0" - rxjs@6.4.0, rxjs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" @@ -11654,11 +11722,16 @@ safe-buffer@5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -11706,11 +11779,11 @@ sass@1.22.2: chokidar ">=2.0.0 <4.0.0" sass@^1.17.3: - version "1.20.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.20.1.tgz#737b901fe072336da540b6d00ec155e2267420da" - integrity sha512-BnCawee/L5kVG3B/5Jg6BFwASqUwFVE6fj2lnkVuSXDgQ7gMAhY9a2yPeqsKhJMCN+Wgx0r2mAW7XF/aTF5qtA== + version "1.22.7" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.22.7.tgz#5a1a77dc11aa659db4e782d238bf9f3d44a60546" + integrity sha512-ahREi0AdG7RTovSv14+yd1prQSfIvFcrDpOsth5EQf1+RM7SvOxsSttzNQaFmK1aa/k/3vyYwlYF5l0Xl+6c+g== dependencies: - chokidar "^2.0.0" + chokidar ">=2.0.0 <4.0.0" sax@0.5.x: version "0.5.8" @@ -11723,11 +11796,11 @@ sax@^1.2.4: integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== saxes@^3.1.5: - version "3.1.9" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.9.tgz#c1c197cd54956d88c09f960254b999e192d7058b" - integrity sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw== + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== dependencies: - xmlchars "^1.3.1" + xmlchars "^2.1.1" scheduler@^0.13.6: version "0.13.6" @@ -11806,20 +11879,15 @@ semver@5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -semver@6.2.0, semver@^6.1.1: +semver@6.2.0, semver@^6.0.0, semver@^6.1.1: version "6.2.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== -semver@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" - integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== - -semver@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" - integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== +semver@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== send@0.16.2: version "0.16.2" @@ -11859,7 +11927,7 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -serialize-javascript@^1.4.0, serialize-javascript@^1.7.0: +serialize-javascript@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== @@ -11902,20 +11970,10 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -11999,7 +12057,7 @@ shelljs@0.8.2: interpret "^1.0.0" rechoir "^0.6.2" -shelljs@^0.8.1, shelljs@^0.8.3: +shelljs@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== @@ -12019,9 +12077,9 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= sisteransi@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" - integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== + version "1.0.2" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.2.tgz#ec57d64b6f25c4f26c0e2c7dd23f2d7f12f7e418" + integrity sha512-ZcYcZcT69nSLAR2oLN2JwNmLkJEKGooFMCdvOkFrToUt/WfcRWqhIg4P4KwY4dmLbuyXIx4o4YmPsvMRJYJd/w== slash@^1.0.0: version "1.0.0" @@ -12203,7 +12261,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@0.5.12, source-map-support@^0.5.12, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.10, source-map-support@~0.5.12: +source-map-support@0.5.12, source-map-support@^0.5.12, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.12: version "0.5.12" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== @@ -12258,9 +12316,9 @@ source-map@~0.4.1: amdefine ">=0.0.4" sourcemap-codec@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" - integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== + version "1.4.6" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" + integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg== spawn-sync@^1.0.15: version "1.0.15" @@ -12292,9 +12350,9 @@ spdx-expression-parse@^3.0.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== + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== spdy-transport@^3.0.0: version "3.0.0" @@ -12397,11 +12455,6 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= - statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" @@ -12449,16 +12502,16 @@ stream-to-observable@^0.1.0: resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" integrity sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4= -streamroller@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-1.0.4.tgz#d485c7624796d5e2eb34190c79afcbf006afb5e6" - integrity sha512-Wc2Gm5ygjSX8ZpW9J7Y9FwiSzTlKSvcl0FTTMd3rn7RoxDXpBW+xD9TY5sWL2n0UR61COB0LG1BQvN6nTUQbLQ== +streamroller@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-1.0.6.tgz#8167d8496ed9f19f05ee4b158d9611321b8cacd9" + integrity sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg== dependencies: - async "^2.6.1" + async "^2.6.2" date-format "^2.0.0" - debug "^3.1.0" - fs-extra "^7.0.0" - lodash "^4.17.10" + debug "^3.2.6" + fs-extra "^7.0.1" + lodash "^4.17.14" streamsearch@0.1.2: version "0.1.2" @@ -12646,9 +12699,9 @@ symbol-observable@1.2.0: integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== symbol-tree@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tapable@^1.0.0, tapable@^1.1.0: version "1.1.3" @@ -12656,17 +12709,17 @@ tapable@^1.0.0, tapable@^1.1.0: integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tar@^4, tar@^4.4.8: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + version "4.4.10" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" + integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.4" - minizlib "^1.1.1" + minipass "^2.3.5" + minizlib "^1.2.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" - yallist "^3.0.2" + yallist "^3.0.3" temp@~0.4.0: version "0.4.0" @@ -12688,7 +12741,7 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -terser-webpack-plugin@1.3.0: +terser-webpack-plugin@1.3.0, terser-webpack-plugin@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz#69aa22426299f4b5b3775cbed8cb2c5d419aa1d4" integrity sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg== @@ -12704,29 +12757,6 @@ terser-webpack-plugin@1.3.0: webpack-sources "^1.3.0" worker-farm "^1.7.0" -terser-webpack-plugin@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" - integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== - dependencies: - cacache "^11.0.2" - find-cache-dir "^2.0.0" - schema-utils "^1.0.0" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - terser "^3.16.1" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -terser@^3.16.1: - version "3.17.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" - integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== - dependencies: - commander "^2.19.0" - source-map "~0.6.1" - source-map-support "~0.5.10" - terser@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/terser/-/terser-4.1.2.tgz#b2656c8a506f7ce805a3f300a2ff48db022fa391" @@ -12751,6 +12781,11 @@ text-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== +text-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.0.0.tgz#43eabd1b495482fae4a2bf65e5f56c29f69220f6" + integrity sha512-F91ZqLgvi1E0PdvmxMgp+gcf6q8fMH7mhdwWfzXnl1k+GbpQDmi8l7DzLC5JTASKbwpY3TfxajAUzAXcv2NmsQ== + throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -12882,6 +12917,11 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -12991,28 +13031,27 @@ ts-loader@^5.3.1: micromatch "^3.1.4" semver "^5.0.1" -ts-morph@^1.3.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-1.3.3.tgz#ce4026699691db9bd297c039189f0fe4cc0fac4b" - integrity sha512-TO4xmC4yKSoOSjuIGBlYOkPSQhY4dC6/8ksEH+1jlt7XUk6fmLshn97wwchMQxz1ejSd2DSxEk+pC5cqDYlUzg== +ts-morph@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-3.1.3.tgz#bbfa1d14481ee23bdd1c030340ccf4a243cfc844" + integrity sha512-CwjgyJTtd3f8vBi7Vr0IOgdOY6Wi/Tq0MhieXOE2B5ns5WWRD7BwMNHtv+ZufKI/S2U/lMrh+Q3bOauE4tsv2g== dependencies: "@dsherret/to-absolute-glob" "^2.0.2" - code-block-writer "7.2.2" - fs-extra "^7.0.0" - glob-parent "^3.1.0" - globby "^8.0.1" + code-block-writer "9.4.1" + fs-extra "^8.1.0" + glob-parent "^5.0.0" + globby "^10.0.1" is-negated-glob "^1.0.0" - multimatch "^2.1.0" - tslib "^1.9.0" - typescript ">=3.0.1 <3.5.0" + multimatch "^4.0.0" + typescript "^3.0.1" ts-node@^8.0.2: - version "8.1.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.1.0.tgz#8c4b37036abd448577db22a061fd7a67d47e658e" - integrity sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A== + version "8.3.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" + integrity sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ== dependencies: arg "^4.1.0" - diff "^3.1.0" + diff "^4.0.1" make-error "^1.1.1" source-map-support "^0.5.6" yn "^3.0.0" @@ -13047,9 +13086,9 @@ tsickle@^0.33.0: source-map "^0.7.3" tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== tslint@5.11.0: version "5.11.0" @@ -13100,10 +13139,15 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-fest@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" - integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16, type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" @@ -13113,16 +13157,26 @@ type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16, type-is@~1.6.17, type-is@~1.6. media-typer "0.3.0" mime-types "~2.1.24" +type@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/type/-/type-1.0.1.tgz#084c9a17fcc9151a2cdb1459905c2e45e4bb7d61" + integrity sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.4.5, "typescript@>=3.0.1 <3.5.0", typescript@^3.2.2, typescript@~3.4.5: +typescript@3.4.5, typescript@~3.4.5: version "3.4.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99" integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw== +typescript@^3.0.1, typescript@^3.2.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" + integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== + uglify-js@3.4.x: version "3.4.10" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" @@ -13132,9 +13186,9 @@ uglify-js@3.4.x: source-map "~0.6.1" uglify-js@^3.1.4: - version "3.5.12" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.12.tgz#6b759cabc08c3e91fe82323d6387019f0c5864cd" - integrity sha512-KeQesOpPiZNgVwJj8Ge3P4JYbQHUdZzpx6Fahy6eKAYRSV4zhVmLXoC+JtOeYxcHCHTve8RG1ZGdTvpeOUM26Q== + version "3.6.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" + integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== dependencies: commander "~2.20.0" source-map "~0.6.1" @@ -13173,14 +13227,14 @@ unicode-property-aliases-ecmascript@^1.0.4: integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" unique-filename@^1.1.1: version "1.1.1" @@ -13190,9 +13244,9 @@ unique-filename@^1.1.1: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" - integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" @@ -13242,12 +13296,12 @@ unzip-response@^2.0.1: resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= -upath@^1.0.5, upath@^1.1.1: +upath@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== -update-notifier@2.5.0, update-notifier@^2.3.0: +update-notifier@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== @@ -13263,6 +13317,24 @@ update-notifier@2.5.0, update-notifier@^2.3.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +update-notifier@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-3.0.1.tgz#78ecb68b915e2fd1be9f767f6e298ce87b736250" + integrity sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ== + dependencies: + boxen "^3.0.0" + chalk "^2.0.1" + configstore "^4.0.0" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.1.0" + is-npm "^3.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" @@ -13426,12 +13498,10 @@ viz.js@^1.8.1: resolved "https://registry.yarnpkg.com/viz.js/-/viz.js-1.8.2.tgz#d9cc04cd99f98ec986bf9054db76a6cbcdc5d97a" integrity sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ== -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" +vm-browserify@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" + integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== void-elements@^2.0.0: version "2.0.1" @@ -13702,11 +13772,12 @@ webpack@4.35.2: webpack-sources "^1.3.0" websocket-driver@>=0.5.1: - version "0.7.0" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" - integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== dependencies: - http-parser-js ">=0.4.0" + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: @@ -13812,7 +13883,7 @@ wordwrap@~1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -worker-farm@^1.5.2, worker-farm@^1.7.0: +worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== @@ -13849,9 +13920,9 @@ write-file-atomic@2.4.1: signal-exit "^3.0.2" write-file-atomic@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" - integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -13890,10 +13961,10 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xmlchars@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-1.3.1.tgz#1dda035f833dbb4f86a0c28eaa6ca769214793cf" - integrity sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw== +xmlchars@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.1.1.tgz#ef1a81c05bff629c2280007f12daca21bd6f6c93" + integrity sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w== xmlhttprequest-ssl@~1.5.4: version "1.5.5" @@ -13906,9 +13977,9 @@ xregexp@4.0.0: integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== xtend@^4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== xxhashjs@^0.2.1: version "0.2.2" @@ -13932,7 +14003,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== @@ -13968,9 +14039,9 @@ yargs-parser@^11.1.1: decamelize "^1.2.0" yargs-parser@^13.0.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.0.tgz#7016b6dd03e28e1418a510e258be4bff5a31138f" - integrity sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA== + 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"