feat(react): adds default babel-loader support for react apps (#1631)

This commit is contained in:
Jack Hsu 2019-07-25 15:33:26 -04:00 committed by GitHub
parent 8182454dc8
commit 776a185d65
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 340 additions and 49 deletions

View File

@ -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

View File

@ -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);

View File

@ -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));

View File

@ -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",

View File

@ -0,0 +1 @@
module.exports = require('../src/plugins/babel').getBabelWebpackConfig;

View File

@ -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'
}
})

View File

@ -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'

View File

@ -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;
}

View File

@ -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(/<Link\s*to="\/"/);
});
});
describe('--babel true', () => {
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');
});
});
});

View File

@ -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)}`

View File

@ -10,4 +10,5 @@ export interface Schema {
pascalCaseFiles?: boolean;
classComponent?: boolean;
routing?: boolean;
babel?: boolean;
}

View File

@ -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": []

View File

@ -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();
});
});
});

View File

@ -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
}
};
}
});
}

View File

@ -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';

View File

@ -122,7 +122,7 @@ describe('WebBuildBuilder', () => {
{
...testOptions,
differentialLoading: false,
webpackConfig: 'apps/webapp/webpack.config.js'
webpackConfig: './apps/webapp/webpack.config.js'
},
context
).toPromise();

View File

@ -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');
});
});

View File

@ -23,7 +23,10 @@ export function normalizeBuildOptions<T extends BuildBuilderOptions>(
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
};
}

View File

@ -50,7 +50,8 @@ function createPreset(options: Schema): Rule {
'application',
{
name: options.name,
style: options.style
style: options.style,
babel: true
},
{ interactive: false }
),

149
yarn.lock
View File

@ -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=