@saleor/eslint-plugin-saleor-app
Version:
ESLint plugin for Saleor Apps
74 lines (72 loc) • 3.04 kB
JavaScript
// src/rules/logger.ts
import { ESLintUtils } from "@typescript-eslint/utils";
import * as tsutils from "tsutils";
import ts from "typescript";
var loggerRules = ESLintUtils.RuleCreator.withoutDocs({
create(context, options) {
const propertiesToCheck = new Set(options[0]);
return {
CallExpression(node) {
if (node.callee.type === "MemberExpression" && node.callee.object.type === "Identifier" && propertiesToCheck.has(node.callee.object.name)) {
const loggerData = node.arguments.find(
(arg) => arg.type === "ObjectExpression"
);
if (loggerData) {
const objectProperties = loggerData.properties;
const parserServices = ESLintUtils.getParserServices(context);
const checker = parserServices.program.getTypeChecker();
objectProperties.forEach((property) => {
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(property);
const tsNodeType = checker.getTypeAtLocation(tsNode);
if (property.type === "Property" && property.shorthand && property.value.type === "Identifier") {
if (tsutils.isObjectType(tsNodeType) || tsutils.isGenericType(tsNodeType) || tsutils.isInterfaceType(tsNodeType) || tsutils.isSpreadElement(tsNode) || tsutils.isClassExpression(tsNode) || tsutils.isClassDeclaration(tsNode) || tsutils.isEmptyObjectType(tsNodeType)) {
context.report({
node: property,
messageId: "noShorthand"
});
}
if (tsutils.isArrayTypeNode(tsNode)) {
context.report({
node: property,
messageId: "noArray"
});
}
if (tsutils.isTypeFlagSet(tsNodeType, ts.TypeFlags.Any) || tsutils.isTypeFlagSet(tsNodeType, ts.TypeFlags.Unknown) || tsutils.isGenericType(tsNodeType)) {
context.report({
node: property,
messageId: "noUnknowns"
});
}
}
});
}
}
}
};
},
meta: {
type: "problem",
docs: {
description: "Invalid logs usage - object shorthand property"
},
messages: {
noShorthand: "Potential PII leak: object shorthand property used with object value inside logger arguments. Pass only specific fields from the object to the logger.",
noArray: "Potential PII leak: object shorthand property used with array value inside logger arguments. Please use `redactLogArray` method.",
noUnknowns: "Potential PII leak: object shorthand property used with unknown value inside logger arguments. Please use only known values."
},
schema: [
{
type: "array",
items: {
type: "string",
title: "Override logger names to check",
default: ["logger"]
}
}
]
},
defaultOptions: [["logger"]]
});
export {
loggerRules
};