Skip to content

Commit c2b0188

Browse files
committed
lib: restructure cjs and esm loaders
Create `lib/internal/modules` and restructure the module loaders to make the purpose of those files clearer. Also make it clear in the code that the object exported by `lib/internal/modules/cjs/loader.js` is `CJSModule` instead of the ambiguous `Module`. Before: ``` lib ├── ... ├── internal │ ├── loaders │ │ ├── CreateDynamicModule.js │ │ ├── DefaultResolve.js │ │ ├── Loader.js │ │ ├── ModuleJob.js │ │ ├── ModuleMap.js │ │ └── Translators.js │ └── module.js └── module.js ``` After: ``` lib ├── ... ├── internal │ ├── ... │ └── modules │ ├── cjs │ │ ├── helpers.js │ │ └── loader.js │ └── esm │ ├── CreateDynamicModule.js │ ├── DefaultResolve.js │ ├── Loader.js │ ├── ModuleJob.js │ ├── ModuleMap.js │ └── Translators.js └── module.js # deleted in this commit to work with git file mode ``` PR-URL: nodejs#19177 Refs: nodejs#19112 Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
1 parent 8484b40 commit c2b0188

38 files changed

Lines changed: 203 additions & 174 deletions

lib/internal/bootstrap/loaders.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// This file creates the internal module & binding loaders used by built-in
22
// modules. In contrast, user land modules are loaded using
3-
// lib/module.js (CommonJS Modules) or lib/internal/loader/* (ES Modules).
3+
// lib/internal/modules/cjs/loader.js (CommonJS Modules) or
4+
// lib/internal/modules/esm/* (ES Modules).
45
//
56
// This file is compiled and run by node.cc before bootstrap/node.js
67
// was called, therefore the loaders are bootstraped before we start to

lib/internal/bootstrap/node.js

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112
process.emitWarning(
113113
'The ESM module loader is experimental.',
114114
'ExperimentalWarning', undefined);
115-
NativeModule.require('internal/process/modules').setup();
115+
NativeModule.require('internal/process/esm_loader').setup();
116116
}
117117

118118
{
@@ -194,22 +194,24 @@
194194
preloadModules();
195195
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_PRELOAD_MODULE_LOAD_END);
196196

197-
const internalModule = NativeModule.require('internal/module');
198-
internalModule.addBuiltinLibsToObject(global);
197+
const {
198+
addBuiltinLibsToObject
199+
} = NativeModule.require('internal/modules/cjs/helpers');
200+
addBuiltinLibsToObject(global);
199201
evalScript('[eval]');
200202
} else if (process.argv[1] && process.argv[1] !== '-') {
201203
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_MODULE_LOAD_START);
202204
// make process.argv[1] into a full path
203205
const path = NativeModule.require('path');
204206
process.argv[1] = path.resolve(process.argv[1]);
205207

206-
const Module = NativeModule.require('module');
208+
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
207209

208210
// check if user passed `-c` or `--check` arguments to Node.
209211
if (process._syntax_check_only != null) {
210212
const fs = NativeModule.require('fs');
211213
// read the source
212-
const filename = Module._resolveFilename(process.argv[1]);
214+
const filename = CJSModule._resolveFilename(process.argv[1]);
213215
const source = fs.readFileSync(filename, 'utf-8');
214216
checkScriptSyntax(source, filename);
215217
process.exit(0);
@@ -220,7 +222,7 @@
220222
preloadModules();
221223
perf.markMilestone(
222224
NODE_PERFORMANCE_MILESTONE_PRELOAD_MODULE_LOAD_END);
223-
Module.runMain();
225+
CJSModule.runMain();
224226
} else {
225227
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_MODULE_LOAD_START);
226228
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_MODULE_LOAD_END);
@@ -345,15 +347,15 @@
345347

346348
function setupGlobalConsole() {
347349
const originalConsole = global.console;
348-
const Module = NativeModule.require('module');
350+
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
349351
// Setup Node.js global.console
350352
const wrappedConsole = NativeModule.require('console');
351353
Object.defineProperty(global, 'console', {
352354
configurable: true,
353355
enumerable: false,
354356
value: wrappedConsole
355357
});
356-
setupInspector(originalConsole, wrappedConsole, Module);
358+
setupInspector(originalConsole, wrappedConsole, CJSModule);
357359
}
358360

359361
function setupGlobalURL() {
@@ -374,19 +376,20 @@
374376
});
375377
}
376378

377-
function setupInspector(originalConsole, wrappedConsole, Module) {
379+
function setupInspector(originalConsole, wrappedConsole, CJSModule) {
378380
if (!process.config.variables.v8_enable_inspector) {
379381
return;
380382
}
381383
const { addCommandLineAPI, consoleCall } = process.binding('inspector');
382384
// Setup inspector command line API
383-
const { makeRequireFunction } = NativeModule.require('internal/module');
385+
const { makeRequireFunction } =
386+
NativeModule.require('internal/modules/cjs/helpers');
384387
const path = NativeModule.require('path');
385388
const cwd = tryGetCwd(path);
386389

387-
const consoleAPIModule = new Module('<inspector console>');
390+
const consoleAPIModule = new CJSModule('<inspector console>');
388391
consoleAPIModule.paths =
389-
Module._nodeModulePaths(cwd).concat(Module.globalPaths);
392+
CJSModule._nodeModulePaths(cwd).concat(CJSModule.globalPaths);
390393
addCommandLineAPI('require', makeRequireFunction(consoleAPIModule));
391394
const config = {};
392395
for (const key of Object.keys(wrappedConsole)) {
@@ -515,13 +518,13 @@
515518
}
516519

517520
function evalScript(name) {
518-
const Module = NativeModule.require('module');
521+
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
519522
const path = NativeModule.require('path');
520523
const cwd = tryGetCwd(path);
521524

522-
const module = new Module(name);
525+
const module = new CJSModule(name);
523526
module.filename = path.join(cwd, name);
524-
module.paths = Module._nodeModulePaths(cwd);
527+
module.paths = CJSModule._nodeModulePaths(cwd);
525528
const body = wrapForBreakOnFirstLine(process._eval);
526529
const script = `global.__filename = ${JSON.stringify(name)};\n` +
527530
'global.exports = exports;\n' +
@@ -540,21 +543,26 @@
540543
// Load preload modules
541544
function preloadModules() {
542545
if (process._preload_modules) {
543-
NativeModule.require('module')._preloadModules(process._preload_modules);
546+
const {
547+
_preloadModules
548+
} = NativeModule.require('internal/modules/cjs/loader');
549+
_preloadModules(process._preload_modules);
544550
}
545551
}
546552

547553
function checkScriptSyntax(source, filename) {
548-
const Module = NativeModule.require('module');
554+
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
549555
const vm = NativeModule.require('vm');
550-
const internalModule = NativeModule.require('internal/module');
556+
const {
557+
stripShebang, stripBOM
558+
} = NativeModule.require('internal/modules/cjs/helpers');
551559

552560
// remove Shebang
553-
source = internalModule.stripShebang(source);
561+
source = stripShebang(source);
554562
// remove BOM
555-
source = internalModule.stripBOM(source);
563+
source = stripBOM(source);
556564
// wrap it
557-
source = Module.wrap(source);
565+
source = CJSModule.wrap(source);
558566
// compile the script, this will throw if it fails
559567
new vm.Script(source, { displayErrors: true, filename });
560568
}
Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ const {
3535
internalModuleStat
3636
} = process.binding('fs');
3737
const { safeGetenv } = process.binding('util');
38-
const internalModule = require('internal/module');
38+
const {
39+
makeRequireFunction,
40+
requireDepth,
41+
stripBOM,
42+
stripShebang
43+
} = require('internal/modules/cjs/helpers');
3944
const preserveSymlinks = !!process.binding('config').preserveSymlinks;
4045
const experimentalModules = !!process.binding('config').experimentalModules;
4146

@@ -48,9 +53,9 @@ const {
4853
module.exports = Module;
4954

5055
// these are below module.exports for the circular reference
51-
const internalESModule = require('internal/process/modules');
52-
const ModuleJob = require('internal/loader/ModuleJob');
53-
const createDynamicModule = require('internal/loader/CreateDynamicModule');
56+
const asyncESM = require('internal/process/esm_loader');
57+
const ModuleJob = require('internal/modules/esm/ModuleJob');
58+
const createDynamicModule = require('internal/modules/esm/CreateDynamicModule');
5459
const {
5560
CHAR_UPPERCASE_A,
5661
CHAR_LOWERCASE_A,
@@ -477,7 +482,7 @@ Module._load = function(request, parent, isMain) {
477482
}
478483

479484
if (experimentalModules && isMain) {
480-
internalESModule.loaderPromise.then((loader) => {
485+
asyncESM.loaderPromise.then((loader) => {
481486
return loader.import(getURLFromFilePath(request).pathname);
482487
})
483488
.catch((e) => {
@@ -583,7 +588,7 @@ Module.prototype.load = function(filename) {
583588
this.loaded = true;
584589

585590
if (experimentalModules) {
586-
const ESMLoader = internalESModule.ESMLoader;
591+
const ESMLoader = asyncESM.ESMLoader;
587592
const url = getURLFromFilePath(filename);
588593
const urlString = `${url}`;
589594
const exports = this.exports;
@@ -631,7 +636,7 @@ var resolvedArgv;
631636
// Returns exception, if any.
632637
Module.prototype._compile = function(content, filename) {
633638

634-
content = internalModule.stripShebang(content);
639+
content = stripShebang(content);
635640

636641
// create wrapper function
637642
var wrapper = Module.wrap(content);
@@ -660,8 +665,8 @@ Module.prototype._compile = function(content, filename) {
660665
}
661666
}
662667
var dirname = path.dirname(filename);
663-
var require = internalModule.makeRequireFunction(this);
664-
var depth = internalModule.requireDepth;
668+
var require = makeRequireFunction(this);
669+
var depth = requireDepth;
665670
if (depth === 0) stat.cache = new Map();
666671
var result;
667672
if (inspectorWrapper) {
@@ -679,15 +684,15 @@ Module.prototype._compile = function(content, filename) {
679684
// Native extension for .js
680685
Module._extensions['.js'] = function(module, filename) {
681686
var content = fs.readFileSync(filename, 'utf8');
682-
module._compile(internalModule.stripBOM(content), filename);
687+
module._compile(stripBOM(content), filename);
683688
};
684689

685690

686691
// Native extension for .json
687692
Module._extensions['.json'] = function(module, filename) {
688693
var content = fs.readFileSync(filename, 'utf8');
689694
try {
690-
module.exports = JSON.parse(internalModule.stripBOM(content));
695+
module.exports = JSON.parse(stripBOM(content));
691696
} catch (err) {
692697
err.message = filename + ': ' + err.message;
693698
throw err;
File renamed without changes.

lib/internal/loader/DefaultResolve.js renamed to lib/internal/modules/esm/DefaultResolve.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
22

33
const { URL } = require('url');
4-
const CJSmodule = require('module');
4+
const CJSmodule = require('internal/modules/cjs/loader');
55
const internalFS = require('internal/fs');
66
const { NativeModule, internalBinding } = require('internal/bootstrap/loaders');
77
const { extname } = require('path');
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ const {
66
ERR_MISSING_DYNAMIC_INTSTANTIATE_HOOK,
77
ERR_UNKNOWN_MODULE_FORMAT
88
} = require('internal/errors').codes;
9-
const ModuleMap = require('internal/loader/ModuleMap');
10-
const ModuleJob = require('internal/loader/ModuleJob');
11-
const defaultResolve = require('internal/loader/DefaultResolve');
12-
const createDynamicModule = require('internal/loader/CreateDynamicModule');
13-
const translators = require('internal/loader/Translators');
9+
const ModuleMap = require('internal/modules/esm/ModuleMap');
10+
const ModuleJob = require('internal/modules/esm/ModuleJob');
11+
const defaultResolve = require('internal/modules/esm/DefaultResolve');
12+
const createDynamicModule = require('internal/modules/esm/CreateDynamicModule');
13+
const translators = require('internal/modules/esm/Translators');
1414

1515
const FunctionBind = Function.call.bind(Function.prototype.bind);
1616

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
const ModuleJob = require('internal/loader/ModuleJob');
3+
const ModuleJob = require('internal/modules/esm/ModuleJob');
44
const { SafeMap } = require('internal/safe_globals');
55
const debug = require('util').debuglog('esm');
66
const { ERR_INVALID_ARG_TYPE } = require('internal/errors').codes;
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
const { NativeModule, internalBinding } = require('internal/bootstrap/loaders');
44
const { ModuleWrap } = internalBinding('module_wrap');
5-
const internalCJSModule = require('internal/module');
6-
const CJSModule = require('module');
5+
const {
6+
stripShebang,
7+
stripBOM
8+
} = require('internal/modules/cjs/helpers');
9+
const CJSModule = require('internal/modules/cjs/loader');
710
const internalURLModule = require('internal/url');
8-
const createDynamicModule = require('internal/loader/CreateDynamicModule');
11+
const createDynamicModule = require('internal/modules/esm/CreateDynamicModule');
912
const fs = require('fs');
1013
const { _makeLong } = require('path');
1114
const { SafeMap } = require('internal/safe_globals');
@@ -24,7 +27,7 @@ translators.set('esm', async (url) => {
2427
const source = `${await readFileAsync(new URL(url))}`;
2528
debug(`Translating StandardModule ${url}`);
2629
return {
27-
module: new ModuleWrap(internalCJSModule.stripShebang(source), url),
30+
module: new ModuleWrap(stripShebang(source), url),
2831
reflect: undefined
2932
};
3033
});
@@ -82,7 +85,7 @@ translators.set('json', async (url) => {
8285
const pathname = internalURLModule.getPathFromURL(new URL(url));
8386
const content = readFileSync(pathname, 'utf8');
8487
try {
85-
const exports = JsonParse(internalCJSModule.stripBOM(content));
88+
const exports = JsonParse(stripBOM(content));
8689
reflect.exports.default.set(exports);
8790
} catch (err) {
8891
err.message = pathname + ': ' + err.message;

0 commit comments

Comments
 (0)