diff --git a/docs/angular/api-web/builders/package.md b/docs/angular/api-web/builders/package.md index 2c3c74ec45..4c9c16b4a7 100644 --- a/docs/angular/api-web/builders/package.md +++ b/docs/angular/api-web/builders/package.md @@ -16,7 +16,7 @@ List of static assets. Type: `string` -Path to a function which takes a babel config and returns an updated babel config +(deprecated) Path to a function which takes a babel config and returns an updated babel config ### entryFile diff --git a/docs/react/api-web/builders/package.md b/docs/react/api-web/builders/package.md index edee826391..a1b1d32d35 100644 --- a/docs/react/api-web/builders/package.md +++ b/docs/react/api-web/builders/package.md @@ -17,7 +17,7 @@ List of static assets. Type: `string` -Path to a function which takes a babel config and returns an updated babel config +(deprecated) Path to a function which takes a babel config and returns an updated babel config ### entryFile diff --git a/e2e/react.test.ts b/e2e/react.test.ts index 9097af71c6..9f10e66f39 100644 --- a/e2e/react.test.ts +++ b/e2e/react.test.ts @@ -199,7 +199,7 @@ forEachCli((currentCLIName) => { ); }, 120000); - xit('should be able to use babel-jest', async () => { + it('should be able to use babel-jest', async () => { ensureProject(); const appName = uniq('app'); const libName = uniq('lib'); @@ -211,11 +211,6 @@ forEachCli((currentCLIName) => { `generate @nrwl/react:lib ${libName} --no-interactive --babelJest` ); - checkFilesExist( - `apps/${appName}/babel-jest.config.json`, - `libs/${libName}/babel-jest.config.json` - ); - const appTestResults = await runCLIAsync(`test ${appName}`); expect(appTestResults.stderr).toContain('Test Suites: 1 passed, 1 total'); @@ -308,7 +303,7 @@ forEachCli((currentCLIName) => { } checkFilesExist(...filesToCheck); expect(readFile(`dist/apps/${appName}/main.js`)).toContain( - 'var App = () => {' + 'const App = () =>' ); runCLI(`build ${appName} --prod --output-hashing none`); filesToCheck = [ diff --git a/e2e/utils.ts b/e2e/utils.ts index db4bff1b3c..61e0dd75e8 100644 --- a/e2e/utils.ts +++ b/e2e/utils.ts @@ -175,7 +175,7 @@ export function newProject(): void { `@nrwl/storybook`, `@nrwl/nx-plugin`, ]; - yarnAdd(packages.join(` `)); + yarnAdd([`@nrwl/eslint-plugin-nx`].concat(packages).join(` `)); packages .filter((f) => f != '@nrwl/nx-plugin') .forEach((p) => { diff --git a/e2e/web.test.ts b/e2e/web.test.ts index 04f2f01da3..52e4ae1738 100644 --- a/e2e/web.test.ts +++ b/e2e/web.test.ts @@ -1,4 +1,3 @@ -import { stripIndents } from '@angular-devkit/core/src/utils/literals'; import { checkFilesExist, ensureProject, @@ -6,7 +5,6 @@ import { readFile, runCLI, runCLIAsync, - supportUi, uniq, updateFile, } from './utils'; @@ -54,72 +52,9 @@ forEachCli((currentCLIName) => { 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!'); - } + const e2eResults = runCLI(`e2e ${appName}-e2e`); + expect(e2eResults).toContain('All specs passed!'); }, 120000); - - it('should support same syntax as TypeScript', () => { - ensureProject(); - const appName = uniq('app'); - - runCLI(`generate @nrwl/web:app ${appName} --no-interactive`); - - const mainPath = `apps/${appName}/src/app/app.element.ts`; - const content = readFile(mainPath); - updateFile( - mainPath, - content - // Testing decorators - .replace( - `export class AppElement extends HTMLElement`, - stripIndents` - function myDecorator(ctor) { - ctor.title = '${appName}'; - } - - @myDecorator - export class AppElement extends HTMLElement` - ) - .replace('${title}', '${(AppElement as any).title}') + - // Testing const enums - stripIndents` - export const enum MyEnum { - a, - b, - b - }; - ` - ); - - if (supportUi()) { - const e2eResults = runCLI(`e2e ${appName}-e2e`); - expect(e2eResults).toContain('All specs passed!'); - } - }); - - it('should support CSS modules', () => { - ensureProject(); - const appName = uniq('app'); - - runCLI(`generate @nrwl/web:app ${appName} --no-interactive`); - updateFile( - `apps/${appName}/src/app/app.module.css`, - '.foo { color: red; }' - ); - const mainPath = `apps/${appName}/src/app/app.element.ts`; - const content = readFile(mainPath); - updateFile( - mainPath, - `import styles from './app.module.css';\n${content}` - ); - - if (supportUi()) { - const e2eResults = runCLI(`e2e ${appName}-e2e`); - expect(e2eResults).toContain('All specs passed!'); - } - }); }); describe('CLI - Environment Variables', () => { @@ -140,7 +75,7 @@ forEachCli((currentCLIName) => { env: { ...process.env, NODE_ENV: 'test', NX_BUILD: '52', NX_API: 'QA' }, }); expect(readFile(`dist/apps/${appName}/main.js`)).toContain( - 'var envVars = ["test", "52", "QA"];' + 'const envVars = ["test", "52", "QA"];' ); }); }); diff --git a/package.json b/package.json index 3720fcf515..6e99a84c34 100644 --- a/package.json +++ b/package.json @@ -50,13 +50,13 @@ "@angular/router": "^9.1.0", "@angular/service-worker": "^9.1.0", "@angular/upgrade": "^9.1.0", - "@babel/core": "7.8.4", + "@babel/core": "7.9.6", + "@babel/preset-env": "7.9.6", "@babel/plugin-proposal-class-properties": "7.8.3", "@babel/plugin-proposal-decorators": "7.8.3", - "@babel/plugin-transform-regenerator": "7.8.3", - "@babel/preset-env": "7.8.4", - "@babel/preset-react": "7.8.3", - "@babel/preset-typescript": "7.8.3", + "@babel/plugin-transform-regenerator": "7.8.7", + "@babel/preset-typescript": "7.9.0", + "@babel/preset-react": "7.9.4", "@bazel/bazel": "^1.2.0", "@bazel/ibazel": "^0.10.3", "@cypress/webpack-preprocessor": "^4.1.2", @@ -73,6 +73,7 @@ "@ngrx/store-devtools": "9.1.0", "@ngtools/webpack": "~9.1.0", "@reduxjs/toolkit": "1.3.2", + "@rollup/plugin-babel": "5.0.2", "@rollup/plugin-commonjs": "11.0.2", "@rollup/plugin-image": "2.0.4", "@rollup/plugin-node-resolve": "7.1.1", @@ -110,12 +111,12 @@ "app-root-path": "^2.0.1", "autoprefixer": "9.7.4", "axios": "^0.19.0", - "babel-loader": "8.0.6", - "babel-plugin-const-enum": "^0.0.5", + "babel-loader": "8.1.0", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-transform-async-to-promises": "^0.8.15", "babel-plugin-emotion": "^10.0.29", - "babel-plugin-macros": "2.6.1", "babel-plugin-styled-components": "^1.10.7", - "babel-plugin-transform-async-to-promises": "0.8.15", "browserslist": "4.8.7", "cacache": "12.0.2", "caniuse-lite": "^1.0.30001030", @@ -126,7 +127,7 @@ "confusing-browser-globals": "^1.0.9", "conventional-changelog-cli": "^2.0.23", "copy-webpack-plugin": "5.1.1", - "core-js": "^2.6.9", + "core-js": "^3.6.5", "cosmiconfig": "^4.0.0", "css-loader": "3.4.2", "cypress": "^4.1.0", @@ -197,7 +198,6 @@ "regenerator-runtime": "0.13.3", "release-it": "^7.4.0", "rollup": "1.31.1", - "rollup-plugin-babel": "4.3.3", "rollup-plugin-copy": "3.3.0", "rollup-plugin-filesize": "6.2.1", "rollup-plugin-local-resolve": "1.0.7", diff --git a/packages/angular/src/schematics/init/init.spec.ts b/packages/angular/src/schematics/init/init.spec.ts index ba8bb47dea..ec58aff568 100644 --- a/packages/angular/src/schematics/init/init.spec.ts +++ b/packages/angular/src/schematics/init/init.spec.ts @@ -23,7 +23,6 @@ describe('init', () => { expect(dependencies['@angular/platform-browser']).toBeDefined(); expect(dependencies['@angular/platform-browser-dynamic']).toBeDefined(); expect(dependencies['@angular/router']).toBeDefined(); - expect(dependencies['core-js']).toBeDefined(); expect(dependencies['rxjs']).toBeDefined(); expect(dependencies['zone.js']).toBeDefined(); expect(devDependencies['@angular/compiler-cli']).toBeDefined(); diff --git a/packages/angular/src/schematics/init/init.ts b/packages/angular/src/schematics/init/init.ts index afcc0483a5..af72c62d3f 100755 --- a/packages/angular/src/schematics/init/init.ts +++ b/packages/angular/src/schematics/init/init.ts @@ -34,7 +34,6 @@ const updateDependencies = addDepsToPackageJson( '@angular/platform-browser': angularVersion, '@angular/platform-browser-dynamic': angularVersion, '@angular/router': angularVersion, - 'core-js': '^2.5.4', rxjs: rxjsVersion, 'zone.js': '^0.10.2', }, diff --git a/packages/angular/src/schematics/karma-project/files/src/test.ts__tmpl__ b/packages/angular/src/schematics/karma-project/files/src/test.ts__tmpl__ index ed5ac5109a..db820813ab 100644 --- a/packages/angular/src/schematics/karma-project/files/src/test.ts__tmpl__ +++ b/packages/angular/src/schematics/karma-project/files/src/test.ts__tmpl__ @@ -1,6 +1,5 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files <% if (isLibrary) { %> -import 'core-js/es7/reflect'; import 'zone.js/dist/zone'; <% } %> import 'zone.js/dist/zone-testing'; 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 053ae37bc8..f25ce9c1a1 100644 --- a/packages/angular/src/schematics/karma-project/karma-project.spec.ts +++ b/packages/angular/src/schematics/karma-project/karma-project.spec.ts @@ -135,7 +135,6 @@ module.exports = function(config) { appTree ); const testTs = resultTree.read('libs/lib1/src/test.ts').toString(); - expect(testTs).toContain("import 'core-js/es7/reflect';"); expect(testTs).toContain("import 'zone.js/dist/zone';"); }); }); @@ -199,7 +198,6 @@ module.exports = function(config) { appTree ); const testTs = resultTree.read('apps/app1/src/test.ts').toString(); - expect(testTs).not.toContain("import 'core-js/es7/reflect';"); expect(testTs).not.toContain("import 'zone.js/dist/zone';"); }); }); 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 5f8bfd25c4..ca19762263 100644 --- a/packages/jest/src/schematics/jest-project/jest-project.spec.ts +++ b/packages/jest/src/schematics/jest-project/jest-project.spec.ts @@ -133,38 +133,6 @@ describe('jestProject', () => { }); }); - describe('--babelJest', () => { - it('should have a babel config when true', async () => { - const resultTree = await runSchematic( - 'jest-project', - { - project: 'lib1', - setupFile: 'none', - babelJest: true, - }, - appTree - ); - expect( - resultTree.exists('/libs/lib1/babel-jest.config.json') - ).toBeTruthy(); - }); - - it('should NOT have a babel config when false', async () => { - const resultTree = await runSchematic( - 'jest-project', - { - project: 'lib1', - setupFile: 'none', - babelJest: false, - }, - appTree - ); - expect( - resultTree.exists('/libs/lib1/babel-jest.config.json') - ).toBeFalsy(); - }); - }); - describe('--setup-file', () => { it('should generate src/test-setup.ts', async () => { const resultTree = await runSchematic( diff --git a/packages/jest/src/utils/versions.ts b/packages/jest/src/utils/versions.ts index 079c61c2a7..e77b948c22 100644 --- a/packages/jest/src/utils/versions.ts +++ b/packages/jest/src/utils/versions.ts @@ -3,8 +3,8 @@ export const jestVersion = '25.2.3'; export const jestTypesVersion = '25.1.4'; export const tsJestVersion = '25.2.1'; -export const babelCoreVersion = '7.8.4'; -export const babelPresetEnvVersion = '7.8.4'; -export const babelPresetTypescriptVersion = '7.8.3'; -export const babelPresetReactVersion = '7.8.3'; +export const babelCoreVersion = '7.9.6'; +export const babelPresetEnvVersion = '7.9.6'; +export const babelPresetTypescriptVersion = '7.9.0'; +export const babelPresetReactVersion = '7.9.4'; export const babelJestVersion = '25.1.0'; diff --git a/packages/next/src/schematics/application/files/.babelrc__tmpl__ b/packages/next/src/schematics/application/files/.babelrc__tmpl__ index c642741f28..4d62a607c0 100644 --- a/packages/next/src/schematics/application/files/.babelrc__tmpl__ +++ b/packages/next/src/schematics/application/files/.babelrc__tmpl__ @@ -1,4 +1,4 @@ { "presets": ["next/babel"], - "plugins": [<% if (style === 'styled-components') { %>["styled-components", { "pure": true, "ssr": true }]<% } %> ] + "plugins": [<% if (style === 'styled-components') { %>["styled-components", { "pure": true, "ssr": true }]<% } %>] } diff --git a/packages/react/babel.ts b/packages/react/babel.ts new file mode 100644 index 0000000000..e2fbb486bc --- /dev/null +++ b/packages/react/babel.ts @@ -0,0 +1,10 @@ +/* + * Babel preset to provide React support for Nx. + */ + +module.exports = function (api: any, options: {}) { + api.assertVersion(7); + return { + presets: [[require.resolve('@babel/preset-react'), { useBuiltIns: true }]], + }; +}; diff --git a/packages/react/migrations.json b/packages/react/migrations.json index a692b38bd8..7e263f2f68 100644 --- a/packages/react/migrations.json +++ b/packages/react/migrations.json @@ -39,6 +39,16 @@ "version": "8.12.0-beta.1", "description": "Ensure React correct webpack config and babel preset", "factory": "./src/migrations/update-8-12-0/fix-react-files-8-12-0" + }, + "update-9.4.0": { + "version": "9.4.0-beta.1", + "description": "Update libraries", + "factory": "./src/migrations/update-9-4-0/update-9-4-0" + }, + "babelrc-9.4.0": { + "version": "9.4.0-beta.1", + "description": "Migrate to new babel setup for greater flexibility", + "factory": "./src/migrations/update-9-4-0/babelrc-9-4-0" } }, "packageJsonUpdates": { @@ -181,6 +191,79 @@ "alwaysAddToPackageJson": false } } + }, + "9.4.0": { + "version": "9.4.0-beta.1", + "packages": { + "react": { + "version": "16.13.1", + "alwaysAddToPackageJson": false + }, + "react-dom": { + "version": "16.13.1", + "alwaysAddToPackageJson": false + }, + "react-is": { + "version": "16.13.1", + "alwaysAddToPackageJson": false + }, + "@types/react": { + "version": "16.9.35", + "alwaysAddToPackageJson": false + }, + "@types/react-dom": { + "version": "16.9.8", + "alwaysAddToPackageJson": false + }, + "@types/react-is": { + "version": "16.7.1", + "alwaysAddToPackageJson": false + }, + "styled-components": { + "version": "5.1.0", + "alwaysAddToPackageJson": false + }, + "@types/styled-components": { + "version": "5.1.0", + "alwaysAddToPackageJson": false + }, + "react-router-dom": { + "version": "5.2.0", + "alwaysAddToPackageJson": false + }, + "@types/react-router-dom": { + "version": "5.1.5", + "alwaysAddToPackageJson": false + }, + "@testing-library/react": { + "version": "10.0.4", + "alwaysAddToPackageJson": false + }, + "@reduxjs/toolkit": { + "version": "1.3.6", + "alwaysAddToPackageJson": false + }, + "react-redux": { + "version": "7.2.0", + "alwaysAddToPackageJson": false + }, + "@types/react-redux": { + "version": "7.1.9", + "alwaysAddToPackageJson": false + }, + "eslint-plugin-import": { + "version": "2.20.2", + "alwaysAddToPackageJson": false + }, + "eslint-plugin-react": { + "version": "7.20.0", + "alwaysAddToPackageJson": false + }, + "eslint-plugin-react-hooks": { + "version": "4.0.2", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/react/package.json b/packages/react/package.json index bc3bea9db5..ade3baedf0 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -31,15 +31,13 @@ "@nrwl/workspace": "*" }, "dependencies": { - "@babel/core": "^7.8.4", - "@babel/preset-react": "^7.8.3", + "@babel/core": "7.9.6", + "@babel/preset-react": "7.9.4", "@nrwl/cypress": "*", "@nrwl/jest": "*", "@nrwl/web": "*", "@angular-devkit/schematics": "~9.1.0", "@svgr/webpack": "^5.2.0", - "babel-plugin-emotion": "^10.0.29", - "babel-plugin-styled-components": "^1.10.7", "confusing-browser-globals": "^1.0.9", "eslint-plugin-import": "^2.20.1", "eslint-plugin-jsx-a11y": "^6.2.3", diff --git a/packages/react/plugins/webpack.ts b/packages/react/plugins/webpack.ts index 4761b1034f..6714c222a9 100644 --- a/packages/react/plugins/webpack.ts +++ b/packages/react/plugins/webpack.ts @@ -1,12 +1,7 @@ import { Configuration } from 'webpack'; -import { updateBabelOptions } from '../src/utils/babel-utils'; // Add React-specific configuration function getWebpackConfig(config: Configuration) { - const idx = config.module.rules.findIndex((r) => r.loader === 'babel-loader'); - const babelRuleOptions = config.module.rules[idx].options as any; - updateBabelOptions(babelRuleOptions); - config.module.rules.push( { test: /\.(png|jpe?g|gif|webp)$/, diff --git a/packages/react/src/migrations/update-9-4-0/babelrc-9-4-0.spec.ts b/packages/react/src/migrations/update-9-4-0/babelrc-9-4-0.spec.ts new file mode 100644 index 0000000000..4cd66246af --- /dev/null +++ b/packages/react/src/migrations/update-9-4-0/babelrc-9-4-0.spec.ts @@ -0,0 +1,74 @@ +import { Tree } from '@angular-devkit/schematics'; +import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; +import * as path from 'path'; +import { createEmptyWorkspace } from '@nrwl/workspace/testing'; +import { createApp, createLib, createWebApp } from '../../utils/testing'; + +describe('Migrate babel setup', () => { + let tree: Tree; + let schematicRunner: SchematicTestRunner; + + beforeEach(async () => { + tree = Tree.empty(); + tree = createEmptyWorkspace(tree); + schematicRunner = new SchematicTestRunner( + '@nrwl/react', + path.join(__dirname, '../../../migrations.json') + ); + tree.overwrite( + 'package.json', + JSON.stringify({ + dependencies: { + react: '16.13.1', + 'react-dom': '16.13.1', + }, + }) + ); + }); + + it(`should create .babelrc for projects without them`, async () => { + tree = await createApp(tree, 'demo'); + tree = await createLib(tree, 'ui'); + + tree = await schematicRunner + .runSchematicAsync('babelrc-9.4.0', {}, tree) + .toPromise(); + + expect(tree.exists('/babel.config.json')).toBe(true); + expect(tree.exists('/apps/demo/.babelrc')).toBe(true); + expect(tree.exists('/libs/ui/.babelrc')).toBe(true); + }); + + it(`should not overwrite existing .babelrc files`, async () => { + tree = await createApp(tree, 'demo'); + tree.create('/apps/demo/.babelrc', '{}'); + + tree = await schematicRunner + .runSchematicAsync('babelrc-9.4.0', {}, tree) + .toPromise(); + + const content = tree.read('/apps/demo/.babelrc').toString(); + expect(content).toEqual('{}'); + }); + + it(`should not migrate non-React projects`, async () => { + tree = await createWebApp(tree, 'demo'); + + tree = await schematicRunner + .runSchematicAsync('babelrc-9.4.0', {}, tree) + .toPromise(); + + expect(tree.exists('/apps/demo/.babelrc')).toBe(false); + }); + + it(`should not overwrite babel.config.js file`, async () => { + tree.create('/babel.config.js', 'module.exports = {};'); + + tree = await schematicRunner + .runSchematicAsync('babelrc-9.4.0', {}, tree) + .toPromise(); + + expect(tree.exists('/babel.config.js')).toBe(true); + expect(tree.exists('/babel.config.json')).toBe(false); + }); +}); diff --git a/packages/react/src/migrations/update-9-4-0/babelrc-9-4-0.ts b/packages/react/src/migrations/update-9-4-0/babelrc-9-4-0.ts new file mode 100644 index 0000000000..9d1cea8814 --- /dev/null +++ b/packages/react/src/migrations/update-9-4-0/babelrc-9-4-0.ts @@ -0,0 +1,110 @@ +import { + chain, + Rule, + SchematicContext, + Tree, +} from '@angular-devkit/schematics'; +import { getFullProjectGraphFromHost } from '@nrwl/workspace/src/utils/ast-utils'; +import { + stripIndent, + stripIndents, +} from '@angular-devkit/core/src/utils/literals'; +import { initRootBabelConfig } from '@nrwl/web/src/utils/rules'; + +/* + * This migration will do a few things: + * + * - Create the base babel.config.json file if it doesn't already exist + * - Create .babelrc files for each React project that doesn't already have one + * - For any projects that are not migrated, display a message so users are not surprised. + */ +export default function update(): Rule { + return (host: Tree, context: SchematicContext) => { + const updates = []; + const conflicts: Array<[string, string]> = []; + const projectGraph = getFullProjectGraphFromHost(host); + if (host.exists('/babel.config.json')) { + context.logger.info( + ` + Found an existing babel.config.json file so we skipped creating it. + + You may want to update it to include the Nx preset "@nrwl/web/babel". + ` + ); + } else if (host.exists('/babel.config.js')) { + context.logger.info( + ` + Found an existing babel.config.js file so we skipped creating it. + + You may want to update it to include the Nx preset "@nrwl/web/babel". + ` + ); + } else { + updates.push(initRootBabelConfig()); + } + + Object.keys(projectGraph.nodes).forEach((name) => { + const p = projectGraph.nodes[name]; + const deps = projectGraph.dependencies[name]; + const isReact = deps.some( + (d) => + projectGraph.nodes[d.target].type === 'npm' && + d.target.indexOf('react') !== -1 + ); + if (isReact) { + updates.push((host) => { + const babelrcPath = `${p.data.root}/.babelrc`; + if (host.exists(babelrcPath)) { + conflicts.push([name, babelrcPath]); + } else { + createBabelrc(host, context, babelrcPath, deps); + } + }); + } + }); + + if (conflicts.length > 0) { + context.logger.info(stripIndent` + The following projects already have .babelrc so we did not create them: + + ${conflicts + .map(([name, babelrc]) => `${name} - ${babelrc}`) + .join('\n ')} + + You may want to update them to include the Nx preset "@nrwl/react/babel". + `); + } + + return chain(updates); + }; +} + +function createBabelrc(host, context, babelrcPath, deps) { + const babelrc = { + presets: ['@nrwl/react/babel'], + plugins: [], + }; + let added = 0; + + if (deps.some((d) => d.target === 'npm:styled-components')) { + babelrc.plugins.push(['styled-components', { pure: true, ssr: true }]); + added++; + } + + if (deps.some((d) => d.target.startsWith('npm:@emotion'))) { + babelrc.presets.push('@emotion/babel-preset-css-prop'); + added++; + } + + if (added > 1) { + context.logger.warn( + stripIndents`We created a babel config at ${babelrcPath} with both styled-components and emotion plugins. + Only one should be used, please remove the unused plugin. + + For example, if you don't use styled-components, then remove that plugin from the .babelrc file. + ` + ); + } + + host.create(babelrcPath, JSON.stringify(babelrc, null, 2)); +} diff --git a/packages/react/src/migrations/update-9-4-0/update-9-4-0.spec.ts b/packages/react/src/migrations/update-9-4-0/update-9-4-0.spec.ts new file mode 100644 index 0000000000..3ab1bf8143 --- /dev/null +++ b/packages/react/src/migrations/update-9-4-0/update-9-4-0.spec.ts @@ -0,0 +1,47 @@ +import { Tree } from '@angular-devkit/schematics'; +import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; +import { readJsonInTree } from '@nrwl/workspace'; +import * as path from 'path'; +import { createEmptyWorkspace } from '@nrwl/workspace/testing'; + +describe('Update 9.4.0', () => { + let tree: Tree; + let schematicRunner: SchematicTestRunner; + + beforeEach(async () => { + tree = Tree.empty(); + tree = createEmptyWorkspace(tree); + schematicRunner = new SchematicTestRunner( + '@nrwl/react', + path.join(__dirname, '../../../migrations.json') + ); + }); + + it(`should update libs`, async () => { + tree.overwrite( + 'package.json', + JSON.stringify({ + dependencies: { + react: '16.12.1', + }, + devDependencies: { + '@types/react': '16.9.1', + }, + }) + ); + + tree = await schematicRunner + .runSchematicAsync('update-9.4.0', {}, tree) + .toPromise(); + + const packageJson = readJsonInTree(tree, '/package.json'); + expect(packageJson).toMatchObject({ + dependencies: { + react: '16.13.1', + }, + devDependencies: { + '@types/react': '16.9.35', + }, + }); + }); +}); diff --git a/packages/react/src/migrations/update-9-4-0/update-9-4-0.ts b/packages/react/src/migrations/update-9-4-0/update-9-4-0.ts new file mode 100644 index 0000000000..d48f2c2a01 --- /dev/null +++ b/packages/react/src/migrations/update-9-4-0/update-9-4-0.ts @@ -0,0 +1,13 @@ +import { chain, Rule } from '@angular-devkit/schematics'; +import { formatFiles, updatePackagesInPackageJson } from '@nrwl/workspace'; +import * as path from 'path'; + +export default function update(): Rule { + return chain([ + updatePackagesInPackageJson( + path.join(__dirname, '../../../', 'migrations.json'), + '9.4.0' + ), + formatFiles(), + ]); +} diff --git a/packages/react/src/rules/add-styled-dependencies.ts b/packages/react/src/rules/add-styled-dependencies.ts new file mode 100644 index 0000000000..688fbabad5 --- /dev/null +++ b/packages/react/src/rules/add-styled-dependencies.ts @@ -0,0 +1,13 @@ +import { noop, Rule } from '@angular-devkit/schematics'; +import { addDepsToPackageJson } from '@nrwl/workspace'; +import { CSS_IN_JS_DEPENDENCIES } from '../utils/styled'; + +export function addStyledModuleDependencies(styledModule: string): Rule { + const extraDependencies = CSS_IN_JS_DEPENDENCIES[styledModule]; + return extraDependencies + ? addDepsToPackageJson( + extraDependencies.dependencies, + extraDependencies.devDependencies + ) + : noop(); +} diff --git a/packages/react/src/schematics/application/application.spec.ts b/packages/react/src/schematics/application/application.spec.ts index 82ff7aa40c..efed4dee22 100644 --- a/packages/react/src/schematics/application/application.spec.ts +++ b/packages/react/src/schematics/application/application.spec.ts @@ -1,7 +1,7 @@ import { Tree } from '@angular-devkit/schematics'; import { createEmptyWorkspace } from '@nrwl/workspace/testing'; import * as stripJsonComments from 'strip-json-comments'; -import { readJsonInTree, NxJson } from '@nrwl/workspace'; +import { NxJson, readJsonInTree } from '@nrwl/workspace'; import { runSchematic } from '../../utils/testing'; describe('app', () => { @@ -44,6 +44,7 @@ describe('app', () => { it('should generate files', async () => { const tree = await runSchematic('app', { name: 'myApp' }, appTree); + expect(tree.exists('apps/my-app/.babelrc')).toBeTruthy(); expect(tree.exists('apps/my-app/src/main.tsx')).toBeTruthy(); expect(tree.exists('apps/my-app/src/app/app.tsx')).toBeTruthy(); expect(tree.exists('apps/my-app/src/app/app.spec.tsx')).toBeTruthy(); diff --git a/packages/react/src/schematics/application/application.ts b/packages/react/src/schematics/application/application.ts index 5b99c54eba..6f44eb469a 100644 --- a/packages/react/src/schematics/application/application.ts +++ b/packages/react/src/schematics/application/application.ts @@ -1,63 +1,27 @@ -import { join, JsonObject, normalize, Path } from '@angular-devkit/core'; import { - apply, chain, - externalSchematic, - filter, - mergeWith, - move, - noop, Rule, SchematicContext, - template, Tree, - url, } from '@angular-devkit/schematics'; -import { - addLintFiles, - formatFiles, - generateProjectLint, - insert, - names, - NxJson, - offsetFromRoot, - toFileName, - updateJsonInTree, - updateWorkspace, -} from '@nrwl/workspace'; -import { - addDepsToPackageJson, - appsDir, - updateWorkspaceInTree, -} from '@nrwl/workspace/src/utils/ast-utils'; -import { toJS } from '@nrwl/workspace/src/utils/rules/to-js'; -import * as ts from 'typescript'; -import { assertValidStyle } from '../../utils/assertion'; -import { addInitialRoutes } from '../../utils/ast-utils'; -import { updateJestConfigContent } from '../../utils/jest-utils'; +import { addLintFiles, formatFiles } from '@nrwl/workspace'; import { extraEslintDependencies, reactEslintJson } from '../../utils/lint'; -import { CSS_IN_JS_DEPENDENCIES } from '../../utils/styled'; -import { - reactRouterDomVersion, - typesReactRouterDomVersion, -} from '../../utils/versions'; import init from '../init/init'; import { Schema } from './schema'; - -interface NormalizedSchema extends Schema { - projectName: string; - appProjectRoot: Path; - e2eProjectName: string; - parsedTags: string[]; - fileName: string; - styledModule: null | string; - hasStyles: boolean; -} +import { createApplicationFiles } from './lib/create-application-files'; +import { updateJestConfig } from './lib/update-jest-config'; +import { normalizeOptions } from './lib/normalize-options'; +import { addProject } from './lib/add-project'; +import { addCypress } from './lib/add-cypress'; +import { addJest } from './lib/add-jest'; +import { addRouting } from './lib/add-routing'; +import { setDefaults } from './lib/set-defaults'; +import { updateNxJson } from './lib/update-nx-json'; +import { addStyledModuleDependencies } from '../../rules/add-styled-dependencies'; export default function (schema: Schema): Rule { return (host: Tree, context: SchematicContext) => { const options = normalizeOptions(host, schema); - return chain([ init({ ...options, @@ -73,283 +37,10 @@ export default function (schema: Schema): Rule { addCypress(options), addJest(options), updateJestConfig(options), - addStyledModuleDependencies(options), + addStyledModuleDependencies(options.styledModule), addRouting(options, context), setDefaults(options), formatFiles(options), ]); }; } - -function createApplicationFiles(options: NormalizedSchema): Rule { - return mergeWith( - apply(url(`./files/app`), [ - template({ - ...names(options.name), - ...options, - tmpl: '', - offsetFromRoot: offsetFromRoot(options.appProjectRoot), - }), - options.styledModule || !options.hasStyles - ? filter((file) => !file.endsWith(`.${options.style}`)) - : noop(), - options.unitTestRunner === 'none' - ? filter((file) => file !== `/src/app/${options.fileName}.spec.tsx`) - : noop(), - move(options.appProjectRoot), - options.js ? toJS() : noop(), - ]) - ); -} - -function updateJestConfig(options: NormalizedSchema): Rule { - return options.unitTestRunner === 'none' - ? noop() - : (host) => { - const configPath = `${options.appProjectRoot}/jest.config.js`; - const originalContent = host.read(configPath).toString(); - const content = updateJestConfigContent(originalContent); - host.overwrite(configPath, content); - }; -} - -function updateNxJson(options: NormalizedSchema): Rule { - return updateJsonInTree('nx.json', (json) => { - json.projects[options.projectName] = { tags: options.parsedTags }; - return json; - }); -} - -function addProject(options: NormalizedSchema): Rule { - return updateWorkspaceInTree((json) => { - const architect: { [key: string]: any } = {}; - - architect.build = { - builder: '@nrwl/web:build', - options: { - outputPath: join(normalize('dist'), options.appProjectRoot), - index: join(options.appProjectRoot, 'src/index.html'), - main: join(options.appProjectRoot, maybeJs(options, `src/main.tsx`)), - polyfills: join( - options.appProjectRoot, - maybeJs(options, 'src/polyfills.ts') - ), - tsConfig: join(options.appProjectRoot, 'tsconfig.app.json'), - assets: [ - join(options.appProjectRoot, 'src/favicon.ico'), - join(options.appProjectRoot, 'src/assets'), - ], - styles: - options.styledModule || !options.hasStyles - ? [] - : [join(options.appProjectRoot, `src/styles.${options.style}`)], - scripts: [], - webpackConfig: '@nrwl/react/plugins/webpack', - }, - configurations: { - production: { - fileReplacements: [ - { - replace: join( - options.appProjectRoot, - maybeJs(options, `src/environments/environment.ts`) - ), - with: join( - options.appProjectRoot, - maybeJs(options, `src/environments/environment.prod.ts`) - ), - }, - ], - optimization: true, - outputHashing: 'all', - sourceMap: false, - extractCss: true, - namedChunks: false, - extractLicenses: true, - vendorChunk: false, - budgets: [ - { - type: 'initial', - maximumWarning: '2mb', - maximumError: '5mb', - }, - ], - }, - }, - }; - - architect.serve = { - builder: '@nrwl/web:dev-server', - options: { - buildTarget: `${options.projectName}:build`, - }, - configurations: { - production: { - buildTarget: `${options.projectName}:build:production`, - }, - }, - }; - - architect.lint = generateProjectLint( - normalize(options.appProjectRoot), - join(normalize(options.appProjectRoot), 'tsconfig.app.json'), - options.linter - ); - - json.projects[options.projectName] = { - root: options.appProjectRoot, - sourceRoot: join(options.appProjectRoot, 'src'), - projectType: 'application', - schematics: {}, - architect, - }; - - json.defaultProject = json.defaultProject || options.projectName; - - return json; - }); -} - -function addCypress(options: NormalizedSchema): Rule { - return options.e2eTestRunner === 'cypress' - ? externalSchematic('@nrwl/cypress', 'cypress-project', { - ...options, - name: options.name + '-e2e', - directory: options.directory, - project: options.projectName, - }) - : noop(); -} - -function addJest(options: NormalizedSchema): Rule { - return options.unitTestRunner === 'jest' - ? externalSchematic('@nrwl/jest', 'jest-project', { - project: options.projectName, - supportTsx: true, - skipSerializers: true, - setupFile: 'none', - babelJest: options.babelJest, - }) - : noop(); -} - -function addStyledModuleDependencies(options: NormalizedSchema): Rule { - const extraDependencies = CSS_IN_JS_DEPENDENCIES[options.styledModule]; - - return extraDependencies - ? addDepsToPackageJson( - extraDependencies.dependencies, - extraDependencies.devDependencies - ) - : noop(); -} - -function addRouting( - options: NormalizedSchema, - context: SchematicContext -): Rule { - return options.routing - ? chain([ - function addRouterToComponent(host: Tree) { - const appPath = join( - options.appProjectRoot, - maybeJs(options, `src/app/${options.fileName}.tsx`) - ); - const appFileContent = host.read(appPath).toString('utf-8'); - const appSource = ts.createSourceFile( - appPath, - appFileContent, - ts.ScriptTarget.Latest, - true - ); - - insert(host, appPath, addInitialRoutes(appPath, appSource, context)); - }, - addDepsToPackageJson( - { 'react-router-dom': reactRouterDomVersion }, - { '@types/react-router-dom': typesReactRouterDomVersion } - ), - ]) - : noop(); -} - -function setDefaults(options: NormalizedSchema): Rule { - return options.skipWorkspaceJson - ? noop() - : updateWorkspace((workspace) => { - workspace.extensions.schematics = jsonIdentity( - workspace.extensions.schematics || {} - ); - workspace.extensions.schematics['@nrwl/react'] = - workspace.extensions.schematics['@nrwl/react'] || {}; - const prev = jsonIdentity( - workspace.extensions.schematics['@nrwl/react'] - ); - - workspace.extensions.schematics = { - ...workspace.extensions.schematics, - '@nrwl/react': { - ...prev, - application: { - style: options.style, - linter: options.linter, - ...jsonIdentity(prev.application), - }, - component: { - style: options.style, - ...jsonIdentity(prev.component), - }, - library: { - style: options.style, - linter: options.linter, - ...jsonIdentity(prev.library), - }, - }, - }; - }); -} - -function jsonIdentity(x: any): JsonObject { - return x as JsonObject; -} - -function normalizeOptions(host: Tree, options: Schema): NormalizedSchema { - const appDirectory = options.directory - ? `${toFileName(options.directory)}/${toFileName(options.name)}` - : toFileName(options.name); - - const appProjectName = appDirectory.replace(new RegExp('/', 'g'), '-'); - const e2eProjectName = `${appProjectName}-e2e`; - - const appProjectRoot = normalize(`${appsDir(host)}/${appDirectory}`); - - const parsedTags = options.tags - ? options.tags.split(',').map((s) => s.trim()) - : []; - - const fileName = options.pascalCaseFiles ? 'App' : 'app'; - - const styledModule = /^(css|scss|less|styl|none)$/.test(options.style) - ? null - : options.style; - - assertValidStyle(options.style); - - return { - ...options, - name: toFileName(options.name), - projectName: appProjectName, - appProjectRoot, - e2eProjectName, - parsedTags, - fileName, - styledModule, - hasStyles: options.style !== 'none', - }; -} - -function maybeJs(options: NormalizedSchema, path: string): string { - return options.js && (path.endsWith('.ts') || path.endsWith('.tsx')) - ? path.replace(/\.tsx?$/, '.js') - : path; -} diff --git a/packages/react/src/schematics/application/files/app/.babelrc__tmpl__ b/packages/react/src/schematics/application/files/app/.babelrc__tmpl__ new file mode 100644 index 0000000000..216b213efa --- /dev/null +++ b/packages/react/src/schematics/application/files/app/.babelrc__tmpl__ @@ -0,0 +1,9 @@ +{ + "presets": [ + "@nrwl/react/babel", + <% if (style === '@emotion/styled') { %>"@emotion/babel-preset-css-prop"<% } %> + ], + "plugins": [ + <% if (style === 'styled-components') { %>["styled-components", { "pure": true, "ssr": true }]<% } %> + ] +} diff --git a/packages/react/src/schematics/application/lib/add-cypress.ts b/packages/react/src/schematics/application/lib/add-cypress.ts new file mode 100644 index 0000000000..974091f43f --- /dev/null +++ b/packages/react/src/schematics/application/lib/add-cypress.ts @@ -0,0 +1,13 @@ +import { externalSchematic, noop, Rule } from '@angular-devkit/schematics'; +import { NormalizedSchema } from '../schema'; + +export function addCypress(options: NormalizedSchema): Rule { + return options.e2eTestRunner === 'cypress' + ? externalSchematic('@nrwl/cypress', 'cypress-project', { + ...options, + name: options.name + '-e2e', + directory: options.directory, + project: options.projectName, + }) + : noop(); +} diff --git a/packages/react/src/schematics/application/lib/add-jest.ts b/packages/react/src/schematics/application/lib/add-jest.ts new file mode 100644 index 0000000000..49e7be6527 --- /dev/null +++ b/packages/react/src/schematics/application/lib/add-jest.ts @@ -0,0 +1,14 @@ +import { externalSchematic, noop, Rule } from '@angular-devkit/schematics'; +import { NormalizedSchema } from '../schema'; + +export function addJest(options: NormalizedSchema): Rule { + return options.unitTestRunner === 'jest' + ? externalSchematic('@nrwl/jest', 'jest-project', { + project: options.projectName, + supportTsx: true, + skipSerializers: true, + setupFile: 'none', + babelJest: options.babelJest, + }) + : noop(); +} diff --git a/packages/react/src/schematics/application/lib/add-project.ts b/packages/react/src/schematics/application/lib/add-project.ts new file mode 100644 index 0000000000..5119d9b2c4 --- /dev/null +++ b/packages/react/src/schematics/application/lib/add-project.ts @@ -0,0 +1,100 @@ +import { Rule } from '@angular-devkit/schematics'; +import { generateProjectLint, updateWorkspaceInTree } from '@nrwl/workspace'; +import { join, normalize } from '@angular-devkit/core'; +import { NormalizedSchema } from '../schema'; + +export function addProject(options: NormalizedSchema): Rule { + return updateWorkspaceInTree((json) => { + const architect: { [key: string]: any } = {}; + + architect.build = { + builder: '@nrwl/web:build', + options: { + outputPath: join(normalize('dist'), options.appProjectRoot), + index: join(options.appProjectRoot, 'src/index.html'), + main: join(options.appProjectRoot, maybeJs(options, `src/main.tsx`)), + polyfills: join( + options.appProjectRoot, + maybeJs(options, 'src/polyfills.ts') + ), + tsConfig: join(options.appProjectRoot, 'tsconfig.app.json'), + assets: [ + join(options.appProjectRoot, 'src/favicon.ico'), + join(options.appProjectRoot, 'src/assets'), + ], + styles: + options.styledModule || !options.hasStyles + ? [] + : [join(options.appProjectRoot, `src/styles.${options.style}`)], + scripts: [], + webpackConfig: '@nrwl/react/plugins/webpack', + }, + configurations: { + production: { + fileReplacements: [ + { + replace: join( + options.appProjectRoot, + maybeJs(options, `src/environments/environment.ts`) + ), + with: join( + options.appProjectRoot, + maybeJs(options, `src/environments/environment.prod.ts`) + ), + }, + ], + optimization: true, + outputHashing: 'all', + sourceMap: false, + extractCss: true, + namedChunks: false, + extractLicenses: true, + vendorChunk: false, + budgets: [ + { + type: 'initial', + maximumWarning: '2mb', + maximumError: '5mb', + }, + ], + }, + }, + }; + + architect.serve = { + builder: '@nrwl/web:dev-server', + options: { + buildTarget: `${options.projectName}:build`, + }, + configurations: { + production: { + buildTarget: `${options.projectName}:build:production`, + }, + }, + }; + + architect.lint = generateProjectLint( + normalize(options.appProjectRoot), + join(normalize(options.appProjectRoot), 'tsconfig.app.json'), + options.linter + ); + + json.projects[options.projectName] = { + root: options.appProjectRoot, + sourceRoot: join(options.appProjectRoot, 'src'), + projectType: 'application', + schematics: {}, + architect, + }; + + json.defaultProject = json.defaultProject || options.projectName; + + return json; + }); +} + +function maybeJs(options: NormalizedSchema, path: string): string { + return options.js && (path.endsWith('.ts') || path.endsWith('.tsx')) + ? path.replace(/\.tsx?$/, '.js') + : path; +} diff --git a/packages/react/src/schematics/application/lib/add-routing.ts b/packages/react/src/schematics/application/lib/add-routing.ts new file mode 100644 index 0000000000..f70d41489f --- /dev/null +++ b/packages/react/src/schematics/application/lib/add-routing.ts @@ -0,0 +1,51 @@ +import * as ts from 'typescript'; +import { + chain, + noop, + Rule, + SchematicContext, + Tree, +} from '@angular-devkit/schematics'; +import { join } from '@angular-devkit/core'; +import { addDepsToPackageJson, insert } from '@nrwl/workspace'; +import { addInitialRoutes } from '../../../utils/ast-utils'; +import { NormalizedSchema } from '../schema'; +import { + reactRouterDomVersion, + typesReactRouterDomVersion, +} from '@nrwl/react/src/utils/versions'; + +export function addRouting( + options: NormalizedSchema, + context: SchematicContext +): Rule { + return options.routing + ? chain([ + function addRouterToComponent(host: Tree) { + const appPath = join( + options.appProjectRoot, + maybeJs(options, `src/app/${options.fileName}.tsx`) + ); + const appFileContent = host.read(appPath).toString('utf-8'); + const appSource = ts.createSourceFile( + appPath, + appFileContent, + ts.ScriptTarget.Latest, + true + ); + + insert(host, appPath, addInitialRoutes(appPath, appSource, context)); + }, + addDepsToPackageJson( + { 'react-router-dom': reactRouterDomVersion }, + { '@types/react-router-dom': typesReactRouterDomVersion } + ), + ]) + : noop(); +} + +function maybeJs(options: NormalizedSchema, path: string): string { + return options.js && (path.endsWith('.ts') || path.endsWith('.tsx')) + ? path.replace(/\.tsx?$/, '.js') + : path; +} diff --git a/packages/react/src/schematics/application/lib/create-application-files.ts b/packages/react/src/schematics/application/lib/create-application-files.ts new file mode 100644 index 0000000000..06583e0700 --- /dev/null +++ b/packages/react/src/schematics/application/lib/create-application-files.ts @@ -0,0 +1,34 @@ +import { + apply, + filter, + mergeWith, + move, + noop, + Rule, + template, + url, +} from '@angular-devkit/schematics'; +import { names, offsetFromRoot } from '@nrwl/workspace'; +import { toJS } from '@nrwl/workspace/src/utils/rules/to-js'; +import { NormalizedSchema } from '../schema'; + +export function createApplicationFiles(options: NormalizedSchema): Rule { + return mergeWith( + apply(url(`./files/app`), [ + template({ + ...names(options.name), + ...options, + tmpl: '', + offsetFromRoot: offsetFromRoot(options.appProjectRoot), + }), + options.styledModule || !options.hasStyles + ? filter((file) => !file.endsWith(`.${options.style}`)) + : noop(), + options.unitTestRunner === 'none' + ? filter((file) => file !== `/src/app/${options.fileName}.spec.tsx`) + : noop(), + move(options.appProjectRoot), + options.js ? toJS() : noop(), + ]) + ); +} diff --git a/packages/react/src/schematics/application/lib/normalize-options.ts b/packages/react/src/schematics/application/lib/normalize-options.ts new file mode 100644 index 0000000000..1cb07aa547 --- /dev/null +++ b/packages/react/src/schematics/application/lib/normalize-options.ts @@ -0,0 +1,44 @@ +import { Tree } from '@angular-devkit/schematics'; +import { normalize } from '@angular-devkit/core'; +import { toFileName } from '@nrwl/workspace'; +import { appsDir } from '@nrwl/workspace/src/utils/ast-utils'; +import { NormalizedSchema, Schema } from '../schema'; +import { assertValidStyle } from '../../../utils/assertion'; + +export function normalizeOptions( + host: Tree, + options: Schema +): NormalizedSchema { + const appDirectory = options.directory + ? `${toFileName(options.directory)}/${toFileName(options.name)}` + : toFileName(options.name); + + const appProjectName = appDirectory.replace(new RegExp('/', 'g'), '-'); + const e2eProjectName = `${appProjectName}-e2e`; + + const appProjectRoot = normalize(`${appsDir(host)}/${appDirectory}`); + + const parsedTags = options.tags + ? options.tags.split(',').map((s) => s.trim()) + : []; + + const fileName = options.pascalCaseFiles ? 'App' : 'app'; + + const styledModule = /^(css|scss|less|styl|none)$/.test(options.style) + ? null + : options.style; + + assertValidStyle(options.style); + + return { + ...options, + name: toFileName(options.name), + projectName: appProjectName, + appProjectRoot, + e2eProjectName, + parsedTags, + fileName, + styledModule, + hasStyles: options.style !== 'none', + }; +} diff --git a/packages/react/src/schematics/application/lib/set-defaults.ts b/packages/react/src/schematics/application/lib/set-defaults.ts new file mode 100644 index 0000000000..6981cebf8e --- /dev/null +++ b/packages/react/src/schematics/application/lib/set-defaults.ts @@ -0,0 +1,44 @@ +import { noop, Rule } from '@angular-devkit/schematics'; +import { updateWorkspace } from '@nrwl/workspace'; +import { NormalizedSchema } from '../schema'; +import { JsonObject } from '@angular-devkit/core'; + +export function setDefaults(options: NormalizedSchema): Rule { + return options.skipWorkspaceJson + ? noop() + : updateWorkspace((workspace) => { + workspace.extensions.schematics = jsonIdentity( + workspace.extensions.schematics || {} + ); + workspace.extensions.schematics['@nrwl/react'] = + workspace.extensions.schematics['@nrwl/react'] || {}; + const prev = jsonIdentity( + workspace.extensions.schematics['@nrwl/react'] + ); + + workspace.extensions.schematics = { + ...workspace.extensions.schematics, + '@nrwl/react': { + ...prev, + application: { + style: options.style, + linter: options.linter, + ...jsonIdentity(prev.application), + }, + component: { + style: options.style, + ...jsonIdentity(prev.component), + }, + library: { + style: options.style, + linter: options.linter, + ...jsonIdentity(prev.library), + }, + }, + }; + }); +} + +function jsonIdentity(x: any): JsonObject { + return x as JsonObject; +} diff --git a/packages/react/src/schematics/application/lib/update-jest-config.ts b/packages/react/src/schematics/application/lib/update-jest-config.ts new file mode 100644 index 0000000000..d664bdcb32 --- /dev/null +++ b/packages/react/src/schematics/application/lib/update-jest-config.ts @@ -0,0 +1,14 @@ +import { noop, Rule } from '@angular-devkit/schematics'; +import { updateJestConfigContent } from '@nrwl/react/src/utils/jest-utils'; +import { NormalizedSchema } from '../schema'; + +export function updateJestConfig(options: NormalizedSchema): Rule { + return options.unitTestRunner === 'none' + ? noop() + : (host) => { + const configPath = `${options.appProjectRoot}/jest.config.js`; + const originalContent = host.read(configPath).toString(); + const content = updateJestConfigContent(originalContent); + host.overwrite(configPath, content); + }; +} diff --git a/packages/react/src/schematics/application/lib/update-nx-json.ts b/packages/react/src/schematics/application/lib/update-nx-json.ts new file mode 100644 index 0000000000..7cdb670669 --- /dev/null +++ b/packages/react/src/schematics/application/lib/update-nx-json.ts @@ -0,0 +1,10 @@ +import { Rule } from '@angular-devkit/schematics'; +import { NxJson, updateJsonInTree } from '@nrwl/workspace'; +import { NormalizedSchema } from '../schema'; + +export function updateNxJson(options: NormalizedSchema): Rule { + return updateJsonInTree('nx.json', (json) => { + json.projects[options.projectName] = { tags: options.parsedTags }; + return json; + }); +} diff --git a/packages/react/src/schematics/application/schema.d.ts b/packages/react/src/schematics/application/schema.d.ts index 3d6e84d66c..9a9ab7fe15 100644 --- a/packages/react/src/schematics/application/schema.d.ts +++ b/packages/react/src/schematics/application/schema.d.ts @@ -1,5 +1,6 @@ import { Linter } from '@nrwl/workspace'; import { SupportedStyles } from 'packages/react/typings/style'; +import { Path } from '@angular-devkit/core'; export interface Schema { name: string; @@ -17,3 +18,13 @@ export interface Schema { skipWorkspaceJson?: boolean; js?: boolean; } + +export interface NormalizedSchema extends Schema { + projectName: string; + appProjectRoot: Path; + e2eProjectName: string; + parsedTags: string[]; + fileName: string; + styledModule: null | string; + hasStyles: boolean; +} diff --git a/packages/react/src/schematics/component/component.ts b/packages/react/src/schematics/component/component.ts index e478fb20e7..3da50bbbfa 100644 --- a/packages/react/src/schematics/component/component.ts +++ b/packages/react/src/schematics/component/component.ts @@ -21,13 +21,13 @@ import { getProjectConfig, insert, } from '@nrwl/workspace/src/utils/ast-utils'; -import { CSS_IN_JS_DEPENDENCIES } from '../../utils/styled'; import { - typesReactRouterDomVersion, reactRouterDomVersion, + typesReactRouterDomVersion, } from '../../utils/versions'; import { assertValidStyle } from '../../utils/assertion'; import { toJS } from '@nrwl/workspace/src/utils/rules/to-js'; +import { addStyledModuleDependencies } from '../../rules/add-styled-dependencies'; interface NormalizedSchema extends Schema { projectSourceRoot: Path; @@ -42,7 +42,7 @@ export default function (schema: Schema): Rule { const options = await normalizeOptions(host, schema, context); return chain([ createComponentFiles(options), - addStyledModuleDependencies(options), + addStyledModuleDependencies(options.styledModule), addExportsToBarrel(options), options.routing ? addDepsToPackageJson( @@ -73,17 +73,6 @@ function createComponentFiles(options: NormalizedSchema): Rule { ); } -function addStyledModuleDependencies(options: NormalizedSchema): Rule { - const extraDependencies = CSS_IN_JS_DEPENDENCIES[options.styledModule]; - - return extraDependencies - ? addDepsToPackageJson( - extraDependencies.dependencies, - extraDependencies.devDependencies - ) - : noop(); -} - function addExportsToBarrel(options: NormalizedSchema): Rule { return async (host: Tree) => { const workspace = await getWorkspace(host); @@ -95,6 +84,7 @@ function addExportsToBarrel(options: NormalizedSchema): Rule { options.projectSourceRoot, options.js ? 'index.js' : 'index.ts' ); + console.log('index', indexFilePath); const buffer = host.read(indexFilePath); if (!!buffer) { const indexSource = buffer!.toString('utf-8'); diff --git a/packages/react/src/schematics/library/files/lib/.babelrc__tmpl__ b/packages/react/src/schematics/library/files/lib/.babelrc__tmpl__ new file mode 100644 index 0000000000..216b213efa --- /dev/null +++ b/packages/react/src/schematics/library/files/lib/.babelrc__tmpl__ @@ -0,0 +1,9 @@ +{ + "presets": [ + "@nrwl/react/babel", + <% if (style === '@emotion/styled') { %>"@emotion/babel-preset-css-prop"<% } %> + ], + "plugins": [ + <% if (style === 'styled-components') { %>["styled-components", { "pure": true, "ssr": true }]<% } %> + ] +} diff --git a/packages/react/src/schematics/library/library.spec.ts b/packages/react/src/schematics/library/library.spec.ts index 6e765c4bc7..101477c8ab 100644 --- a/packages/react/src/schematics/library/library.spec.ts +++ b/packages/react/src/schematics/library/library.spec.ts @@ -1,7 +1,6 @@ import { Tree } from '@angular-devkit/schematics'; import { createEmptyWorkspace } from '@nrwl/workspace/testing'; -import { readJsonInTree, updateJsonInTree } from '@nrwl/workspace'; -import { NxJson } from '@nrwl/workspace'; +import { NxJson, readJsonInTree, updateJsonInTree } from '@nrwl/workspace'; import { runSchematic } from '../../utils/testing'; describe('lib', () => { @@ -398,7 +397,7 @@ describe('lib', () => { expect(workspaceJson.projects['my-lib'].architect.build).toMatchObject({ options: { - external: ['react', 'react-dom', 'styled-components'], + external: ['react', 'react-dom', 'react-is', 'styled-components'], }, }); }); @@ -443,7 +442,7 @@ describe('lib', () => { }); }); - it('should add package.json', async () => { + it('should add package.json and .babelrc', async () => { const tree = await runSchematic( 'lib', { @@ -454,8 +453,8 @@ describe('lib', () => { ); const packageJson = readJsonInTree(tree, '/libs/my-lib/package.json'); - expect(packageJson.name).toEqual('@proj/my-lib'); + expect(tree.exists('/libs/my-lib/.babelrc')); }); }); diff --git a/packages/react/src/schematics/library/library.ts b/packages/react/src/schematics/library/library.ts index 22c1caf725..8d96d08cbd 100644 --- a/packages/react/src/schematics/library/library.ts +++ b/packages/react/src/schematics/library/library.ts @@ -47,6 +47,7 @@ import { } from '../../utils/versions'; import { Schema } from './schema'; import { libsDir } from '@nrwl/workspace/src/utils/ast-utils'; +import { initRootBabelConfig } from '@nrwl/web/src/utils/rules'; export interface NormalizedSchema extends Schema { name: string; @@ -99,6 +100,7 @@ export default function (schema: Schema): Rule { : noop(), options.publishable ? updateLibPackageNpmScope(options) : noop(), updateAppRoutes(options, context), + initRootBabelConfig(), formatFiles(options), ])(host, context); }; diff --git a/packages/react/src/utils/styled.ts b/packages/react/src/utils/styled.ts index d49dfccf1e..d703f62f0d 100644 --- a/packages/react/src/utils/styled.ts +++ b/packages/react/src/utils/styled.ts @@ -1,7 +1,11 @@ import { + babelPluginStyledComponentsVersion, + emotionBabelPresetCssPropVersion, emotionCoreVersion, emotionStyledVersion, + reactIsVersion, styledComponentsVersion, + typesReactIsVersion, typesStyledComponentsVersion, } from './versions'; import { PackageDependencies } from './dependencies'; @@ -11,10 +15,13 @@ export const CSS_IN_JS_DEPENDENCIES: { } = { 'styled-components': { dependencies: { + 'react-is': reactIsVersion, 'styled-components': styledComponentsVersion, }, devDependencies: { '@types/styled-components': typesStyledComponentsVersion, + '@types/react-is': typesReactIsVersion, + 'babel-plugin-styled-components': babelPluginStyledComponentsVersion, }, }, '@emotion/styled': { @@ -22,6 +29,8 @@ export const CSS_IN_JS_DEPENDENCIES: { '@emotion/styled': emotionStyledVersion, '@emotion/core': emotionCoreVersion, }, - devDependencies: {}, + devDependencies: { + '@emotion/babel-preset-css-prop': emotionBabelPresetCssPropVersion, + }, }, }; diff --git a/packages/react/src/utils/testing.ts b/packages/react/src/utils/testing.ts index 49a40b2fbf..bae02fa9ed 100644 --- a/packages/react/src/utils/testing.ts +++ b/packages/react/src/utils/testing.ts @@ -3,6 +3,7 @@ import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; import { Rule, Tree } from '@angular-devkit/schematics'; import { names } from '@nrwl/workspace/src/utils/name-utils'; import { updateWorkspace } from '@nrwl/workspace/src/utils/workspace'; +import { readJsonInTree } from '@nrwl/workspace'; const testRunner = new SchematicTestRunner( '@nrwl/react', @@ -32,9 +33,48 @@ export function callRule(rule: Rule, tree: Tree) { return testRunner.callRule(rule, tree).toPromise(); } +export function updateNxJson(tree, update: (json: any) => any) { + const updated = update(readJsonInTree(tree, '/nx.json')); + tree.overwrite('/nx.json', JSON.stringify(updated)); +} + export function createApp(tree: Tree, appName: string): Promise { const { fileName } = names(appName); + tree.create( + `/apps/${fileName}/src/main.tsx`, + `import ReactDOM from 'react-dom';\n` + ); + + updateNxJson(tree, (json) => { + json.projects[appName] = { tags: [] }; + return json; + }); + + return callRule( + updateWorkspace((workspace) => { + workspace.projects.add({ + name: fileName, + root: `apps/${fileName}`, + projectType: 'application', + sourceRoot: `apps/${fileName}/src`, + targets: {}, + }); + }), + tree + ); +} + +export function createWebApp(tree: Tree, appName: string): Promise { + const { fileName } = names(appName); + + tree.create(`/apps/${fileName}/src/index.ts`, `\n`); + + updateNxJson(tree, (json) => { + json.projects[appName] = { tags: [] }; + return json; + }); + return callRule( updateWorkspace((workspace) => { workspace.projects.add({ @@ -52,7 +92,12 @@ export function createApp(tree: Tree, appName: string): Promise { export function createLib(tree: Tree, libName: string): Promise { const { fileName } = names(libName); - tree.create(`/libs/${fileName}/src/index.ts`, `\n`); + tree.create(`/libs/${fileName}/src/index.ts`, `import React from 'react';\n`); + + updateNxJson(tree, (json) => { + json.projects[libName] = { tags: [] }; + return json; + }); return callRule( updateWorkspace((workspace) => { diff --git a/packages/react/src/utils/versions.ts b/packages/react/src/utils/versions.ts index 92dc7fd714..2e5710646a 100644 --- a/packages/react/src/utils/versions.ts +++ b/packages/react/src/utils/versions.ts @@ -1,26 +1,32 @@ export const nxVersion = '*'; -export const reactVersion = '16.12.0'; -export const reactDomVersion = '16.12.0'; -export const typesReactVersion = '16.9.17'; -export const typesReactDomVersion = '16.9.4'; +export const reactVersion = '16.13.1'; +export const reactDomVersion = '16.13.1'; +export const typesReactVersion = '16.9.35'; +export const typesReactDomVersion = '16.9.8'; -export const styledComponentsVersion = '5.0.1'; -export const typesStyledComponentsVersion = '5.0.1'; +export const styledComponentsVersion = '5.1.0'; +export const typesStyledComponentsVersion = '5.1.0'; + +export const reactIsVersion = '16.13.1'; +export const typesReactIsVersion = '16.7.1'; export const emotionStyledVersion = '10.0.27'; export const emotionCoreVersion = '10.0.27'; +export const emotionBabelPresetCssPropVersion = '10.0.27'; -export const reactRouterDomVersion = '5.1.2'; -export const typesReactRouterDomVersion = '5.1.3'; +export const reactRouterDomVersion = '5.2.0'; +export const typesReactRouterDomVersion = '5.1.5'; -export const testingLibraryReactVersion = '9.4.0'; +export const testingLibraryReactVersion = '10.0.4'; -export const reduxjsToolkitVersion = '1.3.2'; -export const reactReduxVersion = '7.1.3'; -export const typesReactReduxVersion = '7.1.5'; +export const reduxjsToolkitVersion = '1.3.6'; +export const reactReduxVersion = '7.2.0'; +export const typesReactReduxVersion = '7.1.9'; -export const eslintPluginImportVersion = '2.19.1'; +export const eslintPluginImportVersion = '2.20.2'; export const eslintPluginJsxA11yVersion = '6.2.3'; -export const eslintPluginReactVersion = '7.17.0'; -export const eslintPluginReactHooksVersion = '2.3.0'; +export const eslintPluginReactVersion = '7.20.0'; +export const eslintPluginReactHooksVersion = '4.0.2'; + +export const babelPluginStyledComponentsVersion = '1.10.7'; diff --git a/packages/storybook/package.json b/packages/storybook/package.json index d37a64f7ad..9de6164ff4 100644 --- a/packages/storybook/package.json +++ b/packages/storybook/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "@nrwl/cypress": "*", - "core-js": "^3.2.1", + "core-js": "^3.6.5", "tree-kill": "1.2.2", "ts-loader": "5.3.1", "tsconfig-paths-webpack-plugin": "3.2.0", diff --git a/packages/storybook/src/utils/versions.ts b/packages/storybook/src/utils/versions.ts index 26b3e9b012..d68e11ad91 100644 --- a/packages/storybook/src/utils/versions.ts +++ b/packages/storybook/src/utils/versions.ts @@ -1,5 +1,5 @@ export const nxVersion = '*'; export const storybookVersion = '5.3.9'; -export const babelCoreVersion = '7.8.3'; -export const babelLoaderVersion = '8.0.6'; -export const babelPresetTypescriptVersion = '7.8.3'; +export const babelCoreVersion = '7.9.6'; +export const babelLoaderVersion = '8.1.0'; +export const babelPresetTypescriptVersion = '7.9.0'; diff --git a/packages/web/babel.ts b/packages/web/babel.ts new file mode 100644 index 0000000000..509671dc6a --- /dev/null +++ b/packages/web/babel.ts @@ -0,0 +1,53 @@ +/* + * Babel preset to provide TypeScript support and module/nomodule for Nx. + */ + +module.exports = function (api: any, options: {}) { + api.assertVersion(7); + + return { + presets: [ + // Support module/nomodule pattern. + [ + require.resolve('@babel/preset-env'), + { + // Allow importing core-js in entrypoint and use browserlist to select polyfills. + // This is needed for differential loading as well. + useBuiltIns: 'entry', + corejs: 3, + // Do not transform modules to CJS + modules: false, + targets: api.env('legacy') ? undefined : { esmodules: true }, + bugfixes: true, + // Exclude transforms that make all code slower + exclude: ['transform-typeof-symbol'], + }, + ], + require.resolve('@babel/preset-typescript'), + ], + plugins: [ + require.resolve('babel-plugin-macros'), + // Must use legacy decorators to remain compatible with TypeScript. + [require.resolve('@babel/plugin-proposal-decorators'), { legacy: true }], + [ + require.resolve('@babel/plugin-proposal-class-properties'), + { loose: true }, + ], + ], + overrides: [ + // Convert `const enum` to `enum`. The former cannot be supported by babel + // but at least we can get it to not error out. + { + test: /\.tsx?$/, + plugins: [ + [ + require.resolve('babel-plugin-const-enum'), + { + transform: 'removeConst', + }, + ], + ], + }, + ], + }; +}; diff --git a/packages/web/package.json b/packages/web/package.json index 75a349126d..3f8b156ed3 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -39,28 +39,29 @@ "@angular-devkit/build-webpack": "~0.901.0", "@angular-devkit/core": "~9.1.0", "@angular-devkit/schematics": "~9.1.0", - "@babel/core": "^7.8.4", - "@babel/preset-env": "^7.8.4", - "@babel/preset-typescript": "^7.8.3", - "@babel/plugin-proposal-class-properties": "^7.8.3", - "@babel/plugin-proposal-decorators": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/core": "7.9.6", + "@babel/preset-env": "7.9.6", + "@babel/plugin-proposal-class-properties": "7.8.3", + "@babel/plugin-proposal-decorators": "7.8.3", + "@babel/plugin-transform-regenerator": "7.8.7", + "@babel/preset-typescript": "7.9.0", "@rollup/plugin-commonjs": "11.0.2", + "@rollup/plugin-babel": "5.0.2", "@rollup/plugin-image": "2.0.4", "@rollup/plugin-node-resolve": "7.1.1", "ajv": "6.10.2", "autoprefixer": "9.7.4", - "babel-loader": "8.0.6", - "babel-plugin-const-enum": "0.0.5", - "babel-plugin-macros": "2.6.1", - "babel-plugin-transform-async-to-promises": "0.8.15", + "babel-loader": "8.1.0", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-transform-async-to-promises": "^0.8.15", "browserslist": "4.8.7", "cacache": "12.0.2", "caniuse-lite": "^1.0.30001030", "circular-dependency-plugin": "5.2.0", "clean-css": "4.2.1", "copy-webpack-plugin": "5.1.1", - "core-js": "^3.2.1", + "core-js": "^3.6.5", "css-loader": "3.4.2", "file-loader": "4.2.0", "find-cache-dir": "3.0.0", @@ -84,13 +85,12 @@ "rxjs": "^6.5.4", "regenerator-runtime": "0.13.3", "rollup": "1.31.1", - "rollup-plugin-babel": "4.3.3", - "rollup-plugin-copy": "3.3.0", - "rollup-plugin-filesize": "6.2.1", - "rollup-plugin-local-resolve": "1.0.7", - "rollup-plugin-peer-deps-external": "2.2.2", - "rollup-plugin-postcss": "2.1.1", - "rollup-plugin-typescript2": "0.26.0", + "rollup-plugin-copy": "^3.3.0", + "rollup-plugin-filesize": "^9.0.0", + "rollup-plugin-local-resolve": "^1.0.7", + "rollup-plugin-peer-deps-external": "^2.2.2", + "rollup-plugin-postcss": "^3.1.1", + "rollup-plugin-typescript2": "^0.27.1", "sass": "1.22.9", "sass-loader": "8.0.2", "semver": "6.3.0", diff --git a/packages/web/src/builders/package/package.impl.ts b/packages/web/src/builders/package/package.impl.ts index 413cb2b5de..5a694802fd 100644 --- a/packages/web/src/builders/package/package.impl.ts +++ b/packages/web/src/builders/package/package.impl.ts @@ -7,28 +7,22 @@ import { import { JsonObject } from '@angular-devkit/core'; import { from, Observable, of } from 'rxjs'; import { catchError, last, switchMap, tap } from 'rxjs/operators'; -import { runRollup } from './run-rollup'; -import { createBabelConfig as _createBabelConfig } from '../../utils/babel-config'; +import { getBabelInputPlugin } from '@rollup/plugin-babel'; import * as autoprefixer from 'autoprefixer'; import * as rollup from 'rollup'; -import * as babel from 'rollup-plugin-babel'; import * as peerDepsExternal from 'rollup-plugin-peer-deps-external'; import * as postcss from 'rollup-plugin-postcss'; import * as filesize from 'rollup-plugin-filesize'; import * as localResolve from 'rollup-plugin-local-resolve'; -import { PackageBuilderOptions } from '../../utils/types'; -import { - normalizePackageOptions, - NormalizedBundleBuilderOptions, - NormalizedCopyAssetOption, -} from '../../utils/normalize'; import { toClassName } from '@nrwl/workspace/src/utils/name-utils'; +import { NodeJsSyncHost } from '@angular-devkit/core/node'; import { BuildResult } from '@angular-devkit/build-webpack'; import { readJsonFile, writeJsonFile, } from '@nrwl/workspace/src/utils/fileutils'; import { createProjectGraph } from '@nrwl/workspace/src/core/project-graph'; + import { calculateProjectDependencies, checkDependentProjectsHaveBeenBuilt, @@ -36,8 +30,15 @@ import { DependentBuildableProjectNode, updateBuildableProjectPackageJsonDependencies, } from '@nrwl/workspace/src/utils/buildable-libs-utils'; +import { PackageBuilderOptions } from '../../utils/types'; +import { runRollup } from './run-rollup'; +import { + NormalizedBundleBuilderOptions, + NormalizedCopyAssetOption, + normalizePackageOptions, +} from '../../utils/normalize'; import { getSourceRoot } from '../../utils/source-root'; -import { NodeJsSyncHost } from '@angular-devkit/core/node'; +import { createBabelConfig } from '../../utils/babel-config'; // These use require because the ES import isn't correct. const resolve = require('@rollup/plugin-node-resolve'); @@ -88,7 +89,8 @@ export function run( options, dependencies, context, - packageJson + packageJson, + sourceRoot ); if (options.watch) { @@ -155,7 +157,8 @@ function createRollupOptions( options: NormalizedBundleBuilderOptions, dependencies: DependentBuildableProjectNode[], context: BuilderContext, - packageJson: any + packageJson: any, + sourceRoot: string ): rollup.InputOptions { const compilerOptionPaths = computeCompilerOptionsPaths( options.tsConfig, @@ -196,11 +199,20 @@ function createRollupOptions( preferBuiltins: true, extensions: fileExtensions, }), - babel({ - ...createBabelConfig(options, options.projectRoot), + getBabelInputPlugin({ + // TODO(jack): Remove this in Nx 10 + ...legacyCreateBabelConfig(options, options.projectRoot), + + cwd: join(context.workspaceRoot, sourceRoot), + rootMode: 'upward', + babelrc: true, extensions: fileExtensions, - externalHelpers: false, - exclude: 'node_modules/**', + babelHelpers: 'bundled', + exclude: /node_modules/, + plugins: [ + 'babel-plugin-transform-async-to-promises', + ['@babel/plugin-transform-regenerator', { async: false }], + ], }), commonjs(), filesize(), @@ -237,45 +249,46 @@ function createRollupOptions( : rollupConfig; } -function createBabelConfig( +function legacyCreateBabelConfig( options: PackageBuilderOptions, projectRoot: string ) { - let babelConfig: any = _createBabelConfig(projectRoot, false, false); if (options.babelConfig) { + let babelConfig: any = createBabelConfig(projectRoot, false, false); babelConfig = require(options.babelConfig)(babelConfig, options); + // Ensure async functions are transformed to promises properly. + upsert( + 'plugins', + 'babel-plugin-transform-async-to-promises', + null, + babelConfig + ); + upsert( + 'plugins', + '@babel/plugin-transform-regenerator', + { async: false }, + babelConfig + ); + } else { + return {}; } - // Ensure async functions are transformed to promises properly. - upsert( - 'plugins', - 'babel-plugin-transform-async-to-promises', - null, - babelConfig - ); - upsert( - 'plugins', - '@babel/plugin-transform-regenerator', - { async: false }, - babelConfig - ); - return babelConfig; -} -function upsert( - type: 'presets' | 'plugins', - pluginOrPreset: string, - opts: null | JsonObject, - config: any -) { - if ( - !config[type].some( - (p) => - (Array.isArray(p) && p[0].indexOf(pluginOrPreset) !== -1) || - p.indexOf(pluginOrPreset) !== -1 - ) + function upsert( + type: 'presets' | 'plugins', + pluginOrPreset: string, + opts: null | JsonObject, + config: any ) { - const fullPath = require.resolve(pluginOrPreset); - config[type] = config[type].concat([opts ? [fullPath, opts] : fullPath]); + if ( + !config[type].some( + (p) => + (Array.isArray(p) && p[0].indexOf(pluginOrPreset) !== -1) || + p.indexOf(pluginOrPreset) !== -1 + ) + ) { + const fullPath = require.resolve(pluginOrPreset); + config[type] = config[type].concat([opts ? [fullPath, opts] : fullPath]); + } } } diff --git a/packages/web/src/builders/package/schema.json b/packages/web/src/builders/package/schema.json index 2688aee79f..05e418e88f 100644 --- a/packages/web/src/builders/package/schema.json +++ b/packages/web/src/builders/package/schema.json @@ -37,7 +37,7 @@ }, "babelConfig": { "type": "string", - "description": "Path to a function which takes a babel config and returns an updated babel config" + "description": "(deprecated) Path to a function which takes a babel config and returns an updated babel config" }, "umdName": { "type": "string", diff --git a/packages/web/src/schematics/application/files/app/.babelrc__tmpl__ b/packages/web/src/schematics/application/files/app/.babelrc__tmpl__ new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/packages/web/src/schematics/application/files/app/.babelrc__tmpl__ @@ -0,0 +1 @@ +{} diff --git a/packages/web/src/schematics/init/init.spec.ts b/packages/web/src/schematics/init/init.spec.ts index 1ef8a8f0b4..c5145b371d 100644 --- a/packages/web/src/schematics/init/init.spec.ts +++ b/packages/web/src/schematics/init/init.spec.ts @@ -48,6 +48,46 @@ describe('init', () => { }, tree ); - expect(result.exists('jest.config.js')).toEqual(false); + expect(result.exists('jest.config.js')).toBe(false); + }); + + describe('babel config', () => { + it('should create babel config if not present', async () => { + const result = await runSchematic( + 'init', + { + unitTestRunner: 'none', + }, + tree + ); + expect(result.exists('babel.config.json')).toBe(true); + }); + + it('should not overwrite existing babel config', async () => { + tree.create('babel.config.json', '{ "preset": ["preset-awesome"] }'); + + const result = await runSchematic( + 'init', + { + unitTestRunner: 'none', + }, + tree + ); + + const existing = result.read('babel.config.json').toString(); + expect(existing).toMatch('{ "preset": ["preset-awesome"] }'); + }); + + it('should not overwrite existing babel config (.js)', async () => { + tree.create('/babel.config.js', 'module.exports = () => {};'); + const result = await runSchematic( + 'init', + { + unitTestRunner: 'none', + }, + tree + ); + expect(result.exists('babel.config.json')).toBe(false); + }); }); }); diff --git a/packages/web/src/schematics/init/init.ts b/packages/web/src/schematics/init/init.ts index 6e7b5396ad..be5dbaa2f9 100644 --- a/packages/web/src/schematics/init/init.ts +++ b/packages/web/src/schematics/init/init.ts @@ -1,4 +1,4 @@ -import { chain, noop, Rule } from '@angular-devkit/schematics'; +import { chain, noop, Rule, Tree } from '@angular-devkit/schematics'; import { addPackageWithInit, formatFiles, @@ -10,6 +10,7 @@ import { documentRegisterElementVersion, nxVersion, } from '../../utils/versions'; +import { initRootBabelConfig } from '../../utils/rules'; function updateDependencies(): Rule { return updateJsonInTree('package.json', (json) => { @@ -36,6 +37,7 @@ export default function (schema: Schema) { ? addPackageWithInit('@nrwl/cypress') : noop(), updateDependencies(), + initRootBabelConfig(), formatFiles(schema), ]); } diff --git a/packages/web/src/utils/babel-config.ts b/packages/web/src/utils/babel-config.ts index a0eef71a58..7c5d60e13d 100644 --- a/packages/web/src/utils/babel-config.ts +++ b/packages/web/src/utils/babel-config.ts @@ -1,3 +1,5 @@ +/** @deprecated We no longer use this function and will be removed in Nx 10. */ +// TODO(jack): Remove this in Nx 10 export function createBabelConfig( context: string, esm: boolean, diff --git a/packages/web/src/utils/config.spec.ts b/packages/web/src/utils/config.spec.ts index e9a2f4f1ab..b1b4d1496b 100644 --- a/packages/web/src/utils/config.spec.ts +++ b/packages/web/src/utils/config.spec.ts @@ -5,6 +5,7 @@ import { LicenseWebpackPlugin } from 'license-webpack-plugin'; import TsConfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import { ProgressPlugin } from 'webpack'; import { BuildBuilderOptions } from './types'; +import { normalize } from '@angular-devkit/core'; import CircularDependencyPlugin = require('circular-dependency-plugin'); import ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); @@ -19,6 +20,7 @@ describe('getBaseWebpackPartial', () => { tsConfig: 'tsconfig.json', fileReplacements: [], root: '/root', + sourceRoot: normalize('/root/src'), statsJson: false, }; (( @@ -164,12 +166,8 @@ describe('getBaseWebpackPartial', () => { expect( (result.module.rules.find((rule) => rule.loader === 'babel-loader') - .options as any).presets.find( - (p) => p[0].indexOf('@babel/preset-env') !== -1 - )[1] - ).toMatchObject({ - targets: { esmodules: true }, - }); + .options as any).envName + ).toMatch('modern'); }); it('should not override preset-env target for es5', () => { @@ -177,12 +175,8 @@ describe('getBaseWebpackPartial', () => { expect( (result.module.rules.find((rule) => rule.loader === 'babel-loader') - .options as any).presets.find( - (p) => p[0].indexOf('@babel/preset-env') !== -1 - )[1] - ).toMatchObject({ - targets: undefined, - }); + .options as any).envName + ).toMatch('legacy'); }); }); diff --git a/packages/web/src/utils/config.ts b/packages/web/src/utils/config.ts index 0a49037a60..359be891f8 100644 --- a/packages/web/src/utils/config.ts +++ b/packages/web/src/utils/config.ts @@ -1,6 +1,6 @@ import * as webpack from 'webpack'; import { Configuration, ProgressPlugin, Stats } from 'webpack'; -import { dirname, resolve } from 'path'; +import { join, resolve } from 'path'; import { LicenseWebpackPlugin } from 'license-webpack-plugin'; import * as CopyWebpackPlugin from 'copy-webpack-plugin'; import * as TerserWebpackPlugin from 'terser-webpack-plugin'; @@ -8,7 +8,6 @@ import TsConfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import { AssetGlobPattern, BuildBuilderOptions } from './types'; import { getOutputHashFormat } from './hash-format'; -import { createBabelConfig } from './babel-config'; import CircularDependencyPlugin = require('circular-dependency-plugin'); import ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); @@ -52,7 +51,10 @@ export function getBaseWebpackPartial( loader: `babel-loader`, exclude: /node_modules/, options: { - ...createBabelConfig(dirname(options.main), esm, options.verbose), + rootMode: 'upward', + cwd: join(options.root, options.sourceRoot), + envName: esm ? 'modern' : 'legacy', + babelrc: true, cacheDirectory: true, cacheCompression: false, }, @@ -153,7 +155,8 @@ export function createTerserPlugin(esm: boolean, sourceMap: boolean) { cache: true, sourceMap, terserOptions: { - ecma: esm ? 6 : 5, + ecma: esm ? 8 : 5, + // Don't remove safari 10 workaround for ES modules safari10: true, output: { ascii_only: true, diff --git a/packages/web/src/utils/devserver.config.spec.ts b/packages/web/src/utils/devserver.config.spec.ts index 90c7f5c07e..68c926ac8a 100644 --- a/packages/web/src/utils/devserver.config.spec.ts +++ b/packages/web/src/utils/devserver.config.spec.ts @@ -1,12 +1,13 @@ import { getDevServerConfig } from './devserver.config'; import { Logger } from '@angular-devkit/core/src/logger'; -jest.mock('tsconfig-paths-webpack-plugin'); import TsConfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import * as ts from 'typescript'; import * as fs from 'fs'; import { WebBuildBuilderOptions } from '../builders/build/build.impl'; import { WebDevServerOptions } from '../builders/dev-server/dev-server.impl'; import { join } from 'path'; + +jest.mock('tsconfig-paths-webpack-plugin'); import ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); describe('getDevServerConfig', () => { @@ -18,6 +19,8 @@ describe('getDevServerConfig', () => { let sourceRoot: string; beforeEach(() => { + root = join(__dirname, '../../../..'); + sourceRoot = join(root, 'apps/app'); buildInput = { main: 'main.ts', index: 'index.html', @@ -39,9 +42,9 @@ describe('getDevServerConfig', () => { outputPath: 'dist', tsConfig: 'tsconfig.json', fileReplacements: [], + root, + sourceRoot, }; - root = join(__dirname, '../../../..'); - sourceRoot = join(root, 'apps/app'); serveInput = { host: 'localhost', diff --git a/packages/web/src/utils/normalize.ts b/packages/web/src/utils/normalize.ts index f9a4585f05..c6b4176f1b 100644 --- a/packages/web/src/utils/normalize.ts +++ b/packages/web/src/utils/normalize.ts @@ -47,6 +47,8 @@ export function normalizeBuildOptions( ): T { return { ...options, + root, + sourceRoot, main: resolve(root, options.main), outputPath: resolve(root, options.outputPath), tsConfig: resolve(root, options.tsConfig), diff --git a/packages/web/src/utils/rules.ts b/packages/web/src/utils/rules.ts new file mode 100644 index 0000000000..2fbf009568 --- /dev/null +++ b/packages/web/src/utils/rules.ts @@ -0,0 +1,19 @@ +import { Rule, Tree } from '@angular-devkit/schematics'; + +export function initRootBabelConfig(): Rule { + return (host: Tree) => { + if (host.exists('/babel.config.json') || host.exists('/babel.config.js')) + return; + host.create( + '/babel.config.json', + JSON.stringify( + { + presets: ['@nrwl/web/babel'], + babelrcRoots: ['*'], // Make sure .babelrc files other than root can be loaded in a monorepo + }, + null, + 2 + ) + ); + }; +} diff --git a/packages/web/src/utils/types.ts b/packages/web/src/utils/types.ts index 9bbda42550..82f9434468 100644 --- a/packages/web/src/utils/types.ts +++ b/packages/web/src/utils/types.ts @@ -1,5 +1,5 @@ import { FileReplacement } from './normalize'; -import { JsonObject, Path } from '@angular-devkit/core'; +import { JsonObject } from '@angular-devkit/core'; export interface OptimizationOptions { scripts: boolean; @@ -37,7 +37,7 @@ export interface BuildBuilderOptions { webpackConfig?: string; root?: string; - sourceRoot?: Path; + sourceRoot?: string; } export interface Globals { diff --git a/packages/web/src/utils/web.config.spec.ts b/packages/web/src/utils/web.config.spec.ts index fe5c693864..ca48036c8c 100644 --- a/packages/web/src/utils/web.config.spec.ts +++ b/packages/web/src/utils/web.config.spec.ts @@ -1,5 +1,4 @@ import { getWebConfig as getWebPartial } from './web.config'; -jest.mock('tsconfig-paths-webpack-plugin'); import TsConfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; import { createConsoleLogger } from '@angular-devkit/core/node'; import { Logger } from '@angular-devkit/core/src/logger'; @@ -7,6 +6,8 @@ import * as ts from 'typescript'; import { WebBuildBuilderOptions } from '../builders/build/build.impl'; import { join } from 'path'; +jest.mock('tsconfig-paths-webpack-plugin'); + describe('getWebConfig', () => { let input: WebBuildBuilderOptions; let logger: Logger; @@ -15,6 +16,8 @@ describe('getWebConfig', () => { let mockCompilerOptions: any; beforeEach(() => { + root = join(__dirname, '../../../..'); + sourceRoot = join(root, 'apps/app'); input = { main: 'main.ts', index: 'index.html', @@ -36,9 +39,9 @@ describe('getWebConfig', () => { outputPath: 'dist', tsConfig: 'tsconfig.json', fileReplacements: [], + root, + sourceRoot, }; - root = join(__dirname, '../../../..'); - sourceRoot = join(root, 'apps/app'); logger = createConsoleLogger(); mockCompilerOptions = { diff --git a/packages/workspace/src/utils/ast-utils.ts b/packages/workspace/src/utils/ast-utils.ts index f55c35d23e..4b85602987 100644 --- a/packages/workspace/src/utils/ast-utils.ts +++ b/packages/workspace/src/utils/ast-utils.ts @@ -6,16 +6,16 @@ * found in the LICENSE file at https://angular.io/license */ import { - Rule, - Tree, - SchematicContext, - DirEntry, - noop, - chain, - Source, - mergeWith, apply, + chain, + DirEntry, forEach, + mergeWith, + noop, + Rule, + SchematicContext, + Source, + Tree, } from '@angular-devkit/schematics'; import * as ts from 'typescript'; import * as stripJsonComments from 'strip-json-comments'; @@ -395,6 +395,10 @@ export function readJsonInTree(host: Tree, path: string): T { * Method for utilizing the project graph in schematics */ export function getProjectGraphFromHost(host: Tree): ProjectGraph { + return onlyWorkspaceProjects(getFullProjectGraphFromHost(host)); +} + +export function getFullProjectGraphFromHost(host: Tree): ProjectGraph { const workspaceJson = readJsonInTree(host, getWorkspacePath(host)); const nxJson = readJsonInTree(host, '/nx.json'); @@ -425,8 +429,12 @@ export function getProjectGraphFromHost(host: Tree): ProjectGraph { ); }); - return onlyWorkspaceProjects( - createProjectGraph(workspaceJson, nxJson, workspaceFiles, fileRead, false) + return createProjectGraph( + workspaceJson, + nxJson, + workspaceFiles, + fileRead, + false ); } diff --git a/scripts/check-versions.ts b/scripts/check-versions.ts index 74634d81e7..51683d81e7 100644 --- a/scripts/check-versions.ts +++ b/scripts/check-versions.ts @@ -59,8 +59,6 @@ function checkFiles(files: string[]) { r.package )} has new version ${chalk.bold(r.latest)} (current: ${r.prev})` ); - } else { - console.log(`${logContext} ✔️ ${r.package} is update to date`); } }); }); diff --git a/test.ts b/test.ts index b6dfe2eaf6..e7a9e18d17 100644 --- a/test.ts +++ b/test.ts @@ -1,5 +1,5 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files -import 'core-js/es7/reflect'; +import 'core-js/proposals/reflect-metadata'; import 'zone.js/dist/zone'; import 'zone.js/dist/zone-testing'; diff --git a/yarn.lock b/yarn.lock index 69ff2552e8..f2a524ddc0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -289,15 +289,6 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/compat-data@^7.8.4": - version "7.8.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.5.tgz#d28ce872778c23551cbb9432fc68d28495b613b9" - integrity sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg== - dependencies: - browserslist "^4.8.5" - invariant "^2.2.4" - semver "^5.5.0" - "@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" @@ -307,6 +298,15 @@ invariant "^2.2.4" semver "^5.5.0" +"@babel/compat-data@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b" + integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g== + dependencies: + browserslist "^4.11.1" + invariant "^2.2.4" + semver "^5.5.0" + "@babel/core@7.7.2": version "7.7.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.2.tgz#ea5b99693bcfc058116f42fa1dd54da412b29d91" @@ -327,27 +327,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e" - integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" - "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.4" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - "@babel/core@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" @@ -370,6 +349,28 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" + integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.6" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.6" + "@babel/parser" "^7.9.6" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/core@^7.0.1", "@babel/core@^7.1.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.0.tgz#9b00f73554edd67bebc86df8303ef678be3d7b48" @@ -482,16 +483,6 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e" - integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA== - dependencies: - "@babel/types" "^7.8.3" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - "@babel/generator@^7.9.0": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" @@ -502,6 +493,16 @@ lodash "^4.17.13" source-map "^0.5.0" +"@babel/generator@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" + integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== + dependencies: + "@babel/types" "^7.9.6" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -539,6 +540,15 @@ "@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-builder-react-jsx-experimental@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz#0b4b3e04e6123f03b404ca4dfd6528fe6bb92fe3" + integrity sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-module-imports" "^7.8.3" + "@babel/types" "^7.9.5" + "@babel/helper-builder-react-jsx@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.4.tgz#da188d247508b65375b2c30cf59de187be6b0c66" @@ -547,13 +557,13 @@ "@babel/types" "^7.7.4" esutils "^2.0.0" -"@babel/helper-builder-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6" - integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ== +"@babel/helper-builder-react-jsx@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" + integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== dependencies: - "@babel/types" "^7.8.3" - esutils "^2.0.0" + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/types" "^7.9.0" "@babel/helper-call-delegate@^7.4.4": version "7.4.4" @@ -564,26 +574,6 @@ "@babel/traverse" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/helper-call-delegate@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692" - integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-compilation-targets@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz#03d7ecd454b7ebe19a254f76617e61770aed2c88" - integrity sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg== - dependencies: - "@babel/compat-data" "^7.8.4" - browserslist "^4.8.5" - invariant "^2.2.4" - levenary "^1.1.1" - semver "^5.5.0" - "@babel/helper-compilation-targets@^7.8.7": version "7.8.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" @@ -595,6 +585,17 @@ levenary "^1.1.1" semver "^5.5.0" +"@babel/helper-compilation-targets@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a" + integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw== + dependencies: + "@babel/compat-data" "^7.9.6" + browserslist "^4.11.1" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + "@babel/helper-create-class-features-plugin@^7.7.0", "@babel/helper-create-class-features-plugin@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz#fce60939fd50618610942320a8d951b3b639da2d" @@ -619,6 +620,18 @@ "@babel/helper-replace-supers" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" +"@babel/helper-create-class-features-plugin@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz#965c8b0a9f051801fd9d3b372ca0ccf200a90897" + integrity sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow== + dependencies: + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.9.6" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/helper-create-regexp-features-plugin@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59" @@ -696,6 +709,15 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.9.5" + "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" @@ -816,18 +838,6 @@ "@babel/types" "^7.7.4" lodash "^4.17.13" -"@babel/helper-module-transforms@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590" - integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" - "@babel/helper-module-transforms@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" @@ -959,6 +969,16 @@ "@babel/traverse" "^7.8.6" "@babel/types" "^7.8.6" +"@babel/helper-replace-supers@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444" + integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" + "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" @@ -1009,6 +1029,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== +"@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -1075,15 +1100,6 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" - "@babel/helpers@^7.9.0": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" @@ -1093,6 +1109,15 @@ "@babel/traverse" "^7.9.0" "@babel/types" "^7.9.0" +"@babel/helpers@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580" + integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" + "@babel/highlight@^7.0.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" @@ -1136,16 +1161,16 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081" integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ== -"@babel/parser@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8" - integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw== - "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== +"@babel/parser@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" + integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -1278,14 +1303,6 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.7.4" -"@babel/plugin-proposal-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" - integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-proposal-object-rest-spread@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" @@ -1294,6 +1311,15 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" +"@babel/plugin-proposal-object-rest-spread@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63" + integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/plugin-proposal-optional-catch-binding@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" @@ -1318,14 +1344,6 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.7.4" -"@babel/plugin-proposal-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" - integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-proposal-optional-chaining@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" @@ -1646,20 +1664,6 @@ "@babel/helper-split-export-declaration" "^7.7.4" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8" - integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - globals "^11.1.0" - "@babel/plugin-transform-classes@^7.9.0": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" @@ -1674,6 +1678,20 @@ "@babel/helper-split-export-declaration" "^7.8.3" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" + integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" @@ -1702,6 +1720,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-transform-destructuring@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" + integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" @@ -1781,13 +1806,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-for-of@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz#6fe8eae5d6875086ee185dd0b098a8513783b47d" - integrity sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-for-of@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" @@ -1856,15 +1874,6 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-amd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" - integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== - dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" - "@babel/plugin-transform-modules-amd@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" @@ -1874,6 +1883,15 @@ "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-amd@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e" + integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-commonjs@7.7.0": version "7.7.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz#3e5ffb4fd8c947feede69cbe24c9554ab4113fe3" @@ -1904,16 +1922,6 @@ "@babel/helper-simple-access" "^7.7.4" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" - integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== - dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" - "@babel/plugin-transform-modules-commonjs@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" @@ -1924,6 +1932,16 @@ "@babel/helper-simple-access" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-commonjs@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277" + integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-systemjs@^7.5.0", "@babel/plugin-transform-modules-systemjs@^7.7.0": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30" @@ -1933,16 +1951,6 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" - integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" - "@babel/plugin-transform-modules-systemjs@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" @@ -1953,6 +1961,16 @@ "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-systemjs@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4" + integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-umd@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" @@ -1969,14 +1987,6 @@ "@babel/helper-module-transforms" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-umd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" - integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== - dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-modules-umd@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" @@ -2052,15 +2062,6 @@ "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-parameters@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz#1d5155de0b65db0ccf9971165745d3bb990d77d3" - integrity sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA== - dependencies: - "@babel/helper-call-delegate" "^7.8.3" - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-parameters@^7.8.7": version "7.9.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" @@ -2069,6 +2070,14 @@ "@babel/helper-get-function-arity" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-transform-parameters@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" + integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-property-literals@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" @@ -2121,6 +2130,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-transform-react-jsx-development@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" + integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== + dependencies: + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/plugin-transform-react-jsx-self@^7.0.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" @@ -2129,10 +2147,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.2.0" -"@babel/plugin-transform-react-jsx-self@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz#c4f178b2aa588ecfa8d077ea80d4194ee77ed702" - integrity sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg== +"@babel/plugin-transform-react-jsx-self@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" + integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" @@ -2145,10 +2163,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.2.0" -"@babel/plugin-transform-react-jsx-source@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz#951e75a8af47f9f120db731be095d2b2c34920e0" - integrity sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag== +"@babel/plugin-transform-react-jsx-source@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" + integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" @@ -2162,21 +2180,22 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.7.4" -"@babel/plugin-transform-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a" - integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g== +"@babel/plugin-transform-react-jsx@^7.9.4": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f" + integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw== dependencies: - "@babel/helper-builder-react-jsx" "^7.8.3" + "@babel/helper-builder-react-jsx" "^7.9.0" + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-regenerator@7.8.3", "@babel/plugin-transform-regenerator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8" - integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA== +"@babel/plugin-transform-regenerator@7.8.7", "@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== dependencies: - regenerator-transform "^0.14.0" + regenerator-transform "^0.14.2" "@babel/plugin-transform-regenerator@^7.4.5": version "7.4.5" @@ -2192,13 +2211,6 @@ dependencies: regenerator-transform "^0.14.0" -"@babel/plugin-transform-regenerator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" - integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== - dependencies: - regenerator-transform "^0.14.2" - "@babel/plugin-transform-reserved-words@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" @@ -2313,12 +2325,12 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.7.4" -"@babel/plugin-transform-typescript@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz#be6f01a7ef423be68e65ace1f04fc407e6d88917" - integrity sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ== +"@babel/plugin-transform-typescript@^7.9.0": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.6.tgz#2248971416a506fc78278fc0c0ea3179224af1e9" + integrity sha512-8OvsRdvpt3Iesf2qsAn+YdlwAJD7zJ+vhFZmDCa4b8dTp7MmHtKk5FF2mCsGxjZwuwsy/yIIay/nLmxST1ctVQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.9.6" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-typescript" "^7.8.3" @@ -2413,69 +2425,6 @@ js-levenshtein "^1.1.3" semver "^5.5.0" -"@babel/preset-env@7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.4.tgz#9dac6df5f423015d3d49b6e9e5fa3413e4a72c4e" - integrity sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w== - dependencies: - "@babel/compat-data" "^7.8.4" - "@babel/helper-compilation-targets" "^7.8.4" - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-async-generator-functions" "^7.8.3" - "@babel/plugin-proposal-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-json-strings" "^7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.8.3" - "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.8.3" - "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.8.3" - "@babel/plugin-transform-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.8.3" - "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" - "@babel/plugin-transform-dotall-regex" "^7.8.3" - "@babel/plugin-transform-duplicate-keys" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.8.4" - "@babel/plugin-transform-function-name" "^7.8.3" - "@babel/plugin-transform-literals" "^7.8.3" - "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.8.3" - "@babel/plugin-transform-modules-commonjs" "^7.8.3" - "@babel/plugin-transform-modules-systemjs" "^7.8.3" - "@babel/plugin-transform-modules-umd" "^7.8.3" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.8.3" - "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.4" - "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.3" - "@babel/plugin-transform-reserved-words" "^7.8.3" - "@babel/plugin-transform-shorthand-properties" "^7.8.3" - "@babel/plugin-transform-spread" "^7.8.3" - "@babel/plugin-transform-sticky-regex" "^7.8.3" - "@babel/plugin-transform-template-literals" "^7.8.3" - "@babel/plugin-transform-typeof-symbol" "^7.8.4" - "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/types" "^7.8.3" - browserslist "^4.8.5" - core-js-compat "^3.6.2" - invariant "^2.2.2" - levenary "^1.1.1" - semver "^5.5.0" - "@babel/preset-env@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" @@ -2542,6 +2491,72 @@ levenary "^1.1.1" semver "^5.5.0" +"@babel/preset-env@7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6" + integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ== + dependencies: + "@babel/compat-data" "^7.9.6" + "@babel/helper-compilation-targets" "^7.9.6" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.6" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.5" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.9.5" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.9.0" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.6" + "@babel/plugin-transform-modules-commonjs" "^7.9.6" + "@babel/plugin-transform-modules-systemjs" "^7.9.6" + "@babel/plugin-transform-modules-umd" "^7.9.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.6" + browserslist "^4.11.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + "@babel/preset-env@^7.0.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.0.tgz#aae4141c506100bb2bfaa4ac2a5c12b395619e50" @@ -2695,16 +2710,17 @@ "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" -"@babel/preset-react@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.8.3.tgz#23dc63f1b5b0751283e04252e78cf1d6589273d2" - integrity sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ== +"@babel/preset-react@7.9.4": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d" + integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-react-display-name" "^7.8.3" - "@babel/plugin-transform-react-jsx" "^7.8.3" - "@babel/plugin-transform-react-jsx-self" "^7.8.3" - "@babel/plugin-transform-react-jsx-source" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.9.4" + "@babel/plugin-transform-react-jsx-development" "^7.9.0" + "@babel/plugin-transform-react-jsx-self" "^7.9.0" + "@babel/plugin-transform-react-jsx-source" "^7.9.0" "@babel/preset-react@^7.0.0": version "7.6.3" @@ -2725,13 +2741,13 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-typescript" "^7.7.2" -"@babel/preset-typescript@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz#90af8690121beecd9a75d0cc26c6be39d1595d13" - integrity sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA== +"@babel/preset-typescript@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" + integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== dependencies: "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-typescript" "^7.8.3" + "@babel/plugin-transform-typescript" "^7.9.0" "@babel/runtime@7.3.4": version "7.3.4" @@ -2885,21 +2901,6 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/traverse@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c" - integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.4" - "@babel/types" "^7.8.3" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" @@ -2915,6 +2916,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" + integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.6" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@7.7.4", "@babel/types@^7.7.1", "@babel/types@^7.7.2", "@babel/types@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" @@ -2960,6 +2976,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.9.5", "@babel/types@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" + integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== + dependencies: + "@babel/helper-validator-identifier" "^7.9.5" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@bazel/bazel-darwin_x64@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@bazel/bazel-darwin_x64/-/bazel-darwin_x64-1.2.0.tgz#e29840c263e0ebb9286bec9fa285907c9161f890" @@ -3772,6 +3797,14 @@ redux-thunk "^2.3.0" reselect "^4.0.0" +"@rollup/plugin-babel@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.0.2.tgz#d9351b9545b0c586a193fc99830d4b1a25317ed5" + integrity sha512-GiL7jL+FGppzQ1Sn4y2ER4UYXlgXFFEt+sHm4WJEzQwI76Yf9oy2QDqIvcon6xApZWlik3L8fezRGC6Mj2vRXg== + dependencies: + "@babel/helper-module-imports" "^7.7.4" + "@rollup/pluginutils" "^3.0.8" + "@rollup/plugin-commonjs@11.0.2", "@rollup/plugin-commonjs@^11.0.2": version "11.0.2" resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz#837cc6950752327cb90177b608f0928a4e60b582" @@ -3816,6 +3849,15 @@ dependencies: estree-walker "^1.0.1" +"@rollup/pluginutils@^3.0.8": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.0.10.tgz#a659b9025920378494cd8f8c59fbf9b3a50d5f12" + integrity sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@samverschueren%2fstream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" @@ -6233,6 +6275,17 @@ babel-loader@8.0.6, babel-loader@^8.0.2: mkdirp "^0.5.1" pify "^4.0.1" +babel-loader@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" @@ -6252,10 +6305,10 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-const-enum@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/babel-plugin-const-enum/-/babel-plugin-const-enum-0.0.5.tgz#1e807d52572bb193a0df60130ed06b07a59b04b3" - integrity sha512-EAOnmHcsn+hbMS1yYZoc0jBemNbRR+NATO9RrLJF/1iXJbDTEaOwH0Y7XPb7vvWc5C/nHp7v8WhAsHW7UjxYQA== +babel-plugin-const-enum@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-const-enum/-/babel-plugin-const-enum-1.0.1.tgz#0d742faf9731be4f213c4d01d61fc4e93c44d159" + integrity sha512-6oGu63g1FS9psUPQyLCJM08ty6kGihGKTbzWGbAKHfUuCzCh7y9twh516cR6v0lM4d4NOoR+DgLb7uKVytyp6Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.3.3" @@ -6267,6 +6320,13 @@ babel-plugin-dynamic-import-node@^2.3.0: dependencies: object.assign "^4.1.0" +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + babel-plugin-emotion@^10.0.20, babel-plugin-emotion@^10.0.27: version "10.0.27" resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.27.tgz#59001cf5de847c1d61f2079cd906a90a00d3184f" @@ -6340,7 +6400,7 @@ babel-plugin-jest-hoist@^25.2.1: dependencies: "@types/babel__traverse" "^7.0.6" -babel-plugin-macros@2.6.1, babel-plugin-macros@^2.0.0: +babel-plugin-macros@^2.0.0: version "2.6.1" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" integrity sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ== @@ -6349,7 +6409,7 @@ babel-plugin-macros@2.6.1, babel-plugin-macros@^2.0.0: cosmiconfig "^5.2.0" resolve "^1.10.0" -babel-plugin-macros@^2.7.0: +babel-plugin-macros@^2.7.0, babel-plugin-macros@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== @@ -6497,7 +6557,7 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-syntax-async-functions "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-async-to-promises@0.8.15: +babel-plugin-transform-async-to-promises@^0.8.15: version "0.8.15" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-promises/-/babel-plugin-transform-async-to-promises-0.8.15.tgz#13b6d8ef13676b4e3c576d3600b85344bb1ba346" integrity sha512-fDXP68ZqcinZO2WCiimCL9zhGjGXOnn3D33zvbh+yheZ/qOrNVVDDIBtAaM3Faz8TRvQzHiRKsu3hfrBAhEncQ== @@ -7263,7 +7323,7 @@ browserslist@4.8.3, browserslist@^4.8.3: electron-to-chromium "^1.3.322" node-releases "^1.1.44" -browserslist@4.8.7, browserslist@^4.8.5: +browserslist@4.8.7: version "4.8.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.7.tgz#ec8301ff415e6a42c949d0e66b405eb539c532d0" integrity sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA== @@ -7299,6 +7359,16 @@ browserslist@^4.11.0, browserslist@^4.7.0: node-releases "^1.1.53" pkg-up "^2.0.0" +browserslist@^4.11.1: + version "4.12.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" + integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== + dependencies: + caniuse-lite "^1.0.30001043" + electron-to-chromium "^1.3.413" + node-releases "^1.1.53" + pkg-up "^2.0.0" + browserslist@^4.6.4, browserslist@^4.8.0: version "4.8.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.2.tgz#b45720ad5fbc8713b7253c20766f701c9a694289" @@ -7743,6 +7813,11 @@ caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.300010 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz#44da3cbca2ab6cb6aa83d1be5d324e17f141caff" integrity sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ== +caniuse-lite@^1.0.30001043: + version "1.0.30001062" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001062.tgz#d814b648338504b315222ace6f1a533d9a55e390" + integrity sha512-ei9ZqeOnN7edDrb24QfJ0OZicpEbsWxv7WusOiQGz/f2SfvBgHHbOEwBJ8HKGVSyx8Z6ndPjxzR6m0NQq+0bfw== + canonical-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" @@ -8863,7 +8938,7 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.9: +core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0: version "2.6.9" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== @@ -8873,6 +8948,11 @@ core-js@^3.0.1, core-js@^3.0.4: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== +core-js@^3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -10257,6 +10337,11 @@ electron-to-chromium@^1.3.390: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.391.tgz#9b7ee2f387814ad7d37addaafe41c8f4c4498d24" integrity sha512-WOi6loSnDmfICOqGRrgeK7bZeWDAbGjCptDhI5eyJAqSzWfoeRuOOU1rOTZRL29/9AaxTndZB6Uh8YrxRfZJqw== +electron-to-chromium@^1.3.413: + version "1.3.446" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.446.tgz#12c336bc858e04d6b614a488f32f2dd89561601f" + integrity sha512-CLQaFuvkKqR9FD2G3cJrr1fV7DRMXiAKWLP2F8cxtvvtzAS7Tubt0kF47/m+uE61kiT+I7ZEn7HqLnmWdOhmuA== + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -16314,6 +16399,13 @@ mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0. dependencies: minimist "0.0.8" +mkdirp@^0.5.3: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + mkdirp@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.3.tgz#4cf2e30ad45959dddea53ad97d518b6c8205e1ea" @@ -17808,7 +17900,7 @@ picomatch@^2.0.4, picomatch@^2.0.5: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== -picomatch@^2.0.7: +picomatch@^2.0.7, picomatch@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -20354,14 +20446,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rollup-plugin-babel@4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.3.3.tgz#7eb5ac16d9b5831c3fd5d97e8df77ba25c72a2aa" - integrity sha512-tKzWOCmIJD/6aKNz0H1GMM+lW1q9KyFubbWzGiOG540zxPPifnEAHTZwjo0g991Y+DyOZcLqBgqOdqazYE5fkw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - rollup-pluginutils "^2.8.1" - rollup-plugin-copy@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/rollup-plugin-copy/-/rollup-plugin-copy-3.3.0.tgz#5ba230047f86b9f703a29288f242948a5580e7b9" @@ -20435,7 +20519,7 @@ rollup-plugin-typescript2@0.26.0: rollup-pluginutils "2.8.2" tslib "1.10.0" -rollup-pluginutils@2.8.2, rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.8.1: +rollup-pluginutils@2.8.2, rollup-pluginutils@^2.0.1: version "2.8.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==