Skip to content

Instantly share code, notes, and snippets.

@dmnd
Forked from ide/requiresToImports.js
Last active March 4, 2017 20:50
Show Gist options
  • Save dmnd/12cad812c3f969e4f76c to your computer and use it in GitHub Desktop.
Save dmnd/12cad812c3f969e4f76c to your computer and use it in GitHub Desktop.
Converts commonJS requires to es6 imports
// converts commonJS requires to es6 imports
// var foo = require('foo');
// ->
// import foo from 'foo';
//
// jscodeshift -t requiresToImports.js src/**/*.js*
'use strict';
module.exports = function(fileInfo, api) {
var j = api.jscodeshift;
var root = j(fileInfo.source);
root
.find(j.VariableDeclaration, {
declarations: [{
type: 'VariableDeclarator',
init: {
type: 'CallExpression',
callee: {
type: 'Identifier',
name: 'require',
},
},
}],
})
.filter(isTopLevel)
.forEach(function(path) {
const dec = path.value.declarations[0];
const id = dec.id;
const source = dec.init.arguments[0];
const comments = path.value.comments;
const loc = path.value.loc;
path.replace(
j.importDeclaration(
[{
type: 'ImportDefaultSpecifier',
id
}],
source
)
);
path.value.loc = loc;
path.value.comments = comments;
});
root
.find(j.VariableDeclaration, {
declarations: [{
type: 'VariableDeclarator',
init: {
type: 'MemberExpression',
object: {
type: 'CallExpression',
callee: {
type: 'Identifier',
name: 'require'
},
},
},
}],
})
.filter(isTopLevel)
.forEach(function(path) {
const dec = path.value.declarations[0];
const name = dec.id;
const source = dec.init.object.arguments[0];
const id = dec.init.property;
const comments = path.value.comments;
const loc = path.value.loc;
let spec = {
type: 'ImportSpecifier',
id,
}
if (name.name !== id.name) {
spec['name'] = name;
}
path.replace(j.importDeclaration([spec], source));
path.value.loc = loc;
path.value.comments = comments;
});
return root.toSource();
};
function isTopLevel(path) {
return !path.parentPath.parentPath.parentPath.parentPath;
}
@adamterlson
Copy link

FYI for others, this doesn't catch require calls that don't assign to a variable, i.e. require('foo') instead of var foo = require('foo').

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