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:
authorBradley Farias <bradley.meck@gmail.com>2017-06-06 03:44:56 +0300
committerBradley Farias <bradley.meck@gmail.com>2017-09-07 23:18:32 +0300
commitc8a389e19f172edbada83f59944cad7cc802d9d5 (patch)
tree15a8653683a97ff0d6b2e7f08ef8081405700ea3 /lib/module.js
parent46133b5beba2c780fb3b9a9d6be610d09f752182 (diff)
module: Allow runMain to be ESM
This follows the EPS an allows the node CLI to have ESM as an entry point. `node ./example.mjs`. A newer V8 is needed for `import()` so that is not included. `import.meta` is still in specification stage so that also is not included. PR-URL: https://github.com/nodejs/node/pull/14369 Author: Bradley Farias <bradley.meck@gmail.com> Author: Guy Bedford <guybedford@gmail.com> Author: Jan Krems <jan.krems@groupon.com> Author: Timothy Gu <timothygu99@gmail.com> Author: Michaƫl Zasso <targos@protonmail.com> Author: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
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() {