It looks like you have to "cast"
the node to the jscodeshift
.
A solution is:
export default (file, api) => {
const j = api.jscodeshift
const root = j(file.source)
j(root.find(j.VariableDeclaration).at(0).get())
.insertBefore(
'"use strict";'
)
return root.toSource()
}
EDIT
For your clarification.
If you want to insert use strict
at the beginning of the file no matter what:
export default (file, api) => {
const j = api.jscodeshift
const s = '"use strict";';
const root = j(file.source)
root.get().node.program.body.unshift(s);
return root.toSource()
}
If you want to add use strict
after the import
declaration, if any:
export default (file, api) => {
const j = api.jscodeshift
const s = '"use strict";';
const root = j(file.source);
const imports = root.find(j.ImportDeclaration);
const n = imports.length;
if(n){
//j(imports.at(0).get()).insertBefore(s); // before the imports
j(imports.at(n-1).get()).insertAfter(s); // after the imports
}else{
root.get().node.program.body.unshift(s); // beginning of file
}
return root.toSource();
}
cast
does but i think you are missing my point, what if the file begins with an import statement instead of variable declaration? How would you generically say insert at the beginning? So far i've only been able to get this working by rebuilding with j.program() – Siskin