astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
129 lines (116 loc) • 14.5 kB
JavaScript
import compileReplacement from './compileReplacement/index.mjs'
import createReplacementConverter, {
bulkConvert,
} from './convertReplacement/index.mjs'
import pipeline from './util/pipeline.mjs'
import { last } from 'lodash-es'
export default function replace(match, replace, { backend }) {
var _match$path$parentPat
const path =
((_match$path$parentPat = match.path.parentPath) === null ||
_match$path$parentPat === void 0
? void 0
: _match$path$parentPat.node.type) === 'ExpressionStatement'
? match.path.parentPath
: match.path
const replacements = [
...bulkConvert(
(replace instanceof Object && typeof replace.generate === 'function'
? replace
: compileReplacement(
Array.isArray(replace)
? replace.map((n) => new backend.t.NodePath(n))
: new backend.t.NodePath(replace),
{
backend,
}
)
).generate(match),
createReplacementConverter(path)
),
]
doReplace(match, replacements)
}
export function replaceAll(matches, replace, { backend }) {
for (const match of matches) {
var _match$path$parentPat2
const path =
((_match$path$parentPat2 = match.path.parentPath) === null ||
_match$path$parentPat2 === void 0
? void 0
: _match$path$parentPat2.node.type) === 'ExpressionStatement'
? match.path.parentPath
: match.path
const replacements = [
...bulkConvert(
(replace instanceof Object && typeof replace.generate === 'function'
? replace
: compileReplacement(
pipeline(
typeof replace === 'function' ? replace(match) : replace,
(replacement) =>
Array.isArray(replacement)
? replacement.map((n) => new backend.t.NodePath(n))
: new backend.t.NodePath(replacement)
),
{
backend,
}
)
).generate(match),
createReplacementConverter(path)
),
]
doReplace(match, replacements)
}
}
function doReplace(match, replacements) {
var _replacedPaths$
const replacedPaths = match.paths.map((p) => {
var _p$parentPath
return ((_p$parentPath = p.parentPath) === null || _p$parentPath === void 0
? void 0
: _p$parentPath.node.type) === 'ExpressionStatement'
? p.parentPath
: p
})
transferComments(replacedPaths[0], replacements[0], {
leading: true,
})
transferComments(last(replacedPaths), last(replacements), {
trailing: true,
})
;(_replacedPaths$ = replacedPaths[0]) === null || _replacedPaths$ === void 0
? void 0
: _replacedPaths$.replace(...replacements)
for (let i = 1; i < replacedPaths.length; i++) {
replacedPaths[i].prune()
}
}
function transferComments(from, to, options) {
var _node$comments, _node$comments2
if (!from || !to) return
const node = from.node
const leading = options.leading
? ((_node$comments = node.comments) === null || _node$comments === void 0
? void 0
: _node$comments.filter((c) => c.leading)) || node.leadingComments
: undefined
if (leading !== null && leading !== void 0 && leading.length) {
const dest = node.comments
? to.comments || (to.comments = [])
: to.leadingComments || (to.leadingComments = [])
for (const c of leading) dest.push(c)
}
const trailing = options.trailing
? ((_node$comments2 = node.comments) === null || _node$comments2 === void 0
? void 0
: _node$comments2.filter((c) => c.trailing)) || node.trailingComments
: undefined
if (trailing !== null && trailing !== void 0 && trailing.length) {
const dest = node.comments
? to.comments || (to.comments = [])
: to.trailingComments || (to.trailingComments = [])
for (const c of trailing) dest.push(c)
}
} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21waWxlUmVwbGFjZW1lbnQiLCJjcmVhdGVSZXBsYWNlbWVudENvbnZlcnRlciIsImJ1bGtDb252ZXJ0IiwicGlwZWxpbmUiLCJsYXN0IiwicmVwbGFjZSIsIm1hdGNoIiwiYmFja2VuZCIsInBhdGgiLCJwYXJlbnRQYXRoIiwibm9kZSIsInR5cGUiLCJyZXBsYWNlbWVudHMiLCJPYmplY3QiLCJnZW5lcmF0ZSIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsIm4iLCJ0IiwiTm9kZVBhdGgiLCJkb1JlcGxhY2UiLCJyZXBsYWNlQWxsIiwibWF0Y2hlcyIsInJlcGxhY2VtZW50IiwicmVwbGFjZWRQYXRocyIsInBhdGhzIiwicCIsInRyYW5zZmVyQ29tbWVudHMiLCJsZWFkaW5nIiwidHJhaWxpbmciLCJpIiwibGVuZ3RoIiwicHJ1bmUiLCJmcm9tIiwidG8iLCJvcHRpb25zIiwiY29tbWVudHMiLCJmaWx0ZXIiLCJjIiwibGVhZGluZ0NvbW1lbnRzIiwidW5kZWZpbmVkIiwiZGVzdCIsInB1c2giLCJ0cmFpbGluZ0NvbW1lbnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3JlcGxhY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZSwgTm9kZVBhdGggfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgTWF0Y2ggfSBmcm9tICcuL2ZpbmQnXG5pbXBvcnQgY29tcGlsZVJlcGxhY2VtZW50LCB7IENvbXBpbGVkUmVwbGFjZW1lbnQgfSBmcm9tICcuL2NvbXBpbGVSZXBsYWNlbWVudCdcbmltcG9ydCBjcmVhdGVSZXBsYWNlbWVudENvbnZlcnRlciwgeyBidWxrQ29udmVydCB9IGZyb20gJy4vY29udmVydFJlcGxhY2VtZW50J1xuaW1wb3J0IHsgQmFja2VuZCB9IGZyb20gJy4vYmFja2VuZC9CYWNrZW5kJ1xuaW1wb3J0IHBpcGVsaW5lIGZyb20gJy4vdXRpbC9waXBlbGluZSdcbmltcG9ydCB7IGxhc3QgfSBmcm9tICdsb2Rhc2gnXG5cbmV4cG9ydCB0eXBlIFJlcGxhY2VPcHRpb25zID0ge1xuICBiYWNrZW5kOiBCYWNrZW5kXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlcGxhY2UoXG4gIG1hdGNoOiBNYXRjaCxcbiAgcmVwbGFjZTogQ29tcGlsZWRSZXBsYWNlbWVudCB8IE5vZGUgfCByZWFkb25seSBOb2RlW10sXG4gIHsgYmFja2VuZCB9OiBSZXBsYWNlT3B0aW9uc1xuKTogdm9pZCB7XG4gIGNvbnN0IHBhdGggPVxuICAgIG1hdGNoLnBhdGgucGFyZW50UGF0aD8ubm9kZS50eXBlID09PSAnRXhwcmVzc2lvblN0YXRlbWVudCdcbiAgICAgID8gbWF0Y2gucGF0aC5wYXJlbnRQYXRoXG4gICAgICA6IG1hdGNoLnBhdGhcbiAgY29uc3QgcmVwbGFjZW1lbnRzID0gW1xuICAgIC4uLmJ1bGtDb252ZXJ0KFxuICAgICAgKHJlcGxhY2UgaW5zdGFuY2VvZiBPYmplY3QgJiZcbiAgICAgIHR5cGVvZiAocmVwbGFjZSBhcyBhbnkpLmdlbmVyYXRlID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gKHJlcGxhY2UgYXMgQ29tcGlsZWRSZXBsYWNlbWVudClcbiAgICAgICAgOiBjb21waWxlUmVwbGFjZW1lbnQoXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHJlcGxhY2UpXG4gICAgICAgICAgICAgID8gcmVwbGFjZS5tYXAoKG4pID0+IG5ldyBiYWNrZW5kLnQuTm9kZVBhdGgobikpXG4gICAgICAgICAgICAgIDogbmV3IGJhY2tlbmQudC5Ob2RlUGF0aChyZXBsYWNlKSxcbiAgICAgICAgICAgIHsgYmFja2VuZCB9XG4gICAgICAgICAgKVxuICAgICAgKS5nZW5lcmF0ZShtYXRjaCksXG4gICAgICBjcmVhdGVSZXBsYWNlbWVudENvbnZlcnRlcihwYXRoKVxuICAgICksXG4gIF1cblxuICBkb1JlcGxhY2UobWF0Y2gsIHJlcGxhY2VtZW50cylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VBbGwoXG4gIG1hdGNoZXM6IE1hdGNoW10sXG4gIHJlcGxhY2U6XG4gICAgfCBDb21waWxlZFJlcGxhY2VtZW50XG4gICAgfCBOb2RlXG4gICAgfCByZWFkb25seSBOb2RlW11cbiAgICB8ICgobWF0Y2g6IE1hdGNoKSA9PiBDb21waWxlZFJlcGxhY2VtZW50IHwgTm9kZSB8IHJlYWRvbmx5IE5vZGVbXSksXG4gIHsgYmFja2VuZCB9OiBSZXBsYWNlT3B0aW9uc1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgIGNvbnN0IHBhdGggPVxuICAgICAgbWF0Y2gucGF0aC5wYXJlbnRQYXRoPy5ub2RlLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50J1xuICAgICAgICA/IG1hdGNoLnBhdGgucGFyZW50UGF0aFxuICAgICAgICA6IG1hdGNoLnBhdGhcbiAgICBjb25zdCByZXBsYWNlbWVudHMgPSBbXG4gICAgICAuLi5idWxrQ29udmVydChcbiAgICAgICAgKHJlcGxhY2UgaW5zdGFuY2VvZiBPYmplY3QgJiZcbiAgICAgICAgdHlwZW9mIChyZXBsYWNlIGFzIGFueSkuZ2VuZXJhdGUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IChyZXBsYWNlIGFzIENvbXBpbGVkUmVwbGFjZW1lbnQpXG4gICAgICAgICAgOiBjb21waWxlUmVwbGFjZW1lbnQoXG4gICAgICAgICAgICAgIHBpcGVsaW5lKFxuICAgICAgICAgICAgICAgIHR5cGVvZiByZXBsYWNlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgICA/IHJlcGxhY2UobWF0Y2gpXG4gICAgICAgICAgICAgICAgICA6IChyZXBsYWNlIGFzIGFueSksXG4gICAgICAgICAgICAgICAgKHJlcGxhY2VtZW50OiBOb2RlIHwgcmVhZG9ubHkgTm9kZVtdKTogTm9kZVBhdGggfCBOb2RlUGF0aFtdID0+XG4gICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHJlcGxhY2VtZW50KVxuICAgICAgICAgICAgICAgICAgICA/IHJlcGxhY2VtZW50Lm1hcCgobikgPT4gbmV3IGJhY2tlbmQudC5Ob2RlUGF0aChuKSlcbiAgICAgICAgICAgICAgICAgICAgOiBuZXcgYmFja2VuZC50Lk5vZGVQYXRoKHJlcGxhY2VtZW50KVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB7IGJhY2tlbmQgfVxuICAgICAgICAgICAgKVxuICAgICAgICApLmdlbmVyYXRlKG1hdGNoKSxcbiAgICAgICAgY3JlYXRlUmVwbGFjZW1lbnRDb252ZXJ0ZXIocGF0aClcbiAgICAgICksXG4gICAgXVxuXG4gICAgZG9SZXBsYWNlKG1hdGNoLCByZXBsYWNlbWVudHMpXG4gIH1cbn1cblxuZnVuY3Rpb24gZG9SZXBsYWNlKG1hdGNoOiBNYXRjaCwgcmVwbGFjZW1lbnRzOiBOb2RlW10pIHtcbiAgY29uc3QgcmVwbGFjZWRQYXRocyA9IG1hdGNoLnBhdGhzLm1hcCgocCkgPT5cbiAgICBwLnBhcmVudFBhdGg/Lm5vZGUudHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnID8gcC5wYXJlbnRQYXRoIDogcFxuICApXG5cbiAgdHJhbnNmZXJDb21tZW50cyhyZXBsYWNlZFBhdGhzWzBdLCByZXBsYWNlbWVudHNbMF0sIHsgbGVhZGluZzogdHJ1ZSB9KVxuICB0cmFuc2ZlckNvbW1lbnRzKGxhc3QocmVwbGFjZWRQYXRocyksIGxhc3QocmVwbGFjZW1lbnRzKSwgeyB0cmFpbGluZzogdHJ1ZSB9KVxuXG4gIHJlcGxhY2VkUGF0aHNbMF0/LnJlcGxhY2UoLi4ucmVwbGFjZW1lbnRzKVxuICBmb3IgKGxldCBpID0gMTsgaSA8IHJlcGxhY2VkUGF0aHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXBsYWNlZFBhdGhzW2ldLnBydW5lKClcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2ZlckNvbW1lbnRzKFxuICBmcm9tOiBOb2RlUGF0aCB8IHVuZGVmaW5lZCxcbiAgdG86IE5vZGUgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IHsgbGVhZGluZz86IGJvb2xlYW47IHRyYWlsaW5nPzogYm9vbGVhbiB9XG4pIHtcbiAgaWYgKCFmcm9tIHx8ICF0bykgcmV0dXJuXG4gIGNvbnN0IG5vZGU6IGFueSA9IGZyb20ubm9kZVxuICBjb25zdCBsZWFkaW5nID0gb3B0aW9ucy5sZWFkaW5nXG4gICAgPyBub2RlLmNvbW1lbnRzPy5maWx0ZXIoKGM6IGFueSkgPT4gYy5sZWFkaW5nKSB8fCBub2RlLmxlYWRpbmdDb21tZW50c1xuICAgIDogdW5kZWZpbmVkXG4gIGlmIChsZWFkaW5nPy5sZW5ndGgpIHtcbiAgICBjb25zdCBkZXN0ID0gbm9kZS5jb21tZW50c1xuICAgICAgPyAodG8gYXMgYW55KS5jb21tZW50cyB8fCAoKHRvIGFzIGFueSkuY29tbWVudHMgPSBbXSlcbiAgICAgIDogKHRvIGFzIGFueSkubGVhZGluZ0NvbW1lbnRzIHx8ICgodG8gYXMgYW55KS5sZWFkaW5nQ29tbWVudHMgPSBbXSlcbiAgICBmb3IgKGNvbnN0IGMgb2YgbGVhZGluZykgZGVzdC5wdXNoKGMpXG4gIH1cbiAgY29uc3QgdHJhaWxpbmcgPSBvcHRpb25zLnRyYWlsaW5nXG4gICAgPyBub2RlLmNvbW1lbnRzPy5maWx0ZXIoKGM6IGFueSkgPT4gYy50cmFpbGluZykgfHwgbm9kZS50cmFpbGluZ0NvbW1lbnRzXG4gICAgOiB1bmRlZmluZWRcbiAgaWYgKHRyYWlsaW5nPy5sZW5ndGgpIHtcbiAgICBjb25zdCBkZXN0ID0gbm9kZS5jb21tZW50c1xuICAgICAgPyAodG8gYXMgYW55KS5jb21tZW50cyB8fCAoKHRvIGFzIGFueSkuY29tbWVudHMgPSBbXSlcbiAgICAgIDogKHRvIGFzIGFueSkudHJhaWxpbmdDb21tZW50cyB8fCAoKHRvIGFzIGFueSkudHJhaWxpbmdDb21tZW50cyA9IFtdKVxuICAgIGZvciAoY29uc3QgYyBvZiB0cmFpbGluZykgZGVzdC5wdXNoKGMpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFFQSxPQUFPQSxrQkFBUCxNQUF3RCxzQkFBeEQ7QUFDQSxPQUFPQywwQkFBUCxJQUFxQ0Ms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