From 202dd7f20a802df6bb645f924bd48b1c66f86b5a Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 7 Aug 2019 20:32:30 +0300 Subject: [PATCH] feature(putout) jscodeshift: add support of options --- packages/putout/lib/parse.js | 32 +++++++++++++ packages/putout/lib/putout.js | 28 +----------- .../lib/run-jscodeshift-plugins/index.js | 45 ++++++++++++------- 3 files changed, 62 insertions(+), 43 deletions(-) create mode 100644 packages/putout/lib/parse.js diff --git a/packages/putout/lib/parse.js b/packages/putout/lib/parse.js new file mode 100644 index 0000000000..e8b3ac1dda --- /dev/null +++ b/packages/putout/lib/parse.js @@ -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, + })); + }, + }; +} diff --git a/packages/putout/lib/putout.js b/packages/putout/lib/putout.js index f3970bb544..8a78d8568c 100644 --- a/packages/putout/lib/putout.js +++ b/packages/putout/lib/putout.js @@ -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; @@ -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, @@ -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; diff --git a/packages/putout/lib/run-jscodeshift-plugins/index.js b/packages/putout/lib/run-jscodeshift-plugins/index.js index d81cd4488a..b9e9ec02f2 100644 --- a/packages/putout/lib/run-jscodeshift-plugins/index.js +++ b/packages/putout/lib/run-jscodeshift-plugins/index.js @@ -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); @@ -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({