astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
113 lines (104 loc) • 14.1 kB
JavaScript
import ensureArray from '../util/ensureArray.mjs'
import forEachNode from '../util/forEachNode.mjs'
function parse0(backend, strings, ...quasis) {
try {
const result = backend.template.statements(strings, ...quasis)
if (result.length === 0)
return backend.template.expression(strings, ...quasis)
if (result.length > 1) return result
const node = result[0]
return node.type === 'ExpressionStatement' ? node.expression : node
} catch (error) {
// fallthrough
}
return backend.template.expression(strings, ...quasis)
}
export function parsePattern(strings, ...quasis) {
const ast = parse0(this, strings, ...quasis)
let result = ensureArray(ast).map((n) => new this.t.NodePath(n))
const allComments = []
forEachNode(this.t, result, ['Node'], (path) => {
if (allComments.length >= 2) return
const { node } = path
for (const comment of this.comments(node)) {
allComments.push(comment)
}
})
let done = false
if (allComments.length >= 2) {
let from = Infinity,
to = -Infinity
for (const comment of allComments) {
const { start, end } = this.location(comment)
if (start != null && start > to) to = start
if (end != null && end < from) from = end
}
if (from != null && to != null && from < to) {
const pathInRange = (path) => {
const { start, end } = this.location(path.node)
return start != null && end != null && start >= from && end <= to
}
forEachNode(this.t, result, ['Node'], (path) => {
if (done) return
if (pathInRange(path)) {
while (path.parentPath != null && pathInRange(path.parentPath))
path = path.parentPath
result = path
done = true
}
})
if (done) return result
}
}
let extractNext = false
forEachNode(this.t, result, ['Node'], (path) => {
if (done) return
if (extractNext) {
result = path
done = true
return
}
const { node } = path
const { comments, leadingComments, innerComments } = node
if (comments) {
for (let i = 0; i < comments.length; i++) {
const c = comments[i]
if (!c.value && c.leading) {
comments.splice(i, 1)
result = path
done = true
return
} else if (!c.value && c.inner) {
extractNext = true
return
}
}
}
if (leadingComments) {
for (let i = 0; i < leadingComments.length; i++) {
const c = leadingComments[i]
if (!c.value) {
leadingComments.splice(i, 1)
result = path
done = true
return
}
}
}
if (innerComments) {
for (let i = 0; i < innerComments.length; i++) {
const c = innerComments[i]
if (!c.value) {
innerComments.splice(i, 1)
extractNext = true
return
}
}
}
})
return result
}
export function parsePatternToNodes(strings, ...quasis) {
const paths = this.parsePattern(strings, ...quasis)
return Array.isArray(paths) ? paths.map((p) => p.node) : paths.node
} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVBcnJheSIsImZvckVhY2hOb2RlIiwicGFyc2UwIiwiYmFja2VuZCIsInN0cmluZ3MiLCJxdWFzaXMiLCJyZXN1bHQiLCJ0ZW1wbGF0ZSIsInN0YXRlbWVudHMiLCJsZW5ndGgiLCJleHByZXNzaW9uIiwibm9kZSIsInR5cGUiLCJlcnJvciIsInBhcnNlUGF0dGVybiIsImFzdCIsIm1hcCIsIm4iLCJ0IiwiTm9kZVBhdGgiLCJhbGxDb21tZW50cyIsInBhdGgiLCJjb21tZW50IiwiY29tbWVudHMiLCJwdXNoIiwiZG9uZSIsImZyb20iLCJJbmZpbml0eSIsInRvIiwic3RhcnQiLCJlbmQiLCJsb2NhdGlvbiIsInBhdGhJblJhbmdlIiwicGFyZW50UGF0aCIsImV4dHJhY3ROZXh0IiwibGVhZGluZ0NvbW1lbnRzIiwiaW5uZXJDb21tZW50cyIsImkiLCJjIiwidmFsdWUiLCJsZWFkaW5nIiwic3BsaWNlIiwiaW5uZXIiLCJwYXJzZVBhdHRlcm5Ub05vZGVzIiwicGF0aHMiLCJBcnJheSIsImlzQXJyYXkiLCJwIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2JhY2tlbmQvcGFyc2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFja2VuZCB9IGZyb20gJy4vQmFja2VuZCdcbmltcG9ydCB7IE5vZGVQYXRoLCBFeHByZXNzaW9uLCBTdGF0ZW1lbnQsIE5vZGUsIENvbW1lbnQgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCBlbnN1cmVBcnJheSBmcm9tICcuLi91dGlsL2Vuc3VyZUFycmF5J1xuaW1wb3J0IGZvckVhY2hOb2RlIGZyb20gJy4uL3V0aWwvZm9yRWFjaE5vZGUnXG5cbmZ1bmN0aW9uIHBhcnNlMChcbiAgYmFja2VuZDogQmFja2VuZCxcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgLi4ucXVhc2lzOiBhbnlbXVxuKTogRXhwcmVzc2lvbiB8IFN0YXRlbWVudCB8IFN0YXRlbWVudFtdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnRlbXBsYXRlLnN0YXRlbWVudHMoc3RyaW5ncywgLi4ucXVhc2lzKVxuICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIGJhY2tlbmQudGVtcGxhdGUuZXhwcmVzc2lvbihzdHJpbmdzLCAuLi5xdWFzaXMpXG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiAxKSByZXR1cm4gcmVzdWx0XG4gICAgY29uc3Qgbm9kZSA9IHJlc3VsdFswXVxuICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyA/IG5vZGUuZXhwcmVzc2lvbiA6IG5vZGVcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICB9XG4gIHJldHVybiBiYWNrZW5kLnRlbXBsYXRlLmV4cHJlc3Npb24oc3RyaW5ncywgLi4ucXVhc2lzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXR0ZXJuKFxuICB0aGlzOiBCYWNrZW5kLFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZyB8IHN0cmluZ1tdLFxuICAuLi5xdWFzaXM6IGFueVtdXG4pOiBOb2RlUGF0aCB8IE5vZGVQYXRoW10ge1xuICBjb25zdCBhc3QgPSBwYXJzZTAodGhpcywgc3RyaW5ncywgLi4ucXVhc2lzKVxuICBsZXQgcmVzdWx0OiBOb2RlUGF0aCB8IE5vZGVQYXRoW10gPSBlbnN1cmVBcnJheShhc3QpLm1hcChcbiAgICAobikgPT4gbmV3IHRoaXMudC5Ob2RlUGF0aChuKVxuICApXG4gIGNvbnN0IGFsbENvbW1lbnRzOiBDb21tZW50W10gPSBbXVxuICBmb3JFYWNoTm9kZSh0aGlzLnQsIHJlc3VsdCwgWydOb2RlJ10sIChwYXRoOiBOb2RlUGF0aCkgPT4ge1xuICAgIGlmIChhbGxDb21tZW50cy5sZW5ndGggPj0gMikgcmV0dXJuXG4gICAgY29uc3QgeyBub2RlIH0gPSBwYXRoXG4gICAgZm9yIChjb25zdCBjb21tZW50IG9mIHRoaXMuY29tbWVudHMobm9kZSkpIHtcbiAgICAgIGFsbENvbW1lbnRzLnB1c2goY29tbWVudClcbiAgICB9XG4gIH0pXG4gIGxldCBkb25lID0gZmFsc2VcbiAgaWYgKGFsbENvbW1lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgbGV0IGZyb20gPSBJbmZpbml0eSxcbiAgICAgIHRvID0gLUluZmluaXR5XG4gICAgZm9yIChjb25zdCBjb21tZW50IG9mIGFsbENvbW1lbnRzKSB7XG4gICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMubG9jYXRpb24oY29tbWVudClcbiAgICAgIGlmIChzdGFydCAhPSBudWxsICYmIHN0YXJ0ID4gdG8pIHRvID0gc3RhcnRcbiAgICAgIGlmIChlbmQgIT0gbnVsbCAmJiBlbmQgPCBmcm9tKSBmcm9tID0gZW5kXG4gICAgfVxuICAgIGlmIChmcm9tICE9IG51bGwgJiYgdG8gIT0gbnVsbCAmJiBmcm9tIDwgdG8pIHtcbiAgICAgIGNvbnN0IHBhdGhJblJhbmdlID0gKHBhdGg6IE5vZGVQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy5sb2NhdGlvbihwYXRoLm5vZGUpXG4gICAgICAgIHJldHVybiBzdGFydCAhPSBudWxsICYmIGVuZCAhPSBudWxsICYmIHN0YXJ0ID49IGZyb20gJiYgZW5kIDw9IHRvXG4gICAgICB9XG4gICAgICBmb3JFYWNoTm9kZSh0aGlzLnQsIHJlc3VsdCwgWydOb2RlJ10sIChwYXRoOiBOb2RlUGF0aCkgPT4ge1xuICAgICAgICBpZiAoZG9uZSkgcmV0dXJuXG4gICAgICAgIGlmIChwYXRoSW5SYW5nZShwYXRoKSkge1xuICAgICAgICAgIHdoaWxlIChwYXRoLnBhcmVudFBhdGggIT0gbnVsbCAmJiBwYXRoSW5SYW5nZShwYXRoLnBhcmVudFBhdGgpKVxuICAgICAgICAgICAgcGF0aCA9IHBhdGgucGFyZW50UGF0aFxuICAgICAgICAgIHJlc3VsdCA9IHBhdGhcbiAgICAgICAgICBkb25lID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKGRvbmUpIHJldHVybiByZXN1bHRcbiAgICB9XG4gIH1cbiAgbGV0IGV4dHJhY3ROZXh0ID0gZmFsc2VcbiAgZm9yRWFjaE5vZGUodGhpcy50LCByZXN1bHQsIFsnTm9kZSddLCAocGF0aDogTm9kZVBhdGgpID0+IHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuXG4gICAgaWYgKGV4dHJhY3ROZXh0KSB7XG4gICAgICByZXN1bHQgPSBwYXRoXG4gICAgICBkb25lID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHsgbm9kZSB9ID0gcGF0aFxuICAgIGNvbnN0IHsgY29tbWVudHMsIGxlYWRpbmdDb21tZW50cywgaW5uZXJDb21tZW50cyB9ID0gbm9kZSBhcyBhbnlcbiAgICBpZiAoY29tbWVudHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGNvbW1lbnRzW2ldXG4gICAgICAgIGlmICghYy52YWx1ZSAmJiBjLmxlYWRpbmcpIHtcbiAgICAgICAgICBjb21tZW50cy5zcGxpY2UoaSwgMSlcbiAgICAgICAgICByZXN1bHQgPSBwYXRoXG4gICAgICAgICAgZG9uZSA9IHRydWVcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfSBlbHNlIGlmICghYy52YWx1ZSAmJiBjLmlubmVyKSB7XG4gICAgICAgICAgZXh0cmFjdE5leHQgPSB0cnVlXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxlYWRpbmdDb21tZW50cykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWFkaW5nQ29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGxlYWRpbmdDb21tZW50c1tpXVxuICAgICAgICBpZiAoIWMudmFsdWUpIHtcbiAgICAgICAgICBsZWFkaW5nQ29tbWVudHMuc3BsaWNlKGksIDEpXG4gICAgICAgICAgcmVzdWx0ID0gcGF0aFxuICAgICAgICAgIGRvbmUgPSB0cnVlXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlubmVyQ29tbWVudHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5uZXJDb21tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjID0gaW5uZXJDb21tZW50c1tpXVxuICAgICAgICBpZiAoIWMudmFsdWUpIHtcbiAgICAgICAgICBpbm5lckNvbW1lbnRzLnNwbGljZShpLCAxKVxuICAgICAgICAgIGV4dHJhY3ROZXh0ID0gdHJ1ZVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhdHRlcm5Ub05vZGVzKFxuICB0aGlzOiBCYWNrZW5kLFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZyB8IHN0cmluZ1tdLFxuICAuLi5xdWFzaXM6IGFueVtdXG4pOiBOb2RlIHwgTm9kZVtdIHtcbiAgY29uc3QgcGF0aHMgPSB0aGlzLnBhcnNlUGF0dGVybihzdHJpbmdzLCAuLi5xdWFzaXMpXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGhzKSA/IHBhdGhzLm1hcCgocCkgPT4gcC5ub2RlKSA6IHBhdGhzLm5vZGVcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFFQSxPQUFPQSxXQUFQLE1BQXdCLHFCQUF4QjtBQUNBLE9BQU9DLFdBQVAsTUFBd0IscUJBQXhCOztBQUVBLFNBQVNDLE1BQVQ7QUFDRUMsT0FERjtBQUVFQyxPQUZGO0FBR0UsR0FBR0MsTUFITDtBQUl3QztFQUN0QyxJQUFJO0lBQ0YsTUFBTUMsTUFBTSxHQUFHSCxPQUFPLENBQUNJLFFBQVIsQ0FBaUJDLFVBQWpCLENBQTRCSixPQUE1QixF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