@fenge/eslint-plugin-ts
Version:
An eslint plugin for TypeScript
38 lines • 6.04 kB
JavaScript
import { ESLintUtils, } from "@typescript-eslint/utils";
import { getRuleName } from "../utils.js";
const name = getRuleName(import.meta.url);
const rule = {
meta: {
messages: {
default: "Disallow spreading parameter when the corresponding place in the function definition is not a rest parameter.",
},
},
create: (context) => {
let parserServices = undefined;
let checker = undefined;
const isSpreadingParameter = (node, index) => {
parserServices ??= ESLintUtils.getParserServices(context);
checker ??= parserServices.program.getTypeChecker();
const dotDotDot = checker
.getResolvedSignature(parserServices.esTreeNodeToTSNodeMap.get(node))
?.getDeclaration()
.parameters.at(index)?.dotDotDotToken;
// Using `dotDotDot?.kind === ts.SyntaxKind.DotDotDotToken` is the best. But relying ts is not good.
return typeof dotDotDot?.kind === "number";
};
const handle = (node) => {
node.arguments.forEach((arg, index) => {
if (arg.type === "SpreadElement" &&
!isSpreadingParameter(node, index)) {
context.report({ node: arg, messageId: "default" });
}
});
};
return {
CallExpression: handle,
NewExpression: handle,
};
},
};
export const noMisuseSpreadingParameter = { name, rule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tbWlzdXNlLXNwcmVhZGluZy1wYXJhbWV0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVsZXMvbm8tbWlzdXNlLXNwcmVhZGluZy1wYXJhbWV0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFdBQVcsR0FFWixNQUFNLDBCQUEwQixDQUFDO0FBR2xDLE9BQU8sRUFBRSxXQUFXLEVBQWdCLE1BQU0sYUFBYSxDQUFDO0FBS3hELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sSUFBSSxHQUFvQjtJQUM1QixJQUFJLEVBQUU7UUFDSixRQUFRLEVBQUU7WUFDUixPQUFPLEVBQ0wsK0dBQStHO1NBQ2xIO0tBQ0Y7SUFDRCxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNsQixJQUFJLGNBQWMsR0FDaEIsU0FBUyxDQUFDO1FBQ1osSUFBSSxPQUFPLEdBQStCLFNBQVMsQ0FBQztRQUNwRCxNQUFNLG9CQUFvQixHQUFHLENBQzNCLElBQW9DLEVBQ3BDLEtBQWEsRUFDYixFQUFFO1lBQ0YsY0FBYyxLQUFLLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFjLENBQUMsQ0FBQztZQUNqRSxPQUFPLEtBQUssY0FBYyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUVwRCxNQUFNLFNBQVMsR0FBRyxPQUFPO2lCQUN0QixvQkFBb0IsQ0FDbkIsY0FBYyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFXLENBRWhDLENBQ3JCO2dCQUNELEVBQUUsY0FBYyxFQUFFO2lCQUNqQixVQUFVLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQztZQUN4QyxvR0FBb0c7WUFDcEcsT0FBTyxPQUFPLFNBQVMsRUFBRSxJQUFJLEtBQUssUUFBUSxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBb0MsRUFBRSxFQUFFO1lBQ3RELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNwQyxJQUNFLEdBQUcsQ0FBQyxJQUFJLEtBQUssZUFBZTtvQkFDNUIsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQ2xDLENBQUM7b0JBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQ3RELENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVGLE9BQU87WUFDTCxjQUFjLEVBQUUsTUFBTTtZQUN0QixhQUFhLEVBQUUsTUFBTTtTQUN0QixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVTTGludFV0aWxzLFxuICB0eXBlIFBhcnNlclNlcnZpY2VzV2l0aFR5cGVJbmZvcm1hdGlvbixcbn0gZnJvbSBcIkB0eXBlc2NyaXB0LWVzbGludC91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSBcImVzbGludFwiO1xuaW1wb3J0IHR5cGUgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcbmltcG9ydCB7IGdldFJ1bGVOYW1lLCB0eXBlIEdldE5vZGUgfSBmcm9tIFwiLi4vdXRpbHMudHNcIjtcblxudHlwZSBDYWxsRXhwcmVzc2lvbiA9IEdldE5vZGU8XCJDYWxsRXhwcmVzc2lvblwiPjtcbnR5cGUgTmV3RXhwcmVzc2lvbiA9IEdldE5vZGU8XCJOZXdFeHByZXNzaW9uXCI+O1xuXG5jb25zdCBuYW1lID0gZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBcIkRpc2FsbG93IHNwcmVhZGluZyBwYXJhbWV0ZXIgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBwbGFjZSBpbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBub3QgYSByZXN0IHBhcmFtZXRlci5cIixcbiAgICB9LFxuICB9LFxuICBjcmVhdGU6IChjb250ZXh0KSA9PiB7XG4gICAgbGV0IHBhcnNlclNlcnZpY2VzOiBQYXJzZXJTZXJ2aWNlc1dpdGhUeXBlSW5mb3JtYXRpb24gfCB1bmRlZmluZWQgPVxuICAgICAgdW5kZWZpbmVkO1xuICAgIGxldCBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpc1NwcmVhZGluZ1BhcmFtZXRlciA9IChcbiAgICAgIG5vZGU6IENhbGxFeHByZXNzaW9uIHwgTmV3RXhwcmVzc2lvbixcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgKSA9PiB7XG4gICAgICBwYXJzZXJTZXJ2aWNlcyA/Pz0gRVNMaW50VXRpbHMuZ2V0UGFyc2VyU2VydmljZXMoY29udGV4dCBhcyBhbnkpO1xuICAgICAgY2hlY2tlciA/Pz0gcGFyc2VyU2VydmljZXMucHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuXG4gICAgICBjb25zdCBkb3REb3REb3QgPSBjaGVja2VyXG4gICAgICAgIC5nZXRSZXNvbHZlZFNpZ25hdHVyZShcbiAgICAgICAgICBwYXJzZXJTZXJ2aWNlcy5lc1RyZWVOb2RlVG9UU05vZGVNYXAuZ2V0KG5vZGUgYXMgYW55KSBhc1xuICAgICAgICAgICAgfCB0cy5DYWxsRXhwcmVzc2lvblxuICAgICAgICAgICAgfCB0cy5OZXdFeHByZXNzaW9uLFxuICAgICAgICApXG4gICAgICAgID8uZ2V0RGVjbGFyYXRpb24oKVxuICAgICAgICAucGFyYW1ldGVycy5hdChpbmRleCk/LmRvdERvdERvdFRva2VuO1xuICAgICAgLy8gVXNpbmcgYGRvdERvdERvdD8ua2luZCA9PT0gdHMuU3ludGF4S2luZC5Eb3REb3REb3RUb2tlbmAgaXMgdGhlIGJlc3QuIEJ1dCByZWx5aW5nIHRzIGlzIG5vdCBnb29kLlxuICAgICAgcmV0dXJuIHR5cGVvZiBkb3REb3REb3Q/LmtpbmQgPT09IFwibnVtYmVyXCI7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZSA9IChub2RlOiBDYWxsRXhwcmVzc2lvbiB8IE5ld0V4cHJlc3Npb24pID0+IHtcbiAgICAgIG5vZGUuYXJndW1lbnRzLmZvckVhY2goKGFyZywgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFyZy50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIiAmJlxuICAgICAgICAgICFpc1NwcmVhZGluZ1BhcmFtZXRlcihub2RlLCBpbmRleClcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlOiBhcmcsIG1lc3NhZ2VJZDogXCJkZWZhdWx0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgQ2FsbEV4cHJlc3Npb246IGhhbmRsZSxcbiAgICAgIE5ld0V4cHJlc3Npb246IGhhbmRsZSxcbiAgICB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IG5vTWlzdXNlU3ByZWFkaW5nUGFyYW1ldGVyID0geyBuYW1lLCBydWxlIH07XG4iXX0=