@rdjperron/lint 0.1.0 → 0.2.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.
- package/README.md +146 -57
- package/dist/config.d.mts +113 -0
- package/dist/config.mjs +218 -0
- package/dist/config.mjs.map +1 -0
- package/dist/index.d.mts +5 -0
- package/dist/{anti-slop.mjs → index.mjs} +253 -94
- package/dist/index.mjs.map +1 -0
- package/dist/verify.d.mts +92 -0
- package/dist/verify.mjs +400 -0
- package/dist/verify.mjs.map +1 -0
- package/docs/rules/README.md +43 -0
- package/docs/rules/no-array-filter-map.md +60 -0
- package/docs/rules/no-chained-type-assertions.md +52 -0
- package/docs/rules/no-conditional-empty-object-spread.md +50 -0
- package/docs/rules/no-hardcoded-jsx-text.md +52 -0
- package/docs/rules/no-known-value-widening.md +62 -0
- package/docs/rules/no-module-mocking.md +53 -0
- package/docs/rules/no-object-parameters.md +55 -0
- package/docs/rules/no-reduce-accumulator-copy.md +57 -0
- package/docs/rules/no-reflect-apply.md +56 -0
- package/docs/rules/no-reflect-get.md +51 -0
- package/docs/rules/no-runtime-typeof.md +61 -0
- package/docs/rules/no-shape-in-symbol-names.md +53 -0
- package/docs/rules/no-unknown-parameters.md +55 -0
- package/docs/rules/no-unknown-returns.md +61 -0
- package/docs/rules/no-unknown-type-aliases.md +52 -0
- package/docs/rules/no-unsafe-dictionary-type.md +56 -0
- package/docs/rules/no-use-effect.md +55 -0
- package/docs/rules/no-widen-then-assert.md +53 -0
- package/docs/rules/require-safety-comment-for-type-assertion.md +59 -0
- package/docs/rules/static-public-env.md +55 -0
- package/fixtures/README.md +22 -23
- package/fixtures/{anti-slop/no-array-filter-map.fixture.ts → no-array-filter-map.fixture.ts} +1 -1
- package/fixtures/{anti-slop/no-chained-type-assertions.fixture.ts → no-chained-type-assertions.fixture.ts} +1 -1
- package/fixtures/{anti-slop/no-conditional-empty-object-spread.fixture.ts → no-conditional-empty-object-spread.fixture.ts} +1 -1
- package/fixtures/{i18n/no-hardcoded-jsx-text.fixture.tsx → no-hardcoded-jsx-text.fixture.tsx} +1 -1
- package/fixtures/{anti-slop/no-known-value-widening.fixture.ts → no-known-value-widening.fixture.ts} +1 -1
- package/fixtures/{anti-slop/no-module-mocking.fixture.ts → no-module-mocking.fixture.ts} +1 -1
- package/fixtures/{anti-slop/no-object-parameters.fixture.ts → no-object-parameters.fixture.ts} +1 -1
- package/fixtures/{anti-slop/no-reduce-accumulator-copy.fixture.ts → no-reduce-accumulator-copy.fixture.ts} +1 -1
- package/fixtures/{anti-slop/no-reflect-apply.fixture.ts → no-reflect-apply.fixture.ts} +1 -1
- package/fixtures/{anti-slop/no-reflect-get.fixture.ts → no-reflect-get.fixture.ts} +1 -1
- package/fixtures/{anti-slop/no-runtime-typeof.fixture.ts → no-runtime-typeof.fixture.ts} +1 -1
- package/fixtures/no-shape-in-symbol-names.fixture.ts +2 -0
- package/fixtures/{anti-slop/no-unknown-parameters.fixture.ts → no-unknown-parameters.fixture.ts} +1 -1
- package/fixtures/{anti-slop/no-unknown-returns.fixture.ts → no-unknown-returns.fixture.ts} +1 -1
- package/fixtures/no-unknown-type-aliases.fixture.ts +2 -0
- package/fixtures/no-unsafe-dictionary-type.fixture.ts +2 -0
- package/fixtures/{react/no-use-effect.fixture.tsx → no-use-effect.fixture.tsx} +1 -1
- package/fixtures/{anti-slop/no-widen-then-assert.fixture.ts → no-widen-then-assert.fixture.ts} +1 -1
- package/fixtures/{anti-slop/require-safety-comment-for-type-assertion.fixture.ts → require-safety-comment-for-type-assertion.fixture.ts} +1 -1
- package/fixtures/{expo/static-public-env.fixture.ts → static-public-env.fixture.ts} +1 -1
- package/package.json +27 -26
- package/dist/anti-slop.d.mts +0 -6
- package/dist/anti-slop.mjs.map +0 -1
- package/dist/expo.d.mts +0 -5
- package/dist/expo.mjs +0 -51
- package/dist/expo.mjs.map +0 -1
- package/dist/i18n.d.mts +0 -5
- package/dist/i18n.mjs +0 -50
- package/dist/i18n.mjs.map +0 -1
- package/dist/react.d.mts +0 -5
- package/dist/react.mjs +0 -73
- package/dist/react.mjs.map +0 -1
- package/dist/rule-options-DrAXz8BD.mjs +0 -18
- package/dist/rule-options-DrAXz8BD.mjs.map +0 -1
- package/fixtures/anti-slop/no-shape-in-symbol-names.fixture.ts +0 -2
- package/fixtures/anti-slop/no-unknown-type-aliases.fixture.ts +0 -2
- package/fixtures/anti-slop/no-unsafe-dictionary-type.fixture.ts +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["isConstAssertion","isEmptyObjectExpression","isNode","typeReferenceName","typeReferenceName","variableDeclarator","importedName","typeReferenceName"],"sources":["../src/anti-slop/shared/array-method.ts","../src/anti-slop/rules/no-array-filter-map.ts","../src/anti-slop/rules/no-chained-type-assertions.ts","../src/anti-slop/rules/no-conditional-empty-object-spread.ts","../src/anti-slop/shared/lexical-type-parameters.ts","../src/anti-slop/shared/type-alias-resolution.ts","../src/anti-slop/shared/dictionary-types.ts","../src/anti-slop/shared/function-parameters.ts","../src/anti-slop/shared/scope.ts","../src/anti-slop/rules/no-known-value-widening.ts","../src/anti-slop/rules/no-module-mocking.ts","../src/anti-slop/rules/no-object-parameters.ts","../src/anti-slop/rules/no-reduce-accumulator-copy.ts","../src/anti-slop/shared/reflect-method.ts","../src/anti-slop/rules/no-reflect-apply.ts","../src/anti-slop/rules/no-reflect-get.ts","../src/anti-slop/rules/no-runtime-typeof.ts","../src/anti-slop/rules/no-shape-in-symbol-names.ts","../src/anti-slop/rules/no-unknown-parameters.ts","../src/anti-slop/rules/no-unknown-returns.ts","../src/anti-slop/rules/no-unknown-type-aliases.ts","../src/anti-slop/rules/no-unsafe-dictionary-type.ts","../src/anti-slop/rules/no-widen-then-assert.ts","../src/anti-slop/rules/require-safety-comment-for-type-assertion.ts","../src/shared/rule-options.ts","../src/rules/no-hardcoded-jsx-text.ts","../src/rules/no-use-effect.ts","../src/rules/static-public-env.ts","../src/index.ts"],"sourcesContent":["import type { ESTree, Scope, SourceCode, Variable } from \"@oxlint/plugins\";\n\n/** Unwrap syntax-only wrappers when inspecting array methods and accumulator references. */\nexport function unwrapArrayExpression(node: ESTree.Node): ESTree.Node {\n while (\n node.type === \"ParenthesizedExpression\" ||\n node.type === \"ChainExpression\" ||\n node.type === \"TSAsExpression\" ||\n node.type === \"TSTypeAssertion\" ||\n node.type === \"TSNonNullExpression\" ||\n node.type === \"TSSatisfiesExpression\"\n ) {\n node = node.expression;\n }\n return node;\n}\n\n/** Resolve a local binding by scope, not by identifier spelling. */\nexport function resolveArrayBinding(sourceCode: SourceCode, node: ESTree.Node): Variable | null {\n node = unwrapArrayExpression(node);\n if (node.type !== \"Identifier\") return null;\n let scope: Scope | null = sourceCode.getScope(node);\n while (scope !== null) {\n const variable = scope.set.get(node.name);\n if (variable !== undefined) return variable;\n scope = scope.upper;\n }\n return null;\n}\n\n/** Read static method names, including computed string literals, without evaluating expressions. */\nexport function arrayMethodTarget(\n node: ESTree.Node,\n): { readonly name: string; readonly object: ESTree.Node } | null {\n node = unwrapArrayExpression(node);\n if (node.type !== \"MemberExpression\") return null;\n const property = node.property;\n if (!node.computed && property.type === \"Identifier\") {\n return { name: property.name, object: node.object };\n }\n if (node.computed && property.type === \"Literal\" && typeof property.value === \"string\") {\n return { name: property.value, object: node.object };\n }\n return null;\n}\n\nfunction isArrayAnnotation(type: ESTree.TSType): boolean {\n if (type.type === \"TSArrayType\" || type.type === \"TSTupleType\") return true;\n if (type.type === \"TSParenthesizedType\") return isArrayAnnotation(type.typeAnnotation);\n if (type.type === \"TSTypeOperator\" && type.operator === \"readonly\") {\n return isArrayAnnotation(type.typeAnnotation);\n }\n return (\n type.type === \"TSTypeReference\" && type.typeName.type === \"Identifier\" &&\n (type.typeName.name === \"Array\" || type.typeName.name === \"ReadonlyArray\")\n );\n}\n\n/** Recognize local array evidence; unknown receivers and iterator pipelines are deliberately excluded. */\nexport function isKnownArrayExpression(\n sourceCode: SourceCode,\n node: ESTree.Node,\n visited = new Set<Variable>(),\n): boolean {\n node = unwrapArrayExpression(node);\n if (node.type === \"ArrayExpression\") return true;\n if (node.type === \"CallExpression\") {\n const method = arrayMethodTarget(node.callee);\n return (\n method !== null &&\n [\"map\", \"filter\", \"flatMap\", \"slice\", \"concat\", \"toSorted\", \"toReversed\", \"toSpliced\"].includes(method.name) &&\n isKnownArrayExpression(sourceCode, method.object, visited)\n );\n }\n if (node.type !== \"Identifier\") return false;\n const variable = resolveArrayBinding(sourceCode, node);\n if (variable === null || visited.has(variable)) return false;\n visited.add(variable);\n if (variable.references.some(reference => reference.isWrite() && !reference.init)) return false;\n for (const identifier of variable.identifiers) {\n const annotation = identifier.typeAnnotation?.typeAnnotation;\n if (annotation !== undefined) return isArrayAnnotation(annotation);\n }\n for (const definition of variable.defs) {\n if (\n definition.type === \"Variable\" && definition.node.type === \"VariableDeclarator\" &&\n definition.node.id.type === \"Identifier\" && definition.node.init !== null &&\n definition.node.parent.type === \"VariableDeclaration\" && definition.node.parent.kind === \"const\"\n ) {\n return isKnownArrayExpression(sourceCode, definition.node.init, visited);\n }\n }\n return false;\n}\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport { arrayMethodTarget, isKnownArrayExpression, unwrapArrayExpression } from \"../shared/array-method.ts\";\n\n/** Reject eager array filter/map pipelines; lazy iterator helpers remain allowed. */\nexport const noArrayFilterMapRule = defineRule({\n meta: {\n type: \"suggestion\",\n docs: { description: \"Disallow adjacent array filter/map passes in favor of lazy iterator helpers or a single transformation.\" },\n messages: {\n arrayFilterMap: \"Avoid consecutive array `{{first}}` and `{{second}}` passes. Prefer `.values().{{first}}(...).{{second}}(...).toArray()` where iterator helpers are supported, or a single `flatMap`/mutating reducer. Preserve callback ordering, indexes, and filtering semantics.\",\n },\n },\n createOnce(context) {\n return {\n CallExpression(node) {\n const outer = arrayMethodTarget(node.callee);\n if (outer === null || (outer.name !== \"map\" && outer.name !== \"filter\")) return;\n const innerCall = unwrapArrayExpression(outer.object);\n if (innerCall.type !== \"CallExpression\") return;\n const inner = arrayMethodTarget(innerCall.callee);\n if (inner === null || inner.name !== (outer.name === \"map\" ? \"filter\" : \"map\")) return;\n if (!isKnownArrayExpression(context.sourceCode, inner.object)) return;\n context.report({ node, messageId: \"arrayFilterMap\", data: { first: inner.name, second: outer.name } });\n },\n };\n },\n});\n","import { defineRule } from \"@oxlint/plugins\";\nimport type { ESTree } from \"@oxlint/plugins\";\n\ntype TypeAssertionExpression = ESTree.TSAsExpression | ESTree.TSTypeAssertion;\n\nfunction isTypeAssertionExpression(node: ESTree.Node): node is TypeAssertionExpression {\n return node.type === \"TSAsExpression\" || node.type === \"TSTypeAssertion\";\n}\n\nfunction unwrapParenthesizedExpression(expression: ESTree.Expression): ESTree.Expression {\n let current = expression;\n while (current.type === \"ParenthesizedExpression\") {\n current = current.expression;\n }\n return current;\n}\n\nfunction isConstAssertion(node: TypeAssertionExpression): boolean {\n const { typeAnnotation } = node;\n return (\n typeAnnotation.type === \"TSTypeReference\" &&\n typeAnnotation.typeName.type === \"Identifier\" &&\n typeAnnotation.typeName.name === \"const\"\n );\n}\n\nfunction isOutermostAssertionInChain(node: TypeAssertionExpression): boolean {\n let current: ESTree.Expression = node;\n let parent = node.parent;\n\n while (parent.type === \"ParenthesizedExpression\" && parent.expression === current) {\n current = parent;\n parent = parent.parent;\n }\n\n return !isTypeAssertionExpression(parent) || parent.expression !== current;\n}\n\nfunction isForbiddenAssertionChain(node: TypeAssertionExpression): boolean {\n let assertionCount = 0;\n let hasNonConstAssertion = false;\n let current: ESTree.Expression = node;\n\n while (isTypeAssertionExpression(current)) {\n assertionCount += 1;\n hasNonConstAssertion ||= !isConstAssertion(current);\n current = unwrapParenthesizedExpression(current.expression);\n }\n\n return assertionCount > 1 && hasNonConstAssertion;\n}\n\n/** Disallow nested TypeScript type assertions, while permitting chains made only of const assertions. */\nexport const noChainedTypeAssertionsRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow chained TypeScript as and angle-bracket assertions, including parenthesized chains.\",\n },\n messages: {\n chained:\n \"This assertion chain discards type evidence. Keep the original precise type, or parse untrusted input at its boundary before narrowing it.\",\n },\n },\n createOnce(context) {\n const checkTypeAssertion = (node: TypeAssertionExpression) => {\n if (!isOutermostAssertionInChain(node) || !isForbiddenAssertionChain(node)) return;\n context.report({ node, messageId: \"chained\" });\n };\n\n return {\n TSAsExpression: checkTypeAssertion,\n TSTypeAssertion: checkTypeAssertion,\n };\n },\n});\n","import { defineRule } from \"@oxlint/plugins\";\nimport type { ESTree } from \"@oxlint/plugins\";\n\nfunction unwrapParentheses(node: ESTree.Expression): ESTree.Expression {\n let current = node;\n while (current.type === \"ParenthesizedExpression\") {\n current = current.expression;\n }\n return current;\n}\n\nfunction isEmptyObjectExpression(node: ESTree.Expression): boolean {\n return node.type === \"ObjectExpression\" && node.properties.length === 0;\n}\n\nfunction isConditionalEmptyObjectSpread(node: ESTree.Expression): boolean {\n const conditional = unwrapParentheses(node);\n return (\n conditional.type === \"ConditionalExpression\" &&\n (isEmptyObjectExpression(conditional.consequent) ||\n isEmptyObjectExpression(conditional.alternate))\n );\n}\n\n/** Ban conditional empty-object spreads without changing their omission semantics. */\nexport const noConditionalEmptyObjectSpreadRule = defineRule({\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Disallow object spreads that conditionally spread an empty object to omit fields.\",\n },\n messages: {\n avoid:\n \"This conditional spread hides property omission behind an empty object. Build the object in separate statements and add the property only when present.\",\n },\n },\n createOnce(context) {\n return {\n SpreadElement(node) {\n if (node.parent.type !== \"ObjectExpression\") return;\n\n if (isConditionalEmptyObjectSpread(node.argument)) {\n context.report({ node, messageId: \"avoid\" });\n }\n },\n };\n },\n});\n","import type { ESTree } from \"@oxlint/plugins\";\n\ntype VisitorKeys = Readonly<Record<string, readonly string[]>>;\n\nfunction isNode(value: unknown): value is ESTree.Node {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"type\" in value &&\n\t\ttypeof value.type === \"string\"\n\t);\n}\n\nfunction collectInferTypeParameterNames(\n\tnode: ESTree.Node,\n\tvisitorKeys: VisitorKeys,\n\tnames: Set<string>,\n): void {\n\tif (node.type === \"TSInferType\") names.add(node.typeParameter.name.name);\n\tconst record = node as unknown as Readonly<Record<string, unknown>>;\n\tfor (const key of visitorKeys[node.type] ?? []) {\n\t\tconst value = record[key];\n\t\tif (isNode(value)) {\n\t\t\tcollectInferTypeParameterNames(value, visitorKeys, names);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!Array.isArray(value)) continue;\n\t\tfor (const child of value) {\n\t\t\tif (isNode(child)) collectInferTypeParameterNames(child, visitorKeys, names);\n\t\t}\n\t}\n}\n\n/** Collect type binders that are in scope at a node and can shadow module aliases. */\nexport function lexicalTypeParameterNames(\n\tnode: ESTree.Node,\n\tvisitorKeys: VisitorKeys,\n): ReadonlySet<string> {\n\tconst names = new Set<string>();\n\tlet descendant: ESTree.Node = node;\n\tlet current: ESTree.Node | null = node;\n\twhile (current !== null && current.type !== \"Program\") {\n\t\tif (\"typeParameters\" in current) {\n\t\t\tfor (const parameter of current.typeParameters?.params ?? []) {\n\t\t\t\tnames.add(parameter.name.name);\n\t\t\t}\n\t\t}\n\t\tif (\n\t\t\tcurrent.type === \"TSMappedType\" &&\n\t\t\t(descendant === current.nameType || descendant === current.typeAnnotation)\n\t\t) {\n\t\t\tnames.add(current.key.name);\n\t\t}\n\t\tif (current.type === \"TSConditionalType\" && descendant === current.trueType) {\n\t\t\tcollectInferTypeParameterNames(current.extendsType, visitorKeys, names);\n\t\t}\n\t\tdescendant = current;\n\t\tcurrent = current.parent;\n\t}\n\treturn names;\n}\n","import type { ESTree } from \"@oxlint/plugins\";\n\nimport { lexicalTypeParameterNames } from \"./lexical-type-parameters.ts\";\n\ntype VisitorKeys = Readonly<Record<string, readonly string[]>>;\ntype TypeScope = ESTree.Node;\n\ntype TypeBinding = {\n\treadonly alias: ESTree.TSTypeAliasDeclaration | null;\n\treadonly name: string;\n\treadonly scope: TypeScope;\n};\n\ntype Substitution = {\n\treadonly substitutions: Substitutions;\n\treadonly type: ESTree.TSType;\n};\n\ntype Substitutions = ReadonlyMap<string, Substitution>;\n\nexport type TypeAliasEnvironment = {\n\treadonly aliases: readonly ESTree.TSTypeAliasDeclaration[];\n\treadonly bindingsByName: ReadonlyMap<string, readonly TypeBinding[]>;\n\treadonly visitorKeys: VisitorKeys;\n};\n\nexport type ResolvedTypeMatcher = (\n\ttype: ESTree.TSType,\n\tmatches: (child: ESTree.TSType) => boolean,\n) => boolean;\n\nconst environmentsByProgram = new WeakMap<ESTree.Program, TypeAliasEnvironment>();\n\nfunction isNode(value: unknown): value is ESTree.Node {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"type\" in value &&\n\t\ttypeof value.type === \"string\"\n\t);\n}\n\nfunction enclosingTypeScope(node: ESTree.Node): TypeScope {\n\tlet current: ESTree.Node | null = node.parent;\n\twhile (current !== null) {\n\t\tif (\n\t\t\tcurrent.type === \"Program\" ||\n\t\t\tcurrent.type === \"BlockStatement\" ||\n\t\t\tcurrent.type === \"TSModuleBlock\" ||\n\t\t\tcurrent.type === \"StaticBlock\" ||\n\t\t\tcurrent.type === \"SwitchStatement\"\n\t\t) {\n\t\t\treturn current;\n\t\t}\n\t\tcurrent = current.parent;\n\t}\n\treturn node;\n}\n\nfunction declaredTypeBinding(node: ESTree.Node): {\n\treadonly alias: ESTree.TSTypeAliasDeclaration | null;\n\treadonly name: string;\n} | null {\n\tif (node.type === \"TSTypeAliasDeclaration\") {\n\t\treturn { alias: node, name: node.id.name };\n\t}\n\tif (\n\t\tnode.type === \"TSInterfaceDeclaration\" ||\n\t\tnode.type === \"TSEnumDeclaration\" ||\n\t\tnode.type === \"ClassDeclaration\" ||\n\t\tnode.type === \"ClassExpression\"\n\t) {\n\t\treturn node.id === null ? null : { alias: null, name: node.id.name };\n\t}\n\tif (\n\t\tnode.type === \"ImportSpecifier\" ||\n\t\tnode.type === \"ImportDefaultSpecifier\" ||\n\t\tnode.type === \"ImportNamespaceSpecifier\"\n\t) {\n\t\treturn { alias: null, name: node.local.name };\n\t}\n\treturn null;\n}\n\nfunction collectTypeBindings(\n\tnode: ESTree.Node,\n\tvisitorKeys: VisitorKeys,\n\tbindingsByName: Map<string, TypeBinding[]>,\n\taliases: ESTree.TSTypeAliasDeclaration[],\n): void {\n\tconst declared = declaredTypeBinding(node);\n\tif (declared !== null) {\n\t\tconst bindings = bindingsByName.get(declared.name) ?? [];\n\t\tbindings.push({ ...declared, scope: enclosingTypeScope(node) });\n\t\tbindingsByName.set(declared.name, bindings);\n\t\tif (declared.alias !== null) aliases.push(declared.alias);\n\t}\n\n\t// SAFETY: Oxlint's visitor keys identify only ESTree child-node properties.\n\tconst fields = node as unknown as Readonly<Record<string, unknown>>;\n\tfor (const key of visitorKeys[node.type] ?? []) {\n\t\tconst value = fields[key];\n\t\tif (isNode(value)) {\n\t\t\tcollectTypeBindings(value, visitorKeys, bindingsByName, aliases);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!Array.isArray(value)) continue;\n\t\tfor (const child of value) {\n\t\t\tif (isNode(child)) {\n\t\t\t\tcollectTypeBindings(child, visitorKeys, bindingsByName, aliases);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Collect every lexical type alias and competing type binding in a program. */\nexport function createTypeAliasEnvironment(\n\tprogram: ESTree.Program,\n\tvisitorKeys: VisitorKeys,\n): TypeAliasEnvironment {\n\tconst cached = environmentsByProgram.get(program);\n\tif (cached !== undefined) return cached;\n\tconst bindingsByName = new Map<string, TypeBinding[]>();\n\tconst aliases: ESTree.TSTypeAliasDeclaration[] = [];\n\tcollectTypeBindings(program, visitorKeys, bindingsByName, aliases);\n\tconst environment = { aliases, bindingsByName, visitorKeys };\n\tenvironmentsByProgram.set(program, environment);\n\treturn environment;\n}\n\nfunction ancestorDistance(ancestor: ESTree.Node, node: ESTree.Node): number | null {\n\tlet current: ESTree.Node | null = node;\n\tlet distance = 0;\n\twhile (current !== null) {\n\t\tif (current === ancestor) return distance;\n\t\tcurrent = current.parent;\n\t\tdistance += 1;\n\t}\n\treturn null;\n}\n\nfunction nearestTypeBindings(\n\tname: string,\n\tuse: ESTree.Node,\n\tenvironment: TypeAliasEnvironment,\n): readonly TypeBinding[] {\n\tconst candidates = environment.bindingsByName.get(name) ?? [];\n\tlet nearestDistance = Number.POSITIVE_INFINITY;\n\tlet nearest: TypeBinding[] = [];\n\tfor (const candidate of candidates) {\n\t\tconst distance = ancestorDistance(candidate.scope, use);\n\t\tif (distance === null || distance > nearestDistance) continue;\n\t\tif (distance === nearestDistance) {\n\t\t\tnearest.push(candidate);\n\t\t\tcontinue;\n\t\t}\n\t\tnearestDistance = distance;\n\t\tnearest = [candidate];\n\t}\n\treturn nearest;\n}\n\n/** Resolve the nearest visible alias with this name, respecting lexical shadowing. */\nexport function visibleTypeAlias(\n\tname: string,\n\tuse: ESTree.Node,\n\tenvironment: TypeAliasEnvironment,\n): ESTree.TSTypeAliasDeclaration | null {\n\tif (lexicalTypeParameterNames(use, environment.visitorKeys).has(name)) return null;\n\tconst bindings = nearestTypeBindings(name, use, environment);\n\treturn bindings.length === 1 ? (bindings[0]?.alias ?? null) : null;\n}\n\n/** Return whether a local declaration shadows a built-in type at this use. */\nexport function hasVisibleTypeBinding(\n\tname: string,\n\tuse: ESTree.Node,\n\tenvironment: TypeAliasEnvironment,\n): boolean {\n\treturn (\n\t\tlexicalTypeParameterNames(use, environment.visitorKeys).has(name) ||\n\t\tnearestTypeBindings(name, use, environment).length > 0\n\t);\n}\n\nfunction typeReferenceName(type: ESTree.TSTypeReference): string | null {\n\treturn type.typeName.type === \"Identifier\" ? type.typeName.name : null;\n}\n\nfunction aliasSubstitutions(\n\talias: ESTree.TSTypeAliasDeclaration,\n\treference: ESTree.TSTypeReference,\n\tbase: Substitutions,\n): Substitutions | null {\n\tconst parameters = alias.typeParameters?.params ?? [];\n\tconst arguments_ = reference.typeArguments?.params ?? [];\n\tconst next = new Map(base);\n\tfor (const [index, parameter] of parameters.entries()) {\n\t\tconst explicitArgument = arguments_[index];\n\t\tconst argument = explicitArgument ?? parameter.default;\n\t\tif (argument === null || argument === undefined) return null;\n\t\tconst argumentSubstitutions = explicitArgument === undefined ? next : base;\n\t\tnext.set(parameter.name.name, {\n\t\t\ttype: argument,\n\t\t\tsubstitutions: new Map(argumentSubstitutions),\n\t\t});\n\t}\n\treturn next;\n}\n\n/** Match a type after resolving visible aliases and substituting their type parameters. */\nexport function resolvedTypeMatches(\n\ttype: ESTree.TSType,\n\tenvironment: TypeAliasEnvironment,\n\tmatcher: ResolvedTypeMatcher,\n): boolean {\n\tconst evaluate = (\n\t\tcurrent: ESTree.TSType,\n\t\tsubstitutions: Substitutions,\n\t\tresolvingAliases: ReadonlySet<ESTree.TSTypeAliasDeclaration>,\n\t): boolean => {\n\t\tif (current.type === \"TSTypeReference\") {\n\t\t\tconst name = typeReferenceName(current);\n\t\t\tif (name !== null) {\n\t\t\t\tconst substitution = substitutions.get(name);\n\t\t\t\tif (substitution !== undefined && !current.typeArguments?.params.length) {\n\t\t\t\t\treturn evaluate(\n\t\t\t\t\t\tsubstitution.type,\n\t\t\t\t\t\tsubstitution.substitutions,\n\t\t\t\t\t\tresolvingAliases,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst alias = visibleTypeAlias(name, current, environment);\n\t\t\t\tif (alias !== null && !resolvingAliases.has(alias)) {\n\t\t\t\t\tconst nextSubstitutions = aliasSubstitutions(alias, current, substitutions);\n\t\t\t\t\tif (nextSubstitutions !== null) {\n\t\t\t\t\t\tconst nextResolving = new Set(resolvingAliases);\n\t\t\t\t\t\tnextResolving.add(alias);\n\t\t\t\t\t\treturn evaluate(alias.typeAnnotation, nextSubstitutions, nextResolving);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn matcher(current, (child) =>\n\t\t\tevaluate(child, substitutions, resolvingAliases),\n\t\t);\n\t};\n\n\treturn evaluate(type, new Map(), new Set());\n}\n","import type { ESTree } from \"@oxlint/plugins\";\n\nimport {\n\tcreateTypeAliasEnvironment,\n\thasVisibleTypeBinding,\n\tvisibleTypeAlias,\n\ttype TypeAliasEnvironment as LexicalTypeAliasEnvironment,\n} from \"./type-alias-resolution.ts\";\n\nconst BUILT_INS = new Set([\n\t\"Record\",\n\t\"Readonly\",\n\t\"Partial\",\n\t\"Required\",\n\t\"Pick\",\n\t\"Omit\",\n\t\"PropertyKey\",\n\t\"NonNullable\",\n]);\nconst TRANSPARENT_WRAPPERS = new Set([\"Readonly\", \"Partial\", \"Required\", \"NonNullable\"]);\n\ntype TypeAliasEnvironment = ReadonlyMap<string, ESTree.TSType>;\n\ntype ResolvedType = {\n\treadonly type: ESTree.TSType;\n\treadonly substitutions: TypeAliasEnvironment;\n};\n\nexport type UnsafeDictionary = {\n\treadonly kind: \"unsafe-dictionary\";\n\treadonly unsafeValue: \"any\" | \"empty-object\" | \"object\" | \"union\" | \"unknown\";\n};\n\nexport type WideningTargetKind =\n\t| \"anonymous object\"\n\t| \"generic container\"\n\t| \"object\"\n\t| \"open dictionary\"\n\t| \"unknown\";\n\nexport type WideningTarget = {\n\treadonly kind: WideningTargetKind;\n};\n\nexport type TypeEnvironment = {\n\treadonly interfaces: ReadonlyMap<string, readonly ESTree.TSInterfaceDeclaration[]>;\n\treadonly typeAliases: LexicalTypeAliasEnvironment;\n};\n\nfunction declaredStatement(statement: ESTree.Statement): ESTree.Node | null {\n\treturn statement.type === \"ExportNamedDeclaration\" ||\n\t\tstatement.type === \"ExportDefaultDeclaration\"\n\t\t? (statement.declaration ?? null)\n\t\t: statement;\n}\n\nexport function createTypeEnvironment(\n\tprogram: ESTree.Program,\n\tvisitorKeys: Readonly<Record<string, readonly string[]>>,\n): TypeEnvironment {\n\tconst interfaces = new Map<string, ESTree.TSInterfaceDeclaration[]>();\n\n\tfor (const statement of program.body) {\n\t\tconst declaration = declaredStatement(statement);\n\t\tif (declaration?.type !== \"TSInterfaceDeclaration\") continue;\n\t\tconst declarations = interfaces.get(declaration.id.name) ?? [];\n\t\tdeclarations.push(declaration);\n\t\tinterfaces.set(declaration.id.name, declarations);\n\t}\n\n\treturn {\n\t\tinterfaces,\n\t\ttypeAliases: createTypeAliasEnvironment(program, visitorKeys),\n\t};\n}\n\nfunction typeReferenceName(type: ESTree.TSTypeReference): string | null {\n\treturn type.typeName.type === \"Identifier\" ? type.typeName.name : null;\n}\n\nfunction isBuiltIn(\n\tname: string,\n\tuse: ESTree.Node,\n\tenvironment: TypeEnvironment,\n): boolean {\n\treturn (\n\t\tBUILT_INS.has(name) &&\n\t\t!hasVisibleTypeBinding(name, use, environment.typeAliases)\n\t);\n}\n\nfunction isUnappliedReferenceTo(type: ESTree.TSType, name: string): boolean {\n\tconst unwrapped = unwrapTransparentType(type);\n\treturn (\n\t\tunwrapped.type === \"TSTypeReference\" &&\n\t\ttypeReferenceName(unwrapped) === name &&\n\t\t(unwrapped.typeArguments === null ||\n\t\t\tunwrapped.typeArguments === undefined ||\n\t\t\tunwrapped.typeArguments.params.length === 0)\n\t);\n}\n\nfunction unwrapTransparentType(type: ESTree.TSType): ESTree.TSType {\n\tlet current = type;\n\twhile (\n\t\tcurrent.type === \"TSParenthesizedType\" ||\n\t\t(current.type === \"TSTypeOperator\" && current.operator === \"readonly\")\n\t) {\n\t\tcurrent = current.typeAnnotation;\n\t}\n\treturn current;\n}\n\nfunction isNeverType(type: ESTree.TSType): boolean {\n\treturn unwrapTransparentType(type).type === \"TSNeverKeyword\";\n}\n\nfunction isEffectivelyEmptyMember(member: ESTree.TSSignature): boolean {\n\treturn (\n\t\tmember.type === \"TSPropertySignature\" &&\n\t\tmember.optional === true &&\n\t\tmember.typeAnnotation !== null &&\n\t\tmember.typeAnnotation !== undefined &&\n\t\tisNeverType(member.typeAnnotation.typeAnnotation)\n\t);\n}\n\nfunction isEffectivelyEmptyTypeLiteral(type: ESTree.TSTypeLiteral): boolean {\n\treturn type.members.length === 0 || type.members.every(isEffectivelyEmptyMember);\n}\n\nfunction isEffectivelyEmptyInterface(\n\tdeclarations: readonly ESTree.TSInterfaceDeclaration[],\n): boolean {\n\tif (declarations.length !== 1) return false;\n\tconst [type] = declarations;\n\treturn (\n\t\ttype !== undefined &&\n\t\ttype.extends.length === 0 &&\n\t\t(type.body.body.length === 0 || type.body.body.every(isEffectivelyEmptyMember))\n\t);\n}\n\nfunction resolvedSubstitutionArgument(\n\ttype: ESTree.TSType,\n\tbase: TypeAliasEnvironment,\n\tresolving: ReadonlySet<string> = new Set(),\n): ESTree.TSType {\n\tconst unwrapped = unwrapTransparentType(type);\n\tif (unwrapped.type !== \"TSTypeReference\") return type;\n\tconst name = typeReferenceName(unwrapped);\n\tif (name === null || resolving.has(name)) return type;\n\tconst substitution = base.get(name);\n\tif (substitution === undefined) return type;\n\tconst nextResolving = new Set(resolving);\n\tnextResolving.add(name);\n\treturn resolvedSubstitutionArgument(substitution, base, nextResolving);\n}\n\nfunction aliasSubstitution(\n\talias: ESTree.TSTypeAliasDeclaration,\n\ttype: ESTree.TSTypeReference,\n\tbase: TypeAliasEnvironment,\n): TypeAliasEnvironment | null {\n\tconst parameters = alias.typeParameters?.params ?? [];\n\tconst arguments_ = type.typeArguments?.params ?? [];\n\tconst next = new Map(base);\n\tfor (const [index, parameter] of parameters.entries()) {\n\t\tconst argument = arguments_[index] ?? parameter.default;\n\t\tif (argument === null || argument === undefined) return null;\n\t\tnext.set(parameter.name.name, resolvedSubstitutionArgument(argument, next));\n\t}\n\treturn next;\n}\n\nfunction unsafeDirectValue(\n\ttype: ESTree.TSType,\n\tenvironment: TypeEnvironment,\n\tsubstitutions: TypeAliasEnvironment,\n\tresolvingAliases: ReadonlySet<string>,\n): UnsafeDictionary[\"unsafeValue\"] | null {\n\tconst unwrapped = unwrapTransparentType(type);\n\tif (unwrapped.type === \"TSUnknownKeyword\") return \"unknown\";\n\tif (unwrapped.type === \"TSAnyKeyword\") return \"any\";\n\tif (unwrapped.type === \"TSObjectKeyword\") return \"object\";\n\tif (unwrapped.type === \"TSTypeLiteral\" && isEffectivelyEmptyTypeLiteral(unwrapped))\n\t\treturn \"empty-object\";\n\tif (unwrapped.type === \"TSUnionType\") {\n\t\treturn unwrapped.types.some(\n\t\t\t(member) => unsafeDirectValue(member, environment, substitutions, resolvingAliases) !== null,\n\t\t)\n\t\t\t? \"union\"\n\t\t\t: null;\n\t}\n\tif (unwrapped.type === \"TSIntersectionType\") {\n\t\tconst unsafeMembers = unwrapped.types.map((member) =>\n\t\t\tunsafeDirectValue(member, environment, substitutions, resolvingAliases),\n\t\t);\n\t\tif (unsafeMembers.includes(\"any\")) return \"any\";\n\t\treturn unsafeMembers.length > 0 && unsafeMembers.every((member) => member !== null)\n\t\t\t? unsafeMembers[0]\n\t\t\t: null;\n\t}\n\tif (unwrapped.type !== \"TSTypeReference\") return null;\n\tconst name = typeReferenceName(unwrapped);\n\tif (name === null) return null;\n\tif (TRANSPARENT_WRAPPERS.has(name) && isBuiltIn(name, unwrapped, environment)) {\n\t\tconst wrapped = unwrapped.typeArguments?.params[0];\n\t\treturn wrapped === undefined\n\t\t\t? null\n\t\t\t: unsafeDirectValue(wrapped, environment, substitutions, resolvingAliases);\n\t}\n\tconst substitution = substitutions.get(name);\n\tif (substitution !== undefined) {\n\t\treturn isUnappliedReferenceTo(substitution, name)\n\t\t\t? null\n\t\t\t: unsafeDirectValue(substitution, environment, substitutions, resolvingAliases);\n\t}\n\tconst interfaceDeclarations = environment.interfaces.get(name);\n\tif (interfaceDeclarations !== undefined) {\n\t\treturn isEffectivelyEmptyInterface(interfaceDeclarations) ? \"empty-object\" : null;\n\t}\n\tconst alias = visibleTypeAlias(name, unwrapped, environment.typeAliases);\n\tif (alias === null || resolvingAliases.has(name)) return null;\n\tconst nextSubstitutions = aliasSubstitution(alias, unwrapped, substitutions);\n\tif (nextSubstitutions === null) return null;\n\tconst nextResolving = new Set(resolvingAliases);\n\tnextResolving.add(name);\n\treturn unsafeDirectValue(alias.typeAnnotation, environment, nextSubstitutions, nextResolving);\n}\n\nfunction dictionaryValueTypes(\n\ttype: ESTree.TSType,\n\tenvironment: TypeEnvironment,\n\tsubstitutions: TypeAliasEnvironment,\n\tresolvingAliases: ReadonlySet<string>,\n): readonly ResolvedType[] {\n\tconst unwrapped = unwrapTransparentType(type);\n\n\tif (unwrapped.type === \"TSTypeLiteral\") {\n\t\treturn unwrapped.members.flatMap((member): readonly ResolvedType[] =>\n\t\t\tmember.type === \"TSIndexSignature\" && member.typeAnnotation !== null\n\t\t\t\t? [{ type: member.typeAnnotation.typeAnnotation, substitutions }]\n\t\t\t\t: [],\n\t\t);\n\t}\n\n\tif (unwrapped.type === \"TSMappedType\") {\n\t\treturn unwrapped.typeAnnotation === null\n\t\t\t? []\n\t\t\t: [{ type: unwrapped.typeAnnotation, substitutions }];\n\t}\n\n\tif (unwrapped.type !== \"TSTypeReference\") return [];\n\tconst name = typeReferenceName(unwrapped);\n\tif (name === null) return [];\n\n\tconst substitution = substitutions.get(name);\n\tif (substitution !== undefined) {\n\t\treturn isUnappliedReferenceTo(substitution, name)\n\t\t\t? []\n\t\t\t: dictionaryValueTypes(substitution, environment, substitutions, resolvingAliases);\n\t}\n\n\tif (TRANSPARENT_WRAPPERS.has(name) && isBuiltIn(name, unwrapped, environment)) {\n\t\tconst wrapped = unwrapped.typeArguments?.params[0];\n\t\treturn wrapped === undefined\n\t\t\t? []\n\t\t\t: dictionaryValueTypes(wrapped, environment, substitutions, resolvingAliases);\n\t}\n\n\tif (name === \"Record\" && isBuiltIn(name, unwrapped, environment)) {\n\t\tconst value = unwrapped.typeArguments?.params[1] ?? null;\n\t\treturn value === null ? [] : [{ type: value, substitutions }];\n\t}\n\n\tif (\n\t\t(name === \"Pick\" || name === \"Omit\") &&\n\t\tisBuiltIn(name, unwrapped, environment)\n\t) {\n\t\tconst source = unwrapped.typeArguments?.params[0];\n\t\treturn source === undefined\n\t\t\t? []\n\t\t\t: dictionaryValueTypes(source, environment, substitutions, resolvingAliases);\n\t}\n\n\tconst alias = visibleTypeAlias(name, unwrapped, environment.typeAliases);\n\tif (alias === null || resolvingAliases.has(name)) return [];\n\tconst nextSubstitutions = aliasSubstitution(alias, unwrapped, substitutions);\n\tif (nextSubstitutions === null) return [];\n\tconst nextResolving = new Set(resolvingAliases);\n\tnextResolving.add(name);\n\treturn dictionaryValueTypes(alias.typeAnnotation, environment, nextSubstitutions, nextResolving);\n}\n\nexport function classifyUnsafeDictionaryValue(\n\tvalueType: ESTree.TSType,\n\tenvironment: TypeEnvironment,\n): UnsafeDictionary | null {\n\tconst unsafeValue = unsafeDirectValue(valueType, environment, new Map(), new Set());\n\treturn unsafeValue === null ? null : { kind: \"unsafe-dictionary\", unsafeValue };\n}\n\nexport function classifyUnsafeDictionary(\n\ttype: ESTree.TSType,\n\tenvironment: TypeEnvironment,\n): UnsafeDictionary | null {\n\tfor (const valueType of dictionaryValueTypes(type, environment, new Map(), new Set())) {\n\t\tconst unsafeValue = unsafeDirectValue(\n\t\t\tvalueType.type,\n\t\t\tenvironment,\n\t\t\tvalueType.substitutions,\n\t\t\tnew Set(),\n\t\t);\n\t\tif (unsafeValue !== null) return { kind: \"unsafe-dictionary\", unsafeValue };\n\t}\n\treturn null;\n}\n\nexport function classifyWideningTarget(\n\ttype: ESTree.TSType,\n\tenvironment: TypeEnvironment,\n): WideningTarget | null {\n\tconst unwrapped = unwrapTransparentType(type);\n\tif (unwrapped.type === \"TSUnknownKeyword\") return { kind: \"unknown\" };\n\tif (unwrapped.type === \"TSObjectKeyword\") return { kind: \"object\" };\n\tif (unwrapped.type === \"TSTypeLiteral\") {\n\t\treturn unwrapped.members.some((member) => member.type === \"TSIndexSignature\")\n\t\t\t? { kind: \"open dictionary\" }\n\t\t\t: unwrapped.members.length > 0\n\t\t\t\t? { kind: \"anonymous object\" }\n\t\t\t\t: null;\n\t}\n\tif (unwrapped.type === \"TSMappedType\") return { kind: \"open dictionary\" };\n\tif (unwrapped.type !== \"TSTypeReference\") return null;\n\tconst name = typeReferenceName(unwrapped);\n\tif (name === null) return null;\n\tif (TRANSPARENT_WRAPPERS.has(name) && isBuiltIn(name, unwrapped, environment)) {\n\t\tconst wrapped = unwrapped.typeArguments?.params[0];\n\t\treturn wrapped === undefined ? null : classifyWideningTarget(wrapped, environment);\n\t}\n\tif (name === \"Record\" && isBuiltIn(name, unwrapped, environment)) {\n\t\treturn hasBroadRecordKey(unwrapped, environment, new Map())\n\t\t\t? { kind: \"open dictionary\" }\n\t\t\t: null;\n\t}\n\tconst alias = visibleTypeAlias(name, unwrapped, environment.typeAliases);\n\tif (alias === null) return null;\n\tif ((alias.typeParameters?.params.length ?? 0) > 0) {\n\t\tconst substitutions = aliasSubstitution(alias, unwrapped, new Map());\n\t\tconst resolved =\n\t\t\tsubstitutions === null\n\t\t\t\t? null\n\t\t\t\t: classifyAliasBroadTarget(\n\t\t\t\t\t\talias.typeAnnotation,\n\t\t\t\t\t\tenvironment,\n\t\t\t\t\t\tsubstitutions,\n\t\t\t\t\t\tnew Set([name]),\n\t\t\t\t\t);\n\t\treturn resolved?.kind === \"open dictionary\" ? { kind: \"generic container\" } : null;\n\t}\n\tconst substitutions = aliasSubstitution(alias, unwrapped, new Map());\n\tif (substitutions === null) return null;\n\tconst resolved = classifyAliasBroadTarget(\n\t\talias.typeAnnotation,\n\t\tenvironment,\n\t\tsubstitutions,\n\t\tnew Set([name]),\n\t);\n\treturn resolved;\n}\n\nfunction hasBroadRecordKey(\n\ttype: ESTree.TSTypeReference,\n\tenvironment: TypeEnvironment,\n\tsubstitutions: TypeAliasEnvironment,\n): boolean {\n\tconst key = type.typeArguments?.params[0];\n\treturn key === undefined || isBroadMappedKey(key, environment, substitutions);\n}\n\nfunction isBroadMappedKey(\n\ttype: ESTree.TSType,\n\tenvironment: TypeEnvironment,\n\tsubstitutions: TypeAliasEnvironment,\n\tvisitedAliases: ReadonlySet<string> = new Set(),\n): boolean {\n\tconst unwrapped = unwrapTransparentType(type);\n\tif (\n\t\tunwrapped.type === \"TSStringKeyword\" ||\n\t\tunwrapped.type === \"TSNumberKeyword\" ||\n\t\tunwrapped.type === \"TSSymbolKeyword\"\n\t) {\n\t\treturn true;\n\t}\n\tif (unwrapped.type === \"TSUnionType\") {\n\t\treturn unwrapped.types.some((member) =>\n\t\t\tisBroadMappedKey(member, environment, substitutions, visitedAliases),\n\t\t);\n\t}\n\tif (unwrapped.type !== \"TSTypeReference\") return false;\n\tconst name = typeReferenceName(unwrapped);\n\tif (name === null) return false;\n\tconst substitution = substitutions.get(name);\n\tif (substitution !== undefined && !isUnappliedReferenceTo(substitution, name)) {\n\t\treturn isBroadMappedKey(substitution, environment, substitutions, visitedAliases);\n\t}\n\tif (name === \"PropertyKey\" && isBuiltIn(name, unwrapped, environment)) return true;\n\tconst alias = visibleTypeAlias(name, unwrapped, environment.typeAliases);\n\tif (\n\t\talias === null ||\n\t\t(alias.typeParameters?.params.length ?? 0) > 0 ||\n\t\tvisitedAliases.has(name)\n\t) {\n\t\treturn false;\n\t}\n\tconst nextVisited = new Set(visitedAliases);\n\tnextVisited.add(name);\n\treturn isBroadMappedKey(alias.typeAnnotation, environment, substitutions, nextVisited);\n}\n\nfunction classifyAliasBroadTarget(\n\ttype: ESTree.TSType,\n\tenvironment: TypeEnvironment,\n\tsubstitutions: TypeAliasEnvironment,\n\tresolvingAliases: ReadonlySet<string>,\n): WideningTarget | null {\n\tconst unwrapped = unwrapTransparentType(type);\n\tif (unwrapped.type === \"TSUnknownKeyword\") return { kind: \"unknown\" };\n\tif (unwrapped.type === \"TSObjectKeyword\") return { kind: \"object\" };\n\tif (unwrapped.type === \"TSTypeLiteral\") {\n\t\treturn unwrapped.members.some((member) => member.type === \"TSIndexSignature\")\n\t\t\t? { kind: \"open dictionary\" }\n\t\t\t: null;\n\t}\n\tif (unwrapped.type === \"TSMappedType\") {\n\t\treturn isBroadMappedKey(unwrapped.constraint, environment, substitutions)\n\t\t\t? { kind: \"open dictionary\" }\n\t\t\t: null;\n\t}\n\tif (unwrapped.type !== \"TSTypeReference\") return null;\n\tconst name = typeReferenceName(unwrapped);\n\tif (name === null) return null;\n\tconst substitution = substitutions.get(name);\n\tif (substitution !== undefined) {\n\t\treturn isUnappliedReferenceTo(substitution, name)\n\t\t\t? null\n\t\t\t: classifyAliasBroadTarget(\n\t\t\t\t\tsubstitution,\n\t\t\t\t\tenvironment,\n\t\t\t\t\tsubstitutions,\n\t\t\t\t\tresolvingAliases,\n\t\t\t\t);\n\t}\n\tif (TRANSPARENT_WRAPPERS.has(name) && isBuiltIn(name, unwrapped, environment)) {\n\t\tconst wrapped = unwrapped.typeArguments?.params[0];\n\t\treturn wrapped === undefined\n\t\t\t? null\n\t\t\t: classifyAliasBroadTarget(wrapped, environment, substitutions, resolvingAliases);\n\t}\n\tif (name === \"Record\" && isBuiltIn(name, unwrapped, environment)) {\n\t\treturn hasBroadRecordKey(unwrapped, environment, substitutions)\n\t\t\t? { kind: \"open dictionary\" }\n\t\t\t: null;\n\t}\n\tconst alias = visibleTypeAlias(name, unwrapped, environment.typeAliases);\n\tif (alias === null || resolvingAliases.has(name)) return null;\n\tconst nextSubstitutions = aliasSubstitution(alias, unwrapped, substitutions);\n\tif (nextSubstitutions === null) return null;\n\tconst nextResolving = new Set(resolvingAliases);\n\tnextResolving.add(name);\n\treturn classifyAliasBroadTarget(\n\t\talias.typeAnnotation,\n\t\tenvironment,\n\t\tnextSubstitutions,\n\t\tnextResolving,\n\t);\n}\n\nexport function isPopulatedObjectExpression(expression: ESTree.Expression): boolean {\n\tlet current = expression;\n\twhile (\n\t\tcurrent.type === \"ParenthesizedExpression\" ||\n\t\tcurrent.type === \"TSAsExpression\" ||\n\t\tcurrent.type === \"TSTypeAssertion\" ||\n\t\tcurrent.type === \"TSNonNullExpression\"\n\t) {\n\t\tcurrent = current.expression;\n\t}\n\treturn current.type === \"ObjectExpression\" && current.properties.length > 0;\n}\n\nexport function isKnownEvidenceExpression(expression: ESTree.Expression): boolean {\n\tlet current = expression;\n\twhile (\n\t\tcurrent.type === \"ParenthesizedExpression\" ||\n\t\tcurrent.type === \"TSAsExpression\" ||\n\t\tcurrent.type === \"TSTypeAssertion\" ||\n\t\tcurrent.type === \"TSNonNullExpression\" ||\n\t\tcurrent.type === \"TSSatisfiesExpression\"\n\t) {\n\t\tcurrent = current.expression;\n\t}\n\tif (current.type === \"ObjectExpression\") return true;\n\treturn (\n\t\tcurrent.type === \"ArrayExpression\" ||\n\t\tcurrent.type === \"ArrowFunctionExpression\" ||\n\t\tcurrent.type === \"ClassExpression\" ||\n\t\tcurrent.type === \"FunctionExpression\" ||\n\t\tcurrent.type === \"NewExpression\" ||\n\t\tcurrent.type === \"Literal\" ||\n\t\tcurrent.type === \"TemplateLiteral\" ||\n\t\tcurrent.type === \"UnaryExpression\"\n\t);\n}\n","import type { ESTree, SourceCode } from \"@oxlint/plugins\";\n\nexport type FunctionParameter = ESTree.ParamPattern;\n\n/** Return whether a type is or contains TypeScript's absorbing unknown top type. */\nexport function containsUnknownType(type: ESTree.TSType): boolean {\n\tif (type.type === \"TSUnknownKeyword\") return true;\n\tif (type.type === \"TSParenthesizedType\") return containsUnknownType(type.typeAnnotation);\n\treturn type.type === \"TSUnionType\" && type.types.some(containsUnknownType);\n}\n\n/** Return the TypeScript annotation attached to a function parameter or its wrapped binding. */\nexport function functionParameterTypeAnnotation(\n\tparameter: FunctionParameter,\n): ESTree.TSTypeAnnotation | null | undefined {\n\tif (parameter.type === \"TSParameterProperty\") {\n\t\treturn functionParameterTypeAnnotation(parameter.parameter);\n\t}\n\tif (parameter.type === \"RestElement\") {\n\t\treturn parameter.typeAnnotation ?? functionParameterTypeAnnotation(parameter.argument);\n\t}\n\tif (parameter.type === \"AssignmentPattern\") {\n\t\treturn parameter.typeAnnotation ?? functionParameterTypeAnnotation(parameter.left);\n\t}\n\treturn parameter.typeAnnotation;\n}\n\n/** Return only a function parameter's local binding, excluding its annotation and default value. */\nexport function functionParameterBindingName(\n\tparameter: FunctionParameter,\n\tsourceCode: SourceCode,\n): string {\n\tif (parameter.type === \"TSParameterProperty\") {\n\t\treturn functionParameterBindingName(parameter.parameter, sourceCode);\n\t}\n\tif (parameter.type === \"AssignmentPattern\") {\n\t\treturn functionParameterBindingName(parameter.left, sourceCode);\n\t}\n\tif (parameter.type === \"RestElement\") {\n\t\treturn functionParameterBindingName(parameter.argument, sourceCode);\n\t}\n\tif (parameter.type === \"Identifier\") return parameter.name;\n\n\tconst sourceText = sourceCode.getText(parameter);\n\tconst annotationStart = parameter.typeAnnotation?.start;\n\treturn annotationStart === undefined\n\t\t? sourceText\n\t\t: sourceText.slice(0, annotationStart - parameter.start).trimEnd();\n}\n","import type { ESTree, Scope, SourceCode, Variable } from \"@oxlint/plugins\";\n\n/** Resolve an identifier to its binding by walking lexical scopes upward. */\nexport function resolveVariable(\n\tsourceCode: SourceCode,\n\tidentifier: ESTree.IdentifierReference,\n): Variable | null {\n\tlet scope: Scope | null = sourceCode.getScope(identifier);\n\twhile (scope !== null) {\n\t\tconst variable = scope.set.get(identifier.name);\n\t\tif (variable !== undefined) return variable;\n\t\tscope = scope.upper;\n\t}\n\treturn null;\n}\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport {\n\tclassifyUnsafeDictionaryValue,\n\tclassifyWideningTarget,\n\tcreateTypeEnvironment,\n\tisKnownEvidenceExpression,\n\ttype TypeEnvironment,\n\ttype WideningTarget,\n} from \"../shared/dictionary-types.ts\";\nimport {\n\tcontainsUnknownType,\n\tfunctionParameterBindingName,\n\tfunctionParameterTypeAnnotation,\n} from \"../shared/function-parameters.ts\";\nimport { resolveVariable } from \"../shared/scope.ts\";\n\nimport type { ESTree, SourceCode, Variable } from \"@oxlint/plugins\";\n\ntype FunctionExpression = ESTree.ArrowFunctionExpression | ESTree.Function;\n\nfunction unwrapExpression(expression: ESTree.Expression): ESTree.Expression {\n\tlet current = expression;\n\twhile (\n\t\tcurrent.type === \"ParenthesizedExpression\" ||\n\t\tcurrent.type === \"TSAsExpression\" ||\n\t\tcurrent.type === \"TSSatisfiesExpression\" ||\n\t\tcurrent.type === \"TSTypeAssertion\" ||\n\t\tcurrent.type === \"TSNonNullExpression\"\n\t) {\n\t\tcurrent = current.expression;\n\t}\n\treturn current;\n}\n\nfunction variableDeclarator(variable: Variable): ESTree.VariableDeclarator | null {\n\tif (variable.defs.length !== 1) return null;\n\tconst [definition] = variable.defs;\n\treturn definition?.type === \"Variable\" && definition.node.type === \"VariableDeclarator\"\n\t\t? definition.node\n\t\t: null;\n}\n\nfunction isStableConstVariable(variable: Variable, declarator: ESTree.VariableDeclarator): boolean {\n\treturn (\n\t\tdeclarator.parent.type === \"VariableDeclaration\" &&\n\t\tdeclarator.parent.kind === \"const\" &&\n\t\tvariable.references.every((reference) => reference.init || !reference.isWrite())\n\t);\n}\n\nfunction hasKnownEvidence(\n\tsourceCode: SourceCode,\n\texpression: ESTree.Expression,\n\tvisitedVariables = new Set<Variable>(),\n): boolean {\n\tif (isKnownEvidenceExpression(expression)) return true;\n\tconst unwrapped = unwrapExpression(expression);\n\tif (unwrapped.type !== \"Identifier\") return false;\n\tconst variable = resolveVariable(sourceCode, unwrapped);\n\tif (variable === null || visitedVariables.has(variable)) return false;\n\tconst declarator = variableDeclarator(variable);\n\tif (\n\t\tdeclarator === null ||\n\t\tdeclarator.init === null ||\n\t\t!isStableConstVariable(variable, declarator)\n\t) {\n\t\treturn false;\n\t}\n\tvisitedVariables.add(variable);\n\treturn hasKnownEvidence(sourceCode, declarator.init, visitedVariables);\n}\n\nfunction isFunctionExpression(node: ESTree.Node): node is FunctionExpression {\n\treturn (\n\t\tnode.type === \"ArrowFunctionExpression\" ||\n\t\tnode.type === \"FunctionDeclaration\" ||\n\t\tnode.type === \"FunctionExpression\" ||\n\t\tnode.type === \"TSDeclareFunction\" ||\n\t\tnode.type === \"TSEmptyBodyFunctionExpression\"\n\t);\n}\n\nfunction localFunctionForCall(\n\tsourceCode: SourceCode,\n\tcallee: ESTree.Expression,\n): FunctionExpression | null {\n\tconst unwrapped = unwrapExpression(callee);\n\tif (isFunctionExpression(unwrapped)) return unwrapped;\n\tif (unwrapped.type !== \"Identifier\") return null;\n\tconst variable = resolveVariable(sourceCode, unwrapped);\n\tif (variable === null || variable.defs.length !== 1) return null;\n\tconst [definition] = variable.defs;\n\tif (definition === undefined) return null;\n\tif (definition.type === \"FunctionName\" && isFunctionExpression(definition.node)) {\n\t\treturn definition.node;\n\t}\n\tif (definition.type !== \"Variable\" || definition.node.type !== \"VariableDeclarator\") {\n\t\treturn null;\n\t}\n\tconst initializer = definition.node.init;\n\tif (initializer === null) return null;\n\tconst unwrappedInitializer = unwrapExpression(initializer);\n\treturn isFunctionExpression(unwrappedInitializer) ? unwrappedInitializer : null;\n}\n\nfunction variableTypeAnnotation(\n\tsourceCode: SourceCode,\n\tvariable: Variable,\n): ESTree.TSTypeAnnotation | null {\n\tif (variable.defs.length !== 1) return null;\n\tconst [definition] = variable.defs;\n\tif (definition === undefined) return null;\n\tif (\n\t\tdefinition.type === \"Variable\" &&\n\t\tdefinition.node.type === \"VariableDeclarator\" &&\n\t\tdefinition.node.id.type === \"Identifier\"\n\t) {\n\t\treturn definition.node.id.typeAnnotation ?? null;\n\t}\n\tif (definition.type !== \"Parameter\" || !isFunctionExpression(definition.node)) {\n\t\treturn null;\n\t}\n\tconst parameter = definition.node.params.find(\n\t\t(candidate) =>\n\t\t\tfunctionParameterBindingName(candidate, sourceCode) === variable.name,\n\t);\n\treturn parameter === undefined ? null : (functionParameterTypeAnnotation(parameter) ?? null);\n}\n\nfunction hasInformativeType(\n\ttype: ESTree.TSType,\n\tenvironment: TypeEnvironment,\n): boolean {\n\treturn classifyUnsafeDictionaryValue(type, environment) === null;\n}\n\nfunction hasKnownCallArgumentEvidence(\n\tsourceCode: SourceCode,\n\texpression: ESTree.Expression,\n\tenvironment: TypeEnvironment,\n\tvisitedVariables = new Set<Variable>(),\n): boolean {\n\tif (expression.type === \"ParenthesizedExpression\" || expression.type === \"TSNonNullExpression\") {\n\t\treturn hasKnownCallArgumentEvidence(\n\t\t\tsourceCode,\n\t\t\texpression.expression,\n\t\t\tenvironment,\n\t\t\tvisitedVariables,\n\t\t);\n\t}\n\tif (expression.type === \"TSAsExpression\" || expression.type === \"TSTypeAssertion\") {\n\t\treturn hasInformativeType(expression.typeAnnotation, environment);\n\t}\n\tif (expression.type === \"TSSatisfiesExpression\") {\n\t\treturn hasKnownCallArgumentEvidence(\n\t\t\tsourceCode,\n\t\t\texpression.expression,\n\t\t\tenvironment,\n\t\t\tvisitedVariables,\n\t\t);\n\t}\n\tif (expression.type === \"CallExpression\") {\n\t\tconst owner = localFunctionForCall(sourceCode, expression.callee);\n\t\tconst returnType = owner?.returnType?.typeAnnotation;\n\t\treturn returnType !== undefined && hasInformativeType(returnType, environment);\n\t}\n\tif (expression.type !== \"Identifier\") return isKnownEvidenceExpression(expression);\n\tconst variable = resolveVariable(sourceCode, expression);\n\tif (variable === null || visitedVariables.has(variable)) return false;\n\tconst annotation = variableTypeAnnotation(sourceCode, variable);\n\tif (annotation !== null) {\n\t\treturn hasInformativeType(annotation.typeAnnotation, environment);\n\t}\n\tconst declarator = variableDeclarator(variable);\n\tif (\n\t\tdeclarator === null ||\n\t\tdeclarator.init === null ||\n\t\t!isStableConstVariable(variable, declarator)\n\t) {\n\t\treturn false;\n\t}\n\tvisitedVariables.add(variable);\n\treturn hasKnownCallArgumentEvidence(\n\t\tsourceCode,\n\t\tdeclarator.init,\n\t\tenvironment,\n\t\tvisitedVariables,\n\t);\n}\n\nfunction typePredicateSubjectIndex(\n\tsourceCode: SourceCode,\n\towner: FunctionExpression,\n): number | null {\n\tconst predicate = owner.returnType?.typeAnnotation;\n\tif (predicate?.type !== \"TSTypePredicate\" || predicate.parameterName.type !== \"Identifier\") {\n\t\treturn null;\n\t}\n\tconst predicateParameterName = predicate.parameterName.name;\n\tconst index = owner.params.findIndex(\n\t\t(parameter) =>\n\t\t\tfunctionParameterBindingName(parameter, sourceCode) === predicateParameterName,\n\t);\n\treturn index === -1 ? null : index;\n}\n\nfunction annotationTarget(\n\tannotation: ESTree.TSTypeAnnotation | null | undefined,\n\tenvironment: TypeEnvironment,\n): WideningTarget | null {\n\treturn annotation === null || annotation === undefined\n\t\t? null\n\t\t: classifyWideningTarget(annotation.typeAnnotation, environment);\n}\n\nfunction enclosingFunction(node: ESTree.Node): FunctionExpression | null {\n\tlet current: ESTree.Node | null = node.parent;\n\twhile (current !== null && current.type !== \"Program\") {\n\t\tif (\n\t\t\tcurrent.type === \"ArrowFunctionExpression\" ||\n\t\t\tcurrent.type === \"FunctionDeclaration\" ||\n\t\t\tcurrent.type === \"FunctionExpression\"\n\t\t) {\n\t\t\treturn current;\n\t\t}\n\t\tcurrent = current.parent;\n\t}\n\treturn null;\n}\n\nfunction sourceKeyName(sourceCode: SourceCode, key: ESTree.PropertyKey): string {\n\tif (key.type === \"Identifier\" || key.type === \"PrivateIdentifier\") return key.name;\n\tif (key.type === \"Literal\") return String(key.value);\n\treturn sourceCode.getText(key);\n}\n\nfunction functionName(sourceCode: SourceCode, owner: FunctionExpression | null): string {\n\tif (owner === null) return \"anonymous function\";\n\tif (owner.id !== null) return owner.id.name;\n\tconst parent = owner.parent;\n\tif (parent.type === \"VariableDeclarator\" && parent.id.type === \"Identifier\")\n\t\treturn parent.id.name;\n\tif (parent.type === \"MethodDefinition\") return sourceKeyName(sourceCode, parent.key);\n\treturn \"anonymous function\";\n}\n\nfunction isEmptyObjectExpression(expression: ESTree.Expression): boolean {\n\tconst unwrapped = unwrapExpression(expression);\n\treturn unwrapped.type === \"ObjectExpression\" && unwrapped.properties.length === 0;\n}\n\nfunction isDictionaryAccumulatorTarget(destination: WideningTarget): boolean {\n\treturn destination.kind === \"open dictionary\" || destination.kind === \"generic container\";\n}\n\nfunction hasParentAssertion(node: ESTree.Node): boolean {\n\treturn node.parent?.type === \"TSAsExpression\" || node.parent?.type === \"TSTypeAssertion\";\n}\n\n/** Detect sound syntactic cases where a known value is explicitly widened and loses evidence. */\nexport const noKnownValueWideningRule = defineRule({\n\tmeta: {\n\t\ttype: \"problem\",\n\t\tdocs: {\n\t\t\tdescription:\n\t\t\t\t\"Disallow syntactically established values from flowing into explicitly broad or anonymous target types that discard useful evidence.\",\n\t\t},\n\t\tmessages: {\n\t\t\twidening:\n\t\t\t\t\"The explicit {{target}} type on {{subject}} discards known type evidence. Keep inference, validate with `satisfies`, or use a named owner contract.\",\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\tlet environment: TypeEnvironment | null = null;\n\n\t\tconst reportFlow = (\n\t\t\texpression: ESTree.Expression,\n\t\t\tdestination: WideningTarget | null,\n\t\t\tsubject: string,\n\t\t) => {\n\t\t\tif (destination === null) return;\n\t\t\tif (\n\t\t\t\tisDictionaryAccumulatorTarget(destination) &&\n\t\t\t\tisEmptyObjectExpression(expression)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!hasKnownEvidence(context.sourceCode, expression)) return;\n\t\t\tcontext.report({\n\t\t\t\tnode: expression,\n\t\t\t\tmessageId: \"widening\",\n\t\t\t\tdata: { subject, target: destination.kind },\n\t\t\t});\n\t\t};\n\n\t\tconst targetFromAnnotation = (annotation: ESTree.TSTypeAnnotation | null | undefined) =>\n\t\t\tenvironment === null ? null : annotationTarget(annotation, environment);\n\n\t\treturn {\n\t\t\tProgram(node) {\n\t\t\t\tenvironment = createTypeEnvironment(\n\t\t\t\t\tnode,\n\t\t\t\t\tcontext.sourceCode.visitorKeys,\n\t\t\t\t);\n\t\t\t},\n\t\t\tVariableDeclarator(node) {\n\t\t\t\tif (node.init === null || node.id.type !== \"Identifier\") return;\n\t\t\t\treportFlow(\n\t\t\t\t\tnode.init,\n\t\t\t\t\ttargetFromAnnotation(node.id.typeAnnotation),\n\t\t\t\t\t`binding \\`${node.id.name}\\``,\n\t\t\t\t);\n\t\t\t},\n\t\t\tPropertyDefinition(node) {\n\t\t\t\tif (node.value === null) return;\n\t\t\t\treportFlow(\n\t\t\t\t\tnode.value,\n\t\t\t\t\ttargetFromAnnotation(node.typeAnnotation),\n\t\t\t\t\t`property \\`${sourceKeyName(context.sourceCode, node.key)}\\``,\n\t\t\t\t);\n\t\t\t},\n\t\t\tAccessorProperty(node) {\n\t\t\t\tif (node.value === null) return;\n\t\t\t\treportFlow(\n\t\t\t\t\tnode.value,\n\t\t\t\t\ttargetFromAnnotation(node.typeAnnotation),\n\t\t\t\t\t`property \\`${sourceKeyName(context.sourceCode, node.key)}\\``,\n\t\t\t\t);\n\t\t\t},\n\t\t\tAssignmentExpression(node) {\n\t\t\t\tif (node.operator !== \"=\" || node.left.type !== \"Identifier\") return;\n\t\t\t\tconst variable = resolveVariable(context.sourceCode, node.left);\n\t\t\t\tif (variable === null) return;\n\t\t\t\tconst declarator = variableDeclarator(variable);\n\t\t\t\tif (declarator === null || declarator.id.type !== \"Identifier\") return;\n\t\t\t\treportFlow(\n\t\t\t\t\tnode.right,\n\t\t\t\t\ttargetFromAnnotation(declarator.id.typeAnnotation),\n\t\t\t\t\t`binding \\`${declarator.id.name}\\``,\n\t\t\t\t);\n\t\t\t},\n\t\t\tCallExpression(node) {\n\t\t\t\tif (environment === null) return;\n\t\t\t\tconst owner = localFunctionForCall(context.sourceCode, node.callee);\n\t\t\t\tif (owner === null) return;\n\t\t\t\tconst parameterIndex = typePredicateSubjectIndex(context.sourceCode, owner);\n\t\t\t\tif (parameterIndex === null) return;\n\t\t\t\tconst parameter = owner.params[parameterIndex];\n\t\t\t\tconst argument = node.arguments[parameterIndex];\n\t\t\t\tif (parameter === undefined || argument === undefined || argument.type === \"SpreadElement\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst parameterAnnotation = functionParameterTypeAnnotation(parameter);\n\t\t\t\tif (\n\t\t\t\t\tparameterAnnotation === null ||\n\t\t\t\t\tparameterAnnotation === undefined ||\n\t\t\t\t\t!containsUnknownType(parameterAnnotation.typeAnnotation)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!hasKnownCallArgumentEvidence(\n\t\t\t\t\t\tcontext.sourceCode,\n\t\t\t\t\t\targument,\n\t\t\t\t\t\tenvironment,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode: argument,\n\t\t\t\t\tmessageId: \"widening\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tsubject: `argument for parameter \\`${functionParameterBindingName(parameter, context.sourceCode)}\\` of \\`${functionName(context.sourceCode, owner)}\\``,\n\t\t\t\t\t\ttarget: \"unknown\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t\tReturnStatement(node) {\n\t\t\t\tif (node.argument === null) return;\n\t\t\t\tconst owner = enclosingFunction(node);\n\t\t\t\treportFlow(\n\t\t\t\t\tnode.argument,\n\t\t\t\t\ttargetFromAnnotation(owner?.returnType),\n\t\t\t\t\t`return value of \\`${functionName(context.sourceCode, owner)}\\``,\n\t\t\t\t);\n\t\t\t},\n\t\t\tArrowFunctionExpression(node) {\n\t\t\t\tif (node.body.type === \"BlockStatement\") return;\n\t\t\t\treportFlow(\n\t\t\t\t\tnode.body,\n\t\t\t\t\ttargetFromAnnotation(node.returnType),\n\t\t\t\t\t`return value of \\`${functionName(context.sourceCode, node)}\\``,\n\t\t\t\t);\n\t\t\t},\n\t\t\tTSAsExpression(node) {\n\t\t\t\tif (environment === null || hasParentAssertion(node)) return;\n\t\t\t\treportFlow(\n\t\t\t\t\tnode.expression,\n\t\t\t\t\tclassifyWideningTarget(node.typeAnnotation, environment),\n\t\t\t\t\t\"assertion\",\n\t\t\t\t);\n\t\t\t},\n\t\t\tTSTypeAssertion(node) {\n\t\t\t\tif (environment === null || hasParentAssertion(node)) return;\n\t\t\t\treportFlow(\n\t\t\t\t\tnode.expression,\n\t\t\t\t\tclassifyWideningTarget(node.typeAnnotation, environment),\n\t\t\t\t\t\"assertion\",\n\t\t\t\t);\n\t\t\t},\n\t\t};\n\t},\n});\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport { resolveVariable } from \"../shared/scope.ts\";\n\nimport type { ESTree, SourceCode } from \"@oxlint/plugins\";\n\nconst moduleMockMethods = new Set([\"doMock\", \"mock\", \"unstable_mockModule\"]);\n\nfunction importedName(node: ESTree.Node): string | null {\n if (node.type !== \"ImportSpecifier\") return null;\n return node.imported.type === \"Identifier\" ? node.imported.name : node.imported.value;\n}\n\nfunction isTestFrameworkObject(\n sourceCode: SourceCode,\n expression: ESTree.Expression,\n): expression is ESTree.IdentifierReference {\n if (expression.type !== \"Identifier\") return false;\n if (\n (expression.name === \"vi\" || expression.name === \"jest\") &&\n sourceCode.isGlobalReference(expression)\n ) {\n return true;\n }\n\n const variable = resolveVariable(sourceCode, expression);\n if (variable === null || variable.defs.length === 0) {\n return expression.name === \"vi\" || expression.name === \"jest\";\n }\n return variable.defs.some((definition) => {\n if (definition.type !== \"ImportBinding\" || definition.parent?.type !== \"ImportDeclaration\") {\n return false;\n }\n const source = definition.parent.source.value;\n const name = importedName(definition.node);\n return (source === \"vitest\" && name === \"vi\") || (source === \"@jest/globals\" && name === \"jest\");\n });\n}\n\nfunction moduleMockCall(sourceCode: SourceCode, callee: ESTree.Expression): boolean {\n if (!(\"property\" in callee) || !(\"object\" in callee) || !(\"computed\" in callee)) return false;\n if (!isTestFrameworkObject(sourceCode, callee.object)) return false;\n const property = callee.property;\n const method = callee.computed\n ? property.type === \"Literal\" &&\n (property.value === \"doMock\" ||\n property.value === \"mock\" ||\n property.value === \"unstable_mockModule\")\n ? property.value\n : null\n : property.type === \"Identifier\"\n ? property.name\n : null;\n return method !== null && moduleMockMethods.has(method);\n}\n\n/** Ban test framework module mocking in favor of real dependency seams. */\nexport const noModuleMockingRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow Vitest and Jest module mocking; tests must replace dependencies through real interfaces.\",\n },\n messages: {\n moduleMock:\n \"Replace module mocking with dependency injection through a real interface, service layer, or faithful test implementation.\",\n },\n },\n createOnce(context) {\n return {\n CallExpression(node) {\n if (node.callee.type === \"Super\" || node.callee.type === \"V8IntrinsicExpression\") return;\n if (moduleMockCall(context.sourceCode, node.callee)) {\n context.report({ node, messageId: \"moduleMock\" });\n }\n },\n };\n },\n});\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport type { ESTree } from \"@oxlint/plugins\";\n\nimport {\n\tfunctionParameterBindingName,\n\tfunctionParameterTypeAnnotation,\n} from \"../shared/function-parameters.ts\";\nimport {\n\tcreateTypeAliasEnvironment,\n\tresolvedTypeMatches,\n\ttype TypeAliasEnvironment,\n} from \"../shared/type-alias-resolution.ts\";\ntype ParameterOwner =\n\t| ESTree.ArrowFunctionExpression\n\t| ESTree.Function\n\t| ESTree.TSCallSignatureDeclaration\n\t| ESTree.TSConstructSignatureDeclaration\n\t| ESTree.TSConstructorType\n\t| ESTree.TSFunctionType\n\t| ESTree.TSMethodSignature;\n\n/** Ban the broad object type on function inputs, including local aliases to object. */\nexport const noObjectParametersRule = defineRule({\n\tmeta: {\n\t\ttype: \"problem\",\n\t\tdocs: {\n\t\t\tdescription:\n\t\t\t\t\"Disallow object function parameters; inputs must use an owner-provided type and be parsed at their boundary.\",\n\t\t},\n\t\tmessages: {\n\t\t\tobjectParameter:\n\t\t\t\t\"Parameter `{{parameter}}` uses the broad `object` type. Accept a named owner type; parse external input at its boundary before calling this function.\",\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\tlet environment: TypeAliasEnvironment | null = null;\n\n\t\tconst resolvesToObject = (type: ESTree.TSType): boolean =>\n\t\t\tenvironment !== null &&\n\t\t\tresolvedTypeMatches(type, environment, (resolved, matches) => {\n\t\t\t\tif (resolved.type === \"TSObjectKeyword\") return true;\n\t\t\t\tif (resolved.type === \"TSParenthesizedType\") {\n\t\t\t\t\treturn matches(resolved.typeAnnotation);\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\tresolved.type === \"TSUnionType\" && resolved.types.some(matches)\n\t\t\t\t);\n\t\t\t});\n\n\t\tconst checkParameters = (node: ParameterOwner) => {\n\t\t\tfor (const parameter of node.params) {\n\t\t\t\tconst annotation = functionParameterTypeAnnotation(parameter);\n\t\t\t\tif (annotation === null || annotation === undefined) continue;\n\t\t\t\tif (!resolvesToObject(annotation.typeAnnotation)) continue;\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode: annotation.typeAnnotation,\n\t\t\t\t\tmessageId: \"objectParameter\",\n\t\t\t\t\tdata: { parameter: functionParameterBindingName(parameter, context.sourceCode) },\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\treturn {\n\t\t\tProgram(node) {\n\t\t\t\tenvironment = createTypeAliasEnvironment(\n\t\t\t\t\tnode,\n\t\t\t\t\tcontext.sourceCode.visitorKeys,\n\t\t\t\t);\n\t\t\t},\n\t\t\tArrowFunctionExpression: checkParameters,\n\t\t\tFunctionDeclaration: checkParameters,\n\t\t\tFunctionExpression: checkParameters,\n\t\t\tTSCallSignatureDeclaration: checkParameters,\n\t\t\tTSConstructSignatureDeclaration: checkParameters,\n\t\t\tTSConstructorType: checkParameters,\n\t\t\tTSDeclareFunction: checkParameters,\n\t\t\tTSEmptyBodyFunctionExpression: checkParameters,\n\t\t\tTSFunctionType: checkParameters,\n\t\t\tTSMethodSignature: checkParameters,\n\t\t};\n\t},\n});\n","import { defineRule } from \"@oxlint/plugins\";\nimport type { ESTree, SourceCode, Variable } from \"@oxlint/plugins\";\n\nimport {\n arrayMethodTarget,\n isKnownArrayExpression,\n resolveArrayBinding,\n unwrapArrayExpression,\n} from \"../shared/array-method.ts\";\n\nfunction enclosingReducer(node: ESTree.Node) {\n let parent = node.parent;\n while (parent !== null) {\n if (parent.type === \"FunctionDeclaration\") return null;\n if (parent.type === \"ArrowFunctionExpression\" || parent.type === \"FunctionExpression\") {\n const callback = parent;\n let owner: ESTree.Node | null = callback.parent;\n while (owner !== null && unwrapArrayExpression(owner) === callback) owner = owner.parent;\n if (owner?.type !== \"CallExpression\") return null;\n const method = arrayMethodTarget(owner.callee);\n const firstArgument = owner.arguments[0];\n if (\n method === null || (method.name !== \"reduce\" && method.name !== \"reduceRight\") ||\n owner.arguments.length > 2 || firstArgument === undefined ||\n unwrapArrayExpression(firstArgument) !== callback\n ) return null;\n const firstParameter = callback.params[0];\n const accumulator = firstParameter?.type === \"AssignmentPattern\" ? firstParameter.left : firstParameter;\n if (accumulator?.type !== \"Identifier\") return null;\n return { callback, accumulator, initialValue: owner.arguments[1] };\n }\n parent = parent.parent;\n }\n return null;\n}\n\nfunction referencesAccumulator(\n sourceCode: SourceCode,\n node: ESTree.Node,\n accumulator: Variable,\n visited = new Set<Variable>(),\n): boolean {\n const variable = resolveArrayBinding(sourceCode, node);\n if (variable === null || visited.has(variable)) return false;\n if (variable === accumulator) return true;\n visited.add(variable);\n if (variable.references.some(reference => reference.isWrite() && !reference.init)) return false;\n for (const definition of variable.defs) {\n if (\n definition.type === \"Variable\" && definition.node.type === \"VariableDeclarator\" &&\n definition.node.id.type === \"Identifier\" && definition.node.init !== null &&\n definition.node.parent.type === \"VariableDeclaration\" && definition.node.parent.kind === \"const\"\n ) {\n return referencesAccumulator(sourceCode, definition.node.init, accumulator, visited);\n }\n }\n return false;\n}\n\nfunction isGlobalCopyOwner(sourceCode: SourceCode, node: ESTree.Node, name: string): boolean {\n node = unwrapArrayExpression(node);\n if (node.type !== \"Identifier\" || node.name !== name) return false;\n const variable = resolveArrayBinding(sourceCode, node);\n return variable === null || variable.defs.length === 0;\n}\n\n/** Reject non-spread copies of reducer accumulators; pair with oxc/no-accumulating-spread. */\nexport const noReduceAccumulatorCopyRule = defineRule({\n meta: {\n type: \"problem\",\n docs: { description: \"Disallow copying growing reducer accumulators with Object.assign, Array.from, or array copy methods.\" },\n messages: {\n accumulatorCopy: \"Do not copy the reducer accumulator on every iteration; growing copies can cause quadratic work. Mutate a fresh, locally owned accumulator and return it, or use an iterator pipeline/flatMap.\",\n },\n },\n createOnce(context) {\n return {\n CallExpression(node) {\n const method = arrayMethodTarget(node.callee);\n if (method === null) return;\n const reducer = enclosingReducer(node);\n if (reducer === null) return;\n const accumulator = context.sourceCode.getDeclaredVariables(reducer.callback).find(variable =>\n variable.identifiers.some(identifier => identifier.start === reducer.accumulator.start),\n );\n if (accumulator === undefined) return;\n const isAccumulator = (expression: ESTree.Node) =>\n referencesAccumulator(context.sourceCode, expression, accumulator);\n let copiesAccumulator = false;\n if (method.name === \"assign\" && isGlobalCopyOwner(context.sourceCode, method.object, \"Object\")) {\n const target = node.arguments[0];\n copiesAccumulator = (\n target !== undefined && unwrapArrayExpression(target).type === \"ObjectExpression\" &&\n node.arguments.slice(1).some(isAccumulator)\n );\n } else if (method.name === \"from\" && isGlobalCopyOwner(context.sourceCode, method.object, \"Array\")) {\n const source = node.arguments[0];\n copiesAccumulator = source !== undefined && isAccumulator(source);\n } else if ([\"concat\", \"slice\", \"toSpliced\", \"toSorted\", \"toReversed\", \"with\"].includes(method.name)) {\n const initialValue = reducer.initialValue;\n const arrayAccumulator = initialValue !== undefined &&\n isKnownArrayExpression(context.sourceCode, initialValue);\n copiesAccumulator = arrayAccumulator && isAccumulator(method.object);\n }\n if (copiesAccumulator) context.report({ node, messageId: \"accumulatorCopy\" });\n },\n };\n },\n});\n","import { resolveVariable } from \"./scope.ts\";\n\nimport type { ESTree, SourceCode } from \"@oxlint/plugins\";\n\nfunction isGlobalReflect(sourceCode: SourceCode, expression: ESTree.Expression): boolean {\n if (expression.type !== \"Identifier\" || expression.name !== \"Reflect\") return false;\n if (sourceCode.isGlobalReference(expression)) return true;\n const variable = resolveVariable(sourceCode, expression);\n return variable === null || variable.defs.length === 0;\n}\n\n/** Reports whether a call target names one method on the global Reflect object. */\nexport function isGlobalReflectMethodCall(\n sourceCode: SourceCode,\n callee: ESTree.Expression,\n methodName: string,\n): boolean {\n if (!(\"property\" in callee) || !(\"object\" in callee) || !(\"computed\" in callee)) return false;\n if (!isGlobalReflect(sourceCode, callee.object)) return false;\n const property = callee.property;\n return callee.computed\n ? property.type === \"Literal\" && property.value === methodName\n : property.type === \"Identifier\" && property.name === methodName;\n}\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport { isGlobalReflectMethodCall } from \"../shared/reflect-method.ts\";\n\n/** Ban Reflect.apply, which bypasses ordinary typed function calls. */\nexport const noReflectApplyRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow Reflect.apply; call typed functions directly or model dynamic dispatch behind an interface.\",\n },\n messages: {\n reflectApply:\n \"Replace `Reflect.apply` with a typed function call. Model dynamic dispatch behind a named interface.\",\n },\n },\n createOnce(context) {\n return {\n CallExpression(node) {\n if (node.callee.type === \"Super\" || node.callee.type === \"V8IntrinsicExpression\") return;\n if (isGlobalReflectMethodCall(context.sourceCode, node.callee, \"apply\")) {\n context.report({ node, messageId: \"reflectApply\" });\n }\n },\n };\n },\n});\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport { isGlobalReflectMethodCall } from \"../shared/reflect-method.ts\";\n\n/** Ban Reflect.get, which bypasses ordinary property access and useful type evidence. */\nexport const noReflectGetRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow Reflect.get; use typed property access or parse dynamic input into a domain type.\",\n },\n messages: {\n reflectGet:\n \"Replace `Reflect.get` with typed property access. Parse dynamic input into a named domain type before reading it.\",\n },\n },\n createOnce(context) {\n return {\n CallExpression(node) {\n if (node.callee.type === \"Super\" || node.callee.type === \"V8IntrinsicExpression\") return;\n if (isGlobalReflectMethodCall(context.sourceCode, node.callee, \"get\")) {\n context.report({ node, messageId: \"reflectGet\" });\n }\n },\n };\n },\n});\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport type { ESTree } from \"@oxlint/plugins\";\n\ntype RuntimeFunction = ESTree.ArrowFunctionExpression | ESTree.Function;\n\nfunction isRuntimeFunction(node: ESTree.Node): node is RuntimeFunction {\n\treturn (\n\t\tnode.type === \"ArrowFunctionExpression\" ||\n\t\tnode.type === \"FunctionDeclaration\" ||\n\t\tnode.type === \"FunctionExpression\"\n\t);\n}\n\nfunction isInsideTypeGuard(node: ESTree.Node): boolean {\n\tlet current: ESTree.Node | null = node.parent;\n\twhile (current !== null && current.type !== \"Program\") {\n\t\tif (isRuntimeFunction(current)) {\n\t\t\treturn current.returnType?.typeAnnotation.type === \"TSTypePredicate\";\n\t\t}\n\t\tcurrent = current.parent;\n\t}\n\treturn false;\n}\n\n/** Return whether typeof safely probes for the existence of a possibly absent binding. */\nfunction isExistenceProbe(node: ESTree.UnaryExpression): boolean {\n\tconst parent = node.parent;\n\tif (parent.type !== \"BinaryExpression\") return false;\n\tif (![\"===\", \"!==\", \"==\", \"!=\"].includes(parent.operator)) return false;\n\tconst other = parent.left === node ? parent.right : parent.left;\n\treturn other.type === \"Literal\" && other.value === \"undefined\";\n}\n\n/** Disallow runtime typeof checks that narrow unparsed values instead of decoding them. */\nexport const noRuntimeTypeofRule = defineRule({\n\tmeta: {\n\t\ttype: \"problem\",\n\t\tdocs: {\n\t\t\tdescription:\n\t\t\t\t\"Disallow runtime typeof checks; external values must be decoded into meaningful types at their I/O boundary.\",\n\t\t},\n\t\tmessages: {\n\t\t\truntimeTypeof:\n\t\t\t\t\"A `typeof` check narrows a representation without establishing its contract. Parse input at its I/O boundary, then branch on the domain value.\",\n\t\t},\n\t\tschema: [\n\t\t\t{\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\tallowInTypeGuards: { type: \"boolean\" },\n\t\t\t\t},\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t],\n\t\tdefaultOptions: [{ allowInTypeGuards: false }],\n\t},\n\tcreateOnce(context) {\n\t\treturn {\n\t\t\tUnaryExpression(node) {\n\t\t\t\tconst option = context.options?.[0];\n\t\t\t\tconst allowInTypeGuards =\n\t\t\t\t\ttypeof option === \"object\" &&\n\t\t\t\t\toption !== null &&\n\t\t\t\t\t!Array.isArray(option) &&\n\t\t\t\t\toption.allowInTypeGuards === true;\n\t\t\t\tif (\n\t\t\t\t\tnode.operator === \"typeof\" &&\n\t\t\t\t\t!isExistenceProbe(node) &&\n\t\t\t\t\t(!allowInTypeGuards || !isInsideTypeGuard(node))\n\t\t\t\t) {\n\t\t\t\t\tcontext.report({ node, messageId: \"runtimeTypeof\" });\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t},\n});\n","import { defineRule } from \"@oxlint/plugins\";\nimport type { ESTree } from \"@oxlint/plugins\";\n\nconst FORBIDDEN_SYMBOL_NAME = \"shape\";\n\nfunction containsForbiddenSymbolName(name: string): boolean {\n return name.toLowerCase().includes(FORBIDDEN_SYMBOL_NAME);\n}\n\n/** Return whether an identifier names a statically accessed member owned by another value. */\nfunction isBorrowedMemberName(node: ESTree.Node): boolean {\n const parent = node.parent;\n if (parent === null || parent.type !== \"MemberExpression\") return false;\n return parent.property === node && parent.computed === false;\n}\n\n/** Ban the case-insensitive substring \"shape\" in every JavaScript and TypeScript symbol name. */\nexport const noForbiddenTermInSymbolNamesRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n 'Disallow the case-insensitive substring \"shape\" in JavaScript, TypeScript, private, and JSX symbol names.',\n },\n messages: {\n forbiddenSymbolName:\n 'Rename symbol \"{{name}}\" for its domain role; \"shape\" describes structure rather than ownership.',\n },\n },\n createOnce(context) {\n const reportForbiddenSymbolName = (node: ESTree.Node & { name: string }) => {\n if (!containsForbiddenSymbolName(node.name) || isBorrowedMemberName(node)) return;\n context.report({\n node,\n messageId: \"forbiddenSymbolName\",\n data: { name: node.name },\n });\n };\n\n return {\n Identifier: reportForbiddenSymbolName,\n PrivateIdentifier: reportForbiddenSymbolName,\n JSXIdentifier: reportForbiddenSymbolName,\n };\n },\n});\n","import { defineRule } from \"@oxlint/plugins\";\nimport type { ESTree } from \"@oxlint/plugins\";\n\nimport {\n containsUnknownType,\n functionParameterBindingName,\n functionParameterTypeAnnotation,\n} from \"../shared/function-parameters.ts\";\ntype ParameterOwner =\n | ESTree.ArrowFunctionExpression\n | ESTree.Function\n | ESTree.TSCallSignatureDeclaration\n | ESTree.TSConstructSignatureDeclaration\n | ESTree.TSConstructorType\n | ESTree.TSFunctionType\n | ESTree.TSMethodSignature;\n\nfunction isTypePredicateSubject(owner: ParameterOwner, parameterName: string): boolean {\n const predicate = owner.returnType?.typeAnnotation;\n return (\n predicate?.type === \"TSTypePredicate\" &&\n predicate.parameterName.type === \"Identifier\" &&\n predicate.parameterName.name === parameterName\n );\n}\n\n/** Disallow unknown inputs except explicitly named error-cause enrichment. */\nexport const noUnknownParametersRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow explicitly unknown function parameters except `cause` and type-predicate subjects; decode unknown input at its I/O boundary instead.\",\n },\n messages: {\n unknownParameter:\n \"Parameter `{{parameter}}` leaves input unparsed. Accept a named domain type; run the expected schema or parser at the I/O boundary before calling this function.\",\n },\n },\n createOnce(context) {\n const checkParameters = (node: ParameterOwner) => {\n for (const parameter of node.params) {\n const annotation = functionParameterTypeAnnotation(parameter);\n if (annotation === null || annotation === undefined) continue;\n if (!containsUnknownType(annotation.typeAnnotation)) continue;\n const name = functionParameterBindingName(parameter, context.sourceCode);\n if (name === \"cause\" || isTypePredicateSubject(node, name)) continue;\n context.report({\n node: annotation.typeAnnotation,\n messageId: \"unknownParameter\",\n data: { parameter: name },\n });\n }\n };\n\n return {\n ArrowFunctionExpression: checkParameters,\n FunctionDeclaration: checkParameters,\n FunctionExpression: checkParameters,\n TSCallSignatureDeclaration: checkParameters,\n TSConstructSignatureDeclaration: checkParameters,\n TSConstructorType: checkParameters,\n TSDeclareFunction: checkParameters,\n TSEmptyBodyFunctionExpression: checkParameters,\n TSFunctionType: checkParameters,\n TSMethodSignature: checkParameters,\n };\n },\n});\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport type { ESTree } from \"@oxlint/plugins\";\n\nimport {\n createTypeAliasEnvironment,\n resolvedTypeMatches,\n type TypeAliasEnvironment,\n} from \"../shared/type-alias-resolution.ts\";\n\ntype FunctionWithReturnType =\n | ESTree.ArrowFunctionExpression\n | ESTree.Function\n | ESTree.TSCallSignatureDeclaration\n | ESTree.TSConstructSignatureDeclaration\n | ESTree.TSConstructorType\n | ESTree.TSFunctionType\n | ESTree.TSMethodSignature;\n\n/** Ban function contracts that return unknown instead of a parsed domain type. */\nexport const noUnknownReturnsRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow functions whose explicit return contract is unknown or Promise<unknown>.\",\n },\n messages: {\n unknownReturn:\n \"This function exposes `unknown` to its caller. Parse the value at its boundary and return a named domain type.\",\n },\n },\n createOnce(context) {\n let environment: TypeAliasEnvironment | null = null;\n\n const resolvesToUnknown = (type: ESTree.TSType): boolean =>\n environment !== null &&\n resolvedTypeMatches(type, environment, (resolved, matches) => {\n if (resolved.type === \"TSUnknownKeyword\") return true;\n if (resolved.type === \"TSParenthesizedType\") {\n return matches(resolved.typeAnnotation);\n }\n if (resolved.type === \"TSUnionType\") return resolved.types.some(matches);\n if (\n resolved.type !== \"TSTypeReference\" ||\n resolved.typeName.type !== \"Identifier\" ||\n (resolved.typeName.name !== \"Promise\" &&\n resolved.typeName.name !== \"PromiseLike\")\n ) {\n return false;\n }\n const value = resolved.typeArguments?.params[0];\n return value !== undefined && matches(value);\n });\n\n const checkReturnType = (node: FunctionWithReturnType) => {\n const annotation = node.returnType;\n if (annotation === null || annotation === undefined) return;\n if (!resolvesToUnknown(annotation.typeAnnotation)) return;\n context.report({ node: annotation.typeAnnotation, messageId: \"unknownReturn\" });\n };\n\n return {\n Program(node) {\n environment = createTypeAliasEnvironment(\n node,\n context.sourceCode.visitorKeys,\n );\n },\n ArrowFunctionExpression: checkReturnType,\n FunctionDeclaration: checkReturnType,\n FunctionExpression: checkReturnType,\n TSCallSignatureDeclaration: checkReturnType,\n TSConstructSignatureDeclaration: checkReturnType,\n TSConstructorType: checkReturnType,\n TSDeclareFunction: checkReturnType,\n TSEmptyBodyFunctionExpression: checkReturnType,\n TSFunctionType: checkReturnType,\n TSMethodSignature: checkReturnType,\n };\n },\n});\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport type { ESTree } from \"@oxlint/plugins\";\n\nimport {\n\tcreateTypeAliasEnvironment,\n\tresolvedTypeMatches,\n\ttype TypeAliasEnvironment,\n} from \"../shared/type-alias-resolution.ts\";\n\n/** Ban named aliases that merely conceal TypeScript's unknown top type. */\nexport const noUnknownTypeAliasesRule = defineRule({\n\tmeta: {\n\t\ttype: \"problem\",\n\t\tdocs: {\n\t\t\tdescription:\n\t\t\t\t\"Disallow type aliases whose resolved type is unknown; unknown must remain visible at an allowed boundary.\",\n\t\t},\n\t\tmessages: {\n\t\t\tunknownAlias:\n\t\t\t\t\"Type alias `{{alias}}` hides `unknown`. Keep `unknown` explicit at the parsing boundary or on an allowed `cause` field; otherwise use the parsed owner type.\",\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\tlet environment: TypeAliasEnvironment | null = null;\n\n\t\tconst resolvesToUnknown = (type: ESTree.TSType): boolean =>\n\t\t\tenvironment !== null &&\n\t\t\tresolvedTypeMatches(type, environment, (resolved, matches) => {\n\t\t\t\tif (resolved.type === \"TSUnknownKeyword\") return true;\n\t\t\t\tif (resolved.type === \"TSParenthesizedType\") {\n\t\t\t\t\treturn matches(resolved.typeAnnotation);\n\t\t\t\t}\n\t\t\t\treturn resolved.type === \"TSUnionType\" && resolved.types.some(matches);\n\t\t\t});\n\n\t\treturn {\n\t\t\tProgram(node) {\n\t\t\t\tenvironment = createTypeAliasEnvironment(\n\t\t\t\t\tnode,\n\t\t\t\t\tcontext.sourceCode.visitorKeys,\n\t\t\t\t);\n\t\t\t},\n\t\t\tTSTypeAliasDeclaration(node) {\n\t\t\t\tif (!resolvesToUnknown(node.typeAnnotation)) return;\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode: node.id,\n\t\t\t\t\tmessageId: \"unknownAlias\",\n\t\t\t\t\tdata: { alias: node.id.name },\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t},\n});\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport {\n\tclassifyUnsafeDictionary,\n\tclassifyUnsafeDictionaryValue,\n\tcreateTypeEnvironment,\n\ttype TypeEnvironment,\n} from \"../shared/dictionary-types.ts\";\nimport { visibleTypeAlias } from \"../shared/type-alias-resolution.ts\";\n\nimport type { ESTree } from \"@oxlint/plugins\";\n\nconst typeNodeKinds: ReadonlySet<string> = new Set([\n\t\"JSDocNonNullableType\",\n\t\"JSDocNullableType\",\n\t\"JSDocUnknownType\",\n\t\"TSAnyKeyword\",\n\t\"TSArrayType\",\n\t\"TSBigIntKeyword\",\n\t\"TSBooleanKeyword\",\n\t\"TSConditionalType\",\n\t\"TSConstructorType\",\n\t\"TSFunctionType\",\n\t\"TSImportType\",\n\t\"TSIndexedAccessType\",\n\t\"TSInferType\",\n\t\"TSIntersectionType\",\n\t\"TSIntrinsicKeyword\",\n\t\"TSLiteralType\",\n\t\"TSMappedType\",\n\t\"TSNamedTupleMember\",\n\t\"TSNeverKeyword\",\n\t\"TSNullKeyword\",\n\t\"TSNumberKeyword\",\n\t\"TSObjectKeyword\",\n\t\"TSParenthesizedType\",\n\t\"TSStringKeyword\",\n\t\"TSSymbolKeyword\",\n\t\"TSTemplateLiteralType\",\n\t\"TSThisType\",\n\t\"TSTupleType\",\n\t\"TSTypeLiteral\",\n\t\"TSTypeOperator\",\n\t\"TSTypePredicate\",\n\t\"TSTypeQuery\",\n\t\"TSTypeReference\",\n\t\"TSUndefinedKeyword\",\n\t\"TSUnionType\",\n\t\"TSUnknownKeyword\",\n\t\"TSVoidKeyword\",\n]);\n\nfunction isTypeNode(node: ESTree.Node): node is ESTree.TSType {\n\treturn typeNodeKinds.has(node.type);\n}\n\nfunction typeReferenceName(type: ESTree.TSTypeReference): string | null {\n\treturn type.typeName.type === \"Identifier\" ? type.typeName.name : null;\n}\n\nfunction isInsideTypeAliasDeclaration(node: ESTree.Node): boolean {\n\tlet current: ESTree.Node | null = node.parent;\n\twhile (current !== null && current.type !== \"Program\") {\n\t\tif (current.type === \"TSTypeAliasDeclaration\") return true;\n\t\tcurrent = current.parent;\n\t}\n\treturn false;\n}\n\nfunction isPlainAliasConsumerUse(node: ESTree.TSType, environment: TypeEnvironment): boolean {\n\tif (node.type !== \"TSTypeReference\" || node.typeArguments?.params.length) return false;\n\tconst name = typeReferenceName(node);\n\treturn (\n\t\tname !== null &&\n\t\tvisibleTypeAlias(name, node, environment.typeAliases) !== null &&\n\t\t!isInsideTypeAliasDeclaration(node)\n\t);\n}\n\nfunction isInsideTypeParameterConstraint(node: ESTree.TSType): boolean {\n\tlet child: ESTree.Node = node;\n\tlet parent: ESTree.Node | null = child.parent;\n\twhile (parent !== null && parent.type !== \"Program\") {\n\t\tif (parent.type === \"TSTypeParameter\" && parent.constraint === child) return true;\n\t\tchild = parent;\n\t\tparent = child.parent;\n\t}\n\treturn false;\n}\n\nfunction shouldReportType(node: ESTree.TSType, environment: TypeEnvironment): boolean {\n\tif (isInsideTypeParameterConstraint(node)) return false;\n\tif (isPlainAliasConsumerUse(node, environment)) return false;\n\tif (classifyUnsafeDictionary(node, environment) === null) return false;\n\tlet current: ESTree.Node | null = node.parent;\n\twhile (current !== null && current.type !== \"Program\") {\n\t\tif (isTypeNode(current) && classifyUnsafeDictionary(current, environment) !== null)\n\t\t\treturn false;\n\t\tcurrent = current.parent;\n\t}\n\treturn true;\n}\n\n/** Disallow object-dictionary contracts whose direct value type is an unsafe escape hatch. */\nexport const noUnsafeDictionaryTypeRule = defineRule({\n\tmeta: {\n\t\ttype: \"problem\",\n\t\tdocs: {\n\t\t\tdescription:\n\t\t\t\t\"Disallow object-dictionary contracts whose direct value type is unknown, any, object, {}, or a union/alias containing one of those escape hatches.\",\n\t\t},\n\t\tmessages: {\n\t\t\tunsafeDictionary:\n\t\t\t\t\"This dictionary's {{value}} value type gives callers no concrete value contract. Use an owner/schema-derived value type; parse external payloads before insertion.\",\n\t\t},\n\t},\n\tcreateOnce(context) {\n\t\tlet environment: TypeEnvironment | null = null;\n\t\tconst report = (node: ESTree.Node, value: string) => {\n\t\t\tcontext.report({ node, messageId: \"unsafeDictionary\", data: { value } });\n\t\t};\n\t\tconst reportIfUnsafe = (node: ESTree.TSType) => {\n\t\t\tif (environment === null || !shouldReportType(node, environment)) return;\n\t\t\tconst unsafe = classifyUnsafeDictionary(node, environment);\n\t\t\tif (unsafe === null) return;\n\t\t\treport(node, unsafe.unsafeValue);\n\t\t};\n\n\t\treturn {\n\t\t\tProgram(node) {\n\t\t\t\tenvironment = createTypeEnvironment(\n\t\t\t\t\tnode,\n\t\t\t\t\tcontext.sourceCode.visitorKeys,\n\t\t\t\t);\n\t\t\t},\n\t\t\tTSTypeReference: reportIfUnsafe,\n\t\t\tTSTypeLiteral: reportIfUnsafe,\n\t\t\tTSMappedType: reportIfUnsafe,\n\t\t\tTSIndexSignature(node) {\n\t\t\t\tif (\n\t\t\t\t\tenvironment === null ||\n\t\t\t\t\tnode.typeAnnotation === null ||\n\t\t\t\t\tnode.parent.type === \"TSTypeLiteral\"\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tconst unsafe = classifyUnsafeDictionaryValue(\n\t\t\t\t\tnode.typeAnnotation.typeAnnotation,\n\t\t\t\t\tenvironment,\n\t\t\t\t);\n\t\t\t\tif (unsafe !== null) report(node, unsafe.unsafeValue);\n\t\t\t},\n\t\t};\n\t},\n});\n","import { defineRule } from \"@oxlint/plugins\";\nimport type { ESTree, Variable } from \"@oxlint/plugins\";\n\ntype BroadTypeKind = \"top\" | \"object\" | \"record\";\n\ntype KnownValueEvidence = {\n readonly type: ESTree.TSType | null;\n};\n\nconst functionBoundaryTypes = new Set([\n \"ArrowFunctionExpression\",\n \"FunctionDeclaration\",\n \"FunctionExpression\",\n \"TSDeclareFunction\",\n \"TSEmptyBodyFunctionExpression\",\n]);\n\nfunction unwrapExpressionParentheses(expression: ESTree.Expression): ESTree.Expression {\n let current = expression;\n while (current.type === \"ParenthesizedExpression\") current = current.expression;\n return current;\n}\n\nfunction unwrapTypeParentheses(type: ESTree.TSType): ESTree.TSType {\n let current = type;\n while (current.type === \"TSParenthesizedType\") current = current.typeAnnotation;\n return current;\n}\n\nfunction typeReferenceName(type: ESTree.TSTypeReference): string | null {\n return type.typeName.type === \"Identifier\" ? type.typeName.name : null;\n}\n\nfunction isUnknownOrAnyType(type: ESTree.TSType): boolean {\n const unwrapped = unwrapTypeParentheses(type);\n return unwrapped.type === \"TSUnknownKeyword\" || unwrapped.type === \"TSAnyKeyword\";\n}\n\nfunction isBroadRecordKeyType(type: ESTree.TSType): boolean {\n const unwrapped = unwrapTypeParentheses(type);\n if (\n unwrapped.type === \"TSStringKeyword\" ||\n unwrapped.type === \"TSNumberKeyword\" ||\n unwrapped.type === \"TSSymbolKeyword\"\n ) {\n return true;\n }\n if (unwrapped.type === \"TSUnionType\") return unwrapped.types.every(isBroadRecordKeyType);\n return unwrapped.type === \"TSTypeReference\" && typeReferenceName(unwrapped) === \"PropertyKey\";\n}\n\nfunction isBroadRecordType(type: ESTree.TSType): boolean {\n const unwrapped = unwrapTypeParentheses(type);\n\n if (unwrapped.type === \"TSTypeReference\") {\n if (typeReferenceName(unwrapped) === \"Readonly\") {\n const [inner] = unwrapped.typeArguments?.params ?? [];\n return inner !== undefined && isBroadRecordType(inner);\n }\n\n if (typeReferenceName(unwrapped) !== \"Record\") return false;\n const parameters = unwrapped.typeArguments?.params ?? [];\n return (\n parameters.length === 2 &&\n parameters[0] !== undefined &&\n parameters[1] !== undefined &&\n isBroadRecordKeyType(parameters[0]) &&\n isUnknownOrAnyType(parameters[1])\n );\n }\n\n if (unwrapped.type !== \"TSTypeLiteral\" || unwrapped.members.length !== 1) return false;\n const [member] = unwrapped.members;\n const [parameter] = member?.type === \"TSIndexSignature\" ? member.parameters : [];\n return (\n member?.type === \"TSIndexSignature\" &&\n member.parameters.length === 1 &&\n parameter !== undefined &&\n isBroadRecordKeyType(parameter.typeAnnotation.typeAnnotation) &&\n isUnknownOrAnyType(member.typeAnnotation.typeAnnotation)\n );\n}\n\nfunction broadTypeKind(type: ESTree.TSType): BroadTypeKind | null {\n const unwrapped = unwrapTypeParentheses(type);\n if (unwrapped.type === \"TSUnknownKeyword\" || unwrapped.type === \"TSAnyKeyword\") return \"top\";\n if (unwrapped.type === \"TSObjectKeyword\") return \"object\";\n return isBroadRecordType(unwrapped) ? \"record\" : null;\n}\n\nfunction assertedExpression(\n node: ESTree.TSAsExpression | ESTree.TSTypeAssertion,\n): ESTree.Expression {\n return unwrapExpressionParentheses(node.expression);\n}\n\nfunction assertionFromExpression(\n expression: ESTree.Expression,\n): ESTree.TSAsExpression | ESTree.TSTypeAssertion | null {\n const unwrapped = unwrapExpressionParentheses(expression);\n return unwrapped.type === \"TSAsExpression\" || unwrapped.type === \"TSTypeAssertion\"\n ? unwrapped\n : null;\n}\n\nfunction normalizedTypeText(sourceText: string, type: ESTree.TSType): string {\n return sourceText.slice(type.start, type.end).replaceAll(/\\s+/gu, \"\");\n}\n\nfunction typesHaveSameSyntax(\n sourceText: string,\n left: ESTree.TSType | null,\n right: ESTree.TSType,\n): boolean {\n return (\n left !== null &&\n normalizedTypeText(sourceText, unwrapTypeParentheses(left)) ===\n normalizedTypeText(sourceText, unwrapTypeParentheses(right))\n );\n}\n\nfunction isDefinitelyObjectType(type: ESTree.TSType): boolean {\n const unwrapped = unwrapTypeParentheses(type);\n switch (unwrapped.type) {\n case \"TSArrayType\":\n case \"TSConstructorType\":\n case \"TSFunctionType\":\n case \"TSMappedType\":\n case \"TSObjectKeyword\":\n case \"TSTupleType\":\n return true;\n case \"TSTypeLiteral\":\n return unwrapped.members.length > 0;\n case \"TSIntersectionType\":\n return unwrapped.types.every(isDefinitelyObjectType);\n case \"TSTypeOperator\":\n return unwrapped.operator === \"readonly\" && isDefinitelyObjectType(unwrapped.typeAnnotation);\n default:\n return false;\n }\n}\n\nfunction isDefinitelyNarrowerRecordType(type: ESTree.TSType): boolean {\n const unwrapped = unwrapTypeParentheses(type);\n if (unwrapped.type === \"TSTypeLiteral\") {\n return unwrapped.members.some((member) => member.type !== \"TSIndexSignature\");\n }\n\n if (unwrapped.type !== \"TSTypeReference\") return false;\n if (typeReferenceName(unwrapped) === \"Readonly\") {\n const [inner] = unwrapped.typeArguments?.params ?? [];\n return inner !== undefined && isDefinitelyNarrowerRecordType(inner);\n }\n if (typeReferenceName(unwrapped) !== \"Record\") return false;\n\n const parameters = unwrapped.typeArguments?.params ?? [];\n return (\n parameters.length === 2 && parameters[1] !== undefined && !isUnknownOrAnyType(parameters[1])\n );\n}\n\nfunction functionBoundary(node: ESTree.Node): ESTree.Node | null {\n let current = node.parent;\n while (current !== null && current.type !== \"Program\") {\n if (functionBoundaryTypes.has(current.type)) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction resolvedVariableForIdentifier(\n scopes: readonly {\n readonly references: readonly {\n readonly identifier: ESTree.Node;\n readonly resolved: Variable | null;\n }[];\n }[],\n identifier: ESTree.IdentifierReference,\n): Variable | null {\n for (const scope of scopes) {\n const reference = scope.references.find(\n (candidate) =>\n candidate.identifier.start === identifier.start &&\n candidate.identifier.end === identifier.end,\n );\n if (reference !== undefined) return reference.resolved;\n }\n return null;\n}\n\nfunction variableDeclarator(variable: Variable): ESTree.VariableDeclarator | null {\n for (const definition of variable.defs) {\n if (definition.type === \"Variable\" && definition.node.type === \"VariableDeclarator\") {\n return definition.node;\n }\n }\n return null;\n}\n\nfunction knownValueEvidence(\n expression: ESTree.Expression,\n scopes: Parameters<typeof resolvedVariableForIdentifier>[0],\n boundary: ESTree.Node | null,\n visitedVariables: ReadonlySet<Variable>,\n): KnownValueEvidence | null {\n const unwrapped = unwrapExpressionParentheses(expression);\n\n if (unwrapped.type === \"TSAsExpression\" || unwrapped.type === \"TSTypeAssertion\") {\n if (broadTypeKind(unwrapped.typeAnnotation) !== null) return null;\n return { type: unwrapped.typeAnnotation };\n }\n\n if (unwrapped.type === \"Literal\" || unwrapped.type === \"TemplateLiteral\") {\n return { type: null };\n }\n\n if (\n unwrapped.type === \"ArrayExpression\" ||\n unwrapped.type === \"ArrowFunctionExpression\" ||\n unwrapped.type === \"ClassExpression\" ||\n unwrapped.type === \"FunctionExpression\" ||\n unwrapped.type === \"NewExpression\" ||\n unwrapped.type === \"ObjectExpression\"\n ) {\n return { type: null };\n }\n\n if (unwrapped.type !== \"Identifier\") return null;\n const variable = resolvedVariableForIdentifier(scopes, unwrapped);\n if (variable === null || visitedVariables.has(variable)) return null;\n\n const annotatedIdentifier = variable.identifiers.find(\n (identifier) => identifier.typeAnnotation !== null && identifier.typeAnnotation !== undefined,\n );\n const annotation = annotatedIdentifier?.typeAnnotation?.typeAnnotation;\n if (annotation !== undefined && annotatedIdentifier !== undefined) {\n if (functionBoundary(annotatedIdentifier) !== boundary || broadTypeKind(annotation) !== null) {\n return null;\n }\n return { type: annotation };\n }\n\n const declarator = variableDeclarator(variable);\n if (\n declarator === null ||\n declarator.parent.type !== \"VariableDeclaration\" ||\n declarator.parent.kind !== \"const\" ||\n declarator.init === null ||\n variable.references.some((reference) => reference.isWrite() && !reference.init) ||\n functionBoundary(declarator) !== boundary\n ) {\n return null;\n }\n\n return knownValueEvidence(\n declarator.init,\n scopes,\n boundary,\n new Set([...visitedVariables, variable]),\n );\n}\n\nfunction widenedBinding(\n variable: Variable,\n scopes: Parameters<typeof resolvedVariableForIdentifier>[0],\n): {\n readonly broadKind: BroadTypeKind;\n readonly evidence: KnownValueEvidence;\n readonly declaredAt: number;\n readonly boundary: ESTree.Node | null;\n} | null {\n const declarator = variableDeclarator(variable);\n if (\n declarator === null ||\n declarator.parent.type !== \"VariableDeclaration\" ||\n declarator.parent.kind !== \"const\" ||\n declarator.id.type !== \"Identifier\" ||\n declarator.init === null ||\n variable.references.some((reference) => reference.isWrite() && !reference.init)\n ) {\n return null;\n }\n\n const boundary = functionBoundary(declarator);\n const declaredType = declarator.id.typeAnnotation?.typeAnnotation;\n const initializerAssertion = assertionFromExpression(declarator.init);\n const initializerBroadKind =\n initializerAssertion === null ? null : broadTypeKind(initializerAssertion.typeAnnotation);\n const declaredBroadKind = declaredType === undefined ? null : broadTypeKind(declaredType);\n const broadKind = declaredBroadKind ?? initializerBroadKind;\n if (broadKind === null) return null;\n\n const originalExpression =\n initializerAssertion !== null && initializerBroadKind !== null\n ? assertedExpression(initializerAssertion)\n : declarator.init;\n const evidence = knownValueEvidence(originalExpression, scopes, boundary, new Set([variable]));\n return evidence === null ? null : { broadKind, evidence, declaredAt: declarator.end, boundary };\n}\n\nfunction assertionIsNarrower(\n sourceText: string,\n broadKind: BroadTypeKind,\n evidence: KnownValueEvidence,\n assertedType: ESTree.TSType,\n): boolean {\n if (broadTypeKind(assertedType) !== null) return false;\n if (broadKind === \"top\") return true;\n if (typesHaveSameSyntax(sourceText, evidence.type, assertedType)) return true;\n if (broadKind === \"object\") return isDefinitelyObjectType(assertedType);\n return isDefinitelyNarrowerRecordType(assertedType);\n}\n\n/** Detect immutable local bindings that erase a known type and are later asserted back to a narrower type. */\nexport const noWidenThenAssertRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow local const flows that explicitly widen a known value before asserting the widened binding to a narrower type.\",\n },\n messages: {\n widenThenAssert:\n 'Binding \"{{name}}\" discards type evidence and later recreates it with an assertion. Keep the precise type from initialization through use; parse boundary input once.',\n },\n },\n createOnce(context) {\n let scopes: Parameters<typeof resolvedVariableForIdentifier>[0] = [];\n\n const checkAssertion = (node: ESTree.TSAsExpression | ESTree.TSTypeAssertion) => {\n const expression = assertedExpression(node);\n if (expression.type !== \"Identifier\") return;\n\n const variable = resolvedVariableForIdentifier(scopes, expression);\n if (variable === null) return;\n const widened = widenedBinding(variable, scopes);\n if (\n widened === null ||\n node.start <= widened.declaredAt ||\n functionBoundary(node) !== widened.boundary ||\n !assertionIsNarrower(\n context.sourceCode.text,\n widened.broadKind,\n widened.evidence,\n node.typeAnnotation,\n )\n ) {\n return;\n }\n\n context.report({\n node,\n messageId: \"widenThenAssert\",\n data: { name: expression.name },\n });\n };\n\n return {\n Program() {\n scopes = context.sourceCode.scopeManager.scopes;\n },\n TSAsExpression: checkAssertion,\n TSTypeAssertion: checkAssertion,\n };\n },\n});\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport type { ESTree, SourceCode } from \"@oxlint/plugins\";\n\ntype TypeAssertion = ESTree.TSAsExpression | ESTree.TSTypeAssertion;\n\nconst DEFAULT_SAFETY_MARKERS = [\"SAFETY\"] as const;\n\nconst commentOwnerKinds = new Set([\n \"ExpressionStatement\",\n \"PropertyDefinition\",\n \"ReturnStatement\",\n \"ThrowStatement\",\n \"VariableDeclaration\",\n]);\n\nfunction isConstAssertion(node: TypeAssertion): boolean {\n return (\n node.typeAnnotation.type === \"TSTypeReference\" &&\n node.typeAnnotation.typeName.type === \"Identifier\" &&\n node.typeAnnotation.typeName.name === \"const\"\n );\n}\n\nfunction configuredSafetyMarkers(option: unknown): readonly string[] {\n if (typeof option !== \"object\" || option === null || !(\"markers\" in option)) {\n return DEFAULT_SAFETY_MARKERS;\n }\n const configured = option.markers;\n if (!Array.isArray(configured)) return DEFAULT_SAFETY_MARKERS;\n const markers = configured.flatMap((marker) =>\n typeof marker === \"string\" && marker.trim().length > 0 ? [marker.trim()] : [],\n );\n return markers.length > 0 ? markers : DEFAULT_SAFETY_MARKERS;\n}\n\nfunction markerPattern(markers: readonly string[]): RegExp {\n const alternation = markers\n .map((marker) => marker.replaceAll(/[.*+?^${}()|[\\]\\\\]/gu, String.raw`\\$&`))\n .join(\"|\");\n return new RegExp(\n String.raw`(?:^|[^\\p{L}\\p{N}_])(?:${alternation})\\s*:\\s*\\S`,\n \"u\",\n );\n}\n\nfunction hasSafetyJustificationBefore(\n sourceCode: SourceCode,\n owner: ESTree.Node,\n assertion: TypeAssertion,\n pattern: RegExp,\n): boolean {\n return sourceCode\n .getCommentsBefore(owner)\n .some(\n (comment) => comment.end <= assertion.start && pattern.test(comment.value),\n );\n}\n\nfunction hasSafetyComment(\n sourceCode: SourceCode,\n node: TypeAssertion,\n pattern: RegExp,\n): boolean {\n let current: ESTree.Node = node;\n while (true) {\n if (hasSafetyJustificationBefore(sourceCode, current, node, pattern)) return true;\n if (commentOwnerKinds.has(current.type)) {\n const exportDeclaration = current.parent;\n return (\n exportDeclaration.type === \"ExportNamedDeclaration\" &&\n exportDeclaration.declaration === current &&\n hasSafetyJustificationBefore(sourceCode, exportDeclaration, node, pattern)\n );\n }\n if (current.parent.type === \"Program\") return false;\n current = current.parent;\n }\n}\n\n/** Require every non-const type assertion to state the invariant TypeScript cannot express. */\nexport const requireSafetyCommentForTypeAssertionRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Require a nearby SAFETY comment for every TypeScript type assertion except const assertions.\",\n },\n messages: {\n missingSafetyComment:\n \"This type assertion has no `{{marker}}:` justification. State the checked invariant immediately before the assertion or its containing statement.\",\n },\n schema: [\n {\n type: \"object\",\n properties: {\n markers: {\n type: \"array\",\n items: { type: \"string\", minLength: 1 },\n minItems: 1,\n uniqueItems: true,\n },\n },\n additionalProperties: false,\n },\n ],\n defaultOptions: [{ markers: [\"SAFETY\"] }],\n },\n createOnce(context) {\n const patterns = new Map<string, RegExp>();\n\n const checkAssertion = (node: TypeAssertion) => {\n if (isConstAssertion(node)) return;\n const markers = configuredSafetyMarkers(context.options?.[0]);\n const patternKey = markers.join(\"\\u0000\");\n const pattern = patterns.get(patternKey) ?? markerPattern(markers);\n patterns.set(patternKey, pattern);\n if (hasSafetyComment(context.sourceCode, node, pattern)) return;\n context.report({\n node,\n messageId: \"missingSafetyComment\",\n data: { marker: markers[0] ?? DEFAULT_SAFETY_MARKERS[0] },\n });\n };\n\n return {\n TSAsExpression: checkAssertion,\n TSTypeAssertion: checkAssertion,\n };\n },\n});\n","import type { Options } from \"@oxlint/plugins\";\n\ntype OptionValue = Options[number];\n\n/**\n * Rule options arrive as parsed JSON from the linter config, so this is the one\n * place their shape is checked. Returns the first option when it is an object.\n */\nfunction firstOptionObject(options: Readonly<Options>): { readonly [key: string]: OptionValue } {\n const first = options[0];\n return typeof first === \"object\" && first !== null && !Array.isArray(first) ? first : {};\n}\n\n/** A string-valued key of the first option object, or undefined when absent or not a string. */\nexport function stringOption(options: Readonly<Options>, key: string): string | undefined {\n const value = firstOptionObject(options)[key];\n return typeof value === \"string\" ? value : undefined;\n}\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport type { ESTree } from \"@oxlint/plugins\";\n\nimport { stringOption } from \"../shared/rule-options.ts\";\n\n// Three letters in a row, in any script. Digits, separators and bullets are not words.\nconst defaultWordPattern = String.raw`\\p{L}{3,}`;\n\n/** A string literal that is the whole expression of `{...}` placed among an element's children. */\nfunction isChildStringLiteral(\n node: ESTree.JSXExpressionContainer,\n): node is ESTree.JSXExpressionContainer & {\n readonly expression: ESTree.StringLiteral;\n} {\n const { expression, parent } = node;\n if (expression.type !== \"Literal\" || typeof expression.value !== \"string\") return false;\n return parent.type === \"JSXElement\" || parent.type === \"JSXFragment\";\n}\n\n/** Reject words written straight into JSX instead of coming from the translation dictionary. */\nexport const noHardcodedJsxTextRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow literal words in JSX children; every string on screen comes from the translation dictionary.\",\n },\n messages: {\n hardcodedText:\n \"Do not write words straight into JSX. Every string on screen comes from the translation dictionary.\",\n },\n schema: [\n {\n type: \"object\",\n properties: {\n pattern: { type: \"string\" },\n },\n additionalProperties: false,\n },\n ],\n },\n create(context) {\n const word = new RegExp(stringOption(context.options, \"pattern\") ?? defaultWordPattern, \"u\");\n return {\n JSXText(node) {\n if (word.test(node.value)) context.report({ node, messageId: \"hardcodedText\" });\n },\n JSXExpressionContainer(node) {\n if (isChildStringLiteral(node) && word.test(node.expression.value)) {\n context.report({ node: node.expression, messageId: \"hardcodedText\" });\n }\n },\n };\n },\n});\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport type { ESTree } from \"@oxlint/plugins\";\n\nimport { stringOption } from \"../shared/rule-options.ts\";\n\nconst effectHooks = new Set([\"useEffect\", \"useLayoutEffect\"]);\n\n/** The effect hook a call reaches, whether called bare (`useEffect(...)`) or through a member (`React.useEffect(...)`). */\nfunction calledEffectHook(callee: ESTree.Expression): string | null {\n if (callee.type === \"Identifier\") return effectHooks.has(callee.name) ? callee.name : null;\n if (callee.type !== \"MemberExpression\" || callee.computed) return null;\n const { property } = callee;\n return property.type === \"Identifier\" && effectHooks.has(property.name) ? property.name : null;\n}\n\nfunction importedName(specifier: ESTree.ImportSpecifier): string {\n return specifier.imported.type === \"Identifier\"\n ? specifier.imported.name\n : specifier.imported.value;\n}\n\nfunction isTypeOnly(specifier: ESTree.ImportSpecifier): boolean {\n const declaration = specifier.parent;\n return (\n specifier.importKind === \"type\" ||\n (declaration.type === \"ImportDeclaration\" && declaration.importKind === \"type\")\n );\n}\n\n/** Reject `useEffect` and `useLayoutEffect`, called or imported. */\nexport const noUseEffectRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow useEffect and useLayoutEffect; derive during render, act in the event handler, or subscribe through a reactive query.\",\n },\n messages: {\n noEffect:\n \"Do not call {{name}}. Derive the value during render, do the work in the event handler, or subscribe through a reactive query.\",\n noEffectWithHint:\n \"Do not call {{name}}. Derive the value during render, do the work in the event handler, or subscribe through a reactive query. {{hint}}\",\n },\n schema: [\n {\n type: \"object\",\n properties: {\n hint: { type: \"string\" },\n },\n additionalProperties: false,\n },\n ],\n },\n create(context) {\n const hint = stringOption(context.options, \"hint\");\n const report = (node: ESTree.Node, name: string): void => {\n if (hint === undefined) {\n context.report({ node, messageId: \"noEffect\", data: { name } });\n } else {\n context.report({ node, messageId: \"noEffectWithHint\", data: { name, hint } });\n }\n };\n return {\n CallExpression(node) {\n const name = calledEffectHook(node.callee);\n if (name !== null) report(node, name);\n },\n ImportSpecifier(node) {\n if (isTypeOnly(node)) return;\n const name = importedName(node);\n if (effectHooks.has(name)) report(node, name);\n },\n };\n },\n});\n","import { defineRule } from \"@oxlint/plugins\";\n\nimport type { ESTree } from \"@oxlint/plugins\";\n\nfunction isProcessEnv(node: ESTree.Node): node is ESTree.StaticMemberExpression {\n return (\n node.type === \"MemberExpression\" &&\n !node.computed &&\n node.object.type === \"Identifier\" &&\n node.object.name === \"process\" &&\n node.property.type === \"Identifier\" &&\n node.property.name === \"env\"\n );\n}\n\n/** Reject every use of `process.env` that Expo's textual inlining cannot see. */\nexport const staticPublicEnvRule = defineRule({\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Allow only static `process.env.NAME` reads; Expo replaces each one textually at bundle time and everything else is undefined on the device.\",\n },\n messages: {\n destructured:\n \"Expo replaces each `process.env.EXPO_PUBLIC_*` read textually at bundle time, so there is no `process.env` object to destructure on the device. Read each variable as `process.env.NAME`.\",\n computed:\n \"Expo replaces each `process.env.EXPO_PUBLIC_*` read textually at bundle time, so a computed key is undefined on the device. Read the variable as `process.env.NAME` with the name spelled out.\",\n bareValue:\n \"Expo replaces each `process.env.EXPO_PUBLIC_*` read textually at bundle time, so `process.env` passed around as a value is empty on the device. Read each variable as `process.env.NAME`.\",\n },\n },\n create(context) {\n return {\n MemberExpression(node) {\n if (!isProcessEnv(node)) return;\n const { parent } = node;\n if (parent.type === \"MemberExpression\" && parent.object === node) {\n if (parent.computed) context.report({ node: parent, messageId: \"computed\" });\n return;\n }\n if (parent.type === \"VariableDeclarator\" && parent.id.type === \"ObjectPattern\") {\n context.report({ node: parent, messageId: \"destructured\" });\n return;\n }\n context.report({ node, messageId: \"bareValue\" });\n },\n };\n },\n});\n","import { eslintCompatPlugin } from \"@oxlint/plugins\";\n\nimport { noArrayFilterMapRule } from \"./anti-slop/rules/no-array-filter-map.ts\";\nimport { noChainedTypeAssertionsRule } from \"./anti-slop/rules/no-chained-type-assertions.ts\";\nimport { noConditionalEmptyObjectSpreadRule } from \"./anti-slop/rules/no-conditional-empty-object-spread.ts\";\nimport { noKnownValueWideningRule } from \"./anti-slop/rules/no-known-value-widening.ts\";\nimport { noModuleMockingRule } from \"./anti-slop/rules/no-module-mocking.ts\";\nimport { noObjectParametersRule } from \"./anti-slop/rules/no-object-parameters.ts\";\nimport { noReduceAccumulatorCopyRule } from \"./anti-slop/rules/no-reduce-accumulator-copy.ts\";\nimport { noReflectApplyRule } from \"./anti-slop/rules/no-reflect-apply.ts\";\nimport { noReflectGetRule } from \"./anti-slop/rules/no-reflect-get.ts\";\nimport { noRuntimeTypeofRule } from \"./anti-slop/rules/no-runtime-typeof.ts\";\nimport { noForbiddenTermInSymbolNamesRule } from \"./anti-slop/rules/no-shape-in-symbol-names.ts\";\nimport { noUnknownParametersRule } from \"./anti-slop/rules/no-unknown-parameters.ts\";\nimport { noUnknownReturnsRule } from \"./anti-slop/rules/no-unknown-returns.ts\";\nimport { noUnknownTypeAliasesRule } from \"./anti-slop/rules/no-unknown-type-aliases.ts\";\nimport { noUnsafeDictionaryTypeRule } from \"./anti-slop/rules/no-unsafe-dictionary-type.ts\";\nimport { noWidenThenAssertRule } from \"./anti-slop/rules/no-widen-then-assert.ts\";\nimport { requireSafetyCommentForTypeAssertionRule } from \"./anti-slop/rules/require-safety-comment-for-type-assertion.ts\";\nimport { noHardcodedJsxTextRule } from \"./rules/no-hardcoded-jsx-text.ts\";\nimport { noUseEffectRule } from \"./rules/no-use-effect.ts\";\nimport { staticPublicEnvRule } from \"./rules/static-public-env.ts\";\n\n// One plugin, one prefix. `rdj` is not on oxlint's reserved list, so the same\n// name works as a `jsPlugins` alias and as the prefix in every diagnostic and\n// every disable comment. `eslintCompatPlugin` adds a `create` shim to each\n// `createOnce` rule, which is what lets these run under ESLint as well.\nconst rdjPlugin = eslintCompatPlugin({\n meta: { name: \"rdj\" },\n rules: {\n \"no-array-filter-map\": noArrayFilterMapRule,\n \"no-chained-type-assertions\": noChainedTypeAssertionsRule,\n \"no-conditional-empty-object-spread\": noConditionalEmptyObjectSpreadRule,\n \"no-hardcoded-jsx-text\": noHardcodedJsxTextRule,\n \"no-known-value-widening\": noKnownValueWideningRule,\n \"no-module-mocking\": noModuleMockingRule,\n \"no-object-parameters\": noObjectParametersRule,\n \"no-reduce-accumulator-copy\": noReduceAccumulatorCopyRule,\n \"no-reflect-apply\": noReflectApplyRule,\n \"no-reflect-get\": noReflectGetRule,\n \"no-runtime-typeof\": noRuntimeTypeofRule,\n \"no-shape-in-symbol-names\": noForbiddenTermInSymbolNamesRule,\n \"no-unknown-parameters\": noUnknownParametersRule,\n \"no-unknown-returns\": noUnknownReturnsRule,\n \"no-unknown-type-aliases\": noUnknownTypeAliasesRule,\n \"no-unsafe-dictionary-type\": noUnsafeDictionaryTypeRule,\n \"no-use-effect\": noUseEffectRule,\n \"no-widen-then-assert\": noWidenThenAssertRule,\n \"require-safety-comment-for-type-assertion\": requireSafetyCommentForTypeAssertionRule,\n \"static-public-env\": staticPublicEnvRule,\n },\n});\n\nexport default rdjPlugin;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
//#region src/verify.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Proof that every lint rule still fires.
|
|
4
|
+
*
|
|
5
|
+
* The linter lives inside the `vp` binary, so it moves independently of any
|
|
6
|
+
* lockfile, and the JS-plugin bridge it loads these rules through is alpha. A
|
|
7
|
+
* rule can stop firing with no diff anywhere, and a dead lint rule is silent:
|
|
8
|
+
* "reports nothing" looks exactly like "no violations". This is the thing that
|
|
9
|
+
* notices.
|
|
10
|
+
*
|
|
11
|
+
* A suite is a directory holding one deliberately-broken `<rule>.fixture.ts(x)`
|
|
12
|
+
* per rule. The check asserts a positive: every rule fired, each on the file
|
|
13
|
+
* named after it.
|
|
14
|
+
*
|
|
15
|
+
* Run the package's own suite from a consumer's repo root:
|
|
16
|
+
*
|
|
17
|
+
* npx rdj-lint-verify
|
|
18
|
+
*
|
|
19
|
+
* ---------------------------------------------------------------------------
|
|
20
|
+
* Why the symlink dance
|
|
21
|
+
* ---------------------------------------------------------------------------
|
|
22
|
+
* The fixtures ship inside `node_modules`, which oxlint never walks, and a
|
|
23
|
+
* consumer's own fixture directories are usually in `lint.ignorePatterns` so a
|
|
24
|
+
* plain `vp check` stays quiet. Measured on Vite+ 0.2.9 / oxlint 1.77.0 and
|
|
25
|
+
* again on 0.3.1 / oxlint 1.81.0: no flag re-includes an ignored path.
|
|
26
|
+
* `--no-ignore`, `--ignore-pattern '!<dir>/**'`, an explicit file, an absolute
|
|
27
|
+
* path, a cwd inside the directory and `-W <rule>` all answer "No files found
|
|
28
|
+
* to lint." `--no-ignore` only disables `.eslintignore`, `--ignore-path` and
|
|
29
|
+
* `--ignore-pattern`; it does not touch the config's own `ignorePatterns`, and
|
|
30
|
+
* `vp lint` has no `--config` flag.
|
|
31
|
+
*
|
|
32
|
+
* What does work: oxlint matches ignore patterns against the path it walked,
|
|
33
|
+
* not the realpath. Linting through a symlink outside the ignored prefix
|
|
34
|
+
* reaches the fixtures normally, plugin and all. This creates that view per
|
|
35
|
+
* suite, lints through it, and removes it in a `finally`.
|
|
36
|
+
*
|
|
37
|
+
* The severities cannot come from the command line either: `-A`, `-W` and `-D`
|
|
38
|
+
* reach built-in rules only and leave every JS plugin rule exactly as the config
|
|
39
|
+
* left it (measured on vite-plus 0.3.1 / oxlint 1.81.0, with `vp lint` and with
|
|
40
|
+
* the bare binary). That is why the consumer's config must carry the
|
|
41
|
+
* `fixtures()` override from `@rdjperron/lint/config`.
|
|
42
|
+
*/
|
|
43
|
+
export interface Suite {
|
|
44
|
+
/** The plugin alias the diagnostics carry, e.g. `rdj` in `rdj(no-reflect-get)`. */
|
|
45
|
+
plugin: string;
|
|
46
|
+
/** The fixture directory, relative to `root`. */
|
|
47
|
+
fixtureDir: string;
|
|
48
|
+
/** Where the un-ignored view is created, relative to `root`. */
|
|
49
|
+
viewDir: string;
|
|
50
|
+
/** Fixture file endings; the part before one of them is the rule name. */
|
|
51
|
+
suffixes?: string[];
|
|
52
|
+
/** Skip the direct path and always lint through the view (fixtures under `node_modules`). */
|
|
53
|
+
alwaysView?: boolean;
|
|
54
|
+
/** Advisory: the rule names the plugin registers, so a new rule without a fixture is named. */
|
|
55
|
+
registeredRules?: () => Promise<string[] | null>;
|
|
56
|
+
/** Where the failure message sends the reader. */
|
|
57
|
+
readme?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface VerifyOptions {
|
|
60
|
+
/** The repo root the paths are relative to and `vp lint` runs from. Defaults to the cwd. */
|
|
61
|
+
root?: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Locate the `vp` binary: PATH first, then the default install locations, the
|
|
65
|
+
* XDG layout used since Vite+ 0.3.0 and the pre-0.3.0 single-root layout that
|
|
66
|
+
* upgraded installs keep.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveViteplusBinary(): string;
|
|
69
|
+
/**
|
|
70
|
+
* Lint every suite and print one table each. Returns the number of rules that
|
|
71
|
+
* did not fire, so zero means every rule of every suite is alive.
|
|
72
|
+
*/
|
|
73
|
+
export declare function verifySuites(suites: Suite[], options?: VerifyOptions): Promise<number>;
|
|
74
|
+
/**
|
|
75
|
+
* Two promises about the plugin API, held here as a failure instead.
|
|
76
|
+
*
|
|
77
|
+
* - the installed `@oxlint/plugins` is the exact version `vite-plus` declares;
|
|
78
|
+
* - this package's peer range accepts that version.
|
|
79
|
+
*
|
|
80
|
+
* The rules import `@oxlint/plugins`, so the installed one must be the one the
|
|
81
|
+
* linter was built against, or the rules compile against one plugin API and run
|
|
82
|
+
* under another with no error anywhere. Returns the failures, empty when the
|
|
83
|
+
* pins agree or when `vite-plus` is not installed (a consumer on another
|
|
84
|
+
* toolchain has nothing to pin against).
|
|
85
|
+
*/
|
|
86
|
+
export declare function verifyPluginApiPin(root?: string): string[];
|
|
87
|
+
/** The suite for this package's own fixtures, as they sit in a consumer's `node_modules`. */
|
|
88
|
+
export declare function packageSuite(root?: string): Suite;
|
|
89
|
+
/** The bin: this package's suite, plus the plugin API pin, from the consumer's repo root. */
|
|
90
|
+
export declare function main(root?: string): Promise<number>;
|
|
91
|
+
//#endregion
|
|
92
|
+
//# sourceMappingURL=verify.d.mts.map
|