Skip to content

Commit a09b5ee

Browse files
authored
fix: use lazyloaders for runtime feature detection (#4557)
1 parent 8761011 commit a09b5ee

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

lib/util/runtime-features.js

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
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
*/
1118
function 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
*/
2835
function 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+
*/
5264
function 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

Comments
 (0)