Skip to content

Commit

Permalink
lib: restructure cjs and esm loaders
Browse files Browse the repository at this point in the history
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
│       │     ├── ModuleWrap.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
```

Backport-PR-URL: #19374
PR-URL: #19177
Refs: #19112
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
  • Loading branch information
joyeecheung authored and targos committed Apr 4, 2018
1 parent 83ebaf0 commit 45c477c
Show file tree
Hide file tree
Showing 40 changed files with 200 additions and 171 deletions.
3 changes: 2 additions & 1 deletion lib/internal/bootstrap/loaders.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// This file creates the internal module & binding loaders used by built-in
// modules. In contrast, user land modules are loaded using
// lib/module.js (CommonJS Modules) or lib/internal/loader/* (ES Modules).
// lib/internal/modules/cjs/loader.js (CommonJS Modules) or
// lib/internal/modules/esm/* (ES Modules).
//
// This file is compiled and run by node.cc before bootstrap/node.js
// was called, therefore the loaders are bootstraped before we start to
Expand Down
50 changes: 29 additions & 21 deletions lib/internal/bootstrap/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@
process.emitWarning(
'The ESM module loader is experimental.',
'ExperimentalWarning', undefined);
NativeModule.require('internal/process/modules').setup();
NativeModule.require('internal/process/esm_loader').setup();
}


Expand Down Expand Up @@ -170,22 +170,24 @@
preloadModules();
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_PRELOAD_MODULE_LOAD_END);

const internalModule = NativeModule.require('internal/module');
internalModule.addBuiltinLibsToObject(global);
const {
addBuiltinLibsToObject
} = NativeModule.require('internal/modules/cjs/helpers');
addBuiltinLibsToObject(global);
evalScript('[eval]');
} else if (process.argv[1] && process.argv[1] !== '-') {
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_MODULE_LOAD_START);
// make process.argv[1] into a full path
const path = NativeModule.require('path');
process.argv[1] = path.resolve(process.argv[1]);

const Module = NativeModule.require('module');
const CJSModule = NativeModule.require('internal/modules/cjs/loader');

// check if user passed `-c` or `--check` arguments to Node.
if (process._syntax_check_only != null) {
const fs = NativeModule.require('fs');
// read the source
const filename = Module._resolveFilename(process.argv[1]);
const filename = CJSModule._resolveFilename(process.argv[1]);
const source = fs.readFileSync(filename, 'utf-8');
checkScriptSyntax(source, filename);
process.exit(0);
Expand All @@ -196,7 +198,7 @@
preloadModules();
perf.markMilestone(
NODE_PERFORMANCE_MILESTONE_PRELOAD_MODULE_LOAD_END);
Module.runMain();
CJSModule.runMain();
} else {
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_MODULE_LOAD_START);
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_MODULE_LOAD_END);
Expand Down Expand Up @@ -321,7 +323,7 @@

function setupGlobalConsole() {
const originalConsole = global.console;
const Module = NativeModule.require('module');
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
// Setup Node.js global.console
const wrappedConsole = NativeModule.require('console');
Object.defineProperty(global, 'console', {
Expand All @@ -331,22 +333,23 @@
return wrappedConsole;
}
});
setupInspector(originalConsole, wrappedConsole, Module);
setupInspector(originalConsole, wrappedConsole, CJSModule);
}

function setupInspector(originalConsole, wrappedConsole, Module) {
function setupInspector(originalConsole, wrappedConsole, CJSModule) {
if (!process.config.variables.v8_enable_inspector) {
return;
}
const { addCommandLineAPI, consoleCall } = process.binding('inspector');
// Setup inspector command line API
const { makeRequireFunction } = NativeModule.require('internal/module');
const { makeRequireFunction } =
NativeModule.require('internal/modules/cjs/helpers');
const path = NativeModule.require('path');
const cwd = tryGetCwd(path);

const consoleAPIModule = new Module('<inspector console>');
const consoleAPIModule = new CJSModule('<inspector console>');
consoleAPIModule.paths =
Module._nodeModulePaths(cwd).concat(Module.globalPaths);
CJSModule._nodeModulePaths(cwd).concat(CJSModule.globalPaths);
addCommandLineAPI('require', makeRequireFunction(consoleAPIModule));
const config = {};
for (const key of Object.keys(wrappedConsole)) {
Expand Down Expand Up @@ -461,13 +464,13 @@
}

function evalScript(name) {
const Module = NativeModule.require('module');
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
const path = NativeModule.require('path');
const cwd = tryGetCwd(path);

const module = new Module(name);
const module = new CJSModule(name);
module.filename = path.join(cwd, name);
module.paths = Module._nodeModulePaths(cwd);
module.paths = CJSModule._nodeModulePaths(cwd);
const body = wrapForBreakOnFirstLine(process._eval);
const script = `global.__filename = ${JSON.stringify(name)};\n` +
'global.exports = exports;\n' +
Expand All @@ -486,21 +489,26 @@
// Load preload modules
function preloadModules() {
if (process._preload_modules) {
NativeModule.require('module')._preloadModules(process._preload_modules);
const {
_preloadModules
} = NativeModule.require('internal/modules/cjs/loader');
_preloadModules(process._preload_modules);
}
}

function checkScriptSyntax(source, filename) {
const Module = NativeModule.require('module');
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
const vm = NativeModule.require('vm');
const internalModule = NativeModule.require('internal/module');
const {
stripShebang, stripBOM
} = NativeModule.require('internal/modules/cjs/helpers');

// remove Shebang
source = internalModule.stripShebang(source);
source = stripShebang(source);
// remove BOM
source = internalModule.stripBOM(source);
source = stripBOM(source);
// wrap it
source = Module.wrap(source);
source = CJSModule.wrap(source);
// compile the script, this will throw if it fails
new vm.Script(source, { displayErrors: true, filename });
}
Expand Down
File renamed without changes.
27 changes: 16 additions & 11 deletions lib/module.js → lib/internal/modules/cjs/loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,12 @@ const {
internalModuleReadFile,
internalModuleStat
} = process.binding('fs');
const internalModule = require('internal/module');
const {
makeRequireFunction,
requireDepth,
stripBOM,
stripShebang
} = require('internal/modules/cjs/helpers');
const preserveSymlinks = !!process.binding('config').preserveSymlinks;
const experimentalModules = !!process.binding('config').experimentalModules;

Expand All @@ -43,9 +48,9 @@ const errors = require('internal/errors');
module.exports = Module;

// these are below module.exports for the circular reference
const internalESModule = require('internal/process/modules');
const ModuleJob = require('internal/loader/ModuleJob');
const createDynamicModule = require('internal/loader/CreateDynamicModule');
const asyncESM = require('internal/process/esm_loader');
const ModuleJob = require('internal/modules/esm/ModuleJob');
const createDynamicModule = require('internal/modules/esm/CreateDynamicModule');

function stat(filename) {
filename = path.toNamespacedPath(filename);
Expand Down Expand Up @@ -456,7 +461,7 @@ Module._load = function(request, parent, isMain) {
}

if (experimentalModules && isMain) {
internalESModule.loaderPromise.then((loader) => {
asyncESM.loaderPromise.then((loader) => {
return loader.import(getURLFromFilePath(request).pathname);
})
.catch((e) => {
Expand Down Expand Up @@ -562,7 +567,7 @@ Module.prototype.load = function(filename) {
this.loaded = true;

if (experimentalModules) {
const ESMLoader = internalESModule.ESMLoader;
const ESMLoader = asyncESM.ESMLoader;
const url = getURLFromFilePath(filename);
const urlString = `${url}`;
const exports = this.exports;
Expand Down Expand Up @@ -605,7 +610,7 @@ var resolvedArgv;
// Returns exception, if any.
Module.prototype._compile = function(content, filename) {

content = internalModule.stripShebang(content);
content = stripShebang(content);

// create wrapper function
var wrapper = Module.wrap(content);
Expand Down Expand Up @@ -638,8 +643,8 @@ Module.prototype._compile = function(content, filename) {
}
}
var dirname = path.dirname(filename);
var require = internalModule.makeRequireFunction(this);
var depth = internalModule.requireDepth;
var require = makeRequireFunction(this);
var depth = requireDepth;
if (depth === 0) stat.cache = new Map();
var result;
if (inspectorWrapper) {
Expand All @@ -657,15 +662,15 @@ Module.prototype._compile = function(content, filename) {
// Native extension for .js
Module._extensions['.js'] = function(module, filename) {
var content = fs.readFileSync(filename, 'utf8');
module._compile(internalModule.stripBOM(content), filename);
module._compile(stripBOM(content), filename);
};


// Native extension for .json
Module._extensions['.json'] = function(module, filename) {
var content = fs.readFileSync(filename, 'utf8');
try {
module.exports = JSON.parse(internalModule.stripBOM(content));
module.exports = JSON.parse(stripBOM(content));
} catch (err) {
err.message = filename + ': ' + err.message;
throw err;
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use strict';

const { URL } = require('url');
const CJSmodule = require('module');
const CJSmodule = require('internal/modules/cjs/loader');
const internalFS = require('internal/fs');
const { NativeModule, internalBinding } = require('internal/bootstrap/loaders');
const { extname } = require('path');
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
'use strict';

const errors = require('internal/errors');
const ModuleMap = require('internal/loader/ModuleMap');
const ModuleJob = require('internal/loader/ModuleJob');
const defaultResolve = require('internal/loader/DefaultResolve');
const createDynamicModule = require('internal/loader/CreateDynamicModule');
const translators = require('internal/loader/Translators');
const ModuleMap = require('internal/modules/esm/ModuleMap');
const ModuleJob = require('internal/modules/esm/ModuleJob');
const defaultResolve = require('internal/modules/esm/DefaultResolve');
const createDynamicModule = require('internal/modules/esm/CreateDynamicModule');
const translators = require('internal/modules/esm/Translators');

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

Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

const ModuleJob = require('internal/loader/ModuleJob');
const ModuleJob = require('internal/modules/esm/ModuleJob');
const { SafeMap } = require('internal/safe_globals');
const debug = require('util').debuglog('esm');
const errors = require('internal/errors');
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

const { NativeModule, internalBinding } = require('internal/bootstrap/loaders');
const { ModuleWrap } = internalBinding('module_wrap');
const internalCJSModule = require('internal/module');
const CJSModule = require('module');
const {
stripShebang,
stripBOM
} = require('internal/modules/cjs/helpers');
const CJSModule = require('internal/modules/cjs/loader');
const internalURLModule = require('internal/url');
const createDynamicModule = require('internal/loader/CreateDynamicModule');
const createDynamicModule = require('internal/modules/esm/CreateDynamicModule');
const fs = require('fs');
const { _makeLong } = require('path');
const { SafeMap } = require('internal/safe_globals');
Expand All @@ -24,7 +27,7 @@ translators.set('esm', async (url) => {
const source = `${await readFileAsync(new URL(url))}`;
debug(`Translating StandardModule ${url}`);
return {
module: new ModuleWrap(internalCJSModule.stripShebang(source), url),
module: new ModuleWrap(stripShebang(source), url),
reflect: undefined
};
});
Expand Down Expand Up @@ -82,7 +85,7 @@ translators.set('json', async (url) => {
const pathname = internalURLModule.getPathFromURL(new URL(url));
const content = readFileSync(pathname, 'utf8');
try {
const exports = JsonParse(internalCJSModule.stripBOM(content));
const exports = JsonParse(stripBOM(content));
reflect.exports.default.set(exports);
} catch (err) {
err.message = pathname + ': ' + err.message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const {
} = internalBinding('module_wrap');

const { getURLFromFilePath } = require('internal/url');
const Loader = require('internal/loader/Loader');
const Loader = require('internal/modules/esm/Loader');
const path = require('path');
const { URL } = require('url');

Expand Down
23 changes: 14 additions & 9 deletions lib/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@

'use strict';

const internalModule = require('internal/module');
const {
builtinLibs,
makeRequireFunction,
addBuiltinLibsToObject
} = require('internal/modules/cjs/helpers');
const internalUtil = require('internal/util');
const { isTypedArray } = require('internal/util/types');
const util = require('util');
Expand All @@ -54,7 +58,7 @@ const path = require('path');
const fs = require('fs');
const { Interface } = require('readline');
const { Console } = require('console');
const Module = require('module');
const CJSModule = require('internal/modules/cjs/loader');
const domain = require('domain');
const debug = util.debuglog('repl');
const errors = require('internal/errors');
Expand Down Expand Up @@ -90,7 +94,7 @@ try {
}

// Hack for repl require to work properly with node_modules folders
module.paths = Module._nodeModulePaths(module.filename);
module.paths = CJSModule._nodeModulePaths(module.filename);

// If obj.hasOwnProperty has been overridden, then calling
// obj.hasOwnProperty(prop) will break.
Expand All @@ -103,7 +107,7 @@ function hasOwnProperty(obj, prop) {
// This is the default "writer" value if none is passed in the REPL options.
exports.writer = util.inspect;

exports._builtinLibs = internalModule.builtinLibs;
exports._builtinLibs = builtinLibs;

function REPLServer(prompt,
stream,
Expand Down Expand Up @@ -673,14 +677,15 @@ REPLServer.prototype.createContext = function() {
}
}

var module = new Module('<repl>');
module.paths = Module._resolveLookupPaths('<repl>', parentModule, true) || [];
var module = new CJSModule('<repl>');
module.paths =
CJSModule._resolveLookupPaths('<repl>', parentModule, true) || [];

var require = internalModule.makeRequireFunction(module);
var require = makeRequireFunction(module);
context.module = module;
context.require = require;

internalModule.addBuiltinLibsToObject(context);
addBuiltinLibsToObject(context);

return context;
};
Expand Down Expand Up @@ -889,7 +894,7 @@ function complete(line, callback) {
} else if (/^\.\.?\//.test(completeOn)) {
paths = [process.cwd()];
} else {
paths = module.paths.concat(Module.globalPaths);
paths = module.paths.concat(CJSModule.globalPaths);
}

for (i = 0; i < paths.length; i++) {
Expand Down
Loading

0 comments on commit 45c477c

Please sign in to comment.