diff --git a/deps/cjs-module-lexer/.gitignore b/deps/cjs-module-lexer/.gitignore new file mode 100755 index 00000000000000..55ee2f0d6cfb5d --- /dev/null +++ b/deps/cjs-module-lexer/.gitignore @@ -0,0 +1,11 @@ +node_modules +*.lock +test +.* +Makefile +bench +build.js +include-wasm +include +lib +src diff --git a/deps/cjs-module-lexer/LICENSE b/deps/cjs-module-lexer/LICENSE new file mode 100755 index 00000000000000..935b357962d08b --- /dev/null +++ b/deps/cjs-module-lexer/LICENSE @@ -0,0 +1,10 @@ +MIT License +----------- + +Copyright (C) 2018-2020 Guy Bedford + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deps/cjs-module-lexer/README.md b/deps/cjs-module-lexer/README.md new file mode 100755 index 00000000000000..97bec22b7d85a0 --- /dev/null +++ b/deps/cjs-module-lexer/README.md @@ -0,0 +1,259 @@ +# CJS Module Lexer + +[![Build Status][travis-image]][travis-url] + +A [very fast](#benchmarks) JS CommonJS module syntax lexer used to detect the most likely list of named exports of a CommonJS module. + +Outputs the list of named exports (`exports.name = ...`), whether the `__esModule` interop flag is used, and possible module reexports (`module.exports = require('...')`). + +For an example of the performance, Angular 1 (720KiB) is fully parsed in 5ms, in comparison to the fastest JS parser, Acorn which takes over 100ms. + +_Comprehensively handles the JS language grammar while remaining small and fast. - ~10ms per MB of JS cold and ~5ms per MB of JS warm, [see benchmarks](#benchmarks) for more info._ + +### Usage + +``` +npm install cjs-module-lexer +``` + +For use in CommonJS: + +```js +const { init, parse } = require('cjs-module-lexer'); + +(async () => { + // Init must be called first. + await init(); + + const { exports, reexports, esModule } = parse(` + // named exports detection + module.exports.a = 'a'; + (function () { + exports.b = 'b'; + })(); + Object.defineProperty(exports, 'c', { value: 'c' }); + /* exports.d = 'not detected'; */ + + // reexports detection + if (maybe) module.exports = require('./dep1.js'); + if (another) module.exports = require('./dep2.js'); + + // literal exports assignments + module.exports = { a, b: c, d, 'e': f } + + // __esModule detection + Object.defineProperty(module.exports, '__esModule', { value: true }) + `); + + // exports === ['a', 'b', 'c', '__esModule'] + // reexports === ['./dep1.js', './dep2.js'] +})(); +``` + +### Grammar + +CommonJS exports matches are run against the source token stream. + +The token grammar is: + +``` +IDENTIFIER: As defined by ECMA-262, without support for identifier `\` escapes, filtered to remove strict reserved words: + "implements", "interface", "let", "package", "private", "protected", "public", "static", "yield", "enum" + +STRING_LITERAL: A `"` or `'` bounded ECMA-262 string literal. + +IDENTIFIER_STRING: ( `"` IDENTIFIER `"` | `'` IDENTIFIER `'` ) + +COMMENT_SPACE: Any ECMA-262 whitespace, ECMA-262 block comment or ECMA-262 line comment + +MODULE_EXPORTS: `module` COMMENT_SPACE `.` COMMENT_SPACE `exports` + +EXPORTS_IDENTIFIER: MODULE_EXPORTS_IDENTIFIER | `exports` + +EXPORTS_DOT_ASSIGN: EXPORTS_IDENTIFIER COMMENT_SPACE `.` COMMENT_SPACE IDENTIFIER COMMENT_SPACE `=` + +EXPORTS_LITERAL_COMPUTED_ASSIGN: EXPORTS_IDENTIFIER COMMENT_SPACE `[` COMMENT_SPACE IDENTIFIER_STRING COMMENT_SPACE `]` COMMENT_SPACE `=` + +EXPORTS_LITERAL_PROP: (IDENTIFIER (COMMENT_SPACE `:` COMMENT_SPACE IDENTIFIER)?) | (IDENTIFIER_STRING COMMENT_SPACE `:` COMMENT_SPACE IDENTIFIER) + +EXPORTS_MEMBER: EXPORTS_DOT_ASSIGN | EXPORTS_LITERAL_COMPUTED_ASSIGN + +EXPORTS_DEFINE: `Object` COMMENT_SPACE `.` COMMENT_SPACE `defineProperty COMMENT_SPACE `(` EXPORTS_IDENTIFIER COMMENT_SPACE `,` COMMENT_SPACE IDENTIFIER_STRING + +EXPORTS_LITERAL: MODULE_EXPORTS COMMENT_SPACE `=` COMMENT_SPACE `{` COMMENT_SPACE (EXPORTS_LITERAL_PROP COMMENT_SPACE `,` COMMENT_SPACE)+ `}` + +REQUIRE: `require` COMMENT_SPACE `(` COMMENT_SPACE STRING_LITERAL COMMENT_SPACE `)` + +EXPORTS_ASSIGN: (`var` | `const` | `let`) IDENTIFIER `=` REQUIRE + +MODULE_EXPORTS_ASSIGN: MODULE_EXPORTS COMMENT_SPACE `=` COMMENT_SPACE REQUIRE + +EXPORT_STAR: (`__export` | `__exportStar`) `(` REQUIRE + +EXPORT_STAR_LIB: `Object.keys(` IDENTIFIER$1 `).forEach(function (` IDENTIFIER$2 `) {` + ( + `if (` IDENTIFIER$2 `===` ( `'default'` | `"default"` ) `||` IDENTIFIER$2 `===` ( '__esModule' | `"__esModule"` ) `) return` `;`? | + `if (` IDENTIFIER$2 `!==` ( `'default'` | `"default"` ) `)` + ) + ( + EXPORTS_IDENTIFIER `[` IDENTIFIER$2 `] =` IDENTIFIER$1 `[` IDENTIFIER$2 `]` `;`? | + `Object.defineProperty(` EXPORTS_IDENTIFIER `, ` IDENTIFIER$2 `, { enumerable: true, get: function () { return ` IDENTIFIER$1 `[` IDENTIFIER$2 `]` `;`? } })` `;`? + ) + `})` +``` + +* The returned export names are the matched `IDENTIFIER` and `IDENTIFIER_STRING` slots for all `EXPORTS_MEMBER`, `EXPORTS_DEFINE` and `EXPORTS_LITERAL` matches. +* The reexport specifiers are taken to be the `STRING_LITERAL` slots of all top-level `MODULE_EXPORTS_ASSIGN` and `EXPORT_STAR` `REQUIRE` matches as well as all `EXPORTS_ASSIGN` matches whose `IDENTIFIER` also matches the first `IDENTIFIER` in `EXPORT_STAR_LIB` + +### Not Supported + +#### No scope analysis: + +```js +// "a" WILL be detected as an export +(function (exports) { + exports.a = 'a'; +})(notExports); + +// "b" WONT be detected as an export +(function (m) { + m.a = 'a'; +})(exports); +``` + +#### `module.exports` require assignment only handled at the base-level + +```js +// OK +module.exports = require('./a.js'); + +// OK +if (condition) + module.exports = require('./b.js'); + +// NOT OK -> nested top-level detections not implemented +if (condition) { + module.exports = require('./c.js'); +} +(function () { + module.exports = require('./d.js'); +})(); +``` + +#### No object expression parsing + +```js +// These WONT be detected as exports +Object.defineProperties(exports, { + a: { value: 'a' }, + b: { value: 'b' } +}); + +module.exports = { + // These WILL be detected as exports + a: a, + b: b, + + // This WILL be detected as an export + e: require('d'), + + // These WONT be detected as exports + // because the object parser stops on the non-identifier + // expression "require('d')" + f: 'f' +} +``` + +#### Only specific transpiler-style star export patterns match + +```js +// './x' detected as star export +var x = require('./x'); +Object.keys(x).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return x[k]; + } + }); +}); + +// './y' detected as star export +let y = require('./y'); +Object.keys(y).forEach(function (kk) { + if (kk !== 'default') exports[kk] = y[kk]; +}); + +// './z' NOT detected as star export +let z = require('./z'); +for (const key of Object.keys(x)) { + exports[key] = x[key]; +} +``` + +These patterns can be updated over time to match modern transpiler outputs. + +### Environment Support + +Node.js 10+, and [all browsers with Web Assembly support](https://caniuse.com/#feat=wasm). + +### Grammar Support + +* Token state parses all line comments, block comments, strings, template strings, blocks, parens and punctuators. +* Division operator / regex token ambiguity is handled via backtracking checks against punctuator prefixes, including closing brace or paren backtracking. +* Always correctly parses valid JS source, but may parse invalid JS source without errors. + +### Benchmarks + +Benchmarks can be run with `npm run bench`. + +Current results: + +``` +Cold Run, All Samples +test/samples/*.js (3057 KiB) +> 24ms + +Warm Runs (average of 25 runs) +test/samples/angular.js (719 KiB) +> 5.12ms +test/samples/angular.min.js (188 KiB) +> 3.04ms +test/samples/d3.js (491 KiB) +> 4.08ms +test/samples/d3.min.js (274 KiB) +> 2.04ms +test/samples/magic-string.js (34 KiB) +> 0ms +test/samples/magic-string.min.js (20 KiB) +> 0ms +test/samples/rollup.js (902 KiB) +> 5.92ms +test/samples/rollup.min.js (429 KiB) +> 3.08ms + +Warm Runs, All Samples (average of 25 runs) +test/samples/*.js (3057 KiB) +> 17.4ms +``` + +### Building + +To build download the WASI SDK from https://github.com/CraneStation/wasi-sdk/releases. + +The Makefile assumes that the `clang` in PATH corresponds to LLVM 8 (provided by WASI SDK as well, or a standard clang 8 install can be used as well), and that `../wasi-sdk-6` contains the SDK as extracted above, which is important to locate the WASI sysroot. + +The build through the Makefile is then run via `make lib/lexer.wasm`, which can also be triggered via `npm run build-wasm` to create `dist/lexer.js`. + +On Windows it may be preferable to use the Linux subsystem. + +After the Web Assembly build, the CJS build can be triggered via `npm run build`. + +Optimization passes are run with [Binaryen](https://github.com/WebAssembly/binaryen) prior to publish to reduce the Web Assembly footprint. + +### License + +MIT + +[travis-url]: https://travis-ci.org/guybedford/es-module-lexer +[travis-image]: https://travis-ci.org/guybedford/es-module-lexer.svg?branch=master diff --git a/deps/cjs-module-lexer/dist/lexer.js b/deps/cjs-module-lexer/dist/lexer.js new file mode 100644 index 00000000000000..767b696999e379 --- /dev/null +++ b/deps/cjs-module-lexer/dist/lexer.js @@ -0,0 +1 @@ +"use strict";exports.parse=parse;exports.init=init;const A=new Set(["implements","interface","let","package","private","protected","public","static","yield","enum"]);let B,Q;function parse(Q,E="@"){if(!B)throw new Error("Not initialized");const g=(B.__heap_base.value||B.__heap_base)+4*Q.length-B.memory.buffer.byteLength;g>0&&B.memory.grow(Math.ceil(g/65536));const I=B.sa(Q.length);if(function(A,B){const Q=A.length;let E=0;for(;E{const A=await WebAssembly.compile((Q="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cg0AIAJB3ABGDQIgAhAmRQ0AIAFBfkF8IAJBgIAESRtqIQEgAhAnIQQMAQsLIARBAXFFDQAgAS8BAEEgRw0AQZSgASgCACICQagfKAIARg0AIAIgAEEEajYCDCACIAFBAmo2AgggAUF+aiEAQSAhAQNAIAFB//8DcUEgRyAAQQJqIANNckUEQCAALwEAIQEgAEF+aiEADAELCyABQf//A3FBjn9qIgFBAksNAAJAAkAgAUEBaw4CAgEACyAAQfYAQeEAEChFDQELQZSgASACQRBqNgIACws7AQF/AkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUYhBgsgBgvJFAEJf0GcoAFBnKABKAIAIgFBDGo2AgAgAUEKaiEFAkACQBAhQS5HDQBBnKABQZygASgCAEECajYCABAhIgFB6wBHBEAgAUHkAEcNAUGcoAEoAgAiAUECahAzRQ0BQZygASABQRxqNgIAIAFBGmohBRAhQShHDQFBnKABQZygASgCAEECajYCABAhEDRFDQEQIUEsRw0BQZygAUGcoAEoAgBBAmo2AgAQISIBQSdHQQAgAUEiRxsNAUGcoAFBnKABKAIAIgJBAmoiAzYCACACLwECECJFDQEgAUGcoAEoAgAiAi8BAEcNASADIAJBnB8oAgARAgAMAQtBnKABKAIAIgEvAQJB5QBHDQAgAS8BBEH5AEcNACABLwEGQfMARw0AIAFBBmohBUGcoAEgAUEIajYCABAhQShHDQBBnKABQZygASgCAEECajYCABAhQZygASgCACEHECJFDQBBnKABKAIAECFBKUcNAEGcoAFBnKABKAIAIgVBAmo2AgAQIUEuRw0AQZygAUGcoAEoAgBBAmo2AgAQIUHmAEcNAEGcoAEoAgAiAUECakHvAEHyAEHFAEHhAEHjAEHoABAkRQ0AQZygASABQQ5qNgIAECFBnKABKAIAIgJBfmohBUEoRw0AQZygASACQQJqNgIAECFB5gBHDQBBnKABKAIAIgFBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQG0UNAEGcoAEgAUEQajYCABAhQShHDQBBnKABQZygASgCAEECajYCABAhQZygASgCACEBECJFDQBBnKABKAIAIQMQIUEpRw0AQZygAUGcoAEoAgBBAmo2AgAQIUH7AEcNAEGcoAFBnKABKAIAQQJqNgIAECFB6QBHDQBBnKABKAIAIgIvAQJB5gBHDQAgAi8BBEEgRw0AQZygASACQQZqNgIAECFBKEcNAEGcoAFBnKABKAIAQQJqNgIAECEaQZygASgCACIAIAEgAyABayICEDoNAEGcoAEgACACQQF1IgNBAXRqNgIAAkACQBAhIgBBIUcEQCAAQT1HDQNBnKABKAIAIgAvAQJBPUcNAyAALwEEQT1HDQNBnKABIABBBmo2AgAQISIAQSdHQQAgAEEiRxsNA0GcoAEoAgAiBEECakHkAEHlAEHmAEHhAEH1AEHsAEH0ABAbRQ0DQZygASAEQRBqNgIAECEgAEcNA0GcoAFBnKABKAIAQQJqNgIAECFB/ABHDQNBnKABKAIAIgAvAQJB/ABHDQNBnKABIABBBGo2AgAQIRpBnKABKAIAIgAgASACEDoNA0GcoAEgACADQQF0ajYCABAhQT1HDQNBnKABKAIAIgAvAQJBPUcNAyAALwEEQT1HDQNBnKABIABBBmo2AgAQISIAQSdHQQAgAEEiRxsNA0GcoAEoAgAiBEECahA1RQ0DQZygASAEQRZqNgIAECEgAEcNA0GcoAFBnKABKAIAQQJqNgIAECFBKUcNA0GcoAFBnKABKAIAQQJqNgIAECFB8gBHDQNBnKABKAIAIgBBAmpB5QBB9ABB9QBB8gBB7gAQDkUNA0GcoAEgAEEMajYCABAhQTtGDQEMAgtBnKABKAIAIgAvAQJBPUcNAiAALwEEQT1HDQJBnKABIABBBmo2AgAQISIAQSdHQQAgAEEiRxsNAkGcoAEoAgAiBEECakHkAEHlAEHmAEHhAEH1AEHsAEH0ABAbRQ0CQZygASAEQRBqNgIAECEgAEcNAkGcoAFBnKABKAIAQQJqNgIAECFBKUcNAgtBnKABQZygASgCAEECajYCAAsgB2siBkEBdSEEAkAQISIAEDQEQBAhQdsARw0CQZygAUGcoAEoAgBBAmo2AgAQIRpBnKABKAIAIgAgASACEDoNAkGcoAEgACADQQF0ajYCABAhQd0ARw0CQZygAUGcoAEoAgBBAmo2AgAQIUE9Rw0CQZygAUGcoAEoAgBBAmo2AgAQIRpBnKABKAIAIgAgByAGEDoNAkGcoAEgACAEQQF0ajYCABAhQdsARw0CQZygAUGcoAEoAgBBAmo2AgAQIRpBnKABKAIAIgAgASACEDoNAkGcoAEgACADQQF0ajYCABAhQd0ARw0CDAELIABBzwBHDQFBnKABKAIAIgBBAmpB4gBB6gBB5QBB4wBB9AAQDkUNAUGcoAEgAEEMajYCABAhQS5HDQFBnKABQZygASgCAEECajYCABAhQeQARw0BQZygASgCACIAQQJqEDNFDQFBnKABIABBHGo2AgAQIUEoRw0BQZygAUGcoAEoAgBBAmo2AgAQIRA0RQ0BECFBLEcNAUGcoAFBnKABKAIAQQJqNgIAECEaQZygASgCACIAIAEgAhA6DQFBnKABIAAgA0EBdGo2AgAQIUEsRw0BQZygAUGcoAEoAgBBAmo2AgAQIUH7AEcNAUGcoAFBnKABKAIAQQJqNgIAECFB5QBHDQFBnKABKAIAIgBBAmoQNkUNAUGcoAEgAEEUajYCABAhQTpHDQFBnKABQZygASgCAEECajYCABAhQZygASgCACEAQfQARwRAIAAvAQJB8gBHDQIgAC8BBEH1AEcNAiAALwEGQeUARw0CC0GcoAEgAEEIajYCABAhQSxHDQFBnKABQZygASgCAEECajYCABAhQecARw0BQZygASgCACIALwECQeUARw0BIAAvAQRB9ABHDQFBnKABIABBBmo2AgAQIUE6Rw0BQZygAUGcoAEoAgBBAmo2AgAQIUHmAEcNAUGcoAEoAgAiAEECakH1AEHuAEHjAEH0AEHpAEHvAEHuABAbRQ0BQZygASAAQRBqNgIAECFBKEcNAUGcoAFBnKABKAIAQQJqNgIAECFBKUcNAUGcoAFBnKABKAIAQQJqNgIAECFB+wBHDQFBnKABQZygASgCAEECajYCABAhQfIARw0BQZygASgCACIAQQJqQeUAQfQAQfUAQfIAQe4AEA5FDQFBnKABIABBDGo2AgAQIRpBnKABKAIAIgAgByAGEDoNAUGcoAEgACAEQQF0ajYCABAhQdsARw0BQZygAUGcoAEoAgBBAmo2AgAQIRpBnKABKAIAIgAgASACEDoNAUGcoAEgACADQQF0ajYCABAhQd0ARw0BQZygAUGcoAEoAgBBAmo2AgAQISIBQTtGBH9BnKABQZygASgCAEECajYCABAhBSABC0H9AEcNAUGcoAFBnKABKAIAQQJqNgIAECFB/QBHDQFBnKAB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","function"==typeof atob?Uint8Array.from(atob(Q),A=>A.charCodeAt(0)):Buffer.from(Q,"base64")));var Q;const{exports:E}=await WebAssembly.instantiate(A);B=E})())} \ No newline at end of file diff --git a/deps/cjs-module-lexer/dist/lexer.mjs b/deps/cjs-module-lexer/dist/lexer.mjs new file mode 100644 index 00000000000000..13b6e77aee4454 --- /dev/null +++ b/deps/cjs-module-lexer/dist/lexer.mjs @@ -0,0 +1,2 @@ +/* cjs-module-lexer 0.2.12 */ +const A=new Set(["implements","interface","let","package","private","protected","public","static","yield","enum"]);let B,Q;export function parse(Q,E="@"){if(!B)throw new Error("Not initialized");const g=(B.__heap_base.value||B.__heap_base)+4*Q.length-B.memory.buffer.byteLength;g>0&&B.memory.grow(Math.ceil(g/65536));const I=B.sa(Q.length);if(function(A,B){const Q=A.length;let E=0;for(;E{const A=await WebAssembly.compile((Q="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cg0AIAJB3ABGDQIgAhAmRQ0AIAFBfkF8IAJBgIAESRtqIQEgAhAnIQQMAQsLIARBAXFFDQAgAS8BAEEgRw0AQZSgASgCACICQagfKAIARg0AIAIgAEEEajYCDCACIAFBAmo2AgggAUF+aiEAQSAhAQNAIAFB//8DcUEgRyAAQQJqIANNckUEQCAALwEAIQEgAEF+aiEADAELCyABQf//A3FBjn9qIgFBAksNAAJAAkAgAUEBaw4CAgEACyAAQfYAQeEAEChFDQELQZSgASACQRBqNgIACws7AQF/AkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUYhBgsgBgvJFAEJf0GcoAFBnKABKAIAIgFBDGo2AgAgAUEKaiEFAkACQBAhQS5HDQBBnKABQZygASgCAEECajYCABAhIgFB6wBHBEAgAUHkAEcNAUGcoAEoAgAiAUECahAzRQ0BQZygASABQRxqNgIAIAFBGmohBRAhQShHDQFBnKABQZygASgCAEECajYCABAhEDRFDQEQIUEsRw0BQZygAUGcoAEoAgBBAmo2AgAQISIBQSdHQQAgAUEiRxsNAUGcoAFBnKABKAIAIgJBAmoiAzYCACACLwECECJFDQEgAUGcoAEoAgAiAi8BAEcNASADIAJBnB8oAgARAgAMAQtBnKABKAIAIgEvAQJB5QBHDQAgAS8BBEH5AEcNACABLwEGQfMARw0AIAFBBmohBUGcoAEgAUEIajYCABAhQShHDQBBnKABQZygASgCAEECajYCABAhQZygASgCACEHECJFDQBBnKABKAIAECFBKUcNAEGcoAFBnKABKAIAIgVBAmo2AgAQIUEuRw0AQZygAUGcoAEoAgBBAmo2AgAQIUHmAEcNAEGcoAEoAgAiAUECakHvAEHyAEHFAEHhAEHjAEHoABAkRQ0AQZygASABQQ5qNgIAECFBnKABKAIAIgJBfmohBUEoRw0AQZygASACQQJqNgIAECFB5gBHDQBBnKABKAIAIgFBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQG0UNAEGcoAEgAUEQajYCABAhQShHDQBBnKABQZygASgCAEECajYCABAhQZygASgCACEBECJFDQBBnKABKAIAIQMQIUEpRw0AQZygAUGcoAEoAgBBAmo2AgAQIUH7AEcNAEGcoAFBnKABKAIAQQJqNgIAECFB6QBHDQBBnKABKAIAIgIvAQJB5gBHDQAgAi8BBEEgRw0AQZygASACQQZqNgIAECFBKEcNAEGcoAFBnKABKAIAQQJqNgIAECEaQZygASgCACIAIAEgAyABayICEDoNAEGcoAEgACACQQF1IgNBAXRqNgIAAkACQBAhIgBBIUcEQCAAQT1HDQNBnKABKAIAIgAvAQJBPUcNAyAALwEEQT1HDQNBnKABIABBBmo2AgAQISIAQSdHQQAgAEEiRxsNA0GcoAEoAgAiBEECakHkAEHlAEHmAEHhAEH1AEHsAEH0ABAbRQ0DQZygASAEQRBqNgIAECEgAEcNA0GcoAFBnKABKAIAQQJqNgIAECFB/ABHDQNBnKABKAIAIgAvAQJB/ABHDQNBnKABIABBBGo2AgAQIRpBnKABKAIAIgAgASACEDoNA0GcoAEgACADQQF0ajYCABAhQT1HDQNBnKABKAIAIgAvAQJBPUcNAyAALwEEQT1HDQNBnKABIABBBmo2AgAQISIAQSdHQQAgAEEiRxsNA0GcoAEoAgAiBEECahA1RQ0DQZygASAEQRZqNgIAECEgAEcNA0GcoAFBnKABKAIAQQJqNgIAECFBKUcNA0GcoAFBnKABKAIAQQJqNgIAECFB8gBHDQNBnKABKAIAIgBBAmpB5QBB9ABB9QBB8gBB7gAQDkUNA0GcoAEgAEEMajYCABAhQTtGDQEMAgtBnKABKAIAIgAvAQJBPUcNAiAALwEEQT1HDQJBnKABIABBBmo2AgAQISIAQSdHQQAgAEEiRxsNAkGcoAEoAgAiBEECakHkAEHlAEHmAEHhAEH1AEHsAEH0ABAbRQ0CQZygASAEQRBqNgIAECEgAEcNAkGcoAFBnKABKAIAQQJqNgIAECFBKUcNAgtBnKABQZygASgCAEECajYCAAsgB2siBkEBdSEEAkAQISIAEDQEQBAhQdsARw0CQZygAUGcoAEoAgBBAmo2AgAQIRpBnKABKAIAIgAgASACEDoNAkGcoAEgACADQQF0ajYCABAhQd0ARw0CQZygAUGcoAEoAgBBAmo2AgAQIUE9Rw0CQZygAUGcoAEoAgBBAmo2AgAQIRpBnKABKAIAIgAgByAGEDoNAkGcoAEgACAEQQF0ajYCABAhQdsARw0CQZygAUGcoAEoAgBBAmo2AgAQIRpBnKABKAIAIgAgASACEDoNAkGcoAEgACADQQF0ajYCABAhQd0ARw0CDAELIABBzwBHDQFBnKABKAIAIgBBAmpB4gBB6gBB5QBB4wBB9AAQDkUNAUGcoAEgAEEMajYCABAhQS5HDQFBnKABQZygASgCAEECajYCABAhQeQARw0BQZygASgCACIAQQJqEDNFDQFBnKABIABBHGo2AgAQIUEoRw0BQZygAUGcoAEoAgBBAmo2AgAQIRA0RQ0BECFBLEcNAUGcoAFBnKABKAIAQQJqNgIAECEaQZygASgCACIAIAEgAhA6DQFBnKABIAAgA0EBdGo2AgAQIUEsRw0BQZygAUGcoAEoAgBBAmo2AgAQIUH7AEcNAUGcoAFBnKABKAIAQQJqNgIAECFB5QBHDQFBnKABKAIAIgBBAmoQNkUNAUGcoAEgAEEUajYCABAhQTpHDQFBnKABQZygASgCAEECajYCABAhQZygASgCACEAQfQARwRAIAAvAQJB8gBHDQIgAC8BBEH1AEcNAiAALwEGQeUARw0CC0GcoAEgAEEIajYCABAhQSxHDQFBnKABQZygASgCAEECajYCABAhQecARw0BQZygASgCACIALwECQeUARw0BIAAvAQRB9ABHDQFBnKABIABBBmo2AgAQIUE6Rw0BQZygAUGcoAEoAgBBAmo2AgAQIUHmAEcNAUGcoAEoAgAiAEECakH1AEHuAEHjAEH0AEHpAEHvAEHuABAbRQ0BQZygASAAQRBqNgIAECFBKEcNAUGcoAFBnKABKAIAQQJqNgIAECFBKUcNAUGcoAFBnKABKAIAQQJqNgIAECFB+wBHDQFBnKABQZygASgCAEECajYCABAhQfIARw0BQZygASgCACIAQQJqQeUAQfQAQfUAQfIAQe4AEA5FDQFBnKABIABBDGo2AgAQIRpBnKABKAIAIgAgByAGEDoNAUGcoAEgACAEQQF0ajYCABAhQdsARw0BQZygAUGcoAEoAgBBAmo2AgAQIRpBnKABKAIAIgAgASACEDoNAUGcoAEgACADQQF0ajYCABAhQd0ARw0BQZygAUGcoAEoAgBBAmo2AgAQISIBQTtGBH9BnKABQZygASgCAEECajYCABAhBSABC0H9AEcNAUGcoAFBnKABKAIAQQJqNgIAECFB/QBHDQFBnKAB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","function"==typeof atob?Uint8Array.from(atob(Q),A=>A.charCodeAt(0)):Buffer.from(Q,"base64")));var Q;const{exports:E}=await WebAssembly.instantiate(A);B=E})())} \ No newline at end of file diff --git a/deps/cjs-module-lexer/include/cjs-module-lexer.h b/deps/cjs-module-lexer/include/cjs-module-lexer.h new file mode 100755 index 00000000000000..11aafa6881c275 --- /dev/null +++ b/deps/cjs-module-lexer/include/cjs-module-lexer.h @@ -0,0 +1,102 @@ +#ifndef __CJS_MODULE_LEXER_H__ +#define __CJS_MODULE_LEXER_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include + +struct Slice { + const uint16_t* start; + const uint16_t* end; +}; +typedef struct Slice Slice; + +struct StarExportBinding { + const uint16_t* specifier_start; + const uint16_t* specifier_end; + const uint16_t* id_start; + const uint16_t* id_end; +}; +typedef struct StarExportBinding StarExportBinding; + +void bail (uint32_t err); + +bool parseCJS (uint16_t* source, uint32_t sourceLen, void (*addExport)(const uint16_t*, const uint16_t*), void (*addReexport)(const uint16_t*, const uint16_t*)); + +void tryBacktrackAddStarExportBinding (uint16_t* pos); +bool tryParseRequire (bool directStarExport); +void tryParseLiteralExports (); +bool readExportsOrModuleDotExports (uint16_t ch); +void tryParseModuleExportsDotAssign (); +void tryParseExportsDotAssign (bool assign); +void tryParseObjectDefineOrKeys (); +bool identifier (uint16_t ch); + +void throwIfImportStatement (); +void throwIfExportStatement (); + +void readImportString (const uint16_t* ss, uint16_t ch); +uint16_t readExportAs (uint16_t* startPos, uint16_t* endPos); + +uint16_t commentWhitespace (); +void singleQuoteString (); +void doubleQuoteString (); +void regularExpression (); +void templateString (); +void blockComment (); +void lineComment (); + +uint16_t readToWsOrPunctuator (uint16_t ch); + +uint32_t fullCharCodeAtLast (uint16_t* pos); +bool isIdentifierStart (uint32_t code); +bool isIdentifierChar (uint32_t code); +int charCodeByteLen (uint32_t ch); + +bool isBr (uint16_t c); +bool isBrOrWs (uint16_t c); +bool isBrOrWsOrPunctuator (uint16_t c); +bool isBrOrWsOrPunctuatorNotDot (uint16_t c); + +bool str_eq2 (uint16_t* pos, uint16_t c1, uint16_t c2); +bool str_eq3 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3); +bool str_eq4 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4); +bool str_eq5 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5); +bool str_eq6 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6); +bool str_eq7 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7); +bool str_eq9 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9); +bool str_eq10 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9, uint16_t c10); +bool str_eq13 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9, uint16_t c10, uint16_t c11, uint16_t c12, uint16_t c13); +bool str_eq18 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9, uint16_t c10, uint16_t c11, uint16_t c12, uint16_t c13, uint16_t c14, uint16_t c15, uint16_t c16, uint16_t c17, uint16_t c18); + +bool readPrecedingKeyword2(uint16_t* pos, uint16_t c1, uint16_t c2); +bool readPrecedingKeyword3(uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3); +bool readPrecedingKeyword4(uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4); +bool readPrecedingKeyword5(uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5); +bool readPrecedingKeyword6(uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6); +bool readPrecedingKeyword7(uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7); + +bool keywordStart (uint16_t* pos); +bool isExpressionKeyword (uint16_t* pos); +bool isParenKeyword (uint16_t* pos); +bool isPunctuator (uint16_t charCode); +bool isExpressionPunctuator (uint16_t charCode); +bool isExpressionTerminator (uint16_t* pos); + +void nextChar (uint16_t ch); +void nextCharSurrogate (uint16_t ch); +uint16_t readChar (); + +void syntaxError (); + +#ifdef __cplusplus +} +#endif + +#endif /* __CJS_MODULE_LEXER_H__ */ \ No newline at end of file diff --git a/deps/cjs-module-lexer/package.json b/deps/cjs-module-lexer/package.json new file mode 100755 index 00000000000000..af11bce5772264 --- /dev/null +++ b/deps/cjs-module-lexer/package.json @@ -0,0 +1,36 @@ +{ + "name": "cjs-module-lexer", + "version": "0.2.12", + "description": "Lexes CommonJS modules, returning their named exports metadata", + "main": "dist/lexer.js", + "module": "dist/lexer.mjs", + "scripts": { + "test": "NODE_OPTIONS=\"--experimental-modules\" mocha -b -u tdd test/*.cjs", + "build": "node --experimental-modules build.js && babel dist/lexer.mjs | terser -o dist/lexer.js", + "build-wasm": "make lib/lexer.wasm && node build.js", + "bench": "node --experimental-modules --expose-gc bench/index.js", + "prepublishOnly": "make optimize && npm run build", + "footprint": "make optimize && npm run build && cat dist/lexer.js | gzip -9f | wc -c" + }, + "author": "Guy Bedford", + "license": "MIT", + "devDependencies": { + "@babel/cli": "^7.5.5", + "@babel/core": "^7.5.5", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "kleur": "^2.0.2", + "mocha": "^5.2.0", + "terser": "^4.1.4" + }, + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/guybedford/cjs-module-lexer.git" + }, + "bugs": { + "url": "https://github.com/guybedford/cjs-module-lexer/issues" + }, + "homepage": "https://github.com/guybedford/cjs-module-lexer#readme" +} diff --git a/deps/cjs-module-lexer/src/lexer.c b/deps/cjs-module-lexer/src/lexer.c new file mode 100755 index 00000000000000..739f068456ca48 --- /dev/null +++ b/deps/cjs-module-lexer/src/lexer.c @@ -0,0 +1,1246 @@ +#include "cjs-module-lexer.h" + +const uint16_t* STANDARD_IMPORT = (uint16_t*)0x1; +const uint16_t* IMPORT_META = (uint16_t*)0x2; +const uint16_t __empty_char = '\0'; +const uint16_t* EMPTY_CHAR = &__empty_char; +// tracked depth of template and brackets +#define STACK_DEPTH 2048 +// tracked number of star exports +#define MAX_STAR_EXPORTS 256 +const uint16_t* source; + +bool lastSlashWasDivision; +uint16_t templateStackDepth; +uint16_t openTokenDepth; +uint16_t templateDepth; +uint16_t braceDepth; +uint16_t* lastTokenPos; +uint16_t* pos; +uint16_t* end; +uint16_t* templateStack; +uint16_t** openTokenPosStack; +StarExportBinding* starExportStack; +bool nextBraceIsClass; + +uint16_t* lastReexportStart; +uint16_t* lastReexportEnd; + +// Memory Structure: +// -> source +// -> analysis starts after source +uint32_t parse_error; +bool has_error = false; +uint32_t sourceLen; + +uint16_t templateStack_[STACK_DEPTH]; +uint16_t* openTokenPosStack_[STACK_DEPTH]; +bool openClassPosStack[STACK_DEPTH]; +StarExportBinding starExportStack_[MAX_STAR_EXPORTS]; +const StarExportBinding* STAR_EXPORT_STACK_END = &starExportStack_[MAX_STAR_EXPORTS - 1]; + +void (*addExport)(const uint16_t*, const uint16_t*); +void (*addReexport)(const uint16_t*, const uint16_t*); + +// Note: parsing is based on the _assumption_ that the source is already valid +bool parseCJS (uint16_t* _source, uint32_t _sourceLen, void (*_addExport)(const uint16_t*, const uint16_t*), void (*_addReexport)(const uint16_t*, const uint16_t*)) { + source = _source; + sourceLen = _sourceLen; + if (_addExport) + addExport = _addExport; + if (_addReexport) + addReexport = _addReexport; + + templateStackDepth = 0; + openTokenDepth = 0; + templateDepth = UINT16_MAX; + lastTokenPos = (uint16_t*)EMPTY_CHAR; + lastSlashWasDivision = false; + parse_error = 0; + has_error = false; + templateStack = &templateStack_[0]; + openTokenPosStack = &openTokenPosStack_[0]; + starExportStack = &starExportStack_[0]; + nextBraceIsClass = false; + + pos = (uint16_t*)(source - 1); + uint16_t ch = '\0'; + end = pos + sourceLen; + + // Handle #! + if (*source == '#' && *(source + 1) == '!') { + if (sourceLen == 2) + return true; + pos += 2; + while (pos++ < end) { + ch = *pos; + if (ch == '\n' || ch == '\r') + break; + } + } + + while (pos++ < end) { + ch = *pos; + + if (ch == 32 || ch < 14 && ch > 8) + continue; + + switch (ch) { + case 'e': + if (str_eq5(pos + 1, 'x', 'p', 'o', 'r', 't') && keywordStart(pos)) { + if (*(pos + 6) == 's') + tryParseExportsDotAssign(false); + else if (openTokenDepth == 0) + throwIfExportStatement(); + } + break; + case 'i': + if (str_eq5(pos + 1, 'm', 'p', 'o', 'r', 't') && keywordStart(pos)) + throwIfImportStatement(); + break; + case 'c': + if (keywordStart(pos) && str_eq4(pos + 1, 'l', 'a', 's', 's') && isBrOrWs(*(pos + 5))) + nextBraceIsClass = true; + break; + case 'm': + if (str_eq5(pos + 1, 'o', 'd', 'u', 'l', 'e') && keywordStart(pos)) + tryParseModuleExportsDotAssign(); + break; + case 'O': + if (str_eq5(pos + 1, 'b', 'j', 'e', 'c', 't') && keywordStart(pos)) + tryParseObjectDefineOrKeys(); + break; + case 'r': { + uint16_t* startPos = pos; + if (openTokenDepth == 0 && tryParseRequire(false) && keywordStart(startPos)) + tryBacktrackAddStarExportBinding(startPos - 1); + break; + } + case '_': + if (openTokenDepth == 0 && str_eq7(pos + 1, '_', 'e', 'x', 'p', 'o', 'r', 't') && (keywordStart(pos) || *(pos - 1) == '.')) { + pos += 8; + if (str_eq4(pos, 'S', 't', 'a', 'r')) + pos += 4; + if (*pos == '(') { + openTokenPosStack[openTokenDepth++] = lastTokenPos; + if (*(++pos) == 'r') + tryParseRequire(true); + } + } + break; + case '(': + openTokenPosStack[openTokenDepth++] = lastTokenPos; + break; + case ')': + if (openTokenDepth == 0) + return syntaxError(), false; + openTokenDepth--; + break; + case '{': + openClassPosStack[openTokenDepth] = nextBraceIsClass; + nextBraceIsClass = false; + openTokenPosStack[openTokenDepth++] = lastTokenPos; + break; + case '}': + if (openTokenDepth == 0) + return syntaxError(), false; + if (openTokenDepth-- == templateDepth) { + templateDepth = templateStack[--templateStackDepth]; + templateString(); + } + else { + if (templateDepth != UINT16_MAX && openTokenDepth < templateDepth) + return syntaxError(), false; + } + break; + case '<': + // TODO: +```js +import packageMain from 'commonjs-package'; // Works + +import { method } from 'commonjs-package'; // Errors +``` + +Support is provided for detecting named exports on CommonJS modules that are +transpiled from ES modules and expose the `__esModule` "flag" export. + The _specifier_ of an `import` statement (the string after the `from` keyword) can either be an URL-style relative path like `'./file.mjs'` or a package name like `'fs'`. @@ -261,18 +275,6 @@ defined in `"exports"`. import { sin, cos } from 'geometry/trigonometry-functions.mjs'; ``` -Only the “default export” is supported for CommonJS files or packages: - - -```js -import packageMain from 'commonjs-package'; // Works - -import { method } from 'commonjs-package'; // Errors -``` - -It is also possible to -[import an ES or CommonJS module for its side effects only][]. - ### `import()` expressions [Dynamic `import()`][] is supported in both CommonJS and ES modules. It can be @@ -330,6 +332,48 @@ syncBuiltinESMExports(); fs.readFileSync === readFileSync; ``` +## Transpiled CommonJS exports + +CommonJS modules that export the `__esModule` special transpiled module flag +will have their named exports detected via static analysis. + +The `default` export will continue to refer to the full `module.exports` +object to retain full compability with normal CJS import semantics. + +Importing a normal CJS module: + + +```js +// Provides the module.exports value: +import cjs from 'cjs'; +// Throws named export not defined: +import { name } from 'cjs'; +``` + +Importing a transpiled CJS module with `__esModule`: + + +```js +// Provides the module.exports value: +import cjs from 'transpiled-esm'; +// Provides the module.exports.name value: +import { name } from 'transpiled-esm'; +``` + +The ES Module named exports for a CommonJS module are not live bindings and any +changes to `exports.name` for the CommonJS module in the above do not update the +`name` binding. The only way to read the live binding is via `cjs.name`. + +The named exports detection uses a static analysis [heuristical best-effort +detection of the named exports](https://github.com/guybedford/cjs-module-lexer). +The reason for this approach is that named exports in the ES module loader need +to known ahead of execution time. + +This analysis approach may over-classify and provide named exports that do not +exist on the CommonJS module. Any properties defined on `exports` that are +getters will trigger those getters as soon as the CommonJS module is loaded by +the ES module loader, which may cause side effects. + ## Experimental JSON modules Currently importing JSON modules are only supported in the `commonjs` mode @@ -1152,7 +1196,6 @@ success! [`TypedArray`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray [`Uint8Array`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array [`util.TextDecoder`]: util.html#util_class_util_textdecoder -[import an ES or CommonJS module for its side effects only]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Import_a_module_for_its_side_effects_only [special scheme]: https://url.spec.whatwg.org/#special-scheme [the official standard format]: https://tc39.github.io/ecma262/#sec-modules [transpiler loader example]: #esm_transpiler_loader diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 058cb9b0f3d21d..2a9bb5caac8b93 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -21,12 +21,6 @@ 'use strict'; -// Set first due to cycle with ESM loader functions. -module.exports = { - wrapSafe, Module, toRealPath, readPackageScope, - get hasLoadedAnyUserCJSModule() { return hasLoadedAnyUserCJSModule; } -}; - const { ArrayIsArray, ArrayPrototypeJoin, @@ -54,6 +48,15 @@ const { StringPrototypeStartsWith, } = primordials; +// Map used to store CJS parsing data. +const cjsParseCache = new SafeWeakMap(); + +// Set first due to cycle with ESM loader functions. +module.exports = { + wrapSafe, Module, toRealPath, readPackageScope, cjsParseCache, + get hasLoadedAnyUserCJSModule() { return hasLoadedAnyUserCJSModule; } +}; + const { NativeModule } = require('internal/bootstrap/loaders'); const { getSourceMapsEnabled, @@ -759,16 +762,21 @@ Module._load = function(request, parent, isMain) { const cachedModule = Module._cache[filename]; if (cachedModule !== undefined) { updateChildren(parent, cachedModule, true); - if (!cachedModule.loaded) - return getExportsForCircularRequire(cachedModule); - return cachedModule.exports; + if (!cachedModule.loaded) { + const parseCachedModule = cjsParseCache.get(cachedModule); + if (!parseCachedModule || parseCachedModule.loaded) + return getExportsForCircularRequire(cachedModule); + parseCachedModule.loaded = true; + } else { + return cachedModule.exports; + } } const mod = loadNativeModule(filename, request); if (mod && mod.canBeRequiredByUsers) return mod.exports; // Don't call updateChildren(), Module constructor already does. - const module = new Module(filename, parent); + const module = cachedModule || new Module(filename, parent); if (isMain) { process.mainModule = module; @@ -1107,7 +1115,15 @@ Module._extensions['.js'] = function(module, filename) { throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath); } } - const content = fs.readFileSync(filename, 'utf8'); + // If already analyzed the source, then it will be cached. + const cached = cjsParseCache.get(module); + let content; + if (cached && cached.source) { + content = cached.source; + cached.source = undefined; + } else { + content = fs.readFileSync(filename, 'utf8'); + } module._compile(content, filename); }; diff --git a/lib/internal/modules/esm/module_job.js b/lib/internal/modules/esm/module_job.js index 4ffa8db9dab903..d962373c5b2dec 100644 --- a/lib/internal/modules/esm/module_job.js +++ b/lib/internal/modules/esm/module_job.js @@ -103,21 +103,21 @@ class ModuleJob { ' does not provide an export named')) { const splitStack = StringPrototypeSplit(e.stack, '\n'); const parentFileUrl = splitStack[0]; - const childSpecifier = StringPrototypeMatch(e.message, /module '(.*)' does/)[1]; + const [, childSpecifier, name] = StringPrototypeMatch(e.message, + /module '(.*)' does not provide an export named '(.+)'/); const childFileURL = - await this.loader.resolve(childSpecifier, parentFileUrl); + await this.loader.resolve(childSpecifier, parentFileUrl); const format = await this.loader.getFormat(childFileURL); if (format === 'commonjs') { const importStatement = splitStack[1]; const namedImports = StringPrototypeMatch(importStatement, /{.*}/)[0]; const destructuringAssignment = StringPrototypeReplace(namedImports, /\s+as\s+/g, ': '); - e.message = `The requested module '${childSpecifier}' is expected ` + - 'to be of type CommonJS, which does not support named exports. ' + - 'CommonJS modules can be imported by importing the default ' + - 'export.\n' + - 'For example:\n' + - `import pkg from '${childSpecifier}';\n` + - `const ${destructuringAssignment} = pkg;`; + e.message = `Named export '${name}' not found. The requested module` + + ` '${childSpecifier}' is of type CommonJS, which may not support ` + + 'all module.exports via named exports.\nCommonJS modules can also' + + ' be reliably imported via the default export, for example using:' + + `\n\nimport pkg from '${childSpecifier}';\n` + + `const ${destructuringAssignment} = pkg;\n`; const newStack = StringPrototypeSplit(e.stack, '\n'); newStack[3] = `SyntaxError: ${e.message}`; e.stack = ArrayPrototypeJoin(newStack, '\n'); diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js index bb095446bc27eb..0b6198fbbb4528 100644 --- a/lib/internal/modules/esm/translators.js +++ b/lib/internal/modules/esm/translators.js @@ -3,11 +3,15 @@ /* global WebAssembly */ const { + ArrayPrototypeIncludes, + Boolean, JSONParse, ObjectKeys, PromisePrototypeCatch, PromiseReject, + ObjectPrototypeHasOwnProperty, SafeMap, + SafeSet, StringPrototypeReplace, } = primordials; @@ -17,11 +21,16 @@ function lazyTypes() { return _TYPES = require('internal/util/types'); } +const { readFileSync } = require('fs'); +const { extname } = require('path'); const { stripBOM, loadNativeModule } = require('internal/modules/cjs/helpers'); -const CJSModule = require('internal/modules/cjs/loader').Module; +const { + Module: CJSModule, + cjsParseCache +} = require('internal/modules/cjs/loader'); const internalURLModule = require('internal/url'); const { defaultGetSource } = require( 'internal/modules/esm/get_source'); @@ -44,12 +53,15 @@ const { ModuleWrap } = moduleWrap; const { getOptionValue } = require('internal/options'); const experimentalImportMetaResolve = getOptionValue('--experimental-import-meta-resolve'); +const asyncESM = require('internal/process/esm_loader'); +const { init: cjsInit, parse: cjsParse } = + require('internal/deps/cjs-module-lexer/dist/lexer'); + +let cjsParserInitialized = false; const translators = new SafeMap(); exports.translators = translators; -const asyncESM = require('internal/process/esm_loader'); - let DECODER = null; function assertBufferSource(body, allowString, hookName) { if (allowString && typeof body === 'string') { @@ -104,7 +116,7 @@ function initializeImportMeta(meta, { url }) { meta.url = url; } -// Strategy for loading a standard JavaScript module +// Strategy for loading a standard JavaScript module. translators.set('module', async function moduleStrategy(url) { let { source } = await this._getSource( url, { format: 'module' }, defaultGetSource); @@ -125,23 +137,106 @@ translators.set('module', async function moduleStrategy(url) { // Strategy for loading a node-style CommonJS module const isWindows = process.platform === 'win32'; const winSepRegEx = /\//g; -translators.set('commonjs', function commonjsStrategy(url, isMain) { +translators.set('commonjs', async function commonjsStrategy(url, isMain) { debug(`Translating CJSModule ${url}`); - return new ModuleWrap(url, undefined, ['default'], function() { + + let filename = internalURLModule.fileURLToPath(new URL(url)); + if (isWindows) + filename = StringPrototypeReplace(filename, winSepRegEx, '\\'); + + // Apply CJS exports parser. + if (!cjsParserInitialized) { + await cjsInit(); + cjsParserInitialized = true; + } + const { module, exportNames } = cjsPreparseModuleExports(filename); + const namesWithDefault = exportNames.has('default') ? + [...exportNames] : ['default', ...exportNames]; + + return new ModuleWrap(url, undefined, namesWithDefault, function() { debug(`Loading CJSModule ${url}`); - const pathname = internalURLModule.fileURLToPath(new URL(url)); + let exports; - const cachedModule = CJSModule._cache[pathname]; - if (cachedModule && asyncESM.ESMLoader.cjsCache.has(cachedModule)) { - exports = asyncESM.ESMLoader.cjsCache.get(cachedModule); - asyncESM.ESMLoader.cjsCache.delete(cachedModule); + if (asyncESM.ESMLoader.cjsCache.has(module)) { + exports = asyncESM.ESMLoader.cjsCache.get(module); + asyncESM.ESMLoader.cjsCache.delete(module); } else { - exports = CJSModule._load(pathname, undefined, isMain); + exports = CJSModule._load(filename, undefined, isMain); + } + + // Verify that it really does set __esModule, not just statically. + const esModule = ObjectPrototypeHasOwnProperty(exports, '__esModule') && + exports.__esModule; + if (esModule) { + for (const exportName of exportNames) { + if (!ObjectPrototypeHasOwnProperty(exports, exportName) || + exportName === 'default') + continue; + // We might trigger a getter -> dont fail. + let value; + try { + value = exports[exportName]; + } catch {} + this.setExport(exportName, value); + } } this.setExport('default', exports); }); }); +function cjsPreparseModuleExports(filename) { + let module = CJSModule._cache[filename]; + if (module) { + const cached = cjsParseCache.get(module); + if (cached) + return { module, exportNames: cached.exportNames }; + } + const loaded = Boolean(module); + if (!loaded) { + module = new CJSModule(filename); + module.filename = filename; + module.paths = CJSModule._nodeModulePaths(module.path); + CJSModule._cache[filename] = module; + } + + let source; + try { + source = readFileSync(filename, 'utf8'); + } catch {} + + const { exports, reexports } = cjsParse(source || ''); + + const esModule = ArrayPrototypeIncludes(exports, '__esModule'); + const exportNames = new SafeSet(esModule ? exports : []); + + // Set first for cycles. + cjsParseCache.set(module, { source, exportNames, loaded }); + + if (reexports.length) { + module.filename = filename; + module.paths = CJSModule._nodeModulePaths(module.path); + } + for (const reexport of reexports) { + let resolved; + try { + // Reexports are still raw specifier strings, so use JSON.parse. + resolved = CJSModule._resolveFilename(reexport, module); + } catch { + continue; + } + const ext = extname(resolved); + if (ext === '.js' || ext === '.cjs' || !CJSModule._extensions[ext]) { + const { exportNames: reexportNames } = cjsPreparseModuleExports(resolved); + if (reexportNames.has('__esModule')) { + for (const name of reexportNames) + exportNames.add(name); + } + } + } + + return { module, exportNames }; +} + // Strategy for loading a node builtin CommonJS module that isn't // through normal resolution translators.set('builtin', async function builtinStrategy(url) { diff --git a/lib/internal/process/esm_loader.js b/lib/internal/process/esm_loader.js index 8f076b3ef32efd..50892d0d2e42c8 100644 --- a/lib/internal/process/esm_loader.js +++ b/lib/internal/process/esm_loader.js @@ -40,6 +40,7 @@ exports.ESMLoader = ESMLoader; async function initializeLoader() { const { getOptionValue } = require('internal/options'); const userLoader = getOptionValue('--experimental-loader'); + if (!userLoader) return; let cwd; diff --git a/node.gyp b/node.gyp index 5da3ae61bcba14..f7b8835c3a9528 100644 --- a/node.gyp +++ b/node.gyp @@ -261,6 +261,7 @@ 'deps/acorn-plugins/acorn-private-class-elements/index.js', 'deps/acorn-plugins/acorn-private-methods/index.js', 'deps/acorn-plugins/acorn-static-class-features/index.js', + 'deps/cjs-module-lexer/dist/lexer.js', ], 'node_mksnapshot_exec': '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)node_mksnapshot<(EXECUTABLE_SUFFIX)', 'mkcodecache_exec': '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)mkcodecache<(EXECUTABLE_SUFFIX)', diff --git a/test/es-module/test-esm-cjs-exports.js b/test/es-module/test-esm-cjs-exports.js new file mode 100644 index 00000000000000..37aa70d3880f2b --- /dev/null +++ b/test/es-module/test-esm-cjs-exports.js @@ -0,0 +1,21 @@ +'use strict'; + +const common = require('../common'); +const fixtures = require('../common/fixtures'); +const { spawn } = require('child_process'); +const assert = require('assert'); + +const entry = fixtures.path('/es-modules/cjs-exports.mjs'); + +const child = spawn(process.execPath, [entry]); +child.stderr.setEncoding('utf8'); +let stdout = ''; +child.stdout.setEncoding('utf8'); +child.stdout.on('data', (data) => { + stdout += data; +}); +child.on('close', common.mustCall((code, signal) => { + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + assert.strictEqual(stdout, 'ok\n'); +})); diff --git a/test/es-module/test-esm-cjs-named-error.mjs b/test/es-module/test-esm-cjs-named-error.mjs index d71dc959e21fb7..69780c4d405c36 100644 --- a/test/es-module/test-esm-cjs-named-error.mjs +++ b/test/es-module/test-esm-cjs-named-error.mjs @@ -3,33 +3,23 @@ import { rejects } from 'assert'; const fixtureBase = '../fixtures/es-modules/package-cjs-named-error'; -const expectedRelative = 'The requested module \'./fail.cjs\' is expected to ' + - 'be of type CommonJS, which does not support named exports. CommonJS ' + - 'modules can be imported by importing the default export.\n' + - 'For example:\n' + - 'import pkg from \'./fail.cjs\';\n' + - 'const { comeOn } = pkg;'; +const errTemplate = (specifier, name, namedImports) => + `Named export '${name}' not found. The requested module` + + ` '${specifier}' is of type CommonJS, which may not support ` + + 'all module.exports via named exports.\nCommonJS modules can also' + + ' be reliably imported via the default export, for example using:' + + `\n\nimport pkg from '${specifier}';\n` + + `const ${namedImports} = pkg;\n`; -const expectedRenamed = 'The requested module \'./fail.cjs\' is expected to ' + - 'be of type CommonJS, which does not support named exports. CommonJS ' + - 'modules can be imported by importing the default export.\n' + - 'For example:\n' + - 'import pkg from \'./fail.cjs\';\n' + - 'const { comeOn: comeOnRenamed } = pkg;'; +const expectedRelative = errTemplate('./fail.cjs', 'comeOn', '{ comeOn }'); -const expectedPackageHack = 'The requested module \'./json-hack/fail.js\' is ' + - 'expected to be of type CommonJS, which does not support named exports. ' + - 'CommonJS modules can be imported by importing the default export.\n' + - 'For example:\n' + - 'import pkg from \'./json-hack/fail.js\';\n' + - 'const { comeOn } = pkg;'; +const expectedRenamed = errTemplate('./fail.cjs', 'comeOn', + '{ comeOn: comeOnRenamed }'); -const expectedBare = 'The requested module \'deep-fail\' is expected to ' + - 'be of type CommonJS, which does not support named exports. CommonJS ' + - 'modules can be imported by importing the default export.\n' + - 'For example:\n' + - 'import pkg from \'deep-fail\';\n' + - 'const { comeOn } = pkg;'; +const expectedPackageHack = + errTemplate('./json-hack/fail.js', 'comeOn', '{ comeOn }'); + +const expectedBare = errTemplate('deep-fail', 'comeOn', '{ comeOn }'); rejects(async () => { await import(`${fixtureBase}/single-quote.mjs`); diff --git a/test/fixtures/es-modules/cjs-exports.mjs b/test/fixtures/es-modules/cjs-exports.mjs new file mode 100644 index 00000000000000..5e1ad7493e9574 --- /dev/null +++ b/test/fixtures/es-modules/cjs-exports.mjs @@ -0,0 +1,34 @@ +import { strictEqual, deepEqual } from 'assert'; + +import m, { π, z } from './exports-cases.js'; +import * as ns from './exports-cases.js'; + +deepEqual(Object.keys(ns), ['__esModule', 'default', 'z', 'π']); +strictEqual(π, 'yes'); +strictEqual(z, 'yes'); +strictEqual(typeof m.isObject, 'undefined'); +strictEqual(m.π, 'yes'); +strictEqual(m.z, 'yes'); + +import m2, { __esModule as __esModule2, name as name2 } from './exports-cases2.js'; +import * as ns2 from './exports-cases2.js'; + +strictEqual(__esModule2, true); +strictEqual(name2, 'name'); +strictEqual(typeof m2, 'object'); +strictEqual(m2.default, 'the default'); +strictEqual(ns2.__esModule, true); +strictEqual(ns2.name, 'name'); +deepEqual(Object.keys(ns2), ['__esModule', 'case2', 'default', 'name', 'pi']); + +import m3, { __esModule as __esModule3, name as name3 } from './exports-cases3.js'; +import * as ns3 from './exports-cases3.js'; + +strictEqual(__esModule3, true); +strictEqual(name3, 'name'); +deepEqual(Object.keys(m3), ['name', 'default', 'pi', 'case2']); +strictEqual(ns3.__esModule, true); +strictEqual(ns3.name, 'name'); +strictEqual(ns3.case2, 'case2'); + +console.log('ok'); diff --git a/test/fixtures/es-modules/exports-cases.js b/test/fixtures/es-modules/exports-cases.js new file mode 100644 index 00000000000000..d9aa9f38bd2f67 --- /dev/null +++ b/test/fixtures/es-modules/exports-cases.js @@ -0,0 +1,8 @@ +exports.__esModule = true; +if (global.maybe) + module.exports = require('../is-object'); +exports['invalid identifier'] = 'no'; +module.exports['?invalid'] = 'no'; +module.exports['π'] = 'yes'; +exports.package = 10; // reserved word -> not used +Object.defineProperty(exports, 'z', { value: 'yes' }); diff --git a/test/fixtures/es-modules/exports-cases2.js b/test/fixtures/es-modules/exports-cases2.js new file mode 100644 index 00000000000000..189eebb9f3b1b7 --- /dev/null +++ b/test/fixtures/es-modules/exports-cases2.js @@ -0,0 +1,29 @@ +/* + * Transpiled with Babel from: + * + * export { π as pi } from './exports-cases.js'; + * export default 'the default'; + * export const name = 'name'; + */ + +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "pi", { + enumerable: true, + get: function () { + return _exportsCases.π; + } +}); +exports.name = exports.default = void 0; + +var _exportsCases = require("./exports-cases.js"); + +var _default = 'the default'; +exports.default = _default; +const name = 'name'; +exports.name = name; + +exports.case2 = 'case2'; diff --git a/test/fixtures/es-modules/exports-cases3.js b/test/fixtures/es-modules/exports-cases3.js new file mode 100644 index 00000000000000..c48b78cc4106be --- /dev/null +++ b/test/fixtures/es-modules/exports-cases3.js @@ -0,0 +1,25 @@ +/* + * Transpiled with TypeScript from: + * + * export { π as pi } from './exports-cases.js'; + * export default 'the default'; + * export const name = 'name'; + */ + +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.name = void 0; +exports.default = 'the default'; +exports.name = 'name'; + +var _external = require("./exports-cases2.js"); + +Object.keys(_external).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _external[key]; + } + }); +}); \ No newline at end of file