forked from facebook/create-react-app
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Adds the PnP plugin for Webpack to find dependencies when working under PnP * Adds configuration for jest * Adds an e2e test for when using PnP * Avoids cra from crashing at the engine check * Avoids cra from crashing when initializing react-scripts * Makes the ownPath portable * Fixes linting * Bumps to [email protected], removes symlinks: false * Adds a --use-pnp option * Pin version
- Loading branch information
Showing
9 changed files
with
116 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -76,6 +76,7 @@ const program = new commander.Command(packageJson.name) | |
'use a non-standard version of react-scripts' | ||
) | ||
.option('--use-npm') | ||
.option('--use-pnp') | ||
.allowUnknownOption() | ||
.on('--help', () => { | ||
console.log(` Only ${chalk.green('<project-directory>')} is required.`); | ||
|
@@ -178,10 +179,11 @@ createApp( | |
program.verbose, | ||
program.scriptsVersion, | ||
program.useNpm, | ||
program.usePnp, | ||
hiddenProgram.internalTestingTemplate | ||
); | ||
|
||
function createApp(name, verbose, version, useNpm, template) { | ||
function createApp(name, verbose, version, useNpm, usePnp, template) { | ||
const root = path.resolve(name); | ||
const appName = path.basename(root); | ||
|
||
|
@@ -241,7 +243,16 @@ function createApp(name, verbose, version, useNpm, template) { | |
version = '[email protected]'; | ||
} | ||
} | ||
run(root, appName, version, verbose, originalDirectory, template, useYarn); | ||
run( | ||
root, | ||
appName, | ||
version, | ||
verbose, | ||
originalDirectory, | ||
template, | ||
useYarn, | ||
usePnp | ||
); | ||
} | ||
|
||
function shouldUseYarn() { | ||
|
@@ -253,7 +264,7 @@ function shouldUseYarn() { | |
} | ||
} | ||
|
||
function install(root, useYarn, dependencies, verbose, isOnline) { | ||
function install(root, useYarn, usePnp, dependencies, verbose, isOnline) { | ||
return new Promise((resolve, reject) => { | ||
let command; | ||
let args; | ||
|
@@ -263,6 +274,9 @@ function install(root, useYarn, dependencies, verbose, isOnline) { | |
if (!isOnline) { | ||
args.push('--offline'); | ||
} | ||
if (usePnp) { | ||
args.push('--enable-pnp'); | ||
} | ||
[].push.apply(args, dependencies); | ||
|
||
// Explicitly set cwd() to work around issues like | ||
|
@@ -287,6 +301,12 @@ function install(root, useYarn, dependencies, verbose, isOnline) { | |
'--loglevel', | ||
'error', | ||
].concat(dependencies); | ||
|
||
if (usePnp) { | ||
console.log(chalk.yellow("NPM doesn't support PnP.")); | ||
console.log(chalk.yellow('Falling back to the regular installs.')); | ||
console.log(); | ||
} | ||
} | ||
|
||
if (verbose) { | ||
|
@@ -313,7 +333,8 @@ function run( | |
verbose, | ||
originalDirectory, | ||
template, | ||
useYarn | ||
useYarn, | ||
usePnp | ||
) { | ||
const packageToInstall = getInstallPackage(version, originalDirectory); | ||
const allDependencies = ['react', 'react-dom', packageToInstall]; | ||
|
@@ -336,23 +357,34 @@ function run( | |
); | ||
console.log(); | ||
|
||
return install(root, useYarn, allDependencies, verbose, isOnline).then( | ||
() => packageName | ||
); | ||
return install( | ||
root, | ||
useYarn, | ||
usePnp, | ||
allDependencies, | ||
verbose, | ||
isOnline | ||
).then(() => packageName); | ||
}) | ||
.then(packageName => { | ||
.then(async packageName => { | ||
checkNodeVersion(packageName); | ||
setCaretRangeForRuntimeDeps(packageName); | ||
|
||
const scriptsPath = path.resolve( | ||
process.cwd(), | ||
'node_modules', | ||
packageName, | ||
'scripts', | ||
'init.js' | ||
const pnpPath = path.resolve(process.cwd(), '.pnp.js'); | ||
|
||
const nodeArgs = fs.existsSync(pnpPath) ? ['--require', pnpPath] : []; | ||
|
||
await executeNodeScript( | ||
{ | ||
cwd: process.cwd(), | ||
args: nodeArgs, | ||
}, | ||
[root, appName, verbose, originalDirectory, template], | ||
` | ||
var init = require('${packageName}/scripts/init.js'); | ||
init.apply(null, JSON.parse(process.argv[1])); | ||
` | ||
); | ||
const init = require(scriptsPath); | ||
init(root, appName, verbose, originalDirectory, template); | ||
|
||
if (version === '[email protected]') { | ||
console.log( | ||
|
@@ -540,6 +572,11 @@ function checkNodeVersion(packageName) { | |
packageName, | ||
'package.json' | ||
); | ||
|
||
if (!fs.existsSync(packageJsonPath)) { | ||
return; | ||
} | ||
|
||
const packageJson = require(packageJsonPath); | ||
if (!packageJson.engines || !packageJson.engines.node) { | ||
return; | ||
|
@@ -794,3 +831,23 @@ function checkIfOnline(useYarn) { | |
}); | ||
}); | ||
} | ||
|
||
function executeNodeScript({ cwd, args }, data, source) { | ||
return new Promise((resolve, reject) => { | ||
const child = spawn( | ||
process.execPath, | ||
[...args, '-e', source, '--', JSON.stringify(data)], | ||
{ cwd, stdio: 'inherit' } | ||
); | ||
|
||
child.on('close', code => { | ||
if (code !== 0) { | ||
reject({ | ||
command: `node ${args.join(' ')}`, | ||
}); | ||
return; | ||
} | ||
resolve(); | ||
}); | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters