GithubHelp home page GithubHelp logo

nodejs / cjs-module-lexer Goto Github PK

View Code? Open in Web Editor NEW
209.0 209.0 25.0 2.05 MB

Fast lexer to extract named exports via analysis from CommonJS modules

License: MIT License

JavaScript 70.43% Makefile 0.10% C 6.87% WebAssembly 22.60% TypeScript 0.01%

cjs-module-lexer's People

Contributors

alex-saunders avatar andarist avatar atlowchemi avatar dakmor avatar dependabot[bot] avatar exe-boss avatar fredkschott avatar guybedford avatar joostk avatar khardix avatar larsdenbakker avatar nicolo-ribaudo avatar pezhmanparsaee avatar pomax avatar simenb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cjs-module-lexer's Issues

Export not detected

⚠️ This is not real-world code. It's technically a bug, but no real program will notice it. Feel free to close this issue!

Consider this non-strict mode code: (GitHub's syntax highlighting is broken)

function fn() {
    yield / "/ //" /*
}
/*/
}

module.exports.foo = 2;

// */

The tokens are:

[function] [Identifier: fn] [paren left] [paren left] [brace left]
[Identifier: yield] [division] [String: "/ //"] [Comment: \n}\n/ ]
[brace right]

[Identifier: module] [dot] [Identifier: exports] [dot] [Identifier: foo] [equal] [Number: 2] [semicolon]

However, cjs-module-lexer returns { exports: [], reexports: [] }.

Issue with parsing 'react-transition-group'

Hello I'm having an issue parsing the 'react-transition-group' library.
I'm using react-transition-group version: "^2.6.1"

When attempting to parse the "react-transition-group/index.js " file that contains the content below:

"use strict";

var _CSSTransition = _interopRequireDefault(require("./CSSTransition"));

var _ReplaceTransition = _interopRequireDefault(require("./ReplaceTransition"));

var _TransitionGroup = _interopRequireDefault(require("./TransitionGroup"));

var _Transition = _interopRequireDefault(require("./Transition"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

module.exports = {
  Transition: _Transition.default,
  TransitionGroup: _TransitionGroup.default,
  ReplaceTransition: _ReplaceTransition.default,
  CSSTransition: _CSSTransition.default
};

Parsing example:

const { parse } = require('cjs-module-lexer');
const result = parse([The string above]);

The output I get is: result.exports = [Transition]

When I remove the default from this: _Transition.default
So it's now _Transition

the output from the parse is now:
result.exports = [Transition, TransitionGroup]

Is the parsing stopping the moment it finds a default inside of a module.exports object?

literal exports not supported

As always, awesome work on this library, @guybedford :)

I'm integrating this into Snowpack to match Node.js support, and was surprised to see this limitation:
https://github.com/guybedford/cjs-module-lexer/blob/9f32d7a83a435ed6f7716318a5367a82d6480079/test/_unit.js#L317-L320

I assumed many packages would rely on this form. Is this feasible because most ESM->CJS compilers don't actually use this form in practice? Is there any support for this planned? Not sure that I'll have time to work on this myself (still some work left to do on the Snowpack integration) but mainly just curious on the background and how easy this would be to implement.

Support for required modules

Would it be possible to support looking up a commonjs module's required dependencies? I'm thinking of how I could use cjs-module-lexer for fast on the fly cjs-esm transformation.

Require calls are dynamic, so you can't statically analyze everything. But supporting some common use cases would be interesting.

node ES6 import throws this error.

i am working on the node js app and it works fine locally. But when i try to host it to the cpanel it throws this,

returncode: 1
stdout:
> [email protected] run /home/proudpos/practice
> node index.js
stderr:
internal/deps/cjs-module-lexer/dist/lexer.js:1
"use strict";exports.parse=parse;exports.init=init;let A;const Q=1===new Uint8Array(new Uint16Array([1]).buffer)[0];function parse(g,I="@"){if(!A)throw new Error("Not initialized");const D=g.length+1,N=(A.__heap_base.value||A.__heap_base)+4*D-A.memory.buffer.byteLength;N>0&&A.memory.grow(Math.ceil(N/65536));const k=A.sa(D);if((Q?C:E)(g,new Uint16Array(A.memory.buffer,k,D)),!A.parseCJS(k,g.length,0,0,0))throw Object.assign(new Error(`Parse error ${I}${A.e()}:${g.slice(0,A.e()).split("\n").length}:${A.e()-g.lastIndexOf("\n",A.e()-1)}`),{idx:A.e()});let w=new Set,J=new Set,K=new Set;for(;A.rre();){const Q=B(g.slice(A.res(),A.ree()));Q&&J.add(Q)}for(;A.ru();)K.add(B(g.slice(A.us(),A.ue())));for(;A.re();){let Q=B(g.slice(A.es(),A.ee()));void 0===Q||K.has(Q)||w.add(Q)}return{exports:[...w],reexports:[...J]}}function B(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const Q=(0,eval)(A);for(let A=0;A<Q.length;A++){const B=64512&Q.charCodeAt(A);if(!(B<55296)){if(55296!==B)return;if(56320!=(64512&Q.charCodeAt(++A)))return}}return Q}catch{}}function E(A,Q){const B=A.length;let E=0;for(;E<B;){const B=A.charCodeAt(E);Q[E++]=(255&B)<<8|B>>>8}}function C(A,Q){const B=A.length;let E=0;for(;E<B;)Q[E]=A.charCodeAt(E++)}let g;function init(){return g||(g=(async()=>{const Q=await WebAssembly.compile((B="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EBENACACLwEAQS5HDQELQQAgAkESajYCvKABAkAgAi8BEiIDQdMARw0AIAIvARRB9ABHDQEgAi8BFkHhAEcNASACLwEYQfIARw0BQQAgAkEaajYCvKABIAIvARohAwsgA0H//wNxQShHDQBBACgCsKABQQAoAoxANgIAQQBBATsBhkBBAEEAKAK8oAEiAkECajYCvKABIAIvAQJB8gBHDQBBAhAQGgtBAEEAKAK8oAE2AoxADAELAkAgAkEEakHtAEHwAEHvAEHyAEH0ABATRQ0AIAAQEUUNABAkQQAoArygASEAC0EAIAA2AoxAC0EAKALAoAEhA0EAKAK8oAEhAgwACwsgAgv3AQEEf0EAIQECQEEAKAK8oAEiAkECakHlAEHxAEH1AEHpAEHyAEHlABAmRQ0AQQAhAUEAIAJBDmo2ArygAQJAECdBKEcNAEEAQQAoArygAUECajYCvKABECchA0EAKAK8oAEhBAJAIANBJ0YNACADQSJHDQELIAMQHEEAQQAoArygAUECaiIDNgK8oAEQJ0EpRw0AAkAgAEF/aiIBQQFLDQACQAJAIAEOAgEAAQsgBCADQQAoAqAfEQAAQQEPCyAEIANBACgCoB8RAABBAQ8LQQAoArSgASAENgIAQQAoArSgASADNgIEQQEPC0EAIAI2ArygAQsgAQsdAAJAQQAoApgfIABHDQBBAQ8LIABBfmovAQAQJQv+AgEEf0EAKAKYHyEBAkADQCAAQX5qIQIgAC8BACIDQSBHDQEgACABSyEEIAIhACAEDQALCwJAIANBPUcNAAJAA0AgAkF+aiEAIAIvAQBBIEcNASACIAFLIQQgACECIAQNAAsLIABBAmohAiAAQQRqIQNBACEEAkADQCACECghACACIAFNDQEgAEUNASAAQdwARg0CIAAQKUUNASACQX5BfCAAQYCABEkbaiECIAAQKiEEDAALCyAEQQFxRQ0AIAIvAQBBIEcNAEEAKAK0oAEiBEEAKAKwH0YNACAEIAM2AgwgBCACQQJqNgIIIAJBfmohAEEgIQICQANAIABBAmogAU0NASACQf//A3FBIEcNASAALwEAIQIgAEF+aiEADAALCyACQf//A3FBjn9qIgJBAksNAAJAAkACQCACDgMAAwEACyAAQfYAQeEAECsNAQwCCyAAQewAQeUAECsNACAAQeMAQe8AQe4AQfMAECxFDQELQQAgBEEQajYCtKABCws/AQF/QQAhBgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVGIQYLIAYLliYBCH9BAEEAKAK8oAEiAUEMajYCvKABIAFBCmohAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABAkACQBAnIgJB5ABHDQBBACgCvKABIgBBAmpB5QBB5gBB6QBB7gBB5QBB0ABB8gBB7wBB8ABB5QBB8gBB9ABB+QAQL0UNAkEAIABBHGo2ArygASAAQRpqIQEQJ0EoRw0CQQBBACgCvKABQQJqNgK8oAEQJxAwRQ0CECdBLEcNAkEAQQAoArygAUECajYCvKABAkAQJyIAQSdGDQAgAEEiRw0DC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiADYCvKABECdBLEcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0HlAEcNAEEAKAK8oAEiA0ECakHuAEH1AEHtAEHlAEHyAEHhAEHiAEHsAEHlABAxRQ0CQQAgA0EUajYCvKABECdBOkcNAkEAQQAoArygAUECajYCvKABECdB9ABHDQJBACgCvKABIgMvAQJB8gBHDQIgAy8BBEH1AEcNAiADLwEGQeUARw0CQQAgA0EIajYCvKABECdBLEcNAkEAQQAoArygAUECajYCvKABECchAwsCQCADQecARg0AIANB9gBHDQJBACgCvKABIgMvAQJB4QBHDQIgAy8BBEHsAEcNAiADLwEGQfUARw0CIAMvAQhB5QBHDQJBACADQQpqNgK8oAEQJ0E6Rw0CIAIgAEEAKAKcHxEAAEEAIAE2ArygAQ8LQQAoArygASIDLwECQeUARw0BIAMvAQRB9ABHDQFBACADQQZqNgK8oAECQBAnIgNBOkcNAEEAQQAoArygAUECajYCvKABECdB5gBHDQJBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAkEAIANBEGoiAzYCvKABAkAQJyIEQShGDQAgA0EAKAK8oAFGDQMgBBAtRQ0DCxAnIQMLIANBKEcNAUEAQQAoArygAUECajYCvKABECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQfIARw0BQQAoArygASIDQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQFBACADQQxqNgK8oAEQJxAtRQ0BAkACQAJAECciA0HbAEYNACADQS5HDQJBAEEAKAK8oAFBAmo2ArygARAnEC0NAQwEC0EAQQAoArygAUECajYCvKABAkAQJyIDQSdGDQAgA0EiRw0ECyADEBxBAEEAKAK8oAFBAmo2ArygARAnQd0ARw0DQQBBACgCvKABQQJqNgK8oAELECchAwsCQCADQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQMLIANB/QBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0EsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEDCyADQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BIAIgAEEAKAKcHxEAAA8LIAJB6wBHDQEgAEUNAUEAKAK8oAEiAC8BAkHlAEcNASAALwEEQfkARw0BIAAvAQZB8wBHDQEgAEEGaiEBQQAgAEEIajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECchAEEAKAK8oAEhAiAAEC1FDQFBACgCvKABIQAQJ0EpRw0BQQBBACgCvKABIgFBAmo2ArygARAnQS5HDQFBAEEAKAK8oAFBAmo2ArygARAnQeYARw0BQQAoArygASIDQQJqQe8AQfIAQcUAQeEAQeMAQegAECZFDQFBACADQQ5qNgK8oAEQJyEDQQAoArygASIEQX5qIQEgA0EoRw0BQQAgBEECajYCvKABECdB5gBHDQFBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAUEAIANBEGo2ArygARAnQShHDQFBAEEAKAK8oAFBAmo2ArygARAnIQNBACgCvKABIQQgAxAtRQ0BQQAoArygASEDECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQekARw0BQQAoArygASIFLwECQeYARw0BQQAgBUEEajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECcaQQAoArygASIFIAQgAyAEayIDEEENASAAIAJrIgZBAXUhB0EAIAUgA0EBdSIIQQF0ajYCvKAB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AEHuABATRQ0DQQAgAEEMajYCvKABECcaQQAoArygASIAIAIgBhBBDQNBACAAIAdBAXRqNgK8oAEQJ0HbAEcNA0EAQQAoArygAUECajYCvKABECcaQQAoArygASIAIAQgAxBBDQNBACAAIAhBAXRqNgK8oAEQJ0HdAEcNA0EAQQAoArygAUECajYCvKABAkAQJyIAQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQALIABB/QBHDQNBAEEAKAK8oAFBAmo2ArygAQJAECciAEEsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEACyAAQf0ARw0DQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0DQQBBACgCvKABQQJqNgK8oAEQJyIAQTtHDQFBAEEAKAK8oAFBAmo2ArygAQsQJyEACyAAQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BQQAoArSgASEEQYAgIQADQAJAAkAgBCAARg0AIAcgAEEMaigCACAAQQhqKAIAIgNrQQF1Rw0BIAIgAyAGEEENASAAKAIAIABBBGooAgBBACgCoB8RAABBACABNgK8oAELDwsgAEEQaiEADAALCyACIABBACgCpB8RAAALQQAgATYCvKABC1MBBH9BACgCvKABQQJqIQBBACgCwKABIQECQANAIAAiAkF+aiABTw0BIAJBAmohACACLwEAQXZqIgNBA0sNACADDgQBAAABAQsLQQAgAjYCvKABC3wBAn9BAEEAKAK8oAEiAEECajYCvKABIABBBmohAEEAKALAoAEhAQNAAkACQAJAIABBfGogAU8NACAAQX5qLwEAQSpHDQIgAC8BAEEvRw0CQQAgAEF+ajYCvKABDAELIABBfmohAAtBACAANgK8oAEPCyAAQQJqIQAMAAsLdQEBfwJAAkAgAEFfaiIBQQVLDQBBASABdEExcQ0BCyAAQUZqQf//A3FBBkkNACAAQVhqQf//A3FBB0kgAEEpR3ENAAJAIABBpX9qIgFBA0sNACABDgQBAAABAQsgAEH9AEcgAEGFf2pB//8DcUEESXEPC0EBCz0BAX9BASEBAkAgAEH3AEHoAEHpAEHsAEHlABA0DQAgAEHmAEHvAEHyABA1DQAgAEHpAEHmABArIQELIAELrQEBA39BASEBAkACQAJAAkACQAJAAkAgAC8BACICQUVq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IgRBACgCmB8iBUkNACAELwEAIAFHDQAgAC8BACACRw0AAkAgBCAFRw0AQQEPCyAAQXxqLwEAECUhAwsgAwtmAQN/QQAhBQJAIABBemoiBkEAKAKYHyIHSQ0AIAYvAQAgAUcNACAAQXxqLwEAIAJHDQAgAEF+ai8BACADRw0AIAAvAQAgBEcNAAJAIAYgB0cNAEEBDwsgAEF4ai8BABAlIQULIAULhQEBAn8gABA+IgAQKiEBAkACQCAAQdwARg0AQQAhAiABRQ0BC0EAKAK8oAFBAkEEIABBgIAESRtqIQACQANAQQAgADYCvKABIAAvAQAQPiIBRQ0BAkAgARApRQ0AIABBAkEEIAFBgIAESRtqIQAMAQsLQQAhAiABQdwARg0BC0EBIQILIAIL2gMBBH9BACgCvKABIgBBfmohAQNAQQAgAEECajYCvKABAkACQAJAIABBACgCwKABTw0AECchAEEAKAK8oAEhAgJAAkAgABAtRQ0AQQAoArygASEDAkACQBAnIgBBOkcNAEEAQQAoArygAUECajYCvKABECcQLUUNAUEAKAK8oAEvAQAhAAsgAiADQQAoApwfEQAADAILQQAgATYCvKABDwsCQAJAIABBIkYNACAAQS5GDQEgAEEnRw0EC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiAzYCvKABECciAEE6Rw0BQQBBACgCvKABQQJqNgK8oAECQBAnEC1FDQBBACgCvKABLwEAIQAgAiADQQAoApwfEQAADAILQQAgATYCvKABDwtBACgCvKABIgAvAQJBLkcNAiAALwEEQS5HDQJBACAAQQZqNgK8oAECQAJAAkAgAC8BBiIAQfIARw0AQQEQECEAQQAoArygASECIAANASACLwEAIQALIABB//8DcRAtDQFBACABNgK8oAEPC0EAIAJBAmo2ArygAQsQJyEACyAAQf//A3EiAEEsRg0CIABB/QBGDQBBACABNgK8oAELDwtBACABNgK8oAEPC0EAKAK8oAEhAAwACwuPAQEBf0EAIQ4CQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdHDQAgAC8BDiAIRw0AIAAvARAgCUcNACAALwESIApHDQAgAC8BFCALRw0AIAAv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","undefined"!=typeof window&&"function"==typeof atob?Uint8Array.from(atob(B),A=>A.charCodeAt(0)):Buffer.from(B,"base64")));var B;const{exports:E}=await WebAssembly.instantiate(Q);A=E})())}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

RangeError: WebAssembly.instantiate(): Out of memory: wasm memory
    at internal/deps/cjs-module-lexer/dist/lexer.js:1:33573
    at async initCJSParse (internal/modules/esm/translators.js:72:5)
    at async Loader.commonjsStrategy (internal/modules/esm/translators.js:185:18)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] run: `node index.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] run script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/proudpos/.npm/_logs/2021-09-01T09_37_48_862Z-debug.log

i am using these versions,
[email protected]
[email protected]

my index.js

import express from "express";
const app = express();
app.use(express.json());
app.use(
  express.urlencoded({
    extended: true,
    limit: "50mb",
  })
);

app.get("/", (req, res) => {
  res.send("Hello World i am aman");
});

app.listen();

package.json file

{
  "name": "practice",
  "version": "1.0.0",
  "description": "",
  "type":"module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "run": "node index.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}

debug log when i run npm run

0 info it worked if it ends with ok
1 verbose cli [
1 verbose cli   '/opt/alt/alt-nodejs14/root/usr/bin/node',
1 verbose cli   '/opt/alt/alt-nodejs14/root/usr/bin/npm',
1 verbose cli   'run-script',
1 verbose cli   'run',
1 verbose cli   '--'
1 verbose cli ]
2 info using [email protected]
3 info using [email protected]
4 verbose run-script [ 'prerun', 'run', 'postrun' ]
5 info lifecycle [email protected]~prerun: [email protected]
6 info lifecycle [email protected]~run: [email protected]
7 verbose lifecycle [email protected]~run: unsafe-perm in lifecycle true
8 verbose lifecycle [email protected]~run: PATH: /opt/alt/alt-nodejs14/root/usr/lib/node_modules/npm/node_modules.bundled/npm-lifecycle/node-gyp-bin:/home/proudpos/practice/node_modules/.bin:/opt/alt/alt-nodejs14/root/usr/bin:/home/proudpos/nodevenv/practice/14/bin:/opt/alt/alt-nodejs14/root/usr/bin:/home/proudpos/nodevenv/practice/14/lib/bin/:/usr/local/jdk/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/X11R6/bin:/root/bin:/opt/bin
9 verbose lifecycle [email protected]~run: CWD: /home/proudpos/practice
10 silly lifecycle [email protected]~run: Args: [ '-c', 'node index.js' ]
11 silly lifecycle [email protected]~run: Returned: code: 1  signal: null
12 info lifecycle [email protected]~run: Failed to exec run script
13 verbose stack Error: [email protected] run: `node index.js`
13 verbose stack Exit status 1
13 verbose stack     at EventEmitter.<anonymous> (/opt/alt/alt-nodejs14/root/usr/lib/node_modules/npm/node_modules.bundled/npm-lifecycle/index.js:332:16)
13 verbose stack     at EventEmitter.emit (events.js:375:28)
13 verbose stack     at ChildProcess.<anonymous> (/opt/alt/alt-nodejs14/root/usr/lib/node_modules/npm/node_modules.bundled/npm-lifecycle/lib/spawn.js:55:14)
13 verbose stack     at ChildProcess.emit (events.js:375:28)
13 verbose stack     at maybeClose (internal/child_process.js:1055:16)
13 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:288:5)
14 verbose pkgid [email protected]
15 verbose cwd /home/proudpos/practice
16 verbose Linux 3.10.0-962.3.2.lve1.5.60.el7.x86_64
17 verbose argv "/opt/alt/alt-nodejs14/root/usr/bin/node" "/opt/alt/alt-nodejs14/root/usr/bin/npm" "run-script" "run" "--"
18 verbose node v14.17.3
19 verbose npm  v6.14.13
20 error code ELIFECYCLE
21 error errno 1
22 error [email protected] run: `node index.js`
22 error Exit status 1
23 error Failed at the [email protected] run script.
23 error This is probably not a problem with npm. There is likely additional logging output above.
24 verbose exit [ 1, true ]

I searched a lot but could not find any answer.
Then I finally created this issue.

esbuild export patterns

It could be worthwhile to look at supporting the esbuild export patterns in the coming upgrade being upstreamed and backported for Node.js.

As far as I can tell, we could use the following simple patterns for esbuild:

  1. Exports
__export(exports, {
  p: () => import_external2.p,
  q: () => q
});
  1. Star Exports
__exportStar(exports, __toModule(require("external1")));

@evanw this would be a little bit of work but could be possible to support. Do you forsee these patterns changing or do you think this work would be worthwhile? I would likely be able to get to this next week.

Babel interopRequireWildcard reexports

We're currently not detecting the following:

var _Accordion = _interopRequireWildcard(require("./Accordion"));

Object.keys(_Accordion).forEach(function (key) {
  if (key === "default" || key === "__esModule") return;
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
  Object.defineProperty(exports, key, {
    enumerable: true,
    get: function get() {
      return _Accordion[key];
    }
  });
});

As far as I'm aware, this is output for valid export * as x use cases in Babel under certain interop options (not sure which?).

If this is the case, we should probably treat this as a full reexport, equivalent to export * from '...', therefore we should allow this to trigger reexport detection.

The question is if we should specifically filter the interopRequireWildcard function name, and I'm tempted to say yes, despite that it won't work with minification - this is similar to how we handle __exportStar for TypeScript code.

//cc @nicolo-ribaudo would value your thoughts on this one.

reexports detection incompatible with output from Rollup@^2.39.0

Since Rollup@^2.39.0, the cjs output for re-exports has changed a bit:

Object.keys(foo).forEach(function (k) {
-	if (k !== 'default') Object.defineProperty(exports, k, {
+       if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
		enumerable: true,
		get: function () {
			return foo[k];
		}
	});
});

The extra hasOwnProperty check breaks re-exports detection of cjs-module-lexer.

The implication of this:

  • cjs-module-lexer is used in Node.js' ESM mode to detect named exports compatibility for CJS modules
  • Many packages use Rollup to bundle for CJS distribution (e.g. Vue 3.0)
  • Previously, these packages "just worked" for named imports from Node.js in ESM mode because cjs-module-lexer was able to detect the re-exports
  • After upgrading Rollup to 2.39.0, the named imports are broken.

Reproduction

https://github.com/yyx990803/cjs-module-lexer-rollup-reexports

  • Install deps
  • npm run build (which builds src/index.js with Rollup to out.js)
  • node lex.js (which runs cjs-module-lexer on out.js)

Function call changes in TypeScript 4.4 seem to be breaking detection of named exports

Hi, I'm hoping this is the right place to post this! I just learned about this project when investigating an issue with named imports in NestJS.

TypeScript made a change to how certain function calls are compiled to CommonJS in version 4.4. Long story short, when you write export * from "./foo"; in TypeScript, in 4.3 and earlier it would write something like:

tslib_1.__exportStar(require("./foo"), exports);

But in 4.4 it's writing:

(0, tslib_1.__exportStar)(require("./foo"), exports);

I ran into this while investigating an issue I ran into when upgrading NestJS, and it seems others are experiencing the same problems with other packages.

Like I said, I'm not very familiar with this project, but is it possible that the parsing code could be updated to handle this new syntax? I expect this is going to affect more and more CommonJS projects written in TypeScript as they release new versions compiled with 4.4 or later.

Another Babel reexport check form

Posted #42 with a failing test for the following reexport form in Babel:

        var _p = require("p");
        Object.keys(_p).forEach(function (key) {
          if (key === "default" || key === "__esModule") return;
          if (key in exports && exports[key] === _p[key]) return;
          Object.defineProperty(exports, key, {
            enumerable: true,
            get: function () {
              return _p[key];
            }
          });
        });

We should probably add support for the if (key in exports && exports[key] === _p[key]) return; line here I think.

Rollup ^3.0.0 cjs re-exports edge case with externalLiveBindings: false

This is a new version of the same problem reported back in #38

Given code

export * from 'foo'

Default cjs output from Rollup (working, correctly detects re-exports from foo):

var foo = require('foo');

Object.keys(foo).forEach(function (k) {
	if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
		enumerable: true,
		get: function () { return foo[k]; }
	});
});

With output.externalLiveBindings: false (not working, no re-exports detected):

var foo = require('foo');

for (var k in foo) {
	if (k !== 'default' && !exports.hasOwnProperty(k)) exports[k] = foo[k];
}

Note: this was working previously in Rollup 2.x where the code generated was:

var foo = require('foo');

Object.keys(foo).forEach(function (k) {
	if (k !== 'default' && !exports.hasOwnProperty(k)) exports[k] = foo[k];
});

Reproduction

  • Install deps
  • npm run build (which builds src/index.js with Rollup to out.js)
  • node lex.js (which runs cjs-module-lexer on out.js)

Non-identifier exports not detected?

I came across some unexpected behavior:

const cml = require('cjs-module-lexer')
cml.init().then(() => {
  const result = cml.parse(`module.exports = {fi, if: 0}`)
  console.log(result)
})

Expected:

{ exports: [ 'fi', 'if' ], reexports: [] }

Observed:

{ exports: [ 'fi' ], reexports: [] }

I expected this to work because ESM lets you do this:

import { if as foo } from './example.js'

Extending exports object detections

Object expressons like:

    module.exports = {
      render: _render2['default'],
      shallow: _shallow2['default'],
      mount: _mount2['default'],
      ShallowWrapper: _ShallowWrapper2['default'],
      ReactWrapper: _ReactWrapper2['default'],
      configure: _configuration.merge,
      EnzymeAdapter: _EnzymeAdapter2['default']
    };

would still be beneficial to fully support reading their properties.

The challenge is doing this without a full parser that can't handle eg object expression / brace ambiguity details.

One idea is that it could be possible to use a , parser with no knowledge of object assign / expression ambiguity but purely based on matching the first , that happens at the same depth of brace tracking (including all brace types) which might be a way to dodge the harder parsing issues while supporting arbitrary expressions.

Will leave this open as a tracking issue for that kind of support.

Also analyze requires

I may be able to use this in a SES subproject. Ideally, I could use this and also eliminate a dependency on another parser used to heuristically analyze requires too.

this.exportname

In CommonJS modules the this assignment also works for named exports:

this.exportName = 'value';

So long as we are at the top-level, the above would be straightforward to track, although it's such an uncommon pattern the benefit would likely be marginal but it seems worth doing nonetheless.

ability to test / detect if a module is a CJS module (parse without the exception)

Hello! 👋

Just started using this package for a project I've been working on, and one of my use cases is detecting if a package from node_modules is a CommonJS module. It would be great if this package could be extended with an additional function, something like test or validate, that would effectively be like parse, but rather than throw on not being able to analyze the module, it would just return true / false instead.

For example, this is how I am making it work now by using parse.

const testForCjsModule = async(url) => {
  let isCommonJs = false;
  
  try {
    const module = await fs.promises.readFile(url, 'utf-8');
    
    await parse(module);

    isCommonJs = true;
  } catch (e) {
    const { message } = e;
    const isProbablyLexarErrorSoIgnore = message.indexOf('Unexpected import statement in CJS module.') >= 0 
      || message.indexOf('Unexpected export statement in CJS module.') >= 0;
      
    if (!isProbablyLexarErrorSoIgnore) {
      // we probably _shouldn't_ ignore this, so let's log it since we don't want to swallow all errors
      console.error(e);
    }
  }

  return Promise.resolve(isCommonJs);
};


const isCjs = await testForCjsModule('path/to/something/in/node_modules/index.js')

i haven't looked into the code here yet, but if you are inclined to support something like, and you think it could be classified as a "good first issue", I would be happy to try and help.

I was thinking the usage could look something like this

const { detect } = require('cjs-module-lexer');

const module = fs.readFileSync('path/to/something/in/node_modules/index.js', 'utf-8');
const isCjsModule = await detect(module); 

console.debug(isCjsModule);  // true | false

Thanks in advance for your consideration on this, and additionally thanks for all your great work on this and other projects of yours, like es-module-shims and SystemJS. Great stuff! ⭐

Cannot scan some TypeScript compiler CJS output

/cc @BPScott
https://unpkg.com/@shopify/[email protected]/dist-modern/index.js

'use strict';
Object.defineProperty(exports, '__esModule', {value: true});
exports.colorFactory = void 0;
var color_factory_1 = require('./color-factory');
Object.defineProperty(exports, 'colorFactory', {
  enumerable: true,
  get: function () {
    return color_factory_1.colorFactory;
  },
});
{ exports: [ '__esModule' ], reexports: [] }

cjs-module-lexer properly scans __esModule, but does not scan colorFactory. Is this expected? If so, is the presence of get instead of value also enough to indicate an export?

Real world edge case: prettier

Referring to the latest release of Prettier (v2.8.7), I find that most of the named exports in this CJS module cannot be detected:

https://github.com/prettier/prettier/blob/2.8.7/src/index.js#L43-L96

The only two that are picked up are formatWithCursor, and format - I'm wondering why the static analysis halts after the format entry -- is it due to the function expression format?

As a result, the following statement does not work:

import { doc } from 'prettier'

I'm currently using patch-package to move the doc, entry up higher so that it does work

Transfer Prep to Node.js org

  • Set default branch to "main"
  • Update dependencies to fix security warnings
  • Remove C include to just use Wasm build
  • Get TravisCI running
  • CONTRIBUTING

exports can be detected in hashbang

const { parse } = require("cjs-module-lexer")

const { exports: x } = parse(`
#! exports.x = exports.y = void 0;
`);
console.log(x); // ["x", "y"]

For esbuild style exports, I'm looking for a way to get the lexer to recognize it. So I found this method.

#! exports.x = exports.y = exports.foo = exports.bar = void 0;
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
  if (from && typeof from === "object" || typeof from === "function") {
    for (let key of __getOwnPropNames(from))
      if (!__hasOwnProp.call(to, key) && key !== except)
        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  }
  return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var foo_exports = {};
__export(foo_exports, {
  bar: () => bar,
  foo: () => foo,
  x: () => x,
  y: () => y
});
module.exports = __toCommonJS(foo_exports);
let x = 1n;
const y = 2n;
function foo() {
  x++;
}
function bar() {
  return x;
}

Regexp/division after `]}` not properly disambiguated

Consider these two inputs:

void {
    x: []
} / "/ //" /*

/*/

module.exports.foo = 2;

// */
{
    x: []
} / "/ //" /*

/*/

module.exports.foo = 2;

// */

In the first one it's an object divided by the string "/ //", followed by a comment and by the expression module.exports.foo = 2;.

In the second one it's a block containing a labeled statement (x: []), then there is a regular expression (/ "/), and inline comment and a block comment.

However, it returns exports: [ 'foo' ] for both the examples.

(Sorry for those /*//// */ patterns, but I need them to write "dual mode" code to toggle between code and comments 😅)

Unable to detect exports from bundled webpack output

Title is probably inaccurate 😅

I recently added bundling to Jest, and it seems the output makes the lexer not detect exports correctly.

Specifically, it picks up the exports. stuff that is not exported, but not the exports within Object.definedProperty which actually are.

Quickest reproduction I have is to clone Jest, run yarn && yarn build:js then this:

const fs = require('fs');
const {parse} = require('cjs-module-lexer');

const source = fs.readFileSync(require.resolve('jest-watcher'), 'utf8');

console.log(parse(source));

This prints

{
  exports: [
    'default',
    'KEYS',
    'printPatternCaret',
    'printRestoredPatternCaret'
  ],
  reexports: []
}

Running the parser on the published version (29.7.0) gives this:

{
  exports: [
    '__esModule',
    'BaseWatchPlugin',
    'JestHook',
    'PatternPrompt',
    'Prompt',
    'TestWatcher'
  ],
  reexports: [ './constants', './lib/patternModeHelpers' ]
}

The reexports are of course gone as it's bundled, but we're also seeing that the lexer has detected only the resolved re-exports?

Error selecting connection connect ECONNREFUSED 127.0.0.1:5432

[1632467339076] INFO (ls): Connection instance created for default.
ns: "conn-manager"
[1632467339080] ERROR (ls): Connecting error: {"code":-32001,"data":{"driver":"PostgreSQL","driverOptions":{}},"name":"Error"}
ns: "conn-manager"
[1632467339081] ERROR (ext): ERROR: Error opening connection connect ECONNREFUSED 127.0.0.1:5432, {"code":-32001,"data":{"driver":"PostgreSQL","driverOptions":{}}}
ns: "error-handler"

False exports detections

I don't know if its wrong for this lexer to pick up none valid module exports but this code should not report y as an export.
I guess it's because it's un aware of scopes and variable declarations.

function fake(module){
    module.exports.y = 1
}
fake({exports: {}});

Feature Request: Also detect esbuild Re-exports

// pattern:
__reExport(foo_exports, require("x"), module.exports);
__reExport(bar_exports, require("y"));

REPL

Consideration: when minified, should this code be detected?:

o(e,require("x"),module.exports);
o(f,require("y"));

Consideration2: since esbuild has not been 1.0, this pattern may still change in the future, so you may not in a hurry to implement that.

Related issue: evanw/esbuild#2486

Add RISC-V Support

As discussed here vitejs/vite#13198 it seems there is no risc-v support for this in https://unofficial-builds.nodejs.org/

I am not sure whats the root cause of this, but it seems this package is possible - even if not as performant - to work in 100% nodejs without native binaries, so it should be possible to add support for risc-v using that.

Mixing named exports and re-exports in Babel

This code transpiled by Babel does not detect the re-export:

export {named} from './named';
export * from './re-export';

Looking at the test-cases I see that this re-export alone is supported:

exports.__esModule = true;

var _reExport = require("./re-export");

Object.keys(_reExport).forEach(function (key) {
  if (key === "default" || key === "__esModule") return;
  if (key in exports && exports[key] === _reExport[key]) return;
  exports[key] = _reExport[key];
});

The code above correctly detects ./re-export. However, adding an extra named export changes the output slightly

exports.__esModule = true;
var _exportNames = {
  named: true
};
exports.named = void 0;

var _named = require("./named");

exports.named = _named.named;

var _reExport = require("./re-export");

Object.keys(_reExport).forEach(function (key) {
  if (key === "default" || key === "__esModule") return;
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
  if (key in exports && exports[key] === _reExport[key]) return;
  exports[key] = _reExport[key];
});

Link to the Babel playground.

Runing this code through the lexer returns { exports: [ '__esModule', 'named' ], reexports: [] }, ./re-export was not detected

Can't export when enumerable is "!0"

Input File:

Object.defineProperty(exports, 'a', {
  enumerable: true,
  value: 'a'
});

Object.defineProperty(exports, 'b', {
  enumerable: !0,
  value: 'b'
});

Expected Result: ["a", "b"]
Actual Result: ["a"]

We can get this case when we use uglifyjs to minify our source code.
image

The Error is occured in https://github.com/guybedford/cjs-module-lexer/blob/a96e7b52b99d39fee25d69f356905161d14a15ed/lexer.js#L370

Here is a simple solution:

          if (source.startsWith('true', pos)) {
            pos += 4;
          } else if (source.startsWith('!0', pos)) {
            pos += 2;
          } else {
            break;
          }

[Feature Request] Support for stream source

I was wondering if it would be possible to add support for streams to avoid blocking the event loop when dealing with big files. The use-case would be:

import {createReadStream } from 'fs';
import { parse, init } from 'cjs-module-lexer';
// init needs to be called and waited upon
await init();
const { exports, reexports } = parse(createReadStream('./file.cjs'));

What do you think?

Out of bounds memory access

cjs-module-lexer has a stack depth of 2048:

#define STACK_DEPTH 2048

this creates two stacks:

uint16_t templateStack_[STACK_DEPTH];
uint16_t* openTokenPosStack_[STACK_DEPTH];

However, when pushing to these stacks, there is no bounds check performed. For example:

openTokenPosStack[openTokenDepth++] = lastTokenPos;

If you run with a maliciously crafted input, you can overflow the stack and cause memory corruption.

import { parse, init } from 'cjs-module-lexer';

await init();
console.log(parse('exports.foo = 2;\n' + '{'.repeat(3069) + '}'.repeat(3069)));

Running this causes a Bus error: 10 crash.

This can also cause a crash of node itself by writing the above contents to a file and importing it via ESM.

Babel reexports pattern

The following CommonJS reexports pattern is not currently supported:

      var _styles = require("./styles");
      Object.keys(_styles).forEach(function (key) {
        if (key === "default" || key === "__esModule") return;
        if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
        Object.defineProperty(exports, key, {
          enumerable: true,
          get: function get() {
            return _styles[key];
          }
        });
      });

will aim to post a PR and release soon.

Not work well with TypeScript export default as output

Hi,

TypeScript export default as syntax seems not working with this module. Considering the following TS code:

export { default as fs } from 'fs'; 

Test its output with cjs-module-lexer:

const { parse } = require('cjs-module-lexer');

const result = parse(`
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fs = void 0;
var fs_1 = require("fs");
Object.defineProperty(exports, "fs", { enumerable: true, get: function () { return __importDefault(fs_1).default; } });
`);

console.log(result);

It prints:

{ exports: [ '__esModule' ], reexports: [] }

fs do not be considered as exports in the above case.

And I also figure out that changing the place of the __importDefault call

var fs_1 = require("fs");
Object.defineProperty(exports, "fs", { enumerable: true, get: function () { return __importDefault(fs_1).default; } });

to something like this one (what babel does):

var fs_1 = __importDefault(require("fs"));
Object.defineProperty(exports, "fs", { enumerable: true, get: function () { return fs_1.default; } });

The result will become:

{ exports: [ '__esModule', 'fs'], reexports: [] }

Is this an expected behavior?

Ref:

When trying to build with snowpack this error is thrown

[21:51:17] [snowpack] Build Result Error: There was a problem with a file build result.
[21:51:17] [snowpack] Parse error @:13:78
[21:51:17] [snowpack] Error: Parse error @:13:78
at parse (/home/pyc/ttwww/node_modules/es-module-lexer/dist/lexer.cjs:1:402)

Is there any help to it?

Bug: cannot detect exported numbers

module.exports = {
  a: 1,
};

module.exports = {
  b,
};

Hi, I like this library for its speed and simplicity!

There seems to be a very unexpected bug, when module.exports is set to an object that contains a number as its value, the key is not detected as a named export. But in the basic case like module.exports = { b }, it works soundly.

I also built a simple playground for this awesome library, and here is the reproduction for this bug:

https://cjs-module-lexer-playground.vercel.app?code=bW9kdWxlLmV4cG9ydHMgPSB7CiAgYTogMSwKfTsKCm1vZHVsZS5leHBvcnRzID0gewogIGIsCn07

The output is

{
  "exports": [
    "b"
  ],
  "reexports": []
}

but we expect "a" to be in exports

Provide some way to annotate exports?

I'm trying to figure out what to do about evanw/esbuild#668, which is an issue someone logged with esbuild because esbuild's export syntax doesn't exactly match the magic syntax forms used by this library.

I'm using a for-loop to generate export getters since it minifies better, but to work with this library I would presumably have to write out a long verbose list of Object.defineProperty() calls instead. This is undesirable both for minification reasons and because it would require me to support another code path, which is more overhead for me in terms of code complexity and would lead to a bigger test matrix.

Would you consider adding some way to annotate the exports that are available in a given file without having to rewrite the JavaScript in the file? A comment with something like //# cjsExports="someName","someOtherName",... would work, for example. I'm asking because this seems like the most straightforward solution. This library is trying to get a list of exports and instead of trying to magically infer the exports from the code, it could just read them out directly from a list.

CommonJS import from a Module package too inflexible

I originally opened this over in nodejs/node#39052 and was asked to move this here. Using the same structure since it has quite a bit of detail already.

  • Version: v14.17.1
  • Platform: Microsoft Windows NT 10.0.19042.0 x64
  • Subsystem:

What steps will reproduce the bug?

Whenever a consuming npm package is type: module it seems to be much picker about importing packages of which distribute cjs style code via import { bar } from "../lib/factory.js";. This limitation prevents consuming libraries from using type: module until all the dependent libraries are fixed and corrected which slows adoption.

To give an example I've created a repository https://github.com/k2snowman69/bug-nodejs-import-cjs which has two folders

  • lib - Contains trimmed down versions of three different styles of cjs outputs I've found (glob, dropbox and tslib). I stopped at three because it got the point across
  • use-lib - an ESM package that consume the three different styles of CJS outputs

How often does it reproduce? Is there a required condition?

Every time across multiple versions of node

What is the expected behavior?

When running any of the following:

  • node .\use-lib\use-define-property.js
  • node .\use-lib\use-factory.js
  • node .\use-lib\use-function.js

All three succeed in executing. This would mean that even though a dependency of my project might not be written in ESM or be rewritten using the Object.defineProperty style of CJS, that I'm able to use ESM style for my particular project though lose on some of the major benefits if that dependency were written in ESM.

What do you see instead?

If the commonjs library dist output uses the Object.defineProperty to build it's output, it works successfully, however the other two solutions seem to break.

PS D:\Projects\bug-nodejs-import-cjs> node .\use-lib\use-define-property.js
bar

PS D:\Projects\bug-nodejs-import-cjs> node .\use-lib\use-factory.js
file:///D:/Projects/bug-nodejs-import-cjs/use-lib/use-factory.js:1
import { bar } from "../lib/factory.js";
         ^^^
SyntaxError: Named export 'bar' not found. The requested module '../lib/factory.js' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from '../lib/factory.js';
const { bar } = pkg;

←[90m    at ModuleJob._instantiate (internal/modules/esm/module_job.js:120:21)←[39m
←[90m    at async ModuleJob.run (internal/modules/esm/module_job.js:165:5)←[39m
←[90m    at async Loader.import (internal/modules/esm/loader.js:177:24)←[39m
←[90m    at async Object.loadESM (internal/process/esm_loader.js:68:5)←[39m

PS D:\Projects\bug-nodejs-import-cjs> node .\use-lib\use-function.js
file:///D:/Projects/bug-nodejs-import-cjs/use-lib/use-function.js:1
import { bar } from "../lib/function.js";
         ^^^
SyntaxError: Named export 'bar' not found. The requested module '../lib/function.js' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from '../lib/function.js';
const { bar } = pkg;

←[90m    at ModuleJob._instantiate (internal/modules/esm/module_job.js:120:21)←[39m
←[90m    at async ModuleJob.run (internal/modules/esm/module_job.js:165:5)←[39m
←[90m    at async Loader.import (internal/modules/esm/loader.js:177:24)←[39m
←[90m    at async Object.loadESM (internal/process/esm_loader.js:68:5)←[39m

Additional information

This is my first bug in such a public space and I'm a bit nervous, feel free to ask me to reorganize or cleanup the original description to make it easier to understand. Any suggestions would be great, I'm trying to get better at writing issues!

Incompatibility with TypeScript (edge case)

I have a very simple TypeScript file:

export { default as bar } from './bar'

When transpiled with tsc (4.8) and esModuleInterop set to true the transpiled code will somehow look like this:

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bar = void 0;
var bar_1 = require("./bar");
Object.defineProperty(exports, "bar", { enumerable: true, get: function () { return __importDefault(bar_1).default; } });

In this case, the lexer seems to be ignoring the bar export.

Trailing commas in getter patterns

Spotted by @sokra, getter patterns currently don't detect with trailing commas:

Works:

Object.defineProperty(exports, 'a', {
  enumerable: true,
  get: function () {
    return q.p;
  }
});

Doesn't work:

Object.defineProperty(exports, 'a', {
  enumerable: true,
  get: function () {
    return q.p;
  },
});

This is a trivial fix, but likely misses the cutoff for stability at this point.

These were designed mostly to catch Babel / TypeScript build outputs so in most cases we should be ok without this support though since it would only affect users explicitly writing in this style where it is not generated code.

minified UMD detection

What

normally, this module should work with UMD bundle, since the umd wrapper function use exports identifier.

but after minified, the exports argument are mangled to single character.

I am not 100% sure this module should cover this case? but i am creating a similar functionality based on babel. I appreciate if i could use this module to replace mine.

example code:

!(function (t, e) {
  'object' == typeof exports && 'undefined' != typeof module
    ? e(
        exports,
      )
    : 'function' == typeof define && define.amd
    ? define([
        'exports',
      ], e)
    : e();
})(this, function (t, e) {
  'use strict';

  t.a = 'a';
  t.b = 'b';
});

expects detect a, b

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.