1111const path = require ( 'path' ) ;
1212const fs = require ( 'fs' ) ;
1313const url = require ( 'url' ) ;
14- const findMonorepo = require ( 'react-dev-utils/workspaceUtils' ) . findMonorepo ;
14+ const findPkg = require ( 'find-pkg' ) ;
15+ const globby = require ( 'globby' ) ;
1516
1617// Make sure any symlinks in the project folder are resolved:
1718// https://github.com/facebook/create-react-app/issues/637
@@ -57,6 +58,7 @@ module.exports = {
5758 appIndexJs : resolveApp ( 'src/index.js' ) ,
5859 appPackageJson : resolveApp ( 'package.json' ) ,
5960 appSrc : resolveApp ( 'src' ) ,
61+ yarnLockFile : resolveApp ( 'yarn.lock' ) ,
6062 testsSetup : resolveApp ( 'src/setupTests.js' ) ,
6163 appNodeModules : resolveApp ( 'node_modules' ) ,
6264 publicUrl : getPublicUrl ( resolveApp ( 'package.json' ) ) ,
@@ -78,6 +80,7 @@ module.exports = {
7880 appIndexJs : resolveApp ( 'src/index.js' ) ,
7981 appPackageJson : resolveApp ( 'package.json' ) ,
8082 appSrc : resolveApp ( 'src' ) ,
83+ yarnLockFile : resolveApp ( 'yarn.lock' ) ,
8184 testsSetup : resolveApp ( 'src/setupTests.js' ) ,
8285 appNodeModules : resolveApp ( 'node_modules' ) ,
8386 publicUrl : getPublicUrl ( resolveApp ( 'package.json' ) ) ,
@@ -103,6 +106,7 @@ if (useTemplate) {
103106 appIndexJs : resolveOwn ( 'template/src/index.js' ) ,
104107 appPackageJson : resolveOwn ( 'package.json' ) ,
105108 appSrc : resolveOwn ( 'template/src' ) ,
109+ yarnLockFile : resolveOwn ( 'template/yarn.lock' ) ,
106110 testsSetup : resolveOwn ( 'template/src/setupTests.js' ) ,
107111 appNodeModules : resolveOwn ( 'node_modules' ) ,
108112 publicUrl : getPublicUrl ( resolveOwn ( 'package.json' ) ) ,
@@ -116,16 +120,40 @@ if (useTemplate) {
116120
117121module . exports . srcPaths = [ module . exports . appSrc ] ;
118122
119- module . exports . useYarn = fs . existsSync (
120- path . join ( module . exports . appPath , 'yarn.lock' )
121- ) ;
123+ const findPkgs = ( rootPath , globPatterns ) => {
124+ const globOpts = {
125+ cwd : rootPath ,
126+ strict : true ,
127+ absolute : true ,
128+ } ;
129+ return globPatterns
130+ . reduce (
131+ ( pkgs , pattern ) =>
132+ pkgs . concat ( globby . sync ( path . join ( pattern , 'package.json' ) , globOpts ) ) ,
133+ [ ]
134+ )
135+ . map ( f => path . dirname ( path . normalize ( f ) ) ) ;
136+ } ;
137+
138+ const getMonorepoPkgPaths = ( ) => {
139+ const monoPkgPath = findPkg . sync ( path . resolve ( appDirectory , '..' ) ) ;
140+ if ( monoPkgPath ) {
141+ // get monorepo config from yarn workspace
142+ const pkgPatterns = require ( monoPkgPath ) . workspaces ;
143+ if ( pkgPatterns == null ) {
144+ return [ ] ;
145+ }
146+ const pkgPaths = findPkgs ( path . dirname ( monoPkgPath ) , pkgPatterns ) ;
147+ // only include monorepo pkgs if app itself is included in monorepo
148+ if ( pkgPaths . indexOf ( appDirectory ) !== - 1 ) {
149+ return pkgPaths . filter ( f => fs . realpathSync ( f ) !== appDirectory ) ;
150+ }
151+ }
152+ return [ ] ;
153+ } ;
122154
123155if ( checkForMonorepo ) {
124156 // if app is in a monorepo (lerna or yarn workspace), treat other packages in
125157 // the monorepo as if they are app source
126- const mono = findMonorepo ( appDirectory ) ;
127- if ( mono . isAppIncluded ) {
128- Array . prototype . push . apply ( module . exports . srcPaths , mono . pkgs ) ;
129- }
130- module . exports . useYarn = module . exports . useYarn || mono . isYarnWs ;
158+ Array . prototype . push . apply ( module . exports . srcPaths , getMonorepoPkgPaths ( ) ) ;
131159}
0 commit comments