@@ -518,41 +518,82 @@ const hasReactDependency = (packageJson: PackageJson): boolean => {
518518 ) ;
519519} ;
520520
521- export const discoverReactSubprojects = ( rootDirectory : string ) : WorkspacePackage [ ] => {
522- if ( ! fs . existsSync ( rootDirectory ) || ! fs . statSync ( rootDirectory ) . isDirectory ( ) ) return [ ] ;
523-
521+ const toReactWorkspacePackages = ( directories : string [ ] ) : WorkspacePackage [ ] => {
524522 const packages : WorkspacePackage [ ] = [ ] ;
525523
526- const rootPackageJsonPath = path . join ( rootDirectory , "package.json" ) ;
527- if ( isFile ( rootPackageJsonPath ) ) {
528- const rootPackageJson = readPackageJson ( rootPackageJsonPath ) ;
529- if ( hasReactDependency ( rootPackageJson ) ) {
530- const name = rootPackageJson . name ?? path . basename ( rootDirectory ) ;
531- packages . push ( { name, directory : rootDirectory } ) ;
532- }
524+ for ( const directory of directories ) {
525+ const packageJsonPath = path . join ( directory , "package.json" ) ;
526+ if ( ! isFile ( packageJsonPath ) ) continue ;
527+
528+ const packageJson = readPackageJson ( packageJsonPath ) ;
529+ if ( ! hasReactDependency ( packageJson ) ) continue ;
530+
531+ const name = packageJson . name ?? path . basename ( directory ) ;
532+ packages . push ( { name, directory } ) ;
533533 }
534534
535- const entries = fs . readdirSync ( rootDirectory , { withFileTypes : true } ) ;
535+ return packages ;
536+ } ;
536537
537- for ( const entry of entries ) {
538- if ( ! entry . isDirectory ( ) || entry . name . startsWith ( "." ) || entry . name === "node_modules" ) {
539- continue ;
538+ const listManifestWorkspacePackages = ( rootDirectory : string ) : WorkspacePackage [ ] => {
539+ const packageJsonPath = path . join ( rootDirectory , "package.json" ) ;
540+ if ( isFile ( packageJsonPath ) ) return listWorkspacePackages ( rootDirectory ) ;
541+
542+ const patterns = parsePnpmWorkspacePatterns ( rootDirectory ) ;
543+ const nxPatterns = patterns . length > 0 ? [ ] : getNxWorkspaceDirectories ( rootDirectory ) ;
544+ const directories = ( patterns . length > 0 ? patterns : nxPatterns ) . flatMap ( ( pattern ) =>
545+ resolveWorkspaceDirectories ( rootDirectory , pattern ) ,
546+ ) ;
547+
548+ return toReactWorkspacePackages ( directories ) ;
549+ } ;
550+
551+ const discoverReactSubprojectsByFilesystem = ( rootDirectory : string ) : WorkspacePackage [ ] => {
552+ const packages : WorkspacePackage [ ] = [ ] ;
553+ const pendingDirectories = [ rootDirectory ] ;
554+
555+ while ( pendingDirectories . length > 0 ) {
556+ const currentDirectory = pendingDirectories . shift ( ) ;
557+ if ( ! currentDirectory ) continue ;
558+
559+ const packageJsonPath = path . join ( currentDirectory , "package.json" ) ;
560+ if ( isFile ( packageJsonPath ) ) {
561+ const packageJson = readPackageJson ( packageJsonPath ) ;
562+ if ( hasReactDependency ( packageJson ) ) {
563+ const name = packageJson . name ?? path . basename ( currentDirectory ) ;
564+ packages . push ( { name, directory : currentDirectory } ) ;
565+ }
540566 }
541567
542- const subdirectory = path . join ( rootDirectory , entry . name ) ;
543- const packageJsonPath = path . join ( subdirectory , "package.json" ) ;
544- if ( ! isFile ( packageJsonPath ) ) continue ;
568+ const entries = fs
569+ . readdirSync ( currentDirectory , { withFileTypes : true } )
570+ . toSorted ( ( firstEntry , secondEntry ) => firstEntry . name . localeCompare ( secondEntry . name ) ) ;
545571
546- const packageJson = readPackageJson ( packageJsonPath ) ;
547- if ( ! hasReactDependency ( packageJson ) ) continue ;
572+ for ( const entry of entries ) {
573+ if (
574+ ! entry . isDirectory ( ) ||
575+ entry . name . startsWith ( "." ) ||
576+ IGNORED_DIRECTORIES . has ( entry . name )
577+ ) {
578+ continue ;
579+ }
548580
549- const name = packageJson . name ?? entry . name ;
550- packages . push ( { name , directory : subdirectory } ) ;
581+ pendingDirectories . push ( path . join ( currentDirectory , entry . name ) ) ;
582+ }
551583 }
552584
553585 return packages ;
554586} ;
555587
588+ export const discoverReactSubprojects = ( rootDirectory : string ) : WorkspacePackage [ ] => {
589+ if ( ! fs . existsSync ( rootDirectory ) || ! fs . statSync ( rootDirectory ) . isDirectory ( ) ) return [ ] ;
590+
591+ const manifestPackages = listManifestWorkspacePackages ( rootDirectory ) ;
592+ if ( manifestPackages . length > 0 ) return manifestPackages ;
593+
594+ return discoverReactSubprojectsByFilesystem ( rootDirectory ) ;
595+ } ;
596+
556597export const listWorkspacePackages = ( rootDirectory : string ) : WorkspacePackage [ ] => {
557598 const packageJsonPath = path . join ( rootDirectory , "package.json" ) ;
558599 if ( ! isFile ( packageJsonPath ) ) return [ ] ;
0 commit comments