gauge-ts
Version:
Typescript runner for Gauge
128 lines (127 loc) • 6.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RefactorProcessor = void 0;
const node_os_1 = require("node:os");
const typescript_1 = require("typescript");
const typescript_2 = require("typescript");
const messages_pb_1 = require("../gen/messages_pb");
const spec_pb_1 = require("../gen/spec_pb");
const CodeHelper_1 = require("../helpers/CodeHelper");
const StepRegistry_1 = require("../models/StepRegistry");
const Util_1 = require("../utils/Util");
class RefactorProcessor extends CodeHelper_1.CodeHelper {
process(req) {
const oldStep = req.getOldstepvalue();
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
const newStep = req.getNewstepvalue();
if (!oldStep || !newStep) {
return;
}
if (StepRegistry_1.default.hasMultipleImplementations(oldStep.getStepvalue())) {
const res = new messages_pb_1.RefactorResponse();
res.setSuccess(false);
res.setError(`Multiple Implementation found for ${oldStep.getParameterizedstepvalue()}`);
return res;
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const positions = req.getParampositionsList().map((p) => {
const pp = new messages_pb_1.ParameterPosition();
pp.setNewposition(p.getNewposition());
pp.setOldposition(p.getOldposition());
return pp;
});
return this.refactor(oldStep, newStep, positions);
}
refactor(oldStep, newStep, paramPositions) {
const response = new messages_pb_1.RefactorResponse();
try {
const info = StepRegistry_1.default.get(oldStep.getStepvalue());
const filePath = info.getFilePath();
const source = (0, typescript_2.createSourceFile)(filePath, Util_1.Util.readFile(filePath), typescript_2.ScriptTarget.Latest, false, typescript_2.ScriptKind.TS);
const change1 = new messages_pb_1.FileChanges();
change1.setFilename(filePath);
const change2 = new messages_pb_1.FileChanges();
change2.setFilename(filePath);
(0, typescript_2.forEachChild)(source, (childNode) => {
if ((0, typescript_2.isClassDeclaration)(childNode)) {
(0, typescript_2.forEachChild)(childNode, (node) => {
if ((0, typescript_2.isMethodDeclaration)(node) &&
this.hasStepDecorator(node) &&
this.hasStepText(node, info.getStepText())) {
const diff1 = new messages_pb_1.TextDiff();
const span = this.getStepTextRange(source, node);
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/restrict-template-expressions
diff1.setContent(`"${newStep.getParameterizedstepvalue()}"`);
diff1.setSpan(span);
change1.addDiffs(diff1);
const diff2 = new messages_pb_1.TextDiff();
const oldParams = node.parameters;
const newParams = new Array();
for (const p of paramPositions) {
if (p.getOldposition() < 0) {
const pName = this.getParamName(paramPositions.indexOf(p), oldParams, source);
newParams.splice(p.getNewposition(), 0, typescript_2.factory.createParameterDeclaration(undefined, undefined, `${pName}: any`));
}
else {
newParams.splice(p.getNewposition(), 0, oldParams[p.getOldposition()]);
}
}
const content = newParams
.map((p) => {
return this.printer.printNode(typescript_2.EmitHint.Unspecified, p, source);
})
.join(", ");
diff2.setContent(content);
diff2.setSpan(this.createSpan(source, node.parameters));
change2.addDiffs(diff2);
}
});
}
});
response.setFileschangedList([filePath]);
response.setFilechangesList([change1, change2]);
response.setSuccess(true);
}
catch (error) {
const err = error;
response.setError(`${err.message}${node_os_1.EOL}${err.stack ?? ""}`);
response.setSuccess(false);
}
return response;
}
getParamName(index, params, source) {
const name = `arg${index}`;
const p = params.map((p) => {
return this.printer.printNode(typescript_2.EmitHint.Unspecified, p, source);
});
return !p.includes(name)
? name
: this.getParamName(index + 1, params, source);
}
getStepTextRange(source, node) {
const dec = (0, typescript_1.getDecorators)(node);
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any
const stepDecExp =
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
dec.filter(CodeHelper_1.CodeHelper.isStepDecorator)[0].expression;
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
return this.createSpan(source, stepDecExp.arguments[0]);
}
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
createSpan(source, node) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
const start = source.getLineAndCharacterOfPosition(node.pos);
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
const end = source.getLineAndCharacterOfPosition(node.end);
const span = new spec_pb_1.Span();
span.setStart(start.line + 1);
span.setStartchar(start.character);
span.setEnd(end.line + 1);
span.setEndchar(end.character);
return span;
// eslint-disable-next-line padded-blocks
}
}
exports.RefactorProcessor = RefactorProcessor;