UNPKG

astx

Version:

super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring

197 lines (187 loc) 20.2 kB
import defaultFs from 'fs-extra' import Path from 'path' import { memoize } from 'lodash-es' import { promisify } from 'util' import _resolve from 'resolve' import omitBlankLineChanges from '../util/omitBlankLineChanges.mjs' import CodeFrameError from '../util/CodeFrameError.mjs' import chooseGetBackend from '../chooseGetBackend.mjs' import { astxCosmiconfig } from './astxCosmiconfig.mjs' import Astx from '../Astx.mjs' import './registerTsNode.mjs' const resolve = promisify(_resolve) const getPrettier = memoize(async (path) => { try { // eslint-disable-next-line @typescript-eslint/no-var-requires let prettier = await import( /* webpackIgnore: true */ await resolve('prettier', { basedir: path, }) ) if (prettier.default instanceof Object) { prettier = prettier.default } if ( typeof prettier.format === 'function' && typeof prettier.resolveConfig === 'function' ) { return prettier } } catch (error) { // ignore } return null }) export default async function runTransformOnFile({ transform: _transform, transformFile, config: configOverrides, file, source, signal, forWorker, fs = defaultFs, }) { var _await$astxCosmiconfi const transform = transformFile ? await import(transformFile) : _transform const baseConfig = (_await$astxCosmiconfi = await astxCosmiconfig.search( Path.dirname(file) )) === null || _await$astxCosmiconfi === void 0 ? void 0 : _await$astxCosmiconfi.config const config = { ...baseConfig, ...configOverrides, parserOptions: (baseConfig !== null && baseConfig !== void 0 && baseConfig.parserOptions) || (configOverrides !== null && configOverrides !== void 0 && configOverrides.parserOptions) ? { ...(baseConfig === null || baseConfig === void 0 ? void 0 : baseConfig.parserOptions), ...(configOverrides === null || configOverrides === void 0 ? void 0 : configOverrides.parserOptions), } : undefined, } if (signal !== null && signal !== void 0 && signal.aborted) throw new Error('aborted') const { parser, parserOptions } = config const backend = await chooseGetBackend(parser)(file, parserOptions) if (signal !== null && signal !== void 0 && signal.aborted) throw new Error('aborted') try { if (!source) source = await fs.readFile(file, 'utf8') if (signal !== null && signal !== void 0 && signal.aborted) throw new Error('aborted') let transformed const reports = [] let matches let transformFn = transform.astx const { find, replace } = transform if (typeof transformFn !== 'function' && find) { transformFn = ({ astx }) => { const result = astx.find(find, { where: transform.where, }) if (replace) result.replace(replace) matches = result.matches if (!result.size) return null } } if (typeof transformFn === 'function') { let ast, root try { ast = backend.parse(source) root = new backend.t.NodePath(ast) } catch (error) { if (error instanceof Error) { CodeFrameError.rethrow(error, { filename: file, source, }) } throw error } const options = { source, file, root, t: backend.t, report: (msg) => { var _transform$onReport if (msg instanceof Astx && !msg.size) return if (!forWorker) (_transform$onReport = transform.onReport) === null || _transform$onReport === void 0 ? void 0 : _transform$onReport.call(transform, { file, report: msg, }) reports.push(msg) }, ...backend.template, astx: new Astx(backend, [root]), } const [_result, prettier] = await Promise.all([ transformFn(options), (config === null || config === void 0 ? void 0 : config.prettier) !== false ? getPrettier(Path.dirname(file)) : null, ]) if (signal !== null && signal !== void 0 && signal.aborted) throw new Error('aborted') if (transform.astx || transform.replace) { transformed = _result if (transformed === undefined) { transformed = backend.generate(ast).code } if (transformed === null) transformed = undefined if ( prettier && typeof transformed === 'string' && transformed !== source ) { const prettierConfig = (await prettier.resolveConfig(file)) || {} prettierConfig.filepath = file if (/\.tsx?$/.test(file)) prettierConfig.parser = 'typescript' transformed = prettier.format(transformed, prettierConfig) } if (transformed != null) { transformed = omitBlankLineChanges(source, transformed) } } } else { return { file, error: new Error( 'transform file must export either astx or find/replace' ), backend, } } return { file, source, transformed, reports, matches, backend, } } catch (error) { return { file, error: error instanceof Error ? error : new Error(String(error)), backend, } } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZWZhdWx0RnMiLCJQYXRoIiwibWVtb2l6ZSIsInByb21pc2lmeSIsIl9yZXNvbHZlIiwib21pdEJsYW5rTGluZUNoYW5nZXMiLCJDb2RlRnJhbWVFcnJvciIsImNob29zZUdldEJhY2tlbmQiLCJhc3R4Q29zbWljb25maWciLCJBc3R4IiwicmVzb2x2ZSIsImdldFByZXR0aWVyIiwicGF0aCIsInByZXR0aWVyIiwiYmFzZWRpciIsImRlZmF1bHQiLCJPYmplY3QiLCJmb3JtYXQiLCJyZXNvbHZlQ29uZmlnIiwiZXJyb3IiLCJydW5UcmFuc2Zvcm1PbkZpbGUiLCJ0cmFuc2Zvcm0iLCJfdHJhbnNmb3JtIiwidHJhbnNmb3JtRmlsZSIsImNvbmZpZyIsImNvbmZpZ092ZXJyaWRlcyIsImZpbGUiLCJzb3VyY2UiLCJzaWduYWwiLCJmb3JXb3JrZXIiLCJmcyIsImJhc2VDb25maWciLCJzZWFyY2giLCJkaXJuYW1lIiwicGFyc2VyT3B0aW9ucyIsInVuZGVmaW5lZCIsImFib3J0ZWQiLCJFcnJvciIsInBhcnNlciIsImJhY2tlbmQiLCJyZWFkRmlsZSIsInRyYW5zZm9ybWVkIiwicmVwb3J0cyIsIm1hdGNoZXMiLCJ0cmFuc2Zvcm1GbiIsImFzdHgiLCJmaW5kIiwicmVwbGFjZSIsInJlc3VsdCIsIndoZXJlIiwic2l6ZSIsImFzdCIsInJvb3QiLCJwYXJzZSIsInQiLCJOb2RlUGF0aCIsInJldGhyb3ciLCJmaWxlbmFtZSIsIm9wdGlvbnMiLCJyZXBvcnQiLCJtc2ciLCJvblJlcG9ydCIsInB1c2giLCJ0ZW1wbGF0ZSIsIl9yZXN1bHQiLCJQcm9taXNlIiwiYWxsIiwiZ2VuZXJhdGUiLCJjb2RlIiwicHJldHRpZXJDb25maWciLCJmaWxlcGF0aCIsInRlc3QiLCJTdHJpbmciXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm9kZS9ydW5UcmFuc2Zvcm1PbkZpbGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRlZmF1bHRGcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBQYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCdcbmltcG9ydCBfcmVzb2x2ZSBmcm9tICdyZXNvbHZlJ1xuaW1wb3J0IHsgTWF0Y2ggfSBmcm9tICcuLi9maW5kJ1xuaW1wb3J0IG9taXRCbGFua0xpbmVDaGFuZ2VzIGZyb20gJy4uL3V0aWwvb21pdEJsYW5rTGluZUNoYW5nZXMnXG5pbXBvcnQgQ29kZUZyYW1lRXJyb3IgZnJvbSAnLi4vdXRpbC9Db2RlRnJhbWVFcnJvcidcbmltcG9ydCB7IEFzdHhDb25maWcgfSBmcm9tICcuLi9Bc3R4Q29uZmlnJ1xuaW1wb3J0IGNob29zZUdldEJhY2tlbmQgZnJvbSAnLi4vY2hvb3NlR2V0QmFja2VuZCdcbmltcG9ydCB7IGFzdHhDb3NtaWNvbmZpZyB9IGZyb20gJy4vYXN0eENvc21pY29uZmlnJ1xuaW1wb3J0IEFzdHgsIHsgVHJhbnNmb3JtLCBUcmFuc2Zvcm1PcHRpb25zLCBUcmFuc2Zvcm1SZXN1bHQgfSBmcm9tICcuLi9Bc3R4J1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0ICcuL3JlZ2lzdGVyVHNOb2RlJ1xuY29uc3QgcmVzb2x2ZSA9IHByb21pc2lmeShfcmVzb2x2ZSkgYXMgYW55XG5cbmNvbnN0IGdldFByZXR0aWVyID0gbWVtb2l6ZShhc3luYyAocGF0aDogc3RyaW5nKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgIGxldCBwcmV0dGllciA9IGF3YWl0IGltcG9ydChcbiAgICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi9cbiAgICAgIGF3YWl0IHJlc29sdmUoJ3ByZXR0aWVyJywge1xuICAgICAgICBiYXNlZGlyOiBwYXRoLFxuICAgICAgfSlcbiAgICApXG4gICAgaWYgKHByZXR0aWVyLmRlZmF1bHQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIHByZXR0aWVyID0gcHJldHRpZXIuZGVmYXVsdFxuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgcHJldHRpZXIuZm9ybWF0ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICB0eXBlb2YgcHJldHRpZXIucmVzb2x2ZUNvbmZpZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICkge1xuICAgICAgcmV0dXJuIHByZXR0aWVyXG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiBudWxsXG59KVxuXG5leHBvcnQgaW50ZXJmYWNlIEZzIHtcbiAgcmVhZEZpbGUoZmlsZTogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+XG59XG5cbmV4cG9ydCB0eXBlIFJ1blRyYW5zZm9ybU9uRmlsZU9wdGlvbnMgPSB7XG4gIGZpbGU6IHN0cmluZ1xuICBzb3VyY2U/OiBzdHJpbmdcbiAgdHJhbnNmb3JtPzogVHJhbnNmb3JtXG4gIHRyYW5zZm9ybUZpbGU/OiBzdHJpbmdcbiAgY29uZmlnPzogUGFydGlhbDxBc3R4Q29uZmlnPlxuICBzaWduYWw/OiBBYm9ydFNpZ25hbFxuICBmb3JXb3JrZXI/OiBib29sZWFuXG4gIGZzPzogRnNcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gcnVuVHJhbnNmb3JtT25GaWxlKHtcbiAgdHJhbnNmb3JtOiBfdHJhbnNmb3JtLFxuICB0cmFuc2Zvcm1GaWxlLFxuICBjb25maWc6IGNvbmZpZ092ZXJyaWRlcyxcbiAgZmlsZSxcbiAgc291cmNlLFxuICBzaWduYWwsXG4gIGZvcldvcmtlcixcbiAgZnMgPSBkZWZhdWx0RnMsXG59OiBSdW5UcmFuc2Zvcm1PbkZpbGVPcHRpb25zKTogUHJvbWlzZTxUcmFuc2Zvcm1SZXN1bHQ+IHtcbiAgY29uc3QgdHJhbnNmb3JtOiBUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1GaWxlXG4gICAgPyBhd2FpdCBpbXBvcnQodHJhbnNmb3JtRmlsZSlcbiAgICA6IF90cmFuc2Zvcm1cblxuICBjb25zdCBiYXNlQ29uZmlnID0gKGF3YWl0IGFzdHhDb3NtaWNvbmZpZy5zZWFyY2goUGF0aC5kaXJuYW1lKGZpbGUpKSlcbiAgICA/LmNvbmZpZyBhcyBBc3R4Q29uZmlnIHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgY29uZmlnOiBBc3R4Q29uZmlnID0ge1xuICAgIC4uLmJhc2VDb25maWcsXG4gICAgLi4uY29uZmlnT3ZlcnJpZGVzLFxuICAgIHBhcnNlck9wdGlvbnM6XG4gICAgICBiYXNlQ29uZmlnPy5wYXJzZXJPcHRpb25zIHx8IGNvbmZpZ092ZXJyaWRlcz8ucGFyc2VyT3B0aW9uc1xuICAgICAgICA/IHsgLi4uYmFzZUNvbmZpZz8ucGFyc2VyT3B0aW9ucywgLi4uY29uZmlnT3ZlcnJpZGVzPy5wYXJzZXJPcHRpb25zIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gIH1cblxuICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBuZXcgRXJyb3IoJ2Fib3J0ZWQnKVxuXG4gIGNvbnN0IHsgcGFyc2VyLCBwYXJzZXJPcHRpb25zIH0gPSBjb25maWdcblxuICBjb25zdCBiYWNrZW5kID0gYXdhaXQgY2hvb3NlR2V0QmFja2VuZChwYXJzZXIpKGZpbGUsIHBhcnNlck9wdGlvbnMpXG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IG5ldyBFcnJvcignYWJvcnRlZCcpXG5cbiAgdHJ5IHtcbiAgICBpZiAoIXNvdXJjZSkgc291cmNlID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZSwgJ3V0ZjgnKVxuICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IG5ldyBFcnJvcignYWJvcnRlZCcpXG5cbiAgICBsZXQgdHJhbnNmb3JtZWRcbiAgICBjb25zdCByZXBvcnRzOiB1bmtub3duW10gPSBbXVxuXG4gICAgbGV0IG1hdGNoZXM6IHJlYWRvbmx5IE1hdGNoW10gfCB1bmRlZmluZWRcblxuICAgIGxldCB0cmFuc2Zvcm1GbiA9IHRyYW5zZm9ybS5hc3R4XG5cbiAgICBjb25zdCB7IGZpbmQsIHJlcGxhY2UgfSA9IHRyYW5zZm9ybVxuICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtRm4gIT09ICdmdW5jdGlvbicgJiYgZmluZCkge1xuICAgICAgdHJhbnNmb3JtRm4gPSAoeyBhc3R4IH06IFRyYW5zZm9ybU9wdGlvbnMpOiBhbnkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhc3R4LmZpbmQoZmluZCBhcyBzdHJpbmcgfCBOb2RlIHwgTm9kZVtdLCB7XG4gICAgICAgICAgd2hlcmU6IHRyYW5zZm9ybS53aGVyZSxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJlcGxhY2UpIHJlc3VsdC5yZXBsYWNlKHJlcGxhY2UpXG4gICAgICAgIG1hdGNoZXMgPSByZXN1bHQubWF0Y2hlc1xuICAgICAgICBpZiAoIXJlc3VsdC5zaXplKSByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybUZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBsZXQgYXN0LCByb290XG4gICAgICB0cnkge1xuICAgICAgICBhc3QgPSBiYWNrZW5kLnBhcnNlKHNvdXJjZSlcbiAgICAgICAgcm9vdCA9IG5ldyBiYWNrZW5kLnQuTm9kZVBhdGgoYXN0KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBDb2RlRnJhbWVFcnJvci5yZXRocm93KGVycm9yLCB7IGZpbGVuYW1lOiBmaWxlLCBzb3VyY2UgfSlcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgc291cmNlLFxuICAgICAgICBmaWxlLFxuICAgICAgICByb290LFxuICAgICAgICB0OiBiYWNrZW5kLnQsXG4gICAgICAgIHJlcG9ydDogKG1zZzogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGlmIChtc2cgaW5zdGFuY2VvZiBBc3R4ICYmICFtc2cuc2l6ZSkgcmV0dXJuXG4gICAgICAgICAgaWYgKCFmb3JXb3JrZXIpIHRyYW5zZm9ybS5vblJlcG9ydD8uKHsgZmlsZSwgcmVwb3J0OiBtc2cgfSlcbiAgICAgICAgICByZXBvcnRzLnB1c2gobXNnKVxuICAgICAgICB9LFxuICAgICAgICAuLi5iYWNrZW5kLnRlbXBsYXRlLFxuICAgICAgICBhc3R4OiBuZXcgQXN0eChiYWNrZW5kLCBbcm9vdF0pLFxuICAgICAgfVxuICAgICAgY29uc3QgW19yZXN1bHQsIHByZXR0aWVyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdHJhbnNmb3JtRm4ob3B0aW9ucyksXG4gICAgICAgIGNvbmZpZz8ucHJldHRpZXIgIT09IGZhbHNlID8gZ2V0UHJldHRpZXIoUGF0aC5kaXJuYW1lKGZpbGUpKSA6IG51bGwsXG4gICAgICBdKVxuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgbmV3IEVycm9yKCdhYm9ydGVkJylcbiAgICAgIGlmICh0cmFuc2Zvcm0uYXN0eCB8fCB0cmFuc2Zvcm0ucmVwbGFjZSkge1xuICAgICAgICB0cmFuc2Zvcm1lZCA9IF9yZXN1bHRcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0cmFuc2Zvcm1lZCA9IGJhY2tlbmQuZ2VuZXJhdGUoYXN0KS5jb2RlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkID09PSBudWxsKSB0cmFuc2Zvcm1lZCA9IHVuZGVmaW5lZFxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJldHRpZXIgJiZcbiAgICAgICAgICB0eXBlb2YgdHJhbnNmb3JtZWQgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgdHJhbnNmb3JtZWQgIT09IHNvdXJjZVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwcmV0dGllckNvbmZpZyA9IChhd2FpdCBwcmV0dGllci5yZXNvbHZlQ29uZmlnKGZpbGUpKSB8fCB7fVxuICAgICAgICAgIHByZXR0aWVyQ29uZmlnLmZpbGVwYXRoID0gZmlsZVxuICAgICAgICAgIGlmICgvXFwudHN4PyQvLnRlc3QoZmlsZSkpIHByZXR0aWVyQ29uZmlnLnBhcnNlciA9ICd0eXBlc2NyaXB0J1xuICAgICAgICAgIHRyYW5zZm9ybWVkID0gcHJldHRpZXIuZm9ybWF0KHRyYW5zZm9ybWVkLCBwcmV0dGllckNvbmZpZylcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhbnNmb3JtZWQgIT0gbnVsbCkge1xuICAgICAgICAgIHRyYW5zZm9ybWVkID0gb21pdEJsYW5rTGluZUNoYW5nZXMoc291cmNlLCB0cmFuc2Zvcm1lZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWxlLFxuICAgICAgICBlcnJvcjogbmV3IEVycm9yKFxuICAgICAgICAgICd0cmFuc2Zvcm0gZmlsZSBtdXN0IGV4cG9ydCBlaXRoZXIgYXN0eCBvciBmaW5kL3JlcGxhY2UnXG4gICAgICAgICksXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBmaWxlLFxuICAgICAgc291cmNlLFxuICAgICAgdHJhbnNmb3JtZWQsXG4gICAgICByZXBvcnRzLFxuICAgICAgbWF0Y2hlcyxcbiAgICAgIGJhY2tlbmQsXG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlLFxuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSxcbiAgICAgIGJhY2tlbmQsXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFNBQVAsTUFBc0IsVUFBdEI7QUFDQSxPQUFPQyxJQUFQLE1BQWlCLE1BQWpCO0FBQ0EsU0FBU0Ms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