diff --git a/docs/api-react/schematics/application.md b/docs/api-react/schematics/application.md index 6afa5d74cf..85d4b27846 100644 --- a/docs/api-react/schematics/application.md +++ b/docs/api-react/schematics/application.md @@ -11,6 +11,14 @@ ng generate application ... ## Options +### babel + +Default: `false` + +Type: `boolean` + +Use Babel and TypeScript preset instead of ts-loader (Useful if you need Babel plugins) + ### classComponent Default: `false` @@ -53,7 +61,7 @@ Default: `false` Type: `boolean` -Use pascal case component file name (e.g. App.tsx)® +Use pascal case component file name (e.g. App.tsx) ### routing diff --git a/e2e/react.test.ts b/e2e/react.test.ts index 159f1b8805..1adf54cf60 100644 --- a/e2e/react.test.ts +++ b/e2e/react.test.ts @@ -21,7 +21,7 @@ forEachCli(() => { const appName = uniq('app'); const libName = uniq('lib'); - runCLI(`generate @nrwl/react:app ${appName} --no-interactive`); + runCLI(`generate @nrwl/react:app ${appName} --no-interactive --babel`); runCLI(`generate @nrwl/react:lib ${libName} --no-interactive`); const mainPath = `apps/${appName}/src/main.tsx`; @@ -30,16 +30,18 @@ forEachCli(() => { const libTestResults = await runCLIAsync(`test ${libName}`); expect(libTestResults.stderr).toContain('Test Suites: 1 passed, 1 total'); - await testGeneratedApp(appName); + await testGeneratedApp(appName, { checkStyles: true }); }, 120000); it('should generate app with routing', async () => { ensureProject(); const appName = uniq('app'); - runCLI(`generate @nrwl/react:app ${appName} --routing --no-interactive`); + runCLI( + `generate @nrwl/react:app ${appName} --routing --no-interactive --babel` + ); - await testGeneratedApp(appName); + await testGeneratedApp(appName, { checkStyles: true }); }, 120000); it('should generate app with styled-components', async () => { @@ -47,10 +49,10 @@ forEachCli(() => { const appName = uniq('app'); runCLI( - `generate @nrwl/react:app ${appName} --style styled-components --no-interactive` + `generate @nrwl/react:app ${appName} --style styled-components --no-interactive --babel` ); - await testGeneratedApp(appName, false); + await testGeneratedApp(appName, { checkStyles: false }); }, 120000); it('should be able to use JSX', async () => { @@ -58,7 +60,7 @@ forEachCli(() => { const appName = uniq('app'); const libName = uniq('lib'); - runCLI(`generate @nrwl/react:app ${appName} --no-interactive`); + runCLI(`generate @nrwl/react:app ${appName} --no-interactive --babel`); runCLI(`generate @nrwl/react:lib ${libName} --no-interactive`); renameFile( @@ -90,49 +92,36 @@ forEachCli(() => { const mainPath = `apps/${appName}/src/main.jsx`; updateFile(mainPath, `import '@proj/${libName}';\n` + readFile(mainPath)); - await testGeneratedApp(appName); + await testGeneratedApp(appName, { checkStyles: true }); }, 30000); - async function testGeneratedApp(appName, styles = true) { + async function testGeneratedApp(appName, opts: { checkStyles: boolean }) { const lintResults = runCLI(`lint ${appName}`); expect(lintResults).toContain('All files pass linting.'); runCLI(`build ${appName}`); let filesToCheck = [ `dist/apps/${appName}/index.html`, - `dist/apps/${appName}/polyfills-es2015.js`, - `dist/apps/${appName}/runtime-es2015.js`, - `dist/apps/${appName}/vendor-es2015.js`, - `dist/apps/${appName}/main-es2015.js`, - `dist/apps/${appName}/polyfills-es5.js`, - `dist/apps/${appName}/runtime-es5.js`, - `dist/apps/${appName}/vendor-es5.js`, - `dist/apps/${appName}/main-es5.js` + `dist/apps/${appName}/polyfills.js`, + `dist/apps/${appName}/runtime.js`, + `dist/apps/${appName}/vendor.js`, + `dist/apps/${appName}/main.js` ]; - if (styles) { - filesToCheck.push( - `dist/apps/${appName}/styles-es2015.js`, - `dist/apps/${appName}/styles-es5.js` - ); + if (opts.checkStyles) { + filesToCheck.push(`dist/apps/${appName}/styles.js`); } checkFilesExist(...filesToCheck); - expect(readFile(`dist/apps/${appName}/main-es5.js`)).toContain( - 'var App = function () {' - ); - expect(readFile(`dist/apps/${appName}/main-es2015.js`)).toContain( - 'const App = () => {' + expect(readFile(`dist/apps/${appName}/main.js`)).toContain( + 'var App = function App() {' ); runCLI(`build ${appName} --prod --output-hashing none`); filesToCheck = [ `dist/apps/${appName}/index.html`, - `dist/apps/${appName}/polyfills-es2015.js`, - `dist/apps/${appName}/runtime-es2015.js`, - `dist/apps/${appName}/main-es2015.js`, - `dist/apps/${appName}/polyfills-es5.js`, - `dist/apps/${appName}/runtime-es5.js`, - `dist/apps/${appName}/main-es5.js` + `dist/apps/${appName}/polyfills.js`, + `dist/apps/${appName}/runtime.js`, + `dist/apps/${appName}/main.js` ]; - if (styles) { + if (opts.checkStyles) { filesToCheck.push(`dist/apps/${appName}/styles.css`); } checkFilesExist(...filesToCheck); diff --git a/e2e/utils.ts b/e2e/utils.ts index b21b1e339d..5b782e0345 100644 --- a/e2e/utils.ts +++ b/e2e/utils.ts @@ -182,6 +182,15 @@ export function copyMissingPackages(): void { '@types/react-dom', '@testing-library', + // For testing webpack config with babel-loader + '@babel/core', + '@babel/preset-env', + '@babel/preset-react', + '@babel/preset-typescript', + '@babel/plugin-proposal-decorators', + 'babel-loader', + 'babel-plugin-macros', + 'document-register-element' ]; modulesToCopy.forEach(m => copyNodeModule(m)); diff --git a/package.json b/package.json index d9aaaa50df..9f2ce6e048 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,11 @@ "@angular/platform-browser-dynamic": "^8.0.0", "@angular/router": "^8.0.0", "@angular/upgrade": "^8.0.0", + "@babel/core": "7.5.5", + "@babel/plugin-proposal-decorators": "7.4.4", + "@babel/preset-env": "7.5.5", + "@babel/preset-react": "7.0.0", + "@babel/preset-typescript": "7.3.3", "@cypress/webpack-preprocessor": "^4.1.0", "@nestjs/common": "^6.2.4", "@nestjs/core": "^6.2.4", @@ -63,6 +68,8 @@ "@types/yargs": "^11.0.0", "angular": "1.6.6", "app-root-path": "^2.0.1", + "babel-loader": "8.0.6", + "babel-plugin-macros": "2.6.1", "circular-dependency-plugin": "^5.0.2", "codelyzer": "~5.0.1", "commitizen": "^2.10.1", diff --git a/packages/react/plugins/babel.ts b/packages/react/plugins/babel.ts new file mode 100644 index 0000000000..dce1c29a1a --- /dev/null +++ b/packages/react/plugins/babel.ts @@ -0,0 +1 @@ +module.exports = require('../src/plugins/babel').getBabelWebpackConfig; diff --git a/packages/react/src/migrations/update-8-3-0/update-8-3-0.spec.ts b/packages/react/src/migrations/update-8-3-0/update-8-3-0.spec.ts index 7b60b9f694..997abba403 100644 --- a/packages/react/src/migrations/update-8-3-0/update-8-3-0.spec.ts +++ b/packages/react/src/migrations/update-8-3-0/update-8-3-0.spec.ts @@ -90,7 +90,7 @@ describe('Update 8-0-0', () => { devDependencies: { '@testing-library/react': '8.0.5', '@types/react': '16.8.23', - '@types/react-dom': '16.8.23', + '@types/react-dom': '16.8.5', '@types/styled-components': '4.1.18' } }) diff --git a/packages/react/src/migrations/update-8-3-0/update-8-3-0.ts b/packages/react/src/migrations/update-8-3-0/update-8-3-0.ts index a58b4c3863..4c53e9de18 100644 --- a/packages/react/src/migrations/update-8-3-0/update-8-3-0.ts +++ b/packages/react/src/migrations/update-8-3-0/update-8-3-0.ts @@ -64,7 +64,7 @@ function updateDependencies(tree: Tree) { 'react-dom': '16.8.6', 'react-router-dom': '5.0.1', '@types/react': '16.8.23', - '@types/react-dom': '16.8.23', + '@types/react-dom': '16.8.5', 'styled-components': '4.3.2', '@types/styled-components': '4.1.18', '@emotion/styled': '10.0.14' diff --git a/packages/react/src/plugins/babel.ts b/packages/react/src/plugins/babel.ts new file mode 100644 index 0000000000..58e2c78685 --- /dev/null +++ b/packages/react/src/plugins/babel.ts @@ -0,0 +1,38 @@ +import { Configuration } from 'webpack'; + +export function getBabelWebpackConfig(config: Configuration) { + const idx = config.module.rules.findIndex(r => r.loader === 'ts-loader'); + + config.module.rules.splice(idx, 1, { + use: { + loader: 'babel-loader', + options: { + presets: [ + [ + require('@babel/preset-env').default, + { + modules: false, + // Exclude transforms that make all code slower + exclude: ['transform-typeof-symbol'] + } + ], + [ + require('@babel/preset-react').default, + { + useBuiltIns: true + } + ], + [require('@babel/preset-typescript').default] + ], + plugins: [ + require('babel-plugin-macros'), + [require('@babel/plugin-proposal-decorators').default, false] + ] + } + }, + test: /\.tsx?|jsx?$/, + exclude: /node_modules/ + }); + + return config; +} diff --git a/packages/react/src/schematics/application/application.spec.ts b/packages/react/src/schematics/application/application.spec.ts index 1606ff6b1c..c9cbb750a9 100644 --- a/packages/react/src/schematics/application/application.spec.ts +++ b/packages/react/src/schematics/application/application.spec.ts @@ -229,6 +229,7 @@ describe('app', () => { const architectConfig = workspaceJson.projects['my-app'].architect; expect(architectConfig.build.builder).toEqual('@nrwl/web:build'); expect(architectConfig.build.options).toEqual({ + differentialLoading: true, assets: ['apps/my-app/src/favicon.ico', 'apps/my-app/src/assets'], index: 'apps/my-app/src/index.html', main: 'apps/my-app/src/main.tsx', @@ -466,4 +467,20 @@ describe('app', () => { expect(componentSource).toMatch(/ { + it('should adds custom webpack config', async () => { + const tree = await runSchematic( + 'app', + { name: 'myApp', babel: true }, + appTree + ); + + const workspaceJson = readJsonInTree(tree, '/workspace.json'); + + expect( + workspaceJson.projects['my-app'].architect.build.options.webpackConfig + ).toEqual('@nrwl/react/plugins/babel'); + }); + }); }); diff --git a/packages/react/src/schematics/application/application.ts b/packages/react/src/schematics/application/application.ts index bc3c6578ce..dc8702a784 100644 --- a/packages/react/src/schematics/application/application.ts +++ b/packages/react/src/schematics/application/application.ts @@ -33,7 +33,16 @@ import * as ts from 'typescript'; import { Schema } from './schema'; import { CSS_IN_JS_DEPENDENCIES } from '../../utils/styled'; import { addRouter } from '../../utils/ast-utils'; -import { reactRouterVersion } from '../../utils/versions'; +import { + babelCoreVersion, + babelLoaderVersion, + babelPluginDecoratorsVersion, + babelPluginMacrosVersion, + babelPresetEnvVersion, + babelPresetReactVersion, + babelPresetTypeScriptVersion, + reactRouterVersion +} from '../../utils/versions'; interface NormalizedSchema extends Schema { projectName: string; @@ -75,6 +84,7 @@ export default function(schema: Schema): Rule { : noop(), addStyledModuleDependencies(options), addRouting(options), + addBabel(options), formatFiles(options) ]); }; @@ -114,6 +124,7 @@ function addProject(options: NormalizedSchema): Rule { architect.build = { builder: '@nrwl/web:build', options: { + differentialLoading: !options.babel, // Using babel-loader will not work with differential loading for now outputPath: join(normalize('dist'), options.appProjectRoot), index: join(options.appProjectRoot, 'src/index.html'), main: join(options.appProjectRoot, `src/main.tsx`), @@ -126,7 +137,8 @@ function addProject(options: NormalizedSchema): Rule { styles: options.styledModule ? [] : [join(options.appProjectRoot, `src/styles.${options.style}`)], - scripts: [] + scripts: [], + webpackConfig: options.babel ? '@nrwl/react/plugins/babel' : undefined }, configurations: { production: { @@ -226,6 +238,23 @@ function addRouting(options: NormalizedSchema): Rule { : noop(); } +function addBabel(options: NormalizedSchema): Rule { + return options.babel + ? addDepsToPackageJson( + {}, + { + '@babel/core': babelCoreVersion, + '@babel/preset-env': babelPresetEnvVersion, + '@babel/preset-react': babelPresetReactVersion, + '@babel/preset-typescript': babelPresetTypeScriptVersion, + '@babel/plugin-proposal-decorators': babelPluginDecoratorsVersion, + 'babel-loader': babelLoaderVersion, + 'babel-plugin-macros': babelPluginMacrosVersion + } + ) + : noop(); +} + function normalizeOptions(host: Tree, options: Schema): NormalizedSchema { const appDirectory = options.directory ? `${toFileName(options.directory)}/${toFileName(options.name)}` diff --git a/packages/react/src/schematics/application/schema.d.ts b/packages/react/src/schematics/application/schema.d.ts index 94e61b6bda..dabc4e8d64 100644 --- a/packages/react/src/schematics/application/schema.d.ts +++ b/packages/react/src/schematics/application/schema.d.ts @@ -10,4 +10,5 @@ export interface Schema { pascalCaseFiles?: boolean; classComponent?: boolean; routing?: boolean; + babel?: boolean; } diff --git a/packages/react/src/schematics/application/schema.json b/packages/react/src/schematics/application/schema.json index e4e0c5c074..f8e7f53f4c 100644 --- a/packages/react/src/schematics/application/schema.json +++ b/packages/react/src/schematics/application/schema.json @@ -84,13 +84,18 @@ }, "pascalCaseFiles": { "type": "boolean", - "description": "Use pascal case component file name (e.g. App.tsx)®", + "description": "Use pascal case component file name (e.g. App.tsx)", "default": false }, "classComponent": { "type": "boolean", "description": "Use class components instead of functional component", "default": false + }, + "babel": { + "type": "boolean", + "description": "Use Babel and TypeScript preset instead of ts-loader (Useful if you need Babel plugins)", + "default": false } }, "required": [] diff --git a/packages/react/src/schematics/ng-add/ng-add.spec.ts b/packages/react/src/schematics/ng-add/ng-add.spec.ts index 9d83c40cd5..68e4d1c750 100644 --- a/packages/react/src/schematics/ng-add/ng-add.spec.ts +++ b/packages/react/src/schematics/ng-add/ng-add.spec.ts @@ -29,6 +29,9 @@ describe('ng-add', () => { const result = await runSchematic('ng-add', {}, tree); const workspaceJson = readJsonInTree(result, 'workspace.json'); expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/react'); + expect(workspaceJson.schematics['@nrwl/react:application'].babel).toBe( + true + ); }); it('should be set if @nrwl/workspace was set before', async () => { @@ -45,6 +48,9 @@ describe('ng-add', () => { const result = await runSchematic('ng-add', {}, tree); const workspaceJson = readJsonInTree(result, 'workspace.json'); expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/react'); + expect(workspaceJson.schematics['@nrwl/react:application'].babel).toBe( + true + ); }); it('should not be set if something else was set before', async () => { @@ -54,6 +60,8 @@ describe('ng-add', () => { defaultCollection: '@nrwl/angular' }; + json.schematics = {}; + return json; }), tree @@ -61,6 +69,9 @@ describe('ng-add', () => { const result = await runSchematic('ng-add', {}, tree); const workspaceJson = readJsonInTree(result, 'workspace.json'); expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/angular'); + expect( + workspaceJson.schematics['@nrwl/react:application'] + ).not.toBeDefined(); }); }); }); diff --git a/packages/react/src/schematics/ng-add/ng-add.ts b/packages/react/src/schematics/ng-add/ng-add.ts index 0d4c900a7c..192485dfaa 100644 --- a/packages/react/src/schematics/ng-add/ng-add.ts +++ b/packages/react/src/schematics/ng-add/ng-add.ts @@ -50,6 +50,16 @@ function setDefault(): Rule { if (!defaultCollection || defaultCollection === '@nrwl/workspace') { (workspace.extensions.cli as JsonObject).defaultCollection = '@nrwl/react'; + + // Also generate apps with babel option by default. + workspace.extensions.schematics = { + ...(workspace.extensions.schematics + ? (workspace.extensions.schematics as JsonObject) + : {}), + '@nrwl/react:application': { + babel: true + } + }; } }); } diff --git a/packages/react/src/utils/versions.ts b/packages/react/src/utils/versions.ts index 11a397da73..4c1f22ac75 100644 --- a/packages/react/src/utils/versions.ts +++ b/packages/react/src/utils/versions.ts @@ -7,3 +7,10 @@ export const emotionVersion = '10.0.14'; export const domTypesVersion = '16.8.5'; export const reactRouterVersion = '5.0.1'; export const testingLibraryVersion = '8.0.5'; +export const babelCoreVersion = '7.5.5'; +export const babelPresetEnvVersion = '7.5.5'; +export const babelPresetReactVersion = '7.0.0'; +export const babelPresetTypeScriptVersion = '7.3.3'; +export const babelPluginDecoratorsVersion = '7.4.4'; +export const babelLoaderVersion = '8.0.6'; +export const babelPluginMacrosVersion = '2.6.1'; diff --git a/packages/web/src/builders/build/build.impl.spec.ts b/packages/web/src/builders/build/build.impl.spec.ts index 4f3764cb0a..6fd486bedf 100644 --- a/packages/web/src/builders/build/build.impl.spec.ts +++ b/packages/web/src/builders/build/build.impl.spec.ts @@ -122,7 +122,7 @@ describe('WebBuildBuilder', () => { { ...testOptions, differentialLoading: false, - webpackConfig: 'apps/webapp/webpack.config.js' + webpackConfig: './apps/webapp/webpack.config.js' }, context ).toPromise(); diff --git a/packages/web/src/utils/normalize.spec.ts b/packages/web/src/utils/normalize.spec.ts index 8d4be618f6..f47f2e1493 100644 --- a/packages/web/src/utils/normalize.spec.ts +++ b/packages/web/src/utils/normalize.spec.ts @@ -25,7 +25,8 @@ describe('normalizeBuildOptions', () => { } ], assets: [], - statsJson: false + statsJson: false, + webpackConfig: './apps/nodeapp/webpack.config' }; root = '/root'; sourceRoot = normalize('apps/nodeapp/src'); @@ -95,4 +96,19 @@ describe('normalizeBuildOptions', () => { } ]); }); + + it('should only resolve relative webpack config path', () => { + let result = normalizeBuildOptions(testOptions, root, sourceRoot); + expect(result.webpackConfig).toEqual('/root/apps/nodeapp/webpack.config'); + + result = normalizeBuildOptions( + { + ...testOptions, + webpackConfig: '@nrwl/react/plugins/babel' + }, + root, + sourceRoot + ); + expect(result.webpackConfig).toEqual('@nrwl/react/plugins/babel'); + }); }); diff --git a/packages/web/src/utils/normalize.ts b/packages/web/src/utils/normalize.ts index d0f0125898..86564a79c7 100644 --- a/packages/web/src/utils/normalize.ts +++ b/packages/web/src/utils/normalize.ts @@ -23,7 +23,10 @@ export function normalizeBuildOptions( fileReplacements: normalizeFileReplacements(root, options.fileReplacements), assets: normalizeAssets(options.assets, root, sourceRoot), webpackConfig: options.webpackConfig - ? resolve(root, options.webpackConfig) + ? // Don't resolve node_modules or absolute paths. + options.webpackConfig.startsWith('.') + ? resolve(root, options.webpackConfig) + : options.webpackConfig : options.webpackConfig }; } diff --git a/packages/workspace/src/schematics/preset/preset.ts b/packages/workspace/src/schematics/preset/preset.ts index ce337d331e..e6aacf86e5 100644 --- a/packages/workspace/src/schematics/preset/preset.ts +++ b/packages/workspace/src/schematics/preset/preset.ts @@ -50,7 +50,8 @@ function createPreset(options: Schema): Rule { 'application', { name: options.name, - style: options.style + style: options.style, + babel: true }, { interactive: false } ), diff --git a/yarn.lock b/yarn.lock index 621a499a9c..e9aad23ae1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -226,6 +226,26 @@ dependencies: "@babel/highlight" "^7.0.0" +"@babel/core@7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" + integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" + "@babel/helpers" "^7.5.5" + "@babel/parser" "^7.5.5" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/core@^7.0.1": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" @@ -292,6 +312,14 @@ "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== + dependencies: + "@babel/types" "^7.3.0" + esutils "^2.0.0" + "@babel/helper-call-delegate@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" @@ -301,6 +329,18 @@ "@babel/traverse" "^7.4.4" "@babel/types" "^7.4.4" +"@babel/helper-create-class-features-plugin@^7.4.4", "@babel/helper-create-class-features-plugin@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz#401f302c8ddbc0edd36f7c6b2887d8fa1122e5a4" + integrity sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.5.5" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.5.5" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-define-map@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" @@ -464,6 +504,15 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" +"@babel/plugin-proposal-decorators@7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz#de9b2a1a8ab0196f378e2a82f10b6e2a36f21cc0" + integrity sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.2.0" + "@babel/plugin-proposal-dynamic-import@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" @@ -512,6 +561,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-decorators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b" + integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" @@ -526,6 +582,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" @@ -540,6 +603,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-typescript@^7.2.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" + integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-arrow-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" @@ -726,6 +796,38 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@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" + integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz#583b10c49cf057e237085bcbd8cc960bd83bd96b" + integrity sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + dependencies: + "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/plugin-transform-regenerator@^7.4.5": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" @@ -777,6 +879,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-typescript@^7.3.2": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz#6d862766f09b2da1cb1f7d505fe2aedab6b7d4b8" + integrity sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.5.5" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.2.0" + "@babel/plugin-transform-unicode-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" @@ -786,7 +897,7 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" -"@babel/preset-env@^7.0.0": +"@babel/preset-env@7.5.5", "@babel/preset-env@^7.0.0": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.5.tgz#bc470b53acaa48df4b8db24a570d6da1fef53c9a" integrity sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A== @@ -842,7 +953,26 @@ js-levenshtein "^1.1.3" semver "^5.5.0" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.4": +"@babel/preset-react@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + +"@babel/preset-typescript@7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz#88669911053fa16b2b276ea2ede2ca603b3f307a" + integrity sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.3.2" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== @@ -2468,7 +2598,7 @@ babel-jest@^24.8.0: chalk "^2.4.2" slash "^2.0.0" -babel-loader@^8.0.2: +babel-loader@8.0.6, babel-loader@^8.0.2: version "8.0.6" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== @@ -2516,6 +2646,15 @@ babel-plugin-jest-hoist@^24.6.0: dependencies: "@types/babel__traverse" "^7.0.6" +babel-plugin-macros@2.6.1: + 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== + dependencies: + "@babel/runtime" "^7.4.2" + cosmiconfig "^5.2.0" + resolve "^1.10.0" + "babel-plugin-styled-components@>= 1": version "1.10.6" resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.10.6.tgz#f8782953751115faf09a9f92431436912c34006b" @@ -4404,7 +4543,7 @@ cosmiconfig@^4.0.0: parse-json "^4.0.0" require-from-string "^2.0.1" -cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: +cosmiconfig@^5.0.0, cosmiconfig@^5.2.0, cosmiconfig@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== @@ -5460,7 +5599,7 @@ estree-walker@^0.6.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== -esutils@^2.0.2: +esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=