UNPKG

2.74 kBJavaScriptView Raw
1// Copied from https://github.com/nodejs/node/blob/v17.0.1/lib/internal/modules/cjs/helpers.js
2
3'use strict';
4
5const {
6 ArrayPrototypeForEach,
7 ObjectDefineProperty,
8 ObjectPrototypeHasOwnProperty,
9 SafeSet,
10 StringPrototypeIncludes,
11 StringPrototypeStartsWith,
12} = require('./node-primordials');
13
14const { getOptionValue } = require('./node-options');
15const userConditions = getOptionValue('--conditions');
16
17const noAddons = getOptionValue('--no-addons');
18const addonConditions = noAddons ? [] : ['node-addons'];
19
20// TODO: Use this set when resolving pkg#exports conditions in loader.js.
21const cjsConditions = new SafeSet([
22 'require',
23 'node',
24 ...addonConditions,
25 ...userConditions,
26]);
27
28/**
29 * @param {any} object
30 * @param {string} [dummyModuleName]
31 * @return {void}
32 */
33function addBuiltinLibsToObject(object, dummyModuleName) {
34 // Make built-in modules available directly (loaded lazily).
35 const Module = require('module').Module;
36 const { builtinModules } = Module;
37
38 // To require built-in modules in user-land and ignore modules whose
39 // `canBeRequiredByUsers` is false. So we create a dummy module object and not
40 // use `require()` directly.
41 const dummyModule = new Module(dummyModuleName);
42
43 ArrayPrototypeForEach(builtinModules, (name) => {
44 // Neither add underscored modules, nor ones that contain slashes (e.g.,
45 // 'fs/promises') or ones that are already defined.
46 if (StringPrototypeStartsWith(name, '_') ||
47 StringPrototypeIncludes(name, '/') ||
48 ObjectPrototypeHasOwnProperty(object, name)) {
49 return;
50 }
51 // Goals of this mechanism are:
52 // - Lazy loading of built-in modules
53 // - Having all built-in modules available as non-enumerable properties
54 // - Allowing the user to re-assign these variables as if there were no
55 // pre-existing globals with the same name.
56
57 const setReal = (val) => {
58 // Deleting the property before re-assigning it disables the
59 // getter/setter mechanism.
60 delete object[name];
61 object[name] = val;
62 };
63
64 ObjectDefineProperty(object, name, {
65 get: () => {
66 // Node 12 hack; remove when we drop node12 support
67 const lib = (dummyModule.require || require)(name);
68
69 // Disable the current getter/setter and set up a new
70 // non-enumerable property.
71 delete object[name];
72 ObjectDefineProperty(object, name, {
73 get: () => lib,
74 set: setReal,
75 configurable: true,
76 enumerable: false
77 });
78
79 return lib;
80 },
81 set: setReal,
82 configurable: true,
83 enumerable: false
84 });
85 });
86}
87
88exports.addBuiltinLibsToObject = addBuiltinLibsToObject;
89exports.cjsConditions = cjsConditions;