UNPKG

@putout/plugin-madrun

Version:

🐊Putout plugin adds ability to transform madrun scripts

75 lines (51 loc) 1.68 kB
import {types, operator} from 'putout'; const { isArrayExpression, arrayExpression, } = types; const { getExportDefault, getProperty, } = operator; export const report = () => `Use 'cutEnv()' instead of 'run()'`; export const replace = () => ({ 'run(__a)': (vars, path) => { const {body} = path.scope.block; if (!isArrayExpression(body)) { const tuple = getTuple(vars, path); path.scope.block.body = arrayExpression([tuple.elements[0], body]); } return 'cutEnv(__a)'; }, }); export const match = () => ({ 'run(__a)': getTuple, }); function getTuple({__a}, path) { const exportDefault = getExportDefault(path); if (!exportDefault) return null; const declarationPath = exportDefault.get('declaration'); if (isSameEnv({__a, path, declarationPath})) return null; const property = getProperty(declarationPath, __a.value); if (!property) return null; const {body} = property.node.value; if (!isArrayExpression(body)) return null; return body; } function isSameEnv({__a, path, declarationPath}) { if (!path.parentPath.parentPath.isArrayExpression()) return false; const [first] = path.parentPath.parentPath.node.elements; const propertyPath = getProperty(declarationPath, __a.value); if (!propertyPath) return false; const array = propertyPath.node.value.body; if (!isArrayExpression(array)) return false; const [calledFirst] = array.elements; return first.name !== calledFirst.name; }