{
  "definitions": [
    {
      "callable": true,
      "callees": [],
      "callers": [
        {
          "file": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
          "name": "program",
          "source": {
            "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "label": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts.md",
            "ref": "anatomy:file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts"
          }
        }
      ],
      "exported": false,
      "flow": "leaf",
      "kind": "lexical_declaration",
      "line": 51,
      "name": "readEntries",
      "signature": "const readEntries = function readEntries(): AllowlistEntry[] {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [
        {
          "file": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
          "name": "verdictFor",
          "source": {
            "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "label": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts.md",
            "ref": "anatomy:file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts"
          }
        }
      ],
      "exported": false,
      "flow": "leaf",
      "kind": "lexical_declaration",
      "line": 111,
      "name": "fileExportsSymbol",
      "signature": "const fileExportsSymbol = function fileExportsSymbol(entry: AllowlistEntry): boolean {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [
        {
          "file": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
          "name": "verdictFor",
          "source": {
            "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "label": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts.md",
            "ref": "anatomy:file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts"
          }
        }
      ],
      "exported": false,
      "flow": "leaf",
      "kind": "lexical_declaration",
      "line": 119,
      "name": "referencedElsewhere",
      "signature": "const referencedElsewhere = function referencedElsewhere(entry: AllowlistEntry, index: SourceIndex): boolean {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
          "name": "fileExportsSymbol",
          "source": {
            "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "label": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts.md",
            "ref": "anatomy:file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts"
          }
        },
        {
          "file": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
          "name": "referencedElsewhere",
          "source": {
            "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "label": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts.md",
            "ref": "anatomy:file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts"
          }
        }
      ],
      "callers": [],
      "exported": false,
      "flow": "entry",
      "kind": "lexical_declaration",
      "line": 124,
      "name": "verdictFor",
      "signature": "const verdictFor = function verdictFor(entry: AllowlistEntry, index: SourceIndex): string | null {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "shared/factories/listener.factory.ts",
          "name": "listener",
          "source": {
            "href": "https://banes-lab.com/anatomy/governance#file-governance-shared-factories-listener-factory-ts",
            "json": "https://banes-lab.com/json/source/governance/shared/factories/listener.factory.ts",
            "label": "shared/factories/listener.factory.ts",
            "markdown": "https://banes-lab.com/source/governance/shared/factories/listener.factory.ts.md",
            "ref": "anatomy:file-governance-shared-factories-listener-factory-ts"
          }
        }
      ],
      "callers": [],
      "exported": true,
      "flow": "entry",
      "kind": "method_definition",
      "line": 156,
      "name": "create",
      "signature": "create(context: RuleContext): RuleListener {"
    },
    {
      "callable": true,
      "callees": [
        {
          "file": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
          "name": "readEntries",
          "source": {
            "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts",
            "json": "https://banes-lab.com/json/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "label": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
            "markdown": "https://banes-lab.com/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts.md",
            "ref": "anatomy:file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts"
          }
        }
      ],
      "callers": [],
      "exported": true,
      "flow": "entry",
      "kind": "method_definition",
      "line": 161,
      "name": "program",
      "signature": "program(_view, node) {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 19,
      "name": "ROOT",
      "signature": "const ROOT = MEMBER_ROOT;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 20,
      "name": "ANCHOR_FILE",
      "signature": "const ANCHOR_FILE = resolveFile(FOUNDATION_SUBJECT, \"registry\", projectFiles());"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "interface_declaration",
      "line": 22,
      "name": "AllowlistEntry",
      "signature": "interface AllowlistEntry {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "interface_declaration",
      "line": 27,
      "name": "SourceIndex",
      "signature": "interface SourceIndex {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 33,
      "name": "walk",
      "signature": "const walk = function walk(dir: string): string[] {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 37,
      "name": "out",
      "signature": "const out: string[] = [];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 39,
      "name": "full",
      "signature": "const full = join(dir, entry.name);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 53,
      "name": "split",
      "signature": "const split = entry.file.indexOf(\"::\");"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 61,
      "name": "buildIndex",
      "signature": "const buildIndex = function buildIndex(): SourceIndex {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 62,
      "name": "rootFiles",
      "signature": "const rootFiles = BUILD_CONFIG_FILES.map((name) => join(ROOT, name)).filter((p) => existsSync(p));"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 63,
      "name": "files",
      "signature": "const files = [...walk(ROOT), ...walk(TEST_ROOT), ...walk(SCRIPT_ROOT), ...walk(BUILD_SCRIPT_ROOT), ...rootFiles];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 64,
      "name": "importedBasenames",
      "signature": "const importedBasenames = new Set<string>();"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 65,
      "name": "globSuffixes",
      "signature": "const globSuffixes: string[] = [];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 66,
      "name": "bodies",
      "signature": "const bodies: { path: string; text: string }[] = [];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 83,
      "name": "spec",
      "signature": "const spec = part.slice(0, part.indexOf('\"'));"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 90,
      "name": "moduleIsLive",
      "signature": "const moduleIsLive = function moduleIsLive(file: string, index: SourceIndex): boolean {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 91,
      "name": "base",
      "signature": "const base = basename(file);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 95,
      "name": "EXPORT_KEYWORDS",
      "signature": "const EXPORT_KEYWORDS = ["
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 112,
      "name": "text",
      "signature": "const text = readFileSync(join(ROOT, entry.file), \"utf8\");"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 120,
      "name": "target",
      "signature": "const target = normalizePath(join(ROOT, entry.file));"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 128,
      "name": "live",
      "signature": "const live = moduleIsLive(entry.file, index);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "type_alias_declaration",
      "line": 138,
      "name": "Emit",
      "signature": "type Emit = (context: RuleContext, payload: Record<string, string>, at: RuleNode) => void;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 140,
      "name": "EMITTERS",
      "signature": "const EMITTERS: Record<string, Emit> = {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 162,
      "name": "index",
      "signature": "const index = buildIndex();"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 164,
      "name": "messageId",
      "signature": "const messageId = verdictFor(entry, index);"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": true,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 168,
      "name": "payload",
      "signature": "const payload = { file: entry.file, symbol: entry.symbol };"
    }
  ],
  "document": null,
  "findings": [],
  "generated": false,
  "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts",
  "language": "typescript",
  "layer": null,
  "name": "closure-allowlist-entries-are-wired.eslint.rule.ts",
  "path": "rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts",
  "ref": "anatomy:file-governance-rules-eslint-closure-allowlist-entries-are-wired-eslint-rule-ts",
  "relations": [
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/governance#folder-governance-rules-eslint",
          "json": "https://banes-lab.com/json/anatomy/governance/folder-governance-rules-eslint",
          "label": "rules/eslint",
          "markdown": "https://banes-lab.com/anatomy/governance/folder-governance-rules-eslint.md",
          "ref": "chapter:/anatomy/governance#folder-governance-rules-eslint"
        }
      ],
      "relation": "contained-in"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/governance#file-governance-shared-factories-listener-factory-ts",
          "json": "https://banes-lab.com/json/source/governance/shared/factories/listener.factory.ts",
          "label": "shared/factories/listener.factory.ts",
          "markdown": "https://banes-lab.com/source/governance/shared/factories/listener.factory.ts.md",
          "ref": "anatomy:file-governance-shared-factories-listener-factory-ts"
        }
      ],
      "relation": "uses"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-zombie-code",
          "json": "https://banes-lab.com/json/records/architecture/zombie-code",
          "label": "Zombie Code",
          "markdown": "https://banes-lab.com/records/architecture/zombie-code.md",
          "ref": "architecture:zombie-code"
        }
      ],
      "relation": "detects"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/governance#folder-governance-rules-eslint",
          "json": "https://banes-lab.com/json/anatomy/governance/folder-governance-rules-eslint",
          "label": "rules/eslint",
          "markdown": "https://banes-lab.com/anatomy/governance/folder-governance-rules-eslint.md",
          "ref": "chapter:/anatomy/governance#folder-governance-rules-eslint"
        },
        {
          "href": "https://banes-lab.com/anatomy/governance#folder-governance-shared-factories",
          "json": "https://banes-lab.com/json/anatomy/governance/folder-governance-shared-factories",
          "label": "shared/factories",
          "markdown": "https://banes-lab.com/anatomy/governance/folder-governance-shared-factories.md",
          "ref": "chapter:/anatomy/governance#folder-governance-shared-factories"
        }
      ],
      "relation": "linked-from"
    }
  ],
  "slots": null,
  "stats": {
    "bytes": 7272,
    "callable": 9,
    "definitions": 32,
    "edges": 4,
    "exported": 5,
    "files": 1,
    "findings": {},
    "flows": {
      "leaf": 3,
      "entry": 3,
      "isolated": 26
    },
    "lines": {
      "blank": 14,
      "code": 176,
      "total": 190
    }
  },
  "summary": "176 lines of code and 32 definitions.",
  "text": "https://banes-lab.com/source/governance/rules/eslint/closure-allowlist-entries-are-wired.eslint.rule.ts.txt",
  "tree": "governance",
  "siblings": {
    "next": {
      "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-closure-barrel-must-be-glob-eslint-rule-ts",
      "json": "https://banes-lab.com/json/source/governance/rules/eslint/closure-barrel-must-be-glob.eslint.rule.ts",
      "label": "rules/eslint/closure-barrel-must-be-glob.eslint.rule.ts",
      "markdown": "https://banes-lab.com/source/governance/rules/eslint/closure-barrel-must-be-glob.eslint.rule.ts.md",
      "ref": "anatomy:file-governance-rules-eslint-closure-barrel-must-be-glob-eslint-rule-ts"
    },
    "previous": {
      "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-centralized-strings-eslint-rule-ts",
      "json": "https://banes-lab.com/json/source/governance/rules/eslint/centralized-strings.eslint.rule.ts",
      "label": "rules/eslint/centralized-strings.eslint.rule.ts",
      "markdown": "https://banes-lab.com/source/governance/rules/eslint/centralized-strings.eslint.rule.ts.md",
      "ref": "anatomy:file-governance-rules-eslint-centralized-strings-eslint-rule-ts"
    }
  },
  "up": {
    "href": null,
    "json": "https://banes-lab.com/json/api/source/governance/rules/eslint",
    "label": "rules/eslint",
    "markdown": "https://banes-lab.com/api/source/governance/rules/eslint.md",
    "ref": "api:source/governance/rules/eslint"
  }
}
