UNPKG

@saleor/eslint-plugin-saleor-app

Version:
74 lines (72 loc) 3.04 kB
// 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 };