astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
159 lines (119 loc) • 12.9 kB
JavaScript
import mapValues from 'lodash/fp/mapValues.js'
import map from 'lodash/fp/map.js'
import CodeFrameError from '../util/CodeFrameError.mjs'
function makeIpcPath(path) {
const result = []
for (let p = path; p.parent != null; p = p.parent) {
if (p.name != null) result.push(p.name)
}
return result.reverse()
}
export function makeIpcMatch(
backend,
{
type,
path,
node,
paths,
nodes,
pathCaptures,
captures,
arrayPathCaptures,
arrayCaptures,
stringCaptures,
}
) {
function makeIpcNode(node) {
return {
location: backend.location(node),
}
}
function makeIpcPath(path) {
const result = []
for (let p = path; p.parent != null; p = p.parent) {
if (p.name != null) result.push(p.name)
}
return result.reverse()
}
const result = {
type,
path: makeIpcPath(path),
node: makeIpcNode(node),
paths: paths.map(makeIpcPath),
nodes: nodes.map(makeIpcNode),
}
if (pathCaptures) {
result.pathCaptures = mapValues(makeIpcPath)(pathCaptures)
}
if (captures) {
result.captures = mapValues(makeIpcNode)(captures)
}
if (arrayPathCaptures) {
result.arrayPathCaptures = mapValues(map(makeIpcPath))(arrayPathCaptures)
}
if (arrayCaptures) {
result.arrayCaptures = mapValues(map(makeIpcNode))(arrayCaptures)
}
if (stringCaptures) {
result.stringCaptures = stringCaptures
}
return result
}
export function makeIpcTransformResult({
file,
source,
transformed,
reports,
error,
matches,
backend,
}) {
const result = {
file,
source,
transformed,
reports,
}
if (error) {
if (error instanceof CodeFrameError) {
const { message, stack, filename, source, path, loc } = error
result.error = {
name: 'CodeFrameError',
message,
stack,
filename,
source,
path: path ? makeIpcPath(path) : undefined,
loc,
}
} else {
result.error = {
name: 'Error',
message: error.message,
stack: error.stack,
}
}
}
if (matches) result.matches = matches.map((m) => makeIpcMatch(backend, m))
return result
}
export function invertIpcError(error) {
switch (error.name) {
case 'CodeFrameError': {
const { message, filename, source, loc, stack } = error
const result = new CodeFrameError(message, {
filename,
source,
loc,
})
result.stack = stack
return result
}
default: {
const { message, stack } = error
const result = new Error(message)
result.stack = stack
return result
}
}
} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYXBWYWx1ZXMiLCJtYXAiLCJDb2RlRnJhbWVFcnJvciIsIm1ha2VJcGNQYXRoIiwicGF0aCIsInJlc3VsdCIsInAiLCJwYXJlbnQiLCJuYW1lIiwicHVzaCIsInJldmVyc2UiLCJtYWtlSXBjTWF0Y2giLCJiYWNrZW5kIiwidHlwZSIsIm5vZGUiLCJwYXRocyIsIm5vZGVzIiwicGF0aENhcHR1cmVzIiwiY2FwdHVyZXMiLCJhcnJheVBhdGhDYXB0dXJlcyIsImFycmF5Q2FwdHVyZXMiLCJzdHJpbmdDYXB0dXJlcyIsIm1ha2VJcGNOb2RlIiwibG9jYXRpb24iLCJtYWtlSXBjVHJhbnNmb3JtUmVzdWx0IiwiZmlsZSIsInNvdXJjZSIsInRyYW5zZm9ybWVkIiwicmVwb3J0cyIsImVycm9yIiwibWF0Y2hlcyIsIm1lc3NhZ2UiLCJzdGFjayIsImZpbGVuYW1lIiwibG9jIiwidW5kZWZpbmVkIiwibSIsImludmVydElwY0Vycm9yIiwiRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm9kZS9pcGMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWFwVmFsdWVzLCBtYXAgfSBmcm9tICdsb2Rhc2gvZnAnXG5pbXBvcnQgeyBUcmFuc2Zvcm1SZXN1bHQgfSBmcm9tICcuLi9Bc3R4J1xuaW1wb3J0IHsgQmFja2VuZCB9IGZyb20gJy4uL2JhY2tlbmQvQmFja2VuZCdcbmltcG9ydCB7IE1hdGNoIH0gZnJvbSAnLi4vZmluZCdcbmltcG9ydCB7IExvY2F0aW9uLCBOb2RlLCBOb2RlUGF0aCB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IENvZGVGcmFtZUVycm9yLCB7IFNvdXJjZUxvY2F0aW9uIH0gZnJvbSAnLi4vdXRpbC9Db2RlRnJhbWVFcnJvcidcblxuZXhwb3J0IHR5cGUgSXBjUGF0aCA9IChzdHJpbmcgfCBudW1iZXIpW11cbmV4cG9ydCB0eXBlIElwY05vZGUgPSB7XG4gIGxvY2F0aW9uOiBMb2NhdGlvblxufVxuXG5leHBvcnQgdHlwZSBJcGNNYXRjaCA9IHtcbiAgdHlwZTogJ25vZGUnIHwgJ25vZGVzJ1xuICBwYXRoOiBJcGNQYXRoXG4gIG5vZGU6IElwY05vZGVcbiAgcGF0aHM6IElwY1BhdGhbXVxuICBub2RlczogSXBjTm9kZVtdXG4gIHBhdGhDYXB0dXJlcz86IFJlY29yZDxzdHJpbmcsIElwY1BhdGg+XG4gIGNhcHR1cmVzPzogUmVjb3JkPHN0cmluZywgSXBjTm9kZT5cbiAgYXJyYXlQYXRoQ2FwdHVyZXM/OiBSZWNvcmQ8c3RyaW5nLCBJcGNQYXRoW10+XG4gIGFycmF5Q2FwdHVyZXM/OiBSZWNvcmQ8c3RyaW5nLCBJcGNOb2RlW10+XG4gIHN0cmluZ0NhcHR1cmVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxufVxuXG5mdW5jdGlvbiBtYWtlSXBjUGF0aChwYXRoOiBOb2RlUGF0aCk6IElwY1BhdGgge1xuICBjb25zdCByZXN1bHQ6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXVxuICBmb3IgKGxldCBwID0gcGF0aDsgcC5wYXJlbnQgIT0gbnVsbDsgcCA9IHAucGFyZW50KSB7XG4gICAgaWYgKHAubmFtZSAhPSBudWxsKSByZXN1bHQucHVzaChwLm5hbWUpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VJcGNNYXRjaChcbiAgYmFja2VuZDogQmFja2VuZCxcbiAge1xuICAgIHR5cGUsXG4gICAgcGF0aCxcbiAgICBub2RlLFxuICAgIHBhdGhzLFxuICAgIG5vZGVzLFxuICAgIHBhdGhDYXB0dXJlcyxcbiAgICBjYXB0dXJlcyxcbiAgICBhcnJheVBhdGhDYXB0dXJlcyxcbiAgICBhcnJheUNhcHR1cmVzLFxuICAgIHN0cmluZ0NhcHR1cmVzLFxuICB9OiBNYXRjaFxuKTogSXBjTWF0Y2gge1xuICBmdW5jdGlvbiBtYWtlSXBjTm9kZShub2RlOiBOb2RlKTogSXBjTm9kZSB7XG4gICAgcmV0dXJuIHsgbG9jYXRpb246IGJhY2tlbmQubG9jYXRpb24obm9kZSkgfVxuICB9XG4gIGZ1bmN0aW9uIG1ha2VJcGNQYXRoKHBhdGg6IE5vZGVQYXRoKTogSXBjUGF0aCB7XG4gICAgY29uc3QgcmVzdWx0OiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW11cbiAgICBmb3IgKGxldCBwID0gcGF0aDsgcC5wYXJlbnQgIT0gbnVsbDsgcCA9IHAucGFyZW50KSB7XG4gICAgICBpZiAocC5uYW1lICE9IG51bGwpIHJlc3VsdC5wdXNoKHAubmFtZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlKClcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogSXBjTWF0Y2ggPSB7XG4gICAgdHlwZSxcbiAgICBwYXRoOiBtYWtlSXBjUGF0aChwYXRoKSxcbiAgICBub2RlOiBtYWtlSXBjTm9kZShub2RlKSxcbiAgICBwYXRoczogcGF0aHMubWFwKG1ha2VJcGNQYXRoKSxcbiAgICBub2Rlczogbm9kZXMubWFwKG1ha2VJcGNOb2RlKSxcbiAgfVxuICBpZiAocGF0aENhcHR1cmVzKSB7XG4gICAgcmVzdWx0LnBhdGhDYXB0dXJlcyA9IG1hcFZhbHVlcyhtYWtlSXBjUGF0aCkocGF0aENhcHR1cmVzKVxuICB9XG4gIGlmIChjYXB0dXJlcykge1xuICAgIHJlc3VsdC5jYXB0dXJlcyA9IG1hcFZhbHVlcyhtYWtlSXBjTm9kZSkoY2FwdHVyZXMpXG4gIH1cbiAgaWYgKGFycmF5UGF0aENhcHR1cmVzKSB7XG4gICAgcmVzdWx0LmFycmF5UGF0aENhcHR1cmVzID0gbWFwVmFsdWVzKG1hcChtYWtlSXBjUGF0aCkpKGFycmF5UGF0aENhcHR1cmVzKVxuICB9XG4gIGlmIChhcnJheUNhcHR1cmVzKSB7XG4gICAgcmVzdWx0LmFycmF5Q2FwdHVyZXMgPSBtYXBWYWx1ZXMobWFwKG1ha2VJcGNOb2RlKSkoYXJyYXlDYXB0dXJlcylcbiAgfVxuICBpZiAoc3RyaW5nQ2FwdHVyZXMpIHtcbiAgICByZXN1bHQuc3RyaW5nQ2FwdHVyZXMgPSBzdHJpbmdDYXB0dXJlc1xuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IHR5cGUgSXBjQ29kZUZyYW1lRXJyb3IgPSB7XG4gIG5hbWU6ICdDb2RlRnJhbWVFcnJvcidcbiAgbWVzc2FnZTogc3RyaW5nXG4gIHN0YWNrPzogc3RyaW5nXG4gIGZpbGVuYW1lPzogc3RyaW5nXG4gIHNvdXJjZT86IHN0cmluZ1xuICBwYXRoPzogSXBjUGF0aFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxufVxuXG5leHBvcnQgdHlwZSBJcGNPdGhlckVycm9yID0ge1xuICBuYW1lOiAnRXJyb3InXG4gIG1lc3NhZ2U6IHN0cmluZ1xuICBzdGFjaz86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJcGNFcnJvciA9IElwY0NvZGVGcmFtZUVycm9yIHwgSXBjT3RoZXJFcnJvclxuXG5leHBvcnQgdHlwZSBJcGNUcmFuc2Zvcm1SZXN1bHQgPSB7XG4gIGZpbGU6IHN0cmluZ1xuICBzb3VyY2U/OiBzdHJpbmdcbiAgdHJhbnNmb3JtZWQ/OiBzdHJpbmdcbiAgcmVwb3J0cz86IGFueVtdXG4gIGVycm9yPzogSXBjRXJyb3JcbiAgbWF0Y2hlcz86IHJlYWRvbmx5IElwY01hdGNoW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VJcGNUcmFuc2Zvcm1SZXN1bHQoe1xuICBmaWxlLFxuICBzb3VyY2UsXG4gIHRyYW5zZm9ybWVkLFxuICByZXBvcnRzLFxuICBlcnJvcixcbiAgbWF0Y2hlcyxcbiAgYmFja2VuZCxcbn06IFRyYW5zZm9ybVJlc3VsdCk6IElwY1RyYW5zZm9ybVJlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdDogSXBjVHJhbnNmb3JtUmVzdWx0ID0geyBmaWxlLCBzb3VyY2UsIHRyYW5zZm9ybWVkLCByZXBvcnRzIH1cbiAgaWYgKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29kZUZyYW1lRXJyb3IpIHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSwgc3RhY2ssIGZpbGVuYW1lLCBzb3VyY2UsIHBhdGgsIGxvYyB9ID0gZXJyb3JcbiAgICAgIHJlc3VsdC5lcnJvciA9IHtcbiAgICAgICAgbmFtZTogJ0NvZGVGcmFtZUVycm9yJyxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgc3RhY2ssXG4gICAgICAgIGZpbGVuYW1lLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHBhdGg6IHBhdGggPyBtYWtlSXBjUGF0aChwYXRoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgbG9jLFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQuZXJyb3IgPSB7XG4gICAgICAgIG5hbWU6ICdFcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBlcnJvci5zdGFjayxcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG1hdGNoZXMpIHJlc3VsdC5tYXRjaGVzID0gbWF0Y2hlcy5tYXAoKG0pID0+IG1ha2VJcGNNYXRjaChiYWNrZW5kLCBtKSlcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0SXBjRXJyb3IoZXJyb3I6IElwY0Vycm9yKTogRXJyb3Ige1xuICBzd2l0Y2ggKGVycm9yLm5hbWUpIHtcbiAgICBjYXNlICdDb2RlRnJhbWVFcnJvcic6IHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSwgZmlsZW5hbWUsIHNvdXJjZSwgbG9jLCBzdGFjayB9ID0gZXJyb3JcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBDb2RlRnJhbWVFcnJvcihtZXNzYWdlLCB7IGZpbGVuYW1lLCBzb3VyY2UsIGxvYyB9KVxuICAgICAgcmVzdWx0LnN0YWNrID0gc3RhY2tcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc3QgeyBtZXNzYWdlLCBzdGFjayB9ID0gZXJyb3JcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBFcnJvcihtZXNzYWdlKVxuICAgICAgcmVzdWx0LnN0YWNrID0gc3RhY2tcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gIH1c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