@typespec/versioning
Version:
TypeSpec library for declaring and emitting versioned APIs
45 lines • 2.12 kB
JavaScript
import { getSourceLocation, getTypeName, } from "@typespec/compiler";
import { getAllVersions } from "./versioning.js";
export function getVersionAdditionCodefixes(version, type, program, typeOptions) {
if (typeof version === "string") {
return getVersionAdditionCodeFixFromString(version, type, program, typeOptions);
}
return getVersionAdditionCodeFixFromVersion(version, type, typeOptions);
}
function getVersionAdditionCodeFixFromVersion(version, type, typeOptions) {
if (type.node === undefined)
return undefined;
const enumMember = version.enumMember;
const decoratorDeclaration = `@added(${enumMember.enum.name}.${enumMember.name})`;
return [
getDecorationAdditionCodeFix("add-version-to-type", decoratorDeclaration, getTypeName(type, typeOptions), getSourceLocation(type.node)),
];
}
function getVersionAdditionCodeFixFromString(version, type, program, typeOptions) {
const targetVersion = getAllVersions(program, type)?.find((v) => v.value === version);
if (targetVersion === undefined)
return undefined;
return getVersionAdditionCodeFixFromVersion(targetVersion, type, typeOptions);
}
export function getVersionRemovalCodeFixes(version, type, program, typeOptions) {
if (type.node === undefined)
return undefined;
const targetVersion = getAllVersions(program, type)?.find((v) => v.value === version);
if (targetVersion === undefined)
return;
const enumMember = targetVersion.enumMember;
const decoratorDeclaration = `@removed(${enumMember.enum.name}.${enumMember.name})`;
return [
getDecorationAdditionCodeFix("remove-version-from-type", decoratorDeclaration, getTypeName(type, typeOptions), getSourceLocation(type.node)),
];
}
function getDecorationAdditionCodeFix(id, decoratorDeclaration, typeName, location) {
return {
id: id,
label: `Add '${decoratorDeclaration}' to '${typeName}'`,
fix: (context) => {
return context.prependText(location, `${decoratorDeclaration}\n`);
},
};
}
//# sourceMappingURL=validate.codefix.js.map