astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
197 lines (187 loc) • 20.2 kB
JavaScript
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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