corsa-oxlint 0.10.0 → 0.11.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 +4 -4
- package/dist/checker.js +55 -0
- package/dist/checker.js.map +1 -1
- package/dist/node_map.js +1 -1
- package/dist/node_map.js.map +1 -1
- package/dist/oxlint_utils.d.ts +1 -1
- package/dist/oxlint_utils.js +1 -1
- package/dist/oxlint_utils.js.map +1 -1
- package/dist/parser_services.d.ts +1 -1
- package/dist/parser_services.js +1 -1
- package/dist/parser_services.js.map +1 -1
- package/dist/rule_tester.js +10 -7
- package/dist/rule_tester.js.map +1 -1
- package/dist/rules/native_bridge.js +25 -7
- package/dist/rules/native_bridge.js.map +1 -1
- package/dist/session.d.ts +33 -1
- package/dist/session.js +451 -19
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +18 -0
- package/package.json +29 -3
package/README.md
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
# corsa-oxlint
|
|
2
2
|
|
|
3
3
|
`corsa-oxlint` is a self-hosted type-aware framework for building Oxlint JS
|
|
4
|
-
plugins with real type information powered by
|
|
4
|
+
plugins with real type information powered by Corsa.
|
|
5
5
|
|
|
6
6
|
> [!WARNING]
|
|
7
7
|
> This package is still an early WIP.
|
|
8
8
|
> The core direction is stable, but the API surface will keep moving while
|
|
9
|
-
>
|
|
9
|
+
> Corsa upstream, Oxlint's JS plugin APIs, and the surrounding benchmarks are
|
|
10
10
|
> still evolving.
|
|
11
11
|
|
|
12
12
|
## What It Does
|
|
13
13
|
|
|
14
|
-
- exposes `OxlintUtils.RuleCreator()` and `getParserServices()` backed by
|
|
14
|
+
- exposes `OxlintUtils.RuleCreator()` and `getParserServices()` backed by Corsa
|
|
15
15
|
- exposes compatibility namespaces such as `ESLintUtils`, `TSESLint`, `TSESTree`, and `TSUtils`
|
|
16
16
|
- keeps a compact self-hosted helper surface with no extra lint-framework dependency
|
|
17
17
|
- binds Rust-implemented hot paths into JS through `napi-rs`
|
|
@@ -80,7 +80,7 @@ export default [
|
|
|
80
80
|
parserOptions: {
|
|
81
81
|
project: ["./tsconfig.json"],
|
|
82
82
|
tsconfigRootDir: import.meta.dirname,
|
|
83
|
-
|
|
83
|
+
corsa: {
|
|
84
84
|
executable: "./.cache/tsgo",
|
|
85
85
|
mode: "msgpack",
|
|
86
86
|
requestTimeoutMs: 30000,
|
package/dist/checker.js
CHANGED
|
@@ -37,6 +37,18 @@ function createTypeChecker(context) {
|
|
|
37
37
|
const lookupNode = nodeForTypeLookup(node);
|
|
38
38
|
return sessionForContext(context).session.getSymbolAtPosition(filenameFor(context, lookupNode), toPosition(lookupNode), sourceTextFor(context, lookupNode));
|
|
39
39
|
},
|
|
40
|
+
getSymbol(symbol) {
|
|
41
|
+
return sessionForContext(context).session.getSymbol(symbol);
|
|
42
|
+
},
|
|
43
|
+
getSymbolById(id) {
|
|
44
|
+
return sessionForContext(context).session.getSymbol(id);
|
|
45
|
+
},
|
|
46
|
+
getNode(node) {
|
|
47
|
+
return sessionForContext(context).session.getNode(node);
|
|
48
|
+
},
|
|
49
|
+
getNodeById(id) {
|
|
50
|
+
return sessionForContext(context).session.getNode(id);
|
|
51
|
+
},
|
|
40
52
|
getTypeOfSymbol(symbol) {
|
|
41
53
|
return sessionForContext(context).session.getTypeOfSymbol(symbol);
|
|
42
54
|
},
|
|
@@ -76,9 +88,52 @@ function createTypeChecker(context) {
|
|
|
76
88
|
},
|
|
77
89
|
getTypeArguments(type) {
|
|
78
90
|
return sessionForContext(context).session.getTypeArguments(type);
|
|
91
|
+
},
|
|
92
|
+
getTypesOfType(type) {
|
|
93
|
+
return sessionForContext(context).session.getTypesOfType(type);
|
|
94
|
+
},
|
|
95
|
+
getTargetOfType(type) {
|
|
96
|
+
return sessionForContext(context).session.getTargetOfType(type);
|
|
97
|
+
},
|
|
98
|
+
getTypeParametersOfType(type) {
|
|
99
|
+
return sessionForContext(context).session.getTypeParametersOfType(type);
|
|
100
|
+
},
|
|
101
|
+
getOuterTypeParametersOfType(type) {
|
|
102
|
+
return sessionForContext(context).session.getOuterTypeParametersOfType(type);
|
|
103
|
+
},
|
|
104
|
+
getLocalTypeParametersOfType(type) {
|
|
105
|
+
return sessionForContext(context).session.getLocalTypeParametersOfType(type);
|
|
106
|
+
},
|
|
107
|
+
getObjectTypeOfType(type) {
|
|
108
|
+
return sessionForContext(context).session.getObjectTypeOfType(type);
|
|
109
|
+
},
|
|
110
|
+
getIndexTypeOfType(type) {
|
|
111
|
+
return sessionForContext(context).session.getIndexTypeOfType(type);
|
|
112
|
+
},
|
|
113
|
+
getCheckTypeOfType(type) {
|
|
114
|
+
return sessionForContext(context).session.getCheckTypeOfType(type);
|
|
115
|
+
},
|
|
116
|
+
getExtendsTypeOfType(type) {
|
|
117
|
+
return sessionForContext(context).session.getExtendsTypeOfType(type);
|
|
118
|
+
},
|
|
119
|
+
getBaseTypeOfType(type) {
|
|
120
|
+
return sessionForContext(context).session.getBaseTypeOfType(type);
|
|
121
|
+
},
|
|
122
|
+
getConstraintOfType(type) {
|
|
123
|
+
return sessionForContext(context).session.getConstraintOfType(type);
|
|
124
|
+
},
|
|
125
|
+
isUnionType(type) {
|
|
126
|
+
return (type.flags & typeFlags.union) !== 0;
|
|
127
|
+
},
|
|
128
|
+
isIntersectionType(type) {
|
|
129
|
+
return (type.flags & typeFlags.intersection) !== 0;
|
|
79
130
|
}
|
|
80
131
|
};
|
|
81
132
|
}
|
|
133
|
+
const typeFlags = {
|
|
134
|
+
union: 1 << 27,
|
|
135
|
+
intersection: 1 << 28
|
|
136
|
+
};
|
|
82
137
|
function sourceTextFor(context, node) {
|
|
83
138
|
return filenameFor(context, node) === context.filename ? context.sourceCode.text : void 0;
|
|
84
139
|
}
|
package/dist/checker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checker.js","names":[],"sources":["../ts/checker.ts"],"sourcesContent":["import type { Node } from \"@oxlint/plugins\";\n\nimport { createNodeMaps, toPosition } from \"./node_map\";\nimport { sessionForContext } from \"./registry\";\nimport type {\n ContextWithParserOptions,\n TsgoNode,\n TsgoProgramShape,\n TsgoSignature,\n TsgoSymbol,\n TsgoType,\n TsgoTypeCheckerShape,\n} from \"./types\";\n\nexport function createProgram(\n context: ContextWithParserOptions,\n): TsgoProgramShape & { readonly nodeMaps: ReturnType<typeof createNodeMaps> } {\n const nodeMaps = createNodeMaps(context);\n return {\n nodeMaps,\n getCompilerOptions() {\n return sessionForContext(context).session.getCompilerOptions();\n },\n getCurrentDirectory() {\n return sessionForContext(context).project.rootDir;\n },\n getRootFileNames() {\n return sessionForContext(context).session.getRootFileNames();\n },\n getSourceFile(fileName = context.filename) {\n return { fileName, text: context.sourceCode.text };\n },\n getTypeChecker() {\n return createTypeChecker(context);\n },\n };\n}\n\nexport function createTypeChecker(context: ContextWithParserOptions): TsgoTypeCheckerShape {\n return {\n getTypeAtLocation(node) {\n const lookupNode = nodeForTypeLookup(node);\n return sessionForContext(context).session.getTypeAtPosition(\n filenameFor(context, lookupNode),\n toPosition(lookupNode),\n sourceTextFor(context, lookupNode),\n );\n },\n getContextualType(node) {\n return this.getTypeAtLocation(node);\n },\n getSymbolAtLocation(node) {\n const lookupNode = nodeForTypeLookup(node);\n return sessionForContext(context).session.getSymbolAtPosition(\n filenameFor(context, lookupNode),\n toPosition(lookupNode),\n sourceTextFor(context, lookupNode),\n );\n },\n getTypeOfSymbol(symbol) {\n return sessionForContext(context).session.getTypeOfSymbol(symbol);\n },\n getDeclaredTypeOfSymbol(symbol) {\n return sessionForContext(context).session.getDeclaredTypeOfSymbol(symbol);\n },\n getTypeOfSymbolAtLocation(symbol, node) {\n return this.getTypeAtLocation(node) ?? this.getTypeOfSymbol(symbol);\n },\n typeToString(type, enclosingDeclaration, flags) {\n void enclosingDeclaration;\n return sessionForContext(context).session.typeToString(type, flags);\n },\n getBaseTypeOfLiteralType(type) {\n return sessionForContext(context).session.getBaseTypeOfLiteralType(type);\n },\n getPropertiesOfType(type) {\n return sessionForContext(context).session.getPropertiesOfType(type);\n },\n getSignaturesOfType(type, kind) {\n return sessionForContext(context).session.getSignaturesOfType(type, kind);\n },\n getReturnTypeOfSignature(signature) {\n return sessionForContext(context).session.getReturnTypeOfSignature(signature);\n },\n getTypePredicateOfSignature(signature) {\n return sessionForContext(context).session.getTypePredicateOfSignature(signature);\n },\n getBaseTypes(type) {\n return sessionForContext(context).session.getBaseTypes(type);\n },\n getImplementedTypes(node) {\n return implementedClauseNodes(node)\n .map((clause) => {\n const expression = implementedClauseChildNode(clause, \"expression\") ?? clause;\n const symbol = this.getSymbolAtLocation(expression) ?? this.getSymbolAtLocation(clause);\n return symbol\n ? (this.getDeclaredTypeOfSymbol(symbol) ?? this.getTypeOfSymbol(symbol))\n : (this.getTypeAtLocation(expression) ?? this.getTypeAtLocation(clause));\n })\n .filter((type): type is TsgoType => type !== undefined);\n },\n getTypeArguments(type) {\n return sessionForContext(context).session.getTypeArguments(type);\n },\n };\n}\n\nfunction sourceTextFor(\n context: ContextWithParserOptions,\n node: Node | TsgoNode | TsgoType | TsgoSymbol | TsgoSignature,\n): string | undefined {\n return filenameFor(context, node) === context.filename ? context.sourceCode.text : undefined;\n}\n\nfunction nodeForTypeLookup(node: Node | TsgoNode): Node | TsgoNode {\n if (\"pos\" in node) {\n return node;\n }\n switch ((node as { readonly type?: string }).type) {\n case \"ClassDeclaration\":\n case \"ClassExpression\":\n return childNode(node, \"id\") ?? node;\n case \"TSPropertySignature\":\n return childNode(node, \"key\") ?? node;\n default:\n return node;\n }\n}\n\nfunction childNode(node: Node, key: string): Node | undefined {\n const value = (node as unknown as Record<string, unknown>)[key];\n if (isNode(value)) {\n return value;\n }\n return undefined;\n}\n\nfunction implementedClauseNodes(node: Node | TsgoNode): readonly Node[] {\n if (\"pos\" in node) {\n return [];\n }\n const clauses = (node as unknown as { readonly implements?: unknown }).implements;\n if (!Array.isArray(clauses)) {\n return [];\n }\n return clauses.filter(isNode);\n}\n\nfunction implementedClauseChildNode(node: Node, key: string): Node | undefined {\n const value = (node as unknown as Record<string, unknown>)[key];\n if (isNode(value)) {\n return value;\n }\n return undefined;\n}\n\nfunction isNode(value: unknown): value is Node {\n return typeof value === \"object\" && value !== null && \"type\" in value && \"range\" in value;\n}\n\nfunction filenameFor(\n context: ContextWithParserOptions,\n node: Node | TsgoNode | TsgoType | TsgoSymbol | TsgoSignature,\n): string {\n if (\"fileName\" in node) {\n return node.fileName;\n }\n return context.filename;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"checker.js","names":[],"sources":["../ts/checker.ts"],"sourcesContent":["import type { Node } from \"@oxlint/plugins\";\n\nimport { createNodeMaps, toPosition } from \"./node_map\";\nimport { sessionForContext } from \"./registry\";\nimport type {\n ContextWithParserOptions,\n TsgoNode,\n TsgoProgramShape,\n TsgoSignature,\n TsgoSymbol,\n TsgoType,\n TsgoTypeCheckerShape,\n} from \"./types\";\n\nexport function createProgram(\n context: ContextWithParserOptions,\n): TsgoProgramShape & { readonly nodeMaps: ReturnType<typeof createNodeMaps> } {\n const nodeMaps = createNodeMaps(context);\n return {\n nodeMaps,\n getCompilerOptions() {\n return sessionForContext(context).session.getCompilerOptions();\n },\n getCurrentDirectory() {\n return sessionForContext(context).project.rootDir;\n },\n getRootFileNames() {\n return sessionForContext(context).session.getRootFileNames();\n },\n getSourceFile(fileName = context.filename) {\n return { fileName, text: context.sourceCode.text };\n },\n getTypeChecker() {\n return createTypeChecker(context);\n },\n };\n}\n\nexport function createTypeChecker(context: ContextWithParserOptions): TsgoTypeCheckerShape {\n return {\n getTypeAtLocation(node) {\n const lookupNode = nodeForTypeLookup(node);\n return sessionForContext(context).session.getTypeAtPosition(\n filenameFor(context, lookupNode),\n toPosition(lookupNode),\n sourceTextFor(context, lookupNode),\n );\n },\n getContextualType(node) {\n return this.getTypeAtLocation(node);\n },\n getSymbolAtLocation(node) {\n const lookupNode = nodeForTypeLookup(node);\n return sessionForContext(context).session.getSymbolAtPosition(\n filenameFor(context, lookupNode),\n toPosition(lookupNode),\n sourceTextFor(context, lookupNode),\n );\n },\n getSymbol(symbol) {\n return sessionForContext(context).session.getSymbol(symbol);\n },\n getSymbolById(id) {\n return sessionForContext(context).session.getSymbol(id);\n },\n getNode(node) {\n return sessionForContext(context).session.getNode(node);\n },\n getNodeById(id) {\n return sessionForContext(context).session.getNode(id);\n },\n getTypeOfSymbol(symbol) {\n return sessionForContext(context).session.getTypeOfSymbol(symbol);\n },\n getDeclaredTypeOfSymbol(symbol) {\n return sessionForContext(context).session.getDeclaredTypeOfSymbol(symbol);\n },\n getTypeOfSymbolAtLocation(symbol, node) {\n return this.getTypeAtLocation(node) ?? this.getTypeOfSymbol(symbol);\n },\n typeToString(type, enclosingDeclaration, flags) {\n void enclosingDeclaration;\n return sessionForContext(context).session.typeToString(type, flags);\n },\n getBaseTypeOfLiteralType(type) {\n return sessionForContext(context).session.getBaseTypeOfLiteralType(type);\n },\n getPropertiesOfType(type) {\n return sessionForContext(context).session.getPropertiesOfType(type);\n },\n getSignaturesOfType(type, kind) {\n return sessionForContext(context).session.getSignaturesOfType(type, kind);\n },\n getReturnTypeOfSignature(signature) {\n return sessionForContext(context).session.getReturnTypeOfSignature(signature);\n },\n getTypePredicateOfSignature(signature) {\n return sessionForContext(context).session.getTypePredicateOfSignature(signature);\n },\n getBaseTypes(type) {\n return sessionForContext(context).session.getBaseTypes(type);\n },\n getImplementedTypes(node) {\n return implementedClauseNodes(node)\n .map((clause) => {\n const expression = implementedClauseChildNode(clause, \"expression\") ?? clause;\n const symbol = this.getSymbolAtLocation(expression) ?? this.getSymbolAtLocation(clause);\n return symbol\n ? (this.getDeclaredTypeOfSymbol(symbol) ?? this.getTypeOfSymbol(symbol))\n : (this.getTypeAtLocation(expression) ?? this.getTypeAtLocation(clause));\n })\n .filter((type): type is TsgoType => type !== undefined);\n },\n getTypeArguments(type) {\n return sessionForContext(context).session.getTypeArguments(type);\n },\n getTypesOfType(type) {\n return sessionForContext(context).session.getTypesOfType(type);\n },\n getTargetOfType(type) {\n return sessionForContext(context).session.getTargetOfType(type);\n },\n getTypeParametersOfType(type) {\n return sessionForContext(context).session.getTypeParametersOfType(type);\n },\n getOuterTypeParametersOfType(type) {\n return sessionForContext(context).session.getOuterTypeParametersOfType(type);\n },\n getLocalTypeParametersOfType(type) {\n return sessionForContext(context).session.getLocalTypeParametersOfType(type);\n },\n getObjectTypeOfType(type) {\n return sessionForContext(context).session.getObjectTypeOfType(type);\n },\n getIndexTypeOfType(type) {\n return sessionForContext(context).session.getIndexTypeOfType(type);\n },\n getCheckTypeOfType(type) {\n return sessionForContext(context).session.getCheckTypeOfType(type);\n },\n getExtendsTypeOfType(type) {\n return sessionForContext(context).session.getExtendsTypeOfType(type);\n },\n getBaseTypeOfType(type) {\n return sessionForContext(context).session.getBaseTypeOfType(type);\n },\n getConstraintOfType(type) {\n return sessionForContext(context).session.getConstraintOfType(type);\n },\n isUnionType(type) {\n return (type.flags & typeFlags.union) !== 0;\n },\n isIntersectionType(type) {\n return (type.flags & typeFlags.intersection) !== 0;\n },\n };\n}\n\nconst typeFlags = {\n union: 1 << 27,\n intersection: 1 << 28,\n} as const;\n\nfunction sourceTextFor(\n context: ContextWithParserOptions,\n node: Node | TsgoNode | TsgoType | TsgoSymbol | TsgoSignature,\n): string | undefined {\n return filenameFor(context, node) === context.filename ? context.sourceCode.text : undefined;\n}\n\nfunction nodeForTypeLookup(node: Node | TsgoNode): Node | TsgoNode {\n if (\"pos\" in node) {\n return node;\n }\n switch ((node as { readonly type?: string }).type) {\n case \"ClassDeclaration\":\n case \"ClassExpression\":\n return childNode(node, \"id\") ?? node;\n case \"TSPropertySignature\":\n return childNode(node, \"key\") ?? node;\n default:\n return node;\n }\n}\n\nfunction childNode(node: Node, key: string): Node | undefined {\n const value = (node as unknown as Record<string, unknown>)[key];\n if (isNode(value)) {\n return value;\n }\n return undefined;\n}\n\nfunction implementedClauseNodes(node: Node | TsgoNode): readonly Node[] {\n if (\"pos\" in node) {\n return [];\n }\n const clauses = (node as unknown as { readonly implements?: unknown }).implements;\n if (!Array.isArray(clauses)) {\n return [];\n }\n return clauses.filter(isNode);\n}\n\nfunction implementedClauseChildNode(node: Node, key: string): Node | undefined {\n const value = (node as unknown as Record<string, unknown>)[key];\n if (isNode(value)) {\n return value;\n }\n return undefined;\n}\n\nfunction isNode(value: unknown): value is Node {\n return typeof value === \"object\" && value !== null && \"type\" in value && \"range\" in value;\n}\n\nfunction filenameFor(\n context: ContextWithParserOptions,\n node: Node | TsgoNode | TsgoType | TsgoSymbol | TsgoSignature,\n): string {\n if (\"fileName\" in node) {\n return node.fileName;\n }\n return context.filename;\n}\n"],"mappings":"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"}
|
package/dist/node_map.js
CHANGED
|
@@ -20,7 +20,7 @@ function createNodeMaps(context) {
|
|
|
20
20
|
tsNodeToESTreeNodeMap: {
|
|
21
21
|
get(node) {
|
|
22
22
|
const value = tsgoToEstree.get(node);
|
|
23
|
-
if (!value) throw new Error("corsa-oxlint could not map
|
|
23
|
+
if (!value) throw new Error("corsa-oxlint could not map Corsa node back to ESTree");
|
|
24
24
|
return value;
|
|
25
25
|
},
|
|
26
26
|
has(node) {
|
package/dist/node_map.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node_map.js","names":[],"sources":["../ts/node_map.ts"],"sourcesContent":["import type { Node } from \"@oxlint/plugins\";\n\nimport type { ContextWithParserOptions, TsgoNode } from \"./types\";\n\nconst estreeToTsgo = new WeakMap<object, TsgoNode>();\nconst tsgoToEstree = new WeakMap<object, Node>();\n\nexport function createNodeMaps(context: ContextWithParserOptions): {\n esTreeNodeToTSNodeMap: {\n get(node: Node): TsgoNode;\n has(node: Node): boolean;\n };\n tsNodeToESTreeNodeMap: {\n get(node: TsgoNode): Node;\n has(node: TsgoNode): boolean;\n };\n} {\n return {\n esTreeNodeToTSNodeMap: {\n get(node) {\n let current = estreeToTsgo.get(node);\n if (!current) {\n current = createTsgoNode(context.filename, node);\n estreeToTsgo.set(node, current);\n tsgoToEstree.set(current, node);\n }\n return current;\n },\n has(node) {\n return estreeToTsgo.has(node);\n },\n },\n tsNodeToESTreeNodeMap: {\n get(node) {\n const value = tsgoToEstree.get(node);\n if (!value) {\n throw new Error(\"corsa-oxlint could not map
|
|
1
|
+
{"version":3,"file":"node_map.js","names":[],"sources":["../ts/node_map.ts"],"sourcesContent":["import type { Node } from \"@oxlint/plugins\";\n\nimport type { ContextWithParserOptions, TsgoNode } from \"./types\";\n\nconst estreeToTsgo = new WeakMap<object, TsgoNode>();\nconst tsgoToEstree = new WeakMap<object, Node>();\n\nexport function createNodeMaps(context: ContextWithParserOptions): {\n esTreeNodeToTSNodeMap: {\n get(node: Node): TsgoNode;\n has(node: Node): boolean;\n };\n tsNodeToESTreeNodeMap: {\n get(node: TsgoNode): Node;\n has(node: TsgoNode): boolean;\n };\n} {\n return {\n esTreeNodeToTSNodeMap: {\n get(node) {\n let current = estreeToTsgo.get(node);\n if (!current) {\n current = createTsgoNode(context.filename, node);\n estreeToTsgo.set(node, current);\n tsgoToEstree.set(current, node);\n }\n return current;\n },\n has(node) {\n return estreeToTsgo.has(node);\n },\n },\n tsNodeToESTreeNodeMap: {\n get(node) {\n const value = tsgoToEstree.get(node);\n if (!value) {\n throw new Error(\"corsa-oxlint could not map Corsa node back to ESTree\");\n }\n return value;\n },\n has(node) {\n return tsgoToEstree.has(node);\n },\n },\n };\n}\n\nexport function toPosition(node: Node | TsgoNode): number {\n return \"pos\" in node ? node.pos : assertRange(node)[0];\n}\n\nfunction createTsgoNode(fileName: string, node: Node): TsgoNode {\n const [pos, end] = assertRange(node);\n return {\n fileName,\n pos,\n end,\n range: [pos, end],\n };\n}\n\nfunction assertRange(node: Node): readonly [number, number] {\n const range = (node as Node & { range?: readonly [number, number] }).range;\n if (!range) {\n throw new Error(\"corsa-oxlint requires ESTree nodes with range data\");\n }\n return range;\n}\n"],"mappings":";AAIA,MAAM,+BAAe,IAAI,SAA2B;AACpD,MAAM,+BAAe,IAAI,SAAuB;AAEhD,SAAgB,eAAe,SAS7B;CACA,OAAO;EACL,uBAAuB;GACrB,IAAI,MAAM;IACR,IAAI,UAAU,aAAa,IAAI,KAAK;IACpC,IAAI,CAAC,SAAS;KACZ,UAAU,eAAe,QAAQ,UAAU,KAAK;KAChD,aAAa,IAAI,MAAM,QAAQ;KAC/B,aAAa,IAAI,SAAS,KAAK;;IAEjC,OAAO;;GAET,IAAI,MAAM;IACR,OAAO,aAAa,IAAI,KAAK;;GAEhC;EACD,uBAAuB;GACrB,IAAI,MAAM;IACR,MAAM,QAAQ,aAAa,IAAI,KAAK;IACpC,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,uDAAuD;IAEzE,OAAO;;GAET,IAAI,MAAM;IACR,OAAO,aAAa,IAAI,KAAK;;GAEhC;EACF;;AAGH,SAAgB,WAAW,MAA+B;CACxD,OAAO,SAAS,OAAO,KAAK,MAAM,YAAY,KAAK,CAAC;;AAGtD,SAAS,eAAe,UAAkB,MAAsB;CAC9D,MAAM,CAAC,KAAK,OAAO,YAAY,KAAK;CACpC,OAAO;EACL;EACA;EACA;EACA,OAAO,CAAC,KAAK,IAAI;EAClB;;AAGH,SAAS,YAAY,MAAuC;CAC1D,MAAM,QAAS,KAAsD;CACrE,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,qDAAqD;CAEvE,OAAO"}
|
package/dist/oxlint_utils.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ type RuleCreatorCreatedRule<TRule extends RuleCreatorRule> = Omit<TRule, "defaul
|
|
|
23
23
|
} & Rule & Record<string, unknown>;
|
|
24
24
|
type RuleCreatorFactory = <TRule extends RuleCreatorRule>(rule: TRule) => RuleCreatorCreatedRule<TRule>;
|
|
25
25
|
/**
|
|
26
|
-
* Self-hosted type-aware utilities for Oxlint rules backed by
|
|
26
|
+
* Self-hosted type-aware utilities for Oxlint rules backed by Corsa.
|
|
27
27
|
*/
|
|
28
28
|
declare const OxlintUtils: Readonly<{
|
|
29
29
|
RuleCreator(urlCreator: (ruleName: string) => string): RuleCreatorFactory;
|
package/dist/oxlint_utils.js
CHANGED
|
@@ -2,7 +2,7 @@ import { getParserServices } from "./parser_services.js";
|
|
|
2
2
|
import { decorateRule } from "./plugin.js";
|
|
3
3
|
//#region src/bindings/nodejs/typescript_oxlint/ts/oxlint_utils.ts
|
|
4
4
|
/**
|
|
5
|
-
* Self-hosted type-aware utilities for Oxlint rules backed by
|
|
5
|
+
* Self-hosted type-aware utilities for Oxlint rules backed by Corsa.
|
|
6
6
|
*/
|
|
7
7
|
const OxlintUtils = Object.freeze({
|
|
8
8
|
RuleCreator(urlCreator) {
|
package/dist/oxlint_utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oxlint_utils.js","names":[],"sources":["../ts/oxlint_utils.ts"],"sourcesContent":["import type { Rule, RuleMeta, Visitor } from \"@oxlint/plugins\";\n\nimport { getParserServices } from \"./parser_services\";\nimport { decorateRule } from \"./plugin\";\nimport type { ContextWithParserOptions } from \"./types\";\n\nexport type RuleCreatorRule<\n TOptions extends readonly unknown[] = readonly unknown[],\n TMessageIds extends string = string,\n> = {\n readonly name: string;\n readonly meta: RuleMeta & {\n readonly messages?: Record<TMessageIds, string>;\n };\n readonly defaultOptions?: TOptions;\n readonly create: (context: ContextWithParserOptions) => Visitor;\n};\n\nexport type RuleCreatorCreatedRule<TRule extends RuleCreatorRule> = Omit<\n TRule,\n \"defaultOptions\" | \"meta\"\n> & {\n readonly defaultOptions: TRule extends { readonly defaultOptions: infer TOptions }\n ? TOptions\n : readonly [];\n readonly meta: TRule[\"meta\"] & {\n readonly docs: NonNullable<TRule[\"meta\"][\"docs\"]> & {\n readonly url: string;\n };\n };\n} & Rule &\n Record<string, unknown>;\n\nexport type RuleCreatorFactory = <TRule extends RuleCreatorRule>(\n rule: TRule,\n) => RuleCreatorCreatedRule<TRule>;\n\n/**\n * Self-hosted type-aware utilities for Oxlint rules backed by
|
|
1
|
+
{"version":3,"file":"oxlint_utils.js","names":[],"sources":["../ts/oxlint_utils.ts"],"sourcesContent":["import type { Rule, RuleMeta, Visitor } from \"@oxlint/plugins\";\n\nimport { getParserServices } from \"./parser_services\";\nimport { decorateRule } from \"./plugin\";\nimport type { ContextWithParserOptions } from \"./types\";\n\nexport type RuleCreatorRule<\n TOptions extends readonly unknown[] = readonly unknown[],\n TMessageIds extends string = string,\n> = {\n readonly name: string;\n readonly meta: RuleMeta & {\n readonly messages?: Record<TMessageIds, string>;\n };\n readonly defaultOptions?: TOptions;\n readonly create: (context: ContextWithParserOptions) => Visitor;\n};\n\nexport type RuleCreatorCreatedRule<TRule extends RuleCreatorRule> = Omit<\n TRule,\n \"defaultOptions\" | \"meta\"\n> & {\n readonly defaultOptions: TRule extends { readonly defaultOptions: infer TOptions }\n ? TOptions\n : readonly [];\n readonly meta: TRule[\"meta\"] & {\n readonly docs: NonNullable<TRule[\"meta\"][\"docs\"]> & {\n readonly url: string;\n };\n };\n} & Rule &\n Record<string, unknown>;\n\nexport type RuleCreatorFactory = <TRule extends RuleCreatorRule>(\n rule: TRule,\n) => RuleCreatorCreatedRule<TRule>;\n\n/**\n * Self-hosted type-aware utilities for Oxlint rules backed by Corsa.\n */\nexport const OxlintUtils = Object.freeze({\n RuleCreator(urlCreator: (ruleName: string) => string): RuleCreatorFactory {\n return ((rule) => {\n const docs = rule.meta?.docs;\n return decorateRule({\n ...rule,\n meta: {\n ...rule.meta,\n docs: {\n ...docs,\n url: urlCreator(rule.name),\n },\n },\n defaultOptions: rule.defaultOptions ?? [],\n } as unknown as Rule) as RuleCreatorCreatedRule<typeof rule>;\n }) as RuleCreatorFactory;\n },\n getParserServices(context: ContextWithParserOptions, allowWithoutFullTypeInformation = false) {\n return getParserServices(context, allowWithoutFullTypeInformation);\n },\n});\n\nexport const NullThrowsReasons = Object.freeze({\n MissingParent: \"Expected node to have a parent.\",\n MissingToken: (token: string, thing: string) => `Expected to find a ${token} for the ${thing}.`,\n});\n\nexport const RuleCreator = Object.assign(OxlintUtils.RuleCreator, {\n withoutDocs<TRule extends Omit<RuleCreatorRule, \"name\">>(\n rule: TRule,\n ): Omit<TRule, \"defaultOptions\"> &\n Rule & {\n readonly defaultOptions: TRule extends { readonly defaultOptions: infer TOptions }\n ? TOptions\n : readonly [];\n } {\n return decorateRule({\n ...rule,\n defaultOptions: rule.defaultOptions ?? [],\n } as unknown as Rule) as never;\n },\n});\nexport { getParserServices } from \"./parser_services\";\n\nexport function applyDefault<User extends readonly unknown[], Defaults extends readonly unknown[]>(\n defaultOptions: Defaults,\n userOptions: User | null | undefined,\n): readonly unknown[] {\n const options = structuredClone(defaultOptions) as unknown as unknown[];\n if (userOptions == null) {\n return options;\n }\n options.forEach((option, index) => {\n if (userOptions[index] === undefined) {\n return;\n }\n const userOption = userOptions[index];\n options[index] =\n isObjectNotArray(option) && isObjectNotArray(userOption)\n ? deepMerge(option, userOption)\n : userOption;\n });\n return options;\n}\n\nexport function deepMerge<T>(base: T, override: unknown): T {\n if (isObject(base) && isObject(override)) {\n return Object.fromEntries(\n [...new Set([...Object.keys(base), ...Object.keys(override)])].map((key) => [\n key,\n key in base && key in override\n ? deepMerge((base as any)[key], (override as any)[key])\n : key in base\n ? (base as any)[key]\n : (override as any)[key],\n ]),\n ) as T;\n }\n return (override === undefined ? base : override) as T;\n}\n\nexport function nullThrows<T>(\n value: T | null | undefined,\n message = \"Expected value to be present\",\n): T {\n if (value == null) {\n throw new Error(`Non-null Assertion Failed: ${message}`);\n }\n return value;\n}\n\nexport function isObjectNotArray(value: unknown): value is Record<string, unknown> {\n return isObject(value);\n}\n\nexport const ESLintUtils = Object.freeze({\n NullThrowsReasons,\n RuleCreator,\n applyDefault,\n deepMerge,\n getParserServices,\n isObjectNotArray,\n nullThrows,\n});\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":";;;;;;AAwCA,MAAa,cAAc,OAAO,OAAO;CACvC,YAAY,YAA8D;EACxE,SAAS,SAAS;GAChB,MAAM,OAAO,KAAK,MAAM;GACxB,OAAO,aAAa;IAClB,GAAG;IACH,MAAM;KACJ,GAAG,KAAK;KACR,MAAM;MACJ,GAAG;MACH,KAAK,WAAW,KAAK,KAAK;MAC3B;KACF;IACD,gBAAgB,KAAK,kBAAkB,EAAE;IAC1C,CAAoB;;;CAGzB,kBAAkB,SAAmC,kCAAkC,OAAO;EAC5F,OAAO,kBAAkB,SAAS,gCAAgC;;CAErE,CAAC;AAEF,MAAa,oBAAoB,OAAO,OAAO;CAC7C,eAAe;CACf,eAAe,OAAe,UAAkB,sBAAsB,MAAM,WAAW,MAAM;CAC9F,CAAC;AAEF,MAAa,cAAc,OAAO,OAAO,YAAY,aAAa,EAChE,YACE,MAME;CACF,OAAO,aAAa;EAClB,GAAG;EACH,gBAAgB,KAAK,kBAAkB,EAAE;EAC1C,CAAoB;GAExB,CAAC;AAGF,SAAgB,aACd,gBACA,aACoB;CACpB,MAAM,UAAU,gBAAgB,eAAe;CAC/C,IAAI,eAAe,MACjB,OAAO;CAET,QAAQ,SAAS,QAAQ,UAAU;EACjC,IAAI,YAAY,WAAW,KAAA,GACzB;EAEF,MAAM,aAAa,YAAY;EAC/B,QAAQ,SACN,iBAAiB,OAAO,IAAI,iBAAiB,WAAW,GACpD,UAAU,QAAQ,WAAW,GAC7B;GACN;CACF,OAAO;;AAGT,SAAgB,UAAa,MAAS,UAAsB;CAC1D,IAAI,SAAS,KAAK,IAAI,SAAS,SAAS,EACtC,OAAO,OAAO,YACZ,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,EAAE,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAC1E,KACA,OAAO,QAAQ,OAAO,WAClB,UAAW,KAAa,MAAO,SAAiB,KAAK,GACrD,OAAO,OACJ,KAAa,OACb,SAAiB,KACzB,CAAC,CACH;CAEH,OAAQ,aAAa,KAAA,IAAY,OAAO;;AAG1C,SAAgB,WACd,OACA,UAAU,gCACP;CACH,IAAI,SAAS,MACX,MAAM,IAAI,MAAM,8BAA8B,UAAU;CAE1D,OAAO;;AAGT,SAAgB,iBAAiB,OAAkD;CACjF,OAAO,SAAS,MAAM;;AAGxB,MAAa,cAAc,OAAO,OAAO;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM"}
|
|
@@ -2,7 +2,7 @@ import { ContextWithParserOptions, ParserServices } from "./types.js";
|
|
|
2
2
|
|
|
3
3
|
//#region src/bindings/nodejs/typescript_oxlint/ts/parser_services.d.ts
|
|
4
4
|
/**
|
|
5
|
-
* Returns type-aware parser services backed by
|
|
5
|
+
* Returns type-aware parser services backed by Corsa.
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* ```ts
|
package/dist/parser_services.js
CHANGED
|
@@ -3,7 +3,7 @@ import { createProgram, createTypeChecker } from "./checker.js";
|
|
|
3
3
|
//#region src/bindings/nodejs/typescript_oxlint/ts/parser_services.ts
|
|
4
4
|
const parserServices = /* @__PURE__ */ new WeakMap();
|
|
5
5
|
/**
|
|
6
|
-
* Returns type-aware parser services backed by
|
|
6
|
+
* Returns type-aware parser services backed by Corsa.
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
9
|
* ```ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser_services.js","names":[],"sources":["../ts/parser_services.ts"],"sourcesContent":["import { createProgram, createTypeChecker } from \"./checker\";\nimport { createNodeMaps } from \"./node_map\";\nimport type {\n ContextWithParserOptions,\n ParserServices,\n ParserServicesWithTypeInformation,\n} from \"./types\";\n\nconst parserServices = new WeakMap<object, ParserServices>();\n\n/**\n * Returns type-aware parser services backed by
|
|
1
|
+
{"version":3,"file":"parser_services.js","names":[],"sources":["../ts/parser_services.ts"],"sourcesContent":["import { createProgram, createTypeChecker } from \"./checker\";\nimport { createNodeMaps } from \"./node_map\";\nimport type {\n ContextWithParserOptions,\n ParserServices,\n ParserServicesWithTypeInformation,\n} from \"./types\";\n\nconst parserServices = new WeakMap<object, ParserServices>();\n\n/**\n * Returns type-aware parser services backed by Corsa.\n *\n * @example\n * ```ts\n * const services = getParserServices(context);\n * const checker = services.program.getTypeChecker();\n * ```\n */\nexport function getParserServices(\n context: ContextWithParserOptions,\n allowWithoutFullTypeInformation = false,\n): ParserServices {\n const current = parserServices.get(context);\n if (current) {\n return current;\n }\n try {\n const maps = createNodeMaps(context);\n const program = createProgram(context);\n const services: ParserServicesWithTypeInformation = {\n program,\n ...maps,\n hasFullTypeInformation: true,\n getTypeAtLocation(node) {\n return createTypeChecker(context).getTypeAtLocation(node);\n },\n getSymbolAtLocation(node) {\n return createTypeChecker(context).getSymbolAtLocation(node);\n },\n };\n parserServices.set(context, services);\n return services;\n } catch (error) {\n if (!allowWithoutFullTypeInformation) {\n throw error;\n }\n const fallback: ParserServices = {\n program: createProgram(context),\n ...createNodeMaps(context),\n hasFullTypeInformation: false,\n getTypeAtLocation() {\n return undefined;\n },\n getSymbolAtLocation() {\n return undefined;\n },\n };\n parserServices.set(context, fallback);\n return fallback;\n }\n}\n"],"mappings":";;;AAQA,MAAM,iCAAiB,IAAI,SAAiC;;;;;;;;;;AAW5D,SAAgB,kBACd,SACA,kCAAkC,OAClB;CAChB,MAAM,UAAU,eAAe,IAAI,QAAQ;CAC3C,IAAI,SACF,OAAO;CAET,IAAI;EACF,MAAM,OAAO,eAAe,QAAQ;EAEpC,MAAM,WAA8C;GAClD,SAFc,cAAc,QAErB;GACP,GAAG;GACH,wBAAwB;GACxB,kBAAkB,MAAM;IACtB,OAAO,kBAAkB,QAAQ,CAAC,kBAAkB,KAAK;;GAE3D,oBAAoB,MAAM;IACxB,OAAO,kBAAkB,QAAQ,CAAC,oBAAoB,KAAK;;GAE9D;EACD,eAAe,IAAI,SAAS,SAAS;EACrC,OAAO;UACA,OAAO;EACd,IAAI,CAAC,iCACH,MAAM;EAER,MAAM,WAA2B;GAC/B,SAAS,cAAc,QAAQ;GAC/B,GAAG,eAAe,QAAQ;GAC1B,wBAAwB;GACxB,oBAAoB;GAGpB,sBAAsB;GAGvB;EACD,eAAe,IAAI,SAAS,SAAS;EACrC,OAAO"}
|
package/dist/rule_tester.js
CHANGED
|
@@ -44,21 +44,24 @@ var RuleTester = class {
|
|
|
44
44
|
this.#inner = new RuleTester$1(config);
|
|
45
45
|
}
|
|
46
46
|
run(ruleName, rule, tests) {
|
|
47
|
-
const workspace = mkdtempSync(join(tmpdir(), "corsa-oxlint-"));
|
|
48
|
-
registerCleanup(workspace);
|
|
49
47
|
const transformed = {
|
|
50
|
-
valid: tests.valid.map((test) => prepareTestCase(
|
|
51
|
-
invalid: tests.invalid.map((test) => prepareTestCase(
|
|
48
|
+
valid: tests.valid.map((test, index) => prepareTestCase(createWorkspace(), test, this.#config, "valid", index)),
|
|
49
|
+
invalid: tests.invalid.map((test, index) => prepareTestCase(createWorkspace(), test, this.#config, "invalid", index))
|
|
52
50
|
};
|
|
53
51
|
this.#inner.run(ruleName, decorateRule(rule), transformed);
|
|
54
52
|
}
|
|
55
53
|
};
|
|
56
|
-
function
|
|
54
|
+
function createWorkspace() {
|
|
55
|
+
const workspace = mkdtempSync(join(tmpdir(), "corsa-oxlint-"));
|
|
56
|
+
registerCleanup(workspace);
|
|
57
|
+
return workspace;
|
|
58
|
+
}
|
|
59
|
+
function prepareTestCase(workspace, test, config, group, index) {
|
|
57
60
|
if (typeof test === "string") {
|
|
58
|
-
writeFixture(resolve(workspace,
|
|
61
|
+
writeFixture(resolve(workspace, `${group}-${index}.ts`), test);
|
|
59
62
|
return test;
|
|
60
63
|
}
|
|
61
|
-
const filename = resolve(workspace, test.filename ??
|
|
64
|
+
const filename = resolve(workspace, test.filename ?? `${group}-${index}.ts`);
|
|
62
65
|
writeFixture(filename, test.code);
|
|
63
66
|
const testerConfig = config;
|
|
64
67
|
const baseSettings = testerConfig?.settings?.typescriptOxlint;
|
package/dist/rule_tester.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule_tester.js","names":["OxlintRuleTester","#inner","#config"],"sources":["../ts/rule_tester.ts"],"sourcesContent":["import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport { RuleTester as OxlintRuleTester } from \"oxlint/plugins-dev\";\n\nimport { mergeTypeAwareParserOptions } from \"./context\";\nimport { decorateRule } from \"./plugin\";\nimport type { TypeAwareParserOptions, TypescriptOxlintSettings } from \"./types\";\n\ntype TesterConfig = import(\"oxlint/plugins-dev\").RuleTester.Config;\ntype TestCase = import(\"oxlint/plugins-dev\").RuleTester.ValidTestCase &\n Partial<import(\"oxlint/plugins-dev\").RuleTester.InvalidTestCase>;\ntype TestCases = import(\"oxlint/plugins-dev\").RuleTester.TestCases;\ntype ConfigWithSettings = TesterConfig & {\n settings?: {\n typescriptOxlint?: TypescriptOxlintSettings;\n [key: string]: unknown;\n };\n};\n\nconst cleanupDirs = new Set<string>();\nlet cleanupInstalled = false;\n\nexport class RuleTester {\n /**\n * A thin Oxlint `RuleTester` wrapper that injects\n * `settings.typescriptOxlint`\n * settings, temporary fixtures, and a default project service.\n *\n * @example\n * ```ts\n * const tester = new RuleTester();\n * tester.run(\"demo\", rule, {\n * valid: [{ code: \"const answer = 42;\" }],\n * invalid: [],\n * });\n * ```\n */\n static get describe() {\n return OxlintRuleTester.describe;\n }\n\n static set describe(value) {\n OxlintRuleTester.describe = value;\n }\n\n static get it() {\n return OxlintRuleTester.it;\n }\n\n static set it(value) {\n OxlintRuleTester.it = value;\n }\n\n static only(item: string | TestCase): TestCase {\n return OxlintRuleTester.only(item);\n }\n\n readonly #inner: OxlintRuleTester;\n readonly #config?: TesterConfig;\n\n constructor(config?: TesterConfig) {\n this.#config = config;\n this.#inner = new OxlintRuleTester(config);\n }\n\n run(ruleName: string, rule: Record<string, unknown>, tests: TestCases): void {\n const
|
|
1
|
+
{"version":3,"file":"rule_tester.js","names":["OxlintRuleTester","#inner","#config"],"sources":["../ts/rule_tester.ts"],"sourcesContent":["import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\nimport { RuleTester as OxlintRuleTester } from \"oxlint/plugins-dev\";\n\nimport { mergeTypeAwareParserOptions } from \"./context\";\nimport { decorateRule } from \"./plugin\";\nimport type { TypeAwareParserOptions, TypescriptOxlintSettings } from \"./types\";\n\ntype TesterConfig = import(\"oxlint/plugins-dev\").RuleTester.Config;\ntype TestCase = import(\"oxlint/plugins-dev\").RuleTester.ValidTestCase &\n Partial<import(\"oxlint/plugins-dev\").RuleTester.InvalidTestCase>;\ntype TestCases = import(\"oxlint/plugins-dev\").RuleTester.TestCases;\ntype ConfigWithSettings = TesterConfig & {\n settings?: {\n typescriptOxlint?: TypescriptOxlintSettings;\n [key: string]: unknown;\n };\n};\n\nconst cleanupDirs = new Set<string>();\nlet cleanupInstalled = false;\n\nexport class RuleTester {\n /**\n * A thin Oxlint `RuleTester` wrapper that injects\n * `settings.typescriptOxlint`\n * settings, temporary fixtures, and a default project service.\n *\n * @example\n * ```ts\n * const tester = new RuleTester();\n * tester.run(\"demo\", rule, {\n * valid: [{ code: \"const answer = 42;\" }],\n * invalid: [],\n * });\n * ```\n */\n static get describe() {\n return OxlintRuleTester.describe;\n }\n\n static set describe(value) {\n OxlintRuleTester.describe = value;\n }\n\n static get it() {\n return OxlintRuleTester.it;\n }\n\n static set it(value) {\n OxlintRuleTester.it = value;\n }\n\n static only(item: string | TestCase): TestCase {\n return OxlintRuleTester.only(item);\n }\n\n readonly #inner: OxlintRuleTester;\n readonly #config?: TesterConfig;\n\n constructor(config?: TesterConfig) {\n this.#config = config;\n this.#inner = new OxlintRuleTester(config);\n }\n\n run(ruleName: string, rule: Record<string, unknown>, tests: TestCases): void {\n const transformed = {\n valid: tests.valid.map((test, index) =>\n prepareTestCase(createWorkspace(), test, this.#config, \"valid\", index),\n ),\n invalid: tests.invalid.map((test, index) =>\n prepareTestCase(createWorkspace(), test, this.#config, \"invalid\", index),\n ),\n };\n this.#inner.run(ruleName, decorateRule(rule as never) as never, transformed as TestCases);\n }\n}\n\nfunction createWorkspace(): string {\n const workspace = mkdtempSync(join(tmpdir(), \"corsa-oxlint-\"));\n registerCleanup(workspace);\n return workspace;\n}\n\nfunction prepareTestCase(\n workspace: string,\n test: string | TestCase,\n config: TesterConfig | undefined,\n group: \"valid\" | \"invalid\",\n index: number,\n): string | TestCase {\n if (typeof test === \"string\") {\n const filename = resolve(workspace, `${group}-${index}.ts`);\n writeFixture(filename, test);\n return test;\n }\n const filename = resolve(workspace, test.filename ?? `${group}-${index}.ts`);\n writeFixture(filename, test.code);\n const testerConfig = config as ConfigWithSettings | undefined;\n const baseSettings = testerConfig?.settings?.typescriptOxlint;\n const caseSettings = (\n test.settings as {\n typescriptOxlint?: TypescriptOxlintSettings;\n }\n )?.typescriptOxlint;\n const parserOptions = mergeTypeAwareParserOptions(\n mergeTypeAwareParserOptions(\n mergeTypeAwareParserOptions(\n mergeTypeAwareParserOptions(baseSettings, baseSettings?.parserOptions),\n mergeTypeAwareParserOptions(caseSettings, caseSettings?.parserOptions),\n ),\n {\n tsconfigRootDir: workspace,\n projectService: {\n allowDefaultProject: [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"],\n },\n },\n ),\n mergeTypeAwareParserOptions(\n config?.languageOptions?.parserOptions as TypeAwareParserOptions | undefined,\n test.languageOptions?.parserOptions as TypeAwareParserOptions | undefined,\n ),\n );\n return {\n ...test,\n filename,\n settings: {\n ...testerConfig?.settings,\n ...test.settings,\n typescriptOxlint: {\n ...testerConfig?.settings?.typescriptOxlint,\n ...(test.settings as { typescriptOxlint?: TypescriptOxlintSettings })?.typescriptOxlint,\n parserOptions,\n },\n } as never,\n languageOptions: {\n ...config?.languageOptions,\n ...test.languageOptions,\n parserOptions: {\n ...parserOptions,\n } as never,\n },\n };\n}\n\nfunction writeFixture(filename: string, code: string): void {\n mkdirSync(dirname(filename), { recursive: true });\n writeFileSync(filename, code);\n const configPath = resolve(dirname(filename), \"tsconfig.json\");\n writeFileSync(\n configPath,\n JSON.stringify(\n {\n compilerOptions: {\n module: \"esnext\",\n target: \"es2022\",\n strict: true,\n },\n include: [\"**/*\"],\n },\n null,\n 2,\n ),\n );\n}\n\nfunction registerCleanup(workspace: string): void {\n cleanupDirs.add(workspace);\n if (cleanupInstalled) {\n return;\n }\n cleanupInstalled = true;\n process.on(\"exit\", () => {\n for (const dir of cleanupDirs) {\n rmSync(dir, { force: true, recursive: true });\n }\n });\n}\n"],"mappings":";;;;;;;AAqBA,MAAM,8BAAc,IAAI,KAAa;AACrC,IAAI,mBAAmB;AAEvB,IAAa,aAAb,MAAwB;;;;;;;;;;;;;;;CAetB,WAAW,WAAW;EACpB,OAAOA,aAAiB;;CAG1B,WAAW,SAAS,OAAO;EACzB,aAAiB,WAAW;;CAG9B,WAAW,KAAK;EACd,OAAOA,aAAiB;;CAG1B,WAAW,GAAG,OAAO;EACnB,aAAiB,KAAK;;CAGxB,OAAO,KAAK,MAAmC;EAC7C,OAAOA,aAAiB,KAAK,KAAK;;CAGpC;CACA;CAEA,YAAY,QAAuB;EACjC,KAAKE,UAAU;EACf,KAAKD,SAAS,IAAID,aAAiB,OAAO;;CAG5C,IAAI,UAAkB,MAA+B,OAAwB;EAC3E,MAAM,cAAc;GAClB,OAAO,MAAM,MAAM,KAAK,MAAM,UAC5B,gBAAgB,iBAAiB,EAAE,MAAM,KAAKE,SAAS,SAAS,MAAM,CACvE;GACD,SAAS,MAAM,QAAQ,KAAK,MAAM,UAChC,gBAAgB,iBAAiB,EAAE,MAAM,KAAKA,SAAS,WAAW,MAAM,CACzE;GACF;EACD,KAAKD,OAAO,IAAI,UAAU,aAAa,KAAc,EAAW,YAAyB;;;AAI7F,SAAS,kBAA0B;CACjC,MAAM,YAAY,YAAY,KAAK,QAAQ,EAAE,gBAAgB,CAAC;CAC9D,gBAAgB,UAAU;CAC1B,OAAO;;AAGT,SAAS,gBACP,WACA,MACA,QACA,OACA,OACmB;CACnB,IAAI,OAAO,SAAS,UAAU;EAE5B,aADiB,QAAQ,WAAW,GAAG,MAAM,GAAG,MAAM,KACjC,EAAE,KAAK;EAC5B,OAAO;;CAET,MAAM,WAAW,QAAQ,WAAW,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,KAAK;CAC5E,aAAa,UAAU,KAAK,KAAK;CACjC,MAAM,eAAe;CACrB,MAAM,eAAe,cAAc,UAAU;CAC7C,MAAM,eACJ,KAAK,UAGJ;CACH,MAAM,gBAAgB,4BACpB,4BACE,4BACE,4BAA4B,cAAc,cAAc,cAAc,EACtE,4BAA4B,cAAc,cAAc,cAAc,CACvE,EACD;EACE,iBAAiB;EACjB,gBAAgB,EACd,qBAAqB;GAAC;GAAQ;GAAS;GAAQ;GAAQ,EACxD;EACF,CACF,EACD,4BACE,QAAQ,iBAAiB,eACzB,KAAK,iBAAiB,cACvB,CACF;CACD,OAAO;EACL,GAAG;EACH;EACA,UAAU;GACR,GAAG,cAAc;GACjB,GAAG,KAAK;GACR,kBAAkB;IAChB,GAAG,cAAc,UAAU;IAC3B,GAAI,KAAK,UAA8D;IACvE;IACD;GACF;EACD,iBAAiB;GACf,GAAG,QAAQ;GACX,GAAG,KAAK;GACR,eAAe,EACb,GAAG,eACJ;GACF;EACF;;AAGH,SAAS,aAAa,UAAkB,MAAoB;CAC1D,UAAU,QAAQ,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;CACjD,cAAc,UAAU,KAAK;CAE7B,cADmB,QAAQ,QAAQ,SAAS,EAAE,gBAElC,EACV,KAAK,UACH;EACE,iBAAiB;GACf,QAAQ;GACR,QAAQ;GACR,QAAQ;GACT;EACD,SAAS,CAAC,OAAO;EAClB,EACD,MACA,EACD,CACF;;AAGH,SAAS,gBAAgB,WAAyB;CAChD,YAAY,IAAI,UAAU;CAC1B,IAAI,kBACF;CAEF,mBAAmB;CACnB,QAAQ,GAAG,cAAc;EACvB,KAAK,MAAM,OAAO,aAChB,OAAO,KAAK;GAAE,OAAO;GAAM,WAAW;GAAM,CAAC;GAE/C"}
|
|
@@ -153,10 +153,10 @@ function expectedArgumentTypeTextsOfCall(context, node) {
|
|
|
153
153
|
if (!callee) return [];
|
|
154
154
|
const calleeType = typeAtNode(context, callee);
|
|
155
155
|
if (!calleeType) return [];
|
|
156
|
-
const
|
|
157
|
-
if (
|
|
156
|
+
const parameters = signatureParameters(signatureForCall(context, node, calleeType));
|
|
157
|
+
if (parameters.length === 0) return [];
|
|
158
158
|
return (Array.isArray(node.arguments) ? node.arguments : []).map((_arg, index) => {
|
|
159
|
-
const parameterId =
|
|
159
|
+
const parameterId = parameters[Math.min(index, parameters.length - 1)];
|
|
160
160
|
return parameterId ? parameterTypeTexts(context, parameterId) : [];
|
|
161
161
|
});
|
|
162
162
|
}
|
|
@@ -192,7 +192,7 @@ function signatureForCall(context, node, calleeType) {
|
|
|
192
192
|
})).sort((left, right) => right.score - left.score)[0]?.signature;
|
|
193
193
|
}
|
|
194
194
|
function scoreSignatureForArguments(context, signature, args) {
|
|
195
|
-
const parameterTypes = signature.
|
|
195
|
+
const parameterTypes = signatureParameters(signature).map((parameterId) => parameterTypeTexts(context, parameterId));
|
|
196
196
|
let score = -Math.abs(args.length - parameterTypes.length);
|
|
197
197
|
for (const [index, arg] of args.entries()) {
|
|
198
198
|
const expected = parameterTypes[Math.min(index, parameterTypes.length - 1)] ?? [];
|
|
@@ -204,11 +204,29 @@ function scoreSignatureForArguments(context, signature, args) {
|
|
|
204
204
|
}
|
|
205
205
|
return score;
|
|
206
206
|
}
|
|
207
|
+
function signatureParameters(signature) {
|
|
208
|
+
return Array.isArray(signature?.parameters) ? signature.parameters : [];
|
|
209
|
+
}
|
|
207
210
|
function parameterTypeTexts(context, parameterId) {
|
|
208
211
|
const checker = checkerFor(context);
|
|
209
|
-
const parameterSymbol = { id: parameterId };
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
+
const parameterSymbol = checker.getSymbol(parameterId) ?? { id: parameterId };
|
|
213
|
+
const declaration = checker.getNode(parameterSymbol.valueDeclaration) ?? checker.getNode(parameterSymbol.declarations?.[0]);
|
|
214
|
+
const parameterType = (declaration ? checker.getTypeOfSymbolAtLocation(parameterSymbol, declaration) : void 0) ?? checker.getTypeOfSymbol(parameterSymbol) ?? checker.getDeclaredTypeOfSymbol(parameterSymbol);
|
|
215
|
+
const typeTexts = parameterType ? renderTypeTexts(context, parameterType) : [];
|
|
216
|
+
const fallbackTexts = parameterAnnotationTexts(context, declaration);
|
|
217
|
+
return typeTexts.length > 0 ? typeTexts : fallbackTexts;
|
|
218
|
+
}
|
|
219
|
+
function parameterAnnotationTexts(context, declaration) {
|
|
220
|
+
if (!declaration) return [];
|
|
221
|
+
const sourceText = sourceTextForPath(context, declaration.fileName);
|
|
222
|
+
if (!sourceText || declaration.pos < 0 || declaration.end > sourceText.length || declaration.pos >= declaration.end) return [];
|
|
223
|
+
const parameterText = sourceText.slice(declaration.pos, declaration.end);
|
|
224
|
+
const annotationStart = topLevelIndexOf(parameterText, ":");
|
|
225
|
+
if (annotationStart < 0) return [];
|
|
226
|
+
const annotationText = parameterText.slice(annotationStart + 1);
|
|
227
|
+
const defaultStart = topLevelIndexOf(annotationText, "=");
|
|
228
|
+
const typeText = (defaultStart >= 0 ? annotationText.slice(0, defaultStart) : annotationText).trim().replace(/\s+$/, "");
|
|
229
|
+
return typeText ? [typeText] : [];
|
|
212
230
|
}
|
|
213
231
|
function typeTextsOverlap(actual, expected) {
|
|
214
232
|
const normalizedExpected = expected.map(normalizeTypeText);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native_bridge.js","names":[],"sources":["../../ts/rules/native_bridge.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\n\nimport { nativeLintRuleMetas, runNativeLintRule } from \"@corsa-bind/napi\";\nimport type {\n NativeLintDiagnostic,\n NativeLintNode,\n NativeLintRange,\n NativeLintRuleMeta,\n} from \"@corsa-bind/napi\";\n\nimport { createNativeRule } from \"./rule_creator\";\nimport { checkerFor, propertyNamesOfNode, typeAtNode, typeTextsAtNode } from \"./type_utils\";\nimport type { ContextWithParserOptions, TsgoSignature, TsgoType } from \"../types\";\n\ntype RangedNode = {\n readonly type: string;\n readonly range: readonly [number, number];\n};\n\ntype NativeRuleBridgeOptions = {\n readonly shouldRun?: (node: RangedNode, context: ContextWithParserOptions) => boolean;\n readonly includeTypeTexts?: NodeMetadataOption;\n readonly includePropertyNames?: NodeMetadataOption;\n readonly includeText?: NodeMetadataOption;\n readonly maxDepth?: number;\n};\n\ntype NodeMetadataOption = boolean | ((node: RangedNode, depth: number) => boolean);\n\nconst MAX_NATIVE_NODE_DEPTH = 4;\nconst nativeRuleMetasByName = new Map(nativeLintRuleMetas().map((meta) => [meta.name, meta]));\n\nexport function createRustNativeRule(\n ruleName: string,\n metaOverrides: Record<string, unknown> = {},\n bridgeOptions: NativeRuleBridgeOptions = {},\n) {\n const meta = nativeRuleMeta(ruleName);\n return createNativeRule(\n ruleName,\n {\n docs: {\n description: meta.docsDescription,\n },\n hasSuggestions: meta.hasSuggestions,\n messages: meta.messages,\n ...metaOverrides,\n },\n (context) =>\n Object.fromEntries(\n meta.listeners.map((listener) => [\n listener,\n (node: RangedNode) => {\n if (bridgeOptions.shouldRun?.(node, context) === false) {\n return;\n }\n const includeTypeTexts = includeTypeTextsOption(bridgeOptions, meta);\n reportNativeDiagnostics(\n context,\n node,\n runNativeLintRule(\n ruleName,\n toNativeNode(\n context,\n node,\n includeTypeTexts,\n bridgeOptions.maxDepth ?? MAX_NATIVE_NODE_DEPTH,\n true,\n includePropertyNamesOption(bridgeOptions, includeTypeTexts),\n bridgeOptions.includeText ?? false,\n ),\n ),\n );\n },\n ]),\n ),\n );\n}\n\nexport function toNativeNode(\n context: ContextWithParserOptions,\n node: RangedNode,\n includeTypeTexts: NodeMetadataOption = true,\n maxDepth = MAX_NATIVE_NODE_DEPTH,\n includeRuleOptions = true,\n includePropertyNames: NodeMetadataOption = includeTypeTexts,\n includeText: NodeMetadataOption = false,\n depth = 0,\n): NativeLintNode {\n const fields: Record<string, unknown> = {};\n const children: Record<string, NativeLintNode> = {};\n const childLists: Record<string, NativeLintNode[]> = {};\n\n for (const [key, value] of Object.entries(node)) {\n if (isSkippedField(key)) {\n continue;\n }\n if (isNativeChildNode(value)) {\n if (maxDepth > 0) {\n children[key] = toNativeNode(\n context,\n value,\n includeTypeTexts,\n maxDepth - 1,\n false,\n includePropertyNames,\n includeText,\n depth + 1,\n );\n }\n continue;\n }\n if (Array.isArray(value)) {\n if (maxDepth > 0 && value.every(isNativeChildNode)) {\n childLists[key] = value.map((child) =>\n toNativeNode(\n context,\n child,\n includeTypeTexts,\n maxDepth - 1,\n false,\n includePropertyNames,\n includeText,\n depth + 1,\n ),\n );\n } else if (value.every(isJsonPrimitive)) {\n fields[key] = value;\n }\n continue;\n }\n if (isPrimitiveRecord(value)) {\n fields[key] = value;\n continue;\n }\n if (isJsonPrimitive(value)) {\n fields[key] = value;\n }\n }\n\n const typeAnnotationText = sourceTypeAnnotationText(context, node);\n if (typeAnnotationText) {\n fields.__typeAnnotationText = typeAnnotationText;\n }\n\n const options = (context as { options?: unknown }).options;\n if (includeRuleOptions && Array.isArray(options) && options.length > 0 && isJsonValue(options)) {\n fields.__ruleOptions = options;\n }\n if (includeRuleOptions) {\n addHostFacts(context, node, fields);\n }\n\n const nativeNode: NativeLintNode = {\n kind: node.type,\n range: nativeRange(node.range),\n };\n if (includeMetadataForNode(includeText, node, depth)) {\n nativeNode.text = context.sourceCode.getText(node as never);\n }\n if (includeMetadataForNode(includeTypeTexts, node, depth)) {\n nativeNode.typeTexts = typeTextsAtNode(context, node);\n }\n if (includeMetadataForNode(includePropertyNames, node, depth)) {\n nativeNode.propertyNames = propertyNamesOfNode(context, node);\n }\n if (Object.keys(fields).length > 0) {\n nativeNode.fields = fields;\n }\n if (Object.keys(children).length > 0) {\n nativeNode.children = children;\n }\n if (Object.keys(childLists).length > 0) {\n nativeNode.childLists = childLists;\n }\n return nativeNode;\n}\n\nexport function reportNativeDiagnostics(\n context: ContextWithParserOptions,\n node: RangedNode,\n diagnostics: readonly NativeLintDiagnostic[],\n): void {\n for (const diagnostic of diagnostics) {\n context.report({\n node: reportNodeForRange(node, diagnostic.range),\n messageId: diagnostic.messageId,\n ...(diagnostic.suggestions?.length\n ? {\n suggest: diagnostic.suggestions.map((suggestion) => ({\n messageId: suggestion.messageId,\n fix: (fixer: any) =>\n suggestion.fixes.map((fix) =>\n fixer.replaceTextRange(oxlintRange(fix.range), fix.replacementText),\n ),\n })),\n }\n : {}),\n } as never);\n }\n}\n\nfunction reportNodeForRange(root: RangedNode, range: NativeLintRange): RangedNode {\n return findNodeByRange(root, range) ?? root;\n}\n\nfunction findNodeByRange(\n value: unknown,\n range: NativeLintRange,\n seen = new Set<object>(),\n): RangedNode | undefined {\n if (typeof value !== \"object\" || value === null || seen.has(value)) {\n return undefined;\n }\n seen.add(value);\n\n if (isNativeChildNode(value) && sameRange(value.range, range)) {\n return value;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const match = findNodeByRange(item, range, seen);\n if (match) {\n return match;\n }\n }\n return undefined;\n }\n\n for (const [key, child] of Object.entries(value)) {\n if (isSkippedField(key)) {\n continue;\n }\n const match = findNodeByRange(child, range, seen);\n if (match) {\n return match;\n }\n }\n return undefined;\n}\n\nfunction nativeRuleMeta(ruleName: string): NativeLintRuleMeta {\n const meta = nativeRuleMetasByName.get(ruleName);\n if (!meta) {\n throw new Error(`corsa-oxlint native Rust rule is not registered: ${ruleName}`);\n }\n return meta;\n}\n\nfunction includeTypeTextsOption(\n options: NativeRuleBridgeOptions,\n meta: NativeLintRuleMeta,\n): NodeMetadataOption {\n return options.includeTypeTexts ?? meta.requiresTypeTexts;\n}\n\nfunction includePropertyNamesOption(\n options: NativeRuleBridgeOptions,\n includeTypeTexts: NodeMetadataOption,\n): NodeMetadataOption {\n return options.includePropertyNames ?? includeTypeTexts;\n}\n\nfunction includeMetadataForNode(\n option: NodeMetadataOption,\n node: RangedNode,\n depth: number,\n): boolean {\n return typeof option === \"function\" ? option(node, depth) : option;\n}\n\nfunction sourceTypeAnnotationText(\n context: ContextWithParserOptions,\n node: RangedNode,\n): string | undefined {\n const annotation = (node as any).typeAnnotation?.typeAnnotation ?? (node as any).typeAnnotation;\n if (!annotation) {\n return undefined;\n }\n const text = (context as any).sourceCode?.getText(annotation);\n return typeof text === \"string\" && text.length > 0 ? text : undefined;\n}\n\nfunction nativeRange(range: readonly [number, number]): NativeLintRange {\n return { start: range[0], end: range[1] };\n}\n\nfunction oxlintRange(range: NativeLintRange): [number, number] {\n return [range.start, range.end];\n}\n\nfunction sameRange(range: readonly [number, number], expected: NativeLintRange): boolean {\n return range[0] === expected.start && range[1] === expected.end;\n}\n\nfunction addHostFacts(\n context: ContextWithParserOptions,\n node: RangedNode,\n fields: Record<string, unknown>,\n): void {\n const current = node as any;\n if (current.type === \"ExpressionStatement\") {\n fields.__nearestFunctionAsync = nearestFunctionAncestor(context, current)?.async === true;\n }\n if (current.type === \"TemplateLiteral\") {\n fields.__taggedTemplate = current.parent?.type === \"TaggedTemplateExpression\";\n }\n if (current.type === \"CallExpression\" && isPromiseExecutorRejectCall(context, current)) {\n fields.__promiseExecutorRejectCall = true;\n }\n if (current.type === \"CallExpression\" || current.type === \"NewExpression\") {\n const expectedArgumentTypeTexts = expectedArgumentTypeTextsOfCall(context, current);\n if (expectedArgumentTypeTexts.length > 0) {\n fields.__expectedArgumentTypeTexts = expectedArgumentTypeTexts;\n }\n if (hasUnnecessaryExplicitTypeArguments(context, current)) {\n fields.__explicitTypeArgumentsRequired = false;\n }\n }\n if (current.parent?.type) {\n fields.__parentKind = current.parent.type;\n }\n if (current.type === \"ExportNamedDeclaration\" && hasTypeOnlyValueExport(context, current)) {\n fields.__nativeRuleViolation = true;\n }\n if (\n (current.type === \"Identifier\" || current.type === \"MemberExpression\") &&\n isDeprecatedSymbolUse(context, current)\n ) {\n fields.__deprecated = true;\n }\n if (\n current.type === \"TSTypeParameterDeclaration\" &&\n hasSingleUseTypeParameter(context, current)\n ) {\n fields.__hasSingleUseTypeParameter = true;\n }\n if (current.type === \"ReturnStatement\") {\n const returnTypeTexts = returnTypeTextsOfNearestFunction(context, current);\n if (returnTypeTexts.length > 0) {\n fields.__returnTypeTexts = returnTypeTexts;\n }\n if (returnAwaitRequiresAwait(context, current)) {\n fields.__returnAwaitRequiresAwait = true;\n }\n }\n if (isFunctionLike(current)) {\n const returnTypeTexts = returnTypeTextsOfFunction(context, current);\n if (returnTypeTexts.length > 0) {\n fields.__returnTypeTexts = returnTypeTexts;\n }\n const nearestClass = nearestClassAncestor(context, current);\n const className = nearestClass?.id?.name;\n if (typeof className === \"string\" && className.length > 0) {\n fields.__nearestClassName = className;\n }\n }\n if (current.type === \"ArrowFunctionExpression\" && current.body?.type !== \"BlockStatement\") {\n const returnTypeTexts = returnTypeTextsOfFunction(context, current);\n if (returnTypeTexts.length > 0) {\n fields.__returnTypeTexts = returnTypeTexts;\n }\n }\n}\n\nfunction expectedArgumentTypeTextsOfCall(\n context: ContextWithParserOptions,\n node: any,\n): readonly (readonly string[])[] {\n const callee = stripChainExpression(node.callee);\n if (!callee) {\n return [];\n }\n const calleeType = typeAtNode(context, callee);\n if (!calleeType) {\n return [];\n }\n const signature = signatureForCall(context, node, calleeType);\n if (!signature || signature.parameters.length === 0) {\n return [];\n }\n const args = Array.isArray(node.arguments) ? node.arguments : [];\n return args.map((_arg: unknown, index: number) => {\n const parameterId = signature.parameters[Math.min(index, signature.parameters.length - 1)];\n return parameterId ? parameterTypeTexts(context, parameterId) : [];\n });\n}\n\nfunction hasUnnecessaryExplicitTypeArguments(\n context: ContextWithParserOptions,\n node: any,\n): boolean {\n const explicitTypeArguments = typeArgumentNodes(node);\n if (explicitTypeArguments.length === 0) {\n return false;\n }\n const callee = stripChainExpression(node.callee);\n const calleeType = callee ? typeAtNode(context, callee) : undefined;\n const signature = calleeType ? signatureForCall(context, node, calleeType) : undefined;\n const defaultTypeArguments = signature\n ? defaultTypeArgumentTextsForSignature(context, signature)\n : [];\n if (defaultTypeArguments.length === 0) {\n return false;\n }\n return explicitTypeArguments.every((typeArgument, index) => {\n const defaultTypeArgument = defaultTypeArguments[index];\n if (!defaultTypeArgument) {\n return false;\n }\n const explicit = normalizeTypeText(context.sourceCode.getText(typeArgument));\n return normalizeTypeText(defaultTypeArgument) === explicit;\n });\n}\n\nfunction typeArgumentNodes(node: any): readonly any[] {\n const candidates = [\n node.typeArguments?.params,\n node.typeParameters?.params,\n node.typeParameterInstantiation?.params,\n ];\n return candidates.find(Array.isArray) ?? [];\n}\n\nfunction signatureForCall(\n context: ContextWithParserOptions,\n node: any,\n calleeType: TsgoType,\n): TsgoSignature | undefined {\n const checker = checkerFor(context);\n const signatures = checker.getSignaturesOfType(calleeType, node.type === \"NewExpression\" ? 1 : 0);\n if (signatures.length <= 1) {\n return signatures[0];\n }\n const args = Array.isArray(node.arguments) ? node.arguments : [];\n return signatures\n .map((signature) => ({\n signature,\n score: scoreSignatureForArguments(context, signature, args),\n }))\n .sort((left, right) => right.score - left.score)[0]?.signature;\n}\n\nfunction scoreSignatureForArguments(\n context: ContextWithParserOptions,\n signature: TsgoSignature,\n args: readonly any[],\n): number {\n const parameterTypes = signature.parameters.map((parameterId) =>\n parameterTypeTexts(context, parameterId),\n );\n let score = -Math.abs(args.length - parameterTypes.length);\n for (const [index, arg] of args.entries()) {\n const expected = parameterTypes[Math.min(index, parameterTypes.length - 1)] ?? [];\n const actual = typeTextsAtNode(context, arg);\n if (expected.length === 0) {\n score -= 2;\n } else if (isPermissiveTypeTexts(expected)) {\n score += 1;\n } else if (typeTextsOverlap(actual, expected)) {\n score += 4;\n } else {\n score -= 1;\n }\n }\n return score;\n}\n\nfunction parameterTypeTexts(\n context: ContextWithParserOptions,\n parameterId: string,\n): readonly string[] {\n const checker = checkerFor(context);\n const parameterSymbol = { id: parameterId } as any;\n const parameterType =\n checker.getTypeOfSymbol(parameterSymbol) ?? checker.getDeclaredTypeOfSymbol(parameterSymbol);\n return parameterType ? renderTypeTexts(context, parameterType) : [];\n}\n\nfunction typeTextsOverlap(actual: readonly string[], expected: readonly string[]): boolean {\n const normalizedExpected = expected.map(normalizeTypeText);\n return actual.some((actualText) => {\n const normalizedActual = normalizeTypeText(actualText);\n return normalizedExpected.some(\n (expectedText) =>\n expectedText === normalizedActual ||\n expectedText.includes(normalizedActual) ||\n normalizedActual.includes(expectedText),\n );\n });\n}\n\nfunction defaultTypeArgumentTextsForSignature(\n context: ContextWithParserOptions,\n signature: TsgoSignature,\n): readonly string[] {\n const declarationText = declarationTextForHandle(context, signature.declaration);\n if (!declarationText) {\n return [];\n }\n return typeParameterDefaultTexts(declarationText);\n}\n\nfunction declarationTextForHandle(\n context: ContextWithParserOptions,\n handleText: string | undefined,\n): string | undefined {\n if (!handleText) {\n return undefined;\n }\n const handle = parseNodeHandle(handleText);\n if (!handle) {\n return undefined;\n }\n const sourceText = sourceTextForPath(context, handle.path);\n if (!sourceText || handle.pos < 0 || handle.end > sourceText.length || handle.pos >= handle.end) {\n return undefined;\n }\n return sourceText.slice(handle.pos, handle.end);\n}\n\nfunction typeParameterDefaultTexts(declarationText: string): readonly string[] {\n const parametersText = firstDelimitedText(declarationText, \"<\", \">\");\n if (!parametersText) {\n return [];\n }\n return splitTopLevel(parametersText, \",\").map((parameterText) => {\n const defaultStart = topLevelIndexOf(parameterText, \"=\");\n return defaultStart >= 0 ? parameterText.slice(defaultStart + 1).trim() : \"\";\n });\n}\n\nfunction firstDelimitedText(text: string, open: string, close: string): string | undefined {\n const start = text.indexOf(open);\n if (start < 0) {\n return undefined;\n }\n let depth = 0;\n for (let index = start; index < text.length; index += 1) {\n const char = text[index];\n if (char === open) {\n depth += 1;\n } else if (char === close) {\n depth -= 1;\n if (depth === 0) {\n return text.slice(start + 1, index);\n }\n }\n }\n return undefined;\n}\n\nfunction splitTopLevel(text: string, delimiter: string): readonly string[] {\n const parts: string[] = [];\n let start = 0;\n let angleDepth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (char === \"<\") angleDepth += 1;\n else if (char === \">\") angleDepth = Math.max(0, angleDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (\n char === delimiter &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n parts.push(text.slice(start, index).trim());\n start = index + 1;\n }\n }\n parts.push(text.slice(start).trim());\n return parts;\n}\n\nfunction topLevelIndexOf(text: string, needle: string): number {\n let angleDepth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (char === \"<\") angleDepth += 1;\n else if (char === \">\") angleDepth = Math.max(0, angleDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (\n char === needle &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n return index;\n }\n }\n return -1;\n}\n\nfunction hasTypeOnlyValueExport(context: ContextWithParserOptions, node: any): boolean {\n if (node.exportKind === \"type\" || !Array.isArray(node.specifiers)) {\n return false;\n }\n const checker = checkerFor(context);\n return node.specifiers.some((specifier: any) => {\n if (specifier.exportKind === \"type\") {\n return false;\n }\n const target = specifier.local ?? specifier.exported;\n const symbol = target ? checker.getSymbolAtLocation(target) : undefined;\n return symbol !== undefined && symbol.valueDeclaration === undefined;\n });\n}\n\nfunction isDeprecatedSymbolUse(context: ContextWithParserOptions, node: any): boolean {\n const target = node.type === \"MemberExpression\" ? node.property : node;\n if (target?.type !== \"Identifier\") {\n return false;\n }\n const symbol = checkerFor(context).getSymbolAtLocation(target);\n return (\n symbol?.declarations?.some((declaration) =>\n declarationHasDeprecatedJSDoc(context, declaration),\n ) === true\n );\n}\n\nfunction declarationHasDeprecatedJSDoc(\n context: ContextWithParserOptions,\n declaration: string,\n): boolean {\n const handle = parseNodeHandle(declaration);\n if (!handle) {\n return false;\n }\n const sourceText = sourceTextForPath(context, handle.path);\n if (!sourceText) {\n return false;\n }\n const pos = handle.pos;\n if (!Number.isFinite(pos)) {\n return false;\n }\n return sourceText.slice(Math.max(0, pos - 500), pos).includes(\"@deprecated\");\n}\n\nfunction parseNodeHandle(\n value: string,\n): { readonly pos: number; readonly end: number; readonly path: string } | undefined {\n const [posText, endText, _kindText, ...pathParts] = value.split(\".\");\n const pos = Number(posText);\n const end = Number(endText);\n if (!Number.isFinite(pos) || !Number.isFinite(end)) {\n return undefined;\n }\n return { pos, end, path: pathParts.join(\".\") };\n}\n\nfunction sourceTextForPath(context: ContextWithParserOptions, path: string): string | undefined {\n if (!path || path === context.filename || context.filename.endsWith(path)) {\n return context.sourceCode.text;\n }\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n try {\n return readFileSync(`${context.cwd}/${path}`, \"utf8\");\n } catch {\n return undefined;\n }\n }\n}\n\nfunction hasSingleUseTypeParameter(context: ContextWithParserOptions, node: any): boolean {\n const params = Array.isArray(node.params) ? node.params : [];\n if (params.length !== 1) {\n return false;\n }\n const name = typeParameterName(params[0]);\n if (!name) {\n return false;\n }\n const ownerText = node.parent\n ? context.sourceCode.getText(node.parent)\n : context.sourceCode.getText(node);\n const matches = ownerText.match(new RegExp(`\\\\b${escapeRegExp(name)}\\\\b`, \"g\")) ?? [];\n return matches.length <= 2;\n}\n\nfunction typeParameterName(node: any): string | undefined {\n if (typeof node?.name === \"string\") {\n return node.name;\n }\n if (typeof node?.name?.name === \"string\") {\n return node.name.name;\n }\n return undefined;\n}\n\nfunction normalizeTypeText(text: string): string {\n return text.replace(/\\s+/g, \"\");\n}\n\nfunction escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction renderTypeTexts(context: ContextWithParserOptions, type: TsgoType): readonly string[] {\n const texts = new Set<string>();\n const checker = checkerFor(context);\n for (const text of [...(type.texts ?? []), checker.typeToString(type)]) {\n if (text) {\n texts.add(text);\n }\n }\n return [...texts];\n}\n\nfunction isPromiseExecutorRejectCall(context: ContextWithParserOptions, node: any): boolean {\n const callee = stripChainExpression(node.callee);\n if (callee?.type !== \"Identifier\") {\n return false;\n }\n const nearestFunction = nearestFunctionAncestor(context, node);\n const rejectParam = nearestFunction?.params?.[1];\n if (!rejectParam || rejectParam.type !== \"Identifier\" || rejectParam.name !== callee.name) {\n return false;\n }\n const promiseConstructor = stripChainExpression(nearestFunction.parent?.parent);\n return (\n (nearestFunction.parent?.type === \"NewExpression\" &&\n isIdentifierNamed(nearestFunction.parent.callee, \"Promise\")) ||\n (promiseConstructor?.type === \"NewExpression\" &&\n isIdentifierNamed(promiseConstructor.callee, \"Promise\"))\n );\n}\n\nfunction returnAwaitRequiresAwait(context: ContextWithParserOptions, node: any): boolean {\n const ancestors = (context.sourceCode as any)?.getAncestors?.(node) ?? [];\n return ancestors.some(\n (ancestor: any) =>\n ancestor.type === \"TryStatement\" &&\n (rangeContains(ancestor.block, node) ||\n rangeContains(ancestor.handler?.body, node) ||\n rangeContains(ancestor.finalizer, node)),\n );\n}\n\nfunction rangeContains(container: any, node: any): boolean {\n return (\n isRange(container?.range) &&\n isRange(node?.range) &&\n container.range[0] <= node.range[0] &&\n node.range[1] <= container.range[1]\n );\n}\n\nfunction nearestFunctionAncestor(context: ContextWithParserOptions, node: any): any {\n const ancestors = (context.sourceCode as any)?.getAncestors?.(node) ?? [];\n return [...ancestors].reverse().find((ancestor: any) => ancestor.type?.includes(\"Function\"));\n}\n\nfunction nearestClassAncestor(context: ContextWithParserOptions, node: any): any {\n const ancestors = (context.sourceCode as any)?.getAncestors?.(node) ?? [];\n return [...ancestors]\n .reverse()\n .find(\n (ancestor: any) =>\n ancestor.type === \"ClassDeclaration\" || ancestor.type === \"ClassExpression\",\n );\n}\n\nfunction isFunctionLike(node: any): boolean {\n return typeof node?.type === \"string\" && node.type.includes(\"Function\");\n}\n\nfunction returnTypeTextsOfNearestFunction(\n context: ContextWithParserOptions,\n node: any,\n): readonly string[] {\n const owner = nearestFunctionAncestor(context, node);\n return owner ? returnTypeTextsOfFunction(context, owner) : [];\n}\n\nfunction returnTypeTextsOfFunction(\n context: ContextWithParserOptions,\n node: any,\n): readonly string[] {\n const explicitAnnotation = node.returnType?.typeAnnotation ?? node.returnType;\n if (explicitAnnotation) {\n const text = context.sourceCode.getText(explicitAnnotation);\n if (text) {\n return [text];\n }\n }\n\n const checker = checkerFor(context);\n const type = typeAtNode(context, node);\n if (!type) {\n return [];\n }\n\n const texts = new Set<string>();\n for (const signature of checker.getSignaturesOfType(type, 0)) {\n const returnType = checker.getReturnTypeOfSignature(signature);\n if (!returnType) {\n continue;\n }\n for (const text of [...(returnType.texts ?? []), checker.typeToString(returnType)]) {\n if (text) {\n texts.add(text);\n }\n }\n }\n\n const resolved = [...texts];\n return resolved.every(isPermissiveTypeText) ? [] : resolved;\n}\n\nfunction isPermissiveTypeText(text: string): boolean {\n return text === \"any\" || text === \"unknown\" || text === \"never\";\n}\n\nfunction isPermissiveTypeTexts(texts: readonly string[]): boolean {\n return texts.some((text) => isPermissiveTypeText(normalizeTypeText(text)));\n}\n\nfunction stripChainExpression(node: any): any {\n let current = node;\n while (current?.type === \"ChainExpression\") {\n current = current.expression;\n }\n return current;\n}\n\nfunction isIdentifierNamed(node: any, name: string): boolean {\n const current = stripChainExpression(node);\n return current?.type === \"Identifier\" && current.name === name;\n}\n\nfunction isNativeChildNode(value: unknown): value is RangedNode {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\" &&\n isRange((value as { range?: unknown }).range)\n );\n}\n\nfunction isRange(value: unknown): value is readonly [number, number] {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === \"number\" &&\n typeof value[1] === \"number\"\n );\n}\n\nfunction isJsonPrimitive(value: unknown): value is string | number | boolean | null {\n return value === null || [\"boolean\", \"number\", \"string\"].includes(typeof value);\n}\n\nfunction isJsonValue(value: unknown): boolean {\n if (isJsonPrimitive(value)) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n return typeof value === \"object\" && value !== null && Object.values(value).every(isJsonValue);\n}\n\nfunction isPrimitiveRecord(\n value: unknown,\n): value is Record<string, string | number | boolean | null> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.values(value).every(isJsonPrimitive)\n );\n}\n\nfunction isSkippedField(key: string): boolean {\n return key === \"type\" || key === \"range\" || key === \"loc\" || key === \"parent\";\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"native_bridge.js","names":[],"sources":["../../ts/rules/native_bridge.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\n\nimport { nativeLintRuleMetas, runNativeLintRule } from \"@corsa-bind/napi\";\nimport type {\n NativeLintDiagnostic,\n NativeLintNode,\n NativeLintRange,\n NativeLintRuleMeta,\n} from \"@corsa-bind/napi\";\n\nimport { createNativeRule } from \"./rule_creator\";\nimport { checkerFor, propertyNamesOfNode, typeAtNode, typeTextsAtNode } from \"./type_utils\";\nimport type { ContextWithParserOptions, TsgoNode, TsgoSignature, TsgoType } from \"../types\";\n\ntype RangedNode = {\n readonly type: string;\n readonly range: readonly [number, number];\n};\n\ntype NativeRuleBridgeOptions = {\n readonly shouldRun?: (node: RangedNode, context: ContextWithParserOptions) => boolean;\n readonly includeTypeTexts?: NodeMetadataOption;\n readonly includePropertyNames?: NodeMetadataOption;\n readonly includeText?: NodeMetadataOption;\n readonly maxDepth?: number;\n};\n\ntype NodeMetadataOption = boolean | ((node: RangedNode, depth: number) => boolean);\n\nconst MAX_NATIVE_NODE_DEPTH = 4;\nconst nativeRuleMetasByName = new Map(nativeLintRuleMetas().map((meta) => [meta.name, meta]));\n\nexport function createRustNativeRule(\n ruleName: string,\n metaOverrides: Record<string, unknown> = {},\n bridgeOptions: NativeRuleBridgeOptions = {},\n) {\n const meta = nativeRuleMeta(ruleName);\n return createNativeRule(\n ruleName,\n {\n docs: {\n description: meta.docsDescription,\n },\n hasSuggestions: meta.hasSuggestions,\n messages: meta.messages,\n ...metaOverrides,\n },\n (context) =>\n Object.fromEntries(\n meta.listeners.map((listener) => [\n listener,\n (node: RangedNode) => {\n if (bridgeOptions.shouldRun?.(node, context) === false) {\n return;\n }\n const includeTypeTexts = includeTypeTextsOption(bridgeOptions, meta);\n reportNativeDiagnostics(\n context,\n node,\n runNativeLintRule(\n ruleName,\n toNativeNode(\n context,\n node,\n includeTypeTexts,\n bridgeOptions.maxDepth ?? MAX_NATIVE_NODE_DEPTH,\n true,\n includePropertyNamesOption(bridgeOptions, includeTypeTexts),\n bridgeOptions.includeText ?? false,\n ),\n ),\n );\n },\n ]),\n ),\n );\n}\n\nexport function toNativeNode(\n context: ContextWithParserOptions,\n node: RangedNode,\n includeTypeTexts: NodeMetadataOption = true,\n maxDepth = MAX_NATIVE_NODE_DEPTH,\n includeRuleOptions = true,\n includePropertyNames: NodeMetadataOption = includeTypeTexts,\n includeText: NodeMetadataOption = false,\n depth = 0,\n): NativeLintNode {\n const fields: Record<string, unknown> = {};\n const children: Record<string, NativeLintNode> = {};\n const childLists: Record<string, NativeLintNode[]> = {};\n\n for (const [key, value] of Object.entries(node)) {\n if (isSkippedField(key)) {\n continue;\n }\n if (isNativeChildNode(value)) {\n if (maxDepth > 0) {\n children[key] = toNativeNode(\n context,\n value,\n includeTypeTexts,\n maxDepth - 1,\n false,\n includePropertyNames,\n includeText,\n depth + 1,\n );\n }\n continue;\n }\n if (Array.isArray(value)) {\n if (maxDepth > 0 && value.every(isNativeChildNode)) {\n childLists[key] = value.map((child) =>\n toNativeNode(\n context,\n child,\n includeTypeTexts,\n maxDepth - 1,\n false,\n includePropertyNames,\n includeText,\n depth + 1,\n ),\n );\n } else if (value.every(isJsonPrimitive)) {\n fields[key] = value;\n }\n continue;\n }\n if (isPrimitiveRecord(value)) {\n fields[key] = value;\n continue;\n }\n if (isJsonPrimitive(value)) {\n fields[key] = value;\n }\n }\n\n const typeAnnotationText = sourceTypeAnnotationText(context, node);\n if (typeAnnotationText) {\n fields.__typeAnnotationText = typeAnnotationText;\n }\n\n const options = (context as { options?: unknown }).options;\n if (includeRuleOptions && Array.isArray(options) && options.length > 0 && isJsonValue(options)) {\n fields.__ruleOptions = options;\n }\n if (includeRuleOptions) {\n addHostFacts(context, node, fields);\n }\n\n const nativeNode: NativeLintNode = {\n kind: node.type,\n range: nativeRange(node.range),\n };\n if (includeMetadataForNode(includeText, node, depth)) {\n nativeNode.text = context.sourceCode.getText(node as never);\n }\n if (includeMetadataForNode(includeTypeTexts, node, depth)) {\n nativeNode.typeTexts = typeTextsAtNode(context, node);\n }\n if (includeMetadataForNode(includePropertyNames, node, depth)) {\n nativeNode.propertyNames = propertyNamesOfNode(context, node);\n }\n if (Object.keys(fields).length > 0) {\n nativeNode.fields = fields;\n }\n if (Object.keys(children).length > 0) {\n nativeNode.children = children;\n }\n if (Object.keys(childLists).length > 0) {\n nativeNode.childLists = childLists;\n }\n return nativeNode;\n}\n\nexport function reportNativeDiagnostics(\n context: ContextWithParserOptions,\n node: RangedNode,\n diagnostics: readonly NativeLintDiagnostic[],\n): void {\n for (const diagnostic of diagnostics) {\n context.report({\n node: reportNodeForRange(node, diagnostic.range),\n messageId: diagnostic.messageId,\n ...(diagnostic.suggestions?.length\n ? {\n suggest: diagnostic.suggestions.map((suggestion) => ({\n messageId: suggestion.messageId,\n fix: (fixer: any) =>\n suggestion.fixes.map((fix) =>\n fixer.replaceTextRange(oxlintRange(fix.range), fix.replacementText),\n ),\n })),\n }\n : {}),\n } as never);\n }\n}\n\nfunction reportNodeForRange(root: RangedNode, range: NativeLintRange): RangedNode {\n return findNodeByRange(root, range) ?? root;\n}\n\nfunction findNodeByRange(\n value: unknown,\n range: NativeLintRange,\n seen = new Set<object>(),\n): RangedNode | undefined {\n if (typeof value !== \"object\" || value === null || seen.has(value)) {\n return undefined;\n }\n seen.add(value);\n\n if (isNativeChildNode(value) && sameRange(value.range, range)) {\n return value;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const match = findNodeByRange(item, range, seen);\n if (match) {\n return match;\n }\n }\n return undefined;\n }\n\n for (const [key, child] of Object.entries(value)) {\n if (isSkippedField(key)) {\n continue;\n }\n const match = findNodeByRange(child, range, seen);\n if (match) {\n return match;\n }\n }\n return undefined;\n}\n\nfunction nativeRuleMeta(ruleName: string): NativeLintRuleMeta {\n const meta = nativeRuleMetasByName.get(ruleName);\n if (!meta) {\n throw new Error(`corsa-oxlint native Rust rule is not registered: ${ruleName}`);\n }\n return meta;\n}\n\nfunction includeTypeTextsOption(\n options: NativeRuleBridgeOptions,\n meta: NativeLintRuleMeta,\n): NodeMetadataOption {\n return options.includeTypeTexts ?? meta.requiresTypeTexts;\n}\n\nfunction includePropertyNamesOption(\n options: NativeRuleBridgeOptions,\n includeTypeTexts: NodeMetadataOption,\n): NodeMetadataOption {\n return options.includePropertyNames ?? includeTypeTexts;\n}\n\nfunction includeMetadataForNode(\n option: NodeMetadataOption,\n node: RangedNode,\n depth: number,\n): boolean {\n return typeof option === \"function\" ? option(node, depth) : option;\n}\n\nfunction sourceTypeAnnotationText(\n context: ContextWithParserOptions,\n node: RangedNode,\n): string | undefined {\n const annotation = (node as any).typeAnnotation?.typeAnnotation ?? (node as any).typeAnnotation;\n if (!annotation) {\n return undefined;\n }\n const text = (context as any).sourceCode?.getText(annotation);\n return typeof text === \"string\" && text.length > 0 ? text : undefined;\n}\n\nfunction nativeRange(range: readonly [number, number]): NativeLintRange {\n return { start: range[0], end: range[1] };\n}\n\nfunction oxlintRange(range: NativeLintRange): [number, number] {\n return [range.start, range.end];\n}\n\nfunction sameRange(range: readonly [number, number], expected: NativeLintRange): boolean {\n return range[0] === expected.start && range[1] === expected.end;\n}\n\nfunction addHostFacts(\n context: ContextWithParserOptions,\n node: RangedNode,\n fields: Record<string, unknown>,\n): void {\n const current = node as any;\n if (current.type === \"ExpressionStatement\") {\n fields.__nearestFunctionAsync = nearestFunctionAncestor(context, current)?.async === true;\n }\n if (current.type === \"TemplateLiteral\") {\n fields.__taggedTemplate = current.parent?.type === \"TaggedTemplateExpression\";\n }\n if (current.type === \"CallExpression\" && isPromiseExecutorRejectCall(context, current)) {\n fields.__promiseExecutorRejectCall = true;\n }\n if (current.type === \"CallExpression\" || current.type === \"NewExpression\") {\n const expectedArgumentTypeTexts = expectedArgumentTypeTextsOfCall(context, current);\n if (expectedArgumentTypeTexts.length > 0) {\n fields.__expectedArgumentTypeTexts = expectedArgumentTypeTexts;\n }\n if (hasUnnecessaryExplicitTypeArguments(context, current)) {\n fields.__explicitTypeArgumentsRequired = false;\n }\n }\n if (current.parent?.type) {\n fields.__parentKind = current.parent.type;\n }\n if (current.type === \"ExportNamedDeclaration\" && hasTypeOnlyValueExport(context, current)) {\n fields.__nativeRuleViolation = true;\n }\n if (\n (current.type === \"Identifier\" || current.type === \"MemberExpression\") &&\n isDeprecatedSymbolUse(context, current)\n ) {\n fields.__deprecated = true;\n }\n if (\n current.type === \"TSTypeParameterDeclaration\" &&\n hasSingleUseTypeParameter(context, current)\n ) {\n fields.__hasSingleUseTypeParameter = true;\n }\n if (current.type === \"ReturnStatement\") {\n const returnTypeTexts = returnTypeTextsOfNearestFunction(context, current);\n if (returnTypeTexts.length > 0) {\n fields.__returnTypeTexts = returnTypeTexts;\n }\n if (returnAwaitRequiresAwait(context, current)) {\n fields.__returnAwaitRequiresAwait = true;\n }\n }\n if (isFunctionLike(current)) {\n const returnTypeTexts = returnTypeTextsOfFunction(context, current);\n if (returnTypeTexts.length > 0) {\n fields.__returnTypeTexts = returnTypeTexts;\n }\n const nearestClass = nearestClassAncestor(context, current);\n const className = nearestClass?.id?.name;\n if (typeof className === \"string\" && className.length > 0) {\n fields.__nearestClassName = className;\n }\n }\n if (current.type === \"ArrowFunctionExpression\" && current.body?.type !== \"BlockStatement\") {\n const returnTypeTexts = returnTypeTextsOfFunction(context, current);\n if (returnTypeTexts.length > 0) {\n fields.__returnTypeTexts = returnTypeTexts;\n }\n }\n}\n\nfunction expectedArgumentTypeTextsOfCall(\n context: ContextWithParserOptions,\n node: any,\n): readonly (readonly string[])[] {\n const callee = stripChainExpression(node.callee);\n if (!callee) {\n return [];\n }\n const calleeType = typeAtNode(context, callee);\n if (!calleeType) {\n return [];\n }\n const signature = signatureForCall(context, node, calleeType);\n const parameters = signatureParameters(signature);\n if (parameters.length === 0) {\n return [];\n }\n const args = Array.isArray(node.arguments) ? node.arguments : [];\n return args.map((_arg: unknown, index: number) => {\n const parameterId = parameters[Math.min(index, parameters.length - 1)];\n return parameterId ? parameterTypeTexts(context, parameterId) : [];\n });\n}\n\nfunction hasUnnecessaryExplicitTypeArguments(\n context: ContextWithParserOptions,\n node: any,\n): boolean {\n const explicitTypeArguments = typeArgumentNodes(node);\n if (explicitTypeArguments.length === 0) {\n return false;\n }\n const callee = stripChainExpression(node.callee);\n const calleeType = callee ? typeAtNode(context, callee) : undefined;\n const signature = calleeType ? signatureForCall(context, node, calleeType) : undefined;\n const defaultTypeArguments = signature\n ? defaultTypeArgumentTextsForSignature(context, signature)\n : [];\n if (defaultTypeArguments.length === 0) {\n return false;\n }\n return explicitTypeArguments.every((typeArgument, index) => {\n const defaultTypeArgument = defaultTypeArguments[index];\n if (!defaultTypeArgument) {\n return false;\n }\n const explicit = normalizeTypeText(context.sourceCode.getText(typeArgument));\n return normalizeTypeText(defaultTypeArgument) === explicit;\n });\n}\n\nfunction typeArgumentNodes(node: any): readonly any[] {\n const candidates = [\n node.typeArguments?.params,\n node.typeParameters?.params,\n node.typeParameterInstantiation?.params,\n ];\n return candidates.find(Array.isArray) ?? [];\n}\n\nfunction signatureForCall(\n context: ContextWithParserOptions,\n node: any,\n calleeType: TsgoType,\n): TsgoSignature | undefined {\n const checker = checkerFor(context);\n const signatures = checker.getSignaturesOfType(calleeType, node.type === \"NewExpression\" ? 1 : 0);\n if (signatures.length <= 1) {\n return signatures[0];\n }\n const args = Array.isArray(node.arguments) ? node.arguments : [];\n return signatures\n .map((signature) => ({\n signature,\n score: scoreSignatureForArguments(context, signature, args),\n }))\n .sort((left, right) => right.score - left.score)[0]?.signature;\n}\n\nfunction scoreSignatureForArguments(\n context: ContextWithParserOptions,\n signature: TsgoSignature,\n args: readonly any[],\n): number {\n const parameterTypes = signatureParameters(signature).map((parameterId) =>\n parameterTypeTexts(context, parameterId),\n );\n let score = -Math.abs(args.length - parameterTypes.length);\n for (const [index, arg] of args.entries()) {\n const expected = parameterTypes[Math.min(index, parameterTypes.length - 1)] ?? [];\n const actual = typeTextsAtNode(context, arg);\n if (expected.length === 0) {\n score -= 2;\n } else if (isPermissiveTypeTexts(expected)) {\n score += 1;\n } else if (typeTextsOverlap(actual, expected)) {\n score += 4;\n } else {\n score -= 1;\n }\n }\n return score;\n}\n\nfunction signatureParameters(signature: TsgoSignature | undefined): readonly string[] {\n return Array.isArray(signature?.parameters) ? signature.parameters : [];\n}\n\nfunction parameterTypeTexts(\n context: ContextWithParserOptions,\n parameterId: string,\n): readonly string[] {\n const checker = checkerFor(context);\n const parameterSymbol = checker.getSymbol(parameterId) ?? ({ id: parameterId } as any);\n const declaration =\n checker.getNode(parameterSymbol.valueDeclaration) ??\n checker.getNode(parameterSymbol.declarations?.[0]);\n const parameterType =\n (declaration ? checker.getTypeOfSymbolAtLocation(parameterSymbol, declaration) : undefined) ??\n checker.getTypeOfSymbol(parameterSymbol) ??\n checker.getDeclaredTypeOfSymbol(parameterSymbol);\n const typeTexts = parameterType ? renderTypeTexts(context, parameterType) : [];\n const fallbackTexts = parameterAnnotationTexts(context, declaration);\n return typeTexts.length > 0 ? typeTexts : fallbackTexts;\n}\n\nfunction parameterAnnotationTexts(\n context: ContextWithParserOptions,\n declaration: TsgoNode | undefined,\n): readonly string[] {\n if (!declaration) {\n return [];\n }\n const sourceText = sourceTextForPath(context, declaration.fileName);\n if (\n !sourceText ||\n declaration.pos < 0 ||\n declaration.end > sourceText.length ||\n declaration.pos >= declaration.end\n ) {\n return [];\n }\n const parameterText = sourceText.slice(declaration.pos, declaration.end);\n const annotationStart = topLevelIndexOf(parameterText, \":\");\n if (annotationStart < 0) {\n return [];\n }\n const annotationText = parameterText.slice(annotationStart + 1);\n const defaultStart = topLevelIndexOf(annotationText, \"=\");\n const typeText = (defaultStart >= 0 ? annotationText.slice(0, defaultStart) : annotationText)\n .trim()\n .replace(/\\s+$/, \"\");\n return typeText ? [typeText] : [];\n}\n\nfunction typeTextsOverlap(actual: readonly string[], expected: readonly string[]): boolean {\n const normalizedExpected = expected.map(normalizeTypeText);\n return actual.some((actualText) => {\n const normalizedActual = normalizeTypeText(actualText);\n return normalizedExpected.some(\n (expectedText) =>\n expectedText === normalizedActual ||\n expectedText.includes(normalizedActual) ||\n normalizedActual.includes(expectedText),\n );\n });\n}\n\nfunction defaultTypeArgumentTextsForSignature(\n context: ContextWithParserOptions,\n signature: TsgoSignature,\n): readonly string[] {\n const declarationText = declarationTextForHandle(context, signature.declaration);\n if (!declarationText) {\n return [];\n }\n return typeParameterDefaultTexts(declarationText);\n}\n\nfunction declarationTextForHandle(\n context: ContextWithParserOptions,\n handleText: string | undefined,\n): string | undefined {\n if (!handleText) {\n return undefined;\n }\n const handle = parseNodeHandle(handleText);\n if (!handle) {\n return undefined;\n }\n const sourceText = sourceTextForPath(context, handle.path);\n if (!sourceText || handle.pos < 0 || handle.end > sourceText.length || handle.pos >= handle.end) {\n return undefined;\n }\n return sourceText.slice(handle.pos, handle.end);\n}\n\nfunction typeParameterDefaultTexts(declarationText: string): readonly string[] {\n const parametersText = firstDelimitedText(declarationText, \"<\", \">\");\n if (!parametersText) {\n return [];\n }\n return splitTopLevel(parametersText, \",\").map((parameterText) => {\n const defaultStart = topLevelIndexOf(parameterText, \"=\");\n return defaultStart >= 0 ? parameterText.slice(defaultStart + 1).trim() : \"\";\n });\n}\n\nfunction firstDelimitedText(text: string, open: string, close: string): string | undefined {\n const start = text.indexOf(open);\n if (start < 0) {\n return undefined;\n }\n let depth = 0;\n for (let index = start; index < text.length; index += 1) {\n const char = text[index];\n if (char === open) {\n depth += 1;\n } else if (char === close) {\n depth -= 1;\n if (depth === 0) {\n return text.slice(start + 1, index);\n }\n }\n }\n return undefined;\n}\n\nfunction splitTopLevel(text: string, delimiter: string): readonly string[] {\n const parts: string[] = [];\n let start = 0;\n let angleDepth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (char === \"<\") angleDepth += 1;\n else if (char === \">\") angleDepth = Math.max(0, angleDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (\n char === delimiter &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n parts.push(text.slice(start, index).trim());\n start = index + 1;\n }\n }\n parts.push(text.slice(start).trim());\n return parts;\n}\n\nfunction topLevelIndexOf(text: string, needle: string): number {\n let angleDepth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (char === \"<\") angleDepth += 1;\n else if (char === \">\") angleDepth = Math.max(0, angleDepth - 1);\n else if (char === \"(\") parenDepth += 1;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === \"[\") bracketDepth += 1;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"{\") braceDepth += 1;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (\n char === needle &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n return index;\n }\n }\n return -1;\n}\n\nfunction hasTypeOnlyValueExport(context: ContextWithParserOptions, node: any): boolean {\n if (node.exportKind === \"type\" || !Array.isArray(node.specifiers)) {\n return false;\n }\n const checker = checkerFor(context);\n return node.specifiers.some((specifier: any) => {\n if (specifier.exportKind === \"type\") {\n return false;\n }\n const target = specifier.local ?? specifier.exported;\n const symbol = target ? checker.getSymbolAtLocation(target) : undefined;\n return symbol !== undefined && symbol.valueDeclaration === undefined;\n });\n}\n\nfunction isDeprecatedSymbolUse(context: ContextWithParserOptions, node: any): boolean {\n const target = node.type === \"MemberExpression\" ? node.property : node;\n if (target?.type !== \"Identifier\") {\n return false;\n }\n const symbol = checkerFor(context).getSymbolAtLocation(target);\n return (\n symbol?.declarations?.some((declaration) =>\n declarationHasDeprecatedJSDoc(context, declaration),\n ) === true\n );\n}\n\nfunction declarationHasDeprecatedJSDoc(\n context: ContextWithParserOptions,\n declaration: string,\n): boolean {\n const handle = parseNodeHandle(declaration);\n if (!handle) {\n return false;\n }\n const sourceText = sourceTextForPath(context, handle.path);\n if (!sourceText) {\n return false;\n }\n const pos = handle.pos;\n if (!Number.isFinite(pos)) {\n return false;\n }\n return sourceText.slice(Math.max(0, pos - 500), pos).includes(\"@deprecated\");\n}\n\nfunction parseNodeHandle(\n value: string,\n): { readonly pos: number; readonly end: number; readonly path: string } | undefined {\n const [posText, endText, _kindText, ...pathParts] = value.split(\".\");\n const pos = Number(posText);\n const end = Number(endText);\n if (!Number.isFinite(pos) || !Number.isFinite(end)) {\n return undefined;\n }\n return { pos, end, path: pathParts.join(\".\") };\n}\n\nfunction sourceTextForPath(context: ContextWithParserOptions, path: string): string | undefined {\n if (!path || path === context.filename || context.filename.endsWith(path)) {\n return context.sourceCode.text;\n }\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n try {\n return readFileSync(`${context.cwd}/${path}`, \"utf8\");\n } catch {\n return undefined;\n }\n }\n}\n\nfunction hasSingleUseTypeParameter(context: ContextWithParserOptions, node: any): boolean {\n const params = Array.isArray(node.params) ? node.params : [];\n if (params.length !== 1) {\n return false;\n }\n const name = typeParameterName(params[0]);\n if (!name) {\n return false;\n }\n const ownerText = node.parent\n ? context.sourceCode.getText(node.parent)\n : context.sourceCode.getText(node);\n const matches = ownerText.match(new RegExp(`\\\\b${escapeRegExp(name)}\\\\b`, \"g\")) ?? [];\n return matches.length <= 2;\n}\n\nfunction typeParameterName(node: any): string | undefined {\n if (typeof node?.name === \"string\") {\n return node.name;\n }\n if (typeof node?.name?.name === \"string\") {\n return node.name.name;\n }\n return undefined;\n}\n\nfunction normalizeTypeText(text: string): string {\n return text.replace(/\\s+/g, \"\");\n}\n\nfunction escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction renderTypeTexts(context: ContextWithParserOptions, type: TsgoType): readonly string[] {\n const texts = new Set<string>();\n const checker = checkerFor(context);\n for (const text of [...(type.texts ?? []), checker.typeToString(type)]) {\n if (text) {\n texts.add(text);\n }\n }\n return [...texts];\n}\n\nfunction isPromiseExecutorRejectCall(context: ContextWithParserOptions, node: any): boolean {\n const callee = stripChainExpression(node.callee);\n if (callee?.type !== \"Identifier\") {\n return false;\n }\n const nearestFunction = nearestFunctionAncestor(context, node);\n const rejectParam = nearestFunction?.params?.[1];\n if (!rejectParam || rejectParam.type !== \"Identifier\" || rejectParam.name !== callee.name) {\n return false;\n }\n const promiseConstructor = stripChainExpression(nearestFunction.parent?.parent);\n return (\n (nearestFunction.parent?.type === \"NewExpression\" &&\n isIdentifierNamed(nearestFunction.parent.callee, \"Promise\")) ||\n (promiseConstructor?.type === \"NewExpression\" &&\n isIdentifierNamed(promiseConstructor.callee, \"Promise\"))\n );\n}\n\nfunction returnAwaitRequiresAwait(context: ContextWithParserOptions, node: any): boolean {\n const ancestors = (context.sourceCode as any)?.getAncestors?.(node) ?? [];\n return ancestors.some(\n (ancestor: any) =>\n ancestor.type === \"TryStatement\" &&\n (rangeContains(ancestor.block, node) ||\n rangeContains(ancestor.handler?.body, node) ||\n rangeContains(ancestor.finalizer, node)),\n );\n}\n\nfunction rangeContains(container: any, node: any): boolean {\n return (\n isRange(container?.range) &&\n isRange(node?.range) &&\n container.range[0] <= node.range[0] &&\n node.range[1] <= container.range[1]\n );\n}\n\nfunction nearestFunctionAncestor(context: ContextWithParserOptions, node: any): any {\n const ancestors = (context.sourceCode as any)?.getAncestors?.(node) ?? [];\n return [...ancestors].reverse().find((ancestor: any) => ancestor.type?.includes(\"Function\"));\n}\n\nfunction nearestClassAncestor(context: ContextWithParserOptions, node: any): any {\n const ancestors = (context.sourceCode as any)?.getAncestors?.(node) ?? [];\n return [...ancestors]\n .reverse()\n .find(\n (ancestor: any) =>\n ancestor.type === \"ClassDeclaration\" || ancestor.type === \"ClassExpression\",\n );\n}\n\nfunction isFunctionLike(node: any): boolean {\n return typeof node?.type === \"string\" && node.type.includes(\"Function\");\n}\n\nfunction returnTypeTextsOfNearestFunction(\n context: ContextWithParserOptions,\n node: any,\n): readonly string[] {\n const owner = nearestFunctionAncestor(context, node);\n return owner ? returnTypeTextsOfFunction(context, owner) : [];\n}\n\nfunction returnTypeTextsOfFunction(\n context: ContextWithParserOptions,\n node: any,\n): readonly string[] {\n const explicitAnnotation = node.returnType?.typeAnnotation ?? node.returnType;\n if (explicitAnnotation) {\n const text = context.sourceCode.getText(explicitAnnotation);\n if (text) {\n return [text];\n }\n }\n\n const checker = checkerFor(context);\n const type = typeAtNode(context, node);\n if (!type) {\n return [];\n }\n\n const texts = new Set<string>();\n for (const signature of checker.getSignaturesOfType(type, 0)) {\n const returnType = checker.getReturnTypeOfSignature(signature);\n if (!returnType) {\n continue;\n }\n for (const text of [...(returnType.texts ?? []), checker.typeToString(returnType)]) {\n if (text) {\n texts.add(text);\n }\n }\n }\n\n const resolved = [...texts];\n return resolved.every(isPermissiveTypeText) ? [] : resolved;\n}\n\nfunction isPermissiveTypeText(text: string): boolean {\n return text === \"any\" || text === \"unknown\" || text === \"never\";\n}\n\nfunction isPermissiveTypeTexts(texts: readonly string[]): boolean {\n return texts.some((text) => isPermissiveTypeText(normalizeTypeText(text)));\n}\n\nfunction stripChainExpression(node: any): any {\n let current = node;\n while (current?.type === \"ChainExpression\") {\n current = current.expression;\n }\n return current;\n}\n\nfunction isIdentifierNamed(node: any, name: string): boolean {\n const current = stripChainExpression(node);\n return current?.type === \"Identifier\" && current.name === name;\n}\n\nfunction isNativeChildNode(value: unknown): value is RangedNode {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\" &&\n isRange((value as { range?: unknown }).range)\n );\n}\n\nfunction isRange(value: unknown): value is readonly [number, number] {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === \"number\" &&\n typeof value[1] === \"number\"\n );\n}\n\nfunction isJsonPrimitive(value: unknown): value is string | number | boolean | null {\n return value === null || [\"boolean\", \"number\", \"string\"].includes(typeof value);\n}\n\nfunction isJsonValue(value: unknown): boolean {\n if (isJsonPrimitive(value)) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n return typeof value === \"object\" && value !== null && Object.values(value).every(isJsonValue);\n}\n\nfunction isPrimitiveRecord(\n value: unknown,\n): value is Record<string, string | number | boolean | null> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.values(value).every(isJsonPrimitive)\n );\n}\n\nfunction isSkippedField(key: string): boolean {\n return key === \"type\" || key === \"range\" || key === \"loc\" || key === \"parent\";\n}\n"],"mappings":"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"}
|