Skip to content

Commit

Permalink
feature(putout) jscodeshift: add support of options
Browse files Browse the repository at this point in the history
  • Loading branch information
coderaiser committed Aug 7, 2019
1 parent d3cbf42 commit 202dd7f
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 43 deletions.
32 changes: 32 additions & 0 deletions packages/putout/lib/parse.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
'use strict';

const recast = require('recast');
const toBabel = require('estree-to-babel');
const customParser = require('./custom-parser');

module.exports = (source, {parser, isTS, isFlow, isJSX} = {}) => {
const ast = recast.parse(source, {
parser: getParser({
parser,
isTS,
isFlow,
isJSX,
}),
});

return ast;
};

module.exports.getParser = getParser;
function getParser({parser = 'babel', isTS, isFlow, isJSX} = {}) {
return {
parse(source) {
return toBabel(customParser(source, {
parser,
isTS,
isFlow,
isJSX,
}));
},
};
}
28 changes: 1 addition & 27 deletions packages/putout/lib/putout.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
'use strict';

const recast = require('recast');
const toBabel = require('estree-to-babel');
const traverse = require('@babel/traverse').default;
const template = require('@babel/template').default;
const generate = require('@babel/generator').default;
Expand All @@ -10,26 +8,15 @@ const types = require('@babel/types');
const cutShebang = require('./cut-shebang');
const getPlugins = require('./get-plugins');

const customParser = require('./custom-parser');
const runPlugins = require('./run-plugins');
const runBabelPlugins = require('./run-babel-plugins');
const runJSCodeshiftPlugins = require('./run-jscodeshift-plugins');
const print = require('./print');
const parse = require('./parse');

const isUndefined = (a) => typeof a === 'undefined';
const {assign} = Object;

const getParser = ({parser, isTS, isFlow, isJSX}) => ({
parse(source) {
return toBabel(customParser(source, {
parser,
isTS,
isFlow,
isJSX,
}));
},
});

const defaultOpts = (opts = {}) => {
const newOpts = {
...opts,
Expand Down Expand Up @@ -141,19 +128,6 @@ function transform(ast, source, opts) {
}

module.exports.parse = parse;
function parse(source, {parser = 'babel', isTS, isFlow, isJSX} = {}) {
const ast = recast.parse(source, {
parser: getParser({
parser,
isTS,
isFlow,
isJSX,
}),
});

return ast;
}

module.exports.print = print;
module.exports.traverse = traverse;
module.exports.types = types;
Expand Down
45 changes: 29 additions & 16 deletions packages/putout/lib/run-jscodeshift-plugins/index.js
Original file line number Diff line number Diff line change
@@ -1,39 +1,50 @@
'use strict';

const once = require('once');

const print = require('../print');
const getPositions = require('../get-positions-by-diff');

const {isArray} = Array;
const {assign} = Object;

const isFn = (a) => typeof a === 'function';
const isStr = (a) => typeof a === 'string';

const printAST = (a) => isStr(a) ? a : print(a);
const getFn = (a) => (...args) => {
const fn = isFn(a) ? a : a.default;
return printAST(fn(...args));
};

const getMessage = (a) => a.replace('/', ': ');
const parsePlugin = (a) => {
if (!isArray(a))
return [
a,
getMessage(a),
{},
];

const [name, message] = a;
const [name, message, options] = a;

return [
name,
getMessage(message),
message || getMessage(name),
options || {},
];
};

const getJScodeshift = once(() => require('jscodeshift'));

const wrapCodeShift = () => {
const wrapCodeShift = (ast) => {
const j = getJScodeshift();
const avoidPrint = {
toSource() {},
};

const fixedJscodeshift = (a) => {
return assign(j(a), {
toSource() {
return print(this.__paths[0].value);
},
});
const fixedJscodeshift = () => {
return assign(j(ast), avoidPrint);
};

return assign(fixedJscodeshift, j);
Expand All @@ -47,18 +58,20 @@ module.exports = ({fix, ast, jscodeshiftPlugins}) => {

const jscodeshift = wrapCodeShift(ast);

let oldCode = print(ast);
let source = print(ast);
for (const plugin of jscodeshiftPlugins) {
const [pluginName, message] = parsePlugin(plugin);
const fn = require(pluginName);
const [pluginName, message, options] = parsePlugin(plugin);
const fn = getFn(require(pluginName));

fn({source}, {jscodeshift}, options);

const newCode = fn({source: ast}, {jscodeshift});
const newSource = print(ast);

if (!fix && newCode !== oldCode) {
const positions = getPositions(oldCode, newCode);
if (!fix && newSource !== source) {
const positions = getPositions(source, newSource);
const rule = `jscodeshift/${pluginName}`;

oldCode = newCode;
source = newSource;

for (const position of positions)
places.push({
Expand Down

0 comments on commit 202dd7f

Please sign in to comment.