@colrealpro/react-luau-doctor 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,50 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli.ts", "../src/config.ts", "../src/ci.ts", "../src/files.ts", "../src/git.ts", "../src/reporter.ts", "../src/scope.ts", "../src/scanner.ts", "../src/ast/walk.ts", "../src/ast/context.ts", "../src/ast/react-model.ts", "../src/cache.ts", "../src/inline-disables.ts", "../src/parser.ts", "../src/parser-compat.ts", "../src/project-model.ts", "../src/module-resolution.ts", "../src/project-effects.ts", "../src/roblox-semantics.ts", "../src/rules/helpers.ts", "../src/rules/effect-needs-cleanup.ts", "../src/rules/effect-state-rules.ts", "../src/rules/exhaustive-deps.ts", "../src/rules/no-array-index-as-key.ts", "../src/rules/no-create-context-in-render.ts", "../src/rules/no-nested-component-definition.ts", "../src/rules/no-prop-mutation.ts", "../src/rules/no-random-key.ts", "../src/rules/no-set-state-in-render.ts", "../src/rules/parse-errors.ts", "../src/rules/performance-rules.ts", "../src/rules/prefer-binding-over-state.ts", "../src/rules/react-roblox-lifecycle.ts", "../src/rules/ref-rules.ts", "../src/rules/render-side-effects.ts", "../src/rules/rules-of-hooks.ts", "../src/rules/state-performance.ts", "../src/rules/unstable-context-value.ts", "../src/rules/index.ts", "../src/fix-examples.ts", "../src/progress.ts"],
4
+ "sourcesContent": [
5
+ "#!/usr/bin/env bun\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport packageJson from \"../package.json\";\nimport {\n effectiveSeverity,\n loadConfigWithSource,\n normalizeCategory,\n normalizeRuleSetting,\n ruleFrameworks,\n ruleTags,\n writeConfig,\n} from \"./config\";\nimport { runCiCommand } from \"./ci\";\nimport { fixExampleForRule } from \"./fix-examples\";\nimport { createProgressRenderer } from \"./progress\";\nimport { createInlineSuppressionChecker } from \"./inline-disables\";\nimport { renderAnnotations, renderRulesList, renderTextReport } from \"./reporter\";\nimport { rules } from \"./rules\";\nimport { scanPath } from \"./scanner\";\nimport { aggregateReports, scanProjectWithScope } from \"./scope\";\nimport type {\n BlockingLevel,\n Category,\n Diagnostic,\n DoctorConfig,\n RuleDefinition,\n ScanProgress,\n ScanReport,\n ScanScope,\n Severity,\n} from \"./types\";\n\ninterface CliOptions {\n target: string;\n lint?: boolean;\n deadCode?: boolean;\n supplyChain?: boolean;\n verbose?: boolean;\n debug: boolean;\n outputDir?: string;\n scoreOnly: boolean;\n json: boolean;\n jsonCompact: boolean;\n jsonOut?: string;\n yes: boolean;\n noParallel: boolean;\n project?: string;\n scope?: ScanScope;\n full: boolean;\n base?: string;\n includeUntracked: boolean;\n diff?: boolean | string;\n changedFilesFrom?: string;\n showScore?: boolean;\n categories: Category[];\n noTelemetry: boolean;\n staged: boolean;\n maxDurationSeconds?: number;\n blocking?: BlockingLevel;\n failOn?: BlockingLevel;\n respectInlineDisables?: boolean;\n warnings?: boolean;\n noColor: boolean;\n noCache: boolean;\n annotations: boolean;\n explain?: string;\n minSeverity?: Severity;\n listRules: boolean;\n help: boolean;\n version: boolean;\n}\n\nconst VERSION = packageJson.version;\nconst SCOPES = new Set<ScanScope>([\"full\", \"files\", \"changed\", \"lines\"]);\nconst BLOCKING = new Set<BlockingLevel>([\"error\", \"warning\", \"none\"]);\nconst SEVERITIES = new Set<Severity>([\"suggestion\", \"warning\", \"error\"]);\n\nprocess.stdout.on(\"error\", (error: Error & { code?: string }) => {\n if (error.code === \"EPIPE\") process.exit(0);\n throw error;\n});\n\nfunction usage(): string {\n return `React-Luau Doctor ${VERSION}\n\nUsage:\n react-luau-doctor [directory] [options]\n react-luau-doctor ci <install|config|upgrade>\n react-luau-doctor why <file:line>\n react-luau-doctor rules <command>\n\nScan options:\n --lint / --no-lint Enable or skip React-Luau analysis\n --dead-code / --no-dead-code React Doctor compatibility flag; no Luau dead-code pass yet\n --supply-chain / --no-supply-chain React Doctor compatibility flag; no Roblox supply-chain pass yet\n --verbose Show every finding and per-file details\n --debug Print resolved local scan details to stderr\n --output-dir <dir> Write report.json, diagnostics.json, and summary.json\n --score Output only the numeric score\n --json Output one structured JSON report\n --json-compact Emit compact JSON instead of indented JSON\n --json-out <path> Write the JSON report to a file\n -y, --yes Skip prompts; accepted for React Doctor CLI compatibility\n --no-parallel Force serial scanning (the Luau analyzer is currently serial)\n --project <name> Select project directories, comma-separated\n --scope <value> full, files, changed, or lines\n --full Legacy alias for --scope full\n --base <ref> Git base ref for files/changed/lines scope\n --include-untracked Include untracked files in git scopes\n --diff [base] Alias for changed scope; false forces full scope\n --changed-files-from <file> Read changed paths from a newline-delimited file\n --no-score Hide the local score\n --category <category> Only report a category; repeatable\n --no-telemetry React Doctor-compatible alias for --no-score\n --offline Legacy alias for --no-telemetry\n --staged Scan staged git-index content only\n --max-duration <seconds> Stop after a shared scan time budget and report partial results\n --blocking <level> Exit gate: error, warning, or none\n --fail-on <level> Legacy alias for --blocking\n --respect-inline-disables Respect react-luau-doctor inline suppression comments\n --no-respect-inline-disables Ignore inline suppressions for audit scans\n --warnings / --no-warnings Show warnings (default) or errors only\n --annotations Emit GitHub Actions workflow annotations\n --explain <file:line> Legacy inline form of the why command\n --why <file:line> Alias for --explain\n --no-color Disable automatic ANSI colors\n --no-cache Disable the persistent OS-level analysis cache\n\nReact-Luau Doctor options:\n --min-severity <level> suggestion, warning, or error\n --rules List available rules\n -v, --version Print the version\n -h, --help Show this help\n\nCI commands:\n ci install [--provider github|gitlab] [--pr] [--blocking <level>] [--scope <value>] [reporting toggles] [-y] [--cwd <cwd>]\n ci config [--provider github|gitlab] [--blocking <level>] [--scope <value>] [reporting toggles] [-y] [--cwd <cwd>]\n ci upgrade [--provider github|gitlab] [--pr] [-y] [--cwd <cwd>]\n Reporting toggles: --comment/--no-comment, --review-comments/--no-review-comments, --commit-status/--no-commit-status\n\nRules commands:\n rules list [--category <name>] [--tag <name>] [--framework <name>] [--configured] [--json]\n rules explain <rule> [--json]\n rules set <rule> <severity>\n rules enable <rule> [--severity <level>]\n rules disable <rule>\n rules category <category> <severity>\n rules ignore-tag <tag>\n rules unignore-tag <tag>\n\nConfig:\n react-luau-doctor.config.json or doctor.config.json\n`;\n}\n\nfunction splitLongOption(arg: string): { name: string; inlineValue?: string } {\n if (!arg.startsWith(\"--\")) return { name: arg };\n const equals = arg.indexOf(\"=\");\n if (equals < 0) return { name: arg };\n return { name: arg.slice(0, equals), inlineValue: arg.slice(equals + 1) };\n}\n\nfunction requiredValue(argv: string[], index: number, name: string, inlineValue?: string): { value: string; nextIndex: number } {\n if (inlineValue !== undefined) {\n if (!inlineValue) throw new Error(`${name} requires a value`);\n return { value: inlineValue, nextIndex: index };\n }\n const value = argv[index + 1];\n if (!value || value.startsWith(\"-\")) throw new Error(`${name} requires a value`);\n return { value, nextIndex: index + 1 };\n}\n\nfunction shouldUseColor(noColor = false, machineReadable = false): boolean {\n return !noColor && !machineReadable && process.env.NO_COLOR === undefined && Boolean(process.stdout.isTTY);\n}\n\nconst WHY_ANSI = {\n reset: \"\\u001b[0m\",\n bold: \"\\u001b[1m\",\n dim: \"\\u001b[2m\",\n red: \"\\u001b[31m\",\n yellow: \"\\u001b[33m\",\n magenta: \"\\u001b[35m\",\n};\n\nfunction whyRgb(red: number, green: number, blue: number): string {\n return `\\u001b[38;2;${red};${green};${blue}m`;\n}\n\nfunction whyBgRgb(red: number, green: number, blue: number): string {\n return `\\u001b[48;2;${red};${green};${blue}m`;\n}\n\n// Close to VS Code's Dark+ semantic-token palette. Truecolor ANSI is supported by\n// Windows Terminal, modern PowerShell terminals, and the terminals most people use\n// to run the Doctor.\nconst WHY_THEME = {\n foreground: whyRgb(212, 212, 212),\n variable: whyRgb(156, 220, 254),\n function: whyRgb(220, 220, 170),\n string: whyRgb(206, 145, 120),\n number: whyRgb(181, 206, 168),\n comment: whyRgb(106, 153, 85),\n type: whyRgb(78, 201, 176),\n keyword: whyRgb(197, 134, 192),\n declarationKeyword: whyRgb(86, 156, 214),\n literal: whyRgb(86, 156, 214),\n property: whyRgb(156, 220, 254),\n section: whyRgb(78, 201, 176),\n category: whyRgb(79, 193, 255),\n gutter: whyRgb(96, 96, 96),\n activeGutter: whyRgb(244, 71, 71),\n addedBackground: whyBgRgb(36, 72, 48),\n removedBackground: whyBgRgb(82, 43, 47),\n addedLabelBackground: whyBgRgb(28, 83, 50),\n removedLabelBackground: whyBgRgb(103, 45, 50),\n};\n\nfunction whyPaint(enabled: boolean, value: string, ...codes: string[]): string {\n if (!enabled || codes.length === 0) return value;\n return `${codes.join(\"\")}${value}${WHY_ANSI.reset}`;\n}\n\nfunction whySeverityPaint(enabled: boolean, severity: Severity, value: string): string {\n if (severity === \"error\") return whyPaint(enabled, value, WHY_ANSI.bold, WHY_ANSI.red);\n if (severity === \"warning\") return whyPaint(enabled, value, WHY_ANSI.bold, WHY_ANSI.yellow);\n return whyPaint(enabled, value, WHY_ANSI.bold, WHY_ANSI.magenta);\n}\n\nfunction whySectionTitle(enabled: boolean, value: string): string {\n return whyPaint(enabled, value, WHY_ANSI.bold, WHY_THEME.section);\n}\n\nconst LUAU_CONTROL_KEYWORDS = new Set([\n \"and\",\n \"break\",\n \"continue\",\n \"do\",\n \"else\",\n \"elseif\",\n \"end\",\n \"for\",\n \"if\",\n \"in\",\n \"not\",\n \"or\",\n \"repeat\",\n \"return\",\n \"then\",\n \"until\",\n \"while\",\n]);\nconst LUAU_DECLARATION_KEYWORDS = new Set([\"export\", \"function\", \"local\", \"type\"]);\nconst LUAU_LITERAL_KEYWORDS = new Set([\"false\", \"nil\", \"true\"]);\n\ntype WhyLuauTokenKind = \"whitespace\" | \"comment\" | \"string\" | \"number\" | \"identifier\" | \"operator\";\ninterface WhyLuauToken {\n kind: WhyLuauTokenKind;\n text: string;\n start: number;\n end: number;\n}\n\ninterface WhyCharacterRange {\n start: number;\n end: number;\n}\n\nfunction tokenizeWhyLuauLine(line: string): WhyLuauToken[] {\n const tokens: WhyLuauToken[] = [];\n let index = 0;\n const push = (kind: WhyLuauTokenKind, value: string, start: number): void => {\n tokens.push({ kind, text: value, start, end: start + value.length });\n };\n\n while (index < line.length) {\n const rest = line.slice(index);\n const ch = line[index];\n\n const whitespace = /^\\s+/.exec(rest);\n if (whitespace) {\n push(\"whitespace\", whitespace[0], index);\n index += whitespace[0].length;\n continue;\n }\n\n if (rest.startsWith(\"--\")) {\n push(\"comment\", rest, index);\n break;\n }\n\n if (ch === '\"' || ch === \"'\" || ch === \"`\") {\n let tokenEnd = index + 1;\n while (tokenEnd < line.length) {\n if (line.charCodeAt(tokenEnd) === 92) {\n tokenEnd += 2;\n continue;\n }\n if (line[tokenEnd] === ch) {\n tokenEnd += 1;\n break;\n }\n tokenEnd += 1;\n }\n push(\"string\", line.slice(index, tokenEnd), index);\n index = tokenEnd;\n continue;\n }\n\n if (rest.startsWith(\"[[\")) {\n const close = line.indexOf(\"]]\", index + 2);\n const tokenEnd = close >= 0 ? close + 2 : line.length;\n push(\"string\", line.slice(index, tokenEnd), index);\n index = tokenEnd;\n continue;\n }\n\n const number = /^(?:0[xX][0-9a-fA-F_]+|0[bB][01_]+|\\d[\\d_]*(?:\\.\\d[\\d_]*)?(?:[eE][+-]?\\d[\\d_]*)?)/.exec(rest);\n if (number) {\n push(\"number\", number[0], index);\n index += number[0].length;\n continue;\n }\n\n const identifier = /^[A-Za-z_][A-Za-z0-9_]*/.exec(rest);\n if (identifier) {\n push(\"identifier\", identifier[0], index);\n index += identifier[0].length;\n continue;\n }\n\n const operator = /^(?:\\.\\.\\.|\\.\\.|==|~=|<=|>=|::|->|\\+=|-=|\\*=|\\/=|%=|\\^=|[+\\-*\\/%^#=<>:.,;()[\\]{}])/.exec(rest);\n const token = operator?.[0] ?? ch;\n push(\"operator\", token, index);\n index += token.length;\n }\n return tokens;\n}\n\nfunction previousWhyToken(tokens: WhyLuauToken[], index: number): WhyLuauToken | undefined {\n for (let cursor = index - 1; cursor >= 0; cursor -= 1) {\n if (tokens[cursor].kind !== \"whitespace\") return tokens[cursor];\n }\n return undefined;\n}\n\nfunction nextWhyToken(tokens: WhyLuauToken[], index: number): WhyLuauToken | undefined {\n for (let cursor = index + 1; cursor < tokens.length; cursor += 1) {\n if (tokens[cursor].kind !== \"whitespace\") return tokens[cursor];\n }\n return undefined;\n}\n\nfunction whyIdentifierCodes(tokens: WhyLuauToken[], index: number): string[] {\n const value = tokens[index].text;\n if (LUAU_CONTROL_KEYWORDS.has(value)) return [WHY_ANSI.bold, WHY_THEME.keyword];\n if (LUAU_DECLARATION_KEYWORDS.has(value)) return [WHY_ANSI.bold, WHY_THEME.declarationKeyword];\n if (LUAU_LITERAL_KEYWORDS.has(value)) return [WHY_ANSI.bold, WHY_THEME.literal];\n\n const previous = previousWhyToken(tokens, index);\n const next = nextWhyToken(tokens, index);\n const previousText = previous?.text;\n const nextText = next?.text;\n\n if (previousText === \"function\" || nextText === \"(\") return [WHY_THEME.function];\n if ((previousText === \".\" || previousText === \":\") && nextText === \"(\") return [WHY_THEME.function];\n if (previousText === \"type\" || (previousText === \":\" && nextText !== \"(\")) return [WHY_THEME.type];\n if (previousText === \".\" || previousText === \":\") return [WHY_THEME.property];\n if (/^[A-Z]/.test(value) && (nextText === \".\" || nextText === \"<\")) return [WHY_THEME.type];\n if (nextText === \"=\" && previousText !== \"local\") return [WHY_THEME.property];\n return [WHY_THEME.variable];\n}\n\nfunction whyTokenCodes(tokens: WhyLuauToken[], index: number): string[] {\n const token = tokens[index];\n if (token.kind === \"comment\") return [WHY_THEME.comment];\n if (token.kind === \"string\") return [WHY_THEME.string];\n if (token.kind === \"number\") return [WHY_THEME.number];\n if (token.kind === \"identifier\") return whyIdentifierCodes(tokens, index);\n if (token.kind === \"operator\") return [WHY_THEME.foreground];\n return [];\n}\n\nfunction whyRangeContains(ranges: WhyCharacterRange[], position: number): boolean {\n return ranges.some((range) => position >= range.start && position < range.end);\n}\n\nfunction highlightLuauLine(\n line: string,\n colorized: boolean,\n backgroundRanges: WhyCharacterRange[] = [],\n backgroundCode?: string,\n): string {\n if (!colorized || !line) return line;\n const tokens = tokenizeWhyLuauLine(line);\n return tokens.map((token, index) => {\n const foreground = whyTokenCodes(tokens, index);\n const cuts = new Set<number>([token.start, token.end]);\n for (const range of backgroundRanges) {\n if (range.end <= token.start || range.start >= token.end) continue;\n cuts.add(Math.max(token.start, range.start));\n cuts.add(Math.min(token.end, range.end));\n }\n const points = [...cuts].sort((a, b) => a - b);\n const segments: string[] = [];\n for (let point = 0; point < points.length - 1; point += 1) {\n const segmentStart = points[point];\n const segmentEnd = points[point + 1];\n const value = line.slice(segmentStart, segmentEnd);\n const changed = Boolean(backgroundCode) && whyRangeContains(backgroundRanges, segmentStart);\n if (foreground.length === 0 && !changed) segments.push(value);\n else segments.push(whyPaint(true, value, ...foreground, ...(changed && backgroundCode ? [backgroundCode] : [])));\n }\n return segments.join(\"\");\n }).join(\"\");\n}\n\nfunction changedCharacterRanges(before: string, after: string): { before: WhyCharacterRange[]; after: WhyCharacterRange[] } {\n if (before === after) return { before: [], after: [] };\n let prefix = 0;\n while (prefix < before.length && prefix < after.length && before[prefix] === after[prefix]) prefix += 1;\n let suffix = 0;\n while (\n suffix < before.length - prefix\n && suffix < after.length - prefix\n && before[before.length - 1 - suffix] === after[after.length - 1 - suffix]\n ) suffix += 1;\n return {\n before: before.length - suffix > prefix ? [{ start: prefix, end: before.length - suffix }] : [],\n after: after.length - suffix > prefix ? [{ start: prefix, end: after.length - suffix }] : [],\n };\n}\n\ninterface WhyPreviewDiff {\n beforeRanges: WhyCharacterRange[][];\n afterRanges: WhyCharacterRange[][];\n}\n\nfunction whyPreviewDiff(beforeLines: string[], afterLines: string[]): WhyPreviewDiff {\n const rows = beforeLines.length + 1;\n const columns = afterLines.length + 1;\n const dp = Array.from({ length: rows }, () => Array<number>(columns).fill(0));\n for (let beforeIndex = beforeLines.length - 1; beforeIndex >= 0; beforeIndex -= 1) {\n for (let afterIndex = afterLines.length - 1; afterIndex >= 0; afterIndex -= 1) {\n dp[beforeIndex][afterIndex] = beforeLines[beforeIndex] === afterLines[afterIndex]\n ? dp[beforeIndex + 1][afterIndex + 1] + 1\n : Math.max(dp[beforeIndex + 1][afterIndex], dp[beforeIndex][afterIndex + 1]);\n }\n }\n\n const matches: Array<[number, number]> = [];\n let beforeIndex = 0;\n let afterIndex = 0;\n while (beforeIndex < beforeLines.length && afterIndex < afterLines.length) {\n if (beforeLines[beforeIndex] === afterLines[afterIndex]) {\n matches.push([beforeIndex, afterIndex]);\n beforeIndex += 1;\n afterIndex += 1;\n } else if (dp[beforeIndex + 1][afterIndex] >= dp[beforeIndex][afterIndex + 1]) beforeIndex += 1;\n else afterIndex += 1;\n }\n\n const beforeRanges = beforeLines.map(() => [] as WhyCharacterRange[]);\n const afterRanges = afterLines.map(() => [] as WhyCharacterRange[]);\n const sentinels: Array<[number, number]> = [[-1, -1], ...matches, [beforeLines.length, afterLines.length]];\n for (let matchIndex = 0; matchIndex < sentinels.length - 1; matchIndex += 1) {\n const [previousBefore, previousAfter] = sentinels[matchIndex];\n const [nextBefore, nextAfter] = sentinels[matchIndex + 1];\n const beforeStart = previousBefore + 1;\n const afterStart = previousAfter + 1;\n const beforeCount = nextBefore - beforeStart;\n const afterCount = nextAfter - afterStart;\n const paired = Math.min(beforeCount, afterCount);\n\n for (let offset = 0; offset < paired; offset += 1) {\n const left = beforeStart + offset;\n const right = afterStart + offset;\n const ranges = changedCharacterRanges(beforeLines[left], afterLines[right]);\n beforeRanges[left] = ranges.before;\n afterRanges[right] = ranges.after;\n }\n for (let offset = paired; offset < beforeCount; offset += 1) {\n const line = beforeStart + offset;\n beforeRanges[line] = [{ start: 0, end: Math.max(1, beforeLines[line].length) }];\n }\n for (let offset = paired; offset < afterCount; offset += 1) {\n const line = afterStart + offset;\n afterRanges[line] = [{ start: 0, end: Math.max(1, afterLines[line].length) }];\n }\n }\n\n return { beforeRanges, afterRanges };\n}\n\nfunction normalizeWhyPreviewLines(value: string): string[] {\n const lines = value.split(/\\r?\\n/).map((line) => expandWhyTabs(line));\n while (lines.length > 1 && lines[0].trim().length === 0) lines.shift();\n while (lines.length > 1 && lines.at(-1)?.trim().length === 0) lines.pop();\n if (lines.length <= 1) return lines;\n\n const indentation = (line: string): number => line.match(/^ */)?.[0].length ?? 0;\n const nonBlank = lines\n .map((line, index) => ({ line, index }))\n .filter(({ line }) => line.trim().length > 0);\n if (nonBlank.length === 0) return lines;\n\n const firstIndent = indentation(nonBlank[0].line);\n if (firstIndent > 0) {\n const commonIndent = Math.min(...nonBlank.map(({ line }) => indentation(line)));\n return lines.map((line) => line.trim().length === 0 ? \"\" : line.slice(Math.min(commonIndent, indentation(line))));\n }\n\n // Syntax-node text begins at the expression itself, so the first line has no\n // file indentation while continuation lines still include the source file's\n // tabs/spaces. Remove the continuation baseline, but preserve indentation\n // relative to that baseline for nested code inside the expression.\n const continuation = nonBlank.filter(({ index }) => index > nonBlank[0].index);\n if (continuation.length === 0) return lines;\n const continuationBaseline = Math.min(...continuation.map(({ line }) => indentation(line)));\n if (continuationBaseline <= 0) return lines;\n\n return lines.map((line, index) => {\n if (index <= nonBlank[0].index || line.trim().length === 0) return line;\n return line.slice(Math.min(continuationBaseline, indentation(line)));\n });\n}\n\nfunction renderWhyFixPreview(preview: { before: string; after: string; note?: string }, colorized: boolean, textWidth: number): string[] {\n const beforeLines = normalizeWhyPreviewLines(preview.before);\n const afterLines = normalizeWhyPreviewLines(preview.after);\n const diff = whyPreviewDiff(beforeLines, afterLines);\n const currentLabel = colorized\n ? whyPaint(true, \" CURRENT \", WHY_ANSI.bold, WHY_THEME.foreground, WHY_THEME.removedLabelBackground)\n : \"CURRENT\";\n const suggestedLabel = colorized\n ? whyPaint(true, \" SUGGESTED \", WHY_ANSI.bold, WHY_THEME.foreground, WHY_THEME.addedLabelBackground)\n : \"SUGGESTED\";\n const lines: string[] = [currentLabel];\n beforeLines.forEach((line, index) => {\n lines.push(` ${highlightLuauLine(line, colorized, diff.beforeRanges[index], WHY_THEME.removedBackground)}`);\n });\n lines.push(\"\", suggestedLabel);\n afterLines.forEach((line, index) => {\n lines.push(` ${highlightLuauLine(line, colorized, diff.afterRanges[index], WHY_THEME.addedBackground)}`);\n });\n if (preview.note) {\n lines.push(\"\", ...wrapWhyWords(preview.note, textWidth).map((line) => whyPaint(colorized, line, WHY_ANSI.dim)));\n }\n return lines;\n}\n\nfunction wrapWhyWords(value: string, width: number): string[] {\n const safeWidth = Math.max(32, width);\n const paragraphs = value.split(/\\r?\\n/);\n const lines: string[] = [];\n\n for (let paragraphIndex = 0; paragraphIndex < paragraphs.length; paragraphIndex += 1) {\n const paragraph = paragraphs[paragraphIndex].trim().replace(/\\s+/g, \" \");\n if (!paragraph) {\n lines.push(\"\");\n continue;\n }\n\n let line = \"\";\n for (const word of paragraph.split(\" \")) {\n if (!line) {\n line = word;\n continue;\n }\n if (line.length + 1 + word.length <= safeWidth) {\n line += ` ${word}`;\n continue;\n }\n lines.push(line);\n line = word;\n }\n if (line) lines.push(line);\n if (paragraphIndex < paragraphs.length - 1 && paragraphs[paragraphIndex + 1].trim()) lines.push(\"\");\n }\n\n return lines.length > 0 ? lines : [\"\"];\n}\n\nfunction whyTextWidth(): number {\n return Math.max(60, (process.stdout.columns ?? 120) - 2);\n}\n\nfunction parseBlocking(value: string, name: string): BlockingLevel {\n if (!BLOCKING.has(value as BlockingLevel)) throw new Error(`${name} must be error, warning, or none`);\n return value as BlockingLevel;\n}\n\nfunction parseArgs(argv: string[]): CliOptions {\n const options: CliOptions = {\n target: \".\",\n debug: false,\n scoreOnly: false,\n json: false,\n jsonCompact: false,\n yes: false,\n noParallel: false,\n full: false,\n includeUntracked: false,\n categories: [],\n noTelemetry: false,\n staged: false,\n annotations: false,\n noColor: false,\n noCache: false,\n listRules: false,\n help: false,\n version: false,\n };\n\n let sawTarget = false;\n for (let index = 0; index < argv.length; index += 1) {\n const raw = argv[index];\n const { name: arg, inlineValue } = splitLongOption(raw);\n\n if (arg === \"--lint\") options.lint = true;\n else if (arg === \"--no-lint\") options.lint = false;\n else if (arg === \"--dead-code\") options.deadCode = true;\n else if (arg === \"--no-dead-code\") options.deadCode = false;\n else if (arg === \"--supply-chain\") options.supplyChain = true;\n else if (arg === \"--no-supply-chain\") options.supplyChain = false;\n else if (arg === \"--verbose\") options.verbose = true;\n else if (arg === \"--debug\") options.debug = true;\n else if (arg === \"--score\") options.scoreOnly = true;\n else if (arg === \"--json\") options.json = true;\n else if (arg === \"--json-compact\") options.jsonCompact = true;\n else if (arg === \"-y\" || arg === \"--yes\") options.yes = true;\n else if (arg === \"--no-parallel\") options.noParallel = true;\n else if (arg === \"--full\") options.full = true;\n else if (arg === \"--include-untracked\") options.includeUntracked = true;\n else if (arg === \"--no-score\") options.showScore = false;\n else if (arg === \"--no-telemetry\" || arg === \"--offline\") {\n options.noTelemetry = true;\n options.showScore = false;\n } else if (arg === \"--staged\") options.staged = true;\n else if (arg === \"--no-respect-inline-disables\") options.respectInlineDisables = false;\n else if (arg === \"--respect-inline-disables\") options.respectInlineDisables = true;\n else if (arg === \"--warnings\") options.warnings = true;\n else if (arg === \"--no-warnings\") options.warnings = false;\n else if (arg === \"--no-color\") options.noColor = true;\n else if (arg === \"--no-cache\") options.noCache = true;\n else if (arg === \"--annotations\") options.annotations = true;\n else if (arg === \"--rules\") options.listRules = true;\n else if (arg === \"--help\" || arg === \"-h\") options.help = true;\n else if (arg === \"--version\" || arg === \"-v\") options.version = true;\n else if (arg === \"--output-dir\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n options.outputDir = parsed.value;\n index = parsed.nextIndex;\n } else if (arg === \"--json-out\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n options.jsonOut = parsed.value;\n index = parsed.nextIndex;\n } else if (arg === \"--project\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n options.project = parsed.value;\n index = parsed.nextIndex;\n } else if (arg === \"--scope\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n if (!SCOPES.has(parsed.value as ScanScope)) throw new Error(\"--scope must be full, files, changed, or lines\");\n options.scope = parsed.value as ScanScope;\n index = parsed.nextIndex;\n } else if (arg === \"--base\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n options.base = parsed.value;\n index = parsed.nextIndex;\n } else if (arg === \"--diff\") {\n if (inlineValue !== undefined) options.diff = inlineValue === \"false\" ? false : inlineValue === \"true\" ? true : inlineValue;\n else {\n const next = argv[index + 1];\n if (next && !next.startsWith(\"-\")) {\n options.diff = next === \"false\" ? false : next === \"true\" ? true : next;\n index += 1;\n } else options.diff = true;\n }\n } else if (arg === \"--changed-files-from\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n options.changedFilesFrom = parsed.value;\n index = parsed.nextIndex;\n } else if (arg === \"--category\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n const category = normalizeCategory(parsed.value);\n if (!category) throw new Error(`Unknown category: ${parsed.value}`);\n options.categories.push(category);\n index = parsed.nextIndex;\n } else if (arg === \"--max-duration\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n const seconds = Number(parsed.value);\n if (!Number.isFinite(seconds) || seconds <= 0) throw new Error(\"--max-duration must be a positive number of seconds\");\n options.maxDurationSeconds = seconds;\n index = parsed.nextIndex;\n } else if (arg === \"--blocking\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n options.blocking = parseBlocking(parsed.value, arg);\n index = parsed.nextIndex;\n } else if (arg === \"--fail-on\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n options.failOn = parseBlocking(parsed.value, arg);\n index = parsed.nextIndex;\n } else if (arg === \"--explain\" || arg === \"--why\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n if (options.explain !== undefined) throw new Error(\"Use --explain or --why once; they are aliases\");\n options.explain = parsed.value;\n index = parsed.nextIndex;\n } else if (arg === \"--min-severity\") {\n const parsed = requiredValue(argv, index, arg, inlineValue);\n if (!SEVERITIES.has(parsed.value as Severity)) throw new Error(\"--min-severity must be suggestion, warning, or error\");\n options.minSeverity = parsed.value as Severity;\n index = parsed.nextIndex;\n } else if (arg.startsWith(\"-\")) {\n throw new Error(`Unknown option: ${raw}`);\n } else if (!sawTarget) {\n options.target = raw;\n sawTarget = true;\n } else {\n throw new Error(`Unexpected argument: ${raw}`);\n }\n }\n\n return options;\n}\n\nfunction resolveScope(options: CliOptions, config: DoctorConfig): { scope: ScanScope; base?: string } {\n if (options.full) return { scope: \"full\", base: options.base ?? config.base };\n if (options.scope) return { scope: options.scope, base: options.base ?? config.base };\n if (options.diff !== undefined) {\n if (options.diff === false) return { scope: \"full\", base: options.base ?? config.base };\n return { scope: \"changed\", base: options.base ?? (typeof options.diff === \"string\" ? options.diff : config.base) };\n }\n if (config.scope) return { scope: config.scope, base: options.base ?? config.base };\n if (config.diff !== undefined) {\n if (config.diff === false) return { scope: \"full\", base: options.base ?? config.base };\n return { scope: \"changed\", base: options.base ?? (typeof config.diff === \"string\" ? config.diff : config.base) };\n }\n if (options.changedFilesFrom) return { scope: \"files\", base: options.base ?? config.base };\n return { scope: \"full\", base: options.base ?? config.base };\n}\n\nfunction validateModeFlags(options: CliOptions, scope: ScanScope): void {\n if (options.scope && options.diff !== undefined && options.diff !== false) throw new Error(\"Cannot combine --scope and --diff; pick one mode\");\n if (options.staged && options.diff !== undefined && options.diff !== false) throw new Error(\"Cannot combine --staged and --diff; pick one mode\");\n if (options.staged && (scope === \"full\" || scope === \"changed\")) {\n throw new Error(`Cannot combine --staged with --scope ${scope}; use --scope files or --scope lines, or omit --scope`);\n }\n if (options.includeUntracked && options.staged) throw new Error(\"Cannot combine --include-untracked with --staged; the git index never holds untracked files\");\n if (options.includeUntracked && scope === \"full\") throw new Error(\"--include-untracked requires files, changed, or lines scope\");\n if (options.scoreOnly && options.json) throw new Error(\"Cannot combine --score and --json; pick one output mode\");\n if (options.scoreOnly && options.showScore === false) throw new Error(\"Cannot combine --score with --no-score, --no-telemetry, or --offline\");\n if (options.annotations && (options.json || options.scoreOnly)) throw new Error(\"--annotations cannot be combined with --json or --score\");\n if (options.explain && (options.json || options.scoreOnly || options.annotations || options.staged)) {\n throw new Error(\"--explain cannot be combined with --json, --score, --annotations, or --staged\");\n }\n}\n\nfunction findProjectByName(root: string, name: string): string | null {\n const direct = path.resolve(root, name);\n if (fs.existsSync(direct) && fs.statSync(direct).isDirectory()) return direct;\n\n const ignored = new Set([\".git\", \"node_modules\", \"Packages\", \"DevPackages\", \"ServerPackages\", \"dist\", \"vendor\"]);\n const queue: Array<{ directory: string; depth: number }> = [{ directory: root, depth: 0 }];\n const matches: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (current.depth >= 3) continue;\n for (const entry of fs.readdirSync(current.directory, { withFileTypes: true })) {\n if (!entry.isDirectory() || ignored.has(entry.name)) continue;\n const absolute = path.join(current.directory, entry.name);\n if (entry.name === name) matches.push(absolute);\n queue.push({ directory: absolute, depth: current.depth + 1 });\n }\n }\n if (matches.length > 1) throw new Error(`Project selector \"${name}\" is ambiguous: ${matches.map((match) => path.relative(root, match)).join(\", \")}`);\n return matches[0] ?? null;\n}\n\nfunction resolveProjectRoots(root: string, projectFlag: string | undefined, config: DoctorConfig): string[] {\n const requested = projectFlag ? projectFlag.split(\",\").map((value) => value.trim()).filter(Boolean) : config.projects ?? [];\n if (requested.length === 0) return [root];\n\n return [...new Set(requested.map((project) => {\n const resolved = findProjectByName(root, project);\n if (!resolved) throw new Error(`Could not find project: ${project}`);\n return resolved;\n }))];\n}\n\nfunction serializeReport(report: ScanReport, compact: boolean): string {\n return compact ? JSON.stringify(report) : JSON.stringify(report, null, 2);\n}\n\nfunction writeJsonFile(filename: string, value: unknown, compact = false): void {\n fs.mkdirSync(path.dirname(filename), { recursive: true });\n fs.writeFileSync(filename, `${compact ? JSON.stringify(value) : JSON.stringify(value, null, 2)}\\n`);\n}\n\nfunction writeDiagnosticsDump(directory: string, report: ScanReport): void {\n fs.mkdirSync(directory, { recursive: true });\n writeJsonFile(path.join(directory, \"report.json\"), report);\n writeJsonFile(path.join(directory, \"diagnostics.json\"), report.diagnostics);\n writeJsonFile(path.join(directory, \"summary.json\"), {\n schemaVersion: report.schemaVersion,\n root: report.root,\n scope: report.scope ?? \"full\",\n base: report.base ?? null,\n scannedFiles: report.scannedFiles,\n candidateFiles: report.candidateFiles,\n partial: report.partial,\n skippedFiles: report.skippedFiles ?? [],\n durationMs: report.durationMs,\n score: report.score,\n counts: report.counts,\n });\n}\n\nfunction shouldBlock(report: ScanReport, level: BlockingLevel): boolean {\n if (level === \"none\") return false;\n if (level === \"warning\") return report.counts.error > 0 || report.counts.warning > 0;\n return report.counts.error > 0;\n}\n\nfunction findRule(requested: string): RuleDefinition {\n const rule = rules.find((candidate) => candidate.id === requested || candidate.id.endsWith(`/${requested}`));\n if (!rule) throw new Error(`Unknown rule: ${requested}`);\n return rule;\n}\n\nfunction parseCommandCwd(argv: string[]): { cwd: string; remaining: string[] } {\n let cwd = process.cwd();\n const remaining: string[] = [];\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"-c\" || arg === \"--cwd\") {\n const value = argv[++index];\n if (!value) throw new Error(`${arg} requires a path`);\n cwd = path.resolve(value);\n } else remaining.push(arg);\n }\n return { cwd, remaining };\n}\n\nfunction ruleSeverityMap(config: DoctorConfig): Map<string, string> {\n return new Map(rules.map((rule) => [rule.id, effectiveSeverity(rule.severity, rule.id, config, ruleTags(rule)) ?? \"off\"]));\n}\n\nfunction runRulesCommand(argv: string[]): void {\n const noColor = argv.includes(\"--no-color\");\n const cleaned = argv.filter((arg) => arg !== \"--no-color\");\n const action = cleaned[0] ?? \"list\";\n const { cwd, remaining } = parseCommandCwd(cleaned.slice(1));\n const loaded = loadConfigWithSource(cwd);\n const config = loaded.config;\n\n if (action === \"list\") {\n let category: Category | null = null;\n let tag: string | null = null;\n let framework: string | null = null;\n let configured = false;\n let json = false;\n\n for (let index = 0; index < remaining.length; index += 1) {\n const arg = remaining[index];\n if (arg === \"--configured\") configured = true;\n else if (arg === \"--json\") json = true;\n else if (arg === \"--category\") {\n const value = remaining[++index];\n if (!value) throw new Error(\"rules list --category requires a name\");\n category = normalizeCategory(value);\n if (!category) throw new Error(`Unknown category: ${value}`);\n } else if (arg === \"--tag\") {\n tag = remaining[++index]?.toLowerCase() ?? null;\n if (!tag) throw new Error(\"rules list --tag requires a name\");\n } else if (arg === \"--framework\") {\n framework = remaining[++index]?.toLowerCase() ?? null;\n if (!framework) throw new Error(\"rules list --framework requires a name\");\n } else throw new Error(`Unknown rules list option: ${arg}`);\n }\n\n const severityMap = ruleSeverityMap(config);\n const filtered = rules.filter((rule) => {\n if (category && rule.category !== category) return false;\n if (tag && !ruleTags(rule).includes(tag)) return false;\n if (framework && !ruleFrameworks(rule).includes(framework)) return false;\n if (configured && config.rules?.[rule.id] === undefined && !(config.ignoredTags ?? []).some((ignored) => ruleTags(rule).includes(ignored.toLowerCase()))) {\n return false;\n }\n return true;\n });\n\n if (json) {\n process.stdout.write(`${JSON.stringify(filtered.map((rule) => ({\n id: rule.id,\n severity: severityMap.get(rule.id),\n defaultSeverity: rule.severity,\n category: rule.category,\n tags: ruleTags(rule),\n frameworks: ruleFrameworks(rule),\n description: rule.description,\n })), null, 2)}\\n`);\n } else process.stdout.write(`${renderRulesList(filtered, process.stdout.columns ?? 120, severityMap, shouldUseColor(noColor))}\\n`);\n return;\n }\n\n if (action === \"explain\") {\n const requested = remaining[0];\n if (!requested) throw new Error(\"rules explain requires a rule id\");\n const json = remaining.slice(1).includes(\"--json\");\n const extra = remaining.slice(1).filter((arg) => arg !== \"--json\");\n if (extra.length > 0) throw new Error(`Unknown rules explain option: ${extra[0]}`);\n const rule = findRule(requested);\n const currentSeverity = effectiveSeverity(rule.severity, rule.id, config, ruleTags(rule)) ?? \"off\";\n const result = {\n id: rule.id,\n severity: currentSeverity,\n defaultSeverity: rule.severity,\n category: rule.category,\n tags: ruleTags(rule),\n frameworks: ruleFrameworks(rule),\n description: rule.description,\n example: fixExampleForRule(rule.id),\n };\n if (json) process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n else {\n const colorized = shouldUseColor(noColor);\n const width = whyTextWidth();\n const lines = [\n whyPaint(colorized, rule.id, WHY_ANSI.bold, WHY_ANSI.magenta),\n `${rule.category} | Severity: ${currentSeverity} | Default: ${rule.severity}`,\n \"\",\n whySectionTitle(colorized, \"What this checks\"),\n ...wrapWhyWords(rule.description, width),\n ];\n if (result.example) {\n lines.push(\"\", whySectionTitle(colorized, \"Example fix\"),\n ...renderWhyFixPreview(result.example, colorized, width));\n }\n lines.push(\"\", ...wrapWhyWords(\"This is an example pattern, not an automatic edit. To explain a finding in your code, run:\", width),\n \" react-luau-doctor why <file:line>\");\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n }\n return;\n }\n\n if (action === \"set\") {\n const requested = remaining[0];\n const rawSeverity = remaining[1];\n if (!requested || !rawSeverity) throw new Error(\"rules set requires <rule> <severity>\");\n const rule = findRule(requested);\n const severity = normalizeRuleSetting(rawSeverity);\n if (!severity) throw new Error(\"Rule severity must be off, suggestion, warning/warn, or error\");\n const filename = writeConfig(cwd, (current) => ({ ...current, rules: { ...current.rules, [rule.id]: severity } }));\n process.stdout.write(`Set ${rule.id} to ${severity} in ${path.relative(cwd, filename)}\\n`);\n return;\n }\n\n if (action === \"enable\") {\n const requested = remaining[0];\n if (!requested) throw new Error(\"rules enable requires a rule id\");\n const rule = findRule(requested);\n let severity: Severity = rule.severity;\n const severityIndex = remaining.indexOf(\"--severity\");\n if (severityIndex >= 0) {\n const value = remaining[severityIndex + 1];\n const normalized = value ? normalizeRuleSetting(value) : null;\n if (!normalized || normalized === \"off\") throw new Error(\"--severity must be suggestion, warning/warn, or error\");\n severity = normalized;\n }\n const filename = writeConfig(cwd, (current) => ({ ...current, rules: { ...current.rules, [rule.id]: severity } }));\n process.stdout.write(`Enabled ${rule.id} at ${severity} in ${path.relative(cwd, filename)}\\n`);\n return;\n }\n\n if (action === \"disable\") {\n const requested = remaining[0];\n if (!requested) throw new Error(\"rules disable requires a rule id\");\n const rule = findRule(requested);\n const filename = writeConfig(cwd, (current) => ({ ...current, rules: { ...current.rules, [rule.id]: \"off\" } }));\n process.stdout.write(`Disabled ${rule.id} in ${path.relative(cwd, filename)}\\n`);\n return;\n }\n\n if (action === \"category\") {\n const rawCategory = remaining[0];\n const rawSeverity = remaining[1];\n if (!rawCategory || !rawSeverity) throw new Error(\"rules category requires <category> <severity>\");\n const category = normalizeCategory(rawCategory);\n const severity = normalizeRuleSetting(rawSeverity);\n if (!category) throw new Error(`Unknown category: ${rawCategory}`);\n if (!severity) throw new Error(\"Category severity must be off, suggestion, warning/warn, or error\");\n const categoryRules = rules.filter((rule) => rule.category === category);\n const filename = writeConfig(cwd, (current) => ({\n ...current,\n rules: Object.fromEntries([\n ...Object.entries(current.rules ?? {}),\n ...categoryRules.map((rule) => [rule.id, severity] as const),\n ]),\n }));\n process.stdout.write(`Set ${categoryRules.length} ${category} rules to ${severity} in ${path.relative(cwd, filename)}\\n`);\n return;\n }\n\n if (action === \"ignore-tag\" || action === \"unignore-tag\") {\n const tag = remaining[0]?.toLowerCase();\n if (!tag) throw new Error(`rules ${action} requires a tag`);\n const filename = writeConfig(cwd, (current) => {\n const tags = new Set((current.ignoredTags ?? []).map((entry) => entry.toLowerCase()));\n if (action === \"ignore-tag\") tags.add(tag);\n else tags.delete(tag);\n return { ...current, ignoredTags: [...tags].sort() };\n });\n process.stdout.write(`${action === \"ignore-tag\" ? \"Ignored\" : \"Unignored\"} tag ${tag} in ${path.relative(cwd, filename)}\\n`);\n return;\n }\n\n throw new Error(`Unknown rules command: ${action}`);\n}\n\nfunction whyLocationContains(location: Diagnostic[\"location\"], line: number, column?: number): boolean {\n if (line < location.line || line > location.endLine) return false;\n if (column === undefined) return true;\n if (location.line === location.endLine) return column >= location.column && column <= location.endColumn;\n if (line === location.line) return column >= location.column;\n if (line === location.endLine) return column <= location.endColumn;\n return true;\n}\n\nfunction whyDiagnosticRanges(diagnostic: Diagnostic): Diagnostic[\"location\"][] {\n return diagnostic.highlights && diagnostic.highlights.length > 0 ? diagnostic.highlights : [diagnostic.location];\n}\n\nfunction whyLocationMatches(diagnostic: Diagnostic, line: number, column?: number): boolean {\n if (whyLocationContains(diagnostic.location, line, column)) return true;\n return (diagnostic.highlights ?? []).some((location) => whyLocationContains(location, line, column));\n}\n\nfunction expandWhyTabs(value: string, tabWidth = 4): string {\n let result = \"\";\n let column = 0;\n for (const character of value) {\n if (character === \"\\t\") {\n const spaces = tabWidth - (column % tabWidth);\n result += \" \".repeat(spaces);\n column += spaces;\n } else {\n result += character;\n column += 1;\n }\n }\n return result;\n}\n\nfunction whyVisualColumn(line: string, column: number): number {\n return expandWhyTabs(line.slice(0, Math.max(0, column - 1))).length + 1;\n}\n\nfunction whyFrameIntervals(ranges: Diagnostic[\"location\"][], sourceLength: number): Array<{ start: number; end: number }> {\n const intervals = ranges\n .map((range) => ({\n start: Math.max(1, range.line - 2),\n end: Math.min(sourceLength, range.endLine + 2),\n }))\n .sort((a, b) => a.start - b.start || a.end - b.end);\n const merged: Array<{ start: number; end: number }> = [];\n for (const interval of intervals) {\n const previous = merged.at(-1);\n if (previous && interval.start <= previous.end + 1) previous.end = Math.max(previous.end, interval.end);\n else merged.push({ ...interval });\n }\n return merged;\n}\n\nfunction whyCaretForLine(sourceLine: string, line: number, ranges: Diagnostic[\"location\"][]): string | null {\n const expanded = expandWhyTabs(sourceLine);\n const marks = Array.from({ length: Math.max(1, expanded.length + 1) }, () => false);\n let hasMark = false;\n for (const range of ranges) {\n if (line < range.line || line > range.endLine) continue;\n const rawStart = line === range.line ? range.column : 1;\n const rawEnd = line === range.endLine ? range.endColumn : sourceLine.length + 1;\n const start = Math.max(1, whyVisualColumn(sourceLine, rawStart));\n const end = Math.max(start + 1, whyVisualColumn(sourceLine, rawEnd));\n for (let column = start - 1; column < Math.min(marks.length, end - 1); column += 1) {\n marks[column] = true;\n hasMark = true;\n }\n }\n if (!hasMark) return null;\n let value = marks.map((marked) => marked ? \"^\" : \" \").join(\"\").replace(/\\s+$/, \"\");\n if (!value) value = \"^\";\n return value;\n}\n\nfunction renderWhyCodeFrame(filename: string, diagnostic: Diagnostic, colorized: boolean): string {\n const source = fs.readFileSync(filename, \"utf8\").split(/\\r?\\n/);\n const ranges = whyDiagnosticRanges(diagnostic);\n const intervals = whyFrameIntervals(ranges, source.length);\n const width = String(Math.max(...intervals.map((interval) => interval.end), 1)).length;\n const lines: string[] = [];\n\n intervals.forEach((interval, intervalIndex) => {\n if (intervalIndex > 0) {\n lines.push(`${whyPaint(colorized, \"…\", WHY_ANSI.dim, WHY_THEME.gutter)} ${\" \".repeat(width)} ${whyPaint(colorized, \"|\", WHY_ANSI.dim, WHY_THEME.gutter)} ${whyPaint(colorized, \"…\", WHY_ANSI.dim, WHY_THEME.gutter)}`);\n }\n for (let line = interval.start; line <= interval.end; line += 1) {\n const sourceLine = source[line - 1] ?? \"\";\n const caretText = whyCaretForLine(sourceLine, line, ranges);\n const active = caretText !== null;\n const marker = active ? whyPaint(colorized, \">\", WHY_ANSI.bold, WHY_ANSI.red) : whyPaint(colorized, \"|\", WHY_ANSI.dim, WHY_THEME.gutter);\n const number = whyPaint(colorized, String(line).padStart(width), active ? WHY_ANSI.bold : WHY_ANSI.dim, active ? WHY_THEME.activeGutter : WHY_THEME.gutter);\n const code = highlightLuauLine(expandWhyTabs(sourceLine), colorized);\n lines.push(`${marker} ${number} ${whyPaint(colorized, \"|\", WHY_ANSI.dim, WHY_THEME.gutter)} ${code}`);\n if (caretText) {\n const caret = whyPaint(colorized, caretText, WHY_ANSI.bold, WHY_ANSI.red);\n lines.push(` ${\" \".repeat(width)} ${whyPaint(colorized, \"|\", WHY_ANSI.dim, WHY_THEME.gutter)} ${caret}`);\n }\n }\n });\n\n return lines.join(\"\\n\");\n}\n\nfunction whySeverityMeaning(severity: Severity): string {\n if (severity === \"error\") return \"This can violate React or Luau correctness rules and should normally be fixed.\";\n if (severity === \"warning\") return \"This pattern is very likely to be a real issue in the code shown and is normally worth fixing.\";\n return \"This may be intentional. Doctor found a plausible improvement, but the right choice depends on how this value or pattern is meant to affect rendering.\";\n}\n\nfunction whyRuleSpecificContext(diagnostic: Diagnostic): string | null {\n if (diagnostic.rule === \"react-luau/prefer-binding-over-state-candidate\") {\n return \"A Binding can update visual values without rerendering the component. Here, at least one use may be structural or otherwise depend on a rerender, so replacing all of the state with a Binding is not automatically safe.\";\n }\n if (diagnostic.rule === \"react-luau/prefer-binding-over-state\") {\n return \"A Binding can update these values without rerendering the component, and every use of the value only needs that kind of update. React state is therefore doing extra reconciliation work here.\";\n }\n if (diagnostic.rule === \"react-luau/rerender-high-frequency-state\") {\n return \"Doctor found a state setter on a high-frequency callback path. Calling a setter every frame still has overhead, and any changed value can schedule React reconciliation; this rule now suppresses simple one-shot guards it can prove.\";\n }\n if (\n diagnostic.rule === \"react-luau/no-side-effects-in-render\" &&\n diagnostic.message.includes(\"code it calls eventually changes state outside the current render\")\n ) {\n return \"Doctor is not judging this call by its name. It followed the code behind the call and found a mutation that can affect existing state outside this render. That means the call can change the app even if React later abandons this render.\";\n }\n return null;\n}\n\nfunction whyRuleCaveat(diagnostic: Diagnostic): string | null {\n if (diagnostic.rule === \"react-luau/prefer-binding-over-state-candidate\") {\n return \"Keep React state when the value genuinely changes component structure, conditional children, hook inputs, or other behavior that must go through React reconciliation. Mixed cases often benefit from splitting visual Binding updates from a smaller structural state value.\";\n }\n if (diagnostic.rule === \"react-luau/prefer-binding-over-state\") {\n return \"Keep React state if changing the value must rebuild component structure rather than only update Roblox Instance properties or other Binding-aware consumers.\";\n }\n if (diagnostic.rule === \"react-luau/rerender-high-frequency-state\") {\n return \"A same-value state update can be bailed out by React, so this finding does not prove that the component actually rerenders every frame. It flags the per-frame setter path and is suppressed when Doctor can prove a simple one-shot or direct no-change guard.\";\n }\n return null;\n}\n\nfunction renderWhyDiagnostic(filename: string, diagnostic: Diagnostic, colorized: boolean): string {\n const rule = findRule(diagnostic.rule);\n const textWidth = whyTextWidth();\n const lines: string[] = [\n whyPaint(colorized, diagnostic.rule, WHY_ANSI.bold, WHY_ANSI.magenta),\n whyPaint(colorized, `${diagnostic.file}:${diagnostic.location.line}:${diagnostic.location.column}`, WHY_ANSI.bold),\n [\n `${whyPaint(colorized, \"Severity\", WHY_ANSI.bold)}: ${whySeverityPaint(colorized, diagnostic.severity, diagnostic.severity)}`,\n `${whyPaint(colorized, \"Category\", WHY_ANSI.bold)}: ${whyPaint(colorized, diagnostic.category, WHY_ANSI.bold, WHY_THEME.category)}`,\n ].join(whyPaint(colorized, \" | \", WHY_ANSI.dim)),\n \"\",\n renderWhyCodeFrame(filename, diagnostic, colorized),\n \"\",\n whySectionTitle(colorized, \"Why this fired\"),\n ...wrapWhyWords(diagnostic.message, textWidth),\n ];\n\n const specificContext = whyRuleSpecificContext(diagnostic);\n if (specificContext) lines.push(\"\", ...wrapWhyWords(specificContext, textWidth));\n\n lines.push(\n \"\",\n whySectionTitle(colorized, \"What the rule checks\"),\n ...wrapWhyWords(rule.description, textWidth),\n \"\",\n whySectionTitle(colorized, \"Confidence\"),\n ...wrapWhyWords(whySeverityMeaning(diagnostic.severity), textWidth),\n );\n\n if (diagnostic.help) {\n lines.push(\"\", whySectionTitle(colorized, \"How to fix\"), ...wrapWhyWords(diagnostic.help, textWidth));\n }\n const fixPreview = diagnostic.fixPreview ?? fixExampleForRule(diagnostic.rule);\n if (fixPreview) {\n const previewTitle = fixPreview.kind === \"exact\" ? \"Suggested change\" : \"Example pattern\";\n lines.push(\"\", whySectionTitle(colorized, previewTitle), ...renderWhyFixPreview(fixPreview, colorized, textWidth));\n }\n const caveat = whyRuleCaveat(diagnostic);\n if (caveat) {\n lines.push(\"\", whySectionTitle(colorized, \"When the current approach may be intentional\"), ...wrapWhyWords(caveat, textWidth));\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nasync function scanWhyFile(\n filename: string,\n cwd: string,\n cache: boolean,\n onProgress?: (progress: ScanProgress) => void,\n): Promise<ScanReport> {\n // Scan only the requested file, but build its project model from the same root\n // as a normal project scan. Project-aware rules otherwise disappear when `why`\n // is invoked on a single file. Suppressions are evaluated after this one audit\n // scan so `why` never rebuilds project context just to discover hidden findings.\n return scanPath(cwd, {\n files: [{ absolutePath: filename, forceScan: true }],\n respectInlineDisables: false,\n onProgress,\n cache,\n });\n}\n\nasync function runWhy(\n location: string,\n cwd: string,\n noColor = false,\n cache = true,\n onProgress?: (progress: ScanProgress) => void,\n beforeOutput?: () => void,\n): Promise<void> {\n const match = location.match(/^(.*):(\\d+)(?::(\\d+))?$/);\n if (!match) throw new Error(\"Location must be file:line or file:line:column\");\n const filename = path.resolve(cwd, match[1]);\n const line = Number(match[2]);\n const column = match[3] === undefined ? undefined : Number(match[3]);\n if (!fs.existsSync(filename)) throw new Error(`File does not exist: ${match[1]}`);\n\n const colorized = shouldUseColor(noColor, false);\n const source = fs.readFileSync(filename, \"utf8\");\n const isSuppressed = createInlineSuppressionChecker(source);\n const auditReport = await scanWhyFile(filename, cwd, cache, onProgress);\n // `why` renders its own output before returning to the CLI entry point. Clear\n // the transient progress line here so the diagnostic never starts on the same\n // terminal row as a completed progress bar.\n beforeOutput?.();\n const matching = auditReport.diagnostics.filter((diagnostic) => whyLocationMatches(diagnostic, line, column));\n const visible = matching.filter((diagnostic) => !isSuppressed(diagnostic.rule, diagnostic.location.line));\n\n if (visible.length > 0) {\n for (let index = 0; index < visible.length; index += 1) {\n if (index > 0) process.stdout.write(\"\\n\");\n process.stdout.write(renderWhyDiagnostic(filename, visible[index], colorized));\n }\n return;\n }\n\n const suppressed = matching.filter((diagnostic) => isSuppressed(diagnostic.rule, diagnostic.location.line));\n if (suppressed.length > 0) {\n process.stdout.write(`No visible diagnostic at ${location}. ${suppressed.length} diagnostic${suppressed.length === 1 ? \" is\" : \"s are\"} hidden by an inline react-luau-doctor suppression.\\n\\n`);\n for (let index = 0; index < suppressed.length; index += 1) {\n if (index > 0) process.stdout.write(\"\\n\");\n process.stdout.write(renderWhyDiagnostic(filename, suppressed[index], colorized));\n }\n return;\n }\n\n const nearby = auditReport.diagnostics\n .filter((diagnostic) => !isSuppressed(diagnostic.rule, diagnostic.location.line))\n .filter((diagnostic) => Math.abs(diagnostic.location.line - line) <= 3)\n .sort((a, b) => Math.abs(a.location.line - line) - Math.abs(b.location.line - line));\n process.stdout.write(`No React-Luau Doctor diagnostic found at ${location}.\\n`);\n if (nearby.length > 0) {\n process.stdout.write(\"Nearby diagnostics in this file:\\n\");\n for (const diagnostic of nearby.slice(0, 5)) {\n process.stdout.write(` ${diagnostic.file}:${diagnostic.location.line}:${diagnostic.location.column} ${diagnostic.rule}\\n`);\n }\n }\n}\n\nfunction pathIsInside(parent: string, child: string): boolean {\n const relative = path.relative(parent, child);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nasync function runScan(\n options: CliOptions,\n onProgress?: (progress: ScanProgress) => void,\n beforeOutput?: () => void,\n): Promise<ScanReport> {\n const commandRoot = process.cwd();\n const target = path.resolve(commandRoot, options.target);\n if (!fs.existsSync(target)) throw new Error(`Scan path does not exist: ${options.target}`);\n const targetStat = fs.statSync(target);\n const scanRoot = targetStat.isFile() ? path.dirname(target) : target;\n\n // CLI configuration is owned by the directory the command was launched from.\n // Narrowing the scan target must not silently switch to a different config.\n const loaded = loadConfigWithSource(commandRoot);\n const config = loaded.config;\n const resolvedScope = resolveScope(options, config);\n const scope = options.staged && options.scope === undefined ? \"files\" : resolvedScope.scope;\n validateModeFlags(options, scope);\n\n if (options.explain) {\n await runWhy(options.explain, commandRoot, options.noColor, !options.noCache, onProgress, beforeOutput);\n return {\n schemaVersion: 1,\n root: commandRoot,\n scannedFiles: 0,\n candidateFiles: 0,\n durationMs: 0,\n score: 100,\n counts: { error: 0, warning: 0, suggestion: 0 },\n diagnostics: [],\n partial: false,\n skippedFiles: [],\n };\n }\n\n if (targetStat.isFile() && (scope !== \"full\" || options.staged || options.changedFilesFrom)) {\n throw new Error(\"Git scopes require a directory target; scan the containing project directory instead\");\n }\n\n const targetInsideCommandRoot = pathIsInside(commandRoot, target);\n const selectionRoot = targetInsideCommandRoot ? commandRoot : scanRoot;\n const requestedProjectRoots = resolveProjectRoots(selectionRoot, options.project, config);\n const projectTargets = requestedProjectRoots.flatMap((projectRoot) => {\n if (pathIsInside(projectRoot, target)) return [{ projectRoot, targetRoot: target }];\n if (pathIsInside(target, projectRoot)) return [{ projectRoot, targetRoot: projectRoot }];\n return [];\n });\n if (projectTargets.length === 0) {\n throw new Error(`Scan target is outside the selected project${requestedProjectRoots.length === 1 ? \"\" : \"s\"}: ${options.target}`);\n }\n\n const displayRoot = targetInsideCommandRoot ? commandRoot : selectionRoot;\n const minSeverity = (options.warnings ?? config.warnings ?? true) ? options.minSeverity ?? \"suggestion\" : \"error\";\n const categories = options.categories.length > 0 ? options.categories : config.categories;\n const respectInlineDisables = options.respectInlineDisables ?? config.respectInlineDisables ?? true;\n const deadlineAt = options.maxDurationSeconds !== undefined ? performance.now() + options.maxDurationSeconds * 1000 : undefined;\n const notes: string[] = [];\n if (options.deadCode === true) notes.push(\"--dead-code is accepted for React Doctor CLI compatibility, but this port does not yet include a Luau dead-code pass.\");\n if (options.supplyChain === true) notes.push(\"--supply-chain is accepted for React Doctor CLI compatibility, but this port does not run Socket.dev or Roblox dependency health checks.\");\n if (options.lint === false) notes.push(\"React-Luau analysis was disabled by --no-lint.\");\n\n const reports: Array<{ projectRoot: string; report: ScanReport }> = [];\n for (const { projectRoot, targetRoot } of projectTargets) {\n let report: ScanReport;\n const projectName = projectTargets.length > 1 ? path.relative(displayRoot, projectRoot) || \".\" : undefined;\n const projectProgress = onProgress\n ? (progress: ScanProgress) => onProgress({\n ...progress,\n phase: [projectName, progress.phase].filter(Boolean).join(\":\") || undefined,\n label: projectName && progress.label ? `${projectName}: ${progress.label}` : progress.label,\n })\n : undefined;\n\n if (options.lint === false) {\n report = await scanPath(targetRoot, {\n projectRoot,\n files: [],\n config,\n cache: !options.noCache,\n });\n report.scope = options.staged ? \"staged\" : scope;\n } else if (targetStat.isFile()) {\n report = await scanPath(targetRoot, {\n projectRoot,\n config,\n minSeverity,\n categories,\n respectInlineDisables,\n deadlineAt,\n onProgress: projectProgress,\n cache: !options.noCache,\n });\n report.scope = \"full\";\n } else {\n report = await scanProjectWithScope(projectRoot, {\n targetRoot,\n scope,\n base: resolvedScope.base,\n includeUntracked: options.includeUntracked,\n staged: options.staged,\n changedFilesFrom: options.changedFilesFrom,\n config,\n minSeverity,\n categories,\n respectInlineDisables,\n deadlineAt,\n onProgress: projectProgress,\n cache: !options.noCache,\n });\n }\n if (notes.length > 0) report.notes = [...(report.notes ?? []), ...notes];\n reports.push({ projectRoot, report });\n }\n\n const report = aggregateReports(displayRoot, reports);\n if (options.debug) {\n const debugLines = [\n `[debug] version=${VERSION}`,\n `[debug] bun=${Bun.version} platform=${process.platform}/${process.arch}`,\n `[debug] target=${target}`,\n `[debug] config=${loaded.filename ?? \"none\"}`,\n `[debug] scope=${report.scope ?? scope} base=${report.base ?? resolvedScope.base ?? \"auto\"}`,\n `[debug] projects=${projectTargets.map(({ projectRoot }) => path.relative(displayRoot, projectRoot) || \".\").join(\",\")}`,\n `[debug] candidates=${report.candidateFiles ?? 0} scanned=${report.scannedFiles} partial=${Boolean(report.partial)}`,\n `[debug] parallel=false${options.noParallel ? \" (--no-parallel requested)\" : \"\"}`,\n ];\n process.stderr.write(`${debugLines.join(\"\\n\")}\\n`);\n }\n return report;\n}\n\nasync function main(): Promise<void> {\n try {\n const argv = process.argv.slice(2);\n\n if (argv[0] === \"ci\") {\n await runCiCommand(argv.slice(1));\n return;\n }\n\n if (argv[0] === \"rules\") {\n runRulesCommand(argv.slice(1));\n return;\n }\n\n if (argv[0] === \"why\") {\n const location = argv[1];\n if (!location) throw new Error(\"why requires file:line\");\n const { cwd, remaining } = parseCommandCwd(argv.slice(2));\n const noColor = remaining.includes(\"--no-color\");\n const noCache = remaining.includes(\"--no-cache\");\n const unknown = remaining.filter((arg) => arg !== \"--no-color\" && arg !== \"--no-cache\");\n if (unknown.length > 0) throw new Error(`Unknown why option: ${unknown[0]}`);\n const colorized = shouldUseColor(noColor, false);\n const progress = createProgressRenderer({\n enabled: Boolean(process.stdout.isTTY && !process.env.CI),\n colorized,\n });\n try {\n await runWhy(\n location,\n cwd,\n noColor,\n !noCache,\n (scanProgress) => progress.update(scanProgress),\n () => progress.clear(),\n );\n } finally {\n progress.clear();\n }\n return;\n }\n\n if (argv[0] === \"version\") {\n process.stdout.write(`React-Luau Doctor ${VERSION}\\nBun ${Bun.version}\\n${process.platform} ${process.arch}\\n${os.release()}\\n`);\n return;\n }\n\n const options = parseArgs(argv);\n if (options.help) {\n process.stdout.write(usage());\n return;\n }\n if (options.version) {\n process.stdout.write(`${VERSION}\\n`);\n return;\n }\n if (options.listRules) {\n process.stdout.write(`${renderRulesList(rules, process.stdout.columns ?? 120, new Map(), shouldUseColor(options.noColor))}\\n`);\n return;\n }\n\n const machineReadable = options.scoreOnly || options.json || options.annotations;\n const colorized = shouldUseColor(options.noColor, machineReadable);\n const progress = createProgressRenderer({\n enabled: Boolean(process.stdout.isTTY && !process.env.CI && !machineReadable),\n colorized,\n });\n let report: ScanReport;\n try {\n report = await runScan(\n options,\n (scanProgress) => progress.update(scanProgress),\n () => progress.clear(),\n );\n } finally {\n progress.clear();\n }\n if (options.explain) return;\n\n const compactJson = options.jsonCompact;\n const json = `${serializeReport(report, compactJson)}\\n`;\n if (options.jsonOut) {\n const outputPath = path.resolve(process.cwd(), options.jsonOut);\n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.writeFileSync(outputPath, json);\n }\n if (options.outputDir) writeDiagnosticsDump(path.resolve(process.cwd(), options.outputDir), report);\n\n const config = loadConfigWithSource(process.cwd()).config;\n const showScore = options.showScore ?? true;\n const verbose = options.verbose ?? config.verbose ?? false;\n\n if (options.scoreOnly) process.stdout.write(`${report.score}\\n`);\n else if (options.json) process.stdout.write(json);\n else if (options.annotations) {\n const annotations = renderAnnotations(report);\n if (annotations) process.stdout.write(`${annotations}\\n`);\n } else process.stdout.write(`${renderTextReport(report, showScore, colorized, verbose, process.stdout.columns ?? 120)}\\n`);\n\n const blocking = options.blocking ?? options.failOn ?? config.blocking ?? config.failOn ?? \"error\";\n if (shouldBlock(report, blocking)) process.exitCode = 1;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`react-luau-doctor: ${message}\\n`);\n process.exitCode = 2;\n }\n}\n\nvoid main();\n",
6
+ "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n BlockingLevel,\n Category,\n DoctorConfig,\n RuleDefinition,\n RuleSetting,\n ScanScope,\n Severity,\n} from \"./types\";\n\nconst CONFIG_NAMES = [\"react-luau-doctor.config.json\", \"doctor.config.json\"];\nconst SEVERITIES = new Set<RuleSetting>([\"off\", \"error\", \"warning\", \"suggestion\"]);\nconst SCOPES = new Set<ScanScope>([\"full\", \"files\", \"changed\", \"lines\"]);\nconst BLOCKING_LEVELS = new Set<BlockingLevel>([\"error\", \"warning\", \"none\"]);\nconst CATEGORIES = new Set<Category>([\"Correctness\", \"Hooks\", \"Effects\", \"Performance\", \"Roblox\", \"Architecture\"]);\n\nexport interface LoadedConfig {\n config: DoctorConfig;\n filename: string | null;\n}\n\nexport function loadConfigWithSource(root: string): LoadedConfig {\n for (const filename of CONFIG_NAMES) {\n const candidate = path.join(root, filename);\n if (!fs.existsSync(candidate)) continue;\n const parsed = JSON.parse(fs.readFileSync(candidate, \"utf8\")) as DoctorConfig;\n validateConfig(parsed, candidate);\n return { config: parsed, filename: candidate };\n }\n return { config: {}, filename: null };\n}\n\nexport function loadConfig(root: string): DoctorConfig {\n return loadConfigWithSource(root).config;\n}\n\nfunction validateStringArray(value: unknown, field: string, filename: string): void {\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"string\")) {\n throw new Error(`${filename}: ${field} must be an array of strings`);\n }\n}\n\nfunction validateConfig(config: DoctorConfig, filename: string): void {\n if (config.include !== undefined) validateStringArray(config.include, \"include\", filename);\n if (config.ignore !== undefined) validateStringArray(config.ignore, \"ignore\", filename);\n if (config.ignoredTags !== undefined) validateStringArray(config.ignoredTags, \"ignoredTags\", filename);\n if (config.projects !== undefined) validateStringArray(config.projects, \"projects\", filename);\n\n if (config.categories !== undefined) {\n if (!Array.isArray(config.categories) || config.categories.some((category) => !CATEGORIES.has(category))) {\n throw new Error(`${filename}: categories must contain valid React-Luau Doctor categories`);\n }\n }\n\n if (config.rules) {\n for (const [rule, value] of Object.entries(config.rules)) {\n if (!SEVERITIES.has(value)) throw new Error(`${filename}: invalid severity ${String(value)} for ${rule}`);\n }\n }\n\n if (config.scope !== undefined && !SCOPES.has(config.scope)) {\n throw new Error(`${filename}: scope must be full, files, changed, or lines`);\n }\n if (config.diff !== undefined && typeof config.diff !== \"boolean\" && typeof config.diff !== \"string\") {\n throw new Error(`${filename}: diff must be a boolean or git ref string`);\n }\n if (config.base !== undefined && typeof config.base !== \"string\") throw new Error(`${filename}: base must be a string`);\n if (config.verbose !== undefined && typeof config.verbose !== \"boolean\") throw new Error(`${filename}: verbose must be a boolean`);\n if (config.warnings !== undefined && typeof config.warnings !== \"boolean\") throw new Error(`${filename}: warnings must be a boolean`);\n if (config.respectInlineDisables !== undefined && typeof config.respectInlineDisables !== \"boolean\") {\n throw new Error(`${filename}: respectInlineDisables must be a boolean`);\n }\n if (config.blocking !== undefined && !BLOCKING_LEVELS.has(config.blocking)) {\n throw new Error(`${filename}: blocking must be error, warning, or none`);\n }\n if (config.failOn !== undefined && !BLOCKING_LEVELS.has(config.failOn)) {\n throw new Error(`${filename}: failOn must be error, warning, or none`);\n }\n}\n\nexport function ruleTags(rule: RuleDefinition): string[] {\n return [...new Set([rule.category.toLowerCase(), ...(rule.tags ?? []).map((tag) => tag.toLowerCase())])];\n}\n\nexport function ruleFrameworks(rule: RuleDefinition): string[] {\n if (rule.frameworks && rule.frameworks.length > 0) return rule.frameworks.map((framework) => framework.toLowerCase());\n return rule.category === \"Roblox\" ? [\"react-luau\", \"roblox\"] : [\"react-luau\", \"global\"];\n}\n\nexport function effectiveSeverity(\n defaultSeverity: Severity,\n ruleId: string,\n config: DoctorConfig,\n tags: string[] = [],\n): Severity | null {\n const ignoredTags = new Set((config.ignoredTags ?? []).map((tag) => tag.toLowerCase()));\n if (tags.some((tag) => ignoredTags.has(tag.toLowerCase()))) return null;\n\n const configured = config.rules?.[ruleId];\n if (!configured) return defaultSeverity;\n return configured === \"off\" ? null : configured;\n}\n\nfunction configPathForWrite(root: string): string {\n const loaded = loadConfigWithSource(root);\n return loaded.filename ?? path.join(root, CONFIG_NAMES[0]);\n}\n\nexport function writeConfig(root: string, update: (config: DoctorConfig) => DoctorConfig): string {\n const loaded = loadConfigWithSource(root);\n const next = update(structuredClone(loaded.config));\n validateConfig(next, loaded.filename ?? CONFIG_NAMES[0]);\n const filename = loaded.filename ?? configPathForWrite(root);\n fs.mkdirSync(path.dirname(filename), { recursive: true });\n fs.writeFileSync(filename, `${JSON.stringify(next, null, 2)}\\n`);\n return filename;\n}\n\nexport function normalizeRuleSetting(value: string): RuleSetting | null {\n const normalized = value.toLowerCase();\n if (normalized === \"warn\") return \"warning\";\n if (normalized === \"off\" || normalized === \"error\" || normalized === \"warning\" || normalized === \"suggestion\") {\n return normalized;\n }\n return null;\n}\n\nexport function normalizeCategory(value: string): Category | null {\n const normalized = value.toLowerCase();\n for (const category of CATEGORIES) {\n if (category.toLowerCase() === normalized) return category;\n }\n return null;\n}\n",
7
+ "import { spawnSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport readline from \"node:readline/promises\";\nimport packageJson from \"../package.json\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport { isSelectedLuauPath } from \"./files\";\nimport { loadConfigWithSource } from \"./config\";\nimport { createGitScopePlan, findGitRoot } from \"./git\";\nimport type { LineRange } from \"./git\";\nimport { renderAnnotations, renderTextReport } from \"./reporter\";\nimport { aggregateReports, scanProjectWithScope } from \"./scope\";\nimport { scanPath } from \"./scanner\";\nimport type { BlockingLevel, Diagnostic, ScanReport, ScanScope } from \"./types\";\n\nexport type CiProvider = \"github\" | \"gitlab\";\n\ninterface CiSettings {\n provider: CiProvider;\n blocking: BlockingLevel;\n scope: ScanScope;\n comment: boolean;\n reviewComments: boolean;\n commitStatus: boolean;\n directory: string;\n project: string;\n}\n\ninterface CiManageOptions extends Partial<CiSettings> {\n cwd: string;\n yes: boolean;\n pr: boolean;\n}\n\ninterface GitHubEvent {\n pull_request?: {\n number: number;\n base: { sha: string; ref: string };\n head: { sha: string; ref: string };\n };\n repository?: { full_name?: string };\n}\n\nconst DEFAULT_SETTINGS: CiSettings = {\n provider: \"github\",\n blocking: \"none\",\n scope: \"changed\",\n comment: true,\n reviewComments: true,\n commitStatus: true,\n directory: \".\",\n project: \"*\",\n};\n\nconst GITHUB_WORKFLOW = path.join(\".github\", \"workflows\", \"react-luau-doctor.yml\");\nconst GITHUB_LOCAL_ACTION = path.join(\".github\", \"actions\", \"react-luau-doctor\", \"action.yml\");\nconst GITLAB_WORKFLOW = \".gitlab-ci.yml\";\nconst SUMMARY_MARKER = \"<!-- react-luau-doctor:summary -->\";\nconst REVIEW_MARKER = \"<!-- react-luau-doctor:review -->\";\nconst MAX_REVIEW_COMMENTS = 20;\nconst PACKAGE_VERSION = packageJson.version;\n\nfunction booleanFlag(name: string, value: boolean): string {\n return value ? `--${name}` : `--no-${name}`;\n}\n\nfunction yamlString(value: string): string {\n return JSON.stringify(value);\n}\n\nexport function renderGitHubWorkflow(settings: CiSettings): string {\n return `name: React-Luau Doctor\non:\n pull_request:\n types: [opened, synchronize, reopened, ready_for_review]\n push:\n branches: [main]\n\npermissions:\n contents: read\n pull-requests: write\n issues: write\n statuses: write\n\nconcurrency:\n group: react-luau-doctor-\\${{ github.event.pull_request.number || github.ref }}\n cancel-in-progress: true\n\njobs:\n react-luau-doctor:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v5\n with:\n fetch-depth: 0\n - uses: ./.github/actions/react-luau-doctor\n with:\n blocking: ${settings.blocking}\n scope: ${settings.scope}\n comment: ${settings.comment}\n review-comments: ${settings.reviewComments}\n commit-status: ${settings.commitStatus}\n project: ${yamlString(settings.project)}\n directory: ${yamlString(settings.directory)}\n`;\n}\n\nexport function renderLocalGitHubAction(): string {\n return renderPublishedGitHubAction();\n}\n\nexport function renderPublishedGitHubAction(): string {\n return `name: React-Luau Doctor\ndescription: \"Review React-Luau pull requests and report introduced diagnostics.\"\ninputs:\n blocking:\n description: \"Severity that fails the workflow: error, warning, or none.\"\n default: none\n scope:\n description: \"Pull request scan scope: changed, files, lines, or full.\"\n default: changed\n comment:\n description: \"Create or update a sticky pull request summary comment.\"\n default: \"true\"\n review-comments:\n description: \"Post inline review comments on changed lines.\"\n default: \"true\"\n commit-status:\n description: \"Publish score and issue counts as a commit status.\"\n default: \"true\"\n project:\n description: \"Project directories to scan, comma-separated. Asterisk scans the whole directory.\"\n default: \"*\"\n directory:\n description: \"Project directory to scan.\"\n default: \".\"\noutputs:\n score:\n description: \"Health score from 0 to 100.\"\n value: \\${{ steps.doctor.outputs.score }}\n total-issues:\n description: \"Total diagnostics reported by this run.\"\n value: \\${{ steps.doctor.outputs.total-issues }}\n fixed-issues:\n description: \"Number of diagnostics resolved by the pull request.\"\n value: \\${{ steps.doctor.outputs.fixed-issues }}\n error-count:\n description: \"Error diagnostic count.\"\n value: \\${{ steps.doctor.outputs.error-count }}\n warning-count:\n description: \"Warning diagnostic count.\"\n value: \\${{ steps.doctor.outputs.warning-count }}\n affected-files:\n description: \"Number of files with diagnostics.\"\n value: \\${{ steps.doctor.outputs.affected-files }}\nruns:\n using: composite\n steps:\n - uses: oven-sh/setup-bun@v2\n with:\n bun-version: \"1.3.14\"\n - name: Install parser runtime\n shell: bash\n run: |\n cd \"$GITHUB_ACTION_PATH\"\n bun install --production --frozen-lockfile\n - id: doctor\n shell: bash\n env:\n GITHUB_TOKEN: \\${{ github.token }}\n DOCTOR_DIRECTORY: \\${{ inputs.directory }}\n DOCTOR_PROJECT: \\${{ inputs.project }}\n DOCTOR_BLOCKING: \\${{ inputs.blocking }}\n DOCTOR_SCOPE: \\${{ inputs.scope }}\n run: >-\n bun \"$GITHUB_ACTION_PATH/dist/cli.js\" ci run\n --directory \"$DOCTOR_DIRECTORY\"\n --project \"$DOCTOR_PROJECT\"\n --blocking \"$DOCTOR_BLOCKING\"\n --scope \"$DOCTOR_SCOPE\"\n \\${{ inputs.comment == 'true' && '--comment' || '--no-comment' }}\n \\${{ inputs.review-comments == 'true' && '--review-comments' || '--no-review-comments' }}\n \\${{ inputs.commit-status == 'true' && '--commit-status' || '--no-commit-status' }}\n`;\n}\n\nexport function renderGitLabWorkflow(settings: CiSettings): string {\n return `stages:\n - test\n\nreact-luau-doctor:\n stage: test\n image: oven/bun:1.3.14\n variables:\n GIT_DEPTH: \"0\"\n DOCTOR_DIRECTORY: ${yamlString(settings.directory)}\n DOCTOR_SCOPE: ${yamlString(settings.scope)}\n DOCTOR_BLOCKING: ${yamlString(settings.blocking)}\n script:\n - '(cd .gitlab/react-luau-doctor && bun install --production --frozen-lockfile)'\n - 'bun .gitlab/react-luau-doctor/dist/cli.js \"$DOCTOR_DIRECTORY\" --scope \"$DOCTOR_SCOPE\" --blocking \"$DOCTOR_BLOCKING\" --no-color'\n`;\n}\n\nfunction copyCiRuntime(destination: string): string[] {\n const root = path.resolve(import.meta.dir, \"..\");\n const entries = [\"dist\", \"vendor\", \"package.json\", \"LICENSE\", \"THIRD_PARTY_NOTICES.md\"];\n for (const entry of entries) {\n if (!fs.existsSync(path.join(root, entry))) throw new Error(`Missing ${entry}; run bun run build before installing CI`);\n }\n const lockfile = fs.existsSync(path.join(root, \"bun.lock\")) ? path.join(root, \"bun.lock\") : path.join(root, \"dist/runtime-lock.json\");\n if (!fs.existsSync(lockfile)) throw new Error(\"Missing runtime lockfile; rebuild or reinstall Doctor\");\n fs.mkdirSync(destination, { recursive: true });\n const copiedLock = path.join(destination, \"bun.lock\");\n if (path.resolve(lockfile) !== path.resolve(copiedLock)) fs.copyFileSync(lockfile, copiedLock);\n const files: string[] = [copiedLock];\n for (const entry of entries) {\n const target = path.join(destination, entry);\n if (path.resolve(root, entry) === path.resolve(target)) continue;\n fs.cpSync(path.join(root, entry), target, { recursive: true });\n files.push(target);\n }\n return files;\n}\n\nfunction parseBoolean(value: string, name: string): boolean {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n throw new Error(`${name} must be true or false`);\n}\n\nfunction parseBlocking(value: string): BlockingLevel {\n if (value !== \"error\" && value !== \"warning\" && value !== \"none\") throw new Error(\"--blocking must be error, warning, or none\");\n return value;\n}\n\nfunction parseScope(value: string): ScanScope {\n if (value !== \"full\" && value !== \"files\" && value !== \"changed\" && value !== \"lines\") {\n throw new Error(\"--scope must be full, files, changed, or lines\");\n }\n return value;\n}\n\nfunction parseProvider(value: string): CiProvider {\n if (value !== \"github\" && value !== \"gitlab\") throw new Error(\"--provider must be github or gitlab\");\n return value;\n}\n\nfunction nextValue(argv: string[], index: number, flag: string): { value: string; nextIndex: number } {\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\")) throw new Error(`${flag} requires a value`);\n return { value, nextIndex: index + 1 };\n}\n\nfunction parseCiManageOptions(argv: string[], action: \"install\" | \"config\" | \"upgrade\"): CiManageOptions {\n const options: CiManageOptions = { cwd: process.cwd(), yes: false, pr: false };\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--yes\" || arg === \"-y\") options.yes = true;\n else if (arg === \"--pr\") {\n if (action === \"config\") throw new Error(\"ci config does not accept --pr\");\n options.pr = true;\n } else if (arg === \"--cwd\") {\n const parsed = nextValue(argv, index, arg);\n options.cwd = path.resolve(parsed.value);\n index = parsed.nextIndex;\n } else if (arg === \"--provider\") {\n const parsed = nextValue(argv, index, arg);\n options.provider = parseProvider(parsed.value);\n index = parsed.nextIndex;\n } else if (arg === \"--blocking\") {\n const parsed = nextValue(argv, index, arg);\n options.blocking = parseBlocking(parsed.value);\n index = parsed.nextIndex;\n } else if (arg === \"--scope\") {\n const parsed = nextValue(argv, index, arg);\n options.scope = parseScope(parsed.value);\n index = parsed.nextIndex;\n } else if (arg === \"--comment\") options.comment = true;\n else if (arg === \"--no-comment\") options.comment = false;\n else if (arg === \"--review-comments\") options.reviewComments = true;\n else if (arg === \"--no-review-comments\") options.reviewComments = false;\n else if (arg === \"--commit-status\") options.commitStatus = true;\n else if (arg === \"--no-commit-status\") options.commitStatus = false;\n else throw new Error(`Unknown ci ${action} option: ${arg}`);\n }\n return options;\n}\n\nfunction parseManagedWorkflowSettings(filename: string): Partial<CiSettings> {\n if (!fs.existsSync(filename)) return {};\n const text = fs.readFileSync(filename, \"utf8\");\n if (filename.endsWith(\".gitlab-ci.yml\")) {\n const scope = text.match(/--scope\\s+(full|files|changed|lines)/)?.[1];\n const blocking = text.match(/--blocking\\s+(error|warning|none)/)?.[1];\n return {\n provider: \"gitlab\",\n scope: scope ? parseScope(scope) : DEFAULT_SETTINGS.scope,\n blocking: blocking ? parseBlocking(blocking) : \"none\",\n };\n }\n const match = (name: string): string | undefined => text.match(new RegExp(`^\\\\s*${name}:\\\\s*(.+?)\\\\s*$`, \"m\"))?.[1]?.replace(/^['\"]|['\"]$/g, \"\");\n const result: Partial<CiSettings> = {};\n const blocking = match(\"blocking\");\n const scope = match(\"scope\");\n const comment = match(\"comment\");\n const reviewComments = match(\"review-comments\");\n const commitStatus = match(\"commit-status\");\n const project = match(\"project\");\n const directory = match(\"directory\");\n if (blocking) result.blocking = parseBlocking(blocking);\n if (scope) result.scope = parseScope(scope);\n if (comment) result.comment = parseBoolean(comment, \"comment\");\n if (reviewComments) result.reviewComments = parseBoolean(reviewComments, \"review-comments\");\n if (commitStatus) result.commitStatus = parseBoolean(commitStatus, \"commit-status\");\n if (project) result.project = project;\n if (directory) result.directory = directory;\n return result;\n}\n\nfunction existingProvider(cwd: string): CiProvider | null {\n if (fs.existsSync(path.join(cwd, GITHUB_WORKFLOW))) return \"github\";\n if (fs.existsSync(path.join(cwd, GITLAB_WORKFLOW))) return \"gitlab\";\n return null;\n}\n\nasync function askChoice(question: string, choices: string[], fallback: string): Promise<string> {\n const rl = readline.createInterface({ input, output });\n try {\n const answer = (await rl.question(`${question} (${choices.join(\"/\")}) [${fallback}]: `)).trim();\n return answer || fallback;\n } finally {\n rl.close();\n }\n}\n\nasync function completeSettings(options: CiManageOptions, current: Partial<CiSettings>, action: \"install\" | \"config\" | \"upgrade\"): Promise<CiSettings> {\n const settings: CiSettings = { ...DEFAULT_SETTINGS, ...current, ...options };\n if (options.yes || action === \"upgrade\") return settings;\n\n settings.provider = parseProvider(await askChoice(\"CI provider\", [\"github\", \"gitlab\"], settings.provider));\n settings.blocking = parseBlocking(await askChoice(\"Blocking level\", [\"none\", \"error\", \"warning\"], settings.blocking));\n settings.scope = parseScope(await askChoice(\"Pull request scan scope\", [\"changed\", \"files\", \"lines\", \"full\"], settings.scope));\n if (settings.provider === \"github\") {\n settings.comment = parseBoolean(await askChoice(\"Sticky PR summary comment\", [\"true\", \"false\"], String(settings.comment)), \"comment\");\n settings.reviewComments = parseBoolean(await askChoice(\"Inline review comments\", [\"true\", \"false\"], String(settings.reviewComments)), \"review-comments\");\n settings.commitStatus = parseBoolean(await askChoice(\"Commit status\", [\"true\", \"false\"], String(settings.commitStatus)), \"commit-status\");\n }\n return settings;\n}\n\nfunction writeManagedCi(cwd: string, settings: CiSettings): string[] {\n if (settings.provider === \"github\") {\n const workflow = path.join(cwd, GITHUB_WORKFLOW);\n const action = path.join(cwd, GITHUB_LOCAL_ACTION);\n const runtimeFiles = copyCiRuntime(path.dirname(action));\n fs.mkdirSync(path.dirname(workflow), { recursive: true });\n fs.mkdirSync(path.dirname(action), { recursive: true });\n fs.writeFileSync(workflow, renderGitHubWorkflow(settings));\n fs.writeFileSync(action, renderLocalGitHubAction());\n return [workflow, action, ...runtimeFiles];\n }\n\n const workflow = path.join(cwd, GITLAB_WORKFLOW);\n if (fs.existsSync(workflow) && !fs.readFileSync(workflow, \"utf8\").includes(\"react-luau-doctor\")) {\n throw new Error(\".gitlab-ci.yml already exists and is not managed by React-Luau Doctor; add the generated job manually instead of overwriting it\");\n }\n const runtimeFiles = copyCiRuntime(path.join(cwd, \".gitlab\", \"react-luau-doctor\"));\n fs.writeFileSync(workflow, renderGitLabWorkflow(settings));\n return [workflow, ...runtimeFiles];\n}\n\nfunction runCommand(cwd: string, command: string, args: string[], allowFailure = false): string {\n const result = spawnSync(command, args, { cwd, encoding: \"utf8\", windowsHide: true });\n if (result.error) {\n if (allowFailure) return \"\";\n throw new Error(`${command} failed: ${result.error.message}`);\n }\n if ((result.status ?? 1) !== 0) {\n if (allowFailure) return \"\";\n throw new Error(`${command} ${args.join(\" \")} failed: ${(result.stderr || result.stdout || \"unknown error\").trim()}`);\n }\n return (result.stdout ?? \"\").trim();\n}\n\nfunction openPullRequest(cwd: string, files: string[], action: \"install\" | \"upgrade\"): void {\n findGitRoot(cwd);\n if (!runCommand(cwd, \"gh\", [\"--version\"], true)) throw new Error(\"--pr requires the GitHub CLI (gh) to be installed and authenticated\");\n const branch = action === \"install\" ? \"chore/add-react-luau-doctor-ci\" : \"chore/upgrade-react-luau-doctor-ci\";\n const title = action === \"install\" ? \"Add React-Luau Doctor CI\" : \"Upgrade React-Luau Doctor CI\";\n runCommand(cwd, \"git\", [\"switch\", \"-c\", branch]);\n runCommand(cwd, \"git\", [\"add\", \"--\", ...files.map((file) => path.relative(cwd, file))]);\n runCommand(cwd, \"git\", [\"commit\", \"-m\", title]);\n runCommand(cwd, \"git\", [\"push\", \"-u\", \"origin\", branch]);\n const url = runCommand(cwd, \"gh\", [\"pr\", \"create\", \"--title\", title, \"--body\", \"Adds React-Luau Doctor pull request analysis.\"]);\n process.stdout.write(`${url}\\n`);\n}\n\nasync function runCiManage(action: \"install\" | \"config\" | \"upgrade\", argv: string[]): Promise<void> {\n const options = parseCiManageOptions(argv, action);\n const provider = options.provider ?? existingProvider(options.cwd) ?? DEFAULT_SETTINGS.provider;\n const workflowPath = path.join(options.cwd, provider === \"github\" ? GITHUB_WORKFLOW : GITLAB_WORKFLOW);\n const current = parseManagedWorkflowSettings(workflowPath);\n const settings = await completeSettings({ ...options, provider }, current, action);\n\n if (action === \"install\" && fs.existsSync(workflowPath) && !options.yes) {\n const overwrite = await askChoice(`${path.relative(options.cwd, workflowPath)} already exists. Replace it`, [\"true\", \"false\"], \"false\");\n if (overwrite !== \"true\") return;\n }\n\n const files = writeManagedCi(options.cwd, settings);\n for (const filename of files) process.stdout.write(`${action === \"install\" ? \"Installed\" : action === \"config\" ? \"Updated\" : \"Upgraded\"} ${path.relative(options.cwd, filename)}\\n`);\n if (options.pr) openPullRequest(options.cwd, files, action === \"install\" ? \"install\" : \"upgrade\");\n}\n\nfunction diagnosticFingerprint(diagnostic: Diagnostic): string {\n return `${diagnostic.file}\\0${diagnostic.rule}\\0${diagnostic.severity}\\0${diagnostic.message}`;\n}\n\nfunction countDifference(left: Diagnostic[], right: Diagnostic[]): number {\n const counts = new Map<string, number>();\n for (const diagnostic of right) {\n const key = diagnosticFingerprint(diagnostic);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n let difference = 0;\n for (const diagnostic of left) {\n const key = diagnosticFingerprint(diagnostic);\n const remaining = counts.get(key) ?? 0;\n if (remaining > 0) counts.set(key, remaining - 1);\n else difference += 1;\n }\n return difference;\n}\n\nasync function fixedIssueCount(directory: string, base: string): Promise<number> {\n const plan = createGitScopePlan(directory, { scope: \"changed\", base });\n if (plan.currentFiles.length === 0 && plan.baselineFiles.length === 0) return 0;\n const config = loadConfigWithSource(directory).config;\n const selected = (file: { relativePath?: string }) => isSelectedLuauPath(file.relativePath ?? \"\", config);\n const current = await scanPath(directory, { files: plan.currentFiles.filter(selected), config, categories: config.categories });\n const baseline = await scanPath(directory, { files: plan.baselineFiles.filter(selected), config, categories: config.categories });\n return countDifference(baseline.diagnostics, current.diagnostics);\n}\n\nfunction resolveCiProjectRoots(directory: string, project: string): string[] {\n if (!project || project === \"*\") return [directory];\n return project.split(\",\").map((entry) => {\n const resolved = path.resolve(directory, entry.trim());\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) throw new Error(`Could not find project: ${entry}`);\n return resolved;\n });\n}\n\nasync function scanForCi(settings: CiSettings, eventName: string, base?: string): Promise<ScanReport> {\n const directory = path.resolve(process.cwd(), settings.directory);\n const isPullRequest = eventName === \"pull_request\";\n const scope: ScanScope = isPullRequest ? settings.scope : \"full\";\n const roots = resolveCiProjectRoots(directory, settings.project);\n const reports: Array<{ projectRoot: string; report: ScanReport }> = [];\n for (const projectRoot of roots) {\n const config = loadConfigWithSource(projectRoot).config;\n const report = await scanProjectWithScope(projectRoot, {\n scope,\n base,\n minSeverity: \"suggestion\",\n categories: config.categories,\n respectInlineDisables: config.respectInlineDisables ?? true,\n });\n reports.push({ projectRoot, report });\n }\n return roots.length === 1 && roots[0] === directory ? reports[0].report : aggregateReports(directory, reports);\n}\n\nfunction shouldBlock(report: ScanReport, level: BlockingLevel): boolean {\n if (level === \"none\") return false;\n if (level === \"warning\") return report.counts.error > 0 || report.counts.warning > 0;\n return report.counts.error > 0;\n}\n\nfunction affectedFiles(report: ScanReport): number {\n return new Set(report.diagnostics.map((diagnostic) => diagnostic.file)).size;\n}\n\nfunction writeOutput(name: string, value: string | number): void {\n const outputFile = process.env.GITHUB_OUTPUT;\n if (!outputFile) return;\n fs.appendFileSync(outputFile, `${name}=${value}\\n`);\n}\n\nfunction githubEvent(): GitHubEvent {\n const filename = process.env.GITHUB_EVENT_PATH;\n if (!filename || !fs.existsSync(filename)) return {};\n return JSON.parse(fs.readFileSync(filename, \"utf8\")) as GitHubEvent;\n}\n\nfunction githubRepo(event: GitHubEvent): string | null {\n return process.env.GITHUB_REPOSITORY ?? event.repository?.full_name ?? null;\n}\n\nfunction githubRunUrl(): string | null {\n const server = process.env.GITHUB_SERVER_URL;\n const repository = process.env.GITHUB_REPOSITORY;\n const runId = process.env.GITHUB_RUN_ID;\n return server && repository && runId ? `${server}/${repository}/actions/runs/${runId}` : null;\n}\n\nasync function githubApi<T>(repo: string, endpoint: string, options: { method?: string; body?: unknown } = {}): Promise<T> {\n const token = process.env.GITHUB_TOKEN;\n if (!token) throw new Error(\"GITHUB_TOKEN is unavailable\");\n const apiBase = process.env.GITHUB_API_URL ?? \"https://api.github.com\";\n const response = await fetch(`${apiBase}/repos/${repo}${endpoint}`, {\n method: options.method ?? \"GET\",\n headers: {\n Accept: \"application/vnd.github+json\",\n Authorization: `Bearer ${token}`,\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n \"User-Agent\": \"react-luau-doctor\",\n \"Content-Type\": \"application/json\",\n },\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\n });\n if (!response.ok) throw new Error(`GitHub API ${response.status}: ${await response.text()}`);\n if (response.status === 204) return undefined as T;\n return await response.json() as T;\n}\n\nfunction repoRelativeDiagnosticPath(directory: string, diagnosticFile: string): string {\n const absoluteDirectory = path.resolve(directory);\n const repoRoot = findGitRoot(absoluteDirectory);\n const prefix = path.relative(repoRoot, absoluteDirectory).split(path.sep).join(\"/\");\n return prefix && prefix !== \".\" ? path.posix.join(prefix, diagnosticFile) : diagnosticFile;\n}\n\nfunction githubFileUrl(repo: string, sha: string, diagnostic: Diagnostic, directory: string): string {\n const server = process.env.GITHUB_SERVER_URL ?? \"https://github.com\";\n const repoPath = repoRelativeDiagnosticPath(directory, diagnostic.file);\n const encoded = repoPath.split(\"/\").map(encodeURIComponent).join(\"/\");\n return `${server}/${repo}/blob/${sha}/${encoded}#L${diagnostic.location.line}`;\n}\n\nfunction renderSummaryComment(report: ScanReport, repo: string, sha: string, fixed: number, skipped: boolean, directory: string): string {\n if (skipped) {\n return `${SUMMARY_MARKER}\\n## React-Luau Doctor\\n\\nNo eligible React-Luau files changed in this pull request, so the scan was skipped.\\n`;\n }\n\n const lines = [\n SUMMARY_MARKER,\n \"## React-Luau Doctor\",\n \"\",\n `**${report.counts.error} errors · ${report.counts.warning} warnings · ${report.counts.suggestion} suggestions · Score ${report.score}/100**`,\n \"\",\n `${report.diagnostics.length} ${report.scope === \"changed\" ? \"introduced finding\" : \"reported finding\"}${report.diagnostics.length === 1 ? \"\" : \"s\"} · ${fixed} fixed`,\n ];\n\n const errors = report.diagnostics.filter((diagnostic) => diagnostic.severity === \"error\").slice(0, 20);\n if (errors.length > 0) {\n lines.push(\"\", \"### Errors\");\n for (const diagnostic of errors) {\n lines.push(`- [\\`${diagnostic.file}:${diagnostic.location.line}\\`](${githubFileUrl(repo, sha, diagnostic, directory)}) **${diagnostic.rule}**: ${diagnostic.message}`);\n }\n }\n\n const warningsByFile = new Map<string, Diagnostic[]>();\n for (const diagnostic of report.diagnostics.filter((entry) => entry.severity === \"warning\").slice(0, 50)) {\n const entries = warningsByFile.get(diagnostic.file) ?? [];\n entries.push(diagnostic);\n warningsByFile.set(diagnostic.file, entries);\n }\n if (warningsByFile.size > 0) {\n lines.push(\"\", \"### Warnings\");\n for (const [file, diagnostics] of warningsByFile) {\n lines.push(`- **${file}**`);\n for (const diagnostic of diagnostics) lines.push(` - [line ${diagnostic.location.line}](${githubFileUrl(repo, sha, diagnostic, directory)}): ${diagnostic.message}`);\n }\n }\n\n if (report.diagnostics.length > errors.length + [...warningsByFile.values()].reduce((sum, entries) => sum + entries.length, 0)) {\n lines.push(\"\", \"Additional findings are available in the workflow logs.\");\n }\n const runUrl = githubRunUrl();\n if (runUrl) lines.push(\"\", `[View full workflow run](${runUrl})`);\n lines.push(\"\", `<sub>Reviewed commit \\`${sha.slice(0, 7)}\\`</sub>`);\n return `${lines.join(\"\\n\")}\\n`;\n}\n\ninterface GitHubComment { id: number; body?: string; user?: { type?: string; login?: string } }\n\nasync function listComments(repo: string, endpoint: string): Promise<GitHubComment[]> {\n const comments: GitHubComment[] = [];\n for (let page = 1; ; page += 1) {\n const batch = await githubApi<GitHubComment[]>(repo, `${endpoint}?per_page=100&page=${page}`);\n comments.push(...batch);\n if (batch.length < 100) return comments;\n }\n}\n\nfunction isDoctorComment(comment: GitHubComment, marker: string): boolean {\n return comment.user?.type === \"Bot\" && comment.body?.startsWith(marker) === true;\n}\n\nasync function updateStickyComment(repo: string, pullNumber: number, body: string, createIfMissing = true): Promise<void> {\n const comments = await listComments(repo, `/issues/${pullNumber}/comments`);\n const previous = comments.find((comment) => isDoctorComment(comment, SUMMARY_MARKER));\n if (previous) await githubApi(repo, `/issues/comments/${previous.id}`, { method: \"PATCH\", body: { body } });\n else if (createIfMissing) await githubApi(repo, `/issues/${pullNumber}/comments`, { method: \"POST\", body: { body } });\n}\n\nfunction changedLineMap(directory: string, base: string): Map<string, LineRange[]> {\n return createGitScopePlan(directory, { scope: \"lines\", base }).changedLines;\n}\n\nfunction touchesChangedLine(diagnostic: Diagnostic, ranges: LineRange[]): boolean {\n return ranges.some((range) => diagnostic.location.line >= range.start && diagnostic.location.line <= range.end);\n}\n\nasync function replaceReviewComments(repo: string, pullNumber: number, report: ScanReport, directory: string, base: string): Promise<void> {\n const lineMap = changedLineMap(directory, base);\n const comments = report.diagnostics\n .filter((diagnostic) => touchesChangedLine(diagnostic, lineMap.get(diagnostic.file) ?? []))\n .slice(0, MAX_REVIEW_COMMENTS)\n .map((diagnostic) => ({\n path: repoRelativeDiagnosticPath(directory, diagnostic.file),\n line: diagnostic.location.line,\n side: \"RIGHT\",\n body: `${REVIEW_MARKER}\\n**React-Luau Doctor** · \\`${diagnostic.rule}\\` (${diagnostic.severity})\\n\\n${diagnostic.message}${diagnostic.help ? `\\n\\n${diagnostic.help}` : \"\"}`,\n }));\n\n const previous = await listComments(repo, `/pulls/${pullNumber}/comments`);\n if (comments.length > 0) {\n await githubApi(repo, `/pulls/${pullNumber}/reviews`, {\n method: \"POST\",\n body: { event: \"COMMENT\", body: \"React-Luau Doctor review\", comments },\n });\n }\n for (const comment of previous.filter((entry) => isDoctorComment(entry, REVIEW_MARKER))) {\n try {\n await githubApi(repo, `/pulls/comments/${comment.id}`, { method: \"DELETE\" });\n } catch (error) {\n process.stderr.write(`react-luau-doctor: could not remove an earlier review comment: ${error instanceof Error ? error.message : String(error)}\\n`);\n }\n }\n}\n\nasync function publishCommitStatus(repo: string, sha: string, report: ScanReport, blocking: BlockingLevel): Promise<void> {\n const blocked = shouldBlock(report, blocking);\n await githubApi(repo, `/statuses/${sha}`, {\n method: \"POST\",\n body: {\n state: blocked ? \"failure\" : \"success\",\n context: \"React-Luau Doctor\",\n description: `Score ${report.score}/100 · ${report.counts.error} errors · ${report.counts.warning} warnings`,\n target_url: githubRunUrl() ?? undefined,\n },\n });\n}\n\ninterface CiRunOptions extends CiSettings {}\n\nfunction parseCiRunOptions(argv: string[]): CiRunOptions {\n const settings = { ...DEFAULT_SETTINGS };\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === \"--directory\") {\n const parsed = nextValue(argv, index, arg);\n settings.directory = parsed.value;\n index = parsed.nextIndex;\n } else if (arg === \"--project\") {\n const parsed = nextValue(argv, index, arg);\n settings.project = parsed.value;\n index = parsed.nextIndex;\n } else if (arg === \"--blocking\") {\n const parsed = nextValue(argv, index, arg);\n settings.blocking = parseBlocking(parsed.value);\n index = parsed.nextIndex;\n } else if (arg === \"--scope\") {\n const parsed = nextValue(argv, index, arg);\n settings.scope = parseScope(parsed.value);\n index = parsed.nextIndex;\n } else if (arg === \"--comment\") settings.comment = true;\n else if (arg === \"--no-comment\") settings.comment = false;\n else if (arg === \"--review-comments\") settings.reviewComments = true;\n else if (arg === \"--no-review-comments\") settings.reviewComments = false;\n else if (arg === \"--commit-status\") settings.commitStatus = true;\n else if (arg === \"--no-commit-status\") settings.commitStatus = false;\n else throw new Error(`Unknown ci run option: ${arg}`);\n }\n return settings;\n}\n\nasync function runCiAction(argv: string[]): Promise<void> {\n const settings = parseCiRunOptions(argv);\n const eventName = process.env.GITHUB_EVENT_NAME ?? \"\";\n const event = githubEvent();\n const isPullRequest = eventName === \"pull_request\" && event.pull_request !== undefined;\n const base = isPullRequest ? event.pull_request!.base.sha : undefined;\n const head = isPullRequest ? event.pull_request!.head.sha : process.env.GITHUB_SHA ?? \"HEAD\";\n const report = await scanForCi(settings, eventName, base);\n const fixed = isPullRequest && base\n ? (await Promise.all(resolveCiProjectRoots(path.resolve(settings.directory), settings.project).map(root => fixedIssueCount(root, base)))).reduce((sum, count) => sum + count, 0)\n : 0;\n const skipped = isPullRequest && report.scannedFiles === 0 && fixed === 0;\n const effectiveBlocking = isPullRequest ? settings.blocking : \"none\";\n\n process.stdout.write(`${renderTextReport(report, true, false, false, process.stdout.columns ?? 120)}\\n`);\n const annotations = renderAnnotations(report);\n if (annotations) process.stdout.write(`${annotations}\\n`);\n\n writeOutput(\"score\", report.score);\n writeOutput(\"total-issues\", report.diagnostics.length);\n writeOutput(\"fixed-issues\", fixed);\n writeOutput(\"error-count\", report.counts.error);\n writeOutput(\"warning-count\", report.counts.warning);\n writeOutput(\"affected-files\", affectedFiles(report));\n\n const repo = githubRepo(event);\n if (repo && isPullRequest) {\n const pullNumber = event.pull_request!.number;\n if (settings.comment) {\n try {\n await updateStickyComment(repo, pullNumber, renderSummaryComment(report, repo, head, fixed, skipped, settings.directory), !skipped);\n } catch (error) {\n process.stderr.write(`react-luau-doctor: could not update the sticky PR comment: ${error instanceof Error ? error.message : String(error)}\\n`);\n }\n }\n if (settings.reviewComments && base) {\n try {\n await replaceReviewComments(repo, pullNumber, report, path.resolve(settings.directory), base);\n } catch (error) {\n process.stderr.write(`react-luau-doctor: could not update inline review comments: ${error instanceof Error ? error.message : String(error)}\\n`);\n }\n }\n }\n\n if (repo && settings.commitStatus) {\n try {\n await publishCommitStatus(repo, head, report, effectiveBlocking);\n } catch (error) {\n process.stderr.write(`react-luau-doctor: could not publish the commit status: ${error instanceof Error ? error.message : String(error)}\\n`);\n }\n }\n\n if (shouldBlock(report, effectiveBlocking)) process.exitCode = 1;\n}\n\nexport async function runCiCommand(argv: string[]): Promise<void> {\n const action = argv[0];\n if (action === \"install\" || action === \"config\" || action === \"upgrade\") {\n await runCiManage(action, argv.slice(1));\n return;\n }\n if (action === \"run\") {\n await runCiAction(argv.slice(1));\n return;\n }\n throw new Error(\"ci requires install, config, or upgrade\");\n}\n",
8
+ "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { DoctorConfig } from \"./types\";\n\nconst DEFAULT_IGNORES = new Set([\n \".git\",\n \"node_modules\",\n \"Packages\",\n \"DevPackages\",\n \"ServerPackages\",\n \"build\",\n \"dist\",\n \"out\",\n \"vendor\",\n \"coverage\",\n]);\n\nfunction normalize(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nfunction wildcardToRegex(pattern: string): RegExp {\n const normalized = normalize(pattern);\n let source = \"\";\n\n for (let index = 0; index < normalized.length; index += 1) {\n const char = normalized[index];\n const next = normalized[index + 1];\n const afterNext = normalized[index + 2];\n\n if (char === \"*\" && next === \"*\" && afterNext === \"/\") {\n source += \"(?:.*/)?\";\n index += 2;\n continue;\n }\n if (char === \"*\" && next === \"*\") {\n source += \".*\";\n index += 1;\n continue;\n }\n if (char === \"*\") {\n source += \"[^/]*\";\n continue;\n }\n if (char === \"?\") {\n source += \"[^/]\";\n continue;\n }\n\n source += /[.+^${}()|[\\]\\\\]/.test(char) ? `\\\\${char}` : char;\n }\n\n return new RegExp(`^${source}$`);\n}\n\nfunction matchesAny(relative: string, patterns: string[] | undefined): boolean {\n if (!patterns || patterns.length === 0) return false;\n const normalized = normalize(relative);\n return patterns.some((pattern) => wildcardToRegex(pattern).test(normalized));\n}\n\nfunction isLuauFile(filename: string): boolean {\n return filename.endsWith(\".lua\") || filename.endsWith(\".luau\");\n}\n\n/**\n * Apply the same include/ignore selection used by directory discovery to a\n * project-root-relative file path. Git scopes supply explicit file inputs, so\n * they must call this instead of relying on discoverLuauFiles to filter them.\n */\nexport function isSelectedLuauPath(relativePath: string, config: DoctorConfig): boolean {\n const normalized = normalize(relativePath).replace(/^\\.\\//, \"\");\n if (!isLuauFile(normalized)) return false;\n\n const segments = normalized.split(\"/\");\n let directory = \"\";\n for (const segment of segments.slice(0, -1)) {\n if (DEFAULT_IGNORES.has(segment)) return false;\n directory = directory ? `${directory}/${segment}` : segment;\n if (matchesAny(`${directory}/`, config.ignore)) return false;\n }\n\n if (matchesAny(normalized, config.ignore)) return false;\n if (config.include && config.include.length > 0 && !matchesAny(normalized, config.include)) return false;\n return true;\n}\n\nexport function discoverLuauFiles(root: string, config: DoctorConfig, patternRoot = root): string[] {\n const targetStat = fs.statSync(root);\n if (targetStat.isFile()) {\n return isLuauFile(root) ? [root] : [];\n }\n if (!targetStat.isDirectory()) return [];\n\n const results: string[] = [];\n\n const visit = (directory: string): void => {\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n const absolute = path.join(directory, entry.name);\n const relative = path.relative(patternRoot, absolute);\n\n if (entry.isDirectory()) {\n if (DEFAULT_IGNORES.has(entry.name) || matchesAny(`${normalize(relative)}/`, config.ignore)) continue;\n visit(absolute);\n continue;\n }\n\n if (!entry.isFile() || !isLuauFile(entry.name)) continue;\n if (!isSelectedLuauPath(relative, config)) continue;\n results.push(absolute);\n }\n };\n\n visit(root);\n return results.sort();\n}\n",
9
+ "import { spawnSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScanFileInput, ScanScope } from \"./types\";\n\nexport interface LineRange {\n start: number;\n end: number;\n}\n\nexport interface GitScopeOptions {\n scope: Exclude<ScanScope, \"full\">;\n base?: string;\n includeUntracked?: boolean;\n staged?: boolean;\n changedFilesFrom?: string;\n}\n\nexport interface GitScopePlan {\n repoRoot: string;\n scanRoot: string;\n base: string;\n changedFiles: string[];\n currentFiles: ScanFileInput[];\n baselineFiles: ScanFileInput[];\n changedLines: Map<string, LineRange[]>;\n}\n\ninterface GitResult {\n status: number;\n stdout: string;\n stderr: string;\n}\n\nfunction runGit(cwd: string, args: string[], allowFailure = false): GitResult {\n const result = spawnSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n maxBuffer: 64 * 1024 * 1024,\n windowsHide: true,\n });\n\n if (result.error) {\n if (allowFailure) return { status: 1, stdout: \"\", stderr: result.error.message };\n throw new Error(`git ${args[0] ?? \"\"} failed: ${result.error.message}`);\n }\n\n const status = result.status ?? 1;\n const stdout = result.stdout ?? \"\";\n const stderr = result.stderr ?? \"\";\n if (status !== 0 && !allowFailure) {\n const detail = stderr.trim() || stdout.trim() || `exit code ${status}`;\n throw new Error(`git ${args[0] ?? \"\"} failed: ${detail}`);\n }\n return { status, stdout, stderr };\n}\n\nfunction normalize(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nfunction isInside(parent: string, child: string): boolean {\n const relative = path.relative(parent, child);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction isLuauFile(filename: string): boolean {\n return filename.endsWith(\".lua\") || filename.endsWith(\".luau\");\n}\n\nfunction lines(output: string): string[] {\n return output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n}\n\nexport function findGitRoot(cwd: string): string {\n const result = runGit(cwd, [\"rev-parse\", \"--show-toplevel\"], true);\n if (result.status !== 0) throw new Error(`Git scope requires a git repository: ${cwd}`);\n return path.resolve(result.stdout.trim());\n}\n\nfunction verifyCommit(repoRoot: string, ref: string): string | null {\n if (ref.startsWith(\"-\")) throw new Error(`Invalid git ref: ${ref}`);\n const result = runGit(repoRoot, [\"rev-parse\", \"--verify\", \"--quiet\", `${ref}^{commit}`], true);\n return result.status === 0 ? result.stdout.trim() : null;\n}\n\nfunction hasWorkingChanges(repoRoot: string): boolean {\n return runGit(repoRoot, [\"status\", \"--porcelain\", \"--untracked-files=no\"], true).stdout.trim().length > 0;\n}\n\nfunction resolveOriginHead(repoRoot: string): string | null {\n const result = runGit(repoRoot, [\"symbolic-ref\", \"--quiet\", \"refs/remotes/origin/HEAD\"], true);\n if (result.status !== 0) return null;\n return result.stdout.trim().replace(/^refs\\/remotes\\//, \"\");\n}\n\nfunction mergeBase(repoRoot: string, left: string, right = \"HEAD\"): string | null {\n const result = runGit(repoRoot, [\"merge-base\", left, right], true);\n return result.status === 0 ? result.stdout.trim() : null;\n}\n\nexport function resolveGitBase(repoRoot: string, requested?: string): string {\n if (requested) {\n const commit = verifyCommit(repoRoot, requested);\n if (!commit) throw new Error(`Could not resolve git base ref: ${requested}`);\n return mergeBase(repoRoot, commit) ?? commit;\n }\n\n const environmentBase = process.env.GITHUB_BASE_REF?.trim();\n const candidates = [\n environmentBase ? `origin/${environmentBase}` : null,\n environmentBase ?? null,\n resolveOriginHead(repoRoot),\n \"origin/main\",\n \"origin/master\",\n \"main\",\n \"master\",\n ].filter((candidate): candidate is string => Boolean(candidate));\n\n const head = verifyCommit(repoRoot, \"HEAD\");\n for (const candidate of [...new Set(candidates)]) {\n const commit = verifyCommit(repoRoot, candidate);\n if (!commit || commit === head) continue;\n const base = mergeBase(repoRoot, commit);\n if (base) return base;\n }\n\n if (hasWorkingChanges(repoRoot)) return verifyCommit(repoRoot, \"HEAD\") ?? \"HEAD\";\n return verifyCommit(repoRoot, \"HEAD\") ?? \"HEAD\";\n}\n\nfunction readChangedFilesFile(filename: string, repoRoot: string): string[] {\n let content: string;\n try {\n content = fs.readFileSync(filename, \"utf8\");\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new Error(`Could not read --changed-files-from file \"${filename}\": ${detail}`);\n }\n\n return lines(content).map((entry) => {\n const absolute = path.isAbsolute(entry) ? path.resolve(entry) : path.resolve(repoRoot, entry);\n return normalize(path.relative(repoRoot, absolute));\n });\n}\n\nfunction getUntrackedFiles(repoRoot: string): string[] {\n return lines(runGit(repoRoot, [\"ls-files\", \"--others\", \"--exclude-standard\"], true).stdout);\n}\n\ninterface ChangedRepoFile {\n currentPath: string;\n baselinePath: string | null;\n}\n\nfunction parseNameStatusZ(output: string): ChangedRepoFile[] {\n const fields = output.split(\"\\0\");\n const changed: ChangedRepoFile[] = [];\n for (let index = 0; index < fields.length;) {\n const status = fields[index++];\n if (!status) continue;\n if (status.startsWith(\"R\") || status.startsWith(\"C\")) {\n const baselinePath = fields[index++];\n const currentPath = fields[index++];\n if (baselinePath && currentPath) changed.push({ currentPath: normalize(currentPath), baselinePath: normalize(baselinePath) });\n continue;\n }\n const currentPath = fields[index++];\n if (!currentPath) continue;\n changed.push({\n currentPath: normalize(currentPath),\n baselinePath: status.startsWith(\"A\") ? null : normalize(currentPath),\n });\n }\n return changed;\n}\n\nfunction getChangedRepoFiles(\n repoRoot: string,\n base: string,\n options: Pick<GitScopeOptions, \"includeUntracked\" | \"staged\" | \"changedFilesFrom\">,\n): ChangedRepoFile[] {\n let changed: ChangedRepoFile[];\n\n if (options.changedFilesFrom) {\n changed = readChangedFilesFile(path.resolve(process.cwd(), options.changedFilesFrom), repoRoot).map((currentPath) => ({\n currentPath: normalize(currentPath),\n baselinePath: normalize(currentPath),\n }));\n } else {\n const args = options.staged\n ? [\"diff\", \"--cached\", \"--name-status\", \"-z\", \"--find-renames\", \"--diff-filter=ACDMR\", \"--\"]\n : [\"diff\", \"--name-status\", \"-z\", \"--find-renames\", \"--diff-filter=ACDMR\", base, \"--\"];\n changed = parseNameStatusZ(runGit(repoRoot, args).stdout);\n }\n\n if (options.includeUntracked && !options.staged) {\n changed.push(...getUntrackedFiles(repoRoot).map((currentPath) => ({ currentPath: normalize(currentPath), baselinePath: null })));\n }\n\n const byCurrentPath = new Map<string, ChangedRepoFile>();\n for (const entry of changed) byCurrentPath.set(entry.currentPath, entry);\n return [...byCurrentPath.values()].sort((a, b) => a.currentPath.localeCompare(b.currentPath));\n}\n\nfunction readGitObject(repoRoot: string, objectSpec: string): string | null {\n const result = runGit(repoRoot, [\"show\", objectSpec], true);\n return result.status === 0 ? result.stdout : null;\n}\n\nfunction readGitObjects(repoRoot: string, objectSpecs: string[]): Map<string, string | null> {\n const unique = [...new Set(objectSpecs)];\n const values = new Map<string, string | null>();\n if (unique.length === 0) return values;\n\n const result = spawnSync(\"git\", [\"cat-file\", \"--batch\", \"-z\"], {\n cwd: repoRoot,\n input: `${unique.join(\"\\0\")}\\0`,\n encoding: null,\n maxBuffer: 256 * 1024 * 1024,\n windowsHide: true,\n });\n if (result.error || (result.status ?? 1) !== 0 || !Buffer.isBuffer(result.stdout)) {\n // Fall back to individual reads if a Git version or unusual object name does\n // not support the batch path. Correctness is more important than the speedup.\n for (const spec of unique) values.set(spec, readGitObject(repoRoot, spec));\n return values;\n }\n\n const output = result.stdout;\n let offset = 0;\n let parseFailed = false;\n for (const spec of unique) {\n const lineEnd = output.indexOf(0x0a, offset);\n if (lineEnd < 0) {\n parseFailed = true;\n break;\n }\n const header = output.subarray(offset, lineEnd).toString(\"utf8\");\n offset = lineEnd + 1;\n if (header.endsWith(\" missing\")) {\n values.set(spec, null);\n continue;\n }\n\n const match = header.match(/^[0-9a-f]+\\s+\\S+\\s+(\\d+)$/i);\n if (!match) {\n parseFailed = true;\n break;\n }\n const size = Number(match[1]);\n const end = offset + size;\n if (!Number.isSafeInteger(size) || size < 0 || end > output.length) {\n parseFailed = true;\n break;\n }\n values.set(spec, output.subarray(offset, end).toString(\"utf8\"));\n offset = end;\n if (output[offset] === 0x0a) offset += 1;\n }\n\n if (parseFailed) {\n values.clear();\n for (const spec of unique) values.set(spec, readGitObject(repoRoot, spec));\n }\n return values;\n}\n\nfunction currentSource(repoRoot: string, repoRelativePath: string, staged: boolean): string | null {\n if (staged) return readGitObject(repoRoot, `:${repoRelativePath}`);\n const absolute = path.join(repoRoot, ...repoRelativePath.split(\"/\"));\n if (!fs.existsSync(absolute) || !fs.statSync(absolute).isFile()) return null;\n return fs.readFileSync(absolute, \"utf8\");\n}\n\nfunction baselineSource(repoRoot: string, base: string, repoRelativePath: string): string | null {\n return readGitObject(repoRoot, `${base}:${repoRelativePath}`);\n}\n\nfunction parseChangedLineRanges(diff: string): LineRange[] {\n const ranges: LineRange[] = [];\n for (const line of diff.split(/\\r?\\n/)) {\n const match = line.match(/^@@\\s+-\\d+(?:,\\d+)?\\s+\\+(\\d+)(?:,(\\d+))?\\s+@@/);\n if (!match) continue;\n const start = Number(match[1]);\n const count = match[2] === undefined ? 1 : Number(match[2]);\n if (count <= 0) continue;\n ranges.push({ start, end: start + count - 1 });\n }\n return ranges;\n}\n\nfunction lineRangesForFile(repoRoot: string, base: string, repoRelativePath: string, staged: boolean, source: string): LineRange[] {\n const args = staged\n ? [\"diff\", \"--cached\", \"--unified=0\", \"--no-color\", \"--\", repoRelativePath]\n : [\"diff\", \"--unified=0\", \"--no-color\", base, \"--\", repoRelativePath];\n const diff = runGit(repoRoot, args, true).stdout;\n const ranges = parseChangedLineRanges(diff);\n if (ranges.length > 0) return ranges;\n\n const tracked = runGit(repoRoot, [\"ls-files\", \"--error-unmatch\", \"--\", repoRelativePath], true).status === 0;\n if (!tracked) {\n const lineCount = Math.max(1, source.split(/\\r?\\n/).length);\n return [{ start: 1, end: lineCount }];\n }\n return [];\n}\n\nexport function createGitScopePlan(scanRootInput: string, options: GitScopeOptions, relativeRootInput = scanRootInput): GitScopePlan {\n const scanRoot = path.resolve(scanRootInput);\n const relativeRoot = path.resolve(relativeRootInput);\n const repoRoot = findGitRoot(scanRoot);\n const base = resolveGitBase(repoRoot, options.base);\n const repoFiles = getChangedRepoFiles(repoRoot, base, options);\n const currentFiles: ScanFileInput[] = [];\n const baselineFiles: ScanFileInput[] = [];\n const changedLines = new Map<string, LineRange[]>();\n const changedFiles: string[] = [];\n const stagedSources = options.staged\n ? readGitObjects(repoRoot, repoFiles.map((file) => `:${file.currentPath}`))\n : new Map<string, string | null>();\n const baselineSources = options.scope === \"changed\"\n ? readGitObjects(\n repoRoot,\n repoFiles\n .filter((file) => file.baselinePath !== null)\n .map((file) => `${base}:${file.baselinePath}`),\n )\n : new Map<string, string | null>();\n\n for (const repoFile of repoFiles) {\n const repoRelativePath = repoFile.currentPath;\n if (!isLuauFile(repoRelativePath)) continue;\n const absolutePath = path.resolve(repoRoot, ...repoRelativePath.split(\"/\"));\n if (!isInside(scanRoot, absolutePath)) continue;\n\n const source = options.staged\n ? stagedSources.get(`:${repoRelativePath}`) ?? null\n : currentSource(repoRoot, repoRelativePath, false);\n const relativePath = normalize(path.relative(relativeRoot, absolutePath));\n changedFiles.push(relativePath);\n if (source !== null) currentFiles.push({ absolutePath, relativePath, source, forceScan: false });\n\n const baseline = options.scope !== \"changed\" || repoFile.baselinePath === null\n ? null\n : baselineSources.get(`${base}:${repoFile.baselinePath}`) ?? null;\n if (baseline !== null) baselineFiles.push({ absolutePath, relativePath, source: baseline, forceScan: false });\n\n if (options.scope === \"lines\" && source !== null) {\n changedLines.set(relativePath, lineRangesForFile(repoRoot, base, repoRelativePath, Boolean(options.staged), source));\n }\n }\n\n return {\n repoRoot,\n scanRoot,\n base,\n changedFiles: [...new Set(changedFiles)].sort(),\n currentFiles,\n baselineFiles,\n changedLines,\n };\n}\n",
10
+ "import type { Diagnostic, RuleDefinition, ScanReport, Severity } from \"./types\";\n\nconst SYMBOLS: Record<Severity, string> = {\n error: \"x\",\n warning: \"!\",\n suggestion: \"i\",\n};\n\nconst ANSI = {\n reset: \"\\u001b[0m\",\n bold: \"\\u001b[1m\",\n dim: \"\\u001b[2m\",\n red: \"\\u001b[31m\",\n yellow: \"\\u001b[33m\",\n cyan: \"\\u001b[36m\",\n green: \"\\u001b[32m\",\n magenta: \"\\u001b[35m\",\n};\n\nfunction paint(value: string, ...codes: string[]): string {\n return `${codes.join(\"\")}${value}${ANSI.reset}`;\n}\n\nfunction severityPaint(severity: Severity, value: string): string {\n if (severity === \"error\") return paint(value, ANSI.bold, ANSI.red);\n if (severity === \"warning\") return paint(value, ANSI.bold, ANSI.yellow);\n return paint(value, ANSI.bold, ANSI.magenta);\n}\n\nfunction scoreLabel(score: number): string {\n if (score >= 90) return \"Excellent\";\n if (score >= 75) return \"Good\";\n if (score >= 50) return \"Needs work\";\n return \"Critical\";\n}\n\nfunction scorePaint(score: number, value: string): string {\n if (score >= 75) return paint(value, ANSI.bold, ANSI.green);\n if (score >= 50) return paint(value, ANSI.bold, ANSI.yellow);\n return paint(value, ANSI.bold, ANSI.red);\n}\n\nfunction terminalWidth(value: number): number {\n return Math.max(32, value || 120);\n}\n\nfunction wrapWords(value: string, width: number): string[] {\n const normalized = value.trim().replace(/\\s+/g, \" \");\n if (!normalized) return [\"\"];\n if (width <= 1) return [normalized];\n\n const lines: string[] = [];\n let line = \"\";\n for (const word of normalized.split(\" \")) {\n if (!line) {\n line = word;\n continue;\n }\n if (line.length + 1 + word.length <= width) {\n line += ` ${word}`;\n continue;\n }\n lines.push(line);\n line = word;\n }\n if (line) lines.push(line);\n return lines;\n}\n\nfunction wrapFirstThen(value: string, firstWidth: number, continuationWidth: number): string[] {\n const normalized = value.trim().replace(/\\s+/g, \" \");\n if (!normalized) return [\"\"];\n\n const words = normalized.split(\" \");\n const lines: string[] = [];\n let width = Math.max(1, firstWidth);\n let line = \"\";\n\n for (const word of words) {\n if (!line) {\n line = word;\n continue;\n }\n if (line.length + 1 + word.length <= width) {\n line += ` ${word}`;\n continue;\n }\n lines.push(line);\n line = word;\n width = Math.max(1, continuationWidth);\n }\n if (line) lines.push(line);\n return lines;\n}\n\nfunction renderDiagnosticLines(diagnostic: Diagnostic, colorized: boolean, width: number, baseIndent = \" \"): string[] {\n const symbol = SYMBOLS[diagnostic.severity];\n const location = `${diagnostic.file}:${diagnostic.location.line}:${diagnostic.location.column}`;\n const prefixVisible = baseIndent.length + symbol.length + 1 + location.length + 2;\n const continuationIndent = \" \";\n const continuationWidth = Math.max(16, width - continuationIndent.length);\n const firstWidth = width - prefixVisible;\n const splitMessage = firstWidth < 24;\n const messageLines = splitMessage\n ? wrapWords(diagnostic.message, continuationWidth)\n : wrapFirstThen(diagnostic.message, firstWidth, continuationWidth);\n const rendered: string[] = [];\n\n const symbolText = colorized ? severityPaint(diagnostic.severity, symbol) : symbol;\n const locationText = colorized ? paint(location, ANSI.bold) : location;\n\n if (splitMessage) {\n rendered.push(`${baseIndent}${symbolText} ${locationText}`);\n for (const messageLine of messageLines) rendered.push(`${continuationIndent}${messageLine}`);\n return rendered;\n }\n\n rendered.push(`${baseIndent}${symbolText} ${locationText} ${messageLines[0]}`);\n for (const messageLine of messageLines.slice(1)) rendered.push(`${continuationIndent}${messageLine}`);\n return rendered;\n}\n\nfunction renderIndentedWrapped(value: string, colorized: boolean, width: number, indent = \" \"): string[] {\n const wrapped = wrapWords(value, Math.max(16, width - indent.length));\n return wrapped.map((line) => `${indent}${colorized ? paint(line, ANSI.dim) : line}`);\n}\n\nexport function renderRulesList(\n ruleDefinitions: RuleDefinition[],\n terminalWidth = 120,\n severityOverrides: ReadonlyMap<string, string> = new Map(),\n colorized = false,\n): string {\n const title = colorized ? paint(\"React-Luau Doctor Rules\", ANSI.bold, ANSI.magenta) : \"React-Luau Doctor Rules\";\n if (ruleDefinitions.length === 0) return `${title}\\n0 rules`;\n\n const ruleWidth = Math.max(\"Rule ID\".length, ...ruleDefinitions.map((rule) => rule.id.length));\n const severityWidth = Math.max(\n \"Severity\".length,\n ...ruleDefinitions.map((rule) => (severityOverrides.get(rule.id) ?? rule.severity).length),\n );\n const categoryWidth = Math.max(\"Category\".length, ...ruleDefinitions.map((rule) => rule.category.length));\n const gap = \" \";\n const fixedWidth = ruleWidth + severityWidth + categoryWidth + gap.length * 3;\n const tableWidth = Math.max(96, Math.min(160, terminalWidth || 120));\n const descriptionWidth = Math.max(28, tableWidth - fixedWidth);\n const descriptionIndent = \" \".repeat(fixedWidth);\n\n const header = `${\"Rule ID\".padEnd(ruleWidth)}${gap}${\"Severity\".padEnd(severityWidth)}${gap}${\"Category\".padEnd(categoryWidth)}${gap}Description`;\n const separator = `${\"-\".repeat(ruleWidth)}${gap}${\"-\".repeat(severityWidth)}${gap}${\"-\".repeat(categoryWidth)}${gap}${\"-\".repeat(descriptionWidth)}`;\n const lines: string[] = [title, `${ruleDefinitions.length} rules`, \"\", colorized ? paint(header, ANSI.bold) : header, colorized ? paint(separator, ANSI.dim) : separator];\n\n for (const rule of ruleDefinitions) {\n const severity = severityOverrides.get(rule.id) ?? rule.severity;\n const descriptionLines = wrapWords(rule.description, descriptionWidth);\n const ruleCell = rule.id.padEnd(ruleWidth);\n const severityCell = severity.padEnd(severityWidth);\n const categoryCell = rule.category.padEnd(categoryWidth);\n const firstLine = colorized\n ? `${paint(ruleCell, ANSI.bold)}${gap}${severity === \"off\" ? paint(severityCell, ANSI.dim) : severityPaint(severity as Severity, severityCell)}${gap}${paint(categoryCell, ANSI.dim)}${gap}${descriptionLines[0]}`\n : `${ruleCell}${gap}${severityCell}${gap}${categoryCell}${gap}${descriptionLines[0]}`;\n lines.push(firstLine);\n for (const continuation of descriptionLines.slice(1)) {\n lines.push(colorized ? `${descriptionIndent}${paint(continuation, ANSI.dim)}` : `${descriptionIndent}${continuation}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderCounts(report: ScanReport, colorized: boolean): string {\n if (!colorized) {\n return `${report.counts.error} errors, ${report.counts.warning} warnings, ${report.counts.suggestion} suggestions`;\n }\n return [\n severityPaint(\"error\", `${report.counts.error} errors`),\n severityPaint(\"warning\", `${report.counts.warning} warnings`),\n severityPaint(\"suggestion\", `${report.counts.suggestion} suggestions`),\n ].join(\", \");\n}\n\nfunction renderHeader(report: ScanReport, colorized: boolean): string[] {\n const title = colorized ? paint(\"React-Luau Doctor\", ANSI.bold, ANSI.magenta) : \"React-Luau Doctor\";\n const scopeSuffix = report.scope && report.scope !== \"full\" ? ` (${report.scope} scope)` : \"\";\n const lines = [title, `Scanned ${report.scannedFiles} React-Luau files in ${report.durationMs.toFixed(2)}ms${scopeSuffix}`];\n if (report.partial) {\n const message = `Partial scan: ${(report.skippedFiles ?? []).length} candidate files skipped after the time budget.`;\n lines.push(colorized ? severityPaint(\"warning\", message) : message);\n }\n return lines;\n}\n\nfunction renderVerboseDiagnostics(report: ScanReport, colorized: boolean, width: number): string[] {\n if (report.diagnostics.length === 0) {\n return [colorized ? paint(\"No issues found.\", ANSI.bold, ANSI.green) : \"No issues found.\"];\n }\n\n const lines: string[] = [];\n let currentFile = \"\";\n for (const diagnostic of report.diagnostics) {\n if (diagnostic.file !== currentFile) {\n if (currentFile) lines.push(\"\");\n currentFile = diagnostic.file;\n lines.push(colorized ? paint(currentFile, ANSI.bold, ANSI.cyan) : currentFile);\n }\n lines.push(...renderDiagnosticLines(diagnostic, colorized, width));\n const metadata = `${diagnostic.rule} [${diagnostic.category}]`;\n lines.push(...renderIndentedWrapped(metadata, colorized, width));\n if (diagnostic.help) lines.push(...renderIndentedWrapped(diagnostic.help, colorized, width));\n }\n return lines;\n}\n\ninterface RuleGroup {\n rule: string;\n category: string;\n severity: Severity;\n diagnostics: Diagnostic[];\n}\n\nfunction groupedDiagnostics(report: ScanReport): RuleGroup[] {\n const groups = new Map<string, RuleGroup>();\n const rank: Record<Severity, number> = { error: 2, warning: 1, suggestion: 0 };\n for (const diagnostic of report.diagnostics) {\n const existing = groups.get(diagnostic.rule);\n if (existing) {\n existing.diagnostics.push(diagnostic);\n if (rank[diagnostic.severity] > rank[existing.severity]) existing.severity = diagnostic.severity;\n } else {\n groups.set(diagnostic.rule, {\n rule: diagnostic.rule,\n category: diagnostic.category,\n severity: diagnostic.severity,\n diagnostics: [diagnostic],\n });\n }\n }\n return [...groups.values()].sort(\n (a, b) => rank[b.severity] - rank[a.severity] || b.diagnostics.length - a.diagnostics.length || a.rule.localeCompare(b.rule),\n );\n}\n\nfunction renderCompactDiagnostics(report: ScanReport, colorized: boolean, width: number): string[] {\n if (report.diagnostics.length === 0) {\n return [colorized ? paint(\"No issues found.\", ANSI.bold, ANSI.green) : \"No issues found.\"];\n }\n\n const groups = groupedDiagnostics(report);\n const shown = groups.slice(0, 3);\n const lines: string[] = [\"Top rules:\"];\n let shownFindings = 0;\n\n for (const group of shown) {\n shownFindings += group.diagnostics.length;\n const symbol = colorized ? severityPaint(group.severity, SYMBOLS[group.severity]) : SYMBOLS[group.severity];\n const countLabel = `${group.diagnostics.length} finding${group.diagnostics.length === 1 ? \"\" : \"s\"}`;\n const ruleLabel = colorized ? paint(group.rule, ANSI.bold) : group.rule;\n const metadata = colorized ? paint(`[${group.category}]`, ANSI.dim) : `[${group.category}]`;\n lines.push(`${symbol} ${ruleLabel} ${metadata} ${countLabel}`);\n\n for (const diagnostic of group.diagnostics.slice(0, 3)) {\n const location = `${diagnostic.file}:${diagnostic.location.line}:${diagnostic.location.column}`;\n const detail = `${location} ${diagnostic.message}`;\n const wrapped = wrapWords(detail, Math.max(16, width - 4));\n for (const line of wrapped) lines.push(colorized ? ` ${paint(line, ANSI.dim)}` : ` ${line}`);\n }\n if (group.diagnostics.length > 3) lines.push(` +${group.diagnostics.length - 3} more`);\n }\n\n const hiddenRules = groups.length - shown.length;\n const hiddenFindings = report.diagnostics.length - shownFindings;\n if (hiddenRules > 0 || hiddenFindings > 0) {\n lines.push(\"\");\n lines.push(`+${hiddenRules} more rules and ${hiddenFindings} more findings. Run react-luau-doctor --verbose for every finding.`);\n }\n return lines;\n}\n\nexport function renderTextReport(\n report: ScanReport,\n showScore = true,\n colorized = false,\n verbose = true,\n outputWidth = 120,\n): string {\n const width = terminalWidth(outputWidth);\n const lines = renderHeader(report, colorized);\n lines.push(\"\");\n lines.push(...(verbose ? renderVerboseDiagnostics(report, colorized, width) : renderCompactDiagnostics(report, colorized, width)));\n lines.push(\"\");\n lines.push(renderCounts(report, colorized));\n if (showScore) {\n const score = `Score: ${report.score}/100 (${scoreLabel(report.score)})`;\n lines.push(colorized ? scorePaint(report.score, score) : score);\n }\n if (report.notes && report.notes.length > 0) {\n lines.push(\"\");\n for (const note of report.notes) {\n const wrapped = wrapWords(`Note: ${note}`, width);\n for (const line of wrapped) lines.push(colorized ? paint(line, ANSI.dim) : line);\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction escapeWorkflowData(value: string): string {\n return value.replace(/%/g, \"%25\").replace(/\\r/g, \"%0D\").replace(/\\n/g, \"%0A\");\n}\n\nfunction escapeWorkflowProperty(value: string): string {\n return escapeWorkflowData(value).replace(/:/g, \"%3A\").replace(/,/g, \"%2C\");\n}\n\nexport function renderAnnotations(report: ScanReport): string {\n return report.diagnostics\n .map((diagnostic) => {\n const level = diagnostic.severity === \"error\" ? \"error\" : \"warning\";\n const properties = [\n `file=${escapeWorkflowProperty(diagnostic.file)}`,\n `line=${diagnostic.location.line}`,\n `col=${diagnostic.location.column}`,\n `endLine=${diagnostic.location.endLine}`,\n `endColumn=${diagnostic.location.endColumn}`,\n `title=${escapeWorkflowProperty(diagnostic.rule)}`,\n ].join(\",\");\n return `::${level} ${properties}::${escapeWorkflowData(diagnostic.message)}`;\n })\n .join(\"\\n\");\n}\n",
11
+ "import path from \"node:path\";\nimport { loadConfig } from \"./config\";\nimport { isSelectedLuauPath } from \"./files\";\nimport { createGitScopePlan, type GitScopePlan } from \"./git\";\nimport { createScanAnalysisSession, rebuildReport, scanPath, scoreDiagnostics, type ScanAnalysisSession } from \"./scanner\";\nimport type {\n Category,\n Diagnostic,\n DoctorConfig,\n ScanOptions,\n ScanProgress,\n ScanReport,\n ScanScope,\n Severity,\n} from \"./types\";\n\nexport interface ScopedScanOptions {\n scope: ScanScope;\n targetRoot?: string;\n base?: string;\n includeUntracked?: boolean;\n staged?: boolean;\n changedFilesFrom?: string;\n minSeverity?: Severity;\n categories?: Category[];\n config?: DoctorConfig;\n respectInlineDisables?: boolean;\n deadlineAt?: number;\n onProgress?: (progress: ScanProgress) => void;\n cache?: boolean;\n analysisSession?: ScanAnalysisSession;\n}\n\nfunction diagnosticFingerprint(diagnostic: Diagnostic): string {\n return `${diagnostic.file}\\0${diagnostic.rule}\\0${diagnostic.severity}\\0${diagnostic.message}`;\n}\n\nfunction introducedDiagnostics(current: Diagnostic[], baseline: Diagnostic[]): Diagnostic[] {\n const baselineCounts = new Map<string, number>();\n for (const diagnostic of baseline) {\n const fingerprint = diagnosticFingerprint(diagnostic);\n baselineCounts.set(fingerprint, (baselineCounts.get(fingerprint) ?? 0) + 1);\n }\n\n const introduced: Diagnostic[] = [];\n for (const diagnostic of current) {\n const fingerprint = diagnosticFingerprint(diagnostic);\n const remaining = baselineCounts.get(fingerprint) ?? 0;\n if (remaining > 0) baselineCounts.set(fingerprint, remaining - 1);\n else introduced.push(diagnostic);\n }\n return introduced;\n}\n\nfunction touchesChangedLines(diagnostic: Diagnostic, ranges: Array<{ start: number; end: number }>): boolean {\n const locations = [diagnostic.location, ...(diagnostic.highlights ?? [])];\n return locations.some((location) =>\n ranges.some((range) => location.endLine >= range.start && location.line <= range.end)\n );\n}\n\nfunction filterGitScopePlan(plan: GitScopePlan, config: DoctorConfig): GitScopePlan {\n const selected = (relativePath: string | undefined): boolean =>\n relativePath !== undefined && isSelectedLuauPath(relativePath, config);\n\n return {\n ...plan,\n changedFiles: plan.changedFiles.filter((file) => isSelectedLuauPath(file, config)),\n currentFiles: plan.currentFiles.filter((file) => selected(file.relativePath)),\n baselineFiles: plan.baselineFiles.filter((file) => selected(file.relativePath)),\n changedLines: new Map(\n [...plan.changedLines].filter(([file]) => isSelectedLuauPath(file, config)),\n ),\n };\n}\n\nfunction sharedScanOptions(options: ScopedScanOptions, projectRoot: string, phase?: string): ScanOptions & { analysisSession?: ScanAnalysisSession } {\n return {\n projectRoot,\n minSeverity: options.minSeverity,\n categories: options.categories,\n config: options.config,\n respectInlineDisables: options.respectInlineDisables,\n deadlineAt: options.deadlineAt,\n onProgress: options.onProgress,\n progressPhase: phase,\n cache: options.cache,\n analysisSession: options.analysisSession,\n };\n}\n\nexport async function scanProjectWithScope(projectRoot: string, options: ScopedScanOptions): Promise<ScanReport> {\n const targetRoot = path.resolve(options.targetRoot ?? projectRoot);\n const config = options.config ?? loadConfig(projectRoot);\n const configuredOptions = options.config ? options : { ...options, config };\n\n if (options.scope === \"full\" && !options.staged && !options.changedFilesFrom) {\n const report = await scanPath(targetRoot, sharedScanOptions(configuredOptions, projectRoot));\n return { ...report, scope: \"full\" };\n }\n\n const effectiveScope: Exclude<ScanScope, \"full\"> = options.staged\n ? options.scope === \"lines\"\n ? \"lines\"\n : \"files\"\n : options.scope === \"full\"\n ? \"files\"\n : options.scope;\n const scanOptions: ScopedScanOptions = effectiveScope === \"changed\"\n ? { ...configuredOptions, analysisSession: options.analysisSession ?? createScanAnalysisSession() }\n : configuredOptions;\n\n const plan = filterGitScopePlan(createGitScopePlan(targetRoot, {\n scope: effectiveScope,\n base: options.base,\n includeUntracked: options.includeUntracked,\n staged: options.staged,\n changedFilesFrom: options.changedFilesFrom,\n }, projectRoot), config);\n\n const current = await scanPath(targetRoot, {\n ...sharedScanOptions(scanOptions, projectRoot, effectiveScope === \"changed\" ? \"current\" : undefined),\n files: plan.currentFiles,\n });\n\n let diagnostics = current.diagnostics;\n let partial = current.partial;\n let skippedFiles = current.skippedFiles;\n\n if (effectiveScope === \"changed\") {\n const baseline = await scanPath(targetRoot, {\n ...sharedScanOptions(scanOptions, projectRoot, \"baseline\"),\n files: plan.baselineFiles,\n });\n const baselineSkipped = new Set(baseline.skippedFiles ?? []);\n const baselinePaths = new Set(plan.baselineFiles.map((file) => file.relativePath ?? \"\"));\n const comparableCurrent = current.diagnostics.filter(\n (diagnostic) => !baselinePaths.has(diagnostic.file) || !baselineSkipped.has(diagnostic.file),\n );\n diagnostics = introducedDiagnostics(comparableCurrent, baseline.diagnostics);\n partial = partial || Boolean(baseline.partial);\n skippedFiles = [...new Set([...(current.skippedFiles ?? []), ...(baseline.skippedFiles ?? [])])].sort();\n } else if (effectiveScope === \"lines\") {\n diagnostics = current.diagnostics.filter((diagnostic) =>\n touchesChangedLines(diagnostic, plan.changedLines.get(diagnostic.file) ?? []),\n );\n }\n\n return rebuildReport(current, diagnostics, {\n partial,\n skippedFiles,\n scope: options.staged ? \"staged\" : effectiveScope,\n base: plan.base,\n changedFiles: plan.changedFiles,\n });\n}\n\nfunction normalize(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nfunction prefixDiagnostic(diagnostic: Diagnostic, prefix: string): Diagnostic {\n if (!prefix || prefix === \".\") return diagnostic;\n return { ...diagnostic, file: normalize(path.posix.join(prefix, diagnostic.file)) };\n}\n\nexport function aggregateReports(root: string, reports: Array<{ projectRoot: string; report: ScanReport }>): ScanReport {\n const startedDuration = reports.reduce((total, entry) => total + entry.report.durationMs, 0);\n const diagnostics: Diagnostic[] = [];\n const skippedFiles: string[] = [];\n const changedFiles: string[] = [];\n const notes: string[] = [];\n const projects: string[] = [];\n let scannedFiles = 0;\n let candidateFiles = 0;\n let partial = false;\n\n for (const { projectRoot, report } of reports) {\n const prefix = normalize(path.relative(root, projectRoot));\n projects.push(prefix || \".\");\n scannedFiles += report.scannedFiles;\n candidateFiles += report.candidateFiles ?? 0;\n partial = partial || Boolean(report.partial);\n diagnostics.push(...report.diagnostics.map((diagnostic) => prefixDiagnostic(diagnostic, prefix)));\n skippedFiles.push(...(report.skippedFiles ?? []).map((file) => (prefix ? normalize(path.posix.join(prefix, file)) : file)));\n changedFiles.push(...(report.changedFiles ?? []).map((file) => (prefix ? normalize(path.posix.join(prefix, file)) : file)));\n notes.push(...(report.notes ?? []));\n }\n\n diagnostics.sort(\n (a, b) => a.file.localeCompare(b.file) || a.location.line - b.location.line || b.severity.localeCompare(a.severity),\n );\n const counts: Record<Severity, number> = { error: 0, warning: 0, suggestion: 0 };\n for (const diagnostic of diagnostics) counts[diagnostic.severity] += 1;\n\n const scopes = new Set(reports.map((entry) => entry.report.scope).filter(Boolean));\n const bases = new Set(reports.map((entry) => entry.report.base).filter(Boolean));\n\n return {\n schemaVersion: 1,\n root,\n scannedFiles,\n candidateFiles,\n durationMs: Math.round(startedDuration * 100) / 100,\n score: scoreDiagnostics(diagnostics, scannedFiles),\n counts,\n diagnostics,\n partial,\n skippedFiles: [...new Set(skippedFiles)].sort(),\n scope: scopes.size === 1 ? [...scopes][0] : undefined,\n base: bases.size === 1 ? [...bases][0] : undefined,\n changedFiles: [...new Set(changedFiles)].sort(),\n projects,\n notes: notes.length > 0 ? [...new Set(notes)] : undefined,\n };\n}\n",
12
+ "import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createRuleContext } from \"./ast/context\";\nimport { buildReactModel } from \"./ast/react-model\";\nimport {\n cacheHasSameFileSet,\n cachedEffectModules,\n cachedProjectModel,\n cachedReport,\n changedProjectFiles,\n knownReactFile,\n previousCachedReport,\n previousProjectModel,\n projectModelFeatureKey,\n materializeProjectCandidates,\n prepareProjectCache,\n recordReactFile,\n saveProjectCache,\n stableCacheKey,\n} from \"./cache\";\nimport { effectiveSeverity, loadConfig, ruleTags } from \"./config\";\nimport { discoverLuauFiles } from \"./files\";\nimport { createInlineSuppressionChecker } from \"./inline-disables\";\nimport { parseLuau } from \"./parser\";\nimport { buildProjectModel, type ProjectModelModuleCacheEntry } from \"./project-model\";\nimport { buildProjectSourceEffects, type CachedSourceEffectModule, type ProjectEffectParseCacheEntry } from \"./project-effects\";\nimport { rules } from \"./rules\";\nimport type {\n Diagnostic,\n DiagnosticInput,\n DoctorConfig,\n ScanFileInput,\n ScanOptions,\n ScanReport,\n Severity,\n SourceFile,\n} from \"./types\";\n\nexport const SEVERITY_RANK: Record<Severity, number> = {\n suggestion: 0,\n warning: 1,\n error: 2,\n};\n\nexport interface ScanAnalysisSession {\n projectModelModules: Map<string, ProjectModelModuleCacheEntry>;\n effectModules?: Record<string, CachedSourceEffectModule>;\n}\n\nexport function createScanAnalysisSession(): ScanAnalysisSession {\n return { projectModelModules: new Map() };\n}\n\ntype ScanRuntimeOptions = ScanOptions & { analysisSession?: ScanAnalysisSession };\n\nfunction diagnosticId(file: string, rule: string, startIndex: number, message: string): string {\n return crypto.createHash(\"sha256\").update(`${file}\\0${rule}\\0${startIndex}\\0${message}`).digest(\"hex\").slice(0, 16);\n}\n\nfunction nodeLocation(node: DiagnosticInput[\"node\"]): Diagnostic[\"location\"] {\n return {\n line: node.startPosition.row + 1,\n column: node.startPosition.column + 1,\n endLine: node.endPosition.row + 1,\n endColumn: node.endPosition.column + 1,\n };\n}\n\nfunction toDiagnostic(\n file: SourceFile,\n ruleId: string,\n category: Diagnostic[\"category\"],\n severity: Severity,\n input: DiagnosticInput,\n): Diagnostic {\n const node = input.node;\n const highlights = input.highlights?.map(nodeLocation);\n return {\n id: diagnosticId(file.relativePath, ruleId, node.startIndex, input.message),\n rule: ruleId,\n category,\n severity: input.severity ?? severity,\n message: input.message,\n help: input.help,\n file: file.relativePath,\n location: nodeLocation(node),\n highlights: highlights && highlights.length > 0 ? highlights : undefined,\n fixPreview: input.fixPreview,\n };\n}\n\nexport function scoreDiagnostics(diagnostics: Diagnostic[], scannedFiles: number): number {\n const weightedFindings = diagnostics.reduce((total, diagnostic) => {\n if (diagnostic.severity === \"error\") return total + 8;\n if (diagnostic.severity === \"warning\") return total + 3;\n return total + 1;\n }, 0);\n const penalty = (weightedFindings / Math.max(scannedFiles, 1)) * 20;\n return Math.max(0, Math.round(100 - Math.min(100, penalty)));\n}\n\nfunction countDiagnostics(diagnostics: Diagnostic[]): Record<Severity, number> {\n const counts: Record<Severity, number> = { error: 0, warning: 0, suggestion: 0 };\n for (const diagnostic of diagnostics) counts[diagnostic.severity] += 1;\n return counts;\n}\n\nexport function rebuildReport(\n report: ScanReport,\n diagnostics: Diagnostic[],\n metadata: Partial<Omit<ScanReport, \"schemaVersion\" | \"diagnostics\" | \"counts\" | \"score\">> = {},\n): ScanReport {\n const sorted = [...diagnostics].sort(\n (a, b) => a.file.localeCompare(b.file) || a.location.line - b.location.line || b.severity.localeCompare(a.severity),\n );\n const next = { ...report, ...metadata };\n return {\n ...next,\n schemaVersion: 1,\n diagnostics: sorted,\n counts: countDiagnostics(sorted),\n score: scoreDiagnostics(sorted, next.scannedFiles),\n };\n}\n\nfunction normalizeRelative(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nfunction transitiveAffectedFiles(\n changedFiles: string[],\n previousModules: Readonly<Record<string, CachedSourceEffectModule>>,\n currentModules: Readonly<Record<string, CachedSourceEffectModule>>,\n): Set<string> {\n const affected = new Set(changedFiles.map(normalizeRelative));\n const modules = new Map<string, { file: string; id: string }>();\n const reverse = new Map<string, Set<string>>();\n\n for (const source of [previousModules, currentModules]) {\n for (const [rawFile, module] of Object.entries(source)) {\n const file = normalizeRelative(rawFile);\n modules.set(file, { file, id: module.id });\n for (const dependency of module.importedModuleIds) {\n const importers = reverse.get(dependency) ?? new Set<string>();\n importers.add(file);\n reverse.set(dependency, importers);\n }\n }\n }\n\n const queue = [...affected].map((file) => modules.get(file)?.id ?? file.toLowerCase());\n const visitedIds = new Set(queue);\n while (queue.length > 0) {\n const moduleId = queue.shift()!;\n for (const importerFile of reverse.get(moduleId) ?? []) {\n if (!affected.has(importerFile)) affected.add(importerFile);\n const importerId = modules.get(importerFile)?.id;\n if (importerId && !visitedIds.has(importerId)) {\n visitedIds.add(importerId);\n queue.push(importerId);\n }\n }\n }\n return affected;\n}\n\nfunction candidateInputs(targetPath: string, projectRoot: string, config: DoctorConfig, options: ScanOptions): ScanFileInput[] {\n if (options.files) return options.files;\n const targetStat = fs.statSync(targetPath);\n return discoverLuauFiles(targetPath, config, projectRoot).map((absolutePath) => ({\n absolutePath,\n forceScan: targetStat.isFile(),\n }));\n}\n\nfunction projectInputs(root: string, config: DoctorConfig, scopedCandidates: ScanFileInput[]): ScanFileInput[] {\n const all = discoverLuauFiles(root, config).map((absolutePath) => ({ absolutePath } satisfies ScanFileInput));\n const overlays = new Map<string, ScanFileInput>();\n for (const candidate of scopedCandidates) {\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n overlays.set(relativePath, candidate);\n }\n\n const result: ScanFileInput[] = [];\n const used = new Set<string>();\n for (const candidate of all) {\n const relativePath = normalizeRelative(path.relative(root, candidate.absolutePath));\n result.push(overlays.get(relativePath) ?? candidate);\n used.add(relativePath);\n }\n for (const [relativePath, candidate] of overlays) {\n if (!used.has(relativePath)) result.push(candidate);\n }\n return result;\n}\n\nexport async function scanPath(target = \".\", options: ScanRuntimeOptions = {}): Promise<ScanReport> {\n const startedAt = performance.now();\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const targetPath = path.resolve(cwd, target);\n if (!fs.existsSync(targetPath)) throw new Error(`Scan path does not exist: ${target}`);\n const targetStat = fs.statSync(targetPath);\n const defaultRoot = targetStat.isFile() ? path.dirname(targetPath) : targetPath;\n const root = path.resolve(options.projectRoot ?? defaultRoot);\n const config: DoctorConfig = options.config ?? loadConfig(root);\n\n if (config.rules) {\n const knownRules = new Set(rules.map((rule) => rule.id));\n for (const ruleId of Object.keys(config.rules)) {\n if (!knownRules.has(ruleId)) throw new Error(`Unknown configured rule: ${ruleId}`);\n }\n }\n\n const candidates = candidateInputs(targetPath, root, config, options);\n const targetIsProjectRoot = path.resolve(targetPath) === path.resolve(root);\n const modelCandidates = options.files || !targetIsProjectRoot ? projectInputs(root, config, candidates) : candidates;\n const hasSourceOverlays = modelCandidates.some((candidate) => candidate.source !== undefined);\n const canPersistCache = !hasSourceOverlays;\n const phaseSuffix = options.progressPhase ? ` (${options.progressPhase})` : \"\";\n const phaseId = (phase: string): string => [options.progressPhase, phase].filter(Boolean).join(\":\");\n const progress = (phase: string, label: string, current: number, total: number, file?: string, partial?: boolean): void => {\n options.onProgress?.({ current, total, file, partial, phase: phaseId(phase), label: `${label}${phaseSuffix}` });\n };\n\n const cacheSession = prepareProjectCache(\n root,\n modelCandidates,\n options.cache ?? true,\n (current, total, file) => progress(\"index\", \"Indexing project\", current, total, file),\n );\n\n const deadlineAt = options.deadlineAt ?? (options.maxDurationMs !== undefined ? startedAt + options.maxDurationMs : undefined);\n const categorySet = options.categories && options.categories.length > 0 ? new Set(options.categories) : null;\n const respectInlineDisables = options.respectInlineDisables ?? config.respectInlineDisables ?? true;\n const minSeverity = options.minSeverity ?? \"suggestion\";\n const reportCacheKey = stableCacheKey({\n minSeverity,\n categories: options.categories ? [...options.categories].sort() : [],\n respectInlineDisables,\n rules: config.rules ?? {},\n ignoredTags: [...(config.ignoredTags ?? [])].sort(),\n });\n const canCacheWholeReport = canPersistCache && targetIsProjectRoot && options.files === undefined && deadlineAt === undefined;\n const previousReport = canCacheWholeReport ? previousCachedReport(cacheSession, reportCacheKey) : null;\n const previousProject = previousProjectModel(cacheSession);\n const previousEffectModules = options.analysisSession?.effectModules ?? cachedEffectModules(cacheSession);\n const changedFiles = changedProjectFiles(cacheSession);\n\n if (canCacheWholeReport) {\n const reportHit = cachedReport(cacheSession, reportCacheKey);\n if (reportHit) {\n progress(\"report-cache\", \"Loading cached results\", 1, 1);\n return {\n schemaVersion: 1,\n root,\n scannedFiles: reportHit.scannedFiles,\n candidateFiles: reportHit.candidateFiles,\n durationMs: Math.round((performance.now() - startedAt) * 100) / 100,\n score: scoreDiagnostics(reportHit.diagnostics, reportHit.scannedFiles),\n counts: countDiagnostics(reportHit.diagnostics),\n diagnostics: reportHit.diagnostics,\n partial: false,\n skippedFiles: [],\n };\n }\n }\n\n const projectParseCache = new Map<string, ProjectEffectParseCacheEntry>();\n const fileHashes = Object.fromEntries(Object.entries(cacheSession.files).map(([file, state]) => [file, state.hash]));\n const materializedCandidates = materializeProjectCandidates(cacheSession, modelCandidates);\n let project = cachedProjectModel(cacheSession);\n if (project && !options.analysisSession) {\n progress(\"project-cache\", \"Loading cached project analysis\", 1, 1);\n } else {\n // Changed-scope scans share per-module project summaries between the current\n // and baseline passes. Even when the aggregate current model is cached, one\n // module-summary pass seeds the in-memory session so the baseline only has to\n // re-analyze files whose Git contents differ.\n progress(\"model\", \"Building project model\", 0, 1);\n const rebuilt = buildProjectModel(root, materializedCandidates, {\n fileHashes,\n moduleCache: options.analysisSession?.projectModelModules,\n });\n if (project?.sourceEffects) rebuilt.sourceEffects = project.sourceEffects;\n project = rebuilt;\n progress(\"model\", \"Building project model\", 1, 1);\n }\n\n if (project.sourceEffects.size === 0) {\n const effectBuild = await buildProjectSourceEffects(\n root,\n materializedCandidates,\n projectParseCache,\n (effectProgress) => {\n if (effectProgress.phase === \"parse\") {\n progress(\"effects-parse\", \"Parsing effect sources\", effectProgress.current, effectProgress.total, effectProgress.file);\n } else if (effectProgress.phase === \"index-functions\") {\n progress(\"effects-index-functions\", \"Indexing effect functions\", effectProgress.current, effectProgress.total);\n } else if (effectProgress.phase === \"analyze-calls\") {\n progress(\"effects-analyze-calls\", \"Resolving effect calls\", effectProgress.current, effectProgress.total);\n } else if (effectProgress.phase === \"assemble-graph\") {\n progress(\"effects-assemble-graph\", \"Building effect graph\", effectProgress.current, effectProgress.total);\n } else if (effectProgress.phase === \"resolve\") {\n progress(\"effects-resolve\", \"Linking effect dependencies\", effectProgress.current, effectProgress.total);\n } else if (effectProgress.phase === \"propagate\") {\n progress(\"effects-propagate\", \"Propagating project effects\", effectProgress.current, effectProgress.total);\n } else {\n progress(\"effects-summarize\", \"Finalizing project effects\", effectProgress.current, effectProgress.total);\n }\n },\n fileHashes,\n previousEffectModules,\n );\n project.sourceEffects = effectBuild.effects;\n cacheSession.effectModules = effectBuild.cacheModules;\n } else if (!cacheSession.effectModules) {\n cacheSession.effectModules = previousEffectModules;\n }\n if (options.analysisSession) options.analysisSession.effectModules = cacheSession.effectModules ?? previousEffectModules;\n\n const diagnostics: Diagnostic[] = [];\n const skippedFiles: string[] = [];\n let scannedFiles = 0;\n let scanCandidates = candidates;\n let incrementalReuse = false;\n\n const currentEffectModules = cacheSession.effectModules ?? previousEffectModules;\n if (\n canCacheWholeReport &&\n previousReport &&\n previousProject &&\n cacheHasSameFileSet(cacheSession) &&\n projectModelFeatureKey(previousProject) === projectModelFeatureKey(project)\n ) {\n const affectedFiles = transitiveAffectedFiles(changedFiles, previousEffectModules, currentEffectModules);\n diagnostics.push(...previousReport.diagnostics.filter((diagnostic) => !affectedFiles.has(normalizeRelative(diagnostic.file))));\n scanCandidates = candidates.filter((candidate) => {\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n return affectedFiles.has(relativePath);\n });\n incrementalReuse = true;\n }\n\n let processedCandidates = 0;\n progress(\"scan\", incrementalReuse ? \"Scanning affected React files\" : \"Scanning React files\", 0, scanCandidates.length);\n\n for (let candidateIndex = 0; candidateIndex < scanCandidates.length; candidateIndex += 1) {\n const candidate = scanCandidates[candidateIndex];\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n\n if (deadlineAt !== undefined && performance.now() >= deadlineAt) {\n for (const remaining of scanCandidates.slice(candidateIndex)) {\n skippedFiles.push(normalizeRelative(remaining.relativePath ?? path.relative(root, remaining.absolutePath)));\n }\n progress(\"scan\", incrementalReuse ? \"Scanning affected React files\" : \"Scanning React files\", processedCandidates, scanCandidates.length, relativePath, true);\n break;\n }\n\n try {\n if (candidate.source === undefined && !fs.existsSync(candidate.absolutePath)) continue;\n const forceScan = candidate.forceScan ?? targetStat.isFile();\n const cached = projectParseCache.get(relativePath);\n if (!forceScan && !cached && !changedFiles.includes(relativePath) && knownReactFile(cacheSession, relativePath) === false) continue;\n\n const source = candidate.source ?? cached?.source ?? cacheSession.sources.get(relativePath) ?? fs.readFileSync(candidate.absolutePath, \"utf8\");\n const tree = cached && cached.source === source ? cached.tree : await parseLuau(source);\n const model = buildReactModel(tree.rootNode);\n recordReactFile(cacheSession, relativePath, model.isReactFile);\n if (!forceScan && !model.isReactFile) continue;\n\n scannedFiles += 1;\n const file: SourceFile = {\n absolutePath: candidate.absolutePath,\n relativePath,\n source,\n tree,\n root: tree.rootNode,\n model,\n project,\n };\n const context = createRuleContext(file);\n const isSuppressed = respectInlineDisables ? createInlineSuppressionChecker(source) : () => false;\n\n for (const rule of rules) {\n if (categorySet && !categorySet.has(rule.category)) continue;\n const severity = effectiveSeverity(rule.severity, rule.id, config, ruleTags(rule));\n if (!severity) continue;\n const findings = rule.run(context);\n for (const finding of findings) {\n const configuredSeverity = config.rules?.[rule.id];\n const diagnostic = toDiagnostic(file, rule.id, rule.category, severity, {\n ...finding,\n severity: configuredSeverity && configuredSeverity !== \"off\" ? severity : finding.severity,\n });\n if (SEVERITY_RANK[diagnostic.severity] < SEVERITY_RANK[minSeverity]) continue;\n if (isSuppressed(diagnostic.rule, diagnostic.location.line)) continue;\n diagnostics.push(diagnostic);\n }\n if (rule.id === \"react-luau/parse-error\" && findings.length > 0) break;\n }\n } finally {\n processedCandidates = candidateIndex + 1;\n progress(\"scan\", incrementalReuse ? \"Scanning affected React files\" : \"Scanning React files\", processedCandidates, scanCandidates.length, relativePath);\n }\n }\n\n if (incrementalReuse) {\n scannedFiles = Object.values(cacheSession.files).filter((state) => state.isReactFile === true).length;\n }\n\n diagnostics.sort(\n (a, b) => a.file.localeCompare(b.file) || a.location.line - b.location.line || b.severity.localeCompare(a.severity),\n );\n\n const report: ScanReport = {\n schemaVersion: 1,\n root,\n scannedFiles,\n candidateFiles: candidates.length,\n durationMs: Math.round((performance.now() - startedAt) * 100) / 100,\n score: scoreDiagnostics(diagnostics, scannedFiles),\n counts: countDiagnostics(diagnostics),\n diagnostics,\n partial: skippedFiles.length > 0,\n skippedFiles,\n };\n\n if (canPersistCache) saveProjectCache(\n cacheSession,\n project,\n cacheSession.effectModules ?? cachedEffectModules(cacheSession),\n canCacheWholeReport && !report.partial ? reportCacheKey : undefined,\n canCacheWholeReport && !report.partial\n ? { scannedFiles: report.scannedFiles, candidateFiles: report.candidateFiles ?? candidates.length, diagnostics: report.diagnostics }\n : undefined,\n );\n\n return report;\n}\n",
13
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\n\nexport function* walk(node: SyntaxNode): Iterable<SyntaxNode> {\n yield node;\n for (const child of node.namedChildren) {\n yield* walk(child);\n }\n}\n\nexport function ancestors(node: SyntaxNode): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n let current = node.parent;\n while (current) {\n result.push(current);\n current = current.parent;\n }\n return result;\n}\n\nexport function nearestAncestor(node: SyntaxNode, predicate: (candidate: SyntaxNode) => boolean): SyntaxNode | null {\n let current = node.parent;\n while (current) {\n if (predicate(current)) return current;\n current = current.parent;\n }\n return null;\n}\n\nexport function descendantsOfType(node: SyntaxNode, type: string): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n for (const candidate of walk(node)) {\n if (candidate.type === type) result.push(candidate);\n }\n return result;\n}\n\nexport function rootIdentifier(text: string): string | null {\n const match = text.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/);\n return match?.[1] ?? null;\n}\n\nexport function normalizeExpressionText(text: string): string {\n return text.replace(/\\s+/g, \"\").replace(/^\\((.*)\\)$/s, \"$1\");\n}\n\nexport function nodeKey(node: SyntaxNode): string {\n return `${node.type}:${node.startIndex}:${node.endIndex}`;\n}\n\nexport function sameNode(left: SyntaxNode | null | undefined, right: SyntaxNode | null | undefined): boolean {\n return Boolean(left && right && nodeKey(left) === nodeKey(right));\n}\n",
14
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { FunctionInfo, RuleContext, SourceFile } from \"../types\";\nimport { nodeKey, normalizeExpressionText, walk } from \"./walk\";\n\nexport function createRuleContext(file: SourceFile): RuleContext {\n // Most rules traverse the same AST repeatedly. Materialize the root traversal\n // once and memoize subtree traversals so rule execution shares that work.\n const allNodes = [...walk(file.root)];\n const calls = allNodes.filter((node) => node.type === \"function_call\");\n const traversalCache = new Map<string, SyntaxNode[]>([[nodeKey(file.root), allNodes]]);\n const callPathCache = new Map<string, string | null>();\n const resolvedCallPathCache = new Map<string, string>();\n const nearestFunctionCache = new Map<string, FunctionInfo | null>();\n const componentCache = new Map<string, FunctionInfo | null>();\n\n const traversal = (node: SyntaxNode): SyntaxNode[] => {\n const key = nodeKey(node);\n const existing = traversalCache.get(key);\n if (existing) return existing;\n const result = [...walk(node)];\n traversalCache.set(key, result);\n return result;\n };\n\n const getCallPath = (node: SyntaxNode): string | null => {\n if (node.type !== \"function_call\") return null;\n const key = nodeKey(node);\n if (callPathCache.has(key)) return callPathCache.get(key) ?? null;\n const name = node.childForFieldName(\"name\");\n const result = name ? normalizeExpressionText(name.text) : null;\n callPathCache.set(key, result);\n return result;\n };\n\n const resolveCallPath = (value: string): string => {\n const normalized = normalizeExpressionText(value);\n const cached = resolvedCallPathCache.get(normalized);\n if (cached) return cached;\n\n const direct = file.model.aliases.get(normalized);\n if (direct) {\n resolvedCallPathCache.set(normalized, direct);\n return direct;\n }\n\n const namespaceMatch = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.(.+)$/);\n let result = normalized;\n if (namespaceMatch && file.model.reactNamespaces.has(namespaceMatch[1])) {\n result = `React.${namespaceMatch[2]}`;\n } else if (namespaceMatch && file.model.reactRobloxNamespaces.has(namespaceMatch[1])) {\n result = `ReactRoblox.${namespaceMatch[2]}`;\n }\n resolvedCallPathCache.set(normalized, result);\n return result;\n };\n\n const callArguments = (node: SyntaxNode): SyntaxNode[] => {\n return node.childForFieldName(\"arguments\")?.namedChildren ?? [];\n };\n\n const nearestFunction = (node: SyntaxNode): FunctionInfo | null => {\n const key = nodeKey(node);\n if (nearestFunctionCache.has(key)) return nearestFunctionCache.get(key) ?? null;\n let current = node.parent;\n while (current) {\n const info = file.model.functionByNode.get(nodeKey(current));\n if (info) {\n nearestFunctionCache.set(key, info);\n return info;\n }\n current = current.parent;\n }\n nearestFunctionCache.set(key, null);\n return null;\n };\n\n const containingComponent = (node: SyntaxNode): FunctionInfo | null => {\n const key = nodeKey(node);\n if (componentCache.has(key)) return componentCache.get(key) ?? null;\n let current = node.parent;\n while (current) {\n const info = file.model.functionByNode.get(nodeKey(current));\n if (info?.isComponent) {\n componentCache.set(key, info);\n return info;\n }\n current = current.parent;\n }\n componentCache.set(key, null);\n return null;\n };\n\n const isDirectlyExecutedInFunction = (node: SyntaxNode, fn: FunctionInfo): boolean => nearestFunction(node) === fn;\n\n return {\n ...file,\n findCalls: () => calls,\n getCallPath,\n resolveCallPath,\n callArguments,\n nearestFunction,\n containingComponent,\n isDirectlyExecutedInFunction,\n walk: (node = file.root) => traversal(node),\n };\n}\n",
15
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { FunctionInfo, ReactModel, StateBinding } from \"../types\";\nimport { nodeKey, normalizeExpressionText, sameNode, walk } from \"./walk\";\n\nconst REACT_HOOKS = new Set([\n \"useState\",\n \"useEffect\",\n \"useLayoutEffect\",\n \"useMemo\",\n \"useCallback\",\n \"useContext\",\n \"useReducer\",\n \"useRef\",\n \"useImperativeHandle\",\n \"useBinding\",\n]);\n\nconst REACT_MEMBERS = new Set([...REACT_HOOKS, \"createElement\", \"createContext\", \"memo\", \"joinBindings\"]);\nconst STABLE_CUSTOM_HOOK_RETURN = /^(?:set[A-Z0-9_]|dispatch$|send$|emit$|fire$)/i;\nconst INSTANCE_FACTORY_MEMBERS = new Set([\n \"Clone\",\n \"FindFirstAncestor\",\n \"FindFirstAncestorOfClass\",\n \"FindFirstAncestorWhichIsA\",\n \"FindFirstChild\",\n \"FindFirstChildOfClass\",\n \"FindFirstChildWhichIsA\",\n \"GetButton\",\n \"GetMouse\",\n \"GetService\",\n \"WaitForChild\",\n]);\nconst STABLE_ENGINE_FACTORY_MEMBERS = new Set([\"GetMouse\", \"GetService\"]);\n\nfunction identifiersFromParameters(node: SyntaxNode | null): string[] {\n if (!node) return [];\n const result: string[] = [];\n for (const child of walk(node)) {\n if (child.type !== \"identifier\") continue;\n const parentType = child.parent?.type;\n if (parentType === \"parameters\" || parentType === \"parameter\" || parentType === \"typed_identifier\") {\n result.push(child.text);\n }\n }\n return [...new Set(result)];\n}\n\nfunction getFunctionName(node: SyntaxNode): string | null {\n if (node.type === \"function_declaration\") {\n return node.childForFieldName(\"name\")?.text ?? null;\n }\n\n if (node.type !== \"function_definition\") return null;\n let owner = node.parent;\n while (owner && owner.type !== \"variable_declaration\") {\n if (owner.type === \"function_definition\" || owner.type === \"function_declaration\") return null;\n owner = owner.parent;\n }\n if (!owner) return null;\n\n const prefix = owner.text.slice(0, Math.max(0, node.startIndex - owner.startIndex));\n const directMatch = prefix.match(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*$/s);\n if (directMatch) return directMatch[1];\n\n const wrappedMatch = prefix.match(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*[A-Za-z_][A-Za-z0-9_.]*\\s*\\(\\s*$/s);\n return wrappedMatch?.[1] ?? null;\n}\n\nfunction requireTargetContainsModule(target: string, moduleName: string): boolean {\n return (target.match(/[A-Za-z_][A-Za-z0-9_]*/g) ?? [])\n .some((token) => token.toLowerCase() === moduleName.toLowerCase());\n}\n\nfunction resolvePath(\n rawPath: string,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): string {\n const normalized = normalizeExpressionText(rawPath);\n const direct = aliases.get(normalized);\n if (direct) return direct;\n\n const namespaceMatch = normalized.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.(.+)$/);\n if (namespaceMatch && reactNamespaces.has(namespaceMatch[1])) return `React.${namespaceMatch[2]}`;\n if (namespaceMatch && reactRobloxNamespaces.has(namespaceMatch[1])) return `ReactRoblox.${namespaceMatch[2]}`;\n return normalized;\n}\n\nfunction directCalls(node: SyntaxNode): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n const pending = [...node.namedChildren];\n while (pending.length > 0) {\n const child = pending.pop()!;\n if (child.type === \"function_definition\" || child.type === \"function_declaration\") continue;\n if (child.type === \"function_call\") result.push(child);\n pending.push(...child.namedChildren);\n }\n return result;\n}\n\nfunction hasDirectCreateElementCall(\n node: SyntaxNode,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n return directCalls(node).some((call) => {\n const name = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(name, aliases, reactNamespaces, reactRobloxNamespaces);\n return path === \"React.createElement\" || path === \"ReactRoblox.createPortal\";\n });\n}\n\nfunction hasDirectHookCall(\n node: SyntaxNode,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n return directCalls(node).some((call) => {\n const name = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(name, aliases, reactNamespaces, reactRobloxNamespaces);\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return /^use[A-Z0-9_]/.test(final);\n });\n}\n\nfunction isMemoWrappedFunction(\n node: SyntaxNode,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n): boolean {\n const argumentsNode = node.parent;\n const call = argumentsNode?.type === \"arguments\" ? argumentsNode.parent : null;\n if (!call || call.type !== \"function_call\") return false;\n const name = call.childForFieldName(\"name\")?.text ?? \"\";\n return resolvePath(name, aliases, reactNamespaces, new Set()) === \"React.memo\";\n}\n\nfunction isModuleReturnedFunction(node: SyntaxNode): boolean {\n const expressionList = node.parent;\n const returnStatement = expressionList?.type === \"expression_list\" ? expressionList.parent : null;\n if (!returnStatement || returnStatement.type !== \"return_statement\") return false;\n let current = returnStatement.parent;\n while (current) {\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return false;\n current = current.parent;\n }\n return true;\n}\n\nfunction collectDirectLocals(body: SyntaxNode | null): Set<string> {\n const locals = new Set<string>();\n if (!body) return locals;\n\n for (const child of body.namedChildren) {\n if (child.type === \"variable_declaration\") {\n const beforeEquals = child.text.split(\"=\")[0] ?? \"\";\n const localPart = beforeEquals.replace(/^\\s*local\\s+/, \"\");\n for (const piece of localPart.split(\",\")) {\n const match = piece.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/);\n if (match) locals.add(match[1]);\n }\n } else if (child.type === \"function_declaration\") {\n const name = child.childForFieldName(\"name\")?.text;\n if (name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) locals.add(name);\n }\n }\n\n return locals;\n}\n\nfunction nearestFunctionInfo(node: SyntaxNode, functionByNode: Map<string, FunctionInfo>): FunctionInfo | null {\n let current = node.parent;\n while (current) {\n const info = functionByNode.get(nodeKey(current));\n if (info) return info;\n current = current.parent;\n }\n return null;\n}\n\nfunction declarationCall(node: SyntaxNode): SyntaxNode | null {\n if (node.type !== \"variable_declaration\") return null;\n for (const child of walk(node)) {\n if (child.type === \"function_call\") return child;\n if (!sameNode(child, node) && (child.type === \"function_definition\" || child.type === \"function_declaration\")) return null;\n }\n return null;\n}\n\nfunction declarationNames(node: SyntaxNode): string[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variableList = assignment?.namedChildren.find((child) => child.type === \"variable_list\");\n return variableList?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [];\n}\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return expressionList?.namedChildren ?? [];\n}\n\nfunction isSyntacticallyStableInitializer(node: SyntaxNode | undefined): boolean {\n if (!node) return false;\n return [\"nil\", \"true\", \"false\", \"number\", \"string\", \"string_content\"].includes(node.type)\n || /^(?:nil|true|false|-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)$/i.test(node.text.trim());\n}\n\n\nfunction finalCallMember(path: string): string {\n return path.split(/[.:]/).at(-1) ?? path;\n}\n\nfunction expressionCreatesInstance(\n node: SyntaxNode | undefined,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n if (!node) return false;\n const text = node.text.trim();\n if (/^(?:workspace|game|script)(?:\\.|:|$)/.test(text)) return true;\n\n for (const candidate of walk(node)) {\n if (candidate.type !== \"function_call\") continue;\n const rawPath = candidate.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n if (path === \"Instance.new\" || INSTANCE_FACTORY_MEMBERS.has(finalCallMember(path))) return true;\n }\n return false;\n}\n\nfunction expressionIsStableEngineObject(\n node: SyntaxNode | undefined,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n if (!node) return false;\n const calls = [...walk(node)].filter((candidate) => candidate.type === \"function_call\");\n if (calls.length !== 1) return false;\n const rawPath = calls[0].childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n return STABLE_ENGINE_FACTORY_MEMBERS.has(finalCallMember(path));\n}\n\nfunction memoReturnsInstance(\n callback: SyntaxNode | undefined,\n aliases: Map<string, string>,\n reactNamespaces: Set<string>,\n reactRobloxNamespaces: Set<string>,\n): boolean {\n if (!callback || callback.type !== \"function_definition\") return false;\n for (const candidate of walk(callback)) {\n if (candidate.type !== \"return_statement\") continue;\n if (expressionCreatesInstance(candidate, aliases, reactNamespaces, reactRobloxNamespaces)) return true;\n }\n return false;\n}\n\nfunction isEmptyDependencyTable(node: SyntaxNode | undefined): boolean {\n return Boolean(node?.type === \"table_constructor\" && node.namedChildren.every((child) => child.type !== \"field\"));\n}\n\nexport function buildReactModel(root: SyntaxNode): ReactModel {\n const reactNamespaces = new Set<string>();\n const reactRobloxNamespaces = new Set<string>();\n const aliases = new Map<string, string>();\n const stateSetters = new Map<string, string>();\n const stateValues = new Map<string, string>();\n const stateBindings: StateBinding[] = [];\n const refVariables = new Set<string>();\n const bindingSetters = new Set<string>();\n const stableVariables = new Set<string>();\n const refVariablesByFunction = new Map<string, Set<string>>();\n const stableVariablesByFunction = new Map<string, Set<string>>();\n const externalMutableVariablesByFunction = new Map<string, Set<string>>();\n const instanceVariablesByFunction = new Map<string, Set<string>>();\n\n const declarations = [...walk(root)].filter((node) => node.type === \"variable_declaration\");\n let isReactFile = false;\n\n for (const declaration of declarations) {\n const text = declaration.text;\n const requireMatch = text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!requireMatch) continue;\n const [, localName, target] = requireMatch;\n if (requireTargetContainsModule(target, \"ReactRoblox\")) {\n reactRobloxNamespaces.add(localName);\n isReactFile = true;\n } else if (requireTargetContainsModule(target, \"React\")) {\n reactNamespaces.add(localName);\n isReactFile = true;\n }\n }\n\n for (const node of walk(root)) {\n if (node.type !== \"function_call\") continue;\n const rawPath = normalizeExpressionText(node.childForFieldName(\"name\")?.text ?? \"\");\n const memberMatch = rawPath.match(/^([A-Za-z_][A-Za-z0-9_]*)\\.([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!memberMatch) continue;\n const [, namespace, member] = memberMatch;\n if (namespace === \"React\" && REACT_MEMBERS.has(member)) {\n reactNamespaces.add(namespace);\n isReactFile = true;\n } else if (namespace === \"ReactRoblox\" && [\"createRoot\", \"createPortal\"].includes(member)) {\n reactRobloxNamespaces.add(namespace);\n isReactFile = true;\n }\n }\n\n for (const declaration of declarations) {\n const text = declaration.text;\n const aliasMatch = text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*([A-Za-z_][A-Za-z0-9_]*)\\.([A-Za-z_][A-Za-z0-9_]*)\\s*$/s);\n if (!aliasMatch) continue;\n const [, localName, namespace, member] = aliasMatch;\n if (reactNamespaces.has(namespace) && REACT_MEMBERS.has(member)) aliases.set(localName, `React.${member}`);\n if (reactRobloxNamespaces.has(namespace) && [\"createRoot\", \"createPortal\"].includes(member)) {\n aliases.set(localName, `ReactRoblox.${member}`);\n }\n }\n\n const functions: FunctionInfo[] = [];\n const functionByNode = new Map<string, FunctionInfo>();\n\n for (const node of walk(root)) {\n if (node.type !== \"function_declaration\" && node.type !== \"function_definition\") continue;\n const name = getFunctionName(node);\n const body = node.childForFieldName(\"body\");\n const parameters = identifiersFromParameters(node.childForFieldName(\"parameters\"));\n const info: FunctionInfo = {\n node,\n body,\n name,\n parameters,\n isHook: Boolean(isReactFile && name && /^use[A-Z0-9_]/.test(name)),\n isComponent: false,\n };\n functions.push(info);\n functionByNode.set(nodeKey(node), info);\n }\n\n const functionsBySimpleName = new Map<string, FunctionInfo[]>();\n for (const info of functions) {\n if (!info.name || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(info.name)) continue;\n const existing = functionsBySimpleName.get(info.name) ?? [];\n existing.push(info);\n functionsBySimpleName.set(info.name, existing);\n }\n\n for (const info of functions) {\n if (!isReactFile || !info.body || info.isHook) continue;\n const simplePascalName = Boolean(info.name && /^[A-Z][A-Za-z0-9_]*$/.test(info.name));\n const hasHooks = hasDirectHookCall(info.body, aliases, reactNamespaces, reactRobloxNamespaces);\n const renders = hasDirectCreateElementCall(info.body, aliases, reactNamespaces, reactRobloxNamespaces);\n if (hasHooks || isMemoWrappedFunction(info.node, aliases, reactNamespaces) || (simplePascalName && renders)) {\n info.isComponent = true;\n } else if (!info.name && isModuleReturnedFunction(info.node) && hasHooks) {\n info.isComponent = true;\n }\n }\n\n for (const call of walk(root)) {\n if (call.type !== \"function_call\") continue;\n const rawPath = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n if (path !== \"React.createElement\") continue;\n const element = call.childForFieldName(\"arguments\")?.namedChildren[0]?.text.trim() ?? \"\";\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(element)) continue;\n for (const info of functionsBySimpleName.get(element) ?? []) info.isComponent = true;\n }\n\n const addScopedVariable = (map: Map<string, Set<string>>, owner: FunctionInfo | null, name: string): void => {\n if (!owner) return;\n const key = nodeKey(owner.node);\n const names = map.get(key) ?? new Set<string>();\n names.add(name);\n map.set(key, names);\n };\n\n for (const declaration of declarations) {\n const names = declarationNames(declaration);\n const expressions = declarationExpressions(declaration);\n const owner = nearestFunctionInfo(declaration, functionByNode);\n\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (isSyntacticallyStableInitializer(expression) || expressionIsStableEngineObject(expression, aliases, reactNamespaces, reactRobloxNamespaces)) {\n stableVariables.add(names[index]);\n addScopedVariable(stableVariablesByFunction, owner, names[index]);\n }\n if (expressionCreatesInstance(expression, aliases, reactNamespaces, reactRobloxNamespaces)) {\n addScopedVariable(externalMutableVariablesByFunction, owner, names[index]);\n addScopedVariable(instanceVariablesByFunction, owner, names[index]);\n }\n }\n\n const call = declarationCall(declaration);\n if (!call) continue;\n const rawPath = call.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n const args = call.childForFieldName(\"arguments\")?.namedChildren ?? [];\n\n if (path === \"React.joinBindings\" && names.length >= 1) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n addScopedVariable(externalMutableVariablesByFunction, owner, names[0]);\n } else if (path === \"React.useState\" && names.length >= 2) {\n const [valueName, setterName] = names;\n stateSetters.set(setterName, valueName);\n stateValues.set(valueName, setterName);\n stableVariables.add(setterName);\n addScopedVariable(stableVariablesByFunction, owner, setterName);\n stateBindings.push({\n valueName,\n setterName,\n declaration,\n call,\n initializer: args[0] ?? null,\n owner,\n });\n } else if (path === \"React.useReducer\" && names.length >= 2) {\n stableVariables.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n } else if (path === \"React.useBinding\" && names.length >= 1) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n if (names.length >= 2) {\n stableVariables.add(names[1]);\n bindingSetters.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n }\n } else if (path === \"React.useMemo\" && names.length >= 1) {\n if (isEmptyDependencyTable(args[1])) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n }\n if (memoReturnsInstance(args[0], aliases, reactNamespaces, reactRobloxNamespaces)) {\n addScopedVariable(externalMutableVariablesByFunction, owner, names[0]);\n addScopedVariable(instanceVariablesByFunction, owner, names[0]);\n }\n } else if (path === \"React.useCallback\" && names.length >= 1 && isEmptyDependencyTable(args[1])) {\n // Empty-dependency callbacks keep a stable identity. Their own stale captures are\n // diagnosed on the useCallback dependency table instead of cascading into every\n // effect that consumes the callback.\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n } else if (path === \"React.useRef\" && names.length >= 1) {\n stableVariables.add(names[0]);\n refVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n addScopedVariable(refVariablesByFunction, owner, names[0]);\n } else {\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n if (/^use[A-Z0-9_]/.test(final)) {\n for (const name of names.slice(1)) {\n if (!STABLE_CUSTOM_HOOK_RETURN.test(name)) continue;\n stableVariables.add(name);\n addScopedVariable(stableVariablesByFunction, owner, name);\n }\n }\n }\n }\n\n // React state/binding hooks can be assigned into previously declared locals.\n // The setter/Binding contracts are still stable even when the declaration and hook\n // call are split across statements. Rules-of-hooks separately reports conditional calls.\n for (const assignment of walk(root)) {\n if (assignment.type !== \"assignment_statement\" || assignment.parent?.type === \"variable_declaration\") continue;\n const owner = nearestFunctionInfo(assignment, functionByNode);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n const variableList = assignment.namedChildren.find((child) => child.type === \"variable_list\");\n const expressionList = assignment.namedChildren.find((child) => child.type === \"expression_list\");\n const names = variableList?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [];\n const expression = expressionList?.namedChildren[0];\n if (!expression || expression.type !== \"function_call\") continue;\n const rawPath = expression.childForFieldName(\"name\")?.text ?? \"\";\n const path = resolvePath(rawPath, aliases, reactNamespaces, reactRobloxNamespaces);\n\n if (path === \"React.useState\" && names.length >= 2) {\n stableVariables.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n } else if (path === \"React.useBinding\" && names.length >= 1) {\n stableVariables.add(names[0]);\n addScopedVariable(stableVariablesByFunction, owner, names[0]);\n addScopedVariable(externalMutableVariablesByFunction, owner, names[0]);\n if (names.length >= 2) {\n stableVariables.add(names[1]);\n bindingSetters.add(names[1]);\n addScopedVariable(stableVariablesByFunction, owner, names[1]);\n }\n }\n }\n\n // Binding-like values are stable mutable handles. Custom React-Luau animation hooks\n // often return bindings without the analyzer knowing the hook implementation. Infer\n // them from Binding-only APIs instead of requiring them in dependency arrays.\n for (const call of walk(root)) {\n if (call.type !== \"function_call\") continue;\n const rawPath = normalizeExpressionText(call.childForFieldName(\"name\")?.text ?? \"\");\n const match = rawPath.match(/^([A-Za-z_][A-Za-z0-9_]*):(?:getValue|map)$/);\n if (!match) continue;\n const owner = nearestFunctionInfo(call, functionByNode);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n stableVariables.add(match[1]);\n addScopedVariable(stableVariablesByFunction, owner, match[1]);\n addScopedVariable(externalMutableVariablesByFunction, owner, match[1]);\n }\n\n const componentLocals = new Map<string, Set<string>>();\n for (const info of functions) {\n if (!info.isComponent && !info.isHook) continue;\n const names = collectDirectLocals(info.body);\n for (const parameter of info.parameters) names.add(parameter);\n if (info.name?.includes(\":\")) names.add(\"self\");\n componentLocals.set(nodeKey(info.node), names);\n }\n\n return {\n isReactFile,\n reactNamespaces,\n reactRobloxNamespaces,\n aliases,\n stateSetters,\n stateValues,\n stateBindings,\n refVariables,\n bindingSetters,\n stableVariables,\n refVariablesByFunction,\n stableVariablesByFunction,\n externalMutableVariablesByFunction,\n instanceVariablesByFunction,\n componentLocals,\n functions,\n functionByNode,\n };\n}\n",
16
+ "import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport packageJson from \"../package.json\";\nimport type { CachedSourceEffectModule } from \"./project-effects\";\nimport type {\n Diagnostic,\n ProjectModel,\n ScanFileInput,\n SourceEffectModuleSummary,\n} from \"./types\";\n\nconst CACHE_SCHEMA_VERSION = 1;\nconst MAX_CACHED_REPORTS = 8;\n\ninterface CachedFileState {\n size?: number;\n mtimeMs?: number;\n ctimeMs?: number;\n hash: string;\n isReactFile?: boolean;\n}\n\ninterface SerializedSourceEffectSummary {\n effectfulMembers: string[];\n effectfulExport: boolean;\n instanceFactories: string[];\n}\n\ninterface SerializedProjectModel {\n memoizedModules: Array<[string, \"shallow\" | \"custom\"]>;\n bindingCandidateHooks: Array<[string, ProjectModel[\"bindingCandidateHooks\"] extends Map<string, infer V> ? V : never]>;\n externalCallbackModules: Array<[string, ProjectModel[\"externalCallbackModules\"] extends Map<string, infer V> ? V : never]>;\n bindingApiAlternatives: Array<[string, string]>;\n bindingCompatibleComponentProps: Array<[string, string[]]>;\n staticIterationTables: Array<[string, string[]]>;\n conditionalHookModes: Array<[string, ProjectModel[\"conditionalHookModes\"] extends Map<string, infer V> ? V : never]>;\n sourceEffects: Array<[string, SerializedSourceEffectSummary]>;\n}\n\nexport interface CachedReportData {\n scannedFiles: number;\n candidateFiles: number;\n diagnostics: Diagnostic[];\n}\n\ninterface CachedReportEntry extends CachedReportData {\n lastUsedAt: number;\n}\n\ninterface ProjectCachePayload {\n schemaVersion: number;\n analyzerVersion: string;\n root: string;\n fingerprint: string;\n files: Record<string, CachedFileState>;\n projectModel?: SerializedProjectModel;\n effectModules?: Record<string, CachedSourceEffectModule>;\n reports?: Record<string, CachedReportEntry>;\n lastUsedAt: number;\n}\n\nexport interface ProjectCacheSession {\n enabled: boolean;\n root: string;\n filename: string | null;\n fingerprint: string;\n files: Record<string, CachedFileState>;\n sources: Map<string, string>;\n previous: ProjectCachePayload | null;\n exact: boolean;\n effectModules?: Record<string, CachedSourceEffectModule>;\n}\n\nfunction normalizeRelative(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nfunction hashText(value: string): string {\n return crypto.createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction stableValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(stableValue);\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, stableValue(entry)]),\n );\n }\n return value;\n}\n\nexport function stableCacheKey(value: unknown): string {\n return hashText(JSON.stringify(stableValue(value))).slice(0, 24);\n}\n\nexport function cacheBaseDirectory(): string {\n if (process.env.REACT_LUAU_DOCTOR_CACHE_DIR) return path.resolve(process.env.REACT_LUAU_DOCTOR_CACHE_DIR);\n if (process.platform === \"win32\") {\n const base = process.env.LOCALAPPDATA ?? path.join(os.homedir(), \"AppData\", \"Local\");\n return path.join(base, \"react-luau-doctor\", \"Cache\");\n }\n if (process.platform === \"darwin\") return path.join(os.homedir(), \"Library\", \"Caches\", \"react-luau-doctor\");\n return path.join(process.env.XDG_CACHE_HOME ?? path.join(os.homedir(), \".cache\"), \"react-luau-doctor\");\n}\n\nfunction projectCacheFilename(root: string): string {\n const canonical = process.platform === \"win32\" ? path.resolve(root).toLowerCase() : path.resolve(root);\n return path.join(cacheBaseDirectory(), `project-${hashText(canonical).slice(0, 24)}.json`);\n}\n\nfunction readPayload(filename: string, root: string): ProjectCachePayload | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(filename, \"utf8\")) as ProjectCachePayload;\n if (\n parsed.schemaVersion !== CACHE_SCHEMA_VERSION ||\n parsed.analyzerVersion !== packageJson.version ||\n path.resolve(parsed.root) !== path.resolve(root) ||\n !parsed.files ||\n typeof parsed.fingerprint !== \"string\"\n ) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writePayload(filename: string, payload: ProjectCachePayload): void {\n try {\n fs.mkdirSync(path.dirname(filename), { recursive: true });\n const temporary = `${filename}.${process.pid}.${Date.now()}.tmp`;\n fs.writeFileSync(temporary, JSON.stringify(payload));\n fs.renameSync(temporary, filename);\n } catch {\n // Caching is an optimization. A read-only or unavailable cache directory must\n // never prevent the analyzer from running.\n }\n}\n\nfunction fileStateMatches(previous: CachedFileState | undefined, stat: fs.Stats): boolean {\n return Boolean(\n previous &&\n previous.size === stat.size &&\n previous.mtimeMs === stat.mtimeMs &&\n previous.ctimeMs === stat.ctimeMs &&\n previous.hash,\n );\n}\n\nexport function prepareProjectCache(\n root: string,\n candidates: ScanFileInput[],\n enabled = true,\n onProgress?: (current: number, total: number, file?: string) => void,\n): ProjectCacheSession {\n const cacheEnabled = enabled && process.env.REACT_LUAU_DOCTOR_DISABLE_CACHE !== \"1\";\n const filename = cacheEnabled ? projectCacheFilename(root) : null;\n const previous = filename ? readPayload(filename, root) : null;\n const files: Record<string, CachedFileState> = {};\n const sources = new Map<string, string>();\n const fingerprintParts: string[] = [];\n\n onProgress?.(0, candidates.length);\n for (let index = 0; index < candidates.length; index += 1) {\n const candidate = candidates[index];\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n const previousState = previous?.files[relativePath];\n let state: CachedFileState;\n\n if (candidate.source !== undefined) {\n const hash = hashText(candidate.source);\n sources.set(relativePath, candidate.source);\n state = { hash, isReactFile: previousState?.hash === hash ? previousState.isReactFile : undefined };\n } else {\n try {\n const stat = fs.statSync(candidate.absolutePath);\n if (fileStateMatches(previousState, stat)) {\n state = { ...previousState! };\n } else {\n const source = fs.readFileSync(candidate.absolutePath, \"utf8\");\n const hash = hashText(source);\n sources.set(relativePath, source);\n state = {\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n ctimeMs: stat.ctimeMs,\n hash,\n isReactFile: previousState?.hash === hash ? previousState.isReactFile : undefined,\n };\n }\n } catch {\n onProgress?.(index + 1, candidates.length, relativePath);\n continue;\n }\n }\n\n files[relativePath] = state;\n fingerprintParts.push(`${relativePath}\\0${state.hash}`);\n onProgress?.(index + 1, candidates.length, relativePath);\n }\n\n const fingerprint = hashText(fingerprintParts.join(\"\\0\"));\n return {\n enabled: cacheEnabled,\n root,\n filename,\n fingerprint,\n files,\n sources,\n previous,\n exact: Boolean(previous && previous.fingerprint === fingerprint),\n };\n}\n\nexport function materializeProjectCandidates(session: ProjectCacheSession, candidates: ScanFileInput[]): ScanFileInput[] {\n return candidates.map((candidate) => {\n if (candidate.source !== undefined) return candidate;\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(session.root, candidate.absolutePath));\n const cachedSource = session.sources.get(relativePath);\n if (cachedSource !== undefined) return { ...candidate, relativePath, source: cachedSource };\n try {\n const source = fs.readFileSync(candidate.absolutePath, \"utf8\");\n session.sources.set(relativePath, source);\n return { ...candidate, relativePath, source };\n } catch {\n return { ...candidate, relativePath };\n }\n });\n}\n\nfunction serializeSourceEffect(summary: SourceEffectModuleSummary): SerializedSourceEffectSummary {\n return {\n effectfulMembers: [...summary.effectfulMembers].sort(),\n effectfulExport: summary.effectfulExport,\n instanceFactories: [...summary.instanceFactories].sort(),\n };\n}\n\nfunction deserializeSourceEffect(summary: SerializedSourceEffectSummary): SourceEffectModuleSummary {\n return {\n effectfulMembers: new Set(summary.effectfulMembers),\n effectfulExport: summary.effectfulExport,\n instanceFactories: new Set(summary.instanceFactories),\n };\n}\n\nexport function serializeProjectModel(project: ProjectModel): SerializedProjectModel {\n return {\n memoizedModules: [...project.memoizedModules],\n bindingCandidateHooks: [...project.bindingCandidateHooks],\n externalCallbackModules: [...project.externalCallbackModules],\n bindingApiAlternatives: [...project.bindingApiAlternatives],\n bindingCompatibleComponentProps: [...project.bindingCompatibleComponentProps].map(([key, value]) => [key, [...value].sort()]),\n staticIterationTables: [...project.staticIterationTables].map(([key, value]) => [key, [...value].sort()]),\n conditionalHookModes: [...project.conditionalHookModes],\n sourceEffects: [...project.sourceEffects].map(([key, value]) => [key, serializeSourceEffect(value)]),\n };\n}\n\nexport function deserializeProjectModel(project: SerializedProjectModel): ProjectModel {\n return {\n memoizedModules: new Map(project.memoizedModules),\n bindingCandidateHooks: new Map(project.bindingCandidateHooks),\n externalCallbackModules: new Map(project.externalCallbackModules),\n bindingApiAlternatives: new Map(project.bindingApiAlternatives),\n bindingCompatibleComponentProps: new Map(project.bindingCompatibleComponentProps.map(([key, value]) => [key, new Set(value)])),\n staticIterationTables: new Map(project.staticIterationTables.map(([key, value]) => [key, new Set(value)])),\n conditionalHookModes: new Map(project.conditionalHookModes),\n sourceEffects: new Map(project.sourceEffects.map(([key, value]) => [key, deserializeSourceEffect(value)])),\n };\n}\n\nexport function cachedEffectModules(session: ProjectCacheSession): Record<string, CachedSourceEffectModule> {\n return session.previous?.effectModules ?? {};\n}\n\nexport function previousProjectModel(session: ProjectCacheSession): ProjectModel | null {\n if (!session.previous?.projectModel) return null;\n try {\n return deserializeProjectModel(session.previous.projectModel);\n } catch {\n return null;\n }\n}\n\nexport function projectModelFeatureKey(project: ProjectModel): string {\n const serialized = serializeProjectModel(project);\n return stableCacheKey({\n memoizedModules: serialized.memoizedModules,\n bindingCandidateHooks: serialized.bindingCandidateHooks,\n externalCallbackModules: serialized.externalCallbackModules,\n bindingApiAlternatives: serialized.bindingApiAlternatives,\n bindingCompatibleComponentProps: serialized.bindingCompatibleComponentProps,\n staticIterationTables: serialized.staticIterationTables,\n conditionalHookModes: serialized.conditionalHookModes,\n });\n}\n\nexport function cachedProjectModel(session: ProjectCacheSession): ProjectModel | null {\n if (!session.exact || !session.previous?.projectModel) return null;\n try {\n return deserializeProjectModel(session.previous.projectModel);\n } catch {\n return null;\n }\n}\n\nexport function previousCachedReport(session: ProjectCacheSession, key: string): CachedReportData | null {\n const report = session.previous?.reports?.[key];\n if (!report) return null;\n return {\n scannedFiles: report.scannedFiles,\n candidateFiles: report.candidateFiles,\n diagnostics: report.diagnostics,\n };\n}\n\nexport function cachedReport(session: ProjectCacheSession, key: string): CachedReportData | null {\n if (!session.exact) return null;\n const report = session.previous?.reports?.[key];\n if (!report) return null;\n return {\n scannedFiles: report.scannedFiles,\n candidateFiles: report.candidateFiles,\n diagnostics: report.diagnostics,\n };\n}\n\nexport function cacheHasSameFileSet(session: ProjectCacheSession): boolean {\n if (!session.previous) return false;\n const previousFiles = Object.keys(session.previous.files).sort();\n const currentFiles = Object.keys(session.files).sort();\n return previousFiles.length === currentFiles.length && previousFiles.every((file, index) => file === currentFiles[index]);\n}\n\nexport function changedProjectFiles(session: ProjectCacheSession): string[] {\n if (!session.previous) return Object.keys(session.files);\n const all = new Set([...Object.keys(session.previous.files), ...Object.keys(session.files)]);\n return [...all].filter((file) => session.previous?.files[file]?.hash !== session.files[file]?.hash).sort();\n}\n\nexport function knownReactFile(session: ProjectCacheSession, relativePath: string): boolean | undefined {\n return session.files[normalizeRelative(relativePath)]?.isReactFile;\n}\n\nexport function recordReactFile(session: ProjectCacheSession, relativePath: string, isReactFile: boolean): void {\n const state = session.files[normalizeRelative(relativePath)];\n if (state) state.isReactFile = isReactFile;\n}\n\nexport function saveProjectCache(\n session: ProjectCacheSession,\n project: ProjectModel,\n effectModules: Record<string, CachedSourceEffectModule> = session.previous?.effectModules ?? {},\n reportKey?: string,\n report?: CachedReportData,\n): void {\n if (!session.enabled || !session.filename) return;\n const reports: Record<string, CachedReportEntry> = session.exact ? { ...(session.previous?.reports ?? {}) } : {};\n if (reportKey && report) reports[reportKey] = { ...report, lastUsedAt: Date.now() };\n const prunedReports = Object.fromEntries(\n Object.entries(reports)\n .sort(([, left], [, right]) => right.lastUsedAt - left.lastUsedAt)\n .slice(0, MAX_CACHED_REPORTS),\n );\n writePayload(session.filename, {\n schemaVersion: CACHE_SCHEMA_VERSION,\n analyzerVersion: packageJson.version,\n root: path.resolve(session.root),\n fingerprint: session.fingerprint,\n files: session.files,\n projectModel: serializeProjectModel(project),\n effectModules,\n reports: prunedReports,\n lastUsedAt: Date.now(),\n });\n}\n\nexport function projectCachePath(root: string): string {\n return projectCacheFilename(root);\n}\n",
17
+ "interface SuppressionState {\n active: Set<string>;\n oneLine: Map<number, Set<string>>;\n}\n\nfunction normalizeRuleToken(token: string): string {\n const normalized = token.trim();\n if (!normalized || normalized === \"all\" || normalized === \"*\") return \"*\";\n return normalized.includes(\"/\") ? normalized : `react-luau/${normalized}`;\n}\n\nfunction parseRuleTokens(value: string): Set<string> {\n const withoutReason = value.split(\"--\", 1)[0] ?? \"\";\n const tokens = withoutReason\n .split(/[\\s,]+/)\n .map(normalizeRuleToken)\n .filter(Boolean);\n return new Set(tokens.length > 0 ? tokens : [\"*\"]);\n}\n\nfunction matchesRule(rules: Set<string> | undefined, ruleId: string): boolean {\n return Boolean(rules && (rules.has(\"*\") || rules.has(ruleId)));\n}\n\nexport function createInlineSuppressionChecker(source: string): (ruleId: string, line: number) => boolean {\n const state: SuppressionState = {\n active: new Set<string>(),\n oneLine: new Map<number, Set<string>>(),\n };\n const activeByLine = new Map<number, Set<string>>();\n const lines = source.split(/\\r?\\n/);\n const directive = /--\\s*react-luau-doctor-(disable|enable)(?:-(next-line|line))?\\b(.*)$/i;\n\n for (let index = 0; index < lines.length; index += 1) {\n const lineNumber = index + 1;\n activeByLine.set(lineNumber, new Set(state.active));\n\n const match = lines[index].match(directive);\n if (!match) continue;\n\n const action = match[1].toLowerCase();\n const placement = match[2]?.toLowerCase();\n const rules = parseRuleTokens(match[3] ?? \"\");\n\n if (placement === \"line\" || placement === \"next-line\") {\n if (action !== \"disable\") continue;\n const targetLine = placement === \"line\" ? lineNumber : lineNumber + 1;\n const existing = state.oneLine.get(targetLine) ?? new Set<string>();\n for (const rule of rules) existing.add(rule);\n state.oneLine.set(targetLine, existing);\n continue;\n }\n\n if (action === \"disable\") {\n for (const rule of rules) state.active.add(rule);\n } else if (rules.has(\"*\")) {\n state.active.clear();\n } else {\n for (const rule of rules) state.active.delete(rule);\n }\n }\n\n return (ruleId: string, line: number): boolean =>\n matchesRule(activeByLine.get(line), ruleId) || matchesRule(state.oneLine.get(line), ruleId);\n}\n",
18
+ "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Language, Parser, type Tree } from \"web-tree-sitter\";\nimport { parserCompatibleSource } from \"./parser-compat\";\n\nlet parserPromise: Promise<Parser> | null = null;\n\nasync function createParser(): Promise<Parser> {\n await Parser.init();\n const grammarPath = path.resolve(import.meta.dir, \"../vendor/tree-sitter-luau.wasm\");\n const grammar = new Uint8Array(fs.readFileSync(grammarPath));\n const language = await Language.load(grammar);\n const parser = new Parser();\n parser.setLanguage(language);\n return parser;\n}\n\nasync function getParser(): Promise<Parser> {\n parserPromise ??= createParser();\n return parserPromise;\n}\n\nexport async function parseLuau(source: string): Promise<Tree> {\n const parser = await getParser();\n const tree = parser.parse(parserCompatibleSource(source));\n if (!tree) throw new Error(\"Tree-sitter failed to parse Luau source\");\n return tree;\n}\n",
19
+ "interface BracketDepth {\n parentheses: number;\n brackets: number;\n braces: number;\n}\n\ninterface Range {\n start: number;\n end: number;\n}\n\nfunction scanTypeLine(text: string, depth: BracketDepth): void {\n let quote: string | null = null;\n let escaped = false;\n\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n const next = text[index + 1];\n\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n\n if (char === \"\\\"\" || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"-\" && next === \"-\") break;\n\n if (char === \"(\") depth.parentheses += 1;\n else if (char === \")\") depth.parentheses = Math.max(0, depth.parentheses - 1);\n else if (char === \"[\") depth.brackets += 1;\n else if (char === \"]\") depth.brackets = Math.max(0, depth.brackets - 1);\n else if (char === \"{\") depth.braces += 1;\n else if (char === \"}\") depth.braces = Math.max(0, depth.braces - 1);\n }\n}\n\nfunction depthIsZero(depth: BracketDepth): boolean {\n return depth.parentheses === 0 && depth.brackets === 0 && depth.braces === 0;\n}\n\nfunction lineData(source: string): { lines: string[]; offsets: number[] } {\n const lines = source.match(/[^\\n]*(?:\\n|$)/g)?.filter((line, index, all) => line.length > 0 || index < all.length - 1) ?? [source];\n const offsets: number[] = [];\n let offset = 0;\n for (const line of lines) {\n offsets.push(offset);\n offset += line.length;\n }\n return { lines, offsets };\n}\n\nfunction longBracketEquals(source: string, start: number): number | null {\n if (source[start] !== \"[\") return null;\n let index = start + 1;\n while (source[index] === \"=\") index += 1;\n return source[index] === \"[\" ? index - start - 1 : null;\n}\n\nfunction longBracketEnd(source: string, start: number, equals: number): number {\n const closer = `]${\"=\".repeat(equals)}]`;\n const end = source.indexOf(closer, start + equals + 2);\n return end < 0 ? source.length : end + closer.length;\n}\n\n/**\n * Marks executable-code positions. Strings and comments are false so syntax\n * compatibility rewrites never alter text that merely contains a keyword.\n */\nfunction codeMask(source: string): Uint8Array {\n const mask = new Uint8Array(source.length);\n mask.fill(1);\n\n let index = 0;\n while (index < source.length) {\n const char = source[index];\n\n if (char === \"'\" || char === \"\\\"\") {\n const quote = char;\n let cursor = index;\n let escaped = false;\n while (cursor < source.length) {\n mask[cursor] = 0;\n const current = source[cursor];\n cursor += 1;\n if (cursor - 1 === index) continue;\n if (escaped) escaped = false;\n else if (current === \"\\\\\") escaped = true;\n else if (current === quote) break;\n }\n index = cursor;\n continue;\n }\n\n if (char === \"`\") {\n let cursor = index;\n let escaped = false;\n while (cursor < source.length) {\n mask[cursor] = 0;\n const current = source[cursor];\n cursor += 1;\n if (cursor - 1 === index) continue;\n if (escaped) escaped = false;\n else if (current === \"\\\\\") escaped = true;\n else if (current === \"`\") break;\n }\n index = cursor;\n continue;\n }\n\n if (char === \"-\" && source[index + 1] === \"-\") {\n const longEquals = longBracketEquals(source, index + 2);\n const end = longEquals === null ? source.indexOf(\"\\n\", index + 2) : longBracketEnd(source, index + 2, longEquals);\n const stop = end < 0 ? source.length : end;\n mask.fill(0, index, stop);\n index = stop;\n continue;\n }\n\n if (char === \"[\") {\n const equals = longBracketEquals(source, index);\n if (equals !== null) {\n const end = longBracketEnd(source, index, equals);\n mask.fill(0, index, end);\n index = end;\n continue;\n }\n }\n\n index += 1;\n }\n\n return mask;\n}\n\nfunction isCode(mask: Uint8Array, start: number, end = start + 1): boolean {\n for (let index = start; index < end; index += 1) {\n if (mask[index] !== 1) return false;\n }\n return true;\n}\n\nfunction maskTypeAliases(source: string, mask: Uint8Array): Range[] {\n const { lines, offsets } = lineData(source);\n const ranges: Range[] = [];\n const typeStart = /^(\\s*)(?:export\\s+)?type\\s+[A-Za-z_][A-Za-z0-9_]*(?:<[^>]*>)?\\s*=/;\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {\n const line = lines[lineIndex].replace(/\\r?\\n$/, \"\");\n const match = line.match(typeStart);\n if (!match || !isCode(mask, offsets[lineIndex] + match.index!, offsets[lineIndex] + match.index! + match[0].trimStart().length)) continue;\n\n const depth: BracketDepth = { parentheses: 0, brackets: 0, braces: 0 };\n let sawExpression = false;\n let endLine = lineIndex;\n\n for (let current = lineIndex; current < lines.length; current += 1) {\n const currentLine = lines[current].replace(/\\r?\\n$/, \"\");\n const segment = current === lineIndex ? currentLine.slice(match[0].length) : currentLine;\n if (segment.trim().length > 0) sawExpression = true;\n scanTypeLine(segment, depth);\n endLine = current;\n\n if (!sawExpression || !depthIsZero(depth)) continue;\n const trimmed = segment.trimEnd();\n if (/[|&=,]$/.test(trimmed)) continue;\n\n let nextNonEmpty = \"\";\n for (let lookahead = current + 1; lookahead < lines.length; lookahead += 1) {\n nextNonEmpty = lines[lookahead].trim();\n if (nextNonEmpty.length > 0) break;\n }\n if (/^[|&]/.test(nextNonEmpty)) continue;\n break;\n }\n\n ranges.push({\n start: offsets[lineIndex],\n end: offsets[endLine] + lines[endLine].length,\n });\n lineIndex = endLine;\n }\n\n return ranges;\n}\n\nfunction maskTypeLevelBlocks(source: string, mask: Uint8Array): Range[] {\n const { lines, offsets } = lineData(source);\n const ranges: Range[] = [];\n const declarationStart = /^(\\s*)(?:(?:export\\s+)?type\\s+function\\b|declare\\s+(?:extern\\s+type|class|global)\\b)/;\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {\n const line = lines[lineIndex].replace(/\\r?\\n$/, \"\");\n const match = line.match(declarationStart);\n if (!match) continue;\n const firstToken = offsets[lineIndex] + match[1].length;\n if (!isCode(mask, firstToken)) continue;\n\n const indentation = match[1].replace(/\\t/g, \" \").length;\n let endLine = lineIndex;\n const afterStart = line.slice(match[0].length);\n if (!/\\bend\\b/.test(afterStart)) {\n for (let current = lineIndex + 1; current < lines.length; current += 1) {\n const currentLine = lines[current].replace(/\\r?\\n$/, \"\");\n const trimmed = currentLine.trim();\n if (!trimmed) continue;\n const currentIndent = currentLine.match(/^\\s*/)?.[0].replace(/\\t/g, \" \").length ?? 0;\n if (trimmed === \"end\" && currentIndent <= indentation && isCode(mask, offsets[current] + currentLine.indexOf(\"end\"), offsets[current] + currentLine.indexOf(\"end\") + 3)) {\n endLine = current;\n break;\n }\n }\n }\n\n ranges.push({ start: offsets[lineIndex], end: offsets[endLine] + lines[endLine].length });\n lineIndex = endLine;\n }\n\n return ranges;\n}\n\nfunction attributeRanges(source: string, mask: Uint8Array): Range[] {\n const ranges: Range[] = [];\n for (let index = 0; index < source.length; index += 1) {\n if (source[index] !== \"@\" || !isCode(mask, index)) continue;\n\n if (source[index + 1] === \"[\") {\n let depth = 0;\n let cursor = index + 1;\n while (cursor < source.length) {\n if (isCode(mask, cursor)) {\n if (source[cursor] === \"[\") depth += 1;\n else if (source[cursor] === \"]\") {\n depth -= 1;\n if (depth === 0) {\n cursor += 1;\n break;\n }\n }\n }\n cursor += 1;\n }\n ranges.push({ start: index, end: cursor });\n index = cursor - 1;\n continue;\n }\n\n const match = source.slice(index + 1).match(/^[A-Za-z_][A-Za-z0-9_]*/);\n if (match && isCode(mask, index + 1, index + 1 + match[0].length)) {\n ranges.push({ start: index, end: index + 1 + match[0].length });\n index += match[0].length;\n }\n }\n return ranges;\n}\n\nfunction explicitTypeArgumentRanges(source: string, mask: Uint8Array): Range[] {\n const ranges: Range[] = [];\n for (let index = 0; index < source.length - 1; index += 1) {\n if (source[index] !== \"<\" || source[index + 1] !== \"<\" || !isCode(mask, index, index + 2)) continue;\n\n let depth = 2;\n let cursor = index + 2;\n while (cursor < source.length && depth > 0) {\n if (isCode(mask, cursor)) {\n if (source[cursor] === \"<\") depth += 1;\n else if (source[cursor] === \">\") depth -= 1;\n }\n cursor += 1;\n }\n if (depth === 0) {\n ranges.push({ start: index, end: cursor });\n index = cursor - 1;\n }\n }\n return ranges;\n}\n\nfunction mergeRanges(ranges: Range[]): Range[] {\n const sorted = ranges.filter((range) => range.end > range.start).sort((a, b) => a.start - b.start || a.end - b.end);\n const merged: Range[] = [];\n for (const range of sorted) {\n const previous = merged.at(-1);\n if (previous && range.start <= previous.end) previous.end = Math.max(previous.end, range.end);\n else merged.push({ ...range });\n }\n return merged;\n}\n\nfunction blankPreservingUtf8Bytes(value: string): string {\n let result = \"\";\n for (const char of value) {\n if (char === \"\\n\" || char === \"\\r\") result += char;\n else result += \" \".repeat(new TextEncoder().encode(char).length);\n }\n return result;\n}\n\nfunction applyMasks(source: string, ranges: Range[]): string {\n let output = source;\n for (const range of mergeRanges(ranges).sort((a, b) => b.start - a.start)) {\n output = `${output.slice(0, range.start)}${blankPreservingUtf8Bytes(output.slice(range.start, range.end))}${output.slice(range.end)}`;\n }\n return output;\n}\n\nfunction normalizeIntegerLiteralSuffixes(source: string, mask: Uint8Array): string {\n const suffixes: number[] = [];\n const integerPattern = /\\b(?:0[xX][0-9A-Fa-f_]+|0[bB][01_]+|[0-9][0-9_]*)i\\b/g;\n\n for (const match of source.matchAll(integerPattern)) {\n const start = match.index;\n const suffix = start + match[0].length - 1;\n if (isCode(mask, start, suffix + 1)) suffixes.push(suffix);\n }\n\n let output = source;\n for (const suffix of suffixes.sort((a, b) => b - a)) {\n output = `${output.slice(0, suffix)} ${output.slice(suffix + 1)}`;\n }\n return output;\n}\n\nfunction replaceContextualKeywords(source: string, mask: Uint8Array): string {\n const replacements: Array<{ start: number; end: number; value: string }> = [];\n\n const constPattern = /\\bconst\\b(?=\\s+(?:function\\b|[A-Za-z_][A-Za-z0-9_]*\\s*(?::|,|=)))/g;\n for (const match of source.matchAll(constPattern)) {\n const start = match.index;\n if (isCode(mask, start, start + 5)) replacements.push({ start, end: start + 5, value: \"local\" });\n }\n\n const exportPattern = /\\bexport\\b(?=\\s+(?:local\\b|const\\b|function\\b))/g;\n for (const match of source.matchAll(exportPattern)) {\n const start = match.index;\n if (isCode(mask, start, start + 6)) replacements.push({ start, end: start + 6, value: \" \" });\n }\n\n let output = source;\n for (const replacement of replacements.sort((a, b) => b.start - a.start)) {\n output = `${output.slice(0, replacement.start)}${replacement.value}${output.slice(replacement.end)}`;\n }\n return output;\n}\n\n/**\n * Adapts syntax added after the bundled Tree-sitter grammar without moving any\n * UTF-8 byte offsets. Runtime declarations are normalized to older equivalent\n * syntax; type-only syntax and attributes are blanked because React analysis\n * does not need their AST nodes.\n */\nexport function parserCompatibleSource(source: string): string {\n const mask = codeMask(source);\n const keywordCompatible = replaceContextualKeywords(source, mask);\n const literalCompatible = normalizeIntegerLiteralSuffixes(keywordCompatible, mask);\n const ranges = [\n ...maskTypeAliases(source, mask),\n ...maskTypeLevelBlocks(source, mask),\n ...attributeRanges(source, mask),\n ...explicitTypeArgumentRanges(source, mask),\n ];\n const masked = applyMasks(literalCompatible, ranges);\n\n // tree-sitter-luau 1.2.0 treats a statement-level assignment to the valid\n // Luau identifier `type` as a malformed type alias. Replace only that token\n // with an equal-width identifier so syntax locations remain aligned.\n return masked.replace(\n /^(\\s*)type(?=\\s*(?:\\+=|-=|\\*=|\\/=|%=|\\^=|\\.\\.=|=(?!=)))/gm,\n \"$1_typ\",\n );\n}\n",
20
+ "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildUniqueFeatureAliases,\n moduleKeys,\n normalizeRequireTarget,\n resolveModuleReference,\n type ModuleIdentity,\n} from \"./module-resolution\";\nimport type {\n BindingCandidateHookSummary,\n ConditionalHookModeSummary,\n ExternalCallbackFunctionSummary,\n ProjectModel,\n ScanFileInput,\n} from \"./types\";\n\nconst HIGH_FREQUENCY_SOURCE =\n /(?:RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation)\\s*:\\s*Connect|BindToRenderStep|BindToSimulation/;\nconst EXTERNAL_UPDATE_SOURCE =\n /(?::|\\.)(?:Connect|Once|Subscribe|Observe|Listen|Watch)\\s*\\(|\\b(?:subscribe|observe|listen|watch)[A-Za-z0-9_]*\\s*\\(|GetPropertyChangedSignal\\s*\\(|\\.Changed\\b/i;\nconst CALLBACK_PARAMETER_NAME =\n /^(?:callback|handler|listener|subscriber|observer|effect|fn)$/i;\n\ninterface SourceRecord extends ModuleIdentity {\n source: string;\n}\n\nexport interface ProjectModelModuleAnalysis {\n record: SourceRecord;\n memoized?: \"shallow\" | \"custom\";\n bindingHook?: BindingCandidateHookSummary;\n callbackFunction?: ExternalCallbackFunctionSummary;\n bindingCompatibleProps?: Set<string>;\n staticIterationTables?: Set<string>;\n conditionalHookMode?: ConditionalHookModeSummary;\n declaredMethods: Map<string, Set<string>>;\n}\n\nexport interface ProjectModelModuleCacheEntry {\n hash: string;\n analysis: ProjectModelModuleAnalysis;\n}\n\nexport interface ProjectModelBuildOptions {\n fileHashes?: Readonly<Record<string, string>>;\n moduleCache?: Map<string, ProjectModelModuleCacheEntry>;\n}\n\nfunction exportedFunctionName(source: string): string | null {\n return source.match(/\\breturn\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*$/)?.[1] ?? null;\n}\n\nfunction findFunctionParameters(\n source: string,\n functionName: string,\n): string | null {\n const escaped = functionName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const patterns = [\n new RegExp(\n `\\\\b(?:local\\\\s+)?function\\\\s+${escaped}(?:<[^>]*>)?\\\\s*\\\\(`,\n \"s\",\n ),\n new RegExp(`\\\\b${escaped}\\\\s*=\\\\s*function(?:<[^>]*>)?\\\\s*\\\\(`, \"s\"),\n ];\n for (const pattern of patterns) {\n const match = pattern.exec(source);\n if (!match) continue;\n const open = match.index + match[0].lastIndexOf(\"(\");\n return extractCallArguments(source, open);\n }\n return null;\n}\n\nfunction splitTopLevelParameters(parameters: string): string[] {\n const result: string[] = [];\n let start = 0;\n let round = 0;\n let square = 0;\n let curly = 0;\n let angle = 0;\n let quote: string | null = null;\n let escaped = false;\n\n for (let index = 0; index < parameters.length; index += 1) {\n const char = parameters[index];\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"(\") round += 1;\n else if (char === \")\") round = Math.max(0, round - 1);\n else if (char === \"[\") square += 1;\n else if (char === \"]\") square = Math.max(0, square - 1);\n else if (char === \"{\") curly += 1;\n else if (char === \"}\") curly = Math.max(0, curly - 1);\n else if (char === \"<\") angle += 1;\n else if (char === \">\") angle = Math.max(0, angle - 1);\n else if (\n char === \",\" &&\n round === 0 &&\n square === 0 &&\n curly === 0 &&\n angle === 0\n ) {\n result.push(parameters.slice(start, index).trim());\n start = index + 1;\n }\n }\n result.push(parameters.slice(start).trim());\n return result.filter(Boolean);\n}\n\ninterface DualModeBindingStatePair {\n valueName: string;\n setterName: string;\n bindingModeParameterIndex: number;\n bindingModeParameterName: string;\n bindingWhenTruthy: boolean;\n}\n\nfunction findDualModeBindingStatePair(\n source: string,\n functionName: string,\n): DualModeBindingStatePair | null {\n const parametersText = findFunctionParameters(source, functionName);\n if (parametersText === null) return null;\n const parameterNames = splitTopLevelParameters(parametersText).map(\n (parameter) => parameter.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1] ?? null,\n );\n\n const declarations = [\n ...source.matchAll(\n /^[ \\t]*local[ \\t]+([A-Za-z_][A-Za-z0-9_]*)[ \\t]*,[ \\t]*([A-Za-z_][A-Za-z0-9_]*)[ \\t]*(?:--[^\\n]*)?$/gm,\n ),\n ];\n for (const declaration of declarations) {\n const valueName = declaration[1];\n const setterName = declaration[2];\n const escapedValue = valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const escapedSetter = setterName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const bindingAssignment = `${escapedValue}\\\\s*,\\\\s*${escapedSetter}\\\\s*=\\\\s*(?:React\\\\.)?useBinding\\\\s*\\\\(`;\n const stateAssignment = `${escapedValue}\\\\s*,\\\\s*${escapedSetter}\\\\s*=\\\\s*(?:React\\\\.)?useState\\\\s*\\\\(`;\n\n for (const [parameterIndex, parameterName] of parameterNames.entries()) {\n if (!parameterName) continue;\n const escapedParameter = parameterName.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n \"\\\\$&\",\n );\n const patterns = [\n {\n regex: new RegExp(\n `\\\\bif\\\\s+${escapedParameter}\\\\s+then[\\\\s\\\\S]*?${bindingAssignment}[\\\\s\\\\S]*?\\\\belse\\\\b[\\\\s\\\\S]*?${stateAssignment}`,\n ),\n bindingWhenTruthy: true,\n },\n {\n regex: new RegExp(\n `\\\\bif\\\\s+${escapedParameter}\\\\s+then[\\\\s\\\\S]*?${stateAssignment}[\\\\s\\\\S]*?\\\\belse\\\\b[\\\\s\\\\S]*?${bindingAssignment}`,\n ),\n bindingWhenTruthy: false,\n },\n {\n regex: new RegExp(\n `\\\\bif\\\\s+not\\\\s+${escapedParameter}\\\\s+then[\\\\s\\\\S]*?${stateAssignment}[\\\\s\\\\S]*?\\\\belse\\\\b[\\\\s\\\\S]*?${bindingAssignment}`,\n ),\n bindingWhenTruthy: true,\n },\n {\n regex: new RegExp(\n `\\\\bif\\\\s+not\\\\s+${escapedParameter}\\\\s+then[\\\\s\\\\S]*?${bindingAssignment}[\\\\s\\\\S]*?\\\\belse\\\\b[\\\\s\\\\S]*?${stateAssignment}`,\n ),\n bindingWhenTruthy: false,\n },\n ];\n const match = patterns.find((pattern) => pattern.regex.test(source));\n if (!match) continue;\n return {\n valueName,\n setterName,\n bindingModeParameterIndex: parameterIndex,\n bindingModeParameterName: parameterName,\n bindingWhenTruthy: match.bindingWhenTruthy,\n };\n }\n }\n\n return null;\n}\n\nfunction exportedFunctionParameters(\n source: string,\n): { name?: string; parameters: string[] } | null {\n const name = exportedFunctionName(source);\n if (name) {\n const parameters = findFunctionParameters(source, name);\n if (parameters === null) return null;\n return { name, parameters: splitTopLevelParameters(parameters) };\n }\n\n const match = /^\\s*return\\s+function(?:<[^>]*>)?\\s*\\(/m.exec(source);\n if (!match || match.index === undefined) return null;\n const open = match.index + match[0].lastIndexOf(\"(\");\n const parameters = extractCallArguments(source, open);\n if (parameters === null) return null;\n return { parameters: splitTopLevelParameters(parameters) };\n}\n\nfunction parameterName(parameter: string): string | null {\n return parameter.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1] ?? null;\n}\n\nfunction branchContainsHookCall(text: string): boolean {\n return /\\b(?:[A-Za-z_][A-Za-z0-9_]*[.:])?use[A-Z0-9_][A-Za-z0-9_]*\\s*\\(/.test(\n text,\n );\n}\n\nfunction conditionAliasesForParameter(\n source: string,\n parameter: string,\n): string[] {\n const aliases = new Set<string>([parameter]);\n const escaped = parameter.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const directPatterns = [\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*${escaped}\\\\s*$`,\n \"gm\",\n ),\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*not\\\\s+${escaped}\\\\s*$`,\n \"gm\",\n ),\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*${escaped}\\\\s*(?:==|~=)\\\\s*(?:true|false|nil)\\\\s*$`,\n \"gm\",\n ),\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*(?:true|false|nil)\\\\s*(?:==|~=)\\\\s*${escaped}\\\\s*$`,\n \"gm\",\n ),\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*if\\\\s+${escaped}\\\\s*(?:==|~=)\\\\s*nil\\\\s+then\\\\s+(?:true|false)\\\\s+else\\\\s+${escaped}\\\\s*$`,\n \"gm\",\n ),\n new RegExp(\n `^\\\\s*local\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\s*=\\\\s*if\\\\s+${escaped}\\\\s+then\\\\s+(?:true|false)\\\\s+else\\\\s+(?:true|false)\\\\s*$`,\n \"gm\",\n ),\n ];\n\n for (const pattern of directPatterns) {\n for (const match of source.matchAll(pattern)) aliases.add(match[1]);\n }\n return [...aliases];\n}\n\nfunction findConditionalHookMode(\n source: string,\n): ConditionalHookModeSummary | null {\n const exported = exportedFunctionParameters(source);\n if (!exported) return null;\n\n const parameterNames = exported.parameters.map(parameterName);\n const controlledIndexes: number[] = [];\n const controlledNames: string[] = [];\n const conditionVariables: Record<string, number> = {};\n\n for (const [index, name] of parameterNames.entries()) {\n if (!name) continue;\n const aliases = conditionAliasesForParameter(source, name);\n let controlsHook = false;\n\n for (const alias of aliases) {\n const escaped = alias.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const patterns = [\n new RegExp(\n `\\\\bif\\\\s+${escaped}\\\\s+then([\\\\s\\\\S]*?)(?=\\\\belse\\\\b|\\\\bend\\\\b)`,\n \"g\",\n ),\n new RegExp(\n `\\\\bif\\\\s+not\\\\s+${escaped}\\\\s+then([\\\\s\\\\S]*?)(?=\\\\belse\\\\b|\\\\bend\\\\b)`,\n \"g\",\n ),\n new RegExp(\n `\\\\bif\\\\s+${escaped}\\\\s*(?:==|~=)\\\\s*(?:true|false|nil)\\\\s+then([\\\\s\\\\S]*?)(?=\\\\belse\\\\b|\\\\bend\\\\b)`,\n \"g\",\n ),\n new RegExp(\n `\\\\bif\\\\s+(?:true|false|nil)\\\\s*(?:==|~=)\\\\s*${escaped}\\\\s+then([\\\\s\\\\S]*?)(?=\\\\belse\\\\b|\\\\bend\\\\b)`,\n \"g\",\n ),\n ];\n\n for (const pattern of patterns) {\n for (const match of source.matchAll(pattern)) {\n if (!branchContainsHookCall(match[1] ?? \"\")) continue;\n controlsHook = true;\n conditionVariables[alias] = index;\n break;\n }\n if (controlsHook) break;\n }\n }\n\n if (!controlsHook) continue;\n controlledIndexes.push(index);\n controlledNames.push(name);\n }\n\n if (controlledIndexes.length === 0) return null;\n return {\n name: exported.name,\n parameterIndexes: controlledIndexes,\n parameterNames: controlledNames,\n conditionVariables,\n knownCallSites: 0,\n dynamicCallSites: 0,\n };\n}\n\nfunction maskLuauNonCode(source: string): string {\n let result = \"\";\n let index = 0;\n while (index < source.length) {\n const char = source[index];\n const next = source[index + 1] ?? \"\";\n\n if (char === \"-\" && next === \"-\") {\n if (source[index + 2] === \"[\" && source[index + 3] === \"[\") {\n const end = source.indexOf(\"]]\", index + 4);\n const stop = end >= 0 ? end + 2 : source.length;\n const chunk = source.slice(index, stop);\n result += chunk.replace(/[^\\n]/g, \" \");\n index = stop;\n continue;\n }\n const end = source.indexOf(\"\\n\", index + 2);\n const stop = end >= 0 ? end : source.length;\n result += \" \".repeat(stop - index);\n index = stop;\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n const quote = char;\n let end = index + 1;\n while (end < source.length) {\n if (source[end] === \"\\\\\") {\n end += 2;\n continue;\n }\n if (source[end] === quote) {\n end += 1;\n break;\n }\n end += 1;\n }\n result += source.slice(index, end).replace(/[^\\n]/g, \" \");\n index = end;\n continue;\n }\n\n if (char === \"[\" && next === \"[\") {\n const end = source.indexOf(\"]]\", index + 2);\n const stop = end >= 0 ? end + 2 : source.length;\n result += source.slice(index, stop).replace(/[^\\n]/g, \" \");\n index = stop;\n continue;\n }\n\n result += char;\n index += 1;\n }\n return result;\n}\n\nfunction stableLiteralConstants(source: string): Map<string, string> {\n const result = new Map<string, string>();\n for (const match of source.matchAll(\n /^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(true|false|nil)\\s*$/gm,\n )) {\n const name = match[1];\n const assignments = [\n ...source.matchAll(\n new RegExp(\n `\\\\b${name.replace(/[.*+?^${}()|[\\\\]\\\\\\\\]/g, \"\\\\\\\\$&\")}\\\\s*=`,\n \"g\",\n ),\n ),\n ];\n if (assignments.length === 1) result.set(name, match[2]);\n }\n return result;\n}\n\nfunction isStableHookModeArgument(\n text: string | undefined,\n constants: Map<string, string>,\n): boolean {\n if (text === undefined) return true;\n let value = text.trim();\n while (value.startsWith(\"(\") && value.endsWith(\")\"))\n value = value.slice(1, -1).trim();\n if (/^(?:true|false|nil)$/.test(value)) return true;\n return constants.has(value);\n}\n\nfunction collectConditionalHookModeCallSites(\n records: SourceRecord[],\n aliases: Map<string, ConditionalHookModeSummary>,\n): void {\n for (const record of records) {\n const imports = new Map<string, ConditionalHookModeSummary>();\n for (const match of record.source.matchAll(\n /\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)/gs,\n )) {\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n aliases,\n );\n if (summary) imports.set(match[1], summary);\n }\n if (imports.size === 0) continue;\n\n const masked = maskLuauNonCode(record.source);\n const constants = stableLiteralConstants(masked);\n for (const [localName, summary] of imports) {\n const escaped = localName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const callPattern = new RegExp(`\\\\b${escaped}\\\\s*\\\\(`, \"g\");\n for (const match of masked.matchAll(callPattern)) {\n if (match.index === undefined) continue;\n const open = masked.indexOf(\"(\", match.index);\n const argumentsText = extractCallArguments(record.source, open);\n if (argumentsText === null) continue;\n const args = splitTopLevelParameters(argumentsText);\n summary.knownCallSites += 1;\n if (\n summary.parameterIndexes.some(\n (index) => !isStableHookModeArgument(args[index], constants),\n )\n ) {\n summary.dynamicCallSites += 1;\n }\n }\n }\n }\n}\n\nfunction findExternalCallbackFunction(\n source: string,\n): ExternalCallbackFunctionSummary | null {\n const name = exportedFunctionName(source);\n if (!name || !EXTERNAL_UPDATE_SOURCE.test(source)) return null;\n const parameters = findFunctionParameters(source, name);\n if (parameters === null) return null;\n\n const callbackParameterIndexes: number[] = [];\n for (const [index, parameter] of splitTopLevelParameters(\n parameters,\n ).entries()) {\n const parameterName = parameter.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (!parameterName) continue;\n const functionTyped = /->/.test(parameter);\n const semanticallyNamed = CALLBACK_PARAMETER_NAME.test(parameterName);\n const used = new RegExp(\n `\\\\b${parameterName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\b`,\n ).test(source);\n if (used && (functionTyped || semanticallyNamed))\n callbackParameterIndexes.push(index);\n }\n\n if (callbackParameterIndexes.length === 0) return null;\n return {\n name,\n callbackParameterIndexes,\n highFrequency: HIGH_FREQUENCY_SOURCE.test(source),\n };\n}\n\nfunction findBindingCandidateHook(\n source: string,\n): BindingCandidateHookSummary | null {\n const exported = source.match(\n /\\breturn\\s+(use[A-Z0-9_][A-Za-z0-9_]*)\\s*$/,\n )?.[1];\n if (!exported) return null;\n\n const stateMatches = [\n ...source.matchAll(\n /\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*,\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(?:React\\.)?useState\\s*\\(/g,\n ),\n ];\n const directState =\n stateMatches.length === 1\n ? { valueName: stateMatches[0][1], setterName: stateMatches[0][2] }\n : null;\n const dualMode = directState\n ? null\n : findDualModeBindingStatePair(source, exported);\n if (!directState && !dualMode) return null;\n\n const valueName = directState?.valueName ?? dualMode!.valueName;\n const setterName = directState?.setterName ?? dualMode!.setterName;\n const escapedValue = valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const escapedSetter = setterName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n if (!new RegExp(`\\\\breturn\\\\s+${escapedValue}\\\\b`).test(source)) return null;\n const setterCalled = new RegExp(`\\\\b${escapedSetter}\\\\s*\\\\(`).test(source);\n const setterPassedToSubscription = new RegExp(\n `(?::|\\\\.)(?:Connect|Once|Subscribe|Observe|Listen|Watch)\\\\s*\\\\(\\\\s*${escapedSetter}\\\\b`,\n \"i\",\n ).test(source);\n if (!setterCalled && !setterPassedToSubscription) return null;\n\n const highFrequency = HIGH_FREQUENCY_SOURCE.test(source);\n const external = highFrequency || EXTERNAL_UPDATE_SOURCE.test(source);\n if (!external) return null;\n\n const propertySignal = source.match(\n /GetPropertyChangedSignal\\s*\\(\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*\\)/,\n );\n const observedPropertyName = propertySignal?.[1] ?? null;\n const measurement = Boolean(\n observedPropertyName &&\n new RegExp(\n `\\\\[\\\\s*${observedPropertyName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\s*\\\\]`,\n ).test(source),\n );\n\n return {\n name: exported,\n highFrequency,\n external,\n sourceKind: measurement ? \"measurement\" : \"external-state\",\n ...(dualMode\n ? {\n bindingModeParameterIndex: dualMode.bindingModeParameterIndex,\n bindingModeParameterName: dualMode.bindingModeParameterName,\n bindingWhenTruthy: dualMode.bindingWhenTruthy,\n }\n : {}),\n };\n}\n\nfunction findDerivedBindingCandidateHook(\n source: string,\n bindingCandidateHooks: Map<string, BindingCandidateHookSummary>,\n): BindingCandidateHookSummary | null {\n const exported = source.match(\n /\\breturn\\s+(use[A-Z0-9_][A-Za-z0-9_]*)\\s*$/,\n )?.[1];\n if (!exported) return null;\n\n const stateMatches = [\n ...source.matchAll(\n /\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*,\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(?:React\\.)?useState\\s*\\(/g,\n ),\n ];\n if (stateMatches.length !== 1) return null;\n const valueName = stateMatches[0][1];\n const setterName = stateMatches[0][2];\n const escapedValue = valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const escapedSetter = setterName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (!new RegExp(`\\\\breturn\\\\s+${escapedValue}\\\\b`).test(source)) return null;\n if (!new RegExp(`\\\\b${escapedSetter}\\\\s*\\\\(`).test(source)) return null;\n\n const requirePattern =\n /\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)/gs;\n for (const match of source.matchAll(requirePattern)) {\n const localName = match[1];\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n bindingCandidateHooks,\n );\n if (!summary) continue;\n const escapedLocal = localName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (!new RegExp(`\\\\b${escapedLocal}\\\\s*\\\\(`).test(source)) continue;\n return {\n name: exported,\n highFrequency: summary.highFrequency,\n external: true,\n sourceKind: \"derived-external-state\",\n };\n }\n\n return null;\n}\n\nfunction extractCallArguments(source: string, open: number): string | null {\n if (open < 0 || source[open] !== \"(\") return null;\n\n let depth = 0;\n let quote: string | null = null;\n let longStringDepth = 0;\n let escaped = false;\n\n for (let index = open; index < source.length; index += 1) {\n const char = source[index];\n const next = source[index + 1] ?? \"\";\n\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n\n if (longStringDepth > 0) {\n if (char === \"]\" && next === \"]\") {\n longStringDepth -= 1;\n index += 1;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"[\" && next === \"[\") {\n longStringDepth += 1;\n index += 1;\n continue;\n }\n if (char === \"(\") depth += 1;\n else if (char === \")\") {\n depth -= 1;\n if (depth === 0) return source.slice(open + 1, index);\n }\n }\n\n return null;\n}\n\nfunction findMemoCall(source: string): string | null {\n const direct = /\\breturn\\s+(?:React\\.)?memo\\s*\\(/g.exec(source);\n if (direct)\n return extractCallArguments(source, source.indexOf(\"(\", direct.index));\n\n const assigned =\n /\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(?:React\\.)?memo\\s*\\(/g;\n for (\n let match = assigned.exec(source);\n match;\n match = assigned.exec(source)\n ) {\n const name = match[1].replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (!new RegExp(`\\\\breturn\\\\s+${name}\\\\b`).test(source.slice(match.index)))\n continue;\n return extractCallArguments(source, source.indexOf(\"(\", match.index));\n }\n\n return null;\n}\n\nfunction hasTopLevelComma(argumentsText: string): boolean {\n let round = 0;\n let square = 0;\n let curly = 0;\n let quote: string | null = null;\n let escaped = false;\n\n for (let index = 0; index < argumentsText.length; index += 1) {\n const char = argumentsText[index];\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"(\") round += 1;\n else if (char === \")\") round -= 1;\n else if (char === \"[\") square += 1;\n else if (char === \"]\") square -= 1;\n else if (char === \"{\") curly += 1;\n else if (char === \"}\") curly -= 1;\n else if (char === \",\" && round === 0 && square === 0 && curly === 0)\n return true;\n }\n return false;\n}\n\nfunction bindingNameAlternative(name: string): string | null {\n if (!/state/i.test(name)) return null;\n return name.replace(/state/gi, (match) => {\n if (match === match.toUpperCase()) return \"BINDING\";\n if (match[0] === match[0].toUpperCase()) return \"Binding\";\n return \"binding\";\n });\n}\n\nfunction findDeclaredMethods(source: string): Map<string, Set<string>> {\n const methods = new Map<string, Set<string>>();\n const patterns = [\n /\\bfunction\\s+([A-Za-z_][A-Za-z0-9_.]*)\\s*[:.]\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*(?:<[^>]*>)?\\s*\\(/g,\n /\\b([A-Za-z_][A-Za-z0-9_.]*)\\s*[:.]\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*function\\b/g,\n ];\n for (const pattern of patterns) {\n for (const match of source.matchAll(pattern)) {\n const owner = match[1].toLowerCase();\n const names = methods.get(owner) ?? new Set<string>();\n names.add(match[2]);\n methods.set(owner, names);\n }\n }\n return methods;\n}\n\nfunction findBindingApiAlternativesFromMethodMaps(\n methodMaps: Iterable<Map<string, Set<string>>>,\n): Map<string, string> {\n const pairedAlternatives = new Map<string, Set<string>>();\n const unpairedStateNames = new Set<string>();\n\n for (const methods of methodMaps) {\n for (const names of methods.values()) {\n const byLower = new Map(\n [...names].map((name) => [name.toLowerCase(), name]),\n );\n for (const stateName of names) {\n const expected = bindingNameAlternative(stateName);\n if (!expected) continue;\n const bindingName = byLower.get(expected.toLowerCase());\n if (!bindingName) {\n unpairedStateNames.add(stateName.toLowerCase());\n continue;\n }\n const alternatives =\n pairedAlternatives.get(stateName) ?? new Set<string>();\n alternatives.add(bindingName);\n pairedAlternatives.set(stateName, alternatives);\n }\n }\n }\n\n const result = new Map<string, string>();\n for (const [stateName, alternatives] of pairedAlternatives) {\n if (\n alternatives.size === 1 &&\n !unpairedStateNames.has(stateName.toLowerCase())\n ) {\n result.set(stateName, [...alternatives][0]);\n }\n }\n return result;\n}\n\nconst NON_BINDABLE_HOST_FIELDS = new Set([\"ref\", \"key\", \"children\"]);\n\ninterface SourceRange {\n start: number;\n end: number;\n}\n\nfunction matchingDelimiter(\n source: string,\n open: number,\n openChar: string,\n closeChar: string,\n): number | null {\n let depth = 0;\n let quote: string | null = null;\n let escaped = false;\n let lineComment = false;\n let longString = false;\n\n for (let index = open; index < source.length; index += 1) {\n const char = source[index];\n const next = source[index + 1] ?? \"\";\n\n if (lineComment) {\n if (char === \"\\n\") lineComment = false;\n continue;\n }\n if (longString) {\n if (char === \"]\" && next === \"]\") {\n longString = false;\n index += 1;\n }\n continue;\n }\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n\n if (char === \"-\" && next === \"-\") {\n if (source[index + 2] === \"[\" && source[index + 3] === \"[\") {\n longString = true;\n index += 3;\n } else {\n lineComment = true;\n index += 1;\n }\n continue;\n }\n if (char === \"[\" && next === \"[\") {\n longString = true;\n index += 1;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n\n if (char === openChar) depth += 1;\n else if (char === closeChar) {\n depth -= 1;\n if (depth === 0) return index;\n }\n }\n\n return null;\n}\n\nfunction topLevelFieldRanges(\n source: string,\n open: number,\n close: number,\n): Array<{ name: string; value: SourceRange }> {\n const fields: Array<{ name: string; value: SourceRange }> = [];\n let start = open + 1;\n let round = 0;\n let square = 0;\n let curly = 0;\n let quote: string | null = null;\n let escaped = false;\n\n const addField = (segmentStart: number, segmentEnd: number) => {\n const segment = source.slice(segmentStart, segmentEnd);\n let equals = -1;\n let r = 0;\n let sq = 0;\n let cu = 0;\n let q: string | null = null;\n let esc = false;\n for (let i = 0; i < segment.length; i += 1) {\n const char = segment[i];\n if (q) {\n if (esc) esc = false;\n else if (char === \"\\\\\") esc = true;\n else if (char === q) q = null;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n q = char;\n continue;\n }\n if (char === \"(\") r += 1;\n else if (char === \")\") r = Math.max(0, r - 1);\n else if (char === \"[\") sq += 1;\n else if (char === \"]\") sq = Math.max(0, sq - 1);\n else if (char === \"{\") cu += 1;\n else if (char === \"}\") cu = Math.max(0, cu - 1);\n else if (char === \"=\" && r === 0 && sq === 0 && cu === 0) {\n equals = i;\n break;\n }\n }\n if (equals < 0) return;\n const key = segment.slice(0, equals).trim();\n const name =\n key.match(/^([A-Za-z_][A-Za-z0-9_]*)$/)?.[1] ??\n key.match(/^\\[\\s*[\"']([^\"']+)[\"']\\s*\\]$/)?.[1] ??\n null;\n if (!name || NON_BINDABLE_HOST_FIELDS.has(name)) return;\n let valueStart = segmentStart + equals + 1;\n while (valueStart < segmentEnd && /\\s/.test(source[valueStart]))\n valueStart += 1;\n fields.push({ name, value: { start: valueStart, end: segmentEnd } });\n };\n\n for (let index = open + 1; index < close; index += 1) {\n const char = source[index];\n if (quote) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === quote) quote = null;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n quote = char;\n continue;\n }\n if (char === \"(\") round += 1;\n else if (char === \")\") round = Math.max(0, round - 1);\n else if (char === \"[\") square += 1;\n else if (char === \"]\") square = Math.max(0, square - 1);\n else if (char === \"{\") curly += 1;\n else if (char === \"}\") curly = Math.max(0, curly - 1);\n else if (char === \",\" && round === 0 && square === 0 && curly === 0) {\n addField(start, index);\n start = index + 1;\n }\n }\n addField(start, close);\n return fields;\n}\n\nfunction hostPropValueRanges(source: string): SourceRange[] {\n const ranges: SourceRange[] = [];\n const hostCall =\n /\\b(?:React\\.)?createElement\\s*\\(\\s*(?:\"[^\"]+\"|'[^']+')\\s*,\\s*\\{/g;\n for (const match of source.matchAll(hostCall)) {\n const open = match.index + match[0].lastIndexOf(\"{\");\n const close = matchingDelimiter(source, open, \"{\", \"}\");\n if (close === null) continue;\n for (const field of topLevelFieldRanges(source, open, close))\n ranges.push(field.value);\n }\n return ranges;\n}\n\nfunction exportedComponentImplementationName(source: string): string | null {\n const directMemo = source.match(\n /\\breturn\\s+(?:React\\.)?memo\\s*\\(\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*\\)\\s*$/,\n )?.[1];\n if (directMemo) return directMemo;\n\n const exported = exportedFunctionName(source);\n if (!exported) return null;\n if (findFunctionParameters(source, exported) !== null) return exported;\n\n const escaped = exported.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return (\n source.match(\n new RegExp(\n `\\\\blocal\\\\s+${escaped}\\\\s*=\\\\s*(?:React\\\\.)?memo\\\\s*\\\\(\\\\s*([A-Za-z_][A-Za-z0-9_]*)`,\n ),\n )?.[1] ?? null\n );\n}\n\nfunction findBindingCompatibleComponentProps(\n source: string,\n): Set<string> | null {\n const exported = exportedComponentImplementationName(source);\n if (!exported) return null;\n const parametersText = findFunctionParameters(source, exported);\n if (parametersText === null) return null;\n const firstParameter = splitTopLevelParameters(parametersText)[0] ?? \"\";\n const propsName = firstParameter.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (!propsName) return null;\n\n const ranges = hostPropValueRanges(source);\n if (ranges.length === 0) return null;\n const escapedProps = propsName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const readPattern = new RegExp(\n `\\\\b${escapedProps}\\\\.([A-Za-z_][A-Za-z0-9_]*)\\\\b|\\\\b${escapedProps}\\\\[\\\\s*[\"']([^\"']+)[\"']\\\\s*\\\\]`,\n \"g\",\n );\n const reads = new Map<string, number[]>();\n for (const match of source.matchAll(readPattern)) {\n const property = match[1] ?? match[2];\n if (!property || match.index === undefined) continue;\n const offsets = reads.get(property) ?? [];\n offsets.push(match.index);\n reads.set(property, offsets);\n }\n\n const compatible = new Set<string>();\n for (const [property, offsets] of reads) {\n if (\n offsets.length > 0 &&\n offsets.every((offset) =>\n ranges.some((range) => offset >= range.start && offset < range.end),\n )\n ) {\n compatible.add(property);\n }\n }\n return compatible.size > 0 ? compatible : null;\n}\n\nfunction findStaticIterationTables(source: string): Set<string> | null {\n const match = /^return\\s*\\{/m.exec(source);\n if (!match || match.index === undefined) return null;\n const open = match.index + match[0].lastIndexOf(\"{\");\n const close = matchingDelimiter(source, open, \"{\", \"}\");\n if (close === null) return null;\n\n const result = new Set<string>([\"\"]);\n for (const field of topLevelFieldRanges(source, open, close)) {\n const valueText = source\n .slice(field.value.start, field.value.end)\n .trimStart();\n if (!valueText.startsWith(\"{\")) continue;\n result.add(field.name);\n }\n return result;\n}\n\nexport function buildProjectModel(\n root: string,\n candidates: ScanFileInput[],\n options: ProjectModelBuildOptions = {},\n): ProjectModel {\n const analyses: ProjectModelModuleAnalysis[] = [];\n\n for (const candidate of candidates) {\n if (\n candidate.source === undefined &&\n !fs.existsSync(candidate.absolutePath)\n ) continue;\n\n const relativePath = (candidate.relativePath ?? path.relative(root, candidate.absolutePath))\n .split(path.sep)\n .join(\"/\");\n const hash = options.fileHashes?.[relativePath] ?? \"\";\n const cached = options.moduleCache?.get(relativePath);\n if (cached && hash && cached.hash === hash) {\n analyses.push(cached.analysis);\n continue;\n }\n\n const source = candidate.source ?? fs.readFileSync(candidate.absolutePath, \"utf8\");\n const id = relativePath.toLowerCase();\n const record: SourceRecord = { id, source, keys: moduleKeys(relativePath) };\n const memoArguments = findMemoCall(source);\n const analysis: ProjectModelModuleAnalysis = {\n record,\n memoized: memoArguments === null\n ? undefined\n : hasTopLevelComma(memoArguments) ? \"custom\" : \"shallow\",\n bindingHook: findBindingCandidateHook(source) ?? undefined,\n callbackFunction: findExternalCallbackFunction(source) ?? undefined,\n bindingCompatibleProps: findBindingCompatibleComponentProps(source) ?? undefined,\n staticIterationTables: findStaticIterationTables(source) ?? undefined,\n conditionalHookMode: findConditionalHookMode(source) ?? undefined,\n declaredMethods: findDeclaredMethods(source),\n };\n analyses.push(analysis);\n if (options.moduleCache && hash) options.moduleCache.set(relativePath, { hash, analysis });\n }\n\n const records = analyses.map((analysis) => analysis.record);\n const memoizedByModule = new Map<string, \"shallow\" | \"custom\">();\n const bindingHooksByModule = new Map<string, BindingCandidateHookSummary>();\n const callbackFunctionsByModule = new Map<string, ExternalCallbackFunctionSummary>();\n const bindingCompatibleComponentPropsByModule = new Map<string, Set<string>>();\n const staticIterationTablesByModule = new Map<string, Set<string>>();\n const conditionalHookModesByModule = new Map<string, ConditionalHookModeSummary>();\n\n for (const analysis of analyses) {\n const id = analysis.record.id;\n if (analysis.memoized) memoizedByModule.set(id, analysis.memoized);\n if (analysis.bindingHook) bindingHooksByModule.set(id, { ...analysis.bindingHook });\n if (analysis.callbackFunction) callbackFunctionsByModule.set(id, {\n ...analysis.callbackFunction,\n callbackParameterIndexes: [...analysis.callbackFunction.callbackParameterIndexes],\n });\n if (analysis.bindingCompatibleProps) bindingCompatibleComponentPropsByModule.set(id, new Set(analysis.bindingCompatibleProps));\n if (analysis.staticIterationTables) staticIterationTablesByModule.set(id, new Set(analysis.staticIterationTables));\n if (analysis.conditionalHookMode) conditionalHookModesByModule.set(id, {\n ...analysis.conditionalHookMode,\n parameterIndexes: [...analysis.conditionalHookMode.parameterIndexes],\n parameterNames: [...analysis.conditionalHookMode.parameterNames],\n conditionVariables: { ...analysis.conditionalHookMode.conditionVariables },\n knownCallSites: 0,\n dynamicCallSites: 0,\n });\n }\n\n const conditionalHookModes = buildUniqueFeatureAliases(\n records,\n conditionalHookModesByModule,\n );\n collectConditionalHookModeCallSites(records, conditionalHookModes);\n\n let changed = true;\n while (changed) {\n changed = false;\n const aliases = buildUniqueFeatureAliases(records, bindingHooksByModule);\n for (const record of records) {\n if (bindingHooksByModule.has(record.id)) continue;\n const derived = findDerivedBindingCandidateHook(record.source, aliases);\n if (!derived) continue;\n bindingHooksByModule.set(record.id, derived);\n changed = true;\n }\n }\n\n return {\n memoizedModules: buildUniqueFeatureAliases(records, memoizedByModule),\n bindingCandidateHooks: buildUniqueFeatureAliases(records, bindingHooksByModule),\n externalCallbackModules: buildUniqueFeatureAliases(records, callbackFunctionsByModule),\n bindingApiAlternatives: findBindingApiAlternativesFromMethodMaps(\n analyses.map((analysis) => analysis.declaredMethods),\n ),\n bindingCompatibleComponentProps: buildUniqueFeatureAliases(\n records,\n bindingCompatibleComponentPropsByModule,\n ),\n staticIterationTables: buildUniqueFeatureAliases(\n records,\n staticIterationTablesByModule,\n ),\n conditionalHookModes,\n sourceEffects: new Map(),\n };\n}\n",
21
+ "import path from \"node:path\";\n\nexport interface ModuleIdentity {\n id: string;\n keys: string[];\n}\n\nfunction normalizeRelative(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nexport function moduleKeys(relativePath: string): string[] {\n let normalized = normalizeRelative(relativePath).replace(/\\.(?:lua|luau)$/i, \"\");\n if (normalized.endsWith(\"/init\")) normalized = normalized.slice(0, -\"/init\".length);\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments[0]?.toLowerCase() === \"src\") segments.shift();\n\n const keys = new Set<string>();\n for (let index = 0; index < segments.length; index += 1) {\n const suffix = segments.slice(index).join(\".\").toLowerCase();\n if (suffix) keys.add(suffix);\n }\n return [...keys];\n}\n\nexport function normalizeRequireTarget(text: string): string {\n return (text.match(/[A-Za-z_][A-Za-z0-9_]*/g) ?? []).join(\".\").toLowerCase();\n}\n\nfunction isSegmentSuffix(target: string, key: string): boolean {\n return target === key || target.endsWith(`.${key}`);\n}\n\n/**\n * Builds feature aliases only when an alias uniquely identifies one module in\n * the entire project. This prevents basename collisions and overlapping names\n * when one module name is merely a suffix of another or when multiple\n * directories contain modules with the same basename.\n */\nexport function buildUniqueFeatureAliases<T>(\n modules: ModuleIdentity[],\n featureByModuleId: Map<string, T>,\n): Map<string, T> {\n const owners = new Map<string, Set<string>>();\n for (const module of modules) {\n for (const key of module.keys) {\n const ids = owners.get(key) ?? new Set<string>();\n ids.add(module.id);\n owners.set(key, ids);\n }\n }\n\n const aliases = new Map<string, T>();\n for (const module of modules) {\n const value = featureByModuleId.get(module.id);\n if (value === undefined) continue;\n for (const key of module.keys) {\n const ids = owners.get(key);\n if (ids?.size === 1 && ids.has(module.id)) aliases.set(key, value);\n }\n }\n return aliases;\n}\n\nexport function resolveModuleReference<T>(target: string, aliases: Map<string, T>): T | null {\n let bestKey: string | null = null;\n let bestValue: T | null = null;\n\n for (const [key, value] of aliases) {\n if (!isSegmentSuffix(target, key)) continue;\n if (bestKey === null || key.length > bestKey.length) {\n bestKey = key;\n bestValue = value;\n }\n }\n\n return bestValue;\n}\n",
22
+ "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Node as SyntaxNode, Tree } from \"web-tree-sitter\";\nimport {\n buildUniqueFeatureAliases,\n moduleKeys,\n normalizeRequireTarget,\n resolveModuleReference,\n type ModuleIdentity,\n} from \"./module-resolution\";\nimport { parseLuau } from \"./parser\";\nimport type { ScanFileInput, SourceEffectModuleSummary } from \"./types\";\n\n\nexport interface ProjectEffectParseCacheEntry {\n source: string;\n tree: Tree;\n}\n\nexport interface CachedSourceEffectFunction {\n id: string;\n moduleId: string;\n localName: string | null;\n memberName: string | null;\n exported: boolean;\n directEffect: boolean;\n dependencies: string[];\n}\n\nexport interface CachedSourceEffectModule {\n hash: string;\n id: string;\n keys: string[];\n importedModuleIds: string[];\n functions: CachedSourceEffectFunction[];\n instanceFactories: string[];\n}\n\nexport interface ProjectSourceEffectsBuildResult {\n effects: Map<string, SourceEffectModuleSummary>;\n cacheModules: Record<string, CachedSourceEffectModule>;\n}\n\nexport type ProjectEffectsProgressPhase =\n | \"parse\"\n | \"index-functions\"\n | \"analyze-calls\"\n | \"assemble-graph\"\n | \"resolve\"\n | \"propagate\"\n | \"summarize\";\n\nexport interface ProjectEffectsProgress {\n phase: ProjectEffectsProgressPhase;\n current: number;\n total: number;\n file?: string;\n}\n\ninterface ParsedRecord extends ModuleIdentity {\n source: string;\n tree: Tree;\n exportName: string | null;\n imports: Map<string, string>;\n}\n\ninterface FunctionRecord {\n id: string;\n moduleId: string;\n localName: string | null;\n memberName: string | null;\n exported: boolean;\n method: boolean;\n node: SyntaxNode;\n body: SyntaxNode;\n parameters: string[];\n directEffect: boolean;\n dependencies: Set<string>;\n}\n\nfunction normalizeRelative(value: string): string {\n return value.split(path.sep).join(\"/\");\n}\n\nfunction child(node: SyntaxNode, type: string): SyntaxNode | null {\n return node.namedChildren.find((candidate) => candidate.type === type) ?? null;\n}\n\nfunction topLevelReturnName(root: SyntaxNode): string | null {\n for (const node of [...root.namedChildren].reverse()) {\n if (node.type !== \"return_statement\") continue;\n const expressions = child(node, \"expression_list\");\n const value = expressions?.namedChildren[0];\n if (value?.type === \"identifier\") return value.text;\n return null;\n }\n return null;\n}\n\nfunction parameterNames(node: SyntaxNode): string[] {\n const parameters = child(node, \"parameters\");\n if (!parameters) return [];\n const result: string[] = [];\n for (const parameter of parameters.namedChildren) {\n if (parameter.type !== \"parameter\") continue;\n const identifier = parameter.namedChildren.find((candidate) => candidate.type === \"identifier\");\n if (identifier) result.push(identifier.text);\n }\n return result;\n}\n\nfunction declarationParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"variable_declaration\") return { names: [], expressions: [] };\n const assignment = child(node, \"assignment_statement\");\n const variables = assignment ? child(assignment, \"variable_list\") : child(node, \"variable_list\");\n const expressions = assignment ? child(assignment, \"expression_list\") : null;\n return {\n names: variables?.namedChildren.filter((candidate) => candidate.type === \"identifier\").map((candidate) => candidate.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction assignmentSides(node: SyntaxNode): { left: SyntaxNode[]; right: SyntaxNode[] } {\n if (node.type !== \"assignment_statement\") return { left: [], right: [] };\n return {\n left: child(node, \"variable_list\")?.namedChildren ?? [],\n right: child(node, \"expression_list\")?.namedChildren ?? [],\n };\n}\n\nfunction callPath(node: SyntaxNode): string | null {\n if (node.type !== \"function_call\") return null;\n const name = node.childForFieldName(\"name\") ?? node.namedChildren[0];\n return name ? name.text.replace(/\\s+/g, \"\") : null;\n}\n\nfunction rootIdentifier(node: SyntaxNode | null | undefined): string | null {\n if (!node) return null;\n if (node.type === \"identifier\") return node.text;\n if (\n node.type === \"dot_index_expression\" ||\n node.type === \"bracket_index_expression\" ||\n node.type === \"method_index_expression\"\n ) {\n return rootIdentifier(node.namedChildren[0]);\n }\n const text = node.text.trim();\n return text.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1] ?? null;\n}\n\nfunction directNodes(body: SyntaxNode): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n const visit = (node: SyntaxNode): void => {\n if (node !== body && (node.type === \"function_definition\" || node.type === \"function_declaration\")) return;\n result.push(node);\n for (const candidate of node.namedChildren) visit(candidate);\n };\n visit(body);\n return result;\n}\n\nfunction topLevelFunctionRecords(record: ParsedRecord): FunctionRecord[] {\n const functions: FunctionRecord[] = [];\n let anonymousExportIndex = 0;\n\n const add = (\n node: SyntaxNode,\n body: SyntaxNode | null,\n nameText: string | null,\n localName: string | null,\n memberName: string | null,\n method: boolean,\n exported: boolean,\n ): void => {\n if (!body) return;\n const key = memberName ? `member:${memberName}` : localName ? `local:${localName}` : `export:${anonymousExportIndex++}`;\n functions.push({\n id: `${record.id}::${key}`,\n moduleId: record.id,\n localName,\n memberName,\n exported,\n method,\n node,\n body,\n parameters: parameterNames(node),\n directEffect: false,\n dependencies: new Set<string>(),\n });\n };\n\n for (const node of record.tree.rootNode.namedChildren) {\n if (node.type === \"function_declaration\") {\n const nameNode = node.namedChildren.find((candidate) =>\n [\"identifier\", \"dot_index_expression\", \"method_index_expression\"].includes(candidate.type),\n );\n const body = child(node, \"block\");\n const text = nameNode?.text.replace(/\\s+/g, \"\") ?? \"\";\n const methodMatch = text.match(/^([A-Za-z_][A-Za-z0-9_]*)[:.]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (methodMatch && methodMatch[1] === record.exportName) {\n add(node, body, text, null, methodMatch[2], nameNode?.type === \"method_index_expression\", false);\n } else if (nameNode?.type === \"identifier\") {\n add(node, body, text, text, null, false, record.exportName === text);\n }\n continue;\n }\n\n if (node.type === \"variable_declaration\") {\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (expression?.type !== \"function_definition\") continue;\n add(expression, child(expression, \"block\"), names[index], names[index], null, false, record.exportName === names[index]);\n }\n continue;\n }\n\n if (node.type === \"assignment_statement\") {\n const { left, right } = assignmentSides(node);\n for (let index = 0; index < left.length; index += 1) {\n const expression = right[index] ?? right[0];\n if (expression?.type !== \"function_definition\") continue;\n const text = left[index].text.replace(/\\s+/g, \"\");\n const memberMatch = text.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (memberMatch && memberMatch[1] === record.exportName) {\n add(expression, child(expression, \"block\"), text, null, memberMatch[2], text.includes(\":\"), false);\n }\n }\n continue;\n }\n\n if (node.type === \"return_statement\") {\n const expressions = child(node, \"expression_list\");\n const expression = expressions?.namedChildren[0];\n if (expression?.type === \"function_definition\") add(expression, child(expression, \"block\"), null, null, null, false, true);\n }\n }\n\n return functions;\n}\n\n\nfunction returnedFactoryMember(fn: FunctionRecord, moduleExportName: string | null): boolean {\n if (!fn.memberName || !moduleExportName) return false;\n const header = fn.node.text.slice(0, Math.max(0, fn.body.startIndex - fn.node.startIndex));\n const escaped = moduleExportName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (new RegExp(`:\\\\s*${escaped}\\\\b`).test(header)) return true;\n\n for (const node of directNodes(fn.body)) {\n if (node.type !== \"return_statement\") continue;\n if (new RegExp(`\\\\bsetmetatable\\\\s*\\\\([\\\\s\\\\S]*?\\\\b${escaped}\\\\b`).test(node.text)) return true;\n }\n return false;\n}\n\nfunction moduleLevelInstanceAliases(record: ParsedRecord, summariesByModuleId: Map<string, SourceEffectModuleSummary>): Map<string, string> {\n const result = new Map<string, string>();\n for (const node of record.tree.rootNode.namedChildren) {\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (expression?.type !== \"function_call\") continue;\n const path = callPath(expression);\n const match = path?.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) continue;\n const moduleId = record.imports.get(match[1]);\n const summary = moduleId ? summariesByModuleId.get(moduleId) : null;\n if (moduleId && summary?.instanceFactories.has(match[2])) result.set(names[index], moduleId);\n }\n }\n return result;\n}\n\nfunction analyzeFunction(\n fn: FunctionRecord,\n record: ParsedRecord,\n localFunctions: Map<string, string>,\n memberFunctions: Map<string, string>,\n moduleSummaries: Map<string, SourceEffectModuleSummary>,\n moduleInstances: Map<string, string>,\n exportedFunctions: Map<string, string>,\n): void {\n const parameters = new Set(fn.parameters);\n if (fn.method) parameters.add(\"self\");\n const locals = new Set<string>();\n const owned = new Set<string>();\n const externalAliases = new Set<string>();\n const instanceAliases = new Map(moduleInstances);\n const nodes = directNodes(fn.body);\n\n for (const node of nodes) {\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n locals.add(name);\n if (!expression) continue;\n if (expression.type === \"table_constructor\" || expression.type === \"function_definition\") owned.add(name);\n const root = rootIdentifier(expression);\n if (root && (parameters.has(root) || externalAliases.has(root) || (!locals.has(root) && root !== name))) {\n externalAliases.add(name);\n } else if (root && owned.has(root)) {\n owned.add(name);\n }\n\n if (expression.type === \"function_call\") {\n const path = callPath(expression);\n const match = path?.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (match) {\n const moduleId = record.imports.get(match[1]);\n const summary = moduleId ? moduleSummaries.get(moduleId) : null;\n if (moduleId && summary?.instanceFactories.has(match[2])) instanceAliases.set(name, moduleId);\n }\n }\n }\n }\n\n // Luau locals are lexically scoped from their declaration onward, so the\n // source-order pass above is enough to propagate aliases through local\n // declarations. Repeated fixed-point rescans of every function body were\n // redundant and particularly expensive on large modules.\n for (const node of nodes) {\n if (node.type === \"assignment_statement\" && node.parent?.type !== \"variable_declaration\") {\n const { left } = assignmentSides(node);\n for (const target of left) {\n if (target.type === \"identifier\") {\n if (!locals.has(target.text) && !parameters.has(target.text)) fn.directEffect = true;\n continue;\n }\n const root = rootIdentifier(target);\n if (!root) continue;\n if (owned.has(root)) continue;\n if (parameters.has(root) || externalAliases.has(root) || !locals.has(root)) fn.directEffect = true;\n }\n continue;\n }\n\n if (node.type !== \"function_call\") continue;\n const path = callPath(node);\n if (!path) continue;\n\n const localTarget = localFunctions.get(path);\n if (localTarget) fn.dependencies.add(localTarget);\n\n const sameMember = path.match(/^(?:self|[A-Za-z_][A-Za-z0-9_]*)[:.]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (sameMember) {\n const receiver = path.split(/[.:]/, 1)[0];\n if (receiver === \"self\" || receiver === record.exportName) {\n const target = memberFunctions.get(sameMember[1]);\n if (target) fn.dependencies.add(target);\n }\n }\n\n const importedMember = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (importedMember) {\n const moduleId = record.imports.get(importedMember[1]) ?? instanceAliases.get(importedMember[1]);\n if (moduleId) fn.dependencies.add(`${moduleId}::member:${importedMember[2]}`);\n } else {\n const moduleId = record.imports.get(path);\n const target = moduleId ? exportedFunctions.get(moduleId) : null;\n if (target) fn.dependencies.add(target);\n }\n }\n}\n\nexport async function buildProjectSourceEffects(\n root: string,\n candidates: ScanFileInput[],\n parseCache?: Map<string, ProjectEffectParseCacheEntry>,\n onProgress?: (progress: ProjectEffectsProgress) => void,\n fileHashes: Readonly<Record<string, string>> = {},\n cachedModules: Readonly<Record<string, CachedSourceEffectModule>> = {},\n): Promise<ProjectSourceEffectsBuildResult> {\n interface CandidateIdentity extends ModuleIdentity {\n relativePath: string;\n candidate: ScanFileInput;\n hash: string;\n }\n\n const identities: CandidateIdentity[] = [];\n for (const candidate of candidates) {\n const relativePath = normalizeRelative(candidate.relativePath ?? path.relative(root, candidate.absolutePath));\n const id = relativePath.toLowerCase();\n identities.push({\n id,\n keys: moduleKeys(relativePath),\n relativePath,\n candidate,\n hash: fileHashes[relativePath] ?? \"\",\n });\n }\n\n const moduleIdFeatures = new Map(identities.map((record) => [record.id, record.id] as const));\n const moduleAliases = buildUniqueFeatureAliases(identities, moduleIdFeatures);\n const currentIds = new Set(identities.map((identity) => identity.id));\n const cachedIds = new Set(Object.values(cachedModules).map((module) => module.id));\n const sameFileSet = currentIds.size === cachedIds.size && [...currentIds].every((id) => cachedIds.has(id));\n\n const dirtyIds = new Set<string>();\n if (!sameFileSet) {\n for (const identity of identities) dirtyIds.add(identity.id);\n } else {\n for (const identity of identities) {\n const cached = cachedModules[identity.relativePath];\n if (!cached || cached.hash !== identity.hash) dirtyIds.add(identity.id);\n }\n\n // A changed module can alter whether one of its members is an instance\n // factory. Re-analyze direct importers so instance-method dependencies are\n // refreshed, while all other unchanged modules keep their cached graph.\n if (dirtyIds.size > 0) {\n for (const module of Object.values(cachedModules)) {\n if (module.importedModuleIds.some((moduleId) => dirtyIds.has(moduleId))) dirtyIds.add(module.id);\n }\n }\n }\n\n const rawRecords = new Map<string, ParsedRecord>();\n onProgress?.({ phase: \"parse\", current: 0, total: candidates.length });\n for (let candidateIndex = 0; candidateIndex < identities.length; candidateIndex += 1) {\n const identity = identities[candidateIndex];\n const { candidate, relativePath } = identity;\n try {\n if (!dirtyIds.has(identity.id)) continue;\n if (candidate.source === undefined && !fs.existsSync(candidate.absolutePath)) continue;\n const source = candidate.source ?? fs.readFileSync(candidate.absolutePath, \"utf8\");\n const tree = await parseLuau(source);\n parseCache?.set(relativePath, { source, tree });\n const imports = new Map<string, string>();\n for (const match of source.matchAll(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)/gs)) {\n const moduleId = resolveModuleReference(normalizeRequireTarget(match[2]), moduleAliases);\n if (moduleId) imports.set(match[1], moduleId);\n }\n rawRecords.set(identity.id, {\n id: identity.id,\n keys: identity.keys,\n source,\n tree,\n exportName: topLevelReturnName(tree.rootNode),\n imports,\n });\n } catch {\n // Parse diagnostics are handled by the normal scanner. An unparseable module\n // simply cannot contribute source-derived effect information.\n } finally {\n onProgress?.({ phase: \"parse\", current: candidateIndex + 1, total: candidates.length, file: relativePath });\n }\n }\n\n const functionIndexTotal = Math.max(1, identities.length * 2);\n onProgress?.({ phase: \"index-functions\", current: 0, total: functionIndexTotal });\n\n const functionsByModule = new Map<string, FunctionRecord[]>();\n const cachedFunctionStates = new Map<string, CachedSourceEffectFunction[]>();\n const importedModuleIdsByModule = new Map<string, string[]>();\n const summariesByModuleId = new Map<string, SourceEffectModuleSummary>();\n\n for (const identity of identities) {\n const record = rawRecords.get(identity.id);\n if (record) {\n const functions = topLevelFunctionRecords(record);\n functionsByModule.set(identity.id, functions);\n importedModuleIdsByModule.set(identity.id, [...new Set(record.imports.values())].sort());\n const summary: SourceEffectModuleSummary = {\n effectfulMembers: new Set<string>(),\n effectfulExport: false,\n instanceFactories: new Set<string>(),\n };\n for (const fn of functions) {\n if (fn.memberName && returnedFactoryMember(fn, record.exportName)) summary.instanceFactories.add(fn.memberName);\n }\n summariesByModuleId.set(identity.id, summary);\n const indexedCount = summariesByModuleId.size;\n if ((indexedCount & 63) === 0 || indexedCount === identities.length) {\n onProgress?.({ phase: \"index-functions\", current: indexedCount, total: functionIndexTotal });\n }\n continue;\n }\n\n const cached = cachedModules[identity.relativePath];\n cachedFunctionStates.set(identity.id, cached?.functions ?? []);\n importedModuleIdsByModule.set(identity.id, cached?.importedModuleIds ?? []);\n summariesByModuleId.set(identity.id, {\n effectfulMembers: new Set<string>(),\n effectfulExport: false,\n instanceFactories: new Set(cached?.instanceFactories ?? []),\n });\n const indexedCount = summariesByModuleId.size;\n if ((indexedCount & 63) === 0 || indexedCount === identities.length) {\n onProgress?.({ phase: \"index-functions\", current: indexedCount, total: functionIndexTotal });\n }\n }\n\n const exportedFunctions = new Map<string, string>();\n for (let identityIndex = 0; identityIndex < identities.length; identityIndex += 1) {\n const identity = identities[identityIndex];\n const parsedFunctions = functionsByModule.get(identity.id);\n if (parsedFunctions) {\n const exported = parsedFunctions.find((fn) => fn.exported && !fn.memberName);\n if (exported) exportedFunctions.set(identity.id, exported.id);\n } else {\n const exported = (cachedFunctionStates.get(identity.id) ?? []).find((fn) => fn.exported && !fn.memberName);\n if (exported) exportedFunctions.set(identity.id, exported.id);\n }\n if ((identityIndex & 63) === 63 || identityIndex + 1 === identities.length) {\n onProgress?.({ phase: \"index-functions\", current: identities.length + identityIndex + 1, total: functionIndexTotal });\n }\n }\n\n const callAnalysisTotal = Math.max(1, rawRecords.size);\n onProgress?.({ phase: \"analyze-calls\", current: 0, total: callAnalysisTotal });\n let analyzedModuleCount = 0;\n for (const [moduleId, record] of rawRecords) {\n const localFunctions = new Map<string, string>();\n const memberFunctions = new Map<string, string>();\n for (const fn of functionsByModule.get(moduleId) ?? []) {\n if (fn.localName) localFunctions.set(fn.localName, fn.id);\n if (fn.memberName) memberFunctions.set(fn.memberName, fn.id);\n }\n const moduleInstances = moduleLevelInstanceAliases(record, summariesByModuleId);\n for (const fn of functionsByModule.get(moduleId) ?? []) {\n analyzeFunction(fn, record, localFunctions, memberFunctions, summariesByModuleId, moduleInstances, exportedFunctions);\n }\n analyzedModuleCount += 1;\n if ((analyzedModuleCount & 31) === 0 || analyzedModuleCount === rawRecords.size) {\n onProgress?.({ phase: \"analyze-calls\", current: analyzedModuleCount, total: callAnalysisTotal });\n }\n }\n\n const graphAssemblyTotal = Math.max(1, identities.length);\n onProgress?.({ phase: \"assemble-graph\", current: 0, total: graphAssemblyTotal });\n const functionStates = new Map<string, CachedSourceEffectFunction>();\n const cacheModulesResult: Record<string, CachedSourceEffectModule> = {};\n let assembledCount = 0;\n for (const identity of identities) {\n const parsedFunctions = functionsByModule.get(identity.id);\n const states: CachedSourceEffectFunction[] = parsedFunctions\n ? parsedFunctions.map((fn) => ({\n id: fn.id,\n moduleId: fn.moduleId,\n localName: fn.localName,\n memberName: fn.memberName,\n exported: fn.exported,\n directEffect: fn.directEffect,\n dependencies: [...fn.dependencies].sort(),\n }))\n : (cachedFunctionStates.get(identity.id) ?? []).map((fn) => ({ ...fn, dependencies: [...fn.dependencies] }));\n for (const fn of states) functionStates.set(fn.id, fn);\n const summary = summariesByModuleId.get(identity.id)!;\n cacheModulesResult[identity.relativePath] = {\n hash: identity.hash,\n id: identity.id,\n keys: identity.keys,\n importedModuleIds: importedModuleIdsByModule.get(identity.id) ?? [],\n functions: states,\n instanceFactories: [...summary.instanceFactories].sort(),\n };\n assembledCount += 1;\n if ((assembledCount & 63) === 0 || assembledCount === identities.length) {\n onProgress?.({ phase: \"assemble-graph\", current: assembledCount, total: graphAssemblyTotal });\n }\n }\n\n // Build a reverse dependency graph once, then propagate effectfulness only\n // through callers that can actually become affected. This avoids repeatedly\n // rescanning every function until a fixed point is reached.\n const reverseDependencies = new Map<string, string[]>();\n const functions = [...functionStates.values()];\n onProgress?.({ phase: \"resolve\", current: 0, total: functions.length });\n for (let index = 0; index < functions.length; index += 1) {\n const fn = functions[index];\n for (const dependency of fn.dependencies) {\n if (!functionStates.has(dependency)) continue;\n const dependents = reverseDependencies.get(dependency);\n if (dependents) dependents.push(fn.id);\n else reverseDependencies.set(dependency, [fn.id]);\n }\n if ((index & 127) === 127 || index + 1 === functions.length) {\n onProgress?.({ phase: \"resolve\", current: index + 1, total: functions.length });\n }\n }\n\n const effectful = new Set<string>();\n const queue: string[] = [];\n for (const fn of functions) {\n if (!fn.directEffect) continue;\n effectful.add(fn.id);\n queue.push(fn.id);\n }\n\n onProgress?.({ phase: \"propagate\", current: 0, total: Math.max(1, functions.length) });\n let queueIndex = 0;\n while (queueIndex < queue.length) {\n const effectfulId = queue[queueIndex++];\n for (const dependent of reverseDependencies.get(effectfulId) ?? []) {\n if (effectful.has(dependent)) continue;\n effectful.add(dependent);\n queue.push(dependent);\n }\n if ((queueIndex & 63) === 0 || queueIndex === queue.length) {\n onProgress?.({ phase: \"propagate\", current: Math.min(queueIndex, Math.max(1, functions.length)), total: Math.max(1, functions.length) });\n }\n }\n // The work queue may visit only the effectful subset of the graph. Explicitly\n // mark the phase complete once the queue is exhausted instead of leaving a\n // partially filled progress bar behind.\n onProgress?.({ phase: \"propagate\", current: Math.max(1, functions.length), total: Math.max(1, functions.length) });\n\n const summarizeTotal = Math.max(1, functions.length + 1);\n onProgress?.({ phase: \"summarize\", current: 0, total: summarizeTotal });\n for (const summary of summariesByModuleId.values()) {\n summary.effectfulMembers.clear();\n summary.effectfulExport = false;\n }\n for (let index = 0; index < functions.length; index += 1) {\n const fn = functions[index];\n if (effectful.has(fn.id)) {\n const summary = summariesByModuleId.get(fn.moduleId);\n if (summary) {\n if (fn.memberName) summary.effectfulMembers.add(fn.memberName);\n if (fn.exported) summary.effectfulExport = true;\n }\n }\n if ((index & 127) === 127 || index + 1 === functions.length) {\n onProgress?.({ phase: \"summarize\", current: index + 1, total: summarizeTotal });\n }\n }\n\n // Alias construction can still be noticeable on large projects, so reserve\n // the final progress unit until it is genuinely complete.\n const effects = buildUniqueFeatureAliases(identities, summariesByModuleId);\n onProgress?.({ phase: \"summarize\", current: summarizeTotal, total: summarizeTotal });\n\n return {\n effects,\n cacheModules: cacheModulesResult,\n };\n}\n\n",
23
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { RuleContext } from \"./types\";\n\n/**\n * Engine members that are documented/known to yield. The analyzer intentionally\n * matches exact member names instead of every `*Async` function so custom\n * promise-style APIs do not become false positives merely because of naming.\n */\nconst YIELDING_ENGINE_MEMBERS = new Set([\n \"WaitForChild\",\n \"Wait\",\n \"GetAsync\",\n \"SetAsync\",\n \"UpdateAsync\",\n \"RemoveAsync\",\n \"IncrementAsync\",\n \"GetSortedAsync\",\n \"ListKeysAsync\",\n \"ListVersionsAsync\",\n \"GetVersionAsync\",\n \"PublishAsync\",\n \"SubscribeAsync\",\n \"RequestAsync\",\n \"PostAsync\",\n \"PreloadAsync\",\n \"ComputeAsync\",\n \"FilterStringAsync\",\n \"FilterStringForBroadcast\",\n \"FilterStringForPlayerAsync\",\n \"GetNonChatStringForBroadcastAsync\",\n \"GetNonChatStringForUserAsync\",\n \"GetChatForUserAsync\",\n \"AwardBadgeAsync\",\n \"UserHasBadgeAsync\",\n \"GetBadgeInfoAsync\",\n \"GetPolicyInfoForPlayerAsync\",\n \"GetTranslatorForPlayerAsync\",\n \"GetUserIdFromNameAsync\",\n \"GetNameFromUserIdAsync\",\n \"GetHumanoidDescriptionFromUserId\",\n \"GetHumanoidDescriptionFromOutfitId\",\n \"GetFriendsAsync\",\n \"GetUserThumbnailAsync\",\n \"GetUserInfosByUserIdsAsync\",\n \"GetGroupInfoAsync\",\n \"GetAlliesAsync\",\n \"GetEnemiesAsync\",\n \"GetGroupsAsync\",\n \"TeleportAsync\",\n \"ReserveServerAsync\",\n \"CreatePlaceAsync\",\n \"SavePlaceAsync\",\n \"LoadAsset\",\n \"LoadAssetVersion\",\n \"GetProductInfo\",\n \"CreateEditableImageAsync\",\n \"CreateEditableMeshAsync\",\n \"GetBundleDetailsAsync\",\n \"GetGamePlacesAsync\",\n \"GetDeveloperProductsAsync\",\n \"GetInventoryAsync\",\n \"GetItemDetailsAsync\",\n \"GetBatchItemDetailsAsync\",\n \"PromptCreateAssetAsync\",\n \"PromptImportAnimationClipFromVideoAsync\",\n \"GetAnimationClipAsync\",\n]);\n\nconst ROBLOX_MUTABLE_LEAFS = new Set([\n \"AbsolutePosition\",\n \"AbsoluteRotation\",\n \"AbsoluteSize\",\n \"AssemblyAngularVelocity\",\n \"AssemblyLinearVelocity\",\n \"CFrame\",\n \"Changed\",\n \"ContentSize\",\n \"CurrentCamera\",\n \"Enabled\",\n \"FocusLost\",\n \"Focused\",\n \"Heartbeat\",\n \"InputBegan\",\n \"InputChanged\",\n \"InputEnded\",\n \"Parent\",\n \"Position\",\n \"PreRender\",\n \"PreSimulation\",\n \"RenderStepped\",\n \"Rotation\",\n \"Size\",\n \"Stepped\",\n \"TextBounds\",\n \"Value\",\n \"ViewportSize\",\n \"WorldCFrame\",\n \"WorldPosition\",\n \"X\",\n \"Y\",\n]);\n\nconst INSTANCE_FACTORY_MEMBERS = new Set([\n \"Clone\",\n \"FindFirstAncestor\",\n \"FindFirstAncestorOfClass\",\n \"FindFirstAncestorWhichIsA\",\n \"FindFirstChild\",\n \"FindFirstChildOfClass\",\n \"FindFirstChildWhichIsA\",\n \"GetButton\",\n \"GetMouse\",\n \"GetService\",\n \"WaitForChild\",\n]);\n\nexport function finalCallMember(path: string): string {\n return path.split(/[.:]/).at(-1) ?? path;\n}\n\nexport function knownYieldReason(path: string): string | null {\n const normalized = path.replace(/\\s+/g, \"\");\n if (normalized === \"task.wait\") return \"task.wait\";\n if (normalized === \"coroutine.yield\") return \"coroutine.yield\";\n\n const member = finalCallMember(normalized);\n if (YIELDING_ENGINE_MEMBERS.has(member)) return member;\n return null;\n}\n\nexport function functionYieldPoint(node: SyntaxNode, context: RuleContext): { call: SyntaxNode; reason: string } | null {\n for (const candidate of context.walk(node)) {\n if (candidate.type !== \"function_call\") continue;\n const nearest = context.nearestFunction(candidate);\n const owner = context.model.functionByNode.get(`${node.type}:${node.startIndex}:${node.endIndex}`);\n if (owner && nearest !== owner) continue;\n const path = context.resolveCallPath(context.getCallPath(candidate) ?? \"\");\n const reason = knownYieldReason(path);\n if (reason) return { call: candidate, reason };\n }\n return null;\n}\n\nexport function isInstanceProducingExpression(node: SyntaxNode | undefined, context: RuleContext): boolean {\n if (!node) return false;\n\n const text = node.text.trim();\n if (/^(?:workspace|game|script)(?:\\.|:|$)/.test(text)) return true;\n\n for (const candidate of context.walk(node)) {\n if (candidate.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(candidate) ?? \"\");\n if (path === \"Instance.new\") return true;\n if (INSTANCE_FACTORY_MEMBERS.has(finalCallMember(path))) return true;\n }\n\n return false;\n}\n\nexport function mutableDependencyBase(path: string, externallyMutableRoots: Set<string>): string | null {\n const normalized = path.replace(/\\s+/g, \"\");\n if (/\\.current(?:\\.|$)/.test(normalized)) return \"\";\n\n const segments = normalized.split(\".\");\n if (segments.length < 2) return null;\n\n if (externallyMutableRoots.has(segments[0])) return segments[0];\n\n const mutableIndex = segments.findIndex((segment, index) => index > 0 && ROBLOX_MUTABLE_LEAFS.has(segment));\n if (mutableIndex <= 0) return null;\n\n const ownerPath = segments.slice(0, mutableIndex).join(\".\");\n const mutableLeaf = segments[mutableIndex];\n const signalLike = /(?:Changed|Began|Ended|Focused|Heartbeat|Stepped|PreRender|PreSimulation)$/.test(mutableLeaf);\n const objectLike = /(?:instance|attachment|camera|mouse|frame|gui|part|value|humanoid|sound|tween|workspace|root|viewport)/i.test(ownerPath);\n return signalLike || objectLike ? ownerPath : null;\n}\n",
24
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { FunctionInfo, RuleContext } from \"../types\";\nimport { rootIdentifier, sameNode } from \"../ast/walk\";\n\nexport const CONDITIONAL_TYPES = new Set([\n \"if_statement\",\n \"if_expression\",\n \"for_statement\",\n \"while_statement\",\n \"repeat_statement\",\n]);\n\nexport function isHookPath(path: string): boolean {\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return /^use[A-Z0-9_]/.test(final);\n}\n\n\nexport function assignmentTargetNode(statement: SyntaxNode): SyntaxNode {\n return statement.namedChildren[0] ?? statement;\n}\n\nexport function tableStartNode(table: SyntaxNode): SyntaxNode {\n return table.children.find((child) => child.type === \"{\") ?? table;\n}\n\nexport function identifierNode(node: SyntaxNode, name: string): SyntaxNode | null {\n const stack = [node];\n while (stack.length > 0) {\n const current = stack.pop()!;\n if (current.type === \"identifier\" && current.text === name) return current;\n for (let index = current.namedChildren.length - 1; index >= 0; index -= 1) stack.push(current.namedChildren[index]);\n }\n return null;\n}\n\nexport function callNameNode(call: SyntaxNode): SyntaxNode {\n return call.childForFieldName(\"name\") ?? call;\n}\n\nexport function fieldNameNode(field: SyntaxNode): SyntaxNode {\n return field.childForFieldName(\"name\") ?? field;\n}\n\nexport function firstFunctionArgument(context: RuleContext, call: SyntaxNode): SyntaxNode | null {\n return context.callArguments(call).find((arg) => arg.type === \"function_definition\") ?? null;\n}\n\nexport function directComponentForCall(context: RuleContext, call: SyntaxNode): FunctionInfo | null {\n const fn = context.nearestFunction(call);\n return fn?.isComponent ? fn : null;\n}\n\nexport function findAncestorBetween(node: SyntaxNode, stop: SyntaxNode, predicate: (node: SyntaxNode) => boolean): SyntaxNode | null {\n let current = node.parent;\n while (current && !sameNode(current, stop)) {\n if (predicate(current)) return current;\n current = current.parent;\n }\n return null;\n}\n\nexport function declarationNames(node: SyntaxNode): string[] {\n if (node.type !== \"variable_declaration\") return [];\n const beforeEquals = node.text.split(\"=\")[0] ?? \"\";\n return beforeEquals\n .replace(/^\\s*local\\s+/, \"\")\n .split(\",\")\n .map((piece) => piece.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1] ?? null)\n .filter((name): name is string => Boolean(name));\n}\n\nexport function callRoot(path: string): string | null {\n return rootIdentifier(path);\n}\n\nexport function isNestedInsideFunction(node: SyntaxNode, boundary: SyntaxNode): boolean {\n let current = node.parent;\n while (current && !sameNode(current, boundary)) {\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return true;\n current = current.parent;\n }\n return false;\n}\n\nexport function functionHasReturnedBefore(call: SyntaxNode, fn: FunctionInfo, context: RuleContext): boolean {\n if (!fn.body) return false;\n for (const node of context.walk(fn.body)) {\n if (node.endIndex > call.startIndex) continue;\n if (node.type !== \"return_statement\") continue;\n if (isNestedInsideFunction(node, fn.node)) continue;\n return true;\n }\n return false;\n}\n\nexport function parseDependencyRoots(node: SyntaxNode | undefined): Set<string> {\n const result = new Set<string>();\n if (!node || node.type !== \"table_constructor\") return result;\n\n for (const child of node.namedChildren) {\n const root = rootIdentifier(child.text);\n if (root) result.add(root);\n }\n return result;\n}\n\nexport function assignmentLeft(text: string): string {\n const match = text.match(/^(.*?)(?:\\+=|-=|\\*=|\\/=|%=|\\^=|\\.\\.=|\\/=|=)/s);\n return match?.[1]?.trim() ?? \"\";\n}\n\nexport function functionInfoForNode(context: RuleContext, node: SyntaxNode | null): FunctionInfo | null {\n if (!node) return null;\n return context.model.functionByNode.get(`${node.type}:${node.startIndex}:${node.endIndex}`) ?? null;\n}\n\nexport function stateBindingsFor(context: RuleContext, owner: FunctionInfo): typeof context.model.stateBindings {\n return context.model.stateBindings.filter((binding) => binding.owner === owner);\n}\n\nexport function isEffectPath(path: string): boolean {\n return path === \"React.useEffect\" || path === \"React.useLayoutEffect\";\n}\n\nexport function dependencyExpressions(node: SyntaxNode | undefined): SyntaxNode[] {\n if (!node || node.type !== \"table_constructor\") return [];\n return node.namedChildren\n .filter((child) => child.type === \"field\")\n .map((field) => {\n const name = field.childForFieldName(\"name\");\n if (name && field.text.trim().startsWith(\"[\")) return name;\n return field.namedChildren.find((child) => !sameNode(child, name)) ?? name ?? field;\n });\n}\n\nexport function fieldName(node: SyntaxNode): string | null {\n if (node.type !== \"field\") return null;\n const name = node.childForFieldName(\"name\");\n return name?.type === \"identifier\" ? name.text : null;\n}\n\nexport function fieldValue(node: SyntaxNode): SyntaxNode | null {\n if (node.type !== \"field\") return null;\n const name = node.childForFieldName(\"name\");\n if (!name) return node.namedChildren[0] ?? null;\n return node.namedChildren.find((child) => child.startIndex > name.endIndex) ?? null;\n}\n\nexport function containsIdentifier(node: SyntaxNode | null | undefined, name: string, context: RuleContext): boolean {\n if (!node) return false;\n for (const child of context.walk(node)) {\n if (child.type !== \"identifier\" || child.text !== name) continue;\n const parent = child.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.childForFieldName(\"field\"), child)) continue;\n if (parent?.type === \"method_index_expression\" && (sameNode(parent.childForFieldName(\"method\"), child) || sameNode(parent.namedChildren.at(-1), child))) continue;\n return true;\n }\n return false;\n}\n\nexport function ownerStateSetter(context: RuleContext, owner: FunctionInfo, path: string): string | null {\n for (const binding of context.model.stateBindings) {\n if (binding.owner === owner && binding.setterName === path) return binding.valueName;\n }\n return null;\n}\n\n\nfunction parameterNames(node: SyntaxNode | null): Set<string> {\n const names = new Set<string>();\n if (!node) return names;\n for (const candidate of node.namedChildren) {\n for (const child of [candidate, ...Array.from((function* walkLocal(current: SyntaxNode): Iterable<SyntaxNode> {\n for (const nested of current.namedChildren) {\n yield nested;\n yield* walkLocal(nested);\n }\n })(candidate))]) {\n if (child.type === \"identifier\") names.add(child.text);\n }\n }\n return names;\n}\n\nfunction blockBindingsBefore(block: SyntaxNode, beforeIndex: number): Set<string> {\n const names = new Set<string>();\n for (const child of block.namedChildren) {\n if (child.startIndex >= beforeIndex) continue;\n if (child.type === \"variable_declaration\") {\n for (const name of declarationNames(child)) names.add(name);\n } else if (child.type === \"function_declaration\") {\n const name = child.childForFieldName(\"name\")?.text;\n if (name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) names.add(name);\n }\n }\n return names;\n}\n\nfunction loopBindings(loop: SyntaxNode): Set<string> {\n const names = new Set<string>();\n const header = loop.text.split(/\\bdo\\b/s, 1)[0] ?? \"\";\n const numeric = header.match(/^\\s*for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=/s);\n if (numeric) names.add(numeric[1]);\n const generic = header.match(/^\\s*for\\s+(.+?)\\s+in\\b/s);\n if (generic) {\n for (const part of generic[1].split(\",\")) {\n const name = part.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (name) names.add(name);\n }\n }\n return names;\n}\n\nexport function isNameShadowedBetween(node: SyntaxNode, boundary: FunctionInfo, name: string): boolean {\n let current: SyntaxNode | null = node.parent;\n while (current && !sameNode(current, boundary.node)) {\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") {\n if (parameterNames(current.childForFieldName(\"parameters\")).has(name)) return true;\n }\n if (current.type === \"block\" && !sameNode(current.parent, boundary.node) && blockBindingsBefore(current, node.startIndex).has(name)) return true;\n if (current.type === \"for_statement\" && loopBindings(current).has(name)) return true;\n current = current.parent;\n }\n return false;\n}\n\nexport function containsUnshadowedIdentifier(\n node: SyntaxNode | null | undefined,\n name: string,\n context: RuleContext,\n boundary: FunctionInfo,\n): boolean {\n if (!node) return false;\n for (const child of context.walk(node)) {\n if (child.type !== \"identifier\" || child.text !== name) continue;\n const parent = child.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.childForFieldName(\"field\"), child)) continue;\n if (parent?.type === \"method_index_expression\" && (sameNode(parent.childForFieldName(\"method\"), child) || sameNode(parent.namedChildren.at(-1), child))) continue;\n if (isNameShadowedBetween(child, boundary, name)) continue;\n return true;\n }\n return false;\n}\n\nexport function directFunctionCalls(context: RuleContext, fn: FunctionInfo): SyntaxNode[] {\n if (!fn.body) return [];\n return [...context.walk(fn.body)].filter((node) => node.type === \"function_call\" && context.nearestFunction(node) === fn);\n}\n",
25
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { FixPreview, FunctionInfo, RuleContext, RuleDefinition, Severity } from \"../types\";\nimport { sameNode } from \"../ast/walk\";\nimport { functionYieldPoint } from \"../roblox-semantics\";\nimport { callNameNode, declarationNames, firstFunctionArgument, functionInfoForNode } from \"./helpers\";\n\ninterface Resource {\n call: SyntaxNode;\n label: string;\n variable: string | null;\n detail?: string;\n severity?: Severity;\n cleanupMatches(cleanupText: string, variable: string | null, call: SyntaxNode): boolean;\n}\n\nconst ALWAYS_MANAGED_METHOD = /:GiveTask$/;\nconst GENERIC_MANAGER_METHOD = /:(?:Add|AddTask|AddObject|Track)$/;\nconst MANAGER_ROOT = /(?:maid|trove|janitor|cleaner|cleanup|scope|bin|disposer)(?:$|[._])/i;\nconst CONNECTION_RETURNING_METHODS = new Set([\"BindToSimulation\", \"SubscribeAsync\", \"OnUpdate\"]);\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction connectionOwnerExpression(rawPath: string): string | null {\n const connected = rawPath.match(/^(.*):Connect$/s)?.[1];\n if (!connected) return null;\n\n const signalMethod = connected.match(/^(.*):(?:GetPropertyChangedSignal|GetAttributeChangedSignal)\\s*\\(.*\\)$/s);\n if (signalMethod) return signalMethod[1]?.trim() || null;\n\n const eventProperty = connected.match(/^(.*)\\.[A-Za-z_][A-Za-z0-9_]*$/s);\n return eventProperty?.[1]?.trim() || null;\n}\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return expressionList?.namedChildren ?? [];\n}\n\nfunction initializerCreatesInstance(initializer: SyntaxNode | undefined, context: RuleContext): boolean {\n if (!initializer) return false;\n for (const candidate of context.walk(initializer)) {\n if (candidate.type !== \"function_call\") continue;\n if (context.resolveCallPath(context.getCallPath(candidate) ?? \"\") === \"Instance.new\") return true;\n }\n return false;\n}\n\nfunction bodyDeclaresInstanceBefore(\n body: SyntaxNode | null,\n beforeIndex: number,\n expression: string,\n context: RuleContext,\n): boolean {\n if (!body) return false;\n for (const child of body.namedChildren) {\n if (child.startIndex >= beforeIndex) break;\n if (child.type !== \"variable_declaration\") continue;\n const names = declarationNames(child);\n const index = names.indexOf(expression);\n if (index === -1) continue;\n if (initializerCreatesInstance(declarationExpressions(child)[index], context)) return true;\n }\n return false;\n}\n\nfunction isProvenInstanceExpression(\n expression: string | null,\n call: SyntaxNode,\n context: RuleContext,\n callback: FunctionInfo,\n): boolean {\n if (!expression || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(expression)) return false;\n const callbackInstances = context.model.instanceVariablesByFunction.get(`${callback.node.type}:${callback.node.startIndex}:${callback.node.endIndex}`);\n if (callbackInstances?.has(expression)) return true;\n if (bodyDeclaresInstanceBefore(callback.body, call.startIndex, expression, context)) return true;\n\n const effectOwner = context.nearestFunction(callback.node);\n if (effectOwner) {\n const ownerInstances = context.model.instanceVariablesByFunction.get(`${effectOwner.node.type}:${effectOwner.node.startIndex}:${effectOwner.node.endIndex}`);\n if (ownerInstances?.has(expression)) return true;\n }\n return Boolean(effectOwner && bodyDeclaresInstanceBefore(effectOwner.body, callback.node.startIndex, expression, context));\n}\n\nfunction cleanupDestroysExpression(cleanupText: string, expression: string): boolean {\n return new RegExp(`(?:^|[^A-Za-z0-9_])${escapeRegExp(expression)}\\\\s*:\\\\s*Destroy\\\\s*\\\\(`, \"s\").test(cleanupText);\n}\n\nfunction assignedVariableName(call: SyntaxNode, callback: FunctionInfo): string | null {\n let current = call.parent;\n while (current && !sameNode(current, callback.node)) {\n if (current.type === \"variable_declaration\") {\n const names = declarationNames(current);\n const expressions = declarationExpressions(current);\n const index = expressions.findIndex((expression) => expression.startIndex <= call.startIndex && expression.endIndex >= call.endIndex);\n if (index >= 0) return names[index] ?? names[0] ?? null;\n return names[0] ?? null;\n }\n if (current.type === \"assignment_statement\") {\n const beforeCall = current.text.slice(0, Math.max(0, call.startIndex - current.startIndex));\n const match = beforeCall.match(/^\\s*([A-Za-z_][A-Za-z0-9_]*(?:\\s*\\[[^\\]]+\\]|\\s*\\.[A-Za-z_][A-Za-z0-9_]*)*)\\s*=\\s*$/s);\n const target = match?.[1]?.replace(/\\s+/g, \"\") ?? \"\";\n const root = target.match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (root) return root;\n // A call can be nested inside a conditional/table initializer. In that case\n // keep walking so the surrounding variable declaration can own the resource.\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction cleanupIteratesAndDisconnects(cleanupText: string, collection: string): boolean {\n const escaped = escapeRegExp(collection);\n const loops = new RegExp(\n `for\\\\s+[^\\\\n]*?([A-Za-z_][A-Za-z0-9_]*)\\\\s+in\\\\s+${escaped}\\\\s+do([\\\\s\\\\S]*?)end`,\n \"g\",\n );\n for (const match of cleanupText.matchAll(loops)) {\n const item = match[1];\n const body = match[2] ?? \"\";\n if (new RegExp(`\\\\b${escapeRegExp(item)}\\\\s*:\\\\s*Disconnect\\\\s*\\\\(`).test(body)) return true;\n }\n return false;\n}\n\nfunction cleanupCallsDisposer(cleanupText: string, variable: string): boolean {\n return new RegExp(`(?:^|[^A-Za-z0-9_.:])${escapeRegExp(variable)}\\\\s*\\\\(`, \"s\").test(cleanupText);\n}\n\nfunction isManagedByCleanupContainer(call: SyntaxNode, context: RuleContext, callback: FunctionInfo): boolean {\n let current = call.parent;\n while (current && !sameNode(current, callback.node)) {\n if (current.type === \"function_call\") {\n const path = context.getCallPath(current) ?? \"\";\n if (ALWAYS_MANAGED_METHOD.test(path)) return true;\n if (GENERIC_MANAGER_METHOD.test(path)) {\n const receiver = path.split(\":\", 1)[0] ?? \"\";\n if (MANAGER_ROOT.test(receiver)) return true;\n }\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return false;\n current = current.parent;\n }\n return false;\n}\n\nfunction localFunctionByName(callback: FunctionInfo, name: string, context: RuleContext): SyntaxNode | null {\n if (!callback.body) return null;\n for (const child of callback.body.namedChildren) {\n if (child.type === \"function_declaration\" && child.childForFieldName(\"name\")?.text === name) return child;\n if (child.type !== \"variable_declaration\") continue;\n const match = child.text.match(new RegExp(`^\\\\s*local\\\\s+${escapeRegExp(name)}\\\\s*=\\\\s*function\\\\b`, \"s\"));\n if (!match) continue;\n return [...context.walk(child)].find((node) => node.type === \"function_definition\") ?? null;\n }\n return null;\n}\n\nfunction cleanupTexts(callback: FunctionInfo, context: RuleContext): string[] {\n if (!callback.body) return [];\n const texts: string[] = [];\n\n for (const node of context.walk(callback.body)) {\n if (node.type !== \"return_statement\") continue;\n if (context.nearestFunction(node) !== callback) continue;\n const expressionList = node.namedChildren.find((child) => child.type === \"expression_list\");\n const returned = expressionList?.namedChildren[0];\n if (!returned) continue;\n if (returned.type === \"function_definition\") {\n texts.push(returned.text);\n continue;\n }\n if (returned.type === \"identifier\") {\n const localFunction = localFunctionByName(callback, returned.text, context);\n if (localFunction) texts.push(localFunction.text);\n }\n }\n\n return texts;\n}\n\nfunction taskCallbackNode(call: SyntaxNode, context: RuleContext, callback: FunctionInfo): SyntaxNode | null {\n const args = context.callArguments(call);\n const candidate = args.find((arg) => arg.type === \"function_definition\");\n if (candidate) return candidate;\n const named = args[0];\n if (named?.type === \"identifier\") return localFunctionByName(callback, named.text, context);\n return null;\n}\n\nfunction cancellationFlagMatches(taskCallback: SyntaxNode | null, cleanupText: string, callback: FunctionInfo): boolean {\n if (!taskCallback || !callback.body) return false;\n const beforeTask = callback.body.text.slice(0, Math.max(0, taskCallback.startIndex - callback.body.startIndex));\n const declarations = [...beforeTask.matchAll(/\\blocal\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*false\\b/g)].map((match) => match[1]);\n\n for (const name of declarations) {\n const escaped = escapeRegExp(name);\n if (!new RegExp(`\\\\b${escaped}\\\\s*=\\\\s*true\\\\b`).test(cleanupText)) continue;\n const taskText = taskCallback.text;\n const observesCancellation = new RegExp(`(?:if\\\\s+${escaped}\\\\s+then[\\\\s\\\\S]{0,120}?return|if\\\\s+not\\\\s+${escaped}\\\\s+then|while\\\\s+not\\\\s+${escaped}\\\\b|until\\\\s+${escaped}\\\\b)`, \"s\").test(taskText);\n if (observesCancellation) return true;\n }\n\n return false;\n}\n\nfunction connectionResource(call: SyntaxNode, variable: string | null, label = \"RBXScriptConnection\"): Resource {\n return {\n call,\n label,\n variable,\n cleanupMatches(text, name) {\n return Boolean(\n name\n && (new RegExp(`\\\\b${escapeRegExp(name)}\\\\s*:\\\\s*Disconnect\\\\s*\\\\(`).test(text)\n || cleanupIteratesAndDisconnects(text, name)),\n );\n },\n };\n}\n\nfunction numericTaskDelay(call: SyntaxNode, context: RuleContext): number | null {\n const first = context.callArguments(call)[0]?.text.trim();\n if (!first || !/^-?\\d+(?:\\.\\d+)?$/.test(first)) return null;\n const value = Number(first);\n return Number.isFinite(value) ? value : null;\n}\n\nfunction isCleanupOnlyTask(callbackNode: SyntaxNode | null, context: RuleContext): boolean {\n if (!callbackNode) return false;\n const info = functionInfoForNode(context, callbackNode);\n if (!info?.body) return false;\n const calls = [...context.walk(info.body)].filter((node) => node.type === \"function_call\" && context.nearestFunction(node) === info);\n if (calls.length === 0) return false;\n return calls.every((call) => /:(?:Destroy|Disconnect)$/.test(context.getCallPath(call) ?? \"\"));\n}\n\nfunction taskSeverity(path: string, call: SyntaxNode, taskCallback: SyntaxNode | null, yieldPoint: unknown, context: RuleContext): Severity {\n if (path === \"task.defer\" && !yieldPoint) return \"suggestion\";\n if (path === \"task.delay\" && !yieldPoint) {\n if (isCleanupOnlyTask(taskCallback, context)) return \"suggestion\";\n const delay = numericTaskDelay(call, context);\n if (delay !== null && delay <= 0.25) return \"suggestion\";\n }\n return \"warning\";\n}\n\nfunction cleanupHelp(resources: Resource[], details: string[]): string {\n const labels = new Set(resources.map((resource) => resource.label));\n let action: string;\n\n if (resources.every((resource) => resource.label.includes(\"task\"))) {\n action = \"Cancel the task in returned cleanup if it must stop with the effect.\";\n } else if (labels.size === 1 && labels.has(\"connection/subscription\")) {\n action = \"Disconnect the connection in returned cleanup, or hand it to a cleanup manager.\";\n } else if (labels.size === 1 && [...labels][0]?.endsWith(\" connection\")) {\n action = \"Disconnect the returned connection in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"RenderStep binding\")) {\n action = \"Call UnbindFromRenderStep with the same binding name in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"ContextAction binding\")) {\n action = \"Call UnbindAction with the same action name in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"ContextAction activation binding\")) {\n action = \"Call UnbindActivate with the same input type in cleanup.\";\n } else if (labels.size === 1 && labels.has(\"React root\")) {\n action = \"Unmount the root in cleanup.\";\n } else {\n action = \"Release the owned resources in returned cleanup.\";\n }\n\n return `${details.length > 0 ? `${details.join(\" \")} ` : \"\"}${action}`;\n}\n\nfunction cleanupFixPreview(resources: Resource[], context: RuleContext): FixPreview | undefined {\n const labels = new Set(resources.map((resource) => resource.label));\n const first = resources[0];\n if (!first) return undefined;\n\n if (labels.size === 1 && labels.has(\"RenderStep binding\")) {\n const bindingName = context.callArguments(first.call)[0]?.text.trim() ?? '\"RenderStepName\"';\n return {\n kind: \"pattern\",\n before: `RunService:BindToRenderStep(${bindingName}, priority, onStep)`,\n after: `RunService:BindToRenderStep(${bindingName}, priority, onStep)\n\nreturn function()\n\tRunService:UnbindFromRenderStep(${bindingName})\nend`,\n note: \"Unbind the same RenderStep name when the effect reruns or unmounts.\",\n };\n }\n\n if ([...labels].every((label) => label.includes(\"task\"))) {\n const path = context.resolveCallPath(context.getCallPath(first.call) ?? \"task.delay\");\n const taskCall = path === \"task.defer\"\n ? `task.defer(function()\n\tdoWork()\nend)`\n : path === \"task.spawn\"\n ? `task.spawn(function()\n\tdoWork()\nend)`\n : `task.delay(delaySeconds, function()\n\tdoWork()\nend)`;\n return {\n kind: \"pattern\",\n before: taskCall,\n after: `local thread = ${taskCall}\n\nreturn function()\n\ttask.cancel(thread)\nend`,\n note: \"Cancel scheduled work only when it must not outlive this effect. Short fire-and-forget work may intentionally remain uncancelled.\",\n };\n }\n\n if (labels.size === 1 && labels.has(\"ContextAction binding\")) {\n return {\n kind: \"pattern\",\n before: `ContextActionService:BindAction(actionName, onAction, false, inputType)`,\n after: `ContextActionService:BindAction(actionName, onAction, false, inputType)\n\nreturn function()\n\tContextActionService:UnbindAction(actionName)\nend`,\n note: \"Unbind the same action name in the effect cleanup.\",\n };\n }\n\n if (labels.size === 1 && labels.has(\"React root\")) {\n return {\n kind: \"pattern\",\n before: `local root = ReactRoblox.createRoot(container)`,\n after: `local root = ReactRoblox.createRoot(container)\n\nreturn function()\n\troot:unmount()\nend`,\n note: \"Unmount roots created by the effect when ownership ends.\",\n };\n }\n\n return {\n kind: \"pattern\",\n before: `local connection = signal:Connect(onChanged)`,\n after: `local connection = signal:Connect(onChanged)\n\nreturn function()\n\tconnection:Disconnect()\nend`,\n note: \"Return cleanup from the same effect that acquires the resource.\",\n };\n}\n\nfunction classifyResource(call: SyntaxNode, context: RuleContext, callback: FunctionInfo): Resource | null {\n const rawPath = context.getCallPath(call) ?? \"\";\n const path = context.resolveCallPath(rawPath);\n const variable = assignedVariableName(call, callback);\n const finalMember = path.split(/[.:]/).at(-1) ?? path;\n\n if (/:Connect$/.test(rawPath)) {\n const ownerExpression = connectionOwnerExpression(rawPath);\n const ownerIsInstance = isProvenInstanceExpression(ownerExpression, call, context, callback);\n return {\n call,\n label: \"connection/subscription\",\n variable,\n cleanupMatches(text, name) {\n if (name && new RegExp(`\\\\b${escapeRegExp(name)}\\\\s*:\\\\s*Disconnect\\\\s*\\\\(`).test(text)) return true;\n if (name && cleanupIteratesAndDisconnects(text, name)) return true;\n // Custom Signal/Iris-style Connect APIs may return a disposer function instead of RBXScriptConnection.\n if (name && cleanupCallsDisposer(text, name)) return true;\n return Boolean(ownerIsInstance && ownerExpression && cleanupDestroysExpression(text, ownerExpression));\n },\n };\n }\n\n if (CONNECTION_RETURNING_METHODS.has(finalMember)) {\n return connectionResource(call, variable, `${finalMember} connection`);\n }\n\n if (/BindToRenderStep$/.test(rawPath)) {\n const bindingName = context.callArguments(call)[0]?.text.trim();\n return {\n call,\n label: \"RenderStep binding\",\n variable,\n cleanupMatches(text) {\n if (!/UnbindFromRenderStep\\s*\\(/.test(text)) return false;\n if (!bindingName) return true;\n return new RegExp(`UnbindFromRenderStep\\\\s*\\\\(\\\\s*${escapeRegExp(bindingName)}\\\\s*\\\\)`).test(text);\n },\n };\n }\n\n if (/:BindAction(?:AtPriority)?$/.test(rawPath)) {\n const actionName = context.callArguments(call)[0]?.text.trim();\n return {\n call,\n label: \"ContextAction binding\",\n variable,\n cleanupMatches(text) {\n if (/:UnbindAllActions\\s*\\(/.test(text)) return true;\n if (!/:UnbindAction\\s*\\(/.test(text)) return false;\n if (!actionName) return true;\n return new RegExp(`:UnbindAction\\\\s*\\\\(\\\\s*${escapeRegExp(actionName)}\\\\s*\\\\)`).test(text);\n },\n };\n }\n\n if (/:BindActivate$/.test(rawPath)) {\n const inputType = context.callArguments(call)[0]?.text.trim();\n return {\n call,\n label: \"ContextAction activation binding\",\n variable,\n cleanupMatches(text) {\n if (!/:UnbindActivate\\s*\\(/.test(text)) return false;\n if (!inputType) return true;\n return new RegExp(`:UnbindActivate\\\\s*\\\\(\\\\s*${escapeRegExp(inputType)}(?:\\\\s*,|\\\\s*\\\\))`).test(text);\n },\n };\n }\n\n if (path === \"ReactRoblox.createRoot\") {\n return {\n call,\n label: \"React root\",\n variable,\n cleanupMatches(text, name) {\n return Boolean(name && new RegExp(`\\\\b${escapeRegExp(name)}\\\\s*:\\\\s*unmount\\\\s*\\\\(`, \"i\").test(text));\n },\n };\n }\n\n if (path === \"task.delay\" || path === \"task.defer\" || path === \"task.spawn\") {\n const taskCallback = taskCallbackNode(call, context, callback);\n const yieldPoint = taskCallback ? functionYieldPoint(taskCallback, context) : null;\n const outlivesEffect = path !== \"task.spawn\" || Boolean(yieldPoint);\n if (!outlivesEffect) return null;\n\n return {\n call,\n label: path === \"task.spawn\" ? \"yielding spawned task\" : path === \"task.defer\" ? \"deferred task\" : \"delayed task\",\n detail: yieldPoint ? `The task can outlive the effect because it yields at ${yieldPoint.reason}.` : \"The task is scheduled to run after the effect callback can finish.\",\n severity: taskSeverity(path, call, taskCallback, yieldPoint, context),\n variable,\n cleanupMatches(text, name) {\n if (name) {\n const escaped = escapeRegExp(name);\n if (new RegExp(`task\\\\.cancel\\\\s*\\\\(\\\\s*${escaped}\\\\s*\\\\)`).test(text)) return true;\n if (new RegExp(`p?call\\\\s*\\\\(\\\\s*task\\\\.cancel\\\\s*,\\\\s*${escaped}\\\\s*\\\\)`).test(text)) return true;\n }\n return cancellationFlagMatches(taskCallback, text, callback);\n },\n };\n }\n\n return null;\n}\n\nexport const effectNeedsCleanup: RuleDefinition = {\n id: \"react-luau/effect-needs-cleanup\",\n category: \"Effects\",\n severity: \"warning\",\n description: \"Effects that create owned resources or outliving tasks should return matching cleanup.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n if (path !== \"React.useEffect\" && path !== \"React.useLayoutEffect\") continue;\n\n const callbackNode = firstFunctionArgument(context, call);\n const callback = functionInfoForNode(context, callbackNode);\n if (!callbackNode || !callback) continue;\n const cleanup = cleanupTexts(callback, context);\n const missing: Resource[] = [];\n\n for (const candidate of context.walk(callbackNode)) {\n if (candidate.type !== \"function_call\") continue;\n if (context.nearestFunction(candidate) !== callback) continue;\n if (isManagedByCleanupContainer(candidate, context, callback)) continue;\n const resource = classifyResource(candidate, context, callback);\n if (!resource) continue;\n if (cleanup.some((text) => resource.cleanupMatches(text, resource.variable, resource.call))) continue;\n missing.push(resource);\n }\n\n if (missing.length === 0) continue;\n const labels = [...new Set(missing.map((resource) => resource.label))];\n const details = [...new Set(missing.map((resource) => resource.detail).filter((detail): detail is string => Boolean(detail)))];\n const severityRank: Record<Severity, number> = { suggestion: 0, warning: 1, error: 2 };\n const severity = missing.reduce<Severity>(\n (highest, resource) => severityRank[resource.severity ?? \"warning\"] > severityRank[highest] ? resource.severity ?? \"warning\" : highest,\n \"suggestion\",\n );\n const highlights = missing.map((resource) => callNameNode(resource.call));\n diagnostics.push({\n node: highlights[0],\n highlights,\n severity,\n message: `Effect creates ${labels.join(\", \")} without matching returned cleanup.`,\n help: cleanupHelp(missing, details),\n fixPreview: cleanupFixPreview(missing, context),\n });\n }\n\n return diagnostics;\n },\n};\n",
26
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { FunctionInfo, RuleContext, RuleDefinition } from \"../types\";\nimport { nodeKey, rootIdentifier } from \"../ast/walk\";\nimport {\n callNameNode,\n containsUnshadowedIdentifier,\n dependencyExpressions,\n firstFunctionArgument,\n functionInfoForNode,\n isEffectPath,\n parseDependencyRoots,\n stateBindingsFor,\n} from \"./helpers\";\n\nconst HOOKS_WITH_DEPS = new Set([\n \"React.useEffect\",\n \"React.useLayoutEffect\",\n \"React.useMemo\",\n \"React.useCallback\",\n \"React.useImperativeHandle\",\n]);\n\nfunction ownerForHook(context: RuleContext, call: SyntaxNode): FunctionInfo | null {\n const owner = context.nearestFunction(call);\n return owner && (owner.isComponent || owner.isHook) ? owner : null;\n}\n\nfunction callbackAndDeps(context: RuleContext, call: SyntaxNode): { callback: SyntaxNode; deps: SyntaxNode } | null {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const args = context.callArguments(call);\n if (path === \"React.useImperativeHandle\") {\n const callback = args[1];\n const deps = args[2];\n if (callback?.type === \"function_definition\" && deps?.type === \"table_constructor\") return { callback, deps };\n return null;\n }\n const callback = args[0];\n const deps = args[1];\n if (callback?.type === \"function_definition\" && deps?.type === \"table_constructor\") return { callback, deps };\n return null;\n}\n\nfunction directTopLevelCalls(context: RuleContext, callback: SyntaxNode): SyntaxNode[] {\n const info = functionInfoForNode(context, callback);\n if (!info?.body) return [];\n return info.body.namedChildren.filter((child) => child.type === \"function_call\");\n}\n\nfunction hasCall(node: SyntaxNode, context: RuleContext): boolean {\n for (const child of context.walk(node)) {\n if (child.type === \"function_call\") return true;\n }\n return false;\n}\n\nfunction hasExternalSubscription(node: SyntaxNode, context: RuleContext): boolean {\n for (const child of context.walk(node)) {\n if (child.type !== \"function_call\") continue;\n const path = context.getCallPath(child) ?? \"\";\n if (/:Connect$/.test(path) || /BindToRenderStep$/.test(path) || /:BindAction(?:AtPriority)?$/.test(path)) return true;\n }\n return false;\n}\n\nfunction directLocalInitializer(owner: FunctionInfo, name: string): SyntaxNode | null {\n if (!owner.body) return null;\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const assignment = statement.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variableList = assignment?.namedChildren.find((child) => child.type === \"variable_list\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n const names = variableList?.namedChildren.filter((child) => child.type === \"identifier\") ?? [];\n const expressions = expressionList?.namedChildren ?? [];\n const index = names.findIndex((child) => child.text === name);\n if (index >= 0) return expressions[index] ?? expressions[0] ?? null;\n }\n return null;\n}\n\nfunction setterCalledOutsideCallback(context: RuleContext, owner: FunctionInfo, callback: SyntaxNode, setterName: string): boolean {\n if (!owner.body) return false;\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"function_call\" || context.getCallPath(node) !== setterName) continue;\n if (node.startIndex >= callback.startIndex && node.endIndex <= callback.endIndex) continue;\n return true;\n }\n return false;\n}\n\nfunction freshDependencyKind(node: SyntaxNode, owner: FunctionInfo): string | null {\n if (node.type === \"table_constructor\") return \"table\";\n if (node.type === \"function_definition\") return \"function\";\n\n if (node.type === \"identifier\") {\n const initializer = directLocalInitializer(owner, node.text);\n if (initializer?.type === \"table_constructor\") return \"table\";\n if (initializer?.type === \"function_definition\") return \"function\";\n }\n\n return null;\n}\n\nexport const noDerivedStateEffect: RuleDefinition = {\n id: \"react-luau/no-derived-state-effect\",\n category: \"Effects\",\n severity: \"warning\",\n description: \"Avoid copying render-known derived values into state from an effect.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!isEffectPath(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n if (hasExternalSubscription(parts.callback, context)) continue;\n const available = context.model.componentLocals.get(nodeKey(owner.node)) ?? new Set(owner.parameters);\n const bindings = stateBindingsFor(context, owner);\n const setterToValue = new Map(bindings.map((binding) => [binding.setterName, binding.valueName]));\n\n for (const setterCall of directTopLevelCalls(context, parts.callback)) {\n const setter = context.getCallPath(setterCall) ?? \"\";\n const targetState = setterToValue.get(setter);\n if (!targetState) continue;\n // If the setter is also used by handlers or other effects, the state has independent\n // ownership and is not merely a render-known derived copy.\n if (setterCalledOutsideCallback(context, owner, parts.callback, setter)) continue;\n const argument = context.callArguments(setterCall)[0];\n if (!argument || argument.type === \"function_definition\" || hasCall(argument, context)) continue;\n\n const sourceNames = [...available].filter((name) => name !== targetState && containsUnshadowedIdentifier(argument, name, context, owner));\n if (sourceNames.length === 0) continue;\n\n diagnostics.push({\n node: callNameNode(setterCall),\n message: `${setter}() stores a value derived from ${sourceNames.slice(0, 3).join(\", \")} inside an effect.`,\n help: \"Compute the value during render when it is fully derived from render-known inputs.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noSelfUpdatingEffect: RuleDefinition = {\n id: \"react-luau/no-self-updating-effect\",\n category: \"Effects\",\n severity: \"warning\",\n description: \"Effects should not unconditionally update state that is also one of their dependencies.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!isEffectPath(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n const deps = parseDependencyRoots(parts.deps);\n\n for (const binding of stateBindingsFor(context, owner)) {\n if (!deps.has(binding.valueName)) continue;\n for (const setterCall of directTopLevelCalls(context, parts.callback)) {\n if (context.getCallPath(setterCall) !== binding.setterName) continue;\n diagnostics.push({\n node: callNameNode(setterCall),\n message: `${binding.setterName}() updates ${binding.valueName}, which is also in this effect's dependency table.`,\n help: \"Guard the update so it converges, move it to the originating event, or derive the value during render.\",\n });\n }\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noEffectWithFreshDeps: RuleDefinition = {\n id: \"react-luau/no-effect-with-fresh-deps\",\n category: \"Hooks\",\n severity: \"error\",\n description: \"Dependency tables should not contain tables or functions recreated on every render.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!HOOKS_WITH_DEPS.has(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n\n for (const dependency of dependencyExpressions(parts.deps)) {\n const kind = freshDependencyKind(dependency, owner);\n if (!kind) continue;\n const label = dependency.type === \"identifier\" ? ` ${dependency.text}` : \"\";\n diagnostics.push({\n node: dependency,\n message: `${path} depends on${label || \" an inline value\"} that is a new ${kind} on every render.`,\n help: \"Move the value inside the hook callback and depend on its simple inputs, or intentionally stabilize the value with useMemo/useCallback when identity is part of the contract.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noMutableInDeps: RuleDefinition = {\n id: \"react-luau/no-mutable-in-deps\",\n category: \"Hooks\",\n severity: \"error\",\n description: \"Mutable ref.current values do not belong in hook dependency tables.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!HOOKS_WITH_DEPS.has(path)) continue;\n const owner = ownerForHook(context, call);\n const parts = callbackAndDeps(context, call);\n if (!owner || !parts) continue;\n const refs = context.model.refVariablesByFunction.get(nodeKey(owner.node)) ?? new Set<string>();\n\n for (const dependency of dependencyExpressions(parts.deps)) {\n const root = rootIdentifier(dependency.text);\n if (!root || !refs.has(root)) continue;\n if (!new RegExp(`^${root.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\s*\\\\.\\\\s*current\\\\b`).test(dependency.text.trim())) continue;\n diagnostics.push({\n node: dependency,\n message: `${dependency.text.trim()} is mutable ref state and will not itself trigger a React render when it changes.`,\n help: \"Read ref.current inside the hook body. Depend on reactive inputs that actually cause renders instead of listing the mutable current value.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
27
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { DiagnosticInput, FunctionInfo, RuleContext, RuleDefinition } from \"../types\";\nimport { nodeKey, normalizeExpressionText, rootIdentifier, sameNode } from \"../ast/walk\";\nimport { mutableDependencyBase } from \"../roblox-semantics\";\nimport { declarationNames, dependencyExpressions, tableStartNode } from \"./helpers\";\n\nconst GLOBALS = new Set([\n \"game\", \"workspace\", \"script\", \"shared\", \"Enum\", \"Instance\", \"task\", \"coroutine\", \"debug\", \"os\", \"utf8\", \"buffer\", \"bit32\",\n \"math\", \"string\", \"table\", \"pairs\", \"ipairs\", \"next\", \"pcall\", \"xpcall\", \"print\", \"warn\", \"error\", \"assert\", \"type\", \"typeof\",\n \"tonumber\", \"tostring\", \"select\", \"unpack\", \"rawget\", \"rawset\", \"rawequal\", \"setmetatable\", \"getmetatable\", \"Vector2\", \"Vector3\", \"UDim\",\n \"UDim2\", \"CFrame\", \"Color3\", \"BrickColor\", \"Rect\", \"Region3\", \"Ray\", \"TweenInfo\", \"NumberRange\", \"NumberSequence\", \"ColorSequence\",\n \"DateTime\", \"Random\", \"Axes\", \"Faces\", \"PhysicalProperties\", \"RaycastParams\", \"OverlapParams\", \"DockWidgetPluginGuiInfo\",\n]);\n\nconst HOOK_ARGUMENTS = new Map<string, { callbackIndex: number; depsIndex: number }>([\n [\"React.useEffect\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useLayoutEffect\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useMemo\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useCallback\", { callbackIndex: 0, depsIndex: 1 }],\n [\"React.useImperativeHandle\", { callbackIndex: 1, depsIndex: 2 }],\n]);\n\nfunction parameterNames(functionNode: SyntaxNode): Set<string> {\n const names = new Set<string>();\n const parameters = functionNode.childForFieldName(\"parameters\");\n if (!parameters) return names;\n for (const node of parameters.namedChildren) {\n for (const candidate of descendants(node)) {\n if (candidate.type === \"identifier\") names.add(candidate.text);\n }\n }\n return names;\n}\n\nfunction* descendants(node: SyntaxNode): Iterable<SyntaxNode> {\n yield node;\n for (const child of node.namedChildren) yield* descendants(child);\n}\n\nfunction directBlockBindingNames(block: SyntaxNode, beforeIndex: number): Set<string> {\n const names = new Set<string>();\n for (const child of block.namedChildren) {\n if (child.startIndex >= beforeIndex) continue;\n if (child.type === \"variable_declaration\") {\n for (const name of declarationNames(child)) names.add(name);\n } else if (child.type === \"function_declaration\") {\n const name = child.childForFieldName(\"name\")?.text;\n if (name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) names.add(name);\n }\n }\n return names;\n}\n\nfunction loopBindingNames(loop: SyntaxNode): Set<string> {\n const names = new Set<string>();\n const header = loop.text.split(/\\bdo\\b/s, 1)[0] ?? \"\";\n const numeric = header.match(/^\\s*for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=/s);\n if (numeric) names.add(numeric[1]);\n const generic = header.match(/^\\s*for\\s+(.+?)\\s+in\\b/s);\n if (generic) {\n for (const part of generic[1].split(\",\")) {\n const name = part.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)/)?.[1];\n if (name) names.add(name);\n }\n }\n return names;\n}\n\nfunction isLocallyBoundOccurrence(identifier: SyntaxNode, callback: SyntaxNode, name: string): boolean {\n if (parameterNames(callback).has(name)) return true;\n\n let current = identifier.parent;\n while (current && !sameNode(current, callback)) {\n if ((current.type === \"function_definition\" || current.type === \"function_declaration\") && parameterNames(current).has(name)) {\n return true;\n }\n if (current.type === \"block\" && directBlockBindingNames(current, identifier.startIndex).has(name)) return true;\n if (current.type === \"for_statement\" && loopBindingNames(current).has(name)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction isPropertyName(node: SyntaxNode): boolean {\n const parent = node.parent;\n if (!parent) return false;\n if (parent.type === \"dot_index_expression\") return sameNode(parent.childForFieldName(\"field\"), node);\n if (parent.type === \"method_index_expression\") return sameNode(parent.childForFieldName(\"method\"), node) || sameNode(parent.namedChildren.at(-1), node);\n // `fieldName = value` uses fieldName as a table key, not as a captured value.\n // Without this, a coincidentally named component local can create a fake dep.\n if (parent.type === \"field\" && !parent.text.trim().startsWith(\"[\")) {\n return sameNode(parent.childForFieldName(\"name\"), node);\n }\n return false;\n}\n\nfunction outermostDotPath(node: SyntaxNode): boolean {\n const parent = node.parent;\n return !(parent?.type === \"dot_index_expression\" && sameNode(parent.namedChildren[0], node));\n}\n\nfunction rootIdentifierNode(node: SyntaxNode, root: string): SyntaxNode | null {\n for (const candidate of descendants(node)) {\n if (candidate.type !== \"identifier\" || candidate.text !== root) continue;\n if (isPropertyName(candidate)) continue;\n return candidate;\n }\n return null;\n}\n\nfunction normalizeCapturedPath(\n path: string,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n): string | null {\n const normalized = normalizeExpressionText(path);\n const root = rootIdentifier(normalized);\n if (!root) return normalized;\n\n const mutableBase = mutableDependencyBase(normalized, externallyMutableRoots);\n if (mutableBase === \"\") return null;\n if (mutableBase) {\n const baseRoot = rootIdentifier(mutableBase);\n if (baseRoot && stableVariables.has(baseRoot)) return null;\n return mutableBase;\n }\n\n return normalized;\n}\n\nfunction capturedDependencyPaths(\n callback: SyntaxNode,\n available: Set<string>,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n): Set<string> {\n const captured = new Set<string>();\n\n for (const node of descendants(callback)) {\n if (node.type === \"dot_index_expression\" && outermostDotPath(node)) {\n const root = rootIdentifier(node.text);\n if (!root || !available.has(root) || GLOBALS.has(root) || stableVariables.has(root)) continue;\n const rootNode = rootIdentifierNode(node, root);\n if (!rootNode || isLocallyBoundOccurrence(rootNode, callback, root)) continue;\n const capture = normalizeCapturedPath(node.text, stableVariables, externallyMutableRoots);\n if (capture) captured.add(capture);\n continue;\n }\n\n if (node.type !== \"identifier\" || isPropertyName(node)) continue;\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.namedChildren[0], node)) continue;\n const name = node.text;\n if (!available.has(name) || GLOBALS.has(name) || stableVariables.has(name)) continue;\n if (isLocallyBoundOccurrence(node, callback, name)) continue;\n captured.add(name);\n }\n\n return captured;\n}\n\nfunction localFunctionNode(owner: FunctionInfo, name: string, context: RuleContext): SyntaxNode | null {\n if (!owner.body) return null;\n for (const statement of owner.body.namedChildren) {\n if (statement.type === \"function_declaration\" && statement.childForFieldName(\"name\")?.text === name) return statement;\n if (statement.type !== \"variable_declaration\" || !declarationNames(statement).includes(name)) continue;\n const prefix = statement.text.split(\"=\", 1)[0] ?? \"\";\n if (!new RegExp(`\\b${name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\b`).test(prefix)) continue;\n const fn = [...context.walk(statement)].find((node) => node.type === \"function_definition\");\n if (fn) return fn;\n }\n return null;\n}\n\nfunction expandLocalFunctionCaptures(\n captured: Set<string>,\n owner: FunctionInfo,\n available: Set<string>,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n context: RuleContext,\n): Set<string> {\n const result = new Set<string>();\n const visiting = new Set<string>();\n\n const addCapture = (capture: string): void => {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(capture)) {\n result.add(capture);\n return;\n }\n const fn = localFunctionNode(owner, capture, context);\n if (visiting.has(capture)) return;\n if (!fn) {\n result.add(capture);\n return;\n }\n\n visiting.add(capture);\n const inner = capturedDependencyPaths(fn, available, stableVariables, externallyMutableRoots);\n for (const dependency of inner) addCapture(dependency);\n visiting.delete(capture);\n };\n\n for (const capture of captured) addCapture(capture);\n return result;\n}\n\nfunction dependencyPaths(node: SyntaxNode): Set<string> {\n return new Set(dependencyExpressions(node).map((dependency) => normalizeExpressionText(dependency.text)));\n}\n\nconst PURE_DERIVED_CALL = /^(?:math\\.(?!random(?:seed)?$)[A-Za-z_][A-Za-z0-9_]*|string\\.[A-Za-z_][A-Za-z0-9_]*|table\\.(?:find|concat|clone|create|isfrozen)|(?:Color3|Vector2|Vector3|UDim|UDim2|CFrame|BrickColor|Rect|NumberRange|NumberSequence|ColorSequence|TweenInfo|Font|Ray|Region3|PhysicalProperties)\\.[A-Za-z_][A-Za-z0-9_]*|[^:]+:(?:ToHSV|Lerp|Dot|Cross|FuzzyEq|Inverse|ToObjectSpace|ToWorldSpace))$/;\n\nfunction isPureDerivedExpression(node: SyntaxNode, context: RuleContext): boolean {\n for (const candidate of context.walk(node)) {\n if (candidate !== node && (candidate.type === \"function_definition\" || candidate.type === \"function_declaration\")) return false;\n if (candidate.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(candidate);\n if (!rawPath) return false;\n const path = normalizeExpressionText(context.resolveCallPath(rawPath));\n if (!PURE_DERIVED_CALL.test(path)) return false;\n }\n return true;\n}\n\nfunction mutatedOwnerLocals(owner: FunctionInfo, context: RuleContext): Set<string> {\n const mutated = new Set<string>();\n if (!owner.body) return mutated;\n\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"assignment_statement\" && node.type !== \"update_statement\") continue;\n if (node.parent?.type === \"variable_declaration\") continue;\n const variables = node.namedChildren.find((child) => child.type === \"variable_list\");\n if (!variables) continue;\n for (const variable of variables.namedChildren) {\n const root = rootIdentifier(normalizeExpressionText(variable.text));\n if (root) mutated.add(root);\n }\n }\n\n return mutated;\n}\n\nfunction derivedLocalDependencies(\n owner: FunctionInfo,\n available: Set<string>,\n stableVariables: Set<string>,\n externallyMutableRoots: Set<string>,\n context: RuleContext,\n): Map<string, Set<string>> {\n const derived = new Map<string, Set<string>>();\n if (!owner.body) return derived;\n const mutated = mutatedOwnerLocals(owner, context);\n\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const expressions = declarationExpressions(statement);\n if (names.length === 0 || expressions.length === 0) continue;\n\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n if (!expression || mutated.has(name) || !isPureDerivedExpression(expression, context)) continue;\n derived.set(name, capturedDependencyPaths(expression, available, stableVariables, externallyMutableRoots));\n }\n }\n\n return derived;\n}\n\nfunction expandDerivedLocalCaptures(\n captured: Set<string>,\n derived: Map<string, Set<string>>,\n dependencies: Set<string>,\n): Set<string> {\n const result = new Set<string>();\n const visiting = new Set<string>();\n\n const addCapture = (capture: string): void => {\n if (dependencySatisfies(capture, dependencies)) {\n result.add(capture);\n return;\n }\n const root = rootIdentifier(capture);\n if (!root || !derived.has(root)) {\n result.add(capture);\n return;\n }\n if (visiting.has(root)) return;\n\n visiting.add(root);\n for (const dependency of derived.get(root) ?? []) addCapture(dependency);\n visiting.delete(root);\n };\n\n for (const capture of captured) addCapture(capture);\n return result;\n}\n\nfunction hasDynamicUnpackDependencies(node: SyntaxNode, context: RuleContext): boolean {\n for (const dependency of dependencyExpressions(node)) {\n for (const candidate of context.walk(dependency)) {\n if (candidate.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(candidate);\n if (!rawPath) continue;\n const path = normalizeExpressionText(context.resolveCallPath(rawPath));\n if (path === \"unpack\" || path === \"table.unpack\") return true;\n }\n }\n return false;\n}\n\nfunction memoizedProducerDependencies(owner: FunctionInfo, context: RuleContext): Map<string, Set<string>> {\n const producers = new Map<string, Set<string>>();\n if (!owner.body) return producers;\n\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const expressions = declarationExpressions(statement);\n if (names.length === 0 || expressions.length === 0) continue;\n\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n if (!expression || expression.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(expression);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n if (path !== \"React.useMemo\" && path !== \"React.useCallback\") continue;\n const args = context.callArguments(expression);\n const deps = args[1];\n if (!deps || deps.type !== \"table_constructor\" || hasDynamicUnpackDependencies(deps, context)) continue;\n producers.set(name, dependencyPaths(deps));\n }\n }\n\n return producers;\n}\n\nfunction isTransitivelyCoveredMemoizedValue(\n dependency: string,\n producers: Map<string, Set<string>>,\n dependencies: Set<string>,\n): boolean {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(dependency)) return false;\n const producerDependencies = producers.get(dependency);\n if (!producerDependencies) return false;\n return [...producerDependencies].every((producerDependency) => dependencySatisfies(producerDependency, dependencies));\n}\n\nfunction dependencySatisfies(captured: string, dependencies: Set<string>): boolean {\n for (const dependency of dependencies) {\n if (captured === dependency) return true;\n if (captured.startsWith(`${dependency}.`) || captured.startsWith(`${dependency}[`)) return true;\n }\n return false;\n}\n\nfunction minimalMissingDependencies(captured: Set<string>, dependencies: Set<string>): string[] {\n const missing = [...captured]\n .filter((name) => !dependencySatisfies(name, dependencies))\n .sort((left, right) => left.length - right.length || left.localeCompare(right));\n const result: string[] = [];\n for (const candidate of missing) {\n if (dependencySatisfies(candidate, new Set(result))) continue;\n result.push(candidate);\n }\n return result.sort();\n}\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressionList = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return expressionList?.namedChildren ?? [];\n}\n\nfunction directCallsInExpression(node: SyntaxNode, context: RuleContext): SyntaxNode[] {\n const calls: SyntaxNode[] = [];\n const pending = [node];\n while (pending.length > 0) {\n const current = pending.pop()!;\n if (current !== node && (current.type === \"function_definition\" || current.type === \"function_declaration\")) continue;\n if (current.type === \"function_call\") calls.push(current);\n pending.push(...current.namedChildren);\n }\n return calls;\n}\n\nfunction isCustomHookCall(call: SyntaxNode, context: RuleContext): boolean {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return !path.startsWith(\"React.\") && /^use[A-Z0-9_]/.test(final);\n}\n\ninterface CustomHookDependencyHints {\n memberHandleRoots: Set<string>;\n likelyHandleRoots: Set<string>;\n compositeHandleRoots: Set<string>;\n}\n\nconst HANDLE_VALUE_NAME = /(?:ref|binding|tween|spring|motion|animation|controller|handle|connection|signal)$/i;\nconst HANDLE_HOOK_NAME = /(?:Tween|Spring|Binding|Motion|Animated|Animation|Sound)$/i;\n\nfunction isCalledAsFunction(owner: FunctionInfo, name: string, context: RuleContext): boolean {\n if (!owner.body) return false;\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\") continue;\n const path = normalizeExpressionText(context.getCallPath(call) ?? \"\");\n if (path === name) return true;\n }\n return false;\n}\n\nfunction customHookDependencyHints(owner: FunctionInfo, context: RuleContext): CustomHookDependencyHints {\n const hints: CustomHookDependencyHints = {\n memberHandleRoots: new Set<string>(),\n likelyHandleRoots: new Set<string>(),\n compositeHandleRoots: new Set<string>(),\n };\n if (!owner.body) return hints;\n\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const expressions = declarationExpressions(statement);\n if (names.length === 0 || expressions.length === 0) continue;\n\n for (let index = 0; index < names.length; index += 1) {\n const name = names[index];\n const expression = expressions[index] ?? expressions[0];\n if (!expression) continue;\n const calls = directCallsInExpression(expression, context);\n if (calls.length === 0) continue;\n\n const directHook = calls.find((call) => isCustomHookCall(call, context));\n if (directHook && expression.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(directHook) ?? \"\");\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n const likelyHandle = HANDLE_VALUE_NAME.test(name) || HANDLE_HOOK_NAME.test(final) || isCalledAsFunction(owner, name, context);\n if (likelyHandle) {\n hints.memberHandleRoots.add(name);\n hints.likelyHandleRoots.add(name);\n }\n continue;\n }\n\n if (expression.type === \"table_constructor\") {\n const meaningfulCalls = calls.filter((call) => {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n return !/^(?:Color3|Vector2|Vector3|UDim|UDim2|CFrame|TweenInfo|NumberSequence|ColorSequence)\\./.test(path);\n });\n const allHandleHooks = meaningfulCalls.length > 0 && meaningfulCalls.every((call) => {\n if (!isCustomHookCall(call, context)) return false;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n return HANDLE_HOOK_NAME.test(final);\n });\n if (allHandleHooks) hints.compositeHandleRoots.add(name);\n }\n }\n }\n\n return hints;\n}\n\nfunction isAmbiguousCustomHookHandle(dependency: string, hints: CustomHookDependencyHints): boolean {\n const root = rootIdentifier(dependency);\n if (!root) return false;\n if (hints.compositeHandleRoots.has(root)) return true;\n if (hints.likelyHandleRoots.has(root)) return true;\n return hints.memberHandleRoots.has(root) && dependency !== root;\n}\n\n\nexport const exhaustiveDeps: RuleDefinition = {\n id: \"react-luau/exhaustive-deps\",\n category: \"Hooks\",\n severity: \"warning\",\n description: \"React hook dependency tables should include captured reactive render values.\",\n run(context: RuleContext) {\n const diagnostics: DiagnosticInput[] = [];\n\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n const shape = HOOK_ARGUMENTS.get(path);\n if (!shape) continue;\n\n const args = context.callArguments(call);\n const callback = args[shape.callbackIndex];\n const deps = args[shape.depsIndex];\n if (!callback || callback.type !== \"function_definition\" || !deps || deps.type !== \"table_constructor\") continue;\n\n const owner = context.nearestFunction(call);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n const ownerKey = nodeKey(owner.node);\n const available = context.model.componentLocals.get(ownerKey) ?? new Set<string>();\n const stableVariables = context.model.stableVariablesByFunction.get(ownerKey) ?? new Set<string>();\n const externallyMutableRoots = context.model.externalMutableVariablesByFunction.get(ownerKey) ?? new Set<string>();\n const functionExpandedCaptures = expandLocalFunctionCaptures(\n capturedDependencyPaths(callback, available, stableVariables, externallyMutableRoots),\n owner,\n available,\n stableVariables,\n externallyMutableRoots,\n context,\n );\n const dependencies = dependencyPaths(deps);\n const captured = expandDerivedLocalCaptures(\n functionExpandedCaptures,\n derivedLocalDependencies(owner, available, stableVariables, externallyMutableRoots, context),\n dependencies,\n );\n const missing = minimalMissingDependencies(captured, dependencies);\n if (missing.length === 0) continue;\n\n if (hasDynamicUnpackDependencies(deps, context)) {\n diagnostics.push({\n node: tableStartNode(deps),\n severity: \"suggestion\",\n message: `${path} uses dynamic unpack(...) dependencies, so exhaustive dependency analysis is partial.`,\n help: \"The analyzer cannot prove which values unpack(...) contributes. Review the explicit dependencies and the custom hook contract.\",\n });\n continue;\n }\n\n const hints = customHookDependencyHints(owner, context);\n const memoizedProducers = memoizedProducerDependencies(owner, context);\n const uncertainHandles = missing.filter((dependency) => isAmbiguousCustomHookHandle(dependency, hints));\n const transitivelyCoveredMemoized = missing.filter((dependency) =>\n !isAmbiguousCustomHookHandle(dependency, hints)\n && isTransitivelyCoveredMemoizedValue(dependency, memoizedProducers, dependencies)\n );\n const reactiveMissing = missing.filter((dependency) =>\n !isAmbiguousCustomHookHandle(dependency, hints)\n && !isTransitivelyCoveredMemoizedValue(dependency, memoizedProducers, dependencies)\n );\n\n if (reactiveMissing.length > 0) {\n diagnostics.push({\n node: tableStartNode(deps),\n message: `${path} dependency table is missing ${reactiveMissing.join(\", \")}.`,\n help: `Add ${reactiveMissing.join(\", \")} to the dependency table, or stop capturing ${reactiveMissing.length === 1 ? \"that value\" : \"those values\"} in the callback.`,\n });\n }\n\n if (transitivelyCoveredMemoized.length > 0) {\n diagnostics.push({\n node: tableStartNode(deps),\n severity: \"suggestion\",\n message: `${path} captures memoized value ${transitivelyCoveredMemoized.join(\", \")} without listing ${transitivelyCoveredMemoized.length === 1 ? \"it directly\" : \"them directly\"}, but ${transitivelyCoveredMemoized.length === 1 ? \"its memo dependencies are\" : \"their memo dependencies are\"} already covered.`,\n help: \"The producing memo dependencies are already covered. Listing the memoized value directly can make the dependency relationship clearer.\",\n });\n }\n\n if (uncertainHandles.length > 0) {\n diagnostics.push({\n node: tableStartNode(deps),\n severity: \"suggestion\",\n message: `${path} captures custom-hook handle ${uncertainHandles.join(\", \")} without listing ${uncertainHandles.length === 1 ? \"it as a dependency\" : \"them as dependencies\"}.`,\n help: \"The analyzer cannot prove this custom-hook return is stable. Check the hook contract before changing the dependency table.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
28
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { RuleContext, RuleDefinition } from \"../types\";\nimport { assignmentLeft, fieldName, fieldValue } from \"./helpers\";\n\nfunction loopIndex(text: string): string | null {\n const numeric = text.match(/^\\s*for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=/s);\n if (numeric) return numeric[1];\n\n const generic = text.match(/^\\s*for\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*,/s);\n const candidate = generic?.[1] ?? null;\n // Single-letter keys are frequently dictionary keys in Luau, not array positions.\n return candidate && /^(?:idx|index|position)$/i.test(candidate) ? candidate : null;\n}\n\nfunction assignmentAncestor(call: SyntaxNode, loop: SyntaxNode): SyntaxNode | null {\n let current = call.parent;\n while (current && current.startIndex >= loop.startIndex && current.endIndex <= loop.endIndex) {\n if (current.type === \"assignment_statement\") return current;\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction createElementCallsInLoop(context: RuleContext, loop: SyntaxNode): SyntaxNode[] {\n const result: SyntaxNode[] = [];\n for (const node of context.walk(loop)) {\n if (node.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\");\n if (path === \"React.createElement\") result.push(node);\n }\n return result;\n}\n\nexport const noArrayIndexAsKey: RuleDefinition = {\n id: \"react-luau/no-array-index-as-key\",\n category: \"Correctness\",\n severity: \"suggestion\",\n description: \"Review dynamic React children that use their current array position as identity.\",\n run(context) {\n const diagnostics = [];\n\n for (const node of context.walk()) {\n if (node.type !== \"for_statement\") continue;\n const index = loopIndex(node.text);\n if (!index) continue;\n const escaped = index.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const keyProp = new RegExp(`\\\\bkey\\\\s*=\\\\s*${escaped}\\\\b`);\n const indexedTarget = new RegExp(`\\\\[\\\\s*${escaped}\\\\s*\\\\]\\\\s*$`);\n\n const highlights: SyntaxNode[] = [];\n for (const call of createElementCallsInLoop(context, node)) {\n const props = context.callArguments(call)[1];\n if (props?.type === \"table_constructor\" && keyProp.test(props.text)) {\n const keyField = props.namedChildren.find((field) =>\n field.type === \"field\" && fieldName(field) === \"key\" && fieldValue(field)?.text.trim() === index\n );\n highlights.push(fieldValue(keyField ?? props) ?? keyField ?? props);\n }\n\n const assignment = assignmentAncestor(call, node);\n if (assignment && indexedTarget.test(assignmentLeft(assignment.text))) {\n const indexNode = [...context.walk(assignment)].find((candidate) =>\n candidate.type === \"identifier\" && candidate.text === index && candidate.startIndex < call.startIndex\n );\n highlights.push(indexNode ?? assignment);\n }\n }\n\n if (highlights.length === 0) continue;\n diagnostics.push({\n node: highlights[0],\n highlights,\n message: `Loop index ${index} is used as React child identity.`,\n help: \"Use a stable item key when children can be inserted, removed, reordered, or kept alive for exit animation.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
29
+ "import type { RuleDefinition } from \"../types\";\nimport { callNameNode } from \"./helpers\";\n\nexport const noCreateContextInRender: RuleDefinition = {\n id: \"react-luau/no-create-context-in-render\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"React contexts must have stable identity and should not be created during render.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.createContext\") continue;\n const owner = context.nearestFunction(call);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n if (!context.isDirectlyExecutedInFunction(call, owner)) continue;\n\n diagnostics.push({\n node: callNameNode(call),\n message: `React.createContext() is called during ${owner.isHook ? \"hook\" : \"component\"} render${owner.name ? ` in ${owner.name}` : \"\"}.`,\n help: \"Create the context once at module scope so providers and consumers keep the same context identity.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
30
+ "import type { FunctionInfo, RuleContext, RuleDefinition } from \"../types\";\n\nfunction enclosingComponent(context: RuleContext, candidate: FunctionInfo): FunctionInfo | null {\n let current = candidate.node.parent;\n while (current) {\n const info = context.model.functionByNode.get(`${current.type}:${current.startIndex}:${current.endIndex}`);\n if (info?.isComponent) return info;\n current = current.parent;\n }\n return null;\n}\n\nfunction isRenderedBy(context: RuleContext, component: FunctionInfo, name: string): boolean {\n if (!component.body) return false;\n for (const call of context.walk(component.body)) {\n if (call.type !== \"function_call\") continue;\n if (context.nearestFunction(call) !== component) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.createElement\") continue;\n if (context.callArguments(call)[0]?.text.trim() === name) return true;\n }\n return false;\n}\n\n\nfunction componentNameNode(context: RuleContext, candidate: FunctionInfo): FunctionInfo[\"node\"] {\n const direct = candidate.node.childForFieldName(\"name\");\n if (direct) return direct;\n let current = candidate.node.parent;\n while (current && current.type !== \"variable_declaration\" && current.type !== \"function_declaration\") current = current.parent;\n if (current) {\n const identifier = [...context.walk(current)].find((node) =>\n node.type === \"identifier\" && node.text === candidate.name && node.startIndex < candidate.node.startIndex\n );\n if (identifier) return identifier;\n }\n return candidate.node;\n}\n\nexport const noNestedComponentDefinition: RuleDefinition = {\n id: \"react-luau/no-nested-component-definition\",\n category: \"Architecture\",\n severity: \"warning\",\n description: \"Do not define rendered component types inside another component.\",\n run(context) {\n const diagnostics = [];\n\n for (const candidate of context.model.functions) {\n if (!candidate.isComponent || !candidate.name || !/^[A-Z]/.test(candidate.name)) continue;\n const parent = enclosingComponent(context, candidate);\n if (!parent || !isRenderedBy(context, parent, candidate.name)) continue;\n\n diagnostics.push({\n node: componentNameNode(context, candidate),\n message: `${candidate.name} is defined inside ${parent.name ?? \"another component\"} and rendered as a component type.`,\n help: \"Move the nested component to module scope. Recreating a component type on each parent render can remount it and discard its local state.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
31
+ "import type { RuleDefinition } from \"../types\";\nimport { assignmentLeft, assignmentTargetNode, isNameShadowedBetween } from \"./helpers\";\n\nexport const noPropMutation: RuleDefinition = {\n id: \"react-luau/no-prop-mutation\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"Component props should be treated as immutable inputs.\",\n run(context) {\n const diagnostics = [];\n\n for (const node of context.walk()) {\n if (node.type !== \"assignment_statement\" && node.type !== \"update_statement\") continue;\n const component = context.containingComponent(node);\n if (!component || !context.isDirectlyExecutedInFunction(node, component)) continue;\n\n const propsName = component.parameters[0];\n if (!propsName) continue;\n if (isNameShadowedBetween(node, component, propsName)) continue;\n const left = assignmentLeft(node.text);\n const escaped = propsName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (!new RegExp(`^${escaped}\\\\s*(?:\\\\.|\\\\[)`).test(left)) continue;\n\n diagnostics.push({\n node: assignmentTargetNode(node),\n message: `Component mutates ${propsName} directly.`,\n help: \"Treat props as immutable. Derive a local value, clone a table you own, or update state in the owner instead.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
32
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { RuleContext, RuleDefinition } from \"../types\";\nimport { fieldName, fieldValue } from \"./helpers\";\n\nconst FRESH_CALLS = [\n /^math\\.random$/,\n /^Random\\.new$/,\n /:GenerateGUID$/,\n /^DateTime\\.now$/,\n /^os\\.clock$/,\n /^tick$/,\n /^time$/,\n /:GetServerTimeNow$/,\n /:NextInteger$/,\n /:NextNumber$/,\n];\n\nfunction freshDescription(node: SyntaxNode, context: RuleContext): string | null {\n for (const child of context.walk(node)) {\n if (child.type !== \"function_call\") continue;\n const path = context.getCallPath(child) ?? \"\";\n if (FRESH_CALLS.some((pattern) => pattern.test(path)) || /Random\\.new\\s*\\([^)]*\\)\\s*:\\s*Next(?:Integer|Number)/s.test(child.text)) {\n return `${path || \"fresh-value call\"}()`;\n }\n }\n return null;\n}\n\nfunction isCreateElementCall(node: SyntaxNode | undefined, context: RuleContext): boolean {\n if (!node || node.type !== \"function_call\") return false;\n return context.resolveCallPath(context.getCallPath(node) ?? \"\") === \"React.createElement\";\n}\n\nexport const noRandomKey: RuleDefinition = {\n id: \"react-luau/no-random-key\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"React child keys must not be regenerated on each render.\",\n run(context) {\n const diagnostics = [];\n\n for (const field of context.walk()) {\n if (field.type !== \"field\") continue;\n const name = field.childForFieldName(\"name\");\n let keyExpression: SyntaxNode | null = null;\n\n if (fieldName(field) === \"key\") {\n keyExpression = fieldValue(field);\n } else if (field.text.trim().startsWith(\"[\") && name) {\n const value = field.namedChildren.find((child) => child.startIndex > name.endIndex);\n if (isCreateElementCall(value, context)) keyExpression = name;\n }\n\n if (!keyExpression) continue;\n const description = freshDescription(keyExpression, context);\n if (!description) continue;\n\n diagnostics.push({\n node: keyExpression,\n message: `React key is created from ${description}, so its identity can change every render.`,\n help: \"Use stable identity from the item itself, such as UserId, an immutable record ID, or another persistent key. Changing keys remounts children and breaks preserved state or exit-animation identity.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
33
+ "import type { RuleDefinition } from \"../types\";\nimport { callNameNode, stateBindingsFor } from \"./helpers\";\n\nexport const noSetStateInRender: RuleDefinition = {\n id: \"react-luau/no-set-state-in-render\",\n category: \"Correctness\",\n severity: \"warning\",\n description: \"Do not call a component's state setter unconditionally during render.\",\n run(context) {\n const diagnostics = [];\n\n for (const component of context.model.functions) {\n if (!component.isComponent || !component.body) continue;\n const setters = new Set(stateBindingsFor(context, component).map((binding) => binding.setterName));\n if (setters.size === 0) continue;\n\n for (const statement of component.body.namedChildren) {\n if (statement.type !== \"function_call\") continue;\n const path = context.getCallPath(statement);\n if (!path || !setters.has(path)) continue;\n\n diagnostics.push({\n node: callNameNode(statement),\n message: `${path}() is called unconditionally during component render.`,\n help: \"Move the update to the event or effect that owns it, or derive the value during render. An unconditional render-phase state update can continuously trigger new renders.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
34
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { RuleDefinition } from \"../types\";\n\nconst REQUIRED_CLOSERS = new Map<string, string>([\n [\"parameters\", \")\"],\n [\"arguments\", \")\"],\n [\"table_constructor\", \"}\"],\n]);\n\nconst TYPE_SYNTAX_ANCESTORS = new Set([\n \"type_definition\",\n \"type_annotation\",\n \"type_parameters\",\n \"generic_type\",\n \"function_type\",\n \"optional_type\",\n \"object_type\",\n \"union_type\",\n \"intersection_type\",\n \"tuple_type\",\n \"singleton_type\",\n \"variadic_type\",\n \"variadic_type_pack\",\n]);\n\nfunction incompleteDelimitedNode(node: SyntaxNode): string | null {\n const closer = REQUIRED_CLOSERS.get(node.type);\n if (!closer) return null;\n return node.text.trimEnd().endsWith(closer) ? null : closer;\n}\n\nfunction isBundledGrammarTypeGap(node: SyntaxNode): boolean {\n let current: SyntaxNode | null = node;\n while (current) {\n if (TYPE_SYNTAX_ANCESTORS.has(current.type)) {\n if (current.type !== \"type_definition\") return true;\n if (/^\\s*(?:export\\s+)?type\\s+[A-Za-z_][A-Za-z0-9_]*/s.test(current.text)) return true;\n }\n current = current.parent;\n }\n return false;\n}\n\nexport const parseErrors: RuleDefinition = {\n id: \"react-luau/parse-error\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"Report executable Luau syntax that the bundled parser cannot form into a complete syntax tree.\",\n run(context) {\n const diagnostics = [];\n const covered: Array<{ start: number; end: number }> = [];\n\n for (const node of context.walk()) {\n const missingCloser = incompleteDelimitedNode(node);\n if (!node.isError && !node.isMissing && !missingCloser) continue;\n if (isBundledGrammarTypeGap(node)) continue;\n if (covered.some((range) => node.startIndex >= range.start && node.endIndex <= range.end)) continue;\n covered.push({ start: node.startIndex, end: node.endIndex });\n\n let message = \"Luau syntax could not be parsed cleanly at this location.\";\n if (node.isMissing) message = `Luau syntax is missing ${node.type}.`;\n else if (missingCloser) message = `Luau syntax is missing closing ${missingCloser}.`;\n\n diagnostics.push({\n node,\n message,\n help: \"Fix the syntax error before relying on downstream React-Luau diagnostics in this file.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
35
+ "import { normalizeRequireTarget, resolveModuleReference } from \"../module-resolution\";\nimport type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { DiagnosticInput, FunctionInfo, RuleContext, RuleDefinition, StateBinding } from \"../types\";\nimport { normalizeExpressionText, sameNode } from \"../ast/walk\";\nimport { callNameNode, declarationNames, identifierNode, fieldName, fieldNameNode, fieldValue, isNameShadowedBetween, stateBindingsFor } from \"./helpers\";\n\nconst HIGH_FREQUENCY = /(?:RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation)\\s*:\\s*Connect|BindToRenderStep|BindToSimulation/;\nconst STATIC_DISCOVERY = /(?::|\\.)(GetChildren|GetDescendants)$/;\nconst PURE_TRIVIAL_CALLS = /^(?:tostring|tonumber|type|typeof|math\\.[A-Za-z_][A-Za-z0-9_]*|string\\.(?:lower|upper|format|len)|Color3\\.(?:new|fromRGB|fromHSV)|Vector[23]\\.new|UDim2?\\.(?:new|fromOffset|fromScale)|CFrame\\.new)$/;\n\nfunction declarationForCall(call: SyntaxNode): SyntaxNode | null {\n let current: SyntaxNode | null = call.parent;\n while (current) {\n if (current.type === \"variable_declaration\") return current;\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction declaredNameForCall(call: SyntaxNode): string | null {\n const declaration = declarationForCall(call);\n return declaration ? declarationNames(declaration)[0] ?? null : null;\n}\n\nfunction isIdentifierPropertyName(node: SyntaxNode): boolean {\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\") return sameNode(parent.childForFieldName(\"field\"), node);\n if (parent?.type === \"method_index_expression\") {\n return sameNode(parent.childForFieldName(\"method\"), node) || sameNode(parent.namedChildren.at(-1), node);\n }\n return false;\n}\n\nfunction identifierReferences(\n context: RuleContext,\n owner: FunctionInfo,\n name: string,\n declaration: SyntaxNode | null,\n): SyntaxNode[] {\n if (!owner.body) return [];\n const result: SyntaxNode[] = [];\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"identifier\" || node.text !== name) continue;\n if (declaration && node.startIndex >= declaration.startIndex && node.endIndex <= declaration.endIndex) continue;\n if (isIdentifierPropertyName(node)) continue;\n if (isNameShadowedBetween(node, owner, name)) continue;\n result.push(node);\n }\n return result;\n}\n\nfunction nearestAncestor(node: SyntaxNode, stop: SyntaxNode, type: string): SyntaxNode | null {\n let current = node.parent;\n while (current && !sameNode(current, stop)) {\n if (current.type === type) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction highFrequencyCallback(node: SyntaxNode): SyntaxNode | null {\n let current = node.parent;\n while (current) {\n if (current.type === \"function_definition\") {\n const argumentsNode = current.parent;\n const call = argumentsNode?.type === \"arguments\" ? argumentsNode.parent : null;\n if (call?.type === \"function_call\") {\n const name = call.childForFieldName(\"name\")?.text ?? \"\";\n if (HIGH_FREQUENCY.test(name)) return current;\n }\n }\n current = current.parent;\n }\n return null;\n}\n\nfunction setterIsNoChangeGuarded(call: SyntaxNode, callback: SyntaxNode, binding: StateBinding): boolean {\n let current = call.parent;\n while (current && !sameNode(current, callback)) {\n if (current.type === \"if_statement\" || current.type === \"if_expression\") {\n const header = current.text.split(/\\bthen\\b/s, 1)[0] ?? \"\";\n const escaped = binding.valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (new RegExp(`\\\\b${escaped}\\\\b[^\\\\n]*(?:~=|==)|(?:~=|==)[^\\\\n]*\\\\b${escaped}\\\\b`).test(header)) return true;\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction setterIsOneShotGuarded(call: SyntaxNode, callback: SyntaxNode): boolean {\n let current = call.parent;\n while (current && !sameNode(current, callback)) {\n if (current.type === \"if_statement\") {\n const header = current.text.split(/\\bthen\\b/s, 1)[0] ?? \"\";\n const candidates = [\n ...header.matchAll(/\\bnot\\s+([A-Za-z_][A-Za-z0-9_]*)\\b/g),\n ...header.matchAll(/\\b([A-Za-z_][A-Za-z0-9_]*)\\s*==\\s*false\\b/g),\n ].map((match) => match[1]);\n for (const guard of candidates) {\n const escaped = guard.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (!new RegExp(`\\\\b${escaped}\\\\s*=\\\\s*true\\\\b`).test(current.text)) continue;\n if (new RegExp(`\\\\b${escaped}\\\\s*=\\\\s*false\\\\b`).test(callback.text)) continue;\n return true;\n }\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction componentRenderCost(context: RuleContext, owner: FunctionInfo): string[] {\n if (!owner.body) return [];\n let clones = 0;\n let loops = 0;\n let discovery = 0;\n for (const node of context.walk(owner.body)) {\n if (context.nearestFunction(node) !== owner) continue;\n if (node.type === \"for_statement\" || node.type === \"while_statement\" || node.type === \"repeat_statement\") loops += 1;\n if (node.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\");\n if (path === \"table.clone\") clones += 1;\n if (STATIC_DISCOVERY.test(path) || /:GetTagged$/.test(path)) discovery += 1;\n }\n const parts: string[] = [];\n if (clones > 0) parts.push(`${clones} table clone${clones === 1 ? \"\" : \"s\"}`);\n if (loops > 1) parts.push(`${loops} collection/loop passes`);\n if (discovery > 0) parts.push(`${discovery} Instance discovery call${discovery === 1 ? \"\" : \"s\"}`);\n return parts;\n}\n\nfunction memoizedImports(context: RuleContext): Map<string, \"shallow\" | \"custom\"> {\n const result = new Map<string, \"shallow\" | \"custom\">();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const localName = match[1];\n const memoKind = resolveModuleReference(normalizeRequireTarget(match[2]), context.project.memoizedModules);\n if (memoKind) result.set(localName, memoKind);\n }\n return result;\n}\n\nfunction fieldLabel(field: SyntaxNode): string {\n return fieldName(field) ?? field.childForFieldName(\"name\")?.text ?? \"prop\";\n}\n\nfunction isInlineFreshValue(node: SyntaxNode | null): boolean {\n return node?.type === \"table_constructor\" || node?.type === \"function_definition\";\n}\n\nexport const rerenderUnstableMemoProps: RuleDefinition = {\n id: \"react-luau/rerender-unstable-memo-props\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Warn when fresh table or function props defeat shallow React.memo comparisons.\",\n run(context) {\n const imports = memoizedImports(context);\n if (imports.size === 0) return [];\n const diagnostics: DiagnosticInput[] = [];\n\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.createElement\") continue;\n const component = context.containingComponent(call);\n if (!component || context.nearestFunction(call) !== component) continue;\n const args = context.callArguments(call);\n const childName = args[0]?.text.trim() ?? \"\";\n if (imports.get(childName) !== \"shallow\") continue;\n const props = args[1];\n if (!props || props.type !== \"table_constructor\") continue;\n\n const unstableFields = props.namedChildren\n .filter((node) => node.type === \"field\")\n .filter((field) => isInlineFreshValue(fieldValue(field)));\n if (unstableFields.length === 0) continue;\n const unstable = unstableFields.map(fieldLabel);\n const highlights = unstableFields.map(fieldNameNode);\n\n diagnostics.push({\n node: highlights[0],\n highlights,\n severity: \"warning\",\n message: `Memoized ${childName} receives fresh ${unstable.join(\", \")} prop${unstable.length === 1 ? \"\" : \"s\"} on every parent render.`,\n help: \"Fresh table or function identity prevents the shallow memo comparison from skipping this child. Stabilize the prop only when the parent rerenders frequently, move construction into the child, or remove ineffective memoization.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderHighFrequencyState: RuleDefinition = {\n id: \"react-luau/rerender-high-frequency-state\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find state updates from frame callbacks that can rerender expensive component trees continuously.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n const seen = new Set<string>();\n\n for (const call of context.findCalls()) {\n const callback = highFrequencyCallback(call);\n if (!callback) continue;\n const component = context.containingComponent(call);\n if (!component) continue;\n const setter = context.getCallPath(call) ?? \"\";\n const binding = context.model.stateBindings.find((candidate) => candidate.owner === component && candidate.setterName === setter);\n if (!binding || setterIsNoChangeGuarded(call, callback, binding) || setterIsOneShotGuarded(call, callback)) continue;\n const key = `${callback.startIndex}:${setter}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const renderCost = componentRenderCost(context, component);\n diagnostics.push({\n node: callNameNode(call),\n severity: \"warning\",\n message: `${binding.valueName} has a state setter called from a per-frame callback and may cause frequent rerenders when its value changes.`,\n help: renderCost.length > 0\n ? `This render also performs ${renderCost.join(\" and \")}. Isolate or throttle the high-frequency state, or use Bindings for host-property-only updates.`\n : \"Isolate or throttle the high-frequency state. Use React.useBinding when the value only drives host Instance properties.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nfunction singleReturnExpression(callback: SyntaxNode | undefined): SyntaxNode | null {\n if (!callback || callback.type !== \"function_definition\") return null;\n const body = callback.childForFieldName(\"body\");\n if (!body || body.namedChildren.length !== 1) return null;\n const statement = body.namedChildren[0];\n if (statement.type !== \"return_statement\") return null;\n const expressionList = statement.namedChildren.find((child) => child.type === \"expression_list\");\n if (!expressionList || expressionList.namedChildren.length !== 1) return null;\n return expressionList.namedChildren[0] ?? null;\n}\n\nfunction isTrivialMemoExpression(expression: SyntaxNode, context: RuleContext): boolean {\n if (expression.type === \"table_constructor\" || expression.type === \"function_definition\") return false;\n let calls = 0;\n for (const node of context.walk(expression)) {\n if (node.type === \"for_statement\" || node.type === \"while_statement\" || node.type === \"repeat_statement\") return false;\n if (node.type !== \"function_call\") continue;\n calls += 1;\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\");\n if (/random|GenerateGUID|GetServerTimeNow|tick|time|clock/i.test(path)) return false;\n if (!PURE_TRIVIAL_CALLS.test(path)) return false;\n }\n return calls <= 2 && expression.text.length <= 180;\n}\n\nfunction valueIdentityIsObservedByHook(context: RuleContext, owner: FunctionInfo, name: string, declaration: SyntaxNode): boolean {\n if (!owner.body) return false;\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!/^React\\.use(?:Effect|LayoutEffect|Memo|Callback)$/.test(path)) continue;\n const dependencies = context.callArguments(call)[1];\n if (!dependencies) continue;\n for (const reference of identifierReferences(context, owner, name, declaration)) {\n if (reference.startIndex >= dependencies.startIndex && reference.endIndex <= dependencies.endIndex) return true;\n }\n }\n return false;\n}\n\nfunction isEmptyDependencyTable(node: SyntaxNode | undefined): boolean {\n return Boolean(node && node.type === \"table_constructor\" && node.namedChildren.length === 0);\n}\n\nexport const rerenderUnnecessaryUseMemo: RuleDefinition = {\n id: \"react-luau/rerender-unnecessary-usememo\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find trivial derived values that cost more to memoize than to compute directly.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.useMemo\") continue;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n const declaration = declarationForCall(call);\n const name = declaredNameForCall(call);\n const argumentsList = context.callArguments(call);\n const expression = singleReturnExpression(argumentsList[0]);\n if (isEmptyDependencyTable(argumentsList[1])) continue;\n if (!owner || !declaration || !name || !expression || !isTrivialMemoExpression(expression, context)) continue;\n if (valueIdentityIsObservedByHook(context, owner, name, declaration)) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: \"useMemo caches a trivial derived value.\",\n help: \"Compute the value directly unless stable identity or a genuinely expensive calculation is required.\",\n });\n }\n return diagnostics;\n },\n};\n\nfunction isOnlyDirectFunctionCallReference(node: SyntaxNode, name: string): boolean {\n const parent = node.parent;\n return parent?.type === \"function_call\"\n && sameNode(parent.childForFieldName(\"name\"), node)\n && (parent.childForFieldName(\"name\")?.text.trim() ?? \"\") === name;\n}\n\nexport const rerenderUnnecessaryUseCallback: RuleDefinition = {\n id: \"react-luau/rerender-unnecessary-usecallback\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find useCallback values whose stable function identity is never observed.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.useCallback\") continue;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n const declaration = declarationForCall(call);\n const name = declaredNameForCall(call);\n if (!owner || !declaration || !name) continue;\n const references = identifierReferences(context, owner, name, declaration);\n if (references.length === 0 || references.some((node) => !isOnlyDirectFunctionCallReference(node, name))) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: `${name} is wrapped in useCallback, but its identity is never observed.`,\n help: \"Use a normal local function. Keep useCallback when the function is passed to a memoized child, retained by another hook, or otherwise compared by identity.\",\n });\n }\n return diagnostics;\n },\n};\n\nfunction staticDiscoveryPath(path: string): boolean {\n if (/:GetTagged$/.test(path)) return true;\n if (!STATIC_DISCOVERY.test(path)) return false;\n const receiver = path.replace(/(?::|\\.)(?:GetChildren|GetDescendants)$/, \"\");\n return /^(?:ReplicatedStorage|ServerStorage|ServerScriptService|StarterGui|StarterPlayer|script)(?:\\.|:|$)/.test(receiver);\n}\n\nexport const rerenderStaticDiscoveryInRender: RuleDefinition = {\n id: \"react-luau/rerender-static-discovery-in-render\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find static Instance/module discovery repeated during component render.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || context.nearestFunction(call) !== component) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (!staticDiscoveryPath(path)) continue;\n const loop = nearestAncestor(call, component.node, \"for_statement\");\n const body = loop?.childForFieldName(\"body\");\n const requiresModules = Boolean(body && [...context.walk(body)].some((node) => node.type === \"function_call\" && context.getCallPath(node) === \"require\"));\n diagnostics.push({\n node: callNameNode(call),\n severity: \"warning\",\n message: `${path} runs during component render${requiresModules ? \" and feeds module requires\" : \"\"}.`,\n help: requiresModules\n ? \"Discover and require static modules once outside the component, or cache the derived catalog by the inputs that can actually change.\"\n : \"Move static discovery outside the component or memoize the derived result when the source can change.\",\n });\n }\n return diagnostics;\n },\n};\n\nfunction genericLoopCollection(loop: SyntaxNode): string | null {\n const clause = loop.namedChildren.find((child) => child.type === \"for_generic_clause\");\n if (!clause) return null;\n const match = clause.text.match(/\\bin\\s+(.+)$/s);\n if (!match) return null;\n const expression = normalizeExpressionText(match[1]);\n if (!expression || expression.length > 160) return null;\n return expression;\n}\n\nexport const rerenderRepeatedCollectionScan: RuleDefinition = {\n id: \"react-luau/rerender-repeated-collection-scan\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find repeated direct render passes over the same collection expression.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const component of context.model.functions) {\n if (!component.isComponent || !component.body) continue;\n const groups = new Map<string, { display: string; loops: SyntaxNode[] }>();\n for (const node of context.walk(component.body)) {\n if (node.type !== \"for_statement\" || context.nearestFunction(node) !== component) continue;\n const collection = genericLoopCollection(node);\n if (!collection || collection === \"{}\") continue;\n const clause = node.namedChildren.find((child) => child.type === \"for_generic_clause\");\n const display = clause?.text.match(/\\bin\\s+(.+)$/s)?.[1]?.trim().replace(/\\s+/g, \" \") ?? collection;\n const group = groups.get(collection) ?? { display, loops: [] };\n group.loops.push(node);\n groups.set(collection, group);\n }\n for (const { display, loops } of groups.values()) {\n if (loops.length < 2) continue;\n const repeatedCollections = loops.map((loop) => {\n const clause = loop.namedChildren.find((child) => child.type === \"for_generic_clause\");\n return clause?.namedChildren.at(-1) ?? clause ?? loop;\n });\n diagnostics.push({\n node: repeatedCollections[1],\n highlights: repeatedCollections,\n message: `${display} is scanned ${loops.length} times during this render.`,\n help: \"Consider combining the passes or deriving a lookup when the collection is large or the component rerenders frequently.\",\n });\n }\n }\n return diagnostics;\n },\n};\n\nexport const rerenderStaticState: RuleDefinition = {\n id: \"react-luau/rerender-static-state\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Find React state whose setter is never used and therefore cannot change.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const component of context.model.functions) {\n if (!component.isComponent || !component.body) continue;\n for (const binding of stateBindingsFor(context, component)) {\n if (binding.setterName === \"_\" || binding.setterName.startsWith(\"_\")) continue;\n const setterRefs = identifierReferences(context, component, binding.setterName, binding.declaration);\n if (setterRefs.length > 0) continue;\n const valueRefs = identifierReferences(context, component, binding.valueName, binding.declaration);\n if (valueRefs.length === 0) continue;\n diagnostics.push({\n node: identifierNode(binding.declaration, binding.setterName) ?? binding.declaration,\n message: `${binding.valueName} cannot change because ${binding.setterName} is never used.`,\n help: \"Use a normal derived value. If the initial value must be captured once for the component lifetime, use a ref.\",\n });\n }\n }\n return diagnostics;\n },\n};\n\nfunction memoReturnsCurrentCell(call: SyntaxNode, context: RuleContext): boolean {\n const args = context.callArguments(call);\n const callback = args[0];\n const deps = args[1];\n if (!callback || callback.type !== \"function_definition\" || deps?.type !== \"table_constructor\" || deps.namedChildren.length > 0) return false;\n const expression = singleReturnExpression(callback);\n if (!expression || expression.type !== \"table_constructor\") return false;\n const fields = expression.namedChildren.filter((node) => node.type === \"field\");\n return fields.length === 1 && fieldName(fields[0]) === \"current\";\n}\n\nexport const preferUseRefForMutableCell: RuleDefinition = {\n id: \"react-luau/prefer-use-ref-for-mutable-cell\",\n category: \"Hooks\",\n severity: \"suggestion\",\n description: \"Prefer useRef over useMemo-created tables that only emulate a mutable current cell.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n for (const call of context.findCalls()) {\n if (context.resolveCallPath(context.getCallPath(call) ?? \"\") !== \"React.useMemo\") continue;\n if (!memoReturnsCurrentCell(call, context)) continue;\n const name = declaredNameForCall(call) ?? \"This value\";\n diagnostics.push({\n node: callNameNode(call),\n message: `${name} uses useMemo to create a { current = ... } mutable cell.`,\n help: \"Use React.useRef(initialValue) to express the same lifetime and mutable-cell intent directly.\",\n });\n }\n return diagnostics;\n },\n};\n",
36
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport { normalizeRequireTarget, resolveModuleReference } from \"../module-resolution\";\nimport type { BindingCandidateHookSummary, ExternalCallbackFunctionSummary, FixPreview, FunctionInfo, RuleContext, RuleDefinition, StateBinding } from \"../types\";\nimport { sameNode } from \"../ast/walk\";\nimport { callNameNode, declarationNames, fieldName, fieldValue, isNameShadowedBetween } from \"./helpers\";\n\nconst HIGH_FREQUENCY = /(?:RenderStepped|Heartbeat|Stepped|PreRender|PreSimulation|PostSimulation)\\s*:\\s*Connect|BindToRenderStep|BindToSimulation/;\nconst EXTERNAL_CALLBACK = /(?:^|[.:])(?:Connect|Once|Subscribe|Observe|Listen|Watch)$/i;\nconst NON_BINDABLE_HOST_FIELDS = new Set([\"ref\", \"key\", \"children\"]);\n\nfunction replaceWithinNode(container: SyntaxNode, target: SyntaxNode, replacement: string): string | null {\n const start = target.startIndex - container.startIndex;\n const end = target.endIndex - container.startIndex;\n if (start < 0 || end < start || end > container.text.length) return null;\n return `${container.text.slice(0, start)}${replacement}${container.text.slice(end)}`;\n}\n\nfunction bindingModeFixPreview(\n summary: BindingCandidateHookSummary,\n call: SyntaxNode,\n context: RuleContext,\n): FixPreview | undefined {\n const parameterIndex = summary.bindingModeParameterIndex;\n if (parameterIndex === undefined || summary.bindingWhenTruthy === undefined) return undefined;\n const desired = summary.bindingWhenTruthy ? \"true\" : \"false\";\n const args = context.callArguments(call);\n\n if (parameterIndex < args.length) {\n const after = replaceWithinNode(call, args[parameterIndex], desired);\n if (!after || after === call.text) return undefined;\n return {\n kind: \"exact\",\n before: call.text,\n after,\n note: summary.bindingModeParameterName\n ? `Switch the ${summary.bindingModeParameterName} parameter to the hook's Binding mode.`\n : \"Switch this call to the hook's Binding mode.\",\n };\n }\n\n if (parameterIndex >= args.length) {\n const close = call.text.lastIndexOf(\")\");\n if (close < 0) return undefined;\n // Omitted Lua/Luau arguments are nil. Fill any skipped optional parameters\n // explicitly so the inferred Binding-mode argument lands in the right slot.\n const skipped = Array.from({ length: parameterIndex - args.length }, () => \"nil\");\n const appended = [...skipped, desired].join(\", \");\n const insertion = `${args.length > 0 ? \", \" : \"\"}${appended}`;\n return {\n kind: \"exact\",\n before: call.text,\n after: `${call.text.slice(0, close)}${insertion}${call.text.slice(close)}`,\n note: summary.bindingModeParameterName\n ? `Enable the hook's Binding mode through the ${summary.bindingModeParameterName} parameter without changing omitted optional arguments.`\n : \"Enable the hook's Binding mode without changing omitted optional arguments.\",\n };\n }\n\n return undefined;\n}\n\nfunction callMemberFixPreview(call: SyntaxNode, replacement: string): FixPreview | undefined {\n const name = callNameNode(call);\n const path = name.text;\n const separator = Math.max(path.lastIndexOf(\".\"), path.lastIndexOf(\":\"));\n const member = separator >= 0 ? path.slice(separator + 1) : path;\n const replacementName = separator >= 0 ? `${path.slice(0, separator + 1)}${replacement}` : replacement;\n const after = replaceWithinNode(call, name, replacementName);\n if (!after || member === replacement) return undefined;\n return { kind: \"exact\", before: call.text, after };\n}\n\nfunction useBindingFixPreview(call: SyntaxNode): FixPreview | undefined {\n const name = callNameNode(call);\n const current = name.text;\n const afterName = current.replace(/(?:^|\\.)useState$/, (match) => match.replace(\"useState\", \"useBinding\"));\n if (afterName === current) return undefined;\n const after = replaceWithinNode(call, name, afterName);\n return after ? { kind: \"exact\", before: call.text, after } : undefined;\n}\n\nfunction importedBindingCandidateHooks(context: RuleContext): Map<string, BindingCandidateHookSummary> {\n const result = new Map<string, BindingCandidateHookSummary>();\n\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n context.project.bindingCandidateHooks,\n );\n if (summary) result.set(match[1], summary);\n }\n\n return result;\n}\n\nfunction importedExternalCallbackFunctions(context: RuleContext): Map<string, ExternalCallbackFunctionSummary> {\n const result = new Map<string, ExternalCallbackFunctionSummary>();\n\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n context.project.externalCallbackModules,\n );\n if (summary) result.set(match[1], summary);\n }\n\n return result;\n}\n\nfunction importedBindingCompatibleComponentProps(context: RuleContext): Map<string, Set<string>> {\n const result = new Map<string, Set<string>>();\n\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n context.project.bindingCompatibleComponentProps,\n );\n if (summary) result.set(match[1], summary);\n }\n\n return result;\n}\n\nfunction declarationForCall(call: SyntaxNode): SyntaxNode | null {\n let current: SyntaxNode | null = call.parent;\n while (current) {\n if (current.type === \"variable_declaration\") return current;\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return null;\n current = current.parent;\n }\n return null;\n}\n\nconst TRANSPARENT_PARENTS = new Set([\n \"binary_expression\",\n \"unary_expression\",\n \"parenthesized_expression\",\n \"cast_expression\",\n \"type_cast_expression\",\n \"interpolated_string\",\n \"string_interpolation\",\n \"expression_list\",\n \"assignment_statement\",\n \"arguments\",\n \"function_call\",\n \"dot_index_expression\",\n \"method_index_expression\",\n \"table_constructor\",\n \"field\",\n]);\n\nfunction isInside(node: SyntaxNode, ancestor: SyntaxNode): boolean {\n let current: SyntaxNode | null = node;\n while (current) {\n if (sameNode(current, ancestor)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction isIdentifierPropertyName(node: SyntaxNode): boolean {\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\") return sameNode(parent.childForFieldName(\"field\"), node);\n if (parent?.type === \"method_index_expression\") return sameNode(parent.childForFieldName(\"method\"), node) || sameNode(parent.namedChildren.at(-1), node);\n return false;\n}\n\nfunction isReadNode(node: SyntaxNode, valueName: string, owner: FunctionInfo, declaration: SyntaxNode, context: RuleContext): boolean {\n if (node.type !== \"identifier\" || node.text !== valueName) return false;\n if (isInside(node, declaration)) return false;\n if (isIdentifierPropertyName(node)) return false;\n if (isNameShadowedBetween(node, owner, valueName)) return false;\n const parent = node.parent;\n if (parent?.type === \"variable_list\" || parent?.type === \"typed_identifier\") return false;\n if (parent?.type === \"field\" && !sameNode(fieldValue(parent), node) && /^[A-Za-z_][A-Za-z0-9_]*\\s*=/.test(parent.text.trim())) {\n return false;\n }\n return true;\n}\n\nfunction hasAnyRead(valueName: string, owner: FunctionInfo, declaration: SyntaxNode, context: RuleContext): boolean {\n if (!owner.body) return false;\n return [...context.walk(owner.body)].some((node) => isReadNode(node, valueName, owner, declaration, context));\n}\n\nfunction isCreateElementCall(call: SyntaxNode, context: RuleContext): boolean {\n return call.type === \"function_call\"\n && context.resolveCallPath(context.getCallPath(call) ?? \"\") === \"React.createElement\";\n}\n\nfunction isHostCreateElementCall(call: SyntaxNode, context: RuleContext): boolean {\n if (!isCreateElementCall(call, context)) return false;\n const args = context.callArguments(call);\n const host = args[0]?.text.trim() ?? \"\";\n return /^(?:\"[^\"]+\"|'[^']+')$/.test(host);\n}\n\nfunction isTransparentUsage(\n node: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): boolean {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return false;\n\n if (parent.type === \"field\") {\n const value = fieldValue(parent);\n if (!value || !sameNode(value, current)) return false;\n const property = fieldName(parent);\n if (!property || NON_BINDABLE_HOST_FIELDS.has(property)) return false;\n const table = parent.parent;\n if (table?.type !== \"table_constructor\") return false;\n const args = table.parent;\n if (args?.type !== \"arguments\") return false;\n const call = args.parent;\n if (!call || !isCreateElementCall(call, context)) return false;\n if (!sameNode(context.callArguments(call)[1], table)) return false;\n if (isHostCreateElementCall(call, context)) return true;\n\n const component = context.callArguments(call)[0]?.text.trim() ?? \"\";\n return compatibleComponentProps.get(component)?.has(property) ?? false;\n }\n\n if (parent.type === \"if_statement\" || parent.type === \"elseif_clause\" || parent.type === \"while_statement\"\n || parent.type === \"repeat_statement\" || parent.type === \"return_statement\") {\n return false;\n }\n\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return false;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return false;\n current = parent;\n }\n return false;\n}\n\nfunction derivedLocalDeclarationForRead(node: SyntaxNode): SyntaxNode | null {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return null;\n if (parent.type === \"variable_declaration\") return parent;\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return null;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return null;\n current = parent;\n }\n return null;\n}\n\nfunction stateReadsAreBindingCompatible(\n valueName: string,\n owner: FunctionInfo,\n declaration: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n visited = new Set<string>(),\n): boolean {\n if (!owner.body) return false;\n const visitKey = `${declaration.startIndex}:${valueName}`;\n if (visited.has(visitKey)) return false;\n visited.add(visitKey);\n\n let reads = 0;\n for (const node of context.walk(owner.body)) {\n if (!isReadNode(node, valueName, owner, declaration, context)) continue;\n reads += 1;\n if (isTransparentUsage(node, context, compatibleComponentProps)) continue;\n\n const derivedDeclaration = derivedLocalDeclarationForRead(node);\n const derivedNames = derivedDeclaration ? declarationNames(derivedDeclaration) : [];\n if (derivedDeclaration && derivedNames.length === 1) {\n if (stateReadsAreBindingCompatible(\n derivedNames[0],\n owner,\n derivedDeclaration,\n context,\n compatibleComponentProps,\n new Set(visited),\n )) continue;\n }\n return false;\n }\n\n return reads > 0;\n}\n\nfunction callbackSource(path: string): { highFrequency: boolean; external: boolean } {\n const normalized = path.replace(/\\s+/g, \"\");\n const highFrequency = HIGH_FREQUENCY.test(normalized);\n const final = normalized.split(/[.:]/).at(-1) ?? normalized;\n const external = highFrequency || EXTERNAL_CALLBACK.test(normalized) || EXTERNAL_CALLBACK.test(final);\n return { highFrequency, external };\n}\n\nfunction importedCallbackSource(\n call: SyntaxNode,\n callbackArgument: SyntaxNode,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const path = context.getCallPath(call) ?? \"\";\n const summary = importedCallbacks.get(path);\n if (!summary) return null;\n const args = context.callArguments(call);\n const callbackIndex = args.findIndex((arg) => sameNode(arg, callbackArgument));\n if (callbackIndex < 0 || !summary.callbackParameterIndexes.includes(callbackIndex)) return null;\n return {\n highFrequency: summary.highFrequency || args.some((arg) => HIGH_FREQUENCY.test(arg.text)),\n external: true,\n };\n}\n\nfunction directCallbackSource(\n node: SyntaxNode,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const parent = node.parent;\n if (parent?.type !== \"arguments\" || parent.parent?.type !== \"function_call\") return null;\n const call = parent.parent;\n const imported = importedCallbackSource(call, node, importedCallbacks, context);\n if (imported) return imported;\n const raw = call.childForFieldName(\"name\")?.text ?? \"\";\n const source = callbackSource(raw);\n return source.external ? source : null;\n}\n\nfunction namedFunctionCallbackSource(\n fn: FunctionInfo,\n owner: FunctionInfo,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n if (!fn.name || !owner.body) return null;\n let foundExternal = false;\n let foundHighFrequency = false;\n\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\") continue;\n const args = context.callArguments(call);\n const callbackArg = args.find((arg) => arg.type === \"identifier\" && arg.text === fn.name);\n if (!callbackArg) continue;\n const imported = importedCallbackSource(call, callbackArg, importedCallbacks, context);\n const source = imported ?? callbackSource(context.getCallPath(call) ?? \"\");\n if (!source.external) continue;\n foundExternal = true;\n foundHighFrequency ||= source.highFrequency;\n }\n\n return foundExternal ? { highFrequency: foundHighFrequency, external: true } : null;\n}\n\nfunction setterCallbackSource(\n call: SyntaxNode,\n binding: StateBinding,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const owner = binding.owner;\n if (!owner) return null;\n const nearest = context.nearestFunction(call);\n if (!nearest || nearest === owner) return null;\n\n const direct = directCallbackSource(nearest.node, importedCallbacks, context);\n if (direct) return direct;\n\n return namedFunctionCallbackSource(nearest, owner, importedCallbacks, context);\n}\n\nfunction bindingHasExternalOrHighFrequencyUpdates(\n binding: StateBinding,\n importedCallbacks: Map<string, ExternalCallbackFunctionSummary>,\n context: RuleContext,\n): { highFrequency: boolean; external: boolean } | null {\n const owner = binding.owner;\n if (!owner?.body) return null;\n let highFrequency = false;\n let external = false;\n\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"function_call\") continue;\n const path = context.getCallPath(node);\n if (path !== binding.setterName) continue;\n const source = setterCallbackSource(node, binding, importedCallbacks, context);\n if (!source) continue;\n highFrequency ||= source.highFrequency;\n external ||= source.external;\n }\n\n return highFrequency || external ? { highFrequency, external } : null;\n}\n\nfunction returnedHookValues(binding: StateBinding, context: RuleContext): Array<{ exportName: string; node: SyntaxNode }> {\n const owner = binding.owner;\n if (!owner?.body || !owner.isHook) return [];\n const results: Array<{ exportName: string; node: SyntaxNode }> = [];\n\n for (const node of context.walk(owner.body)) {\n if (node.type !== \"return_statement\") continue;\n if (context.nearestFunction(node) !== owner) continue;\n\n for (const returned of node.namedChildren.flatMap((child) => child.type === \"expression_list\" ? child.namedChildren : [child])) {\n if (returned.type === \"identifier\" && returned.text === binding.valueName) {\n results.push({ exportName: binding.valueName, node: returned });\n } else if (returned.type === \"table_constructor\") {\n for (const field of returned.namedChildren.filter((child) => child.type === \"field\")) {\n const value = fieldValue(field);\n const name = fieldName(field);\n if (value?.type === \"identifier\" && value.text === binding.valueName && name) {\n results.push({ exportName: name, node: value });\n }\n }\n }\n }\n }\n\n return results;\n}\n\nfunction hookCallSitesAreBindingCompatible(\n binding: StateBinding,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): boolean {\n const owner = binding.owner;\n if (!owner?.isHook || !owner.name) return false;\n const returned = returnedHookValues(binding, context);\n if (returned.length === 0) return false;\n\n let callSites = 0;\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call);\n if (path !== owner.name) continue;\n const declaration = declarationForCall(call);\n if (!declaration) continue;\n const localName = declarationNames(declaration)[0] ?? null;\n const caller = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!localName || !caller) continue;\n\n if (returned.length === 1 && returned[0].exportName === binding.valueName) {\n if (!stateReadsAreBindingCompatible(localName, caller, declaration, context, compatibleComponentProps)) return false;\n callSites += 1;\n continue;\n }\n }\n\n return callSites > 0;\n}\n\nfunction selectorFieldName(call: SyntaxNode, context: RuleContext): string | null {\n const selector = context.callArguments(call)[0];\n if (!selector || selector.type !== \"function_definition\") return null;\n const text = selector.text;\n return text.match(/\\breturn\\s+[A-Za-z_][A-Za-z0-9_]*\\.([A-Za-z_][A-Za-z0-9_]*)\\b/)?.[1]\n ?? text.match(/\\breturn\\s+[A-Za-z_][A-Za-z0-9_]*\\[\\s*[\"']([^\"']+)[\"']\\s*\\]/)?.[1]\n ?? null;\n}\n\nfunction callDefinitelyUsesBindingMode(\n summary: BindingCandidateHookSummary,\n call: SyntaxNode,\n context: RuleContext,\n): boolean {\n const parameterIndex = summary.bindingModeParameterIndex;\n if (parameterIndex === undefined || summary.bindingWhenTruthy === undefined) return false;\n\n const argument = context.callArguments(call)[parameterIndex];\n const value = argument?.text.trim() ?? \"nil\";\n let truthy: boolean | null = null;\n if (value === \"true\") truthy = true;\n else if (value === \"false\" || value === \"nil\") truthy = false;\n if (truthy === null) return false;\n\n return truthy === summary.bindingWhenTruthy;\n}\n\nfunction shouldRecommendImportedHook(\n summary: BindingCandidateHookSummary,\n call: SyntaxNode,\n localName: string,\n owner: FunctionInfo,\n declaration: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): boolean {\n if (!summary.external || callDefinitelyUsesBindingMode(summary, call, context)) return false;\n if (!hasAnyRead(localName, owner, declaration, context)) return false;\n\n // A hook that mirrors an externally changing Instance property through React state is\n // already a strong producer-side Binding candidate. Consumers may need Binding:map or a\n // binding-aware effect rather than a direct value substitution, so requiring every read to\n // already terminate at a host property creates widespread false negatives.\n if (summary.sourceKind === \"measurement\") return true;\n\n return stateReadsAreBindingCompatible(localName, owner, declaration, context, compatibleComponentProps);\n}\n\n\ntype BindingUsageKind = \"compatible\" | \"custom-component\" | \"effect\" | \"structural\" | \"unknown\";\n\ninterface BindingUsageSummary {\n reads: number;\n compatible: number;\n customComponent: number;\n visualCustomComponent: number;\n effect: number;\n structural: number;\n unknown: number;\n}\n\nconst LIKELY_VISUAL_PROP = /(?:position|size|rotation|transparency|opacity|color|image|text|anchor|visible|enabled|layout|scale|offset|zindex|canvas|viewport|cframe|width|height|radius|stroke|padding|spacing|angle|alpha|progress)/i;\n\nfunction createElementPropUsage(node: SyntaxNode, context: RuleContext): { component: string; property: string } | null {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return null;\n if (parent.type === \"field\") {\n const value = fieldValue(parent);\n if (!value || !sameNode(value, current)) return null;\n const property = fieldName(parent);\n const table = parent.parent;\n const args = table?.parent;\n const call = args?.parent;\n if (!property || table?.type !== \"table_constructor\" || args?.type !== \"arguments\" || !call || !isCreateElementCall(call, context)) {\n return null;\n }\n if (!sameNode(context.callArguments(call)[1], table)) return null;\n const component = context.callArguments(call)[0]?.text.trim() ?? \"\";\n if (!component || /^(?:\"[^\"]+\"|'[^']+')$/.test(component)) return null;\n return { component, property };\n }\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return null;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return null;\n current = parent;\n }\n return null;\n}\n\nfunction isEffectUsage(node: SyntaxNode, context: RuleContext): boolean {\n const nearest = context.nearestFunction(node);\n if (nearest) {\n const parent = nearest.node.parent;\n if (parent?.type === \"arguments\" && parent.parent?.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(parent.parent) ?? \"\");\n if (/^React\\.use(?:Effect|LayoutEffect)$/.test(path)) return true;\n }\n }\n\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) break;\n if (parent.type === \"arguments\" && parent.parent?.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(parent.parent) ?? \"\");\n if (/^React\\.use(?:Effect|LayoutEffect)$/.test(path)) return true;\n }\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") break;\n current = parent;\n }\n return false;\n}\n\nfunction isStructuralUsage(node: SyntaxNode): boolean {\n let current: SyntaxNode | null = node;\n while (current) {\n const parent: SyntaxNode | null = current.parent;\n if (!parent) return false;\n if (parent.type === \"if_statement\" || parent.type === \"elseif_clause\" || parent.type === \"while_statement\"\n || parent.type === \"repeat_statement\" || parent.type === \"return_statement\") return true;\n if (parent.type === \"function_definition\" || parent.type === \"function_declaration\") return false;\n if (!TRANSPARENT_PARENTS.has(parent.type)) return false;\n current = parent;\n }\n return false;\n}\n\nfunction classifyBindingUsage(\n node: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): BindingUsageKind {\n if (isTransparentUsage(node, context, compatibleComponentProps)) return \"compatible\";\n if (createElementPropUsage(node, context)) return \"custom-component\";\n if (isEffectUsage(node, context)) return \"effect\";\n if (isStructuralUsage(node)) return \"structural\";\n return \"unknown\";\n}\n\nfunction bindingUsageSummary(\n valueName: string,\n owner: FunctionInfo,\n declaration: SyntaxNode,\n context: RuleContext,\n compatibleComponentProps: Map<string, Set<string>>,\n): BindingUsageSummary {\n const summary: BindingUsageSummary = {\n reads: 0,\n compatible: 0,\n customComponent: 0,\n visualCustomComponent: 0,\n effect: 0,\n structural: 0,\n unknown: 0,\n };\n if (!owner.body) return summary;\n\n for (const node of context.walk(owner.body)) {\n if (!isReadNode(node, valueName, owner, declaration, context)) continue;\n summary.reads += 1;\n const customComponentUsage = createElementPropUsage(node, context);\n const kind = classifyBindingUsage(node, context, compatibleComponentProps);\n if (kind === \"compatible\") summary.compatible += 1;\n else if (kind === \"custom-component\") {\n summary.customComponent += 1;\n if (customComponentUsage && LIKELY_VISUAL_PROP.test(customComponentUsage.property)) {\n summary.visualCustomComponent += 1;\n }\n } else if (kind === \"effect\") summary.effect += 1;\n else if (kind === \"structural\") summary.structural += 1;\n else summary.unknown += 1;\n }\n return summary;\n}\n\nfunction hasCandidatePresentationEvidence(summary: BindingUsageSummary): boolean {\n return summary.compatible > 0 || summary.visualCustomComponent > 0;\n}\n\nexport const preferBindingOverState: RuleDefinition = {\n id: \"react-luau/prefer-binding-over-state\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Prefer React.useBinding when externally updated values do not need React reconciliation on every change.\",\n run(context) {\n const diagnostics = [];\n const seen = new Set<string>();\n\n const importedHooks = importedBindingCandidateHooks(context);\n const importedCallbacks = importedExternalCallbackFunctions(context);\n const compatibleComponentProps = importedBindingCompatibleComponentProps(context);\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const summary = importedHooks.get(path);\n if (!summary) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner) continue;\n if (!shouldRecommendImportedHook(summary, call, localName, owner, declaration, context, compatibleComponentProps)) continue;\n\n const key = `imported:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const hasBindingMode = summary.bindingModeParameterIndex !== undefined && summary.bindingWhenTruthy !== undefined;\n const message = summary.sourceKind === \"measurement\"\n ? hasBindingMode\n ? `${path} is using its React state mode for an externally changing GUI measurement, so ${localName} rerenders this consumer when the measurement changes.`\n : `${path} returns React state for an externally changing GUI measurement, so ${localName} rerenders this consumer when the measurement changes.`\n : summary.sourceKind === \"derived-external-state\"\n ? `${path} derives React state from another externally updated reactive value, so ${localName} adds another rerendering state layer.`\n : `${path} returns state updated${summary.highFrequency ? \" from a high-frequency source\" : \" from an external callback\"}, and ${localName} only flows into bindable host properties.`;\n const bindingModeInstruction = hasBindingMode\n ? `Use the hook's Binding-returning mode${summary.bindingModeParameterName ? ` by passing ${summary.bindingWhenTruthy ? \"true\" : \"false\"} for ${summary.bindingModeParameterName}` : \"\"}. `\n : \"Prefer a Binding-returning measurement hook. \";\n const help = summary.sourceKind === \"measurement\"\n ? `${bindingModeInstruction}Use Binding:map for derived visual values or a binding-aware effect for imperative reactions; keep React state only when the measurement truly needs to rebuild component structure.`\n : \"Prefer a Binding-returning hook API so host properties can update without rerendering the consumer.\";\n diagnostics.push({\n node: callNameNode(call),\n message,\n help,\n fixPreview: hasBindingMode ? bindingModeFixPreview(summary, call, context) : undefined,\n });\n }\n\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const member = path.split(/[.:]/).at(-1) ?? path;\n const bindingAlternative = context.project.bindingApiAlternatives.get(member);\n if (!bindingAlternative) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner || !hasAnyRead(localName, owner, declaration, context)) continue;\n if (!stateReadsAreBindingCompatible(localName, owner, declaration, context, compatibleComponentProps)) continue;\n const field = selectorFieldName(call, context);\n\n const key = `state-api:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} subscribes ${localName} through React state${field ? ` for ${field}` : \"\"}, but ${bindingAlternative} is available and every use of the value only updates bindable host properties.`,\n help: `Use ${bindingAlternative} so the host property can update without rerendering the component.`,\n fixPreview: callMemberFixPreview(call, bindingAlternative),\n });\n }\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n const updateKind = bindingHasExternalOrHighFrequencyUpdates(binding, importedCallbacks, context);\n if (!updateKind) continue;\n\n const localCompatible = stateReadsAreBindingCompatible(\n binding.valueName,\n owner,\n binding.declaration,\n context,\n compatibleComponentProps,\n );\n const hookCompatible = owner.isHook ? hookCallSitesAreBindingCompatible(binding, context, compatibleComponentProps) : false;\n if (owner.isHook ? !hookCompatible : !localCompatible) continue;\n\n const key = `${binding.call.startIndex}:${binding.call.endIndex}:${binding.valueName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n if (owner.isHook && hookCompatible) {\n diagnostics.push({\n node: callNameNode(binding.call),\n message: `Hook state ${binding.valueName} is updated${updateKind.highFrequency ? \" from a high-frequency source\" : \" from an external callback\"} and is only consumed by host properties at analyzed call sites.`,\n help: \"Consider returning a Binding, or adding a Binding-returning variant of this hook, so consumers can update host properties without rerendering.\",\n });\n } else {\n diagnostics.push({\n node: callNameNode(binding.call),\n message: `State ${binding.valueName} is updated${updateKind.highFrequency ? \" from a high-frequency callback\" : \" from an external callback\"} and is read by the component render path.`,\n help: \"Prefer React.useBinding when the update is visual and does not need React to rebuild component structure.\",\n fixPreview: useBindingFixPreview(binding.call),\n });\n }\n }\n\n return diagnostics;\n },\n};\n\n\nexport const preferBindingOverStateCandidate: RuleDefinition = {\n id: \"react-luau/prefer-binding-over-state-candidate\",\n category: \"Performance\",\n severity: \"suggestion\",\n description: \"Surface lower-confidence state-to-Binding opportunities that need developer review.\",\n run(context) {\n const diagnostics = [];\n const seen = new Set<string>();\n const importedHooks = importedBindingCandidateHooks(context);\n const importedCallbacks = importedExternalCallbackFunctions(context);\n const compatibleComponentProps = importedBindingCompatibleComponentProps(context);\n\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const summary = importedHooks.get(path);\n if (!summary || !summary.external || callDefinitelyUsesBindingMode(summary, call, context)) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner || !hasAnyRead(localName, owner, declaration, context)) continue;\n if (shouldRecommendImportedHook(summary, call, localName, owner, declaration, context, compatibleComponentProps)) continue;\n\n const usage = bindingUsageSummary(localName, owner, declaration, context, compatibleComponentProps);\n const hasPresentationEvidence = hasCandidatePresentationEvidence(usage)\n || (summary.sourceKind === \"derived-external-state\" && usage.effect > 0);\n if (!summary.highFrequency && !hasPresentationEvidence) continue;\n\n const key = `imported:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} updates ${localName} through React state when outside data changes. Some uses of ${localName} may need a rerender, so switching it entirely to a Binding could change behavior.`,\n help: \"Inspect whether the value can become a Binding, use Binding:map for visual derivation, or split visual updates from the smaller part of the value that truly needs React state.\",\n });\n }\n\n for (const call of context.findCalls()) {\n const path = context.getCallPath(call) ?? \"\";\n const member = path.split(/[.:]/).at(-1) ?? path;\n const bindingAlternative = context.project.bindingApiAlternatives.get(member);\n if (!bindingAlternative) continue;\n const declaration = declarationForCall(call);\n const localName = declaration ? declarationNames(declaration)[0] ?? null : null;\n const owner = context.containingComponent(call) ?? context.nearestFunction(call);\n if (!declaration || !localName || !owner || !hasAnyRead(localName, owner, declaration, context)) continue;\n if (stateReadsAreBindingCompatible(localName, owner, declaration, context, compatibleComponentProps)) continue;\n\n const key = `state-api:${call.startIndex}:${call.endIndex}:${localName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} uses React state even though ${bindingAlternative} is available. Some uses of ${localName} may need a rerender, so replacing it entirely with the Binding API could change behavior.`,\n help: `Inspect whether ${bindingAlternative}, Binding:map, or splitting visual and structural consumers would avoid unnecessary rerenders.`,\n fixPreview: callMemberFixPreview(call, bindingAlternative),\n });\n }\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner || !owner.isComponent || !owner.body) continue;\n const updateKind = bindingHasExternalOrHighFrequencyUpdates(binding, importedCallbacks, context);\n if (!updateKind) continue;\n if (stateReadsAreBindingCompatible(binding.valueName, owner, binding.declaration, context, compatibleComponentProps)) continue;\n\n const usage = bindingUsageSummary(binding.valueName, owner, binding.declaration, context, compatibleComponentProps);\n if (!hasCandidatePresentationEvidence(usage)) continue;\n\n const key = `state:${binding.call.startIndex}:${binding.call.endIndex}:${binding.valueName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: callNameNode(binding.call),\n message: `State ${binding.valueName} is updated${updateKind.highFrequency ? \" from a high-frequency source\" : \" from an external callback\"} and appears at least partly presentation-oriented, but some consumers may still require React state.`,\n help: \"Inspect whether visual consumers can move to React.useBinding while structural consumers keep a smaller state value. Splitting the responsibilities can remove rerenders without changing component behavior.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
37
+ "import type { RuleDefinition } from \"../types\";\nimport { callNameNode } from \"./helpers\";\n\nexport const noCreateRootInRender: RuleDefinition = {\n id: \"react-luau/no-create-root-in-render\",\n category: \"Roblox\",\n severity: \"error\",\n description: \"Do not create ReactRoblox roots during component render.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"ReactRoblox.createRoot\") continue;\n const owner = context.containingComponent(call);\n if (!owner || !context.isDirectlyExecutedInFunction(call, owner)) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: \"ReactRoblox.createRoot() is called during component render.\",\n help: \"Own top-level roots outside component render. When a component intentionally creates a separate root, create it in an effect and unmount that exact root in cleanup.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
38
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { DiagnosticInput, FunctionInfo, RuleContext, RuleDefinition } from \"../types\";\nimport { normalizeExpressionText, sameNode } from \"../ast/walk\";\nimport { assignmentLeft, assignmentTargetNode, declarationNames } from \"./helpers\";\n\nfunction refRootFromTarget(target: string, refs: Set<string>): string | null {\n const match = target.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*\\.\\s*current\\b/);\n if (!match || !refs.has(match[1])) return null;\n return match[1];\n}\n\nfunction isNilGuardedLazyInit(node: SyntaxNode, refName: string): boolean {\n let current = node.parent;\n while (current) {\n if (current.type === \"if_statement\") {\n const condition = current.childForFieldName(\"condition\")?.text.replace(/\\s+/g, \"\") ?? \"\";\n const escaped = refName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (new RegExp(`^(?:${escaped}\\.current==nil|nil==${escaped}\\.current)$`).test(condition)) return true;\n return false;\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return false;\n current = current.parent;\n }\n return false;\n}\n\nfunction assignmentRight(text: string): string | null {\n const match = text.match(/^(?:.*?)(?:\\+=|-=|\\*=|\\/=|%=|\\^=|\\.\\.=|=)\\s*(.+)$/s);\n return match?.[1]?.trim() ?? null;\n}\n\nfunction refInitializer(owner: FunctionInfo, refName: string, context: RuleContext): string | null {\n if (!owner.body) return null;\n for (const statement of owner.body.namedChildren) {\n if (statement.type !== \"variable_declaration\") continue;\n const names = declarationNames(statement);\n const index = names.indexOf(refName);\n if (index === -1) continue;\n const assignment = statement.namedChildren.find((child) => child.type === \"assignment_statement\");\n const expressions = assignment?.namedChildren.find((child) => child.type === \"expression_list\")?.namedChildren ?? [];\n const expression = expressions[index] ?? expressions[0];\n if (!expression || expression.type !== \"function_call\") return null;\n const path = context.resolveCallPath(context.getCallPath(expression) ?? \"\");\n if (path !== \"React.useRef\") return null;\n return context.callArguments(expression)[0]?.text.trim() ?? \"nil\";\n }\n return null;\n}\n\nfunction isTopLevelOwnerStatement(node: SyntaxNode, owner: FunctionInfo): boolean {\n let current = node.parent;\n while (current && !sameNode(current, owner.node)) {\n if (current.type === \"if_statement\" || current.type === \"for_statement\" || current.type === \"while_statement\" || current.type === \"repeat_statement\") {\n return false;\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") return false;\n current = current.parent;\n }\n return Boolean(current);\n}\n\n\nfunction exactRefCurrentTarget(node: SyntaxNode, refName: string): boolean {\n return normalizeExpressionText(assignmentLeft(node.text)) === `${refName}.current`;\n}\n\nfunction hasDirectRenderRead(owner: FunctionInfo, refName: string, context: RuleContext): boolean {\n if (!owner.body) return false;\n const target = `${refName}.current`;\n\n for (const candidate of context.walk(owner.body)) {\n if (candidate.type !== \"dot_index_expression\" || normalizeExpressionText(candidate.text) !== target) continue;\n if (!context.isDirectlyExecutedInFunction(candidate, owner)) continue;\n\n let current: SyntaxNode | null = candidate.parent;\n let isWrite = false;\n while (current && !sameNode(current, owner.node)) {\n if (current.type === \"assignment_statement\" || current.type === \"update_statement\") {\n isWrite = exactRefCurrentTarget(current, refName);\n break;\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") break;\n current = current.parent;\n }\n if (!isWrite) return true;\n }\n\n return false;\n}\n\nfunction isLatestValueMirror(node: SyntaxNode, owner: FunctionInfo, refName: string, context: RuleContext): boolean {\n if (node.type !== \"assignment_statement\" || !exactRefCurrentTarget(node, refName)) return false;\n const right = assignmentRight(node.text);\n if (!right) return false;\n\n const initializer = refInitializer(owner, refName, context);\n if (initializer !== null && normalizeExpressionText(right) === normalizeExpressionText(initializer)) return true;\n\n // A direct top-level `ref.current = renderValue` is the common use-latest\n // mirror pattern even when the ref used a neutral initial value such as false.\n // Nested writes remain warnings because they are usually imperative render work.\n if (isTopLevelOwnerStatement(node, owner)) {\n return /^[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(normalizeExpressionText(right));\n }\n\n // A render-computed ref that is only written during render and read later by\n // effects/events is another use-latest mirror shape. The conditional/looped\n // write can still observe a pre-commit render, so keep it visible as a\n // suggestion rather than treating it as fully safe.\n return !hasDirectRenderRead(owner, refName, context);\n}\n\nexport const noRefCurrentInRender: RuleDefinition = {\n id: \"react-luau/no-ref-current-in-render\",\n category: \"Correctness\",\n severity: \"warning\",\n description: \"Avoid mutating ref.current during render except for predictable initialization or deliberate latest-value mirrors.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n\n for (const node of context.walk()) {\n if (node.type !== \"assignment_statement\" && node.type !== \"update_statement\") continue;\n const owner = context.nearestFunction(node);\n if (!owner || (!owner.isComponent && !owner.isHook)) continue;\n if (!context.isDirectlyExecutedInFunction(node, owner)) continue;\n const refs = context.model.refVariablesByFunction.get(`${owner.node.type}:${owner.node.startIndex}:${owner.node.endIndex}`) ?? new Set<string>();\n const target = assignmentLeft(node.text);\n const refName = refRootFromTarget(target, refs);\n if (!refName || isNilGuardedLazyInit(node, refName)) continue;\n\n const latestValueMirror = isLatestValueMirror(node, owner, refName, context);\n diagnostics.push({\n node: assignmentTargetNode(node),\n severity: latestValueMirror ? \"suggestion\" : \"warning\",\n message: latestValueMirror\n ? `${refName}.current mirrors its latest render value during render.`\n : `${refName}.current is mutated during ${owner.isHook ? \"hook\" : \"component\"} render.`,\n help: latestValueMirror\n ? \"A latest-value ref can expose an uncommitted render value to imperative callbacks. Update it after commit when that distinction matters.\"\n : \"Move ref writes into the event, effect, or ref callback that owns the mutation. A nil-guarded one-time lazy initialization pattern remains allowed for pure construction.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
39
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { RuleContext, RuleDefinition, SourceEffectModuleSummary } from \"../types\";\nimport { normalizeRequireTarget, resolveModuleReference } from \"../module-resolution\";\nimport { knownYieldReason } from \"../roblox-semantics\";\nimport { callNameNode } from \"./helpers\";\n\nfunction declarationParts(node: SyntaxNode): { names: string[]; expressions: SyntaxNode[] } {\n if (node.type !== \"variable_declaration\") return { names: [], expressions: [] };\n const assignment = node.namedChildren.find((child) => child.type === \"assignment_statement\");\n const variables = assignment?.namedChildren.find((child) => child.type === \"variable_list\")\n ?? node.namedChildren.find((child) => child.type === \"variable_list\");\n const expressions = assignment?.namedChildren.find((child) => child.type === \"expression_list\");\n return {\n names: variables?.namedChildren.filter((child) => child.type === \"identifier\").map((child) => child.text) ?? [],\n expressions: expressions?.namedChildren ?? [],\n };\n}\n\nfunction sourceEffectImports(context: RuleContext): Map<string, SourceEffectModuleSummary> {\n const result = new Map<string, SourceEffectModuleSummary>();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(/^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s);\n if (!match) continue;\n const summary = resolveModuleReference(normalizeRequireTarget(match[2]), context.project.sourceEffects);\n if (summary) result.set(match[1], summary);\n }\n return result;\n}\n\nfunction factorySummaryFromCall(\n call: SyntaxNode,\n context: RuleContext,\n imports: Map<string, SourceEffectModuleSummary>,\n): SourceEffectModuleSummary | null {\n const path = context.getCallPath(call)?.replace(/\\s+/g, \"\") ?? \"\";\n const match = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) return null;\n const summary = imports.get(match[1]);\n if (!summary?.instanceFactories.has(match[2])) return null;\n return summary;\n}\n\nfunction returnedFactorySummary(\n callback: SyntaxNode,\n context: RuleContext,\n imports: Map<string, SourceEffectModuleSummary>,\n): SourceEffectModuleSummary | null {\n for (const node of context.walk(callback)) {\n if (node !== callback && (node.type === \"function_definition\" || node.type === \"function_declaration\")) continue;\n if (node.type !== \"return_statement\") continue;\n const expressions = node.namedChildren.find((child) => child.type === \"expression_list\");\n const value = expressions?.namedChildren[0];\n if (value?.type === \"function_call\") return factorySummaryFromCall(value, context, imports);\n }\n return null;\n}\n\nfunction sourceEffectInstances(\n context: RuleContext,\n imports: Map<string, SourceEffectModuleSummary>,\n): Map<string, SourceEffectModuleSummary> {\n const result = new Map<string, SourceEffectModuleSummary>();\n\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (!expression) continue;\n let summary: SourceEffectModuleSummary | null = null;\n if (expression.type === \"function_call\") {\n summary = factorySummaryFromCall(expression, context, imports);\n if (!summary && context.resolveCallPath(context.getCallPath(expression) ?? \"\") === \"React.useMemo\") {\n const callback = context.callArguments(expression)[0];\n if (callback?.type === \"function_definition\") summary = returnedFactorySummary(callback, context, imports);\n }\n } else if (expression.type === \"identifier\") {\n summary = result.get(expression.text) ?? null;\n }\n if (summary) result.set(names[index], summary);\n }\n }\n\n let changed = true;\n while (changed) {\n changed = false;\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const { names, expressions } = declarationParts(node);\n for (let index = 0; index < names.length; index += 1) {\n if (result.has(names[index])) continue;\n const expression = expressions[index] ?? expressions[0];\n if (expression?.type !== \"identifier\") continue;\n const summary = result.get(expression.text);\n if (!summary) continue;\n result.set(names[index], summary);\n changed = true;\n }\n }\n }\n return result;\n}\n\nfunction sourceInferredEffectCall(\n call: SyntaxNode,\n context: RuleContext,\n imports: Map<string, SourceEffectModuleSummary>,\n instances: Map<string, SourceEffectModuleSummary>,\n): boolean {\n const path = context.getCallPath(call)?.replace(/\\s+/g, \"\") ?? \"\";\n const direct = imports.get(path);\n if (direct?.effectfulExport) return true;\n\n const member = path.match(/^([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!member) return false;\n const summary = imports.get(member[1]) ?? instances.get(member[1]);\n return summary?.effectfulMembers.has(member[2]) ?? false;\n}\n\n\nconst RENDER_EFFECT_PATTERNS = [\n /^Instance\\.new$/,\n /tween[^:]*:(?:Create|Play)$/i,\n /:Connect$/,\n /:BindAction$/,\n /:BindActionAtPriority$/,\n /:BindActivate$/,\n /BindToRenderStep$/,\n /BindToSimulation$/,\n /:Destroy$/,\n /:render$/,\n /:unmount$/,\n];\n\nfunction hasNestedKnownRenderSideEffect(call: SyntaxNode, context: RuleContext): boolean {\n for (const node of context.walk(call)) {\n if (node.startIndex === call.startIndex && node.endIndex === call.endIndex) continue;\n if (node.type !== \"function_call\") continue;\n const path = context.resolveCallPath(context.getCallPath(node) ?? \"\");\n if (path === \"task.spawn\" || path === \"task.defer\" || path === \"task.delay\") return true;\n if (knownYieldReason(path) || RENDER_EFFECT_PATTERNS.some(pattern => pattern.test(path))) return true;\n }\n return false;\n}\n\nexport const noYieldInRender: RuleDefinition = {\n id: \"react-luau/no-yield-in-render\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"React render functions must not yield.\",\n run(context) {\n const diagnostics = [];\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || !context.isDirectlyExecutedInFunction(call, component)) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const reason = knownYieldReason(path);\n if (!reason) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} can yield during component render.`,\n help: `Move yielding work outside render, usually into an effect or an external data-loading boundary. The bundled Roblox yield metadata recognizes ${reason} as a yielding API.`,\n });\n }\n return diagnostics;\n },\n};\n\nexport const noTaskSpawnInRender: RuleDefinition = {\n id: \"react-luau/no-task-spawn-in-render\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"Do not schedule asynchronous work during render.\",\n run(context) {\n const diagnostics = [];\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || !context.isDirectlyExecutedInFunction(call, component)) continue;\n const path = context.getCallPath(call);\n if (path !== \"task.spawn\" && path !== \"task.defer\" && path !== \"task.delay\") continue;\n diagnostics.push({\n node: callNameNode(call),\n message: `${path} schedules work during component render.`,\n help: \"Move the scheduled work into an effect or the event that actually owns the side effect.\",\n });\n }\n return diagnostics;\n },\n};\n\nexport const noSideEffectsInRender: RuleDefinition = {\n id: \"react-luau/no-side-effects-in-render\",\n category: \"Correctness\",\n severity: \"error\",\n description: \"Do not create Instances, start tweens, subscribe, or perform other externally observable side effects during component render.\",\n run(context) {\n const diagnostics = [];\n const effectImports = sourceEffectImports(context);\n const effectInstances = sourceEffectInstances(context, effectImports);\n\n\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || !context.isDirectlyExecutedInFunction(call, component)) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n const knownPattern = RENDER_EFFECT_PATTERNS.some((pattern) => pattern.test(path));\n let inferredFromSource = sourceInferredEffectCall(call, context, effectImports, effectInstances);\n // Report the inner operation rather than duplicating it on an inferred wrapper.\n if (inferredFromSource && hasNestedKnownRenderSideEffect(call, context)) inferredFromSource = false;\n if (!knownPattern && !inferredFromSource) continue;\n diagnostics.push({\n node: callNameNode(call),\n message: inferredFromSource && !knownPattern\n ? `${path} runs during render, and code it calls eventually changes state outside the current render.`\n : `${path} performs a side effect directly during component render.`,\n help: inferredFromSource && !knownPattern\n ? \"Move this call into an effect, event handler, or another committed lifecycle boundary so an abandoned render cannot still change application state.\"\n : \"Move imperative work into an effect or event handler with explicit ownership and cleanup. Use React.createElement for React-owned Instances; destroy imperative Instances, cancel tweens, and disconnect subscriptions when their owner is cleaned up.\",\n fixPreview: inferredFromSource && !knownPattern\n ? {\n kind: \"pattern\" as const,\n before: call.text,\n after: `React.useEffect(function()\n\t${call.text}\nend, { -- dependencies })`,\n note: \"The exact owner depends on intent: use an effect for committed lifecycle work, or move the call into the event that actually triggers the mutation.\",\n }\n : undefined,\n });\n }\n\n return diagnostics;\n },\n};\n",
40
+ "import {\n moduleKeys,\n normalizeRequireTarget,\n resolveModuleReference,\n} from \"../module-resolution\";\nimport type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type {\n ConditionalHookModeSummary,\n DiagnosticInput,\n FixPreview,\n FunctionInfo,\n RuleContext,\n RuleDefinition,\n} from \"../types\";\nimport { nodeKey } from \"../ast/walk\";\nimport {\n callNameNode,\n CONDITIONAL_TYPES,\n declarationNames,\n findAncestorBetween,\n isHookPath,\n isNestedInsideFunction,\n} from \"./helpers\";\n\nfunction staticIterationImports(\n context: RuleContext,\n): Map<string, Set<string>> {\n const result = new Map<string, Set<string>>();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(\n /^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s,\n );\n if (!match) continue;\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n context.project.staticIterationTables,\n );\n if (summary) result.set(match[1], summary);\n }\n return result;\n}\n\nfunction conditionalHookModeImports(\n context: RuleContext,\n): Map<string, ConditionalHookModeSummary> {\n const result = new Map<string, ConditionalHookModeSummary>();\n for (const node of context.walk(context.root)) {\n if (node.type !== \"variable_declaration\") continue;\n const match = node.text.match(\n /^\\s*local\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*require\\s*\\((.*?)\\)\\s*$/s,\n );\n if (!match) continue;\n const summary = resolveModuleReference(\n normalizeRequireTarget(match[2]),\n context.project.conditionalHookModes,\n );\n if (summary) result.set(match[1], summary);\n }\n return result;\n}\n\nfunction currentConditionalHookMode(\n context: RuleContext,\n): ConditionalHookModeSummary | null {\n for (const key of moduleKeys(context.relativePath)) {\n const summary = context.project.conditionalHookModes.get(key);\n if (summary) return summary;\n }\n return null;\n}\n\nfunction controlledParameterIndex(\n controlFlow: SyntaxNode,\n fn: FunctionInfo,\n summary: ConditionalHookModeSummary,\n): number | null {\n if (controlFlow.type !== \"if_statement\") return null;\n const header = (controlFlow.text.split(/\\bthen\\b/s, 1)[0] ?? \"\").trim();\n\n for (const [conditionName, index] of Object.entries(\n summary.conditionVariables,\n )) {\n const escaped = conditionName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const patterns = [\n new RegExp(`^if\\\\s+${escaped}\\\\s*$`),\n new RegExp(`^if\\\\s+not\\\\s+${escaped}\\\\s*$`),\n new RegExp(`^if\\\\s+${escaped}\\\\s*(?:==|~=)\\\\s*(?:true|false|nil)\\\\s*$`),\n new RegExp(`^if\\\\s+(?:true|false|nil)\\\\s*(?:==|~=)\\\\s*${escaped}\\\\s*$`),\n ];\n if (patterns.some((pattern) => pattern.test(header))) return index;\n }\n\n // Keep a direct parameter fallback for older or externally constructed summaries.\n for (const index of summary.parameterIndexes) {\n const name = fn.parameters[index];\n if (!name) continue;\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n if (new RegExp(`^if\\\\s+(?:not\\\\s+)?${escaped}\\\\s*$`).test(header))\n return index;\n }\n return null;\n}\n\nfunction isStableModeArgument(\n node: SyntaxNode | undefined,\n context: RuleContext,\n): boolean {\n if (!node) return true;\n const text = node.text.trim();\n if ([\"true\", \"false\", \"nil\"].includes(text)) return true;\n if (\n [\n \"number\",\n \"string\",\n \"string_content\",\n \"table_constructor\",\n \"function_definition\",\n ].includes(node.type)\n )\n return true;\n if (\n /^[A-Za-z_][A-Za-z0-9_]*$/.test(text) &&\n context.model.stableVariables.has(text)\n )\n return true;\n return false;\n}\n\nfunction dynamicHookModeFixPreview(\n hookName: string,\n argumentText: string,\n): FixPreview {\n return {\n kind: \"pattern\",\n before: `local value = ${hookName}(${argumentText})`,\n after: `local value = ${hookName}(true) -- or false; keep this mode fixed for this call site`,\n note: \"A custom hook may choose different internal hooks only when this mode is stable for the lifetime of the component instance.\",\n };\n}\n\nfunction unwrapIteratorExpression(text: string): string {\n let current = text.trim();\n const wrapper = current.match(/^(?:pairs|ipairs)\\s*\\((.*)\\)$/s);\n if (wrapper) current = wrapper[1].trim();\n return current;\n}\n\n\nfunction declarationExpressions(node: SyntaxNode): SyntaxNode[] {\n if (node.type !== \"variable_declaration\") return [];\n const assignment = node.namedChildren.find(\n (child) => child.type === \"assignment_statement\",\n );\n const expressionList = assignment?.namedChildren.find(\n (child) => child.type === \"expression_list\",\n );\n return expressionList?.namedChildren ?? [];\n}\n\nfunction isEmptyTable(node: SyntaxNode | undefined): boolean {\n return Boolean(\n node?.type === \"table_constructor\" &&\n node.namedChildren.every((child) => child.type !== \"field\"),\n );\n}\n\nfunction stableShapeVariablesByFunction(\n context: RuleContext,\n): Map<string, Set<string>> {\n const stable = new Map<string, Set<string>>();\n const functionsByName = new Map<string, FunctionInfo>();\n\n for (const fn of context.model.functions) {\n stable.set(nodeKey(fn.node), new Set<string>());\n if (fn.name && /^[A-Za-z_][A-Za-z0-9_]*$/.test(fn.name))\n functionsByName.set(fn.name, fn);\n }\n\n const namesFor = (fn: FunctionInfo): Set<string> => {\n const key = nodeKey(fn.node);\n const names = stable.get(key) ?? new Set<string>();\n stable.set(key, names);\n return names;\n };\n\n // A table constructed in the function has a fixed literal shape. More importantly for\n // React code, an empty-dependency useMemo explicitly captures one value for the entire\n // component lifetime. If that captured value is later iterated to create hooks, the\n // iteration source itself does not change between renders unless user code mutates it.\n for (const declaration of context.walk(context.root)) {\n if (declaration.type !== \"variable_declaration\") continue;\n const owner = context.nearestFunction(declaration);\n if (!owner) continue;\n const names = declarationNames(declaration);\n const expressions = declarationExpressions(declaration);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (!expression) continue;\n if (expression.type === \"table_constructor\") {\n namesFor(owner).add(names[index]);\n continue;\n }\n if (expression.type !== \"function_call\") continue;\n const rawPath = context.getCallPath(expression);\n if (!rawPath || context.resolveCallPath(rawPath) !== \"React.useMemo\")\n continue;\n const args = context.callArguments(expression);\n if (isEmptyTable(args[1])) namesFor(owner).add(names[index]);\n }\n }\n\n const callsByLocalFunction = new Map<string, SyntaxNode[]>();\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath || !functionsByName.has(rawPath)) continue;\n const calls = callsByLocalFunction.get(rawPath) ?? [];\n calls.push(call);\n callsByLocalFunction.set(rawPath, calls);\n }\n\n const expressionIsStableShape = (\n expression: SyntaxNode | undefined,\n owner: FunctionInfo | null,\n ): boolean => {\n if (!expression) return false;\n if (expression.type === \"table_constructor\") return true;\n const text = expression.text.trim();\n if (!owner || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(text)) return false;\n return namesFor(owner).has(text);\n };\n\n let changed = true;\n while (changed) {\n changed = false;\n\n // Preserve stable-shape aliases such as `local copy = capturedDefaults`.\n for (const declaration of context.walk(context.root)) {\n if (declaration.type !== \"variable_declaration\") continue;\n const owner = context.nearestFunction(declaration);\n if (!owner) continue;\n const names = declarationNames(declaration);\n const expressions = declarationExpressions(declaration);\n for (let index = 0; index < names.length; index += 1) {\n const expression = expressions[index] ?? expressions[0];\n if (!expressionIsStableShape(expression, owner)) continue;\n const target = names[index];\n const ownerNames = namesFor(owner);\n if (!ownerNames.has(target)) {\n ownerNames.add(target);\n changed = true;\n }\n }\n }\n\n // Propagate the guarantee through local helpers only when every known call to that\n // helper supplies a stable-shape argument for the parameter. This is what makes a\n // pattern such as `getStateContainer(capturedDefaults)` safe without exempting all\n // parameter-driven loops.\n for (const [name, fn] of functionsByName) {\n const calls = callsByLocalFunction.get(name) ?? [];\n if (calls.length === 0) continue;\n for (let index = 0; index < fn.parameters.length; index += 1) {\n const allStable = calls.every((call) => {\n const caller = context.nearestFunction(call);\n return expressionIsStableShape(context.callArguments(call)[index], caller);\n });\n if (!allStable) continue;\n const parameter = fn.parameters[index];\n if (!parameter) continue;\n const fnNames = namesFor(fn);\n if (!fnNames.has(parameter)) {\n fnNames.add(parameter);\n changed = true;\n }\n }\n }\n }\n\n return stable;\n}\n\nfunction loopIterationIsProvablyStable(\n loop: SyntaxNode,\n context: RuleContext,\n imports: Map<string, Set<string>>,\n owner: FunctionInfo,\n stableShapes: Map<string, Set<string>>,\n): boolean {\n const numeric = loop.namedChildren.find(\n (child) => child.type === \"for_numeric_clause\",\n );\n if (numeric) {\n const text = numeric.text;\n const bounds = text.match(\n /^\\s*[A-Za-z_][A-Za-z0-9_]*\\s*=\\s*([^,]+)\\s*,\\s*([^,]+)(?:\\s*,\\s*([^,]+))?\\s*$/s,\n );\n if (\n bounds &&\n bounds\n .slice(1)\n .filter(Boolean)\n .every((value) => /^-?\\d+(?:\\.\\d+)?$/.test(value!.trim()))\n )\n return true;\n }\n\n const clause = loop.namedChildren.find(\n (child) => child.type === \"for_generic_clause\",\n );\n const match = clause?.text.match(/\\bin\\s+(.+)$/s);\n if (!match) return false;\n const expression = unwrapIteratorExpression(match[1]);\n const path = expression.match(\n /^([A-Za-z_][A-Za-z0-9_]*)(?:\\.([A-Za-z_][A-Za-z0-9_.]*))?$/,\n );\n if (!path) return false;\n if (\n !path[2] &&\n stableShapes.get(nodeKey(owner.node))?.has(path[1])\n )\n return true;\n const fields = imports.get(path[1]);\n if (!fields) return false;\n const propertyPath = path[2] ?? \"\";\n return fields.has(propertyPath);\n}\n\nfunction functionParameterTypes(fn: FunctionInfo): Map<string, string> {\n if (!fn.body) return new Map();\n const headerLength = Math.max(0, fn.body.startIndex - fn.node.startIndex);\n const header = fn.node.text.slice(0, headerLength);\n const result = new Map<string, string>();\n for (const match of header.matchAll(\n /\\b([A-Za-z_][A-Za-z0-9_]*)\\s*:\\s*([^,\\n)]+)/g,\n )) {\n result.set(match[1], match[2].trim());\n }\n return result;\n}\n\nfunction isNonOptionalParameterType(typeText: string | undefined): boolean {\n if (!typeText) return false;\n return !typeText.includes(\"?\") && !/(?:^|[| ])nil(?:$|[| ])/i.test(typeText);\n}\n\nfunction impossibleNilGuardReturn(\n node: SyntaxNode,\n fn: FunctionInfo,\n parameterTypes: Map<string, string>,\n): boolean {\n let current = node.parent;\n while (current && current !== fn.node) {\n if (current.type === \"if_statement\") {\n const header = (current.text.split(/\\bthen\\b/s, 1)[0] ?? \"\").trim();\n const patterns = [\n /\\bif\\s+not\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*$/,\n /\\bif\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*==\\s*nil\\s*$/,\n /\\bif\\s+nil\\s*==\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*$/,\n ];\n for (const pattern of patterns) {\n const match = header.match(pattern);\n if (match && isNonOptionalParameterType(parameterTypes.get(match[1])))\n return true;\n }\n return false;\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction hasReachableReturnBefore(\n call: SyntaxNode,\n fn: FunctionInfo,\n context: RuleContext,\n): boolean {\n if (!fn.body) return false;\n const parameterTypes = functionParameterTypes(fn);\n for (const node of context.walk(fn.body)) {\n if (node.endIndex > call.startIndex) continue;\n if (node.type !== \"return_statement\") continue;\n if (isNestedInsideFunction(node, fn.node)) continue;\n if (impossibleNilGuardReturn(node, fn, parameterTypes)) continue;\n return true;\n }\n return false;\n}\n\nfunction conditionalFixPreview(kind: string, hookName: string): FixPreview {\n if (kind === \"for statement\") {\n return {\n kind: \"pattern\",\n before: `for _, item in items do\\n\\tlocal value = ${hookName}(item)\\nend`,\n after: `local function Item(props)\\n\\tlocal value = ${hookName}(props.item)\\n\\treturn renderItem(value)\\nend\\n\\nfor _, item in items do\\n\\tchildren[item.id] = React.createElement(Item, {\\n\\t\\titem = item,\\n\\t})\\nend`,\n note: \"When collection size can change, move the hook into a child component so each component instance owns a fixed hook sequence.\",\n };\n }\n if (kind === \"while statement\" || kind === \"repeat statement\") {\n return {\n kind: \"pattern\",\n before: `while condition do\\n\\tlocal value = ${hookName}()\\nend`,\n after: `local value = ${hookName}()\\n\\nwhile condition do\\n\\t-- use value without creating another hook call\\nend`,\n note: \"Hook count must not depend on how many times a runtime loop executes.\",\n };\n }\n return {\n kind: \"pattern\",\n before: `if enabled then\\n\\tlocal value = ${hookName}()\\nend`,\n after: `local value = ${hookName}()\\n\\nif enabled then\\n\\t-- use value here\\nend`,\n note: \"Keep the hook call unconditional, then branch on its result.\",\n };\n}\n\nfunction earlyReturnFixPreview(hookName: string): FixPreview {\n return {\n kind: \"pattern\",\n before: `if not ready then\\n\\treturn nil\\nend\\n\\nlocal value = ${hookName}()`,\n after: `local value = ${hookName}()\\n\\nif not ready then\\n\\treturn nil\\nend`,\n note: \"Call hooks before any reachable early return so every render executes the same hook sequence.\",\n };\n}\n\nexport const rulesOfHooks: RuleDefinition = {\n id: \"react-luau/rules-of-hooks\",\n category: \"Hooks\",\n severity: \"error\",\n description:\n \"Hooks must run in the same order on every render of a React component or custom hook.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n const staticImports = staticIterationImports(context);\n const stableShapes = stableShapeVariablesByFunction(context);\n const modeImports = conditionalHookModeImports(context);\n const currentModeSummary = currentConditionalHookMode(context);\n\n for (const call of context.findCalls()) {\n const rawPath = context.getCallPath(call);\n if (!rawPath) continue;\n const path = context.resolveCallPath(rawPath);\n if (!isHookPath(path)) continue;\n\n const fn = context.nearestFunction(call);\n if (!fn || (!fn.isComponent && !fn.isHook)) {\n diagnostics.push({\n node: callNameNode(call),\n message: `Hook ${path} is called outside a React component or custom hook.`,\n help: \"Move the hook into a component or a custom hook whose name starts with use.\",\n fixPreview: {\n kind: \"pattern\",\n before: `local value = ${path}()\\n\\nlocal function helper()\\n\\treturn value\\nend`,\n after: `local function useHelper()\\n\\tlocal value = ${path}()\\n\\treturn value\\nend`,\n note: \"Hooks need a React-owned component or custom-hook call stack.\",\n },\n });\n continue;\n }\n\n const importedMode = modeImports.get(rawPath);\n if (importedMode) {\n const args = context.callArguments(call);\n const dynamicIndexes = importedMode.parameterIndexes.filter(\n (index) => !isStableModeArgument(args[index], context),\n );\n if (dynamicIndexes.length > 0) {\n const firstIndex = dynamicIndexes[0];\n const argument = args[firstIndex];\n const parameterOffset =\n importedMode.parameterIndexes.indexOf(firstIndex);\n const parameterName =\n importedMode.parameterNames[parameterOffset] ??\n `argument ${firstIndex + 1}`;\n const argumentText = argument?.text.trim() || \"<omitted>\";\n diagnostics.push({\n node: argument ?? callNameNode(call),\n highlights: dynamicIndexes\n .map((index) => args[index])\n .filter((node): node is SyntaxNode => Boolean(node)),\n message: `Hook ${rawPath} receives render-varying hook mode ${parameterName} from ${argumentText}; if it changes between renders, the custom hook can execute a different hook sequence.`,\n help: `Pass a stable mode at this call site, or refactor ${rawPath} so it always calls the same hooks regardless of ${parameterName}.`,\n fixPreview: dynamicHookModeFixPreview(rawPath, argumentText),\n });\n }\n }\n\n const controlFlow = findAncestorBetween(call, fn.node, (node) =>\n CONDITIONAL_TYPES.has(node.type),\n );\n if (controlFlow) {\n if (\n currentModeSummary &&\n currentModeSummary.knownCallSites > 0 &&\n controlledParameterIndex(controlFlow, fn, currentModeSummary) !== null\n )\n continue;\n if (\n controlFlow.type === \"for_statement\" &&\n loopIterationIsProvablyStable(\n controlFlow,\n context,\n staticImports,\n fn,\n stableShapes,\n )\n )\n continue;\n const kind = controlFlow.type.replaceAll(\"_\", \" \");\n const loopLike =\n controlFlow.type === \"for_statement\" ||\n controlFlow.type === \"while_statement\" ||\n controlFlow.type === \"repeat_statement\";\n diagnostics.push({\n node: callNameNode(call),\n message: loopLike\n ? `Hook ${path} is called inside ${kind} whose size or iteration order may change between renders. If that happens, React will see a different hook sequence.`\n : `Hook ${path} is called inside ${kind}, so the hook may be skipped on some renders.`,\n help: loopLike\n ? \"Keep hook count independent of runtime collection size or loop iterations. A common fix is to render a child component per item and call the hook inside that child.\"\n : \"Call the hook unconditionally at the top level, then branch on the returned value.\",\n fixPreview: conditionalFixPreview(kind, path),\n });\n continue;\n }\n\n if (hasReachableReturnBefore(call, fn, context)) {\n diagnostics.push({\n node: callNameNode(call),\n message: `Hook ${path} may run after an earlier reachable return, so some renders can execute fewer hooks.`,\n help: \"Move the hook before reachable early returns so hook order cannot change between renders.\",\n fixPreview: earlyReturnFixPreview(path),\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
41
+ "import type { Node as SyntaxNode } from \"web-tree-sitter\";\nimport type { DiagnosticInput, FunctionInfo, RuleContext, RuleDefinition, StateBinding } from \"../types\";\nimport { sameNode } from \"../ast/walk\";\nimport { assignmentTargetNode, callNameNode, containsUnshadowedIdentifier, identifierNode, isNameShadowedBetween, stateBindingsFor } from \"./helpers\";\n\nconst TRIVIAL_INITIALIZER_PATHS = new Set([\n \"tostring\",\n \"tonumber\",\n \"type\",\n \"typeof\",\n \"math.abs\",\n \"math.ceil\",\n \"math.floor\",\n \"math.max\",\n \"math.min\",\n \"math.round\",\n \"string.lower\",\n \"string.upper\",\n \"string.format\",\n \"table.pack\",\n \"Vector2.new\",\n \"Vector3.new\",\n \"Vector2int16.new\",\n \"Vector3int16.new\",\n \"UDim.new\",\n \"UDim2.new\",\n \"UDim2.fromOffset\",\n \"UDim2.fromScale\",\n \"CFrame.new\",\n \"Color3.new\",\n \"Color3.fromRGB\",\n \"Color3.fromHSV\",\n \"Rect.new\",\n \"NumberRange.new\",\n \"TweenInfo.new\",\n]);\n\nfunction isTrivialInitializerPath(path: string): boolean {\n return TRIVIAL_INITIALIZER_PATHS.has(path) || /(?:^|[.:])getValue$/i.test(path);\n}\n\nfunction isNestedFunctionFromOwner(context: RuleContext, node: SyntaxNode, owner: FunctionInfo): boolean {\n const nearest = context.nearestFunction(node);\n return Boolean(nearest && nearest !== owner);\n}\n\nfunction callsSetter(context: RuleContext, owner: FunctionInfo, setterName: string): boolean {\n if (!owner.body) return false;\n for (const call of context.walk(owner.body)) {\n if (call.type === \"function_call\" && context.getCallPath(call) === setterName) return true;\n }\n return false;\n}\n\nfunction isIdentifierRead(node: SyntaxNode, name: string): boolean {\n if (node.type !== \"identifier\" || node.text !== name) return false;\n const parent = node.parent;\n if (parent?.type === \"dot_index_expression\" && sameNode(parent.childForFieldName(\"field\"), node)) return false;\n if (parent?.type === \"method_index_expression\" && sameNode(parent.namedChildren.at(-1), node)) return false;\n return true;\n}\n\nfunction renderReachableNestedFunctions(context: RuleContext, owner: FunctionInfo): Set<FunctionInfo> {\n const reachable = new Set<FunctionInfo>();\n if (!owner.body) return reachable;\n\n const byName = new Map<string, FunctionInfo>();\n for (const fn of context.model.functions) {\n if (!fn.name || fn === owner) continue;\n let current = fn.node.parent;\n while (current) {\n const parentInfo = context.model.functionByNode.get(`${current.type}:${current.startIndex}:${current.endIndex}`);\n if (parentInfo) {\n if (parentInfo === owner) byName.set(fn.name, fn);\n break;\n }\n current = current.parent;\n }\n }\n\n const pending: FunctionInfo[] = [];\n const addByName = (name: string | undefined) => {\n if (!name) return;\n const fn = byName.get(name);\n if (!fn || reachable.has(fn)) return;\n reachable.add(fn);\n pending.push(fn);\n };\n\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\" || context.nearestFunction(call) !== owner) continue;\n const path = context.getCallPath(call) ?? \"\";\n const resolved = context.resolveCallPath(path);\n if (resolved === \"React.createElement\") addByName(context.callArguments(call)[0]?.text.trim());\n else addByName(path);\n }\n\n while (pending.length > 0) {\n const fn = pending.pop()!;\n if (!fn.body) continue;\n for (const call of context.walk(fn.body)) {\n if (call.type !== \"function_call\" || context.nearestFunction(call) !== fn) continue;\n const path = context.getCallPath(call) ?? \"\";\n const resolved = context.resolveCallPath(path);\n if (resolved === \"React.createElement\") addByName(context.callArguments(call)[0]?.text.trim());\n else addByName(path);\n }\n }\n\n return reachable;\n}\n\nfunction directlyReadsValue(context: RuleContext, owner: FunctionInfo, binding: StateBinding): boolean {\n if (!owner.body) return false;\n\n for (const node of context.walk(owner.body)) {\n if (!isIdentifierRead(node, binding.valueName)) continue;\n if (node.startIndex >= binding.declaration.startIndex && node.endIndex <= binding.declaration.endIndex) continue;\n if (isNestedFunctionFromOwner(context, node, owner)) continue;\n if (isNameShadowedBetween(node, owner, binding.valueName)) continue;\n return true;\n }\n\n for (const fn of renderReachableNestedFunctions(context, owner)) {\n if (!fn.body) continue;\n for (const node of context.walk(fn.body)) {\n if (isIdentifierRead(node, binding.valueName) && !isNameShadowedBetween(node, owner, binding.valueName)) return true;\n }\n }\n\n return false;\n}\n\nfunction isPlainTableState(binding: StateBinding, context: RuleContext): boolean {\n const initializer = binding.initializer;\n if (!initializer) return true;\n if (initializer.type === \"table_constructor\") return true;\n if (initializer.type !== \"function_call\") return false;\n const path = context.getCallPath(initializer) ?? \"\";\n return path === \"table.clone\" || path === \"table.create\" || path === \"table.pack\";\n}\n\ntype CallbackLifetime = \"long-lived\" | \"custom-hook\" | \"render-handler\" | \"unknown\";\n\nfunction callbackLifetime(context: RuleContext, call: SyntaxNode, owner: FunctionInfo): CallbackLifetime {\n const callback = context.nearestFunction(call);\n if (!callback || callback === owner) return \"unknown\";\n\n let current: SyntaxNode | null = callback.node;\n while (current && current.startIndex >= owner.node.startIndex && current.endIndex <= owner.node.endIndex) {\n if (current.type === \"function_call\") {\n const path = context.resolveCallPath(context.getCallPath(current) ?? \"\");\n if (\n path === \"React.useEffect\"\n || path === \"React.useLayoutEffect\"\n || path === \"task.spawn\"\n || path === \"task.defer\"\n || path === \"task.delay\"\n || /:Connect$/.test(path)\n || /BindToRenderStep$/.test(path)\n || /:BindAction(?:AtPriority)?$/.test(path)\n || /:BindActivate$/.test(path)\n ) {\n return \"long-lived\";\n }\n if (path === \"React.createElement\") return \"render-handler\";\n const final = path.split(/[.:]/).at(-1) ?? \"\";\n if (/^use[A-Z0-9_]/.test(final)) return \"custom-hook\";\n }\n if (current.type === \"function_definition\" || current.type === \"function_declaration\") {\n if (current.startIndex !== callback.node.startIndex || current.endIndex !== callback.node.endIndex) break;\n }\n current = current.parent;\n }\n\n return \"unknown\";\n}\n\nexport const rerenderFunctionalSetstate: RuleDefinition = {\n id: \"react-luau/rerender-functional-setstate\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Use the functional state setter form when deferred callbacks update from the previous state value.\",\n run(context) {\n const diagnostics: DiagnosticInput[] = [];\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner?.body) continue;\n\n for (const call of context.walk(owner.body)) {\n if (call.type !== \"function_call\" || context.getCallPath(call) !== binding.setterName) continue;\n if (!isNestedFunctionFromOwner(context, call, owner)) continue;\n const argument = context.callArguments(call)[0];\n if (!argument || argument.type === \"function_definition\") continue;\n if (!containsUnshadowedIdentifier(argument, binding.valueName, context, owner)) continue;\n const lifetime = callbackLifetime(context, call, owner);\n if (lifetime === \"render-handler\" || lifetime === \"unknown\") continue;\n\n diagnostics.push({\n node: callNameNode(call),\n severity: lifetime === \"custom-hook\" ? \"suggestion\" : \"warning\",\n message: `${binding.setterName}() reads ${binding.valueName} from a captured callback value.`,\n help: lifetime === \"custom-hook\"\n ? `Use ${binding.setterName}(function(previous) return ... end) if the custom hook can retain this callback across renders.`\n : `Use ${binding.setterName}(function(previous) return ... end) when the next value depends on previous state.`,\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderLazyStateInit: RuleDefinition = {\n id: \"react-luau/rerender-lazy-state-init\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Expensive useState initializers should use React's lazy initializer form.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.useState\") continue;\n const initializer = context.callArguments(call)[0];\n if (!initializer || initializer.type === \"function_definition\") continue;\n\n const eagerCall = [...context.walk(initializer)].find((node) => node.type === \"function_call\");\n if (!eagerCall) continue;\n const eagerPath = context.resolveCallPath(context.getCallPath(eagerCall) ?? \"\");\n if (isTrivialInitializerPath(eagerPath) || /^React\\.use[A-Z0-9_]/.test(eagerPath)) continue;\n\n diagnostics.push({\n node: callNameNode(eagerCall),\n message: `${eagerPath || \"This initializer call\"} is evaluated every render before useState can reuse the existing state.`,\n help: \"Wrap expensive initial state creation in function() ... end so it only runs when the state is first initialized.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderLazyRefInit: RuleDefinition = {\n id: \"react-luau/rerender-lazy-ref-init\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Avoid eagerly rebuilding expensive values passed to useRef on every render.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.useRef\") continue;\n const initializer = context.callArguments(call)[0];\n if (!initializer || initializer.type !== \"function_call\") continue;\n const eagerPath = context.resolveCallPath(context.getCallPath(initializer) ?? \"\");\n if (isTrivialInitializerPath(eagerPath) || /^React\\.use[A-Z0-9_]/.test(eagerPath)) continue;\n\n diagnostics.push({\n node: callNameNode(initializer),\n message: `${eagerPath || \"This initializer call\"} is rebuilt before useRef returns the existing ref on every render.`,\n help: \"Initialize the ref from a predictable nil-guarded render pattern when construction is pure, or create owned resources in an effect with cleanup. Do not put side-effectful resource creation into useRef just to silence this warning.\",\n });\n }\n\n return diagnostics;\n },\n};\n\nexport const rerenderStateOnlyInHandlers: RuleDefinition = {\n id: \"react-luau/rerender-state-only-in-handlers\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"State that is only read from callbacks may be mutable data rather than rendered state.\",\n run(context) {\n const diagnostics = [];\n\n for (const owner of context.model.functions) {\n if (!owner.isComponent) continue;\n for (const binding of stateBindingsFor(context, owner)) {\n if (binding.valueName === \"_\" || binding.valueName.startsWith(\"_\")) continue;\n if (/^(set)?(?:TriggerRender|ForceUpdate|Rerender|ForceRender|Tick|Bump|BumpVersion|InvalidateRender|Refresh|Repaint)$/i.test(binding.setterName)) continue;\n if (!callsSetter(context, owner, binding.setterName)) continue;\n if (directlyReadsValue(context, owner, binding)) continue;\n\n diagnostics.push({\n node: identifierNode(binding.declaration, binding.valueName) ?? binding.declaration,\n message: `${binding.valueName} is updated as React state but is never read by the component's render path or hook arguments.`,\n help: \"When a value is only read by event or signal callbacks, consider useRef so updates do not rerender the component. Keep useState when the update intentionally invalidates rendering or feeds a hook dependency.\",\n });\n }\n }\n\n return diagnostics;\n },\n};\n\nexport const noDirectStateMutation: RuleDefinition = {\n id: \"react-luau/no-direct-state-mutation\",\n category: \"Correctness\",\n severity: \"warning\",\n description: \"Do not mutate table state in place.\",\n run(context) {\n const diagnostics = [];\n const seen = new Set<string>();\n\n for (const binding of context.model.stateBindings) {\n const owner = binding.owner;\n if (!owner?.body || !isPlainTableState(binding, context)) continue;\n const escaped = binding.valueName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n for (const node of context.walk(owner.body)) {\n if (node.startIndex >= binding.declaration.startIndex && node.endIndex <= binding.declaration.endIndex) continue;\n let mutates = false;\n\n if (node.type === \"assignment_statement\" || node.type === \"update_statement\") {\n mutates = new RegExp(`^\\\\s*${escaped}\\\\s*(?:\\\\.|\\\\[)`).test(node.text);\n } else if (node.type === \"function_call\") {\n const path = context.getCallPath(node) ?? \"\";\n if ([\"table.insert\", \"table.remove\", \"table.sort\", \"table.clear\", \"table.move\"].includes(path)) {\n mutates = context.callArguments(node)[0]?.text.trim() === binding.valueName;\n }\n }\n\n if (!mutates || isNameShadowedBetween(node, owner, binding.valueName)) continue;\n const key = `${node.startIndex}:${binding.valueName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n diagnostics.push({\n node: node.type === \"function_call\" ? callNameNode(node) : assignmentTargetNode(node),\n message: `${binding.valueName} is React state backed by a table and is mutated in place.`,\n help: `Create a new table and pass the new identity to ${binding.setterName}. In-place mutation can leave React with the same state identity and makes update ordering harder to reason about.`,\n });\n }\n }\n\n return diagnostics;\n },\n};\n",
42
+ "import type { RuleDefinition } from \"../types\";\nimport { fieldName, fieldNameNode, fieldValue } from \"./helpers\";\n\nexport const unstableContextValue: RuleDefinition = {\n id: \"react-luau/unstable-context-value\",\n category: \"Performance\",\n severity: \"warning\",\n description: \"Avoid recreating context value tables on every provider render when identity matters.\",\n run(context) {\n const diagnostics = [];\n\n for (const call of context.findCalls()) {\n const component = context.containingComponent(call);\n if (!component || !context.isDirectlyExecutedInFunction(call, component)) continue;\n const path = context.resolveCallPath(context.getCallPath(call) ?? \"\");\n if (path !== \"React.createElement\") continue;\n const args = context.callArguments(call);\n const element = args[0]?.text ?? \"\";\n const props = args[1];\n if (!/\\.Provider$/.test(element) || !props || props.type !== \"table_constructor\") continue;\n const valueField = props.namedChildren.find((field) =>\n field.type === \"field\" && fieldName(field) === \"value\" && fieldValue(field)?.type === \"table_constructor\"\n );\n if (!valueField) continue;\n\n diagnostics.push({\n node: fieldNameNode(valueField),\n message: \"Context Provider receives a new inline value table on every render.\",\n help: \"Memoize the provider value from its real dependencies when consumer updates depend on object identity.\",\n });\n }\n\n return diagnostics;\n },\n};\n",
43
+ "import type { RuleDefinition } from \"../types\";\nimport { effectNeedsCleanup } from \"./effect-needs-cleanup\";\nimport {\n noDerivedStateEffect,\n noEffectWithFreshDeps,\n noMutableInDeps,\n noSelfUpdatingEffect,\n} from \"./effect-state-rules\";\nimport { exhaustiveDeps } from \"./exhaustive-deps\";\nimport { noArrayIndexAsKey } from \"./no-array-index-as-key\";\nimport { noCreateContextInRender } from \"./no-create-context-in-render\";\nimport { noNestedComponentDefinition } from \"./no-nested-component-definition\";\nimport { noPropMutation } from \"./no-prop-mutation\";\nimport { noRandomKey } from \"./no-random-key\";\nimport { noSetStateInRender } from \"./no-set-state-in-render\";\nimport { parseErrors } from \"./parse-errors\";\nimport {\n preferUseRefForMutableCell,\n rerenderHighFrequencyState,\n rerenderRepeatedCollectionScan,\n rerenderStaticDiscoveryInRender,\n rerenderStaticState,\n rerenderUnnecessaryUseCallback,\n rerenderUnnecessaryUseMemo,\n rerenderUnstableMemoProps,\n} from \"./performance-rules\";\nimport { preferBindingOverState, preferBindingOverStateCandidate } from \"./prefer-binding-over-state\";\nimport { noCreateRootInRender } from \"./react-roblox-lifecycle\";\nimport { noRefCurrentInRender } from \"./ref-rules\";\nimport {\n noSideEffectsInRender,\n noTaskSpawnInRender,\n noYieldInRender,\n} from \"./render-side-effects\";\nimport { rulesOfHooks } from \"./rules-of-hooks\";\nimport {\n noDirectStateMutation,\n rerenderFunctionalSetstate,\n rerenderLazyRefInit,\n rerenderLazyStateInit,\n rerenderStateOnlyInHandlers,\n} from \"./state-performance\";\nimport { unstableContextValue } from \"./unstable-context-value\";\n\nexport const rules: RuleDefinition[] = [\n parseErrors,\n rulesOfHooks,\n exhaustiveDeps,\n effectNeedsCleanup,\n noDerivedStateEffect,\n noSelfUpdatingEffect,\n noEffectWithFreshDeps,\n noMutableInDeps,\n preferBindingOverState,\n preferBindingOverStateCandidate,\n rerenderUnstableMemoProps,\n rerenderHighFrequencyState,\n rerenderUnnecessaryUseMemo,\n rerenderUnnecessaryUseCallback,\n rerenderStaticDiscoveryInRender,\n rerenderRepeatedCollectionScan,\n rerenderStaticState,\n preferUseRefForMutableCell,\n rerenderFunctionalSetstate,\n rerenderLazyStateInit,\n rerenderLazyRefInit,\n rerenderStateOnlyInHandlers,\n noSetStateInRender,\n noDirectStateMutation,\n noRefCurrentInRender,\n noCreateContextInRender,\n noNestedComponentDefinition,\n noRandomKey,\n noYieldInRender,\n noTaskSpawnInRender,\n noSideEffectsInRender,\n noCreateRootInRender,\n noPropMutation,\n noArrayIndexAsKey,\n unstableContextValue,\n];\n\nexport const rulesById = new Map(rules.map((rule) => [rule.id, rule]));\n",
44
+ "import type { FixPreview } from \"./types\";\n\nconst examples: Record<string, FixPreview> = {\n \"react-luau/parse-error\": {\n before: `return React.createElement(\"Frame\", {\n\\tVisible = true,\n)`,\n after: `return React.createElement(\"Frame\", {\n\\tVisible = true,\n})`,\n note: \"Close the props table before closing the call. Parse errors can also come from unsupported syntax; inspect the reported location before applying a repair.\",\n },\n \"react-luau/rules-of-hooks\": {\n before: `if enabled then\n\\tlocal value = React.useMemo(function()\n\\t\\treturn computeValue()\n\\tend, {})\nend`,\n after: `local value = React.useMemo(function()\n\\treturn computeValue()\nend, {})\n\nif enabled then\n\\t-- use value here\nend`,\n note: \"Keep hook calls at the top level, then branch on their results.\",\n },\n \"react-luau/exhaustive-deps\": {\n before: `React.useEffect(function()\n\\tprint(value)\nend, {})`,\n after: `React.useEffect(function()\n\\tprint(value)\nend, { value })`,\n note: \"Make the dependency table match the reactive values captured by the hook callback.\",\n },\n \"react-luau/effect-needs-cleanup\": {\n before: `React.useEffect(function()\n\\tlocal connection = signal:Connect(onChanged)\nend, { signal, onChanged })`,\n after: `React.useEffect(function()\n\\tlocal connection = signal:Connect(onChanged)\n\\treturn function()\n\\t\\tconnection:Disconnect()\n\\tend\nend, { signal, onChanged })`,\n note: \"Return cleanup from the same effect that creates the owned resource.\",\n },\n \"react-luau/no-derived-state-effect\": {\n before: `local value, setValue = React.useState(0)\n\nReact.useEffect(function()\n\\tsetValue(input * scale)\nend, { input, scale })`,\n after: `local value = input * scale`,\n note: \"Compute render-known derived values during render instead of synchronizing another state cell.\",\n },\n \"react-luau/no-self-updating-effect\": {\n before: `React.useEffect(function()\n\\tsetCount(count + 1)\nend, { count })`,\n after: `local function increment()\n\\tsetCount(function(previous)\n\\t\\treturn previous + 1\n\\tend)\nend`,\n note: \"Move the update to the event that owns it, or add a real convergence guard when an effect is required.\",\n },\n \"react-luau/no-effect-with-fresh-deps\": {\n before: `local options = { enabled = enabled }\n\nReact.useEffect(function()\n\\tapplyOptions(options)\nend, { options })`,\n after: `React.useEffect(function()\n\\tlocal options = { enabled = enabled }\n\\tapplyOptions(options)\nend, { enabled })`,\n note: \"Depend on stable reactive inputs rather than an object or function recreated every render.\",\n },\n \"react-luau/no-mutable-in-deps\": {\n before: `React.useEffect(function()\n\\tuseValue(ref.current)\nend, { ref.current })`,\n after: `React.useEffect(function()\n\\tuseValue(ref.current)\nend, {})`,\n note: \"This effect reads the ref after mount only. A ref mutation cannot schedule another effect; use state or a subscription if changes must trigger work. Keep other reactive dependencies in the table.\",\n },\n \"react-luau/prefer-binding-over-state\": {\n before: `local value, setValue = React.useState(0)`,\n after: `local value, setValue = React.useBinding(0)`,\n note: \"Use a Binding when updates only need to flow into Binding-aware visual consumers.\",\n },\n \"react-luau/prefer-binding-over-state-candidate\": {\n before: `local value, setValue = React.useState(0)\n-- value drives both visual and structural work`,\n after: `local visualValue, setVisualValue = React.useBinding(0)\nlocal structuralValue, setStructuralValue = React.useState(0)`,\n note: \"A common fix is to split high-frequency visual updates from the smaller value that truly needs reconciliation.\",\n },\n \"react-luau/rerender-unstable-memo-props\": {\n before: `return React.createElement(MemoizedButton, {\n\\tonClick = function()\n\\t\\tdoSomething()\n\\tend,\n})`,\n after: `local onClick = React.useCallback(function()\n\\tdoSomething()\nend, {})\n\nreturn React.createElement(MemoizedButton, {\n\\tonClick = onClick,\n})`,\n note: \"Stabilize identity only when the memoized child is worth skipping. Moving construction into the child or removing ineffective memoization can also be better.\",\n },\n \"react-luau/rerender-high-frequency-state\": {\n before: `local transparency, setTransparency = React.useState(0)\nReact.useEffect(function()\n\\tlocal connection = RunService.RenderStepped:Connect(function()\n\\t\\tsetTransparency(readTransparency())\n\\tend)\n\\treturn function() connection:Disconnect() end\nend, { readTransparency })\nreturn React.createElement(\"Frame\", {\n\\tBackgroundTransparency = transparency,\n})`,\n after: `local transparency, setTransparency = React.useBinding(0)\nReact.useEffect(function()\n\\tlocal connection = RunService.RenderStepped:Connect(function()\n\\t\\tsetTransparency(readTransparency())\n\\tend)\n\\treturn function() connection:Disconnect() end\nend, { readTransparency })\nreturn React.createElement(\"Frame\", {\n\\tBackgroundTransparency = transparency,\n})`,\n note: \"A Binding updates this host property without scheduling component renders. Keep state for values that control child structure, and keep the subscription cleanup.\",\n },\n \"react-luau/rerender-unnecessary-usememo\": {\n before: `local doubled = React.useMemo(function()\n\\treturn value * 2\nend, { value })`,\n after: `local doubled = value * 2`,\n note: \"Compute cheap derived values directly when stable identity is not observed.\",\n },\n \"react-luau/rerender-unnecessary-usecallback\": {\n before: `local functionName = React.useCallback(function()\n\\tdoSomething()\nend, {})`,\n after: `local function functionName()\n\\tdoSomething()\nend`,\n note: \"Use a normal local function when nothing observes the callback's identity.\",\n },\n \"react-luau/rerender-static-discovery-in-render\": {\n before: `local function Component()\n\\tlocal modules = ReplicatedStorage.Modules:GetChildren()\n\\treturn renderModules(modules)\nend`,\n after: `local modules = ReplicatedStorage.Modules:GetChildren()\n\nlocal function Component()\n\\treturn renderModules(modules)\nend`,\n note: \"Move truly static discovery to module scope. If the source can change, cache or subscribe to the real changing input instead.\",\n },\n \"react-luau/rerender-repeated-collection-scan\": {\n before: `for _, item in items do\n\\tbuildRow(item)\nend\n\nfor _, item in items do\n\\tbuildLookup(item)\nend`,\n after: `for _, item in items do\n\\tbuildRow(item)\n\\tbuildLookup(item)\nend`,\n note: \"Combine passes when they iterate the same collection and can safely share one traversal.\",\n },\n \"react-luau/rerender-static-state\": {\n before: `local value, setValue = React.useState(computeValue())\n-- setValue is never used`,\n after: `local valueRef = React.useRef(nil)\nif valueRef.current == nil then\n\\tvalueRef.current = computeValue()\nend\nlocal value = valueRef.current`,\n note: \"This preserves a pure, non-nil initial value without a state setter. Derive a local value directly only when recomputing on every render is intended.\",\n },\n \"react-luau/prefer-use-ref-for-mutable-cell\": {\n before: `local cell = React.useMemo(function()\n\\treturn { current = initialValue }\nend, {})`,\n after: `local cell = React.useRef(initialValue)`,\n note: \"useRef directly expresses a stable mutable current cell.\",\n },\n \"react-luau/rerender-functional-setstate\": {\n before: `setCount(count + 1)`,\n after: `setCount(function(previous)\n\\treturn previous + 1\nend)`,\n note: \"Use the previous value supplied by React when a retained callback computes the next state from old state.\",\n },\n \"react-luau/rerender-lazy-state-init\": {\n before: `local value, setValue = React.useState(buildExpensiveValue())`,\n after: `local value, setValue = React.useState(function()\n\\treturn buildExpensiveValue()\nend)`,\n note: \"Pass a lazy initializer function so expensive construction only runs when the state is first created.\",\n },\n \"react-luau/rerender-lazy-ref-init\": {\n before: `local valueRef = React.useRef(buildExpensiveValue())`,\n after: `local valueRef = React.useRef(nil)\nif valueRef.current == nil then\n\\tvalueRef.current = buildExpensiveValue()\nend`,\n note: \"Use nil-guarded lazy initialization only for pure construction. Owned resources with cleanup usually belong in an effect.\",\n },\n \"react-luau/rerender-state-only-in-handlers\": {\n before: `local value, setValue = React.useState(0)\n\nlocal function onInput()\n\\tprint(value)\nend`,\n after: `local valueRef = React.useRef(0)\n\nlocal function onInput()\n\\tprint(valueRef.current)\nend`,\n note: \"Use a ref when updates do not need to participate in rendering or hook dependencies.\",\n },\n \"react-luau/no-set-state-in-render\": {\n before: `local value, setValue = React.useState(0)\nsetValue(nextValue)`,\n after: `local value, setValue = React.useState(0)\n\nReact.useEffect(function()\n\\tsetValue(nextValue)\nend, { nextValue })`,\n note: \"Move the update to the event or effect that owns it. Prefer deriving the value directly when no state synchronization is needed.\",\n },\n \"react-luau/no-direct-state-mutation\": {\n before: `items[index] = nextItem\nsetItems(items)`,\n after: `local nextItems = table.clone(items)\nnextItems[index] = nextItem\nsetItems(nextItems)`,\n note: \"Create a new table identity before updating React state.\",\n },\n \"react-luau/no-ref-current-in-render\": {\n before: `latest.current = value`,\n after: `React.useEffect(function()\n\\tlatest.current = value\nend, { value })`,\n note: \"When committed-versus-uncommitted values matter, update the latest-value ref after commit.\",\n },\n \"react-luau/no-create-context-in-render\": {\n before: `local function Component()\n\\tlocal Context = React.createContext(nil)\n\\treturn React.createElement(Context.Provider)\nend`,\n after: `local Context = React.createContext(nil)\n\nlocal function Component()\n\\treturn React.createElement(Context.Provider)\nend`,\n note: \"Create the Context once at module scope so its identity is stable.\",\n },\n \"react-luau/no-nested-component-definition\": {\n before: `local function Parent()\n\\tlocal function Child()\n\\t\\treturn React.createElement(\"Frame\")\n\\tend\n\\treturn React.createElement(Child)\nend`,\n after: `local function Child()\n\\treturn React.createElement(\"Frame\")\nend\n\nlocal function Parent()\n\\treturn React.createElement(Child)\nend`,\n note: \"Move component definitions out of render so React sees a stable component identity.\",\n },\n \"react-luau/no-random-key\": {\n before: `React.createElement(Row, {\n\\tkey = HttpService:GenerateGUID(false),\n})`,\n after: `React.createElement(Row, {\n\\tkey = item.id,\n})`,\n note: \"Use identity that remains stable for the lifetime of the logical item.\",\n },\n \"react-luau/no-yield-in-render\": {\n before: `local function Component(props)\n\\tlocal result = props.remote:InvokeServer()\n\\treturn React.createElement(\"TextLabel\", { Text = tostring(result) })\nend`,\n after: `local function Component(props)\n\\tlocal result, setResult = React.useState(\"Loading...\")\n\\tReact.useEffect(function()\n\\t\\tlocal active = true\n\\t\\ttask.spawn(function()\n\\t\\t\\tlocal ok, value = pcall(function()\n\\t\\t\\t\\treturn props.remote:InvokeServer()\n\\t\\t\\tend)\n\\t\\t\\tif active then\n\\t\\t\\t\\tsetResult(if ok then tostring(value) else \"Request failed\")\n\\t\\t\\tend\n\\t\\tend)\n\\t\\treturn function() active = false end\n\\tend, { props.remote })\n\\treturn React.createElement(\"TextLabel\", { Text = result })\nend`,\n note: \"Start yielding work after commit and ignore stale results after cleanup. This does not cancel the server request. Production data loading may also need retries or request deduplication.\",\n },\n \"react-luau/no-task-spawn-in-render\": {\n before: `local function Component()\n\\ttask.spawn(doWork)\n\\treturn React.createElement(\"Frame\")\nend`,\n after: `local function Component()\n\\tReact.useEffect(function()\n\\t\\tlocal thread = task.spawn(doWork)\n\\t\\treturn function()\n\\t\\t\\tif coroutine.status(thread) ~= \"dead\" then\n\\t\\t\\t\\ttask.cancel(thread)\n\\t\\t\\tend\n\\t\\tend\n\\tend, { doWork })\n\\treturn React.createElement(\"Frame\")\nend`,\n note: \"Schedule work from the effect or event that owns the side effect, not while rendering.\",\n },\n \"react-luau/no-side-effects-in-render\": {\n before: `local connection = signal:Connect(onChanged)`,\n after: `React.useEffect(function()\n\\tlocal connection = signal:Connect(onChanged)\n\\treturn function()\n\\t\\tconnection:Disconnect()\n\\tend\nend, { signal, onChanged })`,\n note: \"Move imperative work into an owned effect with cleanup. Disconnect subscriptions, destroy owned Instances, and cancel tweens. Prefer React.createElement for React-owned Instances.\",\n },\n \"react-luau/no-create-root-in-render\": {\n before: `local function Component()\n\\tlocal root = ReactRoblox.createRoot(container)\n\\troot:render(element)\nend`,\n after: `local root = ReactRoblox.createRoot(container)\nroot:render(element)`,\n note: \"Create and own roots outside component render. A component should not imperatively create another React root while rendering.\",\n },\n \"react-luau/no-prop-mutation\": {\n before: `props.value = normalize(props.value)`,\n after: `local value = normalize(props.value)`,\n note: \"Treat props as immutable and derive a local value or update state in the owner.\",\n },\n \"react-luau/no-array-index-as-key\": {\n before: `for index, item in items do\n\\tchildren[index] = React.createElement(Row, {\n\\t\\tkey = index,\n\\t})\nend`,\n after: `for _, item in items do\n\\tchildren[item.id] = React.createElement(Row, {\n\\t\\tkey = item.id,\n\\t})\nend`,\n note: \"Use stable item identity when items can move. Keep positional identity only when replacing the occupant of a slot is intentional.\",\n },\n \"react-luau/unstable-context-value\": {\n before: `return React.createElement(Context.Provider, {\n\\tvalue = { user = user, theme = theme },\n})`,\n after: `local contextValue = React.useMemo(function()\n\\treturn { user = user, theme = theme }\nend, { user, theme })\n\nreturn React.createElement(Context.Provider, {\n\\tvalue = contextValue,\n})`,\n note: \"Memoize the provider value when consumer updates depend on table identity.\",\n },\n};\n\nexport function fixExampleForRule(ruleId: string): FixPreview | undefined {\n const example = examples[ruleId];\n return example ? { ...example, kind: example.kind ?? \"pattern\" } : undefined;\n}\n",
45
+ "import type { ScanProgress } from \"./types\";\n\nconst ANSI = {\n reset: \"\\u001b[0m\",\n dim: \"\\u001b[2m\",\n magenta: \"\\u001b[35m\",\n green: \"\\u001b[32m\",\n};\n\nfunction paint(value: string, code: string): string {\n return `${code}${value}${ANSI.reset}`;\n}\n\nfunction visibleLength(value: string): number {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\").length;\n}\n\nfunction truncateMiddle(value: string, width: number): string {\n if (width <= 0) return \"\";\n if (value.length <= width) return value;\n if (width <= 3) return value.slice(0, width);\n const left = Math.ceil((width - 1) / 2);\n const right = Math.floor((width - 1) / 2);\n return `${value.slice(0, left)}…${value.slice(value.length - right)}`;\n}\n\nexport function formatScanProgress(progress: ScanProgress, terminalWidth = 120, colorized = false): string {\n const total = Math.max(0, progress.total);\n const current = Math.max(0, Math.min(progress.current, total || progress.current));\n const ratio = total === 0 ? 1 : current / total;\n const percent = Math.round(ratio * 100);\n const counter = `${current}/${total}`;\n const prefix = `${progress.label ?? `Scanning${progress.phase ? ` ${progress.phase}` : \"\"}`} `;\n const suffix = `${percent.toString().padStart(3)}% ${counter}`;\n const fileBudget = Math.max(0, terminalWidth - prefix.length - suffix.length - 38);\n const file = progress.file && fileBudget >= 8 ? ` ${truncateMiddle(progress.file, fileBudget)}` : \"\";\n const barWidth = Math.max(12, Math.min(28, terminalWidth - prefix.length - suffix.length - file.length - 8));\n const filled = Math.max(0, Math.min(barWidth, Math.round(ratio * barWidth)));\n const active = \"█\".repeat(filled);\n const remaining = \"░\".repeat(barWidth - filled);\n const coloredActive = active ? paint(active, progress.partial ? ANSI.magenta : current >= total ? ANSI.green : ANSI.magenta) : \"\";\n const coloredRemaining = remaining ? paint(remaining, ANSI.dim) : \"\";\n const bar = colorized ? `${coloredActive}${coloredRemaining}` : `${active}${remaining}`;\n const line = `${prefix}[${bar}] ${suffix}${file}`;\n return visibleLength(line) <= terminalWidth ? line : `${prefix}[${bar}] ${suffix}`;\n}\n\ninterface ProgressStream {\n isTTY?: boolean;\n columns?: number;\n write(value: string): unknown;\n}\n\nexport interface ProgressRenderer {\n update(progress: ScanProgress): void;\n clear(): void;\n}\n\nexport function createProgressRenderer(options: {\n stream?: ProgressStream;\n enabled?: boolean;\n colorized?: boolean;\n throttleMs?: number;\n} = {}): ProgressRenderer {\n const stream = options.stream ?? process.stdout;\n const enabled = options.enabled ?? Boolean(stream.isTTY && !process.env.CI);\n const colorized = options.colorized ?? false;\n const throttleMs = options.throttleMs ?? 40;\n let lastWriteAt = 0;\n let lastProgress: ScanProgress | null = null;\n let visible = false;\n\n function render(progress: ScanProgress, force = false): void {\n if (!enabled) return;\n lastProgress = progress;\n const now = performance.now();\n if (!force && progress.current < progress.total && now - lastWriteAt < throttleMs) return;\n lastWriteAt = now;\n const line = formatScanProgress(progress, stream.columns || 120, colorized);\n stream.write(`\\r\\u001b[2K${line}`);\n visible = true;\n }\n\n return {\n update(progress) {\n const phaseChanged = lastProgress?.phase !== progress.phase || lastProgress?.label !== progress.label;\n render(progress, phaseChanged || progress.current >= progress.total || Boolean(progress.partial));\n },\n clear() {\n if (!enabled || !visible) return;\n stream.write(\"\\r\\u001b[2K\");\n visible = false;\n },\n };\n}\n"
46
+ ],
47
+ "mappings": "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",
48
+ "debugId": "DD15F49C505776FC64756E2164756E21",
49
+ "names": []
50
+ }