@@ -11,6 +11,7 @@ import type {
1111} from "../types.js" ;
1212import { findMonorepoRoot , isMonorepoRoot } from "./find-monorepo-root.js" ;
1313import { isFile } from "./is-file.js" ;
14+ import { isPlainObject } from "./is-plain-object.js" ;
1415import { readPackageJson } from "./read-package-json.js" ;
1516
1617const REACT_COMPILER_PACKAGES = new Set ( [
@@ -130,10 +131,43 @@ const detectFramework = (dependencies: Record<string, string>): Framework => {
130131 return "unknown" ;
131132} ;
132133
134+ const isCatalogReference = ( version : string ) : boolean => version . startsWith ( "catalog:" ) ;
135+
136+ const resolveVersionFromCatalog = (
137+ catalog : Record < string , unknown > ,
138+ packageName : string ,
139+ ) : string | null => {
140+ const version = catalog [ packageName ] ;
141+ if ( typeof version === "string" && ! isCatalogReference ( version ) ) return version ;
142+ return null ;
143+ } ;
144+
145+ const resolveCatalogVersion = ( packageJson : PackageJson , packageName : string ) : string | null => {
146+ const raw = packageJson as Record < string , unknown > ;
147+
148+ if ( isPlainObject ( raw . catalog ) ) {
149+ const version = resolveVersionFromCatalog ( raw . catalog , packageName ) ;
150+ if ( version ) return version ;
151+ }
152+
153+ if ( isPlainObject ( raw . catalogs ) ) {
154+ for ( const catalogEntries of Object . values ( raw . catalogs ) ) {
155+ if ( isPlainObject ( catalogEntries ) ) {
156+ const version = resolveVersionFromCatalog ( catalogEntries , packageName ) ;
157+ if ( version ) return version ;
158+ }
159+ }
160+ }
161+
162+ return null ;
163+ } ;
164+
133165const extractDependencyInfo = ( packageJson : PackageJson ) : DependencyInfo => {
134166 const allDependencies = collectAllDependencies ( packageJson ) ;
167+ const rawVersion = allDependencies . react ?? null ;
168+ const reactVersion = rawVersion && ! isCatalogReference ( rawVersion ) ? rawVersion : null ;
135169 return {
136- reactVersion : allDependencies . react ?? null ,
170+ reactVersion,
137171 framework : detectFramework ( allDependencies ) ,
138172 } ;
139173} ;
@@ -216,10 +250,11 @@ const findDependencyInfoFromMonorepoRoot = (directory: string): DependencyInfo =
216250
217251 const rootPackageJson = readPackageJson ( monorepoPackageJsonPath ) ;
218252 const rootInfo = extractDependencyInfo ( rootPackageJson ) ;
253+ const catalogVersion = resolveCatalogVersion ( rootPackageJson , "react" ) ;
219254 const workspaceInfo = findReactInWorkspaces ( monorepoRoot , rootPackageJson ) ;
220255
221256 return {
222- reactVersion : rootInfo . reactVersion ?? workspaceInfo . reactVersion ,
257+ reactVersion : rootInfo . reactVersion ?? catalogVersion ?? workspaceInfo . reactVersion ,
223258 framework : rootInfo . framework !== "unknown" ? rootInfo . framework : workspaceInfo . framework ,
224259 } ;
225260} ;
@@ -368,6 +403,10 @@ export const discoverProject = (directory: string): ProjectInfo => {
368403 const packageJson = readPackageJson ( packageJsonPath ) ;
369404 let { reactVersion, framework } = extractDependencyInfo ( packageJson ) ;
370405
406+ if ( ! reactVersion ) {
407+ reactVersion = resolveCatalogVersion ( packageJson , "react" ) ;
408+ }
409+
371410 if ( ! reactVersion || framework === "unknown" ) {
372411 const workspaceInfo = findReactInWorkspaces ( directory , packageJson ) ;
373412 if ( ! reactVersion && workspaceInfo . reactVersion ) {
0 commit comments