summaryrefslogtreecommitdiff
path: root/lib/internal/main
diff options
context:
space:
mode:
authorguybedford <guybedford@gmail.com>2018-08-28 17:28:46 +0200
committerMyles Borins <mylesborins@google.com>2019-03-27 15:52:11 -0400
commitb1094dbe19f31f7a69ad16d193748f610b159073 (patch)
treebb623ea607ed54c27ef36ee9453f5623e19cbb90 /lib/internal/main
parent39141426d46a7e55d93ad2e8efa12ed86d223522 (diff)
downloadandroid-node-v8-b1094dbe19f31f7a69ad16d193748f610b159073.tar.gz
android-node-v8-b1094dbe19f31f7a69ad16d193748f610b159073.tar.bz2
android-node-v8-b1094dbe19f31f7a69ad16d193748f610b159073.zip
esm: phase two of new esm implementation
This PR updates the current `--experimental-modules` implementation based on the work of the modules team and reflects Phase 2 of our new modules plan. The largest differences from the current implementation include * `packge.type` which can be either `module` or `commonjs` - `type: "commonjs"`: - `.js` is parsed as commonjs - default for entry point without an extension is commonjs - `type: "module"`: - `.js` is parsed as esm - does not support loading JSON or Native Module by default - default for entry point without an extension is esm * `--entry-type=[mode]` - allows you set the type on entry point. * A new file extension `.cjs`. - this is specifically to support importing commonjs in the `module` mode. - this is only in the esm loader, the commonjs loader remains untouched, but the extension will work in the old loader if you use the full file path. * `--es-module-specifier-resolution=[type]` - options are `explicit` (default) and `node` - by default our loader will not allow for optional extensions in the import, the path for a module must include the extension if there is one - by default our loader will not allow for importing directories that have an index file - developers can use `--es-module-specifier-resolution=node` to enable the commonjs specifier resolution algorithm - This is not a “feature” but rather an implementation for experimentation. It is expected to change before the flag is removed * `--experimental-json-loader` - the only way to import json when `"type": "module"` - when enable all `import 'thing.json'` will go through the experimental loader independent of mode - based on https://github.com/whatwg/html/issues/4315 * You can use `package.main` to set an entry point for a module - the file extensions used in main will be resolved based on the `type` of the module Refs: https://github.com/nodejs/modules/blob/master/doc/plan-for-new-modules-implementation.md Refs: https://github.com/GeoffreyBooth/node-import-file-specifier-resolution-proposal Refs: https://github.com/nodejs/modules/pull/180 Refs: https://github.com/nodejs/ecmascript-modules/pull/6 Refs: https://github.com/nodejs/ecmascript-modules/pull/12 Refs: https://github.com/nodejs/ecmascript-modules/pull/28 Refs: https://github.com/nodejs/modules/issues/255 Refs: https://github.com/whatwg/html/issues/4315 Refs: https://github.com/w3c/webcomponents/issues/770 Co-authored-by: Myles Borins <MylesBorins@google.com> Co-authored-by: John-David Dalton <john.david.dalton@gmail.com> Co-authored-by: Evan Plaice <evanplaice@gmail.com> Co-authored-by: Geoffrey Booth <webmaster@geoffreybooth.com> Co-authored-by: Michaël Zasso <targos@protonmail.com> PR-URL: https://github.com/nodejs/node/pull/26745 Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Guy Bedford <guybedford@gmail.com> Reviewed-By: Ben Coe <bencoe@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com>
Diffstat (limited to 'lib/internal/main')
-rw-r--r--lib/internal/main/check_syntax.js36
-rw-r--r--lib/internal/main/eval_stdin.js6
-rw-r--r--lib/internal/main/eval_string.js10
-rw-r--r--lib/internal/main/repl.js6
4 files changed, 49 insertions, 9 deletions
diff --git a/lib/internal/main/check_syntax.js b/lib/internal/main/check_syntax.js
index 7df70b2720..8c73d522ed 100644
--- a/lib/internal/main/check_syntax.js
+++ b/lib/internal/main/check_syntax.js
@@ -11,12 +11,18 @@ const {
readStdin
} = require('internal/process/execution');
-const CJSModule = require('internal/modules/cjs/loader');
+const { pathToFileURL } = require('url');
+
const vm = require('vm');
const {
stripShebang, stripBOM
} = require('internal/modules/cjs/helpers');
+let CJSModule;
+function CJSModuleInit() {
+ if (!CJSModule)
+ CJSModule = require('internal/modules/cjs/loader');
+}
if (process.argv[1] && process.argv[1] !== '-') {
// Expand process.argv[1] into a full path.
@@ -25,7 +31,7 @@ if (process.argv[1] && process.argv[1] !== '-') {
// TODO(joyeecheung): not every one of these are necessary
prepareMainThreadExecution();
-
+ CJSModuleInit();
// Read the source.
const filename = CJSModule._resolveFilename(process.argv[1]);
@@ -34,20 +40,40 @@ if (process.argv[1] && process.argv[1] !== '-') {
markBootstrapComplete();
- checkScriptSyntax(source, filename);
+ checkSyntax(source, filename);
} else {
// TODO(joyeecheung): not every one of these are necessary
prepareMainThreadExecution();
+ CJSModuleInit();
markBootstrapComplete();
readStdin((code) => {
- checkScriptSyntax(code, '[stdin]');
+ checkSyntax(code, '[stdin]');
});
}
-function checkScriptSyntax(source, filename) {
+function checkSyntax(source, filename) {
// Remove Shebang.
source = stripShebang(source);
+
+ const { getOptionValue } = require('internal/options');
+ const experimentalModules = getOptionValue('--experimental-modules');
+ if (experimentalModules) {
+ let isModule = false;
+ if (filename === '[stdin]' || filename === '[eval]') {
+ isModule = getOptionValue('--entry-type') === 'module';
+ } else {
+ const resolve = require('internal/modules/esm/default_resolve');
+ const { format } = resolve(pathToFileURL(filename).toString());
+ isModule = format === 'module';
+ }
+ if (isModule) {
+ const { ModuleWrap } = internalBinding('module_wrap');
+ new ModuleWrap(source, filename);
+ return;
+ }
+ }
+
// Remove BOM.
source = stripBOM(source);
// Wrap it.
diff --git a/lib/internal/main/eval_stdin.js b/lib/internal/main/eval_stdin.js
index 2a2ef6d38a..4face9e61e 100644
--- a/lib/internal/main/eval_stdin.js
+++ b/lib/internal/main/eval_stdin.js
@@ -7,6 +7,7 @@ const {
} = require('internal/bootstrap/pre_execution');
const {
+ evalModule,
evalScript,
readStdin
} = require('internal/process/execution');
@@ -16,5 +17,8 @@ markBootstrapComplete();
readStdin((code) => {
process._eval = code;
- evalScript('[stdin]', process._eval, process._breakFirstLine);
+ if (require('internal/options').getOptionValue('--entry-type') === 'module')
+ evalModule(process._eval);
+ else
+ evalScript('[stdin]', process._eval, process._breakFirstLine);
});
diff --git a/lib/internal/main/eval_string.js b/lib/internal/main/eval_string.js
index 953fab386d..b032281925 100644
--- a/lib/internal/main/eval_string.js
+++ b/lib/internal/main/eval_string.js
@@ -6,11 +6,15 @@
const {
prepareMainThreadExecution
} = require('internal/bootstrap/pre_execution');
-const { evalScript } = require('internal/process/execution');
+const { evalModule, evalScript } = require('internal/process/execution');
const { addBuiltinLibsToObject } = require('internal/modules/cjs/helpers');
-const source = require('internal/options').getOptionValue('--eval');
+const { getOptionValue } = require('internal/options');
+const source = getOptionValue('--eval');
prepareMainThreadExecution();
addBuiltinLibsToObject(global);
markBootstrapComplete();
-evalScript('[eval]', source, process._breakFirstLine);
+if (getOptionValue('--entry-type') === 'module')
+ evalModule(source);
+else
+ evalScript('[eval]', source, process._breakFirstLine);
diff --git a/lib/internal/main/repl.js b/lib/internal/main/repl.js
index e6b9885351..c2bf54f8bb 100644
--- a/lib/internal/main/repl.js
+++ b/lib/internal/main/repl.js
@@ -13,6 +13,12 @@ const {
prepareMainThreadExecution();
+// --entry-type flag not supported in REPL
+if (require('internal/options').getOptionValue('--entry-type')) {
+ console.error('Cannot specify --entry-type for REPL');
+ process.exit(1);
+}
+
const cliRepl = require('internal/repl');
cliRepl.createInternalRepl(process.env, (err, repl) => {
if (err) {