1- // @ts -check
2-
31'use strict'
42
53/** @typedef {`node:${string}` } NodeModuleName */
64
5+ /** @type {Record<NodeModuleName, () => any> } */
6+ const lazyLoaders = {
7+ __proto__ : null ,
8+ 'node:crypto' : ( ) => require ( 'node:crypto' ) ,
9+ 'node:sqlite' : ( ) => require ( 'node:sqlite' ) ,
10+ 'node:worker_threads' : ( ) => require ( 'node:worker_threads' ) ,
11+ 'node:zlib' : ( ) => require ( 'node:zlib' )
12+ }
13+
714/**
815 * @param {NodeModuleName } moduleName
916 * @returns {boolean }
1017 */
1118function detectRuntimeFeatureByNodeModule ( moduleName ) {
1219 try {
13- require ( moduleName )
20+ lazyLoaders [ moduleName ] ( )
1421 return true
1522 } catch ( err ) {
1623 if ( err . code !== 'ERR_UNKNOWN_BUILTIN_MODULE' ) {
@@ -26,7 +33,7 @@ function detectRuntimeFeatureByNodeModule (moduleName) {
2633 * @returns {boolean }
2734 */
2835function detectRuntimeFeatureByExportedProperty ( moduleName , property ) {
29- const module = require ( moduleName )
36+ const module = lazyLoaders [ moduleName ] ( )
3037 return typeof module [ property ] !== 'undefined'
3138}
3239
@@ -47,12 +54,17 @@ const features = /** @type {const} */ ([
4754 ...runtimeFeaturesAsNodeModule ,
4855 ...runtimeFeaturesByExportedProperty
4956] )
57+
5058/** @typedef {typeof features[number] } Feature */
5159
60+ /**
61+ * @param {Feature } feature
62+ * @returns {boolean }
63+ */
5264function detectRuntimeFeature ( feature ) {
53- if ( runtimeFeaturesAsNodeModule . includes ( feature ) ) {
65+ if ( runtimeFeaturesAsNodeModule . includes ( /** @type { RuntimeFeatureByNodeModule } */ ( feature ) ) ) {
5466 return detectRuntimeFeatureByNodeModule ( `node:${ feature } ` )
55- } else if ( runtimeFeaturesByExportedProperty . includes ( feature ) ) {
67+ } else if ( runtimeFeaturesByExportedProperty . includes ( /** @type { RuntimeFeatureByExportedProperty } */ ( feature ) ) ) {
5668 const [ moduleName , property ] = exportedPropertyLookup [ feature ]
5769 return detectRuntimeFeatureByExportedProperty ( moduleName , property )
5870 }
0 commit comments