Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/module.js')
-rw-r--r--lib/module.js58
1 files changed, 57 insertions, 1 deletions
diff --git a/lib/module.js b/lib/module.js
index 7bb8288f54f..0b87cf7480e 100644
--- a/lib/module.js
+++ b/lib/module.js
@@ -24,6 +24,7 @@
const NativeModule = require('native_module');
const util = require('util');
const internalModule = require('internal/module');
+const { getURLFromFilePath } = require('internal/url');
const vm = require('vm');
const assert = require('assert').ok;
const fs = require('fs');
@@ -32,6 +33,14 @@ const path = require('path');
const internalModuleReadFile = process.binding('fs').internalModuleReadFile;
const internalModuleStat = process.binding('fs').internalModuleStat;
const preserveSymlinks = !!process.binding('config').preserveSymlinks;
+const experimentalModules = !!process.binding('config').experimentalModules;
+
+const errors = require('internal/errors');
+
+const Loader = require('internal/loader/Loader');
+const ModuleJob = require('internal/loader/ModuleJob');
+const { createDynamicModule } = require('internal/loader/ModuleWrap');
+const ESMLoader = new Loader();
function stat(filename) {
filename = path._makeLong(filename);
@@ -412,7 +421,36 @@ Module._load = function(request, parent, isMain) {
debug('Module._load REQUEST %s parent: %s', request, parent.id);
}
- var filename = Module._resolveFilename(request, parent, isMain);
+ var filename = null;
+
+ if (isMain) {
+ let err;
+ try {
+ filename = Module._resolveFilename(request, parent, isMain);
+ } catch (e) {
+ // try to keep stack
+ e.stack;
+ err = e;
+ }
+ if (experimentalModules) {
+ if (filename === null || /\.mjs$/.test(filename)) {
+ try {
+ ESMLoader.import(request).catch((e) => {
+ console.error(e);
+ process.exit(1);
+ });
+ return;
+ } catch (e) {
+ // well, it isn't ESM
+ }
+ }
+ }
+ if (err) {
+ throw err;
+ }
+ } else {
+ filename = Module._resolveFilename(request, parent, isMain);
+ }
var cachedModule = Module._cache[filename];
if (cachedModule) {
@@ -482,6 +520,19 @@ Module.prototype.load = function(filename) {
if (!Module._extensions[extension]) extension = '.js';
Module._extensions[extension](this, filename);
this.loaded = true;
+
+ if (experimentalModules) {
+ const url = getURLFromFilePath(filename);
+ if (ESMLoader.moduleMap.has(`${url}`) !== true) {
+ const ctx = createDynamicModule(['default'], url);
+ ctx.reflect.exports.default.set(this.exports);
+ ESMLoader.moduleMap.set(`${url}`,
+ new ModuleJob(ESMLoader, ctx.module));
+ } else {
+ ESMLoader.moduleMap.get(`${url}`).moduleProvider.finish(
+ Module._cache[filename]);
+ }
+ }
};
@@ -578,6 +629,11 @@ Module._extensions['.node'] = function(module, filename) {
return process.dlopen(module, path._makeLong(filename));
};
+if (experimentalModules) {
+ Module._extensions['.mjs'] = function(module, filename) {
+ throw new errors.Error('ERR_REQUIRE_ESM', filename);
+ };
+}
// bootstrap main module.
Module.runMain = function() {