{
  "definitions": [
    {
      "callable": true,
      "callees": [],
      "callers": [
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "isTypedServices",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        },
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "isTypedServices",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        }
      ],
      "exported": false,
      "flow": "leaf",
      "kind": "lexical_declaration",
      "line": 58,
      "name": "isRecord",
      "signature": "const isRecord = function isRecord(value: unknown): value is Record<string, unknown> {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "isRecord",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        },
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "isRecord",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        }
      ],
      "callers": [
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "isArrayLikeReceiver",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        }
      ],
      "exported": false,
      "flow": "relay",
      "kind": "lexical_declaration",
      "line": 62,
      "name": "isTypedServices",
      "signature": "const isTypedServices = function isTypedServices(value: unknown): value is TypedParserServices {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "isTypedServices",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        }
      ],
      "callers": [
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "mutatedParam",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        }
      ],
      "exported": false,
      "flow": "relay",
      "kind": "lexical_declaration",
      "line": 71,
      "name": "isArrayLikeReceiver",
      "signature": "const isArrayLikeReceiver = function isArrayLikeReceiver(context: Rule.RuleContext, receiver: unknown): boolean {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "asMember",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        }
      ],
      "exported": false,
      "flow": "leaf",
      "kind": "lexical_declaration",
      "line": 25,
      "name": "isMember",
      "signature": "const isMember = function isMember(value: unknown): value is MemberNode {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "mutatedParam",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        }
      ],
      "exported": false,
      "flow": "leaf",
      "kind": "lexical_declaration",
      "line": 41,
      "name": "resolvesToParameter",
      "signature": "const resolvesToParameter = function resolvesToParameter(scope: Scope.Scope | null, name: string): boolean {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "isArrayLikeReceiver",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        },
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "resolvesToParameter",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        }
      ],
      "callers": [],
      "exported": false,
      "flow": "entry",
      "kind": "lexical_declaration",
      "line": 86,
      "name": "mutatedParam",
      "signature": "const mutatedParam = function mutatedParam("
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
          "name": "isMember",
          "source": {
            "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "label": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.md",
            "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts"
          }
        }
      ],
      "callers": [],
      "exported": false,
      "flow": "entry",
      "kind": "lexical_declaration",
      "line": 29,
      "name": "asMember",
      "signature": "const asMember = function asMember(value: unknown): MemberNode | null {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 5,
      "name": "MUTATORS",
      "signature": "const MUTATORS = new Set<string>(["
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "interface_declaration",
      "line": 17,
      "name": "MemberNode",
      "signature": "interface MemberNode {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 33,
      "name": "rootIdentifier",
      "signature": "const rootIdentifier = function rootIdentifier(node: MemberNode | null): MemberNode | null {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 42,
      "name": "current",
      "signature": "let current: Scope.Scope | null = scope;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 44,
      "name": "variable",
      "signature": "const variable = current.variables.find((entry) => entry.name === name);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "interface_declaration",
      "line": 53,
      "name": "TypedParserServices",
      "signature": "interface TypedParserServices {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 66,
      "name": "{ esTreeNodeToTSNodeMap: nodeMap, program }",
      "signature": "const { esTreeNodeToTSNodeMap: nodeMap, program } = value;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 67,
      "name": "mapsNodes",
      "signature": "const mapsNodes = isRecord(nodeMap) && typeof nodeMap[\"get\"] === \"function\";"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 72,
      "name": "services",
      "signature": "const services: unknown = context.sourceCode.parserServices;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 76,
      "name": "tsNode",
      "signature": "const tsNode = services.esTreeNodeToTSNodeMap.get(receiver);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 80,
      "name": "checker",
      "signature": "const checker = services.program.getTypeChecker();"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 81,
      "name": "type",
      "signature": "const type: ts.Type = checker.getTypeAtLocation(tsNode);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 82,
      "name": "parts",
      "signature": "const parts: ts.Type[] = type.isUnion() ? type.types : [type];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 93,
      "name": "{ callee }",
      "signature": "const { callee } = node;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 94,
      "name": "method",
      "signature": "const method = callee.property.type === \"Identifier\" ? callee.property.name : \"\";"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 101,
      "name": "root",
      "signature": "const root = rootIdentifier(asMember(callee.object));"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "method_definition",
      "line": 109,
      "name": "create",
      "signature": "create(context: Rule.RuleContext): Rule.RuleListener {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 110,
      "name": "onCall",
      "signature": "const onCall = (node: Rule.Node): void => {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 111,
      "name": "hit",
      "signature": "const hit = mutatedParam(context, node);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 116,
      "name": "handlers",
      "signature": "const handlers: [string, (node: Rule.Node) => void][] = [[\"CallExpression\", onCall]];"
    }
  ],
  "document": null,
  "findings": [],
  "generated": false,
  "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
  "language": "typescript",
  "layer": null,
  "name": "no-mutable-parameter.eslint.rule.ts",
  "path": "core/quality/eslint/no-mutable-parameter.eslint.rule.ts",
  "ref": "anatomy:file-quality-core-quality-eslint-no-mutable-parameter-eslint-rule-ts",
  "relations": [
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/quality#folder-quality-core-quality-eslint",
          "json": "https://banes-lab.com/json/anatomy/quality/folder-quality-core-quality-eslint",
          "label": "core/quality/eslint",
          "markdown": "https://banes-lab.com/anatomy/quality/folder-quality-core-quality-eslint.md",
          "ref": "chapter:/anatomy/quality#folder-quality-core-quality-eslint"
        }
      ],
      "relation": "contained-in"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/quality#folder-quality-core-quality-eslint",
          "json": "https://banes-lab.com/json/anatomy/quality/folder-quality-core-quality-eslint",
          "label": "core/quality/eslint",
          "markdown": "https://banes-lab.com/anatomy/quality/folder-quality-core-quality-eslint.md",
          "ref": "chapter:/anatomy/quality#folder-quality-core-quality-eslint"
        }
      ],
      "relation": "linked-from"
    }
  ],
  "slots": null,
  "stats": {
    "bytes": 4604,
    "callable": 10,
    "definitions": 27,
    "edges": 6,
    "exported": 4,
    "files": 1,
    "findings": {},
    "flows": {
      "leaf": 3,
      "relay": 2,
      "entry": 2,
      "isolated": 20
    },
    "lines": {
      "blank": 12,
      "code": 116,
      "total": 128
    }
  },
  "summary": "116 lines of code and 27 definitions.",
  "text": "https://banes-lab.com/source/quality/core/quality/eslint/no-mutable-parameter.eslint.rule.ts.txt",
  "tree": "quality",
  "siblings": {
    "next": {
      "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-optional-dependency-eslint-rule-ts",
      "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-optional-dependency.eslint.rule.ts",
      "label": "core/quality/eslint/no-optional-dependency.eslint.rule.ts",
      "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-optional-dependency.eslint.rule.ts.md",
      "ref": "anatomy:file-quality-core-quality-eslint-no-optional-dependency-eslint-rule-ts"
    },
    "previous": {
      "href": "https://banes-lab.com/anatomy/quality#file-quality-core-quality-eslint-no-mixed-concerns-eslint-rule-ts",
      "json": "https://banes-lab.com/json/source/quality/core/quality/eslint/no-mixed-concerns.eslint.rule.ts",
      "label": "core/quality/eslint/no-mixed-concerns.eslint.rule.ts",
      "markdown": "https://banes-lab.com/source/quality/core/quality/eslint/no-mixed-concerns.eslint.rule.ts.md",
      "ref": "anatomy:file-quality-core-quality-eslint-no-mixed-concerns-eslint-rule-ts"
    }
  },
  "up": {
    "href": null,
    "json": "https://banes-lab.com/json/api/source/quality/core/quality/eslint",
    "label": "core/quality/eslint",
    "markdown": "https://banes-lab.com/api/source/quality/core/quality/eslint.md",
    "ref": "api:source/quality/core/quality/eslint"
  }
}
