@@ -44,6 +44,16 @@ interface DocumentedNodeClass {
4444 classMethods ?: Array < DocumentedNodeClassMethod | DocumentedUnknownNode > ;
4545}
4646
47+ interface DocumentedNodeGlobal {
48+ type : 'global' ;
49+ name : string ;
50+ introduced_in ?: string ;
51+ modules ?: Array < DocumentedNodeModule | DocumentedUnknownNode > ;
52+ classes ?: Array < DocumentedNodeClass | DocumentedUnknownNode > ;
53+ properties ?: Array < DocumentedNodeProperty > ;
54+ methods ?: Array < DocumentedNodeMethod | DocumentedUnknownNode > ;
55+ }
56+
4757interface DocumentedNodeModule {
4858 type : 'module' ;
4959 name : string ;
@@ -53,11 +63,13 @@ interface DocumentedNodeModule {
5363 classes ?: Array < DocumentedNodeClass | DocumentedUnknownNode > ;
5464 properties ?: Array < DocumentedNodeProperty > ;
5565 methods ?: Array < DocumentedNodeMethod | DocumentedUnknownNode > ;
66+ globals ?: Array < DocumentedNodeGlobal | DocumentedUnknownNode > ;
5667}
5768
5869interface RootDocumentedNodeModule {
5970 type : 'module' ;
60- modules : DocumentedNodeModule [ ] ;
71+ modules ?: DocumentedNodeModule [ ] ;
72+ globals ?: DocumentedNodeGlobal [ ] ;
6173}
6274
6375// Maps subpath module names (after stripping node: prefix) to the base module
@@ -115,7 +127,7 @@ function earliestVersion(versions: string[]): string {
115127}
116128
117129function findExportVersion (
118- module : DocumentedNodeModule ,
130+ module : DocumentedNodeModule | DocumentedNodeGlobal ,
119131 exportName : string ,
120132 lastIntroducedIn ?: string
121133) : string | null {
@@ -157,15 +169,35 @@ function findExportVersion(
157169}
158170
159171function findSubmodule (
160- module : DocumentedNodeModule ,
172+ module : DocumentedNodeModule | DocumentedNodeGlobal ,
161173 name : string
162- ) : DocumentedNodeModule | null {
174+ ) : DocumentedNodeModule | DocumentedNodeGlobal | null {
163175 for ( const sub of module . modules ?? [ ] ) {
164176 if ( sub . type !== 'module' ) continue ;
165177 if ( sub . name === name ) return sub ;
166178 const found = findSubmodule ( sub , name ) ;
167179 if ( found ) return found ;
168180 }
181+ if ( module . type === 'module' ) {
182+ for ( const global of module . globals ?? [ ] ) {
183+ if ( global . type !== 'global' ) continue ;
184+ if ( global . name . toLowerCase ( ) === name . toLowerCase ( ) ) return global ;
185+ const found = findSubmodule ( global , name ) ;
186+ if ( found ) return found ;
187+ }
188+ }
189+ return null ;
190+ }
191+
192+ function findDefaultModuleOrGlobal (
193+ mod : RootDocumentedNodeModule
194+ ) : DocumentedNodeModule | DocumentedNodeGlobal | null {
195+ if ( mod . modules && mod . modules . length === 1 ) {
196+ return mod . modules [ 0 ] ;
197+ }
198+ if ( mod . globals && mod . globals . length === 1 ) {
199+ return mod . globals [ 0 ] ;
200+ }
169201 return null ;
170202}
171203
@@ -177,23 +209,26 @@ async function getNodeVersion(
177209 const data = await fetchNodeModuleData ( base ) ;
178210 if ( ! data ) return null ;
179211
180- let rootModule = data . modules [ 0 ] ;
181- if ( ! rootModule ) return null ;
212+ const targetModuleOrGlobal = findDefaultModuleOrGlobal ( data ) ;
213+
214+ if ( ! targetModuleOrGlobal ) return null ;
215+
216+ let root : DocumentedNodeModule | DocumentedNodeGlobal = targetModuleOrGlobal ;
182217
183218 if ( submodule ) {
184- const sub = findSubmodule ( rootModule , submodule ) ;
219+ const sub = findSubmodule ( targetModuleOrGlobal , submodule ) ;
185220 if ( ! sub ) return null ;
186- rootModule = sub ;
221+ root = sub ;
187222 }
188223
189224 if ( ! exportName ) {
190- if ( rootModule . introduced_in ) {
191- return rootModule . introduced_in . replace ( / ^ v / , '' ) ;
225+ if ( root . introduced_in ) {
226+ return root . introduced_in . replace ( / ^ v / , '' ) ;
192227 }
193228 return null ;
194229 }
195230
196- return findExportVersion ( rootModule , exportName ) ;
231+ return findExportVersion ( root , exportName ) ;
197232}
198233
199234async function updateReplacementNodeEngine (
0 commit comments