From 88f67eac6fe2d31716d744d2f5fdd869f802c5f1 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 17:13:29 -0400 Subject: [PATCH 01/26] Preliminary typescript plugin --- packages/react-dev-utils/applyPlugins.js | 30 ++++++++++ packages/react-dev-utils/package.json | 1 + .../package.json | 26 ++++++++ .../src/index.js | 60 +++++++++++++++++++ .../config/webpack.config.dev.js | 5 +- .../config/webpack.config.prod.js | 5 +- .../template/src/{App.js => App.tsx} | 15 ++--- packages/tsconfig-react-app/package.json | 14 +++++ packages/tsconfig-react-app/tsconfig.json | 25 ++++++++ packages/tsconfig-react-app/webpack.d.ts | 1 + 10 files changed, 173 insertions(+), 9 deletions(-) create mode 100644 packages/react-dev-utils/applyPlugins.js create mode 100644 packages/react-scripts-plugin-typescript/package.json create mode 100644 packages/react-scripts-plugin-typescript/src/index.js rename packages/react-scripts/template/src/{App.js => App.tsx} (54%) create mode 100644 packages/tsconfig-react-app/package.json create mode 100644 packages/tsconfig-react-app/tsconfig.json create mode 100644 packages/tsconfig-react-app/webpack.d.ts diff --git a/packages/react-dev-utils/applyPlugins.js b/packages/react-dev-utils/applyPlugins.js new file mode 100644 index 00000000000..99a3cd5335c --- /dev/null +++ b/packages/react-dev-utils/applyPlugins.js @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +'use strict'; + +function applyPlugins(config, plugins, { paths }) { + const pluginPaths = plugins + .map(p => { + try { + return require.resolve(`react-scripts-plugin-${p}`); + } catch (e) { + return null; + } + }) + .filter(e => e != null); + console.log(pluginPaths); + for (const pluginPath of pluginPaths) { + const { apply } = require(pluginPath); + config = apply(config, { paths }); + } + return config; +} + +module.exports = applyPlugins; diff --git a/packages/react-dev-utils/package.json b/packages/react-dev-utils/package.json index b4539788d26..7b642349ad2 100644 --- a/packages/react-dev-utils/package.json +++ b/packages/react-dev-utils/package.json @@ -12,6 +12,7 @@ }, "files": [ "ansiHTML.js", + "applyPlugins.js", "checkRequiredFiles.js", "clearConsole.js", "crashOverlay.js", diff --git a/packages/react-scripts-plugin-typescript/package.json b/packages/react-scripts-plugin-typescript/package.json new file mode 100644 index 00000000000..98ac16fe40d --- /dev/null +++ b/packages/react-scripts-plugin-typescript/package.json @@ -0,0 +1,26 @@ +{ + "name": "react-scripts-plugin-typescript", + "version": "0.1.0", + "description": "A plugin for react-scripts which enables TypeScript support.", + "main": "src/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "react-scripts", + "typescript", + "cra", + "create", + "react", + "app", + "plugin" + ], + "license": "BSD-3-Clause", + "dependencies": { + "awesome-typescript-loader": "^3.2.1", + "invariant": "^2.2.2", + "lodash.merge": "^4.6.0", + "tsconfig-react-app": "^1.0.0", + "typescript": "^2.4.1" + } +} diff --git a/packages/react-scripts-plugin-typescript/src/index.js b/packages/react-scripts-plugin-typescript/src/index.js new file mode 100644 index 00000000000..5e1a5706eb2 --- /dev/null +++ b/packages/react-scripts-plugin-typescript/src/index.js @@ -0,0 +1,60 @@ +'use strict'; + +const merge = require('lodash.merge'); +const invariant = require('invariant'); + +// arr: [[afterExt, regexExts, strExt1, strExt2, ...], ...] +function pushExtensions(config, arr) { + const { resolve: { extensions }, module: { rules } } = config; + + for (const [after, , ...exts] of arr) { + // Find the extension we want to add after + const index = extensions.findIndex(s => s === after); + invariant( + index !== -1, + `Unable to find extension ${after} in configuration.` + ); + // Push the extensions into array in the order we specify + extensions.splice(index + 1, 0, ...exts); + } + + // Exclude the new extensions + for (const { exclude } of rules) { + if (exclude == null) { + continue; + } + + for (const [, regexExts] of arr) { + exclude.push(regexExts); + } + } +} + +function apply(config, { paths }) { + // Deep copy configuration + config = merge({}, config); + + pushExtensions(config, [['.js', /\.(ts|tsx)$/, '.tsx', '.ts']]); + + const { module: { rules } } = config; + + // Find babel loader + const jsTransformIndex = rules.findIndex( + rule => rule.test.toString() === '/\\.(js|jsx)$/' + ); + invariant(jsTransformIndex !== -1, 'Unable to find babel transform.'); + // Push typescript loader after babel-loader since they're related + rules.splice(jsTransformIndex + 1, 0, { + test: /\.(ts|tsx)$/, + include: paths.appSrc, + loader: require.resolve('awesome-typescript-loader'), + options: { + silent: true, + configFileName: require.resolve('tsconfig-react-app'), + }, + }); + + return config; +} + +module.exports = { apply }; diff --git a/packages/react-scripts/config/webpack.config.dev.js b/packages/react-scripts/config/webpack.config.dev.js index 253bc34f062..1bd560805ac 100644 --- a/packages/react-scripts/config/webpack.config.dev.js +++ b/packages/react-scripts/config/webpack.config.dev.js @@ -21,6 +21,7 @@ const eslintFormatter = require('react-dev-utils/eslintFormatter'); const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); const getClientEnvironment = require('./env'); const paths = require('./paths'); +const applyPlugins = require('react-dev-utils/applyPlugins'); // Webpack uses `publicPath` to determine where the app is being served from. // In development, we always serve from the root. This makes config easier. @@ -35,7 +36,7 @@ const env = getClientEnvironment(publicUrl); // This is the development configuration. // It is focused on developer experience and fast rebuilds. // The production configuration is different and lives in a separate file. -module.exports = { +const base = { // You may want 'eval' instead if you prefer to see the compiled output in DevTools. // See the discussion in https://github.com/facebookincubator/create-react-app/issues/343. devtool: 'cheap-module-source-map', @@ -290,3 +291,5 @@ module.exports = { hints: false, }, }; + +module.exports = applyPlugins(base, ['typescript'], { paths }); diff --git a/packages/react-scripts/config/webpack.config.prod.js b/packages/react-scripts/config/webpack.config.prod.js index 0077c34a3f6..77446826b6c 100644 --- a/packages/react-scripts/config/webpack.config.prod.js +++ b/packages/react-scripts/config/webpack.config.prod.js @@ -22,6 +22,7 @@ const eslintFormatter = require('react-dev-utils/eslintFormatter'); const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); const paths = require('./paths'); const getClientEnvironment = require('./env'); +const applyPlugins = require('react-dev-utils/applyPlugins'); // Webpack uses `publicPath` to determine where the app is being served from. // It requires a trailing slash, or the file assets will get an incorrect path. @@ -57,7 +58,7 @@ const extractTextPluginOptions = shouldUseRelativeAssetPaths // This is the production configuration. // It compiles slowly and is focused on producing a fast and minimal bundle. // The development configuration is different and lives in a separate file. -module.exports = { +const base = { // Don't attempt to continue if there are any errors. bail: true, // We generate sourcemaps in production. This is slow but gives good results. @@ -358,3 +359,5 @@ module.exports = { tls: 'empty', }, }; + +module.exports = applyPlugins(base, ['typescript'], { paths }); diff --git a/packages/react-scripts/template/src/App.js b/packages/react-scripts/template/src/App.tsx similarity index 54% rename from packages/react-scripts/template/src/App.js rename to packages/react-scripts/template/src/App.tsx index d7d52a7f38a..63220ae99e8 100644 --- a/packages/react-scripts/template/src/App.js +++ b/packages/react-scripts/template/src/App.tsx @@ -1,8 +1,9 @@ -import React, { Component } from 'react'; -import logo from './logo.svg'; -import './App.css'; +import React from 'react' +import './App.css' -class App extends Component { +const logo = require('./logo.svg') + +class App extends React.Component<{}, {}> { render() { return (
@@ -11,11 +12,11 @@ class App extends Component {

Welcome to React

- To get started, edit src/App.js and save to reload. + To get started, edit src/App.tsx and save to reload.

- ); + ) } } -export default App; +export default App diff --git a/packages/tsconfig-react-app/package.json b/packages/tsconfig-react-app/package.json new file mode 100644 index 00000000000..31fa3f12894 --- /dev/null +++ b/packages/tsconfig-react-app/package.json @@ -0,0 +1,14 @@ +{ + "name": "tsconfig-react-app", + "version": "1.0.0", + "description": "", + "main": "tsconfig.json", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "BSD-3-Clause", + "dependencies": { + "@types/node": "^8.0.9" + } +} diff --git a/packages/tsconfig-react-app/tsconfig.json b/packages/tsconfig-react-app/tsconfig.json new file mode 100644 index 00000000000..244feea0c2b --- /dev/null +++ b/packages/tsconfig-react-app/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true, + "allowUnreachableCode": true, + "allowUnusedLabels": true, + "alwaysStrict": true, + "checkJs": false, + "diagnostics": false, + "downlevelIteration": true, + "emitBOM": false, + "emitDecoratorMetadata": false, + "experimentalDecorators": false, + "forceConsistentCasingInFileNames": true, + "jsx": "react", + "lib": ["es5", "es2015.promise", "dom"], + "types": ["node"], + "module": "es2015", + "moduleResolution": "node", + "sourceMap": true, + "strict": true, + "noImplicitAny": false, + "target": "es5" + } +} diff --git a/packages/tsconfig-react-app/webpack.d.ts b/packages/tsconfig-react-app/webpack.d.ts new file mode 100644 index 00000000000..5da4283cdeb --- /dev/null +++ b/packages/tsconfig-react-app/webpack.d.ts @@ -0,0 +1 @@ +declare var __webpack_public_path__: string From 3fbed1be8198d8732efc7deef6d56a732739ee86 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 17:30:03 -0400 Subject: [PATCH 02/26] [revert] add tsconfig --- packages/react-scripts/template/tsconfig.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 packages/react-scripts/template/tsconfig.json diff --git a/packages/react-scripts/template/tsconfig.json b/packages/react-scripts/template/tsconfig.json new file mode 100644 index 00000000000..4ba837675cf --- /dev/null +++ b/packages/react-scripts/template/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig-react-app/tsconfig.json" +} From d552cca86d0c94fb8ef92052c2698a866c6e179f Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 17:37:33 -0400 Subject: [PATCH 03/26] Support new oneOf change --- .../src/index.js | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/packages/react-scripts-plugin-typescript/src/index.js b/packages/react-scripts-plugin-typescript/src/index.js index 5e1a5706eb2..038e044a21e 100644 --- a/packages/react-scripts-plugin-typescript/src/index.js +++ b/packages/react-scripts-plugin-typescript/src/index.js @@ -3,11 +3,11 @@ const merge = require('lodash.merge'); const invariant = require('invariant'); -// arr: [[afterExt, regexExts, strExt1, strExt2, ...], ...] +// arr: [[afterExt, strExt1, strExt2, ...], ...] function pushExtensions(config, arr) { - const { resolve: { extensions }, module: { rules } } = config; + const { resolve: { extensions } } = config; - for (const [after, , ...exts] of arr) { + for (const [after, ...exts] of arr) { // Find the extension we want to add after const index = extensions.findIndex(s => s === after); invariant( @@ -17,26 +17,15 @@ function pushExtensions(config, arr) { // Push the extensions into array in the order we specify extensions.splice(index + 1, 0, ...exts); } - - // Exclude the new extensions - for (const { exclude } of rules) { - if (exclude == null) { - continue; - } - - for (const [, regexExts] of arr) { - exclude.push(regexExts); - } - } } function apply(config, { paths }) { // Deep copy configuration config = merge({}, config); - pushExtensions(config, [['.js', /\.(ts|tsx)$/, '.tsx', '.ts']]); + pushExtensions(config, [['.js', '.tsx', '.ts']]); - const { module: { rules } } = config; + const { module: { rules: [, { oneOf: rules }] } } = config; // Find babel loader const jsTransformIndex = rules.findIndex( From 1985795408bd336b46b1f6b9163403bdcf88ca36 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 17:39:54 -0400 Subject: [PATCH 04/26] Remove log --- packages/react-dev-utils/applyPlugins.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/react-dev-utils/applyPlugins.js b/packages/react-dev-utils/applyPlugins.js index 99a3cd5335c..9c765c64b7a 100644 --- a/packages/react-dev-utils/applyPlugins.js +++ b/packages/react-dev-utils/applyPlugins.js @@ -19,7 +19,6 @@ function applyPlugins(config, plugins, { paths }) { } }) .filter(e => e != null); - console.log(pluginPaths); for (const pluginPath of pluginPaths) { const { apply } = require(pluginPath); config = apply(config, { paths }); From 645a022fe56dfed19974b936d4addd5be8ab5f27 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 17:41:05 -0400 Subject: [PATCH 05/26] Update comment --- packages/react-scripts-plugin-typescript/src/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/react-scripts-plugin-typescript/src/index.js b/packages/react-scripts-plugin-typescript/src/index.js index 038e044a21e..b4e0c2a0441 100644 --- a/packages/react-scripts-plugin-typescript/src/index.js +++ b/packages/react-scripts-plugin-typescript/src/index.js @@ -32,7 +32,8 @@ function apply(config, { paths }) { rule => rule.test.toString() === '/\\.(js|jsx)$/' ); invariant(jsTransformIndex !== -1, 'Unable to find babel transform.'); - // Push typescript loader after babel-loader since they're related + // Push typescript loader after babel-loader since they're related (this + // matters for ejecting) rules.splice(jsTransformIndex + 1, 0, { test: /\.(ts|tsx)$/, include: paths.appSrc, From 8542ccfb6ec7507874d0f394a2913988448e936d Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 18:20:05 -0400 Subject: [PATCH 06/26] Remove reusable logic --- packages/react-dev-utils/applyPlugins.js | 29 ---------- packages/react-dev-utils/package.json | 2 +- packages/react-dev-utils/plugins.js | 55 +++++++++++++++++++ .../package.json | 8 ++- .../src/index.js | 38 ++----------- .../config/webpack.config.dev.js | 2 +- .../config/webpack.config.prod.js | 2 +- 7 files changed, 69 insertions(+), 67 deletions(-) delete mode 100644 packages/react-dev-utils/applyPlugins.js create mode 100644 packages/react-dev-utils/plugins.js diff --git a/packages/react-dev-utils/applyPlugins.js b/packages/react-dev-utils/applyPlugins.js deleted file mode 100644 index 9c765c64b7a..00000000000 --- a/packages/react-dev-utils/applyPlugins.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -'use strict'; - -function applyPlugins(config, plugins, { paths }) { - const pluginPaths = plugins - .map(p => { - try { - return require.resolve(`react-scripts-plugin-${p}`); - } catch (e) { - return null; - } - }) - .filter(e => e != null); - for (const pluginPath of pluginPaths) { - const { apply } = require(pluginPath); - config = apply(config, { paths }); - } - return config; -} - -module.exports = applyPlugins; diff --git a/packages/react-dev-utils/package.json b/packages/react-dev-utils/package.json index 7b642349ad2..501691d58de 100644 --- a/packages/react-dev-utils/package.json +++ b/packages/react-dev-utils/package.json @@ -12,7 +12,6 @@ }, "files": [ "ansiHTML.js", - "applyPlugins.js", "checkRequiredFiles.js", "clearConsole.js", "crashOverlay.js", @@ -28,6 +27,7 @@ "ModuleScopePlugin.js", "openBrowser.js", "openChrome.applescript", + "plugins.js", "printHostingInstructions.js", "WatchMissingNodeModulesPlugin.js", "WebpackDevServerUtils.js", diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js new file mode 100644 index 00000000000..c565a3c5654 --- /dev/null +++ b/packages/react-dev-utils/plugins.js @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +'use strict'; + +function applyPlugins(config, plugins, { paths }) { + const pluginPaths = plugins + .map(p => { + try { + return require.resolve(`react-scripts-plugin-${p}`); + } catch (e) { + return null; + } + }) + .filter(e => e != null); + for (const pluginPath of pluginPaths) { + const { apply } = require(pluginPath); + config = apply(config, { paths }); + } + return config; +} + +// arr: [[afterExt, strExt1, strExt2, ...], ...] +function pushExtensions(config, arr) { + const { resolve: { extensions } } = config; + + for (const [after, ...exts] of arr) { + // Find the extension we want to add after + const index = extensions.findIndex(s => s === after); + if (index === -1) { + throw new Error(`Unable to find extension ${after} in configuration.`); + } + // Push the extensions into array in the order we specify + extensions.splice(index + 1, 0, ...exts); + } +} + +function pushExclusiveLoader(config, testStr, loader) { + const { module: { rules: [, { oneOf: rules }] } } = config; + const jsTransformIndex = rules.findIndex( + rule => rule.test.toString() === '/\\.(js|jsx)$/' + ); + if (jsTransformIndex === -1) { + throw new Error('Unable to find babel transform.'); + } + rules.splice(jsTransformIndex + 1, 0, loader); +} + +module.exports = { applyPlugins, pushExtensions, pushExclusiveLoader }; diff --git a/packages/react-scripts-plugin-typescript/package.json b/packages/react-scripts-plugin-typescript/package.json index 98ac16fe40d..a912e382084 100644 --- a/packages/react-scripts-plugin-typescript/package.json +++ b/packages/react-scripts-plugin-typescript/package.json @@ -18,9 +18,13 @@ "license": "BSD-3-Clause", "dependencies": { "awesome-typescript-loader": "^3.2.1", - "invariant": "^2.2.2", - "lodash.merge": "^4.6.0", "tsconfig-react-app": "^1.0.0", "typescript": "^2.4.1" + }, + "devDependencies": { + "react-dev-utils": "^3.0.2" + }, + "peerDependencies": { + "react-dev-utils": "^3.0.2" } } diff --git a/packages/react-scripts-plugin-typescript/src/index.js b/packages/react-scripts-plugin-typescript/src/index.js index b4e0c2a0441..ba6c1ebce3f 100644 --- a/packages/react-scripts-plugin-typescript/src/index.js +++ b/packages/react-scripts-plugin-typescript/src/index.js @@ -1,40 +1,13 @@ 'use strict'; -const merge = require('lodash.merge'); -const invariant = require('invariant'); - -// arr: [[afterExt, strExt1, strExt2, ...], ...] -function pushExtensions(config, arr) { - const { resolve: { extensions } } = config; - - for (const [after, ...exts] of arr) { - // Find the extension we want to add after - const index = extensions.findIndex(s => s === after); - invariant( - index !== -1, - `Unable to find extension ${after} in configuration.` - ); - // Push the extensions into array in the order we specify - extensions.splice(index + 1, 0, ...exts); - } -} +const { + pushExtensions, + pushExclusiveLoader, +} = require('react-dev-utils/plugins'); function apply(config, { paths }) { - // Deep copy configuration - config = merge({}, config); - pushExtensions(config, [['.js', '.tsx', '.ts']]); - - const { module: { rules: [, { oneOf: rules }] } } = config; - - // Find babel loader - const jsTransformIndex = rules.findIndex( - rule => rule.test.toString() === '/\\.(js|jsx)$/' - ); - invariant(jsTransformIndex !== -1, 'Unable to find babel transform.'); - // Push typescript loader after babel-loader since they're related (this - // matters for ejecting) - rules.splice(jsTransformIndex + 1, 0, { + pushExclusiveLoader(config, '/\\.(js|jsx)$/', { test: /\.(ts|tsx)$/, include: paths.appSrc, loader: require.resolve('awesome-typescript-loader'), @@ -43,7 +16,6 @@ function apply(config, { paths }) { configFileName: require.resolve('tsconfig-react-app'), }, }); - return config; } diff --git a/packages/react-scripts/config/webpack.config.dev.js b/packages/react-scripts/config/webpack.config.dev.js index 1bd560805ac..474a6f51359 100644 --- a/packages/react-scripts/config/webpack.config.dev.js +++ b/packages/react-scripts/config/webpack.config.dev.js @@ -21,7 +21,7 @@ const eslintFormatter = require('react-dev-utils/eslintFormatter'); const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); const getClientEnvironment = require('./env'); const paths = require('./paths'); -const applyPlugins = require('react-dev-utils/applyPlugins'); +const { applyPlugins } = require('react-dev-utils/plugins'); // Webpack uses `publicPath` to determine where the app is being served from. // In development, we always serve from the root. This makes config easier. diff --git a/packages/react-scripts/config/webpack.config.prod.js b/packages/react-scripts/config/webpack.config.prod.js index 77446826b6c..966a75fea28 100644 --- a/packages/react-scripts/config/webpack.config.prod.js +++ b/packages/react-scripts/config/webpack.config.prod.js @@ -22,7 +22,7 @@ const eslintFormatter = require('react-dev-utils/eslintFormatter'); const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); const paths = require('./paths'); const getClientEnvironment = require('./env'); -const applyPlugins = require('react-dev-utils/applyPlugins'); +const { applyPlugins } = require('react-dev-utils/plugins'); // Webpack uses `publicPath` to determine where the app is being served from. // It requires a trailing slash, or the file assets will get an incorrect path. From 4ea787ecbcf65e67bc86e7ff31c269bb3277331b Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 21:00:53 -0400 Subject: [PATCH 07/26] Add basis of eject webpack config --- packages/react-dev-utils/package.json | 4 ++ packages/react-dev-utils/plugins.js | 62 ++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/packages/react-dev-utils/package.json b/packages/react-dev-utils/package.json index 501691d58de..3e2dc2b2a04 100644 --- a/packages/react-dev-utils/package.json +++ b/packages/react-dev-utils/package.json @@ -37,6 +37,10 @@ "address": "1.0.2", "anser": "1.4.1", "babel-code-frame": "6.22.0", + "babel-generator": "^6.25.0", + "babel-template": "^6.25.0", + "babel-traverse": "^6.25.0", + "babylon": "^6.17.4", "chalk": "1.1.3", "cross-spawn": "4.0.2", "detect-port-alt": "1.1.3", diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index c565a3c5654..fd97bbd2d28 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -9,6 +9,12 @@ 'use strict'; +const babylon = require('babylon'); +const traverse = require('babel-traverse').default; +const template = require('babel-template'); +const generator = require('babel-generator').default; +const { readFileSync } = require('fs'); + function applyPlugins(config, plugins, { paths }) { const pluginPaths = plugins .map(p => { @@ -52,4 +58,58 @@ function pushExclusiveLoader(config, testStr, loader) { rules.splice(jsTransformIndex + 1, 0, loader); } -module.exports = { applyPlugins, pushExtensions, pushExclusiveLoader }; +function _getArrayValues(arr) { + const { elements } = arr; + return elements.map(e => { + if (e.type !== 'StringLiteral') { + throw new Error('Must be a string.'); + } + return e.value; + }); +} + +function ejectFile(filename) { + let code = readFileSync(filename, 'utf8'); + let ast = babylon.parse(code); + + let transforms = []; + traverse(ast, { + enter(path) { + const { type } = path; + if (type === 'VariableDeclaration') { + const { node: { declarations: [{ id: { name }, init }] } } = path; + if (name !== 'base') { + return; + } + path.replaceWith(template('module.exports = RIGHT;')({ RIGHT: init })); + } else if (type === 'AssignmentExpression') { + const { node: { left, right } } = path; + if (left.type !== 'MemberExpression') { + return; + } + if (right.type !== 'CallExpression') { + return; + } + const { callee: { name }, arguments: args } = right; + if (name !== 'applyPlugins') { + return; + } + transforms = _getArrayValues(args[1]); + path.parentPath.remove(); + } + }, + }); + console.log(transforms); + return generator( + ast, + { sourceMaps: false, quotes: 'single', comments: true, retainLines: false }, + code + ).code; +} + +module.exports = { + applyPlugins, + pushExtensions, + pushExclusiveLoader, + ejectFile, +}; From 4e10e531a065dcd43760d052ab1b6fec2bd6bf79 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 21:21:18 -0400 Subject: [PATCH 08/26] Set test string --- packages/react-dev-utils/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index fd97bbd2d28..16a336ce428 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -50,7 +50,7 @@ function pushExtensions(config, arr) { function pushExclusiveLoader(config, testStr, loader) { const { module: { rules: [, { oneOf: rules }] } } = config; const jsTransformIndex = rules.findIndex( - rule => rule.test.toString() === '/\\.(js|jsx)$/' + rule => rule.test.toString() === testStr ); if (jsTransformIndex === -1) { throw new Error('Unable to find babel transform.'); From c7c0235200c69c6263819bb022bb27fd3eb0eb40 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 22:19:24 -0400 Subject: [PATCH 09/26] Add extensions AST mode --- packages/react-dev-utils/plugins.js | 91 +++++++++++++------ .../src/index.js | 4 +- 2 files changed, 67 insertions(+), 28 deletions(-) diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index 16a336ce428..a44651cc287 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -13,6 +13,7 @@ const babylon = require('babylon'); const traverse = require('babel-traverse').default; const template = require('babel-template'); const generator = require('babel-generator').default; +const t = require('babel-types'); const { readFileSync } = require('fs'); function applyPlugins(config, plugins, { paths }) { @@ -32,32 +33,6 @@ function applyPlugins(config, plugins, { paths }) { return config; } -// arr: [[afterExt, strExt1, strExt2, ...], ...] -function pushExtensions(config, arr) { - const { resolve: { extensions } } = config; - - for (const [after, ...exts] of arr) { - // Find the extension we want to add after - const index = extensions.findIndex(s => s === after); - if (index === -1) { - throw new Error(`Unable to find extension ${after} in configuration.`); - } - // Push the extensions into array in the order we specify - extensions.splice(index + 1, 0, ...exts); - } -} - -function pushExclusiveLoader(config, testStr, loader) { - const { module: { rules: [, { oneOf: rules }] } } = config; - const jsTransformIndex = rules.findIndex( - rule => rule.test.toString() === testStr - ); - if (jsTransformIndex === -1) { - throw new Error('Unable to find babel transform.'); - } - rules.splice(jsTransformIndex + 1, 0, loader); -} - function _getArrayValues(arr) { const { elements } = arr; return elements.map(e => { @@ -68,6 +43,70 @@ function _getArrayValues(arr) { }); } +// arr: [[afterExt, strExt1, strExt2, ...], ...] +function pushExtensions({ config, ast }, arr) { + if (ast != null) { + traverse(ast, { + enter(path) { + const { type } = path; + if (type !== 'ArrayExpression') { + return; + } + const { key } = path.parent; + if (key == null || key.name !== 'extensions') { + return; + } + const { elements } = path.node; + const extensions = _getArrayValues(path.node); + for (const [after, ...exts] of arr) { + // Find the extension we want to add after + const index = extensions.findIndex(s => s === after); + if (index === -1) { + throw new Error( + `Unable to find extension ${after} in configuration.` + ); + } + // Push the extensions into array in the order we specify + elements.splice( + index + 1, + 0, + ...exts.map(ext => t.stringLiteral(ext)) + ); + // Simulate into our local copy of the array to keep proper indices + extensions.splice(index + 1, 0, ...exts); + } + }, + }); + } else if (config != null) { + const { resolve: { extensions } } = config; + + for (const [after, ...exts] of arr) { + // Find the extension we want to add after + const index = extensions.findIndex(s => s === after); + if (index === -1) { + throw new Error(`Unable to find extension ${after} in configuration.`); + } + // Push the extensions into array in the order we specify + extensions.splice(index + 1, 0, ...exts); + } + } +} + +function pushExclusiveLoader({ config, ast }, testStr, loader) { + if (ast != null) { + console.log('push excl loader', testStr, loader); + } else if (config != null) { + const { module: { rules: [, { oneOf: rules }] } } = config; + const jsTransformIndex = rules.findIndex( + rule => rule.test.toString() === testStr + ); + if (jsTransformIndex === -1) { + throw new Error('Unable to find babel transform.'); + } + rules.splice(jsTransformIndex + 1, 0, loader); + } +} + function ejectFile(filename) { let code = readFileSync(filename, 'utf8'); let ast = babylon.parse(code); diff --git a/packages/react-scripts-plugin-typescript/src/index.js b/packages/react-scripts-plugin-typescript/src/index.js index ba6c1ebce3f..dec5d396757 100644 --- a/packages/react-scripts-plugin-typescript/src/index.js +++ b/packages/react-scripts-plugin-typescript/src/index.js @@ -6,8 +6,8 @@ const { } = require('react-dev-utils/plugins'); function apply(config, { paths }) { - pushExtensions(config, [['.js', '.tsx', '.ts']]); - pushExclusiveLoader(config, '/\\.(js|jsx)$/', { + pushExtensions({ config }, [['.js', '.tsx', '.ts']]); + pushExclusiveLoader({ config }, '/\\.(js|jsx)$/', { test: /\.(ts|tsx)$/, include: paths.appSrc, loader: require.resolve('awesome-typescript-loader'), From 25daa371526bf4331446ae24e06012c0a4a21e51 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 22:43:48 -0400 Subject: [PATCH 10/26] Add pushExclusiveLoader AST mode --- packages/react-dev-utils/package.json | 1 + packages/react-dev-utils/plugins.js | 38 ++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/packages/react-dev-utils/package.json b/packages/react-dev-utils/package.json index 3e2dc2b2a04..64a6fca9427 100644 --- a/packages/react-dev-utils/package.json +++ b/packages/react-dev-utils/package.json @@ -40,6 +40,7 @@ "babel-generator": "^6.25.0", "babel-template": "^6.25.0", "babel-traverse": "^6.25.0", + "babel-types": "^6.25.0", "babylon": "^6.17.4", "chalk": "1.1.3", "cross-spawn": "4.0.2", diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index a44651cc287..fbb41f66142 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -36,10 +36,10 @@ function applyPlugins(config, plugins, { paths }) { function _getArrayValues(arr) { const { elements } = arr; return elements.map(e => { - if (e.type !== 'StringLiteral') { - throw new Error('Must be a string.'); + if (e.type === 'StringLiteral') { + return e.value; } - return e.value; + return e; }); } @@ -94,14 +94,41 @@ function pushExtensions({ config, ast }, arr) { function pushExclusiveLoader({ config, ast }, testStr, loader) { if (ast != null) { - console.log('push excl loader', testStr, loader); + traverse(ast, { + enter(path) { + const { type } = path; + if (type !== 'ArrayExpression') { + return; + } + const { key } = path.parent; + if (key == null || key.name !== 'oneOf') { + return; + } + const entries = _getArrayValues(path.node); + const afterIndex = entries.findIndex(entry => { + const { properties } = entry; + return ( + properties.find(property => { + if (property.value.type !== 'RegExpLiteral') { + return false; + } + return property.value.pattern === testStr.slice(1, -1); + }) != null + ); + }); + if (afterIndex === -1) { + throw new Error('Unable to match pre-transform.'); + } + entries.splice(afterIndex + 1, 0, loader); + }, + }); } else if (config != null) { const { module: { rules: [, { oneOf: rules }] } } = config; const jsTransformIndex = rules.findIndex( rule => rule.test.toString() === testStr ); if (jsTransformIndex === -1) { - throw new Error('Unable to find babel transform.'); + throw new Error('Unable to match pre-transform.'); } rules.splice(jsTransformIndex + 1, 0, loader); } @@ -138,7 +165,6 @@ function ejectFile(filename) { } }, }); - console.log(transforms); return generator( ast, { sourceMaps: false, quotes: 'single', comments: true, retainLines: false }, From b841040b33693a8b28aafa3593e1399c3d93f2d4 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 23:10:12 -0400 Subject: [PATCH 11/26] Apply plugins --- packages/react-dev-utils/plugins.js | 64 ++++++++++++++++--- .../src/index.js | 1 + 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index fbb41f66142..b61fc1d5632 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -117,20 +117,21 @@ function pushExclusiveLoader({ config, ast }, testStr, loader) { ); }); if (afterIndex === -1) { - throw new Error('Unable to match pre-transform.'); + throw new Error('Unable to match pre-loader.'); } - entries.splice(afterIndex + 1, 0, loader); + console.log('holy shit it works'); + path.node.elements.splice(afterIndex + 1, 0, loader); }, }); } else if (config != null) { const { module: { rules: [, { oneOf: rules }] } } = config; - const jsTransformIndex = rules.findIndex( + const loaderIndex = rules.findIndex( rule => rule.test.toString() === testStr ); - if (jsTransformIndex === -1) { - throw new Error('Unable to match pre-transform.'); + if (loaderIndex === -1) { + throw new Error('Unable to match pre-loader.'); } - rules.splice(jsTransformIndex + 1, 0, loader); + rules.splice(loaderIndex + 1, 0, loader); } } @@ -138,7 +139,7 @@ function ejectFile(filename) { let code = readFileSync(filename, 'utf8'); let ast = babylon.parse(code); - let transforms = []; + let plugins = []; traverse(ast, { enter(path) { const { type } = path; @@ -160,11 +161,58 @@ function ejectFile(filename) { if (name !== 'applyPlugins') { return; } - transforms = _getArrayValues(args[1]); + plugins = _getArrayValues(args[1]); path.parentPath.remove(); } }, }); + let deferredTransforms = []; + plugins.forEach(p => { + let path; + try { + path = require.resolve(`react-scripts-plugin-${p}`); + } catch (e) { + return; + } + const pluginCode = readFileSync(path, 'utf8'); + const pluginAst = babylon.parse(pluginCode); + traverse(pluginAst, { + enter(path) { + const { type } = path; + if (type !== 'CallExpression') { + return; + } + const { node: { callee: { name }, arguments: pluginArgs } } = path; + switch (name) { + case 'pushExtensions': { + const [, _exts] = pluginArgs; + const exts = _getArrayValues(_exts).map(entry => + _getArrayValues(entry) + ); + deferredTransforms.push( + pushExtensions.bind(undefined, { ast }, exts) + ); + break; + } + case 'pushExclusiveLoader': { + const [, { value: testStr }, _loader] = pluginArgs; + deferredTransforms.push( + pushExclusiveLoader.bind(undefined, { ast }, testStr, _loader) + ); + break; + } + default: { + // Not a call we care about + break; + } + } + }, + }); + }); + // Execute 'em! + for (const transform of deferredTransforms) { + transform(); + } return generator( ast, { sourceMaps: false, quotes: 'single', comments: true, retainLines: false }, diff --git a/packages/react-scripts-plugin-typescript/src/index.js b/packages/react-scripts-plugin-typescript/src/index.js index dec5d396757..a860f56c842 100644 --- a/packages/react-scripts-plugin-typescript/src/index.js +++ b/packages/react-scripts-plugin-typescript/src/index.js @@ -8,6 +8,7 @@ const { function apply(config, { paths }) { pushExtensions({ config }, [['.js', '.tsx', '.ts']]); pushExclusiveLoader({ config }, '/\\.(js|jsx)$/', { + // Process TypeScript with `at-loader` test: /\.(ts|tsx)$/, include: paths.appSrc, loader: require.resolve('awesome-typescript-loader'), From dba1bf9c1d9353d0036011f23fc285c9494c8c25 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 23:46:19 -0400 Subject: [PATCH 12/26] Run the eject file when ejecting --- packages/react-dev-utils/plugins.js | 6 ++++-- packages/react-scripts/scripts/eject.js | 7 +++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index b61fc1d5632..40246f1aa91 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -135,8 +135,10 @@ function pushExclusiveLoader({ config, ast }, testStr, loader) { } } -function ejectFile(filename) { - let code = readFileSync(filename, 'utf8'); +function ejectFile({ filename, code }) { + if (filename != null) { + code = readFileSync(filename, 'utf8'); + } let ast = babylon.parse(code); let plugins = []; diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 3d8d258cc67..2b9d46d15cf 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -24,6 +24,7 @@ const paths = require('../config/paths'); const createJestConfig = require('./utils/createJestConfig'); const inquirer = require('react-dev-utils/inquirer'); const spawnSync = require('react-dev-utils/crossSpawn').sync; +const { ejectFile } = require('react-dev-utils/plugins'); const green = chalk.green; const cyan = chalk.cyan; @@ -135,6 +136,12 @@ inquirer ) .trim() + '\n'; console.log(` Adding ${cyan(file.replace(ownPath, ''))} to the project`); + if ( + file.endsWith('webpack.config.dev.js') || + file.endsWith('webpack.config.prod.js') + ) { + content = ejectFile(content); + } fs.writeFileSync(file.replace(ownPath, appPath), content); }); console.log(); From 213eefffa0f4545c672f5d05eb52d08b0b1e23ef Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 9 Jul 2017 23:55:44 -0400 Subject: [PATCH 13/26] Oops --- packages/react-scripts/scripts/eject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 2b9d46d15cf..19b0c00b3d2 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -140,7 +140,7 @@ inquirer file.endsWith('webpack.config.dev.js') || file.endsWith('webpack.config.prod.js') ) { - content = ejectFile(content); + content = ejectFile({ code: content }); } fs.writeFileSync(file.replace(ownPath, appPath), content); }); From f307e8d46a221553f0a66f081122aec0098e0d9f Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Mon, 10 Jul 2017 00:01:30 -0400 Subject: [PATCH 14/26] Eject file first --- packages/react-scripts/scripts/eject.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 19b0c00b3d2..1ee7d180eda 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -122,6 +122,13 @@ inquirer if (content.match(/\/\/ @remove-file-on-eject/)) { return; } + // Inline plugins + if ( + file.endsWith('webpack.config.dev.js') || + file.endsWith('webpack.config.prod.js') + ) { + content = ejectFile({ code: content }); + } content = content // Remove dead code from .js files on eject @@ -136,12 +143,6 @@ inquirer ) .trim() + '\n'; console.log(` Adding ${cyan(file.replace(ownPath, ''))} to the project`); - if ( - file.endsWith('webpack.config.dev.js') || - file.endsWith('webpack.config.prod.js') - ) { - content = ejectFile({ code: content }); - } fs.writeFileSync(file.replace(ownPath, appPath), content); }); console.log(); From 32034282e2e0d435a35f3f86364319333dda42ec Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Mon, 10 Jul 2017 00:02:10 -0400 Subject: [PATCH 15/26] Remove configFileName after eject --- packages/react-scripts-plugin-typescript/src/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/react-scripts-plugin-typescript/src/index.js b/packages/react-scripts-plugin-typescript/src/index.js index a860f56c842..764838b024a 100644 --- a/packages/react-scripts-plugin-typescript/src/index.js +++ b/packages/react-scripts-plugin-typescript/src/index.js @@ -14,7 +14,9 @@ function apply(config, { paths }) { loader: require.resolve('awesome-typescript-loader'), options: { silent: true, + // @remove-on-eject-begin configFileName: require.resolve('tsconfig-react-app'), + // @remove-on-eject-end }, }); return config; From 5d14634b846f35ed17fb4f48f5bae0b71d4ea658 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Mon, 10 Jul 2017 00:08:30 -0400 Subject: [PATCH 16/26] prettier (because why not?) --- packages/react-dev-utils/package.json | 1 + packages/react-dev-utils/plugins.js | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/react-dev-utils/package.json b/packages/react-dev-utils/package.json index 64a6fca9427..80b6ac66f05 100644 --- a/packages/react-dev-utils/package.json +++ b/packages/react-dev-utils/package.json @@ -52,6 +52,7 @@ "inquirer": "3.1.1", "is-root": "1.0.0", "opn": "5.1.0", + "prettier": "^1.5.2", "recursive-readdir": "2.2.1", "shell-quote": "1.6.1", "sockjs-client": "1.1.4", diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index 40246f1aa91..9f235746651 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -15,6 +15,7 @@ const template = require('babel-template'); const generator = require('babel-generator').default; const t = require('babel-types'); const { readFileSync } = require('fs'); +const prettier = require('prettier'); function applyPlugins(config, plugins, { paths }) { const pluginPaths = plugins @@ -215,11 +216,16 @@ function ejectFile({ filename, code }) { for (const transform of deferredTransforms) { transform(); } - return generator( + let { code: outCode } = generator( ast, - { sourceMaps: false, quotes: 'single', comments: true, retainLines: false }, + { sourceMaps: false, comments: true, retainLines: false }, code - ).code; + ); + outCode = prettier.format(outCode, { + singleQuote: true, + trailingComma: 'es5', + }); + return outCode; } module.exports = { From 9395a83b42bc85111eae11337b3d2ef2341fde90 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Wed, 12 Jul 2017 22:19:22 -0400 Subject: [PATCH 17/26] Add plugin deps --- packages/react-dev-utils/package.json | 2 ++ packages/react-dev-utils/plugins.js | 26 ++++++++++++++++-- packages/react-scripts/scripts/eject.js | 35 +++++++++++++++++++------ 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/packages/react-dev-utils/package.json b/packages/react-dev-utils/package.json index 80b6ac66f05..a03aeda91b5 100644 --- a/packages/react-dev-utils/package.json +++ b/packages/react-dev-utils/package.json @@ -53,7 +53,9 @@ "is-root": "1.0.0", "opn": "5.1.0", "prettier": "^1.5.2", + "read-pkg-up": "^2.0.0", "recursive-readdir": "2.2.1", + "semver": "^5.3.0", "shell-quote": "1.6.1", "sockjs-client": "1.1.4", "strip-ansi": "3.0.1", diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index 9f235746651..46dcc287c0e 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -16,6 +16,9 @@ const generator = require('babel-generator').default; const t = require('babel-types'); const { readFileSync } = require('fs'); const prettier = require('prettier'); +const getPackageJson = require('read-pkg-up'); +const { dirname } = require('path'); +const semver = require('semver'); function applyPlugins(config, plugins, { paths }) { const pluginPaths = plugins @@ -136,7 +139,7 @@ function pushExclusiveLoader({ config, ast }, testStr, loader) { } } -function ejectFile({ filename, code }) { +function ejectFile({ filename, code, existingDependencies }) { if (filename != null) { code = readFileSync(filename, 'utf8'); } @@ -170,6 +173,7 @@ function ejectFile({ filename, code }) { }, }); let deferredTransforms = []; + const dependencies = new Map([...existingDependencies]); plugins.forEach(p => { let path; try { @@ -177,6 +181,23 @@ function ejectFile({ filename, code }) { } catch (e) { return; } + + const { pkg: pluginPackage } = getPackageJson({ path: dirname(path) }); + for (const pkg of Object.keys(pluginPackage.dependencies)) { + const version = pluginPackage.dependencies[pkg]; + if (dependencies.has(pkg)) { + const prev = dependencies.get(pkg); + if (semver.satisfies(version, prev)) { + continue; + } else if (!semver.satisfies(prev, version)) { + throw new Error( + `Dependency ${pkg}@${version} cannot be satisfied by colliding range ${pkg}@${prev}.` + ); + } + } + dependencies.set(pkg, pluginPackage.dependencies[pkg]); + } + const pluginCode = readFileSync(path, 'utf8'); const pluginAst = babylon.parse(pluginCode); traverse(pluginAst, { @@ -225,7 +246,8 @@ function ejectFile({ filename, code }) { singleQuote: true, trailingComma: 'es5', }); - return outCode; + + return { code: outCode, dependencies }; } module.exports = { diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 1ee7d180eda..0a12e66fe6f 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -115,6 +115,7 @@ inquirer fs.mkdirSync(path.join(appPath, folder)); }); + let addtlDeps = new Map(); files.forEach(file => { let content = fs.readFileSync(file, 'utf8'); @@ -127,7 +128,12 @@ inquirer file.endsWith('webpack.config.dev.js') || file.endsWith('webpack.config.prod.js') ) { - content = ejectFile({ code: content }); + const { code, dependencies } = ejectFile({ + code: content, + existingDependencies: addtlDeps, + }); + content = code; + addtlDeps = new Map([...addtlDeps, ...dependencies]); } content = content @@ -147,11 +153,24 @@ inquirer }); console.log(); - const ownPackage = require(path.join(ownPath, 'package.json')); + const { + name: ownPackageName, + dependencies: _ownDependencies, + optionalDependencies: ownOptionalDependencies, + bin: ownBin, + } = require(path.join(ownPath, 'package.json')); const appPackage = require(path.join(appPath, 'package.json')); + const ownDependencies = Object.assign( + {}, + _ownDependencies, + Array.from(addtlDeps).reduce( + (prev, [pkg, version]) => Object.assign(prev, { [pkg]: version }), + {} + ) + ); + console.log(cyan('Updating the dependencies')); - const ownPackageName = ownPackage.name; if (appPackage.devDependencies) { // We used to put react-scripts in devDependencies if (appPackage.devDependencies[ownPackageName]) { @@ -164,13 +183,13 @@ inquirer console.log(` Removing ${cyan(ownPackageName)} from dependencies`); delete appPackage.dependencies[ownPackageName]; } - Object.keys(ownPackage.dependencies).forEach(key => { + Object.keys(ownDependencies).forEach(key => { // For some reason optionalDependencies end up in dependencies after install - if (ownPackage.optionalDependencies[key]) { + if (ownOptionalDependencies[key]) { return; } console.log(` Adding ${cyan(key)} to dependencies`); - appPackage.dependencies[key] = ownPackage.dependencies[key]; + appPackage.dependencies[key] = ownDependencies[key]; }); // Sort the deps const unsortedDependencies = appPackage.dependencies; @@ -183,7 +202,7 @@ inquirer console.log(cyan('Updating the scripts')); delete appPackage.scripts['eject']; Object.keys(appPackage.scripts).forEach(key => { - Object.keys(ownPackage.bin).forEach(binKey => { + Object.keys(ownBin).forEach(binKey => { const regex = new RegExp(binKey + ' (\\w+)', 'g'); if (!regex.test(appPackage.scripts[key])) { return; @@ -228,7 +247,7 @@ inquirer if (ownPath.indexOf(appPath) === 0) { try { // remove react-scripts and react-scripts binaries from app node_modules - Object.keys(ownPackage.bin).forEach(binKey => { + Object.keys(ownBin).forEach(binKey => { fs.removeSync(path.join(appPath, 'node_modules', '.bin', binKey)); }); fs.removeSync(ownPath); From 8a292368dc5a3e341a7715f3c57d58221456770d Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Wed, 12 Jul 2017 23:42:29 -0400 Subject: [PATCH 18/26] Clean version before comparing and fix sync --- packages/react-dev-utils/plugins.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index 46dcc287c0e..fe4bb2dad8d 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -16,7 +16,7 @@ const generator = require('babel-generator').default; const t = require('babel-types'); const { readFileSync } = require('fs'); const prettier = require('prettier'); -const getPackageJson = require('read-pkg-up'); +const getPackageJson = require('read-pkg-up').sync; const { dirname } = require('path'); const semver = require('semver'); @@ -187,9 +187,9 @@ function ejectFile({ filename, code, existingDependencies }) { const version = pluginPackage.dependencies[pkg]; if (dependencies.has(pkg)) { const prev = dependencies.get(pkg); - if (semver.satisfies(version, prev)) { + if (semver.satisfies(semver.clean(version), prev)) { continue; - } else if (!semver.satisfies(prev, version)) { + } else if (!semver.satisfies(semver.clean(prev), version)) { throw new Error( `Dependency ${pkg}@${version} cannot be satisfied by colliding range ${pkg}@${prev}.` ); From ddf3d42700ea2d87714561e4bdd7505878871b21 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Wed, 12 Jul 2017 23:50:38 -0400 Subject: [PATCH 19/26] Strip off range commonly used --- packages/react-dev-utils/plugins.js | 4 +- packages/react-dev-utils/yarn.lock | 676 ++++++++++++++++++++++++++++ 2 files changed, 678 insertions(+), 2 deletions(-) create mode 100644 packages/react-dev-utils/yarn.lock diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index fe4bb2dad8d..d923abb450b 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -187,9 +187,9 @@ function ejectFile({ filename, code, existingDependencies }) { const version = pluginPackage.dependencies[pkg]; if (dependencies.has(pkg)) { const prev = dependencies.get(pkg); - if (semver.satisfies(semver.clean(version), prev)) { + if (semver.satisfies(version.replace(/[\^~]/g, ''), prev)) { continue; - } else if (!semver.satisfies(semver.clean(prev), version)) { + } else if (!semver.satisfies(prev.replace(/[\^~]/g, ''), version)) { throw new Error( `Dependency ${pkg}@${version} cannot be satisfied by colliding range ${pkg}@${prev}.` ); diff --git a/packages/react-dev-utils/yarn.lock b/packages/react-dev-utils/yarn.lock new file mode 100644 index 00000000000..e5eb9231f2d --- /dev/null +++ b/packages/react-dev-utils/yarn.lock @@ -0,0 +1,676 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +address@1.0.2, address@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.0.2.tgz#480081e82b587ba319459fef512f516fe03d58af" + +anser@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.1.tgz#c3641863a962cebef941ea2c8706f2cb4f0716bd" + +ansi-escapes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + +babel-code-frame@6.22.0, babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-generator@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + lodash "^4.2.0" + +babel-traverse@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + babylon "^6.17.2" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.17.2, babylon@^6.17.4: + version "6.17.4" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +brace-expansion@^1.0.0: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +cross-spawn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +debug@^2.2.0, debug@^2.6.0, debug@^2.6.6: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-port-alt@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.3.tgz#a4d2f061d757a034ecf37c514260a98750f2b131" + dependencies: + address "^1.0.1" + debug "^2.6.0" + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +eventsource@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + dependencies: + original ">=0.0.5" + +external-editor@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.31" + +faye-websocket@~0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + dependencies: + websocket-driver ">=0.5.1" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +filesize@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.3.0.tgz#53149ea3460e3b2e024962a51648aa572cf98122" + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +globals@^9.0.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +gzip-size@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" + dependencies: + duplexer "^0.1.1" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +html-entities@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + +iconv-lite@^0.4.17: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + +inherits@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inquirer@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.1.1.tgz#87621c4fba4072f48a8dd71c9f9df6f100b2d534" + dependencies: + ansi-escapes "^2.0.0" + chalk "^1.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.0.0" + strip-ansi "^3.0.0" + through "^2.3.6" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-root@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-1.0.0.tgz#07b6c233bc394cd9d02ba15c966bd6660d6342d5" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +js-tokens@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +jschardet@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.4.2.tgz#2aa107f142af4121d145659d44f50830961e699a" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +json3@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash@^4.2.0, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimatch@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +normalize-package-data@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +opn@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" + dependencies: + is-wsl "^1.1.0" + +original@>=0.0.5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" + dependencies: + url-parse "1.0.x" + +os-tmpdir@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +prettier@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.5.2.tgz#7ea0751da27b93bfb6cecfcec509994f52d83bb3" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +querystringify@0.0.x: + version "0.0.4" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" + +querystringify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +recursive-readdir@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99" + dependencies: + minimatch "3.0.3" + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +requires-port@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +shell-quote@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +sockjs-client@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" + dependencies: + debug "^2.6.6" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.8" + +source-map@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +string-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.0.tgz#030664561fc146c9423ec7d978fe2457437fe6d0" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +strip-ansi@3.0.1, strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +text-table@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tmp@^0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + +to-fast-properties@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +url-parse@1.0.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + +url-parse@^1.1.8: + version "1.1.9" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.9.tgz#c67f1d775d51f0a18911dd7b3ffad27bb9e5bd19" + dependencies: + querystringify "~1.0.0" + requires-port "1.0.x" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +websocket-driver@>=0.5.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + dependencies: + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + +which@^1.2.9: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" From 5853b899670861b13d40665037eb5b1e7e8584ac Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Thu, 13 Jul 2017 00:00:50 -0400 Subject: [PATCH 20/26] Allow local path --- packages/react-dev-utils/plugins.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index d923abb450b..b33fc0d5c77 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -17,7 +17,7 @@ const t = require('babel-types'); const { readFileSync } = require('fs'); const prettier = require('prettier'); const getPackageJson = require('read-pkg-up').sync; -const { dirname } = require('path'); +const { dirname, isAbsolute } = require('path'); const semver = require('semver'); function applyPlugins(config, plugins, { paths }) { @@ -187,7 +187,10 @@ function ejectFile({ filename, code, existingDependencies }) { const version = pluginPackage.dependencies[pkg]; if (dependencies.has(pkg)) { const prev = dependencies.get(pkg); - if (semver.satisfies(version.replace(/[\^~]/g, ''), prev)) { + if ( + isAbsolute(version) || + semver.satisfies(version.replace(/[\^~]/g, ''), prev) + ) { continue; } else if (!semver.satisfies(prev.replace(/[\^~]/g, ''), version)) { throw new Error( From cf2b0716206248c7555a7286c1712c7580ea7634 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Thu, 13 Jul 2017 00:35:44 -0400 Subject: [PATCH 21/26] Use correct option --- packages/react-dev-utils/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index b33fc0d5c77..fac70790cf3 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -182,7 +182,7 @@ function ejectFile({ filename, code, existingDependencies }) { return; } - const { pkg: pluginPackage } = getPackageJson({ path: dirname(path) }); + const { pkg: pluginPackage } = getPackageJson({ cwd: dirname(path) }); for (const pkg of Object.keys(pluginPackage.dependencies)) { const version = pluginPackage.dependencies[pkg]; if (dependencies.has(pkg)) { From 2adcc64e9eb832a858880a33803f3b895d22e8cc Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Thu, 13 Jul 2017 00:45:04 -0400 Subject: [PATCH 22/26] Make node types a peer dep --- packages/react-scripts-plugin-typescript/package.json | 1 + packages/tsconfig-react-app/package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/react-scripts-plugin-typescript/package.json b/packages/react-scripts-plugin-typescript/package.json index a912e382084..39ee4c824e2 100644 --- a/packages/react-scripts-plugin-typescript/package.json +++ b/packages/react-scripts-plugin-typescript/package.json @@ -17,6 +17,7 @@ ], "license": "BSD-3-Clause", "dependencies": { + "@types/node": "^8.0.11", "awesome-typescript-loader": "^3.2.1", "tsconfig-react-app": "^1.0.0", "typescript": "^2.4.1" diff --git a/packages/tsconfig-react-app/package.json b/packages/tsconfig-react-app/package.json index 31fa3f12894..54b62450d76 100644 --- a/packages/tsconfig-react-app/package.json +++ b/packages/tsconfig-react-app/package.json @@ -8,7 +8,7 @@ }, "author": "", "license": "BSD-3-Clause", - "dependencies": { + "peerDependencies": { "@types/node": "^8.0.9" } } From 93d3537fca48d92bfc6bef12f734676bb71527cc Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Thu, 13 Jul 2017 01:09:11 -0400 Subject: [PATCH 23/26] remove lockfile --- packages/react-dev-utils/yarn.lock | 676 ----------------------------- 1 file changed, 676 deletions(-) delete mode 100644 packages/react-dev-utils/yarn.lock diff --git a/packages/react-dev-utils/yarn.lock b/packages/react-dev-utils/yarn.lock deleted file mode 100644 index e5eb9231f2d..00000000000 --- a/packages/react-dev-utils/yarn.lock +++ /dev/null @@ -1,676 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -address@1.0.2, address@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.0.2.tgz#480081e82b587ba319459fef512f516fe03d58af" - -anser@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.1.tgz#c3641863a962cebef941ea2c8706f2cb4f0716bd" - -ansi-escapes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - -array-map@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - -babel-code-frame@6.22.0, babel-code-frame@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" - dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -babel-generator@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.25.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" - trim-right "^1.0.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-runtime@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.10.0" - -babel-template@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.25.0" - babel-types "^6.25.0" - babylon "^6.17.2" - lodash "^4.2.0" - -babel-traverse@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" - dependencies: - babel-code-frame "^6.22.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.25.0" - babylon "^6.17.2" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-types@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" - dependencies: - babel-runtime "^6.22.0" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babylon@^6.17.2, babylon@^6.17.4: - version "6.17.4" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -brace-expansion@^1.0.0: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" - -cross-spawn@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -debug@^2.2.0, debug@^2.6.0, debug@^2.6.6: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - dependencies: - ms "2.0.0" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -detect-port-alt@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.3.tgz#a4d2f061d757a034ecf37c514260a98750f2b131" - dependencies: - address "^1.0.1" - debug "^2.6.0" - -duplexer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -eventsource@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" - dependencies: - original ">=0.0.5" - -external-editor@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" - dependencies: - iconv-lite "^0.4.17" - jschardet "^1.4.2" - tmp "^0.0.31" - -faye-websocket@~0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" - dependencies: - websocket-driver ">=0.5.1" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - -filesize@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.3.0.tgz#53149ea3460e3b2e024962a51648aa572cf98122" - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -globals@^9.0.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -gzip-size@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" - dependencies: - duplexer "^0.1.1" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - -html-entities@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - -iconv-lite@^0.4.17: - version "0.4.18" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" - -inherits@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inquirer@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.1.1.tgz#87621c4fba4072f48a8dd71c9f9df6f100b2d534" - dependencies: - ansi-escapes "^2.0.0" - chalk "^1.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.0.0" - strip-ansi "^3.0.0" - through "^2.3.6" - -invariant@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - dependencies: - loose-envify "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - -is-root@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-1.0.0.tgz#07b6c233bc394cd9d02ba15c966bd6660d6342d5" - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -js-tokens@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -jschardet@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.4.2.tgz#2aa107f142af4121d145659d44f50830961e699a" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -json3@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lodash@^4.2.0, lodash@^4.3.0: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - -loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - -lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" - -minimatch@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" - dependencies: - brace-expansion "^1.0.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - -normalize-package-data@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - dependencies: - mimic-fn "^1.0.0" - -opn@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" - dependencies: - is-wsl "^1.1.0" - -original@>=0.0.5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" - dependencies: - url-parse "1.0.x" - -os-tmpdir@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -p-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - dependencies: - pify "^2.0.0" - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -prettier@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.5.2.tgz#7ea0751da27b93bfb6cecfcec509994f52d83bb3" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -querystringify@0.0.x: - version "0.0.4" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" - -querystringify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -recursive-readdir@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99" - dependencies: - minimatch "3.0.3" - -regenerator-runtime@^0.10.0: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -requires-port@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - -"semver@2 || 3 || 4 || 5", semver@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -shell-quote@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - -signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -sockjs-client@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" - dependencies: - debug "^2.6.6" - eventsource "0.1.6" - faye-websocket "~0.11.0" - inherits "^2.0.1" - json3 "^3.3.2" - url-parse "^1.1.8" - -source-map@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -string-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.0.tgz#030664561fc146c9423ec7d978fe2457437fe6d0" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -strip-ansi@3.0.1, strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -text-table@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -tmp@^0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - dependencies: - os-tmpdir "~1.0.1" - -to-fast-properties@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -url-parse@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" - dependencies: - querystringify "0.0.x" - requires-port "1.0.x" - -url-parse@^1.1.8: - version "1.1.9" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.9.tgz#c67f1d775d51f0a18911dd7b3ffad27bb9e5bd19" - dependencies: - querystringify "~1.0.0" - requires-port "1.0.x" - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -websocket-driver@>=0.5.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" - dependencies: - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" - -which@^1.2.9: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" - dependencies: - isexe "^2.0.0" - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" From c238223f6c856a1f85c2d2b539ec197db8e3c673 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Thu, 13 Jul 2017 13:50:45 -0400 Subject: [PATCH 24/26] Run eject function --- packages/react-dev-utils/plugins.js | 4 +++- .../react-scripts-plugin-typescript/src/index.js | 13 ++++++++++++- packages/react-scripts/scripts/eject.js | 16 +++++++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/react-dev-utils/plugins.js b/packages/react-dev-utils/plugins.js index fac70790cf3..1c0906fdfed 100644 --- a/packages/react-dev-utils/plugins.js +++ b/packages/react-dev-utils/plugins.js @@ -174,6 +174,7 @@ function ejectFile({ filename, code, existingDependencies }) { }); let deferredTransforms = []; const dependencies = new Map([...existingDependencies]); + const paths = new Set(); plugins.forEach(p => { let path; try { @@ -181,6 +182,7 @@ function ejectFile({ filename, code, existingDependencies }) { } catch (e) { return; } + paths.add(path); const { pkg: pluginPackage } = getPackageJson({ cwd: dirname(path) }); for (const pkg of Object.keys(pluginPackage.dependencies)) { @@ -250,7 +252,7 @@ function ejectFile({ filename, code, existingDependencies }) { trailingComma: 'es5', }); - return { code: outCode, dependencies }; + return { code: outCode, dependencies, paths }; } module.exports = { diff --git a/packages/react-scripts-plugin-typescript/src/index.js b/packages/react-scripts-plugin-typescript/src/index.js index 764838b024a..f8717fdb9e9 100644 --- a/packages/react-scripts-plugin-typescript/src/index.js +++ b/packages/react-scripts-plugin-typescript/src/index.js @@ -22,4 +22,15 @@ function apply(config, { paths }) { return config; } -module.exports = { apply }; +const { readFileSync, writeFileSync } = require('fs'); +const { join } = require('path'); + +function eject({ paths }) { + const configFileName = require.resolve('tsconfig-react-app'); + const tsconfigContent = readFileSync(configFileName, 'utf8'); + + const { appSrc } = paths; + writeFileSync(join(appSrc, 'tsconfig.json'), tsconfigContent); +} + +module.exports = { apply, eject }; diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 0a12e66fe6f..036563b6247 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -116,6 +116,7 @@ inquirer }); let addtlDeps = new Map(); + let pluginPaths = new Set(); files.forEach(file => { let content = fs.readFileSync(file, 'utf8'); @@ -128,12 +129,13 @@ inquirer file.endsWith('webpack.config.dev.js') || file.endsWith('webpack.config.prod.js') ) { - const { code, dependencies } = ejectFile({ + const { code, dependencies, paths: newPaths } = ejectFile({ code: content, existingDependencies: addtlDeps, }); content = code; addtlDeps = new Map([...addtlDeps, ...dependencies]); + pluginPaths = new Set([...pluginPaths, ...newPaths]); } content = content @@ -153,6 +155,18 @@ inquirer }); console.log(); + if (pluginPaths.size() > 0) { + console.log(cyan('Adding plugins')); + } + for (const pluginPath of pluginPaths) { + const pluginName = /.*react-scripts-plugin-([\w-]+)/ + .exec(pluginPath) + .pop(); + console.log(` Applying ${cyan(pluginName)}`); + const { eject } = require(pluginPath); + eject({ paths }); + } + const { name: ownPackageName, dependencies: _ownDependencies, From 17df6730d28ea96f04ad1818c9d9854bca88c853 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Thu, 13 Jul 2017 14:21:14 -0400 Subject: [PATCH 25/26] oops --- packages/react-scripts/scripts/eject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 036563b6247..8903e3e6306 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -155,7 +155,7 @@ inquirer }); console.log(); - if (pluginPaths.size() > 0) { + if (pluginPaths.size > 0) { console.log(cyan('Adding plugins')); } for (const pluginPath of pluginPaths) { From 15d0da7288ca27ff8f991ad2ae20023b0420e588 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Thu, 13 Jul 2017 14:23:57 -0400 Subject: [PATCH 26/26] Add missing newline --- packages/react-scripts/scripts/eject.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 8903e3e6306..3913e42b1e3 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -166,6 +166,9 @@ inquirer const { eject } = require(pluginPath); eject({ paths }); } + if (pluginPaths.size > 0) { + console.log(); + } const { name: ownPackageName,