Skip to content

Instantly share code, notes, and snippets.

@parshap
Created February 3, 2018 23:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save parshap/cfb17c1db124b48ee5512f2c56f023c8 to your computer and use it in GitHub Desktop.
Save parshap/cfb17c1db124b48ee5512f2c56f023c8 to your computer and use it in GitHub Desktop.
Get a module's default export from a Babel AST
const t = require('babel-types');
const assert = require('assert');
/**
* Is `module.exports` expression
*/
const isModuleExportsMemberExpression = (node) => {
t.assertMemberExpression(node);
t.assertIdentifier(node.object);
assert.equal(node.object.name, 'module');
t.assertIdentifier(node.property);
assert.equal(node.property.name, 'exports');
};
/**
* Get a simple module's default export. The expected form of the module is:
*
* module.exports = { ... }
*
*/
const getModuleExport = (node) => {
// Assert sure the file is simply `module.exports = { ... }`
t.assertFile(node);
t.assertProgram(node.program);
assert.equal(node.program.body.length, 1);
t.assertExpressionStatement(node.program.body[0])
t.assertAssignmentExpression(node.program.body[0].expression);
assert(isModuleExportsMemberExpression(node.program.body[0].expression.left));
// Return the exported object
return node.program.body[0].expression.right;
};
const traverse = require('babel-traverse').default;
const t = require('babel-types');
const assert = require('assert');
/**
* Is `module.exports` expression.
*/
const isModuleExportsMemberExpression = (node) => {
t.assertMemberExpression(node);
t.assertIdentifier(node.object);
assert.equal(node.object.name, 'module');
t.assertIdentifier(node.property);
assert.equal(node.property.name, 'exports');
};
/**
* Get a simple module's default export. The expected form of the module is:
*
* module.exports = { ... }
*
*/
const getModuleExport = (node) => {
let node;
traverse(node, {
AssignmentExpression(path) {
if (isModuleExportsMemberExpression(path.node.left)) {
node = path.node.right;
}
}
});
return node;
};
@parshap
Copy link
Author

parshap commented Feb 4, 2018

Two different ways of doing this -- is there a better way?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment