corsa-oxlint 0.11.0 → 0.13.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 +5 -5
- package/dist/checker.js +104 -1
- package/dist/checker.js.map +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/context.js +2 -2
- package/dist/context.js.map +1 -1
- package/dist/node_map.js +2 -2
- package/dist/node_map.js.map +1 -1
- package/dist/parser_services.js +28 -0
- package/dist/parser_services.js.map +1 -1
- package/dist/rules/native_bridge.js +1 -1
- package/dist/rules/native_bridge.js.map +1 -1
- package/dist/session.js +26 -4
- package/dist/session.js.map +1 -1
- package/dist/ts_eslint.js +1 -1
- package/dist/ts_eslint.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# corsa
|
|
1
|
+
# corsa oxlint
|
|
2
2
|
|
|
3
|
-
`corsa
|
|
3
|
+
`corsa oxlint` is a self-hosted type-aware framework for building Oxlint JS
|
|
4
4
|
plugins with real type information powered by Corsa.
|
|
5
5
|
|
|
6
6
|
> [!WARNING]
|
|
@@ -26,7 +26,7 @@ custom rules in plain JS/TS.
|
|
|
26
26
|
## Configuration
|
|
27
27
|
|
|
28
28
|
Oxlint does not expose arbitrary parser options at runtime, so
|
|
29
|
-
`corsa
|
|
29
|
+
`corsa oxlint` reads its type-aware settings from `settings.typescriptOxlint`.
|
|
30
30
|
|
|
31
31
|
```ts
|
|
32
32
|
import { OxlintUtils } from "corsa-oxlint";
|
|
@@ -94,7 +94,7 @@ export default [
|
|
|
94
94
|
|
|
95
95
|
## Native Rules
|
|
96
96
|
|
|
97
|
-
`corsa
|
|
97
|
+
`corsa oxlint` exports the TS-native rule set and plugin surface via `corsa-oxlint/rules`.
|
|
98
98
|
Rule parity is tracked against upstream `tsgolint/internal/rules`, but the
|
|
99
99
|
runtime implementation lives entirely in this package.
|
|
100
100
|
|
|
@@ -128,7 +128,7 @@ General-purpose built-in rules can be implemented as Rust rules and still ship
|
|
|
128
128
|
as Oxlint JS plugin rules. The bridge is:
|
|
129
129
|
|
|
130
130
|
1. Oxlint visits the ESTree node in JS.
|
|
131
|
-
2. `corsa
|
|
131
|
+
2. `corsa oxlint` collects compact node facts and type texts.
|
|
132
132
|
3. `@corsa-bind/napi` calls `corsa::lint::RustLintRule`.
|
|
133
133
|
4. Rust returns Oxlint-shaped diagnostics, suggestions, and fixes.
|
|
134
134
|
5. The JS rule reports them through `context.report()`.
|
package/dist/checker.js
CHANGED
|
@@ -27,6 +27,7 @@ function createProgram(context) {
|
|
|
27
27
|
function createTypeChecker(context) {
|
|
28
28
|
return {
|
|
29
29
|
getTypeAtLocation(node) {
|
|
30
|
+
if (node.type === "NewExpression") return typeOfNewExpression(node, this);
|
|
30
31
|
const lookupNode = nodeForTypeLookup(node);
|
|
31
32
|
return sessionForContext(context).session.getTypeAtPosition(filenameFor(context, lookupNode), toPosition(lookupNode), sourceTextFor(context, lookupNode));
|
|
32
33
|
},
|
|
@@ -80,12 +81,16 @@ function createTypeChecker(context) {
|
|
|
80
81
|
return sessionForContext(context).session.getBaseTypes(type);
|
|
81
82
|
},
|
|
82
83
|
getImplementedTypes(node) {
|
|
84
|
+
if ("pos" in node) return implementedTypesFromTsgoNode(context, node, this);
|
|
83
85
|
return implementedClauseNodes(node).map((clause) => {
|
|
84
86
|
const expression = implementedClauseChildNode(clause, "expression") ?? clause;
|
|
85
87
|
const symbol = this.getSymbolAtLocation(expression) ?? this.getSymbolAtLocation(clause);
|
|
86
88
|
return symbol ? this.getDeclaredTypeOfSymbol(symbol) ?? this.getTypeOfSymbol(symbol) : this.getTypeAtLocation(expression) ?? this.getTypeAtLocation(clause);
|
|
87
89
|
}).filter((type) => type !== void 0);
|
|
88
90
|
},
|
|
91
|
+
getImplementedTypesOfType(type) {
|
|
92
|
+
return sessionForContext(context).session.getBaseTypes(type);
|
|
93
|
+
},
|
|
89
94
|
getTypeArguments(type) {
|
|
90
95
|
return sessionForContext(context).session.getTypeArguments(type);
|
|
91
96
|
},
|
|
@@ -135,7 +140,17 @@ const typeFlags = {
|
|
|
135
140
|
intersection: 1 << 28
|
|
136
141
|
};
|
|
137
142
|
function sourceTextFor(context, node) {
|
|
138
|
-
|
|
143
|
+
const normalizedFileName = filenameFor(context, node).toLowerCase();
|
|
144
|
+
const normalizedContextFilename = context.filename.toLowerCase();
|
|
145
|
+
return normalizedFileName === normalizedContextFilename || normalizedFileName.endsWith(normalizedContextFilename) || normalizedContextFilename.endsWith(normalizedFileName) ? context.sourceCode.text : void 0;
|
|
146
|
+
}
|
|
147
|
+
function typeOfNewExpression(node, checker) {
|
|
148
|
+
const callee = childNode(node, "callee");
|
|
149
|
+
if (!callee) return;
|
|
150
|
+
const calleeType = checker.getTypeAtLocation(callee);
|
|
151
|
+
if (!calleeType) return;
|
|
152
|
+
const constructSignature = checker.getSignaturesOfType(calleeType, 1)[0];
|
|
153
|
+
return constructSignature ? checker.getReturnTypeOfSignature(constructSignature) ?? calleeType : calleeType;
|
|
139
154
|
}
|
|
140
155
|
function nodeForTypeLookup(node) {
|
|
141
156
|
if ("pos" in node) return node;
|
|
@@ -160,6 +175,94 @@ function implementedClauseChildNode(node, key) {
|
|
|
160
175
|
const value = node[key];
|
|
161
176
|
if (isNode(value)) return value;
|
|
162
177
|
}
|
|
178
|
+
function implementedTypesFromTsgoNode(context, node, checker) {
|
|
179
|
+
const symbol = checker.getSymbolAtLocation(node);
|
|
180
|
+
if (symbol) {
|
|
181
|
+
const declaredType = checker.getDeclaredTypeOfSymbol(symbol) ?? checker.getTypeOfSymbol(symbol);
|
|
182
|
+
if (declaredType) {
|
|
183
|
+
const implemented = checker.getImplementedTypesOfType(declaredType);
|
|
184
|
+
if (implemented.length > 0) return implemented;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const sourceText = sourceTextFor(context, node);
|
|
188
|
+
if (sourceText) {
|
|
189
|
+
const classText = sourceText.slice(node.pos, node.end);
|
|
190
|
+
const bodyOpen = classText.indexOf("{");
|
|
191
|
+
const headerText = bodyOpen >= 0 ? classText.slice(0, bodyOpen) : classText;
|
|
192
|
+
const implementsIndex = headerText.indexOf("implements");
|
|
193
|
+
if (implementsIndex >= 0) {
|
|
194
|
+
const clauseText = headerText.slice(implementsIndex + 10);
|
|
195
|
+
return splitTopLevelRanges(clauseText, ",").map((range) => {
|
|
196
|
+
const raw = clauseText.slice(range.start, range.end);
|
|
197
|
+
const leading = raw.search(/\S/);
|
|
198
|
+
if (leading < 0) return;
|
|
199
|
+
const trailing = raw.match(/\s*$/)?.[0].length ?? 0;
|
|
200
|
+
const pos = node.pos + implementsIndex + 10 + range.start + leading;
|
|
201
|
+
const end = node.pos + implementsIndex + 10 + range.end - trailing;
|
|
202
|
+
const lookupNode = {
|
|
203
|
+
fileName: node.fileName,
|
|
204
|
+
pos,
|
|
205
|
+
end,
|
|
206
|
+
range: [pos, end]
|
|
207
|
+
};
|
|
208
|
+
const symbol = checker.getSymbolAtLocation(lookupNode);
|
|
209
|
+
return symbol ? checker.getDeclaredTypeOfSymbol(symbol) ?? checker.getTypeOfSymbol(symbol) : checker.getTypeAtLocation(lookupNode);
|
|
210
|
+
}).filter((type) => type !== void 0);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const type = checker.getTypeAtLocation(node);
|
|
214
|
+
return type ? checker.getImplementedTypesOfType(type) : [];
|
|
215
|
+
}
|
|
216
|
+
function splitTopLevelRanges(text, delimiter) {
|
|
217
|
+
const ranges = [];
|
|
218
|
+
const scanner = createScanner();
|
|
219
|
+
let start = 0;
|
|
220
|
+
let angleDepth = 0;
|
|
221
|
+
let parenDepth = 0;
|
|
222
|
+
let bracketDepth = 0;
|
|
223
|
+
let braceDepth = 0;
|
|
224
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
225
|
+
const char = text[index];
|
|
226
|
+
if (scanner.inQuote(char)) continue;
|
|
227
|
+
if (char === "<") angleDepth += 1;
|
|
228
|
+
else if (char === ">") angleDepth = Math.max(0, angleDepth - 1);
|
|
229
|
+
else if (char === "(") parenDepth += 1;
|
|
230
|
+
else if (char === ")") parenDepth = Math.max(0, parenDepth - 1);
|
|
231
|
+
else if (char === "[") bracketDepth += 1;
|
|
232
|
+
else if (char === "]") bracketDepth = Math.max(0, bracketDepth - 1);
|
|
233
|
+
else if (char === "{") braceDepth += 1;
|
|
234
|
+
else if (char === "}") braceDepth = Math.max(0, braceDepth - 1);
|
|
235
|
+
else if (char === delimiter && angleDepth === 0 && parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) {
|
|
236
|
+
ranges.push({
|
|
237
|
+
start,
|
|
238
|
+
end: index
|
|
239
|
+
});
|
|
240
|
+
start = index + 1;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
ranges.push({
|
|
244
|
+
start,
|
|
245
|
+
end: text.length
|
|
246
|
+
});
|
|
247
|
+
return ranges;
|
|
248
|
+
}
|
|
249
|
+
function createScanner() {
|
|
250
|
+
let quote;
|
|
251
|
+
let escaped = false;
|
|
252
|
+
return { inQuote(char) {
|
|
253
|
+
if (quote) {
|
|
254
|
+
if (escaped) escaped = false;
|
|
255
|
+
else if (char === "\\") escaped = true;
|
|
256
|
+
else if (char === quote) quote = void 0;
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
if (char === "\"" || char === "'" || char === "`") {
|
|
260
|
+
quote = char;
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
return false;
|
|
264
|
+
} };
|
|
265
|
+
}
|
|
163
266
|
function isNode(value) {
|
|
164
267
|
return typeof value === "object" && value !== null && "type" in value && "range" in value;
|
|
165
268
|
}
|
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 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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"}
|
|
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 if ((node as { readonly type?: string }).type === \"NewExpression\") {\n return typeOfNewExpression(node as Node, this);\n }\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 if (\"pos\" in node) {\n return implementedTypesFromTsgoNode(context, node, this);\n }\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 getImplementedTypesOfType(type) {\n return sessionForContext(context).session.getBaseTypes(type);\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 const fileName = filenameFor(context, node);\n const normalizedFileName = fileName.toLowerCase();\n const normalizedContextFilename = context.filename.toLowerCase();\n return normalizedFileName === normalizedContextFilename ||\n normalizedFileName.endsWith(normalizedContextFilename) ||\n normalizedContextFilename.endsWith(normalizedFileName)\n ? context.sourceCode.text\n : undefined;\n}\n\nfunction typeOfNewExpression(node: Node, checker: TsgoTypeCheckerShape): TsgoType | undefined {\n const callee = childNode(node, \"callee\");\n if (!callee) {\n return undefined;\n }\n const calleeType = checker.getTypeAtLocation(callee);\n if (!calleeType) {\n return undefined;\n }\n const constructSignature = checker.getSignaturesOfType(calleeType, 1)[0];\n return constructSignature\n ? (checker.getReturnTypeOfSignature(constructSignature) ?? calleeType)\n : calleeType;\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 implementedTypesFromTsgoNode(\n context: ContextWithParserOptions,\n node: TsgoNode,\n checker: TsgoTypeCheckerShape,\n): readonly TsgoType[] {\n const symbol = checker.getSymbolAtLocation(node);\n if (symbol) {\n const declaredType = checker.getDeclaredTypeOfSymbol(symbol) ?? checker.getTypeOfSymbol(symbol);\n if (declaredType) {\n const implemented = checker.getImplementedTypesOfType(declaredType);\n if (implemented.length > 0) {\n return implemented;\n }\n }\n }\n const sourceText = sourceTextFor(context, node);\n if (sourceText) {\n const classText = sourceText.slice(node.pos, node.end);\n const bodyOpen = classText.indexOf(\"{\");\n const headerText = bodyOpen >= 0 ? classText.slice(0, bodyOpen) : classText;\n const implementsIndex = headerText.indexOf(\"implements\");\n if (implementsIndex >= 0) {\n const clauseText = headerText.slice(implementsIndex + \"implements\".length);\n const implemented = splitTopLevelRanges(clauseText, \",\")\n .map((range) => {\n const raw = clauseText.slice(range.start, range.end);\n const leading = raw.search(/\\S/);\n if (leading < 0) {\n return undefined;\n }\n const trailing = raw.match(/\\s*$/)?.[0].length ?? 0;\n const pos = node.pos + implementsIndex + \"implements\".length + range.start + leading;\n const end = node.pos + implementsIndex + \"implements\".length + range.end - trailing;\n const lookupNode: TsgoNode = {\n fileName: node.fileName,\n pos,\n end,\n range: [pos, end] as const,\n };\n const symbol = checker.getSymbolAtLocation(lookupNode);\n return symbol\n ? (checker.getDeclaredTypeOfSymbol(symbol) ?? checker.getTypeOfSymbol(symbol))\n : checker.getTypeAtLocation(lookupNode);\n })\n .filter((type): type is TsgoType => type !== undefined);\n return implemented;\n }\n }\n const type = checker.getTypeAtLocation(node);\n return type ? checker.getImplementedTypesOfType(type) : [];\n}\n\nfunction splitTopLevelRanges(\n text: string,\n delimiter: string,\n): readonly { readonly start: number; readonly end: number }[] {\n const ranges: { start: number; end: number }[] = [];\n const scanner = createScanner();\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 (scanner.inQuote(char)) {\n continue;\n }\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 ranges.push({ start, end: index });\n start = index + 1;\n }\n }\n ranges.push({ start, end: text.length });\n return ranges;\n}\n\nfunction createScanner(): {\n inQuote(char: string): boolean;\n} {\n let quote: string | undefined;\n let escaped = false;\n return {\n inQuote(char) {\n if (quote) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === quote) {\n quote = undefined;\n }\n return true;\n }\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n return true;\n }\n return false;\n },\n };\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/context.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ declare function resolveProjectConfig(context: ContextWithParserOptions): Resolv
|
|
|
8
8
|
* Resolves the type-aware parser options visible to a rule.
|
|
9
9
|
*
|
|
10
10
|
* Oxlint exposes a fixed `context.languageOptions.parserOptions` object at
|
|
11
|
-
* runtime, so `corsa
|
|
11
|
+
* runtime, so `corsa oxlint` stores its richer configuration under
|
|
12
12
|
* `settings.typescriptOxlint` and rehydrates the rule-facing parser options
|
|
13
13
|
* shape from there.
|
|
14
14
|
*
|
package/dist/context.js
CHANGED
|
@@ -23,7 +23,7 @@ function resolveProjectConfig(context) {
|
|
|
23
23
|
const rootDir = resolve(parserOptions.tsconfigRootDir ?? context.cwd);
|
|
24
24
|
const runtime = resolveRuntimeOptions(rootDir, parserOptions);
|
|
25
25
|
const configPath = resolveExplicitProject(rootDir, parserOptions) ?? discoverTsconfig(filename, rootDir) ?? resolveDefaultProject(rootDir, filename, parserOptions.projectService);
|
|
26
|
-
if (!configPath) throw new Error(`corsa
|
|
26
|
+
if (!configPath) throw new Error(`corsa oxlint could not resolve a tsconfig for ${filename}`);
|
|
27
27
|
return {
|
|
28
28
|
filename,
|
|
29
29
|
rootDir,
|
|
@@ -35,7 +35,7 @@ function resolveProjectConfig(context) {
|
|
|
35
35
|
* Resolves the type-aware parser options visible to a rule.
|
|
36
36
|
*
|
|
37
37
|
* Oxlint exposes a fixed `context.languageOptions.parserOptions` object at
|
|
38
|
-
* runtime, so `corsa
|
|
38
|
+
* runtime, so `corsa oxlint` stores its richer configuration under
|
|
39
39
|
* `settings.typescriptOxlint` and rehydrates the rule-facing parser options
|
|
40
40
|
* shape from there.
|
|
41
41
|
*
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../ts/context.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\n\nimport type {\n ContextWithParserOptions,\n ProjectServiceOptions,\n ResolvedProjectConfig,\n ResolvedRuntimeOptions,\n TypeAwareParserOptions,\n TypescriptOxlintSettings,\n} from \"./types\";\n\nconst DEFAULT_CACHE_LIFETIME_MS = 250;\nconst DEFAULT_PROJECT_PATTERNS = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\nconst DEFAULT_TS_CONFIG = {\n compilerOptions: {\n module: \"esnext\",\n target: \"es2022\",\n strict: true,\n },\n};\n\nexport function defaultCorsaExecutable(rootDir: string, platform = process.platform): string {\n return resolve(rootDir, platform === \"win32\" ? \".cache/tsgo.exe\" : \".cache/tsgo\");\n}\n\nexport const defaultTsgoExecutable = defaultCorsaExecutable;\n\nexport function resolveProjectConfig(context: ContextWithParserOptions): ResolvedProjectConfig {\n const filename = resolve(context.filename);\n const parserOptions = resolveTypeAwareParserOptions(context);\n const rootDir = resolve(parserOptions.tsconfigRootDir ?? context.cwd);\n const runtime = resolveRuntimeOptions(rootDir, parserOptions);\n const configPath =\n resolveExplicitProject(rootDir, parserOptions) ??\n discoverTsconfig(filename, rootDir) ??\n resolveDefaultProject(rootDir, filename, parserOptions.projectService);\n if (!configPath) {\n throw new Error(`corsa-oxlint could not resolve a tsconfig for ${filename}`);\n }\n return { filename, rootDir, configPath, runtime };\n}\n\n/**\n * Resolves the type-aware parser options visible to a rule.\n *\n * Oxlint exposes a fixed `context.languageOptions.parserOptions` object at\n * runtime, so `corsa-oxlint` stores its richer configuration under\n * `settings.typescriptOxlint` and rehydrates the rule-facing parser options\n * shape from there.\n *\n * @example\n * ```ts\n * const parserOptions = resolveTypeAwareParserOptions(context);\n * parserOptions.corsa?.mode;\n * ```\n */\nexport function resolveTypeAwareParserOptions(\n context: ContextWithParserOptions,\n): TypeAwareParserOptions {\n return mergeTypeAwareParserOptions(\n resolveSettingsParserOptions(context.settings?.typescriptOxlint),\n mergeTypeAwareParserOptions(context.parserOptions, context.languageOptions?.parserOptions),\n );\n}\n\nfunction resolveRuntimeOptions(\n rootDir: string,\n parserOptions: TypeAwareParserOptions,\n): ResolvedRuntimeOptions {\n const runtime = parserOptions.corsa ?? parserOptions.tsgo;\n return {\n executable: resolve(\n runtime?.executable ??\n process.env.CORSA_EXECUTABLE ??\n process.env.TSGO_EXECUTABLE ??\n defaultCorsaExecutable(rootDir),\n ),\n cwd: resolve(runtime?.cwd ?? rootDir),\n mode: runtime?.mode ?? \"msgpack\",\n cacheLifetimeMs: runtime?.cacheLifetimeMs ?? DEFAULT_CACHE_LIFETIME_MS,\n };\n}\n\nfunction resolveExplicitProject(\n rootDir: string,\n parserOptions: TypeAwareParserOptions,\n): string | undefined {\n const projects = asArray(parserOptions.project).map((project) => {\n return resolve(rootDir, project);\n });\n return projects.find(existsSync);\n}\n\nfunction discoverTsconfig(filename: string, rootDir: string): string | undefined {\n let current = dirname(filename);\n const boundary = resolve(rootDir);\n while (current.startsWith(boundary)) {\n const candidate = resolve(current, \"tsconfig.json\");\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n return undefined;\n}\n\nfunction resolveDefaultProject(\n rootDir: string,\n filename: string,\n projectService: boolean | ProjectServiceOptions | undefined,\n): string | undefined {\n if (!projectService) {\n return undefined;\n }\n if (projectService !== true && projectService.defaultProject) {\n return resolve(rootDir, projectService.defaultProject);\n }\n if (!matchesDefaultProject(filename, projectService as true | ProjectServiceOptions)) {\n return undefined;\n }\n const id = Buffer.from(filename).toString(\"hex\").slice(0, 24);\n const cacheDir = resolve(rootDir, \".cache/typescript_oxlint/default\");\n const configPath = resolve(cacheDir, `${id}.tsconfig.json`);\n if (!existsSync(configPath)) {\n mkdirSync(cacheDir, { recursive: true });\n writeFileSync(\n configPath,\n JSON.stringify(\n {\n ...DEFAULT_TS_CONFIG,\n files: [filename],\n },\n null,\n 2,\n ),\n );\n }\n return configPath;\n}\n\nfunction matchesDefaultProject(\n filename: string,\n projectService: true | ProjectServiceOptions,\n): boolean {\n const patterns =\n (projectService === true ? undefined : projectService.allowDefaultProject) ??\n DEFAULT_PROJECT_PATTERNS;\n return patterns.some((pattern: string) => globMatch(filename, pattern));\n}\n\nfunction globMatch(value: string, pattern: string): boolean {\n const escaped = pattern.replaceAll(\".\", \"\\\\.\").replaceAll(\"*\", \".*\");\n return new RegExp(`${escaped}$`).test(value);\n}\n\nfunction asArray(value: string | string[] | undefined): string[] {\n return value ? (Array.isArray(value) ? value : [value]) : [];\n}\n\nfunction resolveSettingsParserOptions(\n settings: TypescriptOxlintSettings | undefined,\n): TypeAwareParserOptions {\n if (!settings) {\n return {};\n }\n const { parserOptions, ...inline } = settings;\n return mergeTypeAwareParserOptions(inline, parserOptions);\n}\n\nexport function mergeTypeAwareParserOptions(\n base: TypeAwareParserOptions | undefined,\n override: TypeAwareParserOptions | undefined,\n): TypeAwareParserOptions {\n if (!base) {\n return normalizeTypeAwareParserOptions(override ?? {});\n }\n if (!override) {\n return normalizeTypeAwareParserOptions(base);\n }\n const runtime = {\n ...(base.corsa ?? base.tsgo),\n ...(override.corsa ?? override.tsgo),\n };\n return {\n ...base,\n ...override,\n project: override.project ?? base.project,\n projectService: mergeProjectService(base.projectService, override.projectService),\n tsconfigRootDir: override.tsconfigRootDir ?? base.tsconfigRootDir,\n ...(Object.keys(runtime).length > 0 ? { corsa: runtime, tsgo: runtime } : {}),\n };\n}\n\nfunction normalizeTypeAwareParserOptions(options: TypeAwareParserOptions): TypeAwareParserOptions {\n const runtime = options.corsa ?? options.tsgo;\n if (!runtime) {\n return options;\n }\n return {\n ...options,\n corsa: runtime,\n tsgo: runtime,\n };\n}\n\nfunction mergeProjectService(\n base: boolean | ProjectServiceOptions | undefined,\n override: boolean | ProjectServiceOptions | undefined,\n): boolean | ProjectServiceOptions | undefined {\n if (override === undefined) {\n return base;\n }\n if (typeof override === \"boolean\") {\n return override;\n }\n if (base === undefined || typeof base === \"boolean\") {\n return override;\n }\n return {\n ...base,\n ...override,\n allowDefaultProject: override.allowDefaultProject ?? base.allowDefaultProject,\n defaultProject: override.defaultProject ?? base.defaultProject,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../ts/context.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\n\nimport type {\n ContextWithParserOptions,\n ProjectServiceOptions,\n ResolvedProjectConfig,\n ResolvedRuntimeOptions,\n TypeAwareParserOptions,\n TypescriptOxlintSettings,\n} from \"./types\";\n\nconst DEFAULT_CACHE_LIFETIME_MS = 250;\nconst DEFAULT_PROJECT_PATTERNS = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\nconst DEFAULT_TS_CONFIG = {\n compilerOptions: {\n module: \"esnext\",\n target: \"es2022\",\n strict: true,\n },\n};\n\nexport function defaultCorsaExecutable(rootDir: string, platform = process.platform): string {\n return resolve(rootDir, platform === \"win32\" ? \".cache/tsgo.exe\" : \".cache/tsgo\");\n}\n\nexport const defaultTsgoExecutable = defaultCorsaExecutable;\n\nexport function resolveProjectConfig(context: ContextWithParserOptions): ResolvedProjectConfig {\n const filename = resolve(context.filename);\n const parserOptions = resolveTypeAwareParserOptions(context);\n const rootDir = resolve(parserOptions.tsconfigRootDir ?? context.cwd);\n const runtime = resolveRuntimeOptions(rootDir, parserOptions);\n const configPath =\n resolveExplicitProject(rootDir, parserOptions) ??\n discoverTsconfig(filename, rootDir) ??\n resolveDefaultProject(rootDir, filename, parserOptions.projectService);\n if (!configPath) {\n throw new Error(`corsa oxlint could not resolve a tsconfig for ${filename}`);\n }\n return { filename, rootDir, configPath, runtime };\n}\n\n/**\n * Resolves the type-aware parser options visible to a rule.\n *\n * Oxlint exposes a fixed `context.languageOptions.parserOptions` object at\n * runtime, so `corsa oxlint` stores its richer configuration under\n * `settings.typescriptOxlint` and rehydrates the rule-facing parser options\n * shape from there.\n *\n * @example\n * ```ts\n * const parserOptions = resolveTypeAwareParserOptions(context);\n * parserOptions.corsa?.mode;\n * ```\n */\nexport function resolveTypeAwareParserOptions(\n context: ContextWithParserOptions,\n): TypeAwareParserOptions {\n return mergeTypeAwareParserOptions(\n resolveSettingsParserOptions(context.settings?.typescriptOxlint),\n mergeTypeAwareParserOptions(context.parserOptions, context.languageOptions?.parserOptions),\n );\n}\n\nfunction resolveRuntimeOptions(\n rootDir: string,\n parserOptions: TypeAwareParserOptions,\n): ResolvedRuntimeOptions {\n const runtime = parserOptions.corsa ?? parserOptions.tsgo;\n return {\n executable: resolve(\n runtime?.executable ??\n process.env.CORSA_EXECUTABLE ??\n process.env.TSGO_EXECUTABLE ??\n defaultCorsaExecutable(rootDir),\n ),\n cwd: resolve(runtime?.cwd ?? rootDir),\n mode: runtime?.mode ?? \"msgpack\",\n cacheLifetimeMs: runtime?.cacheLifetimeMs ?? DEFAULT_CACHE_LIFETIME_MS,\n };\n}\n\nfunction resolveExplicitProject(\n rootDir: string,\n parserOptions: TypeAwareParserOptions,\n): string | undefined {\n const projects = asArray(parserOptions.project).map((project) => {\n return resolve(rootDir, project);\n });\n return projects.find(existsSync);\n}\n\nfunction discoverTsconfig(filename: string, rootDir: string): string | undefined {\n let current = dirname(filename);\n const boundary = resolve(rootDir);\n while (current.startsWith(boundary)) {\n const candidate = resolve(current, \"tsconfig.json\");\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n return undefined;\n}\n\nfunction resolveDefaultProject(\n rootDir: string,\n filename: string,\n projectService: boolean | ProjectServiceOptions | undefined,\n): string | undefined {\n if (!projectService) {\n return undefined;\n }\n if (projectService !== true && projectService.defaultProject) {\n return resolve(rootDir, projectService.defaultProject);\n }\n if (!matchesDefaultProject(filename, projectService as true | ProjectServiceOptions)) {\n return undefined;\n }\n const id = Buffer.from(filename).toString(\"hex\").slice(0, 24);\n const cacheDir = resolve(rootDir, \".cache/typescript_oxlint/default\");\n const configPath = resolve(cacheDir, `${id}.tsconfig.json`);\n if (!existsSync(configPath)) {\n mkdirSync(cacheDir, { recursive: true });\n writeFileSync(\n configPath,\n JSON.stringify(\n {\n ...DEFAULT_TS_CONFIG,\n files: [filename],\n },\n null,\n 2,\n ),\n );\n }\n return configPath;\n}\n\nfunction matchesDefaultProject(\n filename: string,\n projectService: true | ProjectServiceOptions,\n): boolean {\n const patterns =\n (projectService === true ? undefined : projectService.allowDefaultProject) ??\n DEFAULT_PROJECT_PATTERNS;\n return patterns.some((pattern: string) => globMatch(filename, pattern));\n}\n\nfunction globMatch(value: string, pattern: string): boolean {\n const escaped = pattern.replaceAll(\".\", \"\\\\.\").replaceAll(\"*\", \".*\");\n return new RegExp(`${escaped}$`).test(value);\n}\n\nfunction asArray(value: string | string[] | undefined): string[] {\n return value ? (Array.isArray(value) ? value : [value]) : [];\n}\n\nfunction resolveSettingsParserOptions(\n settings: TypescriptOxlintSettings | undefined,\n): TypeAwareParserOptions {\n if (!settings) {\n return {};\n }\n const { parserOptions, ...inline } = settings;\n return mergeTypeAwareParserOptions(inline, parserOptions);\n}\n\nexport function mergeTypeAwareParserOptions(\n base: TypeAwareParserOptions | undefined,\n override: TypeAwareParserOptions | undefined,\n): TypeAwareParserOptions {\n if (!base) {\n return normalizeTypeAwareParserOptions(override ?? {});\n }\n if (!override) {\n return normalizeTypeAwareParserOptions(base);\n }\n const runtime = {\n ...(base.corsa ?? base.tsgo),\n ...(override.corsa ?? override.tsgo),\n };\n return {\n ...base,\n ...override,\n project: override.project ?? base.project,\n projectService: mergeProjectService(base.projectService, override.projectService),\n tsconfigRootDir: override.tsconfigRootDir ?? base.tsconfigRootDir,\n ...(Object.keys(runtime).length > 0 ? { corsa: runtime, tsgo: runtime } : {}),\n };\n}\n\nfunction normalizeTypeAwareParserOptions(options: TypeAwareParserOptions): TypeAwareParserOptions {\n const runtime = options.corsa ?? options.tsgo;\n if (!runtime) {\n return options;\n }\n return {\n ...options,\n corsa: runtime,\n tsgo: runtime,\n };\n}\n\nfunction mergeProjectService(\n base: boolean | ProjectServiceOptions | undefined,\n override: boolean | ProjectServiceOptions | undefined,\n): boolean | ProjectServiceOptions | undefined {\n if (override === undefined) {\n return base;\n }\n if (typeof override === \"boolean\") {\n return override;\n }\n if (base === undefined || typeof base === \"boolean\") {\n return override;\n }\n return {\n ...base,\n ...override,\n allowDefaultProject: override.allowDefaultProject ?? base.allowDefaultProject,\n defaultProject: override.defaultProject ?? base.defaultProject,\n };\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
|
|
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) {
|
|
@@ -43,7 +43,7 @@ function createTsgoNode(fileName, node) {
|
|
|
43
43
|
}
|
|
44
44
|
function assertRange(node) {
|
|
45
45
|
const range = node.range;
|
|
46
|
-
if (!range) throw new Error("corsa
|
|
46
|
+
if (!range) throw new Error("corsa oxlint requires ESTree nodes with range data");
|
|
47
47
|
return range;
|
|
48
48
|
}
|
|
49
49
|
//#endregion
|
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
|
|
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/parser_services.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createNodeMaps } from "./node_map.js";
|
|
2
|
+
import { resolveTypeAwareParserOptions } from "./context.js";
|
|
2
3
|
import { createProgram, createTypeChecker } from "./checker.js";
|
|
3
4
|
//#region src/bindings/nodejs/typescript_oxlint/ts/parser_services.ts
|
|
4
5
|
const parserServices = /* @__PURE__ */ new WeakMap();
|
|
@@ -14,6 +15,12 @@ const parserServices = /* @__PURE__ */ new WeakMap();
|
|
|
14
15
|
function getParserServices(context, allowWithoutFullTypeInformation = false) {
|
|
15
16
|
const current = parserServices.get(context);
|
|
16
17
|
if (current) return current;
|
|
18
|
+
const parserOptions = resolveTypeAwareParserOptions(context);
|
|
19
|
+
if (!parserOptions.corsa && !parserOptions.tsgo && hasEslintParserServices(context.parserServices)) {
|
|
20
|
+
const services = createEslintParserServices(context);
|
|
21
|
+
parserServices.set(context, services);
|
|
22
|
+
return services;
|
|
23
|
+
}
|
|
17
24
|
try {
|
|
18
25
|
const maps = createNodeMaps(context);
|
|
19
26
|
const services = {
|
|
@@ -42,6 +49,27 @@ function getParserServices(context, allowWithoutFullTypeInformation = false) {
|
|
|
42
49
|
return fallback;
|
|
43
50
|
}
|
|
44
51
|
}
|
|
52
|
+
function createEslintParserServices(context) {
|
|
53
|
+
const parserServices = context.parserServices;
|
|
54
|
+
const checker = parserServices.program.getTypeChecker();
|
|
55
|
+
return {
|
|
56
|
+
program: parserServices.program,
|
|
57
|
+
esTreeNodeToTSNodeMap: parserServices.esTreeNodeToTSNodeMap,
|
|
58
|
+
tsNodeToESTreeNodeMap: parserServices.tsNodeToESTreeNodeMap,
|
|
59
|
+
hasFullTypeInformation: true,
|
|
60
|
+
getTypeAtLocation(node) {
|
|
61
|
+
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
|
|
62
|
+
return tsNode ? checker.getTypeAtLocation(tsNode) : void 0;
|
|
63
|
+
},
|
|
64
|
+
getSymbolAtLocation(node) {
|
|
65
|
+
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
|
|
66
|
+
return tsNode ? checker.getSymbolAtLocation(tsNode) : void 0;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function hasEslintParserServices(value) {
|
|
71
|
+
return Boolean(value && typeof value === "object" && "program" in value && "esTreeNodeToTSNodeMap" in value && "tsNodeToESTreeNodeMap" in value);
|
|
72
|
+
}
|
|
45
73
|
//#endregion
|
|
46
74
|
export { getParserServices };
|
|
47
75
|
|
|
@@ -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 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":"
|
|
1
|
+
{"version":3,"file":"parser_services.js","names":[],"sources":["../ts/parser_services.ts"],"sourcesContent":["import { createProgram, createTypeChecker } from \"./checker\";\nimport { resolveTypeAwareParserOptions } from \"./context\";\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 const parserOptions = resolveTypeAwareParserOptions(context);\n if (\n !parserOptions.corsa &&\n !parserOptions.tsgo &&\n hasEslintParserServices(context.parserServices)\n ) {\n const services = createEslintParserServices(context);\n parserServices.set(context, services);\n return services;\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\nfunction createEslintParserServices(\n context: ContextWithParserOptions,\n): ParserServicesWithTypeInformation {\n const parserServices = context.parserServices!;\n const checker = parserServices.program.getTypeChecker();\n return {\n program: parserServices.program,\n esTreeNodeToTSNodeMap: parserServices.esTreeNodeToTSNodeMap,\n tsNodeToESTreeNodeMap: parserServices.tsNodeToESTreeNodeMap,\n hasFullTypeInformation: true,\n getTypeAtLocation(node) {\n const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);\n return tsNode ? checker.getTypeAtLocation(tsNode) : undefined;\n },\n getSymbolAtLocation(node) {\n const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);\n return tsNode ? checker.getSymbolAtLocation(tsNode) : undefined;\n },\n };\n}\n\nfunction hasEslintParserServices(\n value: ContextWithParserOptions[\"parserServices\"],\n): value is ParserServices {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"program\" in value &&\n \"esTreeNodeToTSNodeMap\" in value &&\n \"tsNodeToESTreeNodeMap\" in value,\n );\n}\n"],"mappings":";;;;AASA,MAAM,iCAAiB,IAAI,SAAiC;;;;;;;;;;AAW5D,SAAgB,kBACd,SACA,kCAAkC,OAClB;CAChB,MAAM,UAAU,eAAe,IAAI,QAAQ;CAC3C,IAAI,SACF,OAAO;CAET,MAAM,gBAAgB,8BAA8B,QAAQ;CAC5D,IACE,CAAC,cAAc,SACf,CAAC,cAAc,QACf,wBAAwB,QAAQ,eAAe,EAC/C;EACA,MAAM,WAAW,2BAA2B,QAAQ;EACpD,eAAe,IAAI,SAAS,SAAS;EACrC,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;;;AAIX,SAAS,2BACP,SACmC;CACnC,MAAM,iBAAiB,QAAQ;CAC/B,MAAM,UAAU,eAAe,QAAQ,gBAAgB;CACvD,OAAO;EACL,SAAS,eAAe;EACxB,uBAAuB,eAAe;EACtC,uBAAuB,eAAe;EACtC,wBAAwB;EACxB,kBAAkB,MAAM;GACtB,MAAM,SAAS,eAAe,sBAAsB,IAAI,KAAK;GAC7D,OAAO,SAAS,QAAQ,kBAAkB,OAAO,GAAG,KAAA;;EAEtD,oBAAoB,MAAM;GACxB,MAAM,SAAS,eAAe,sBAAsB,IAAI,KAAK;GAC7D,OAAO,SAAS,QAAQ,oBAAoB,OAAO,GAAG,KAAA;;EAEzD;;AAGH,SAAS,wBACP,OACyB;CACzB,OAAO,QACL,SACA,OAAO,UAAU,YACjB,aAAa,SACb,2BAA2B,SAC3B,2BAA2B,MAC5B"}
|
|
@@ -88,7 +88,7 @@ function findNodeByRange(value, range, seen = /* @__PURE__ */ new Set()) {
|
|
|
88
88
|
}
|
|
89
89
|
function nativeRuleMeta(ruleName) {
|
|
90
90
|
const meta = nativeRuleMetasByName.get(ruleName);
|
|
91
|
-
if (!meta) throw new Error(`corsa
|
|
91
|
+
if (!meta) throw new Error(`corsa oxlint native Rust rule is not registered: ${ruleName}`);
|
|
92
92
|
return meta;
|
|
93
93
|
}
|
|
94
94
|
function includeTypeTextsOption(options, meta) {
|
|
@@ -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, 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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"}
|
|
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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"}
|
package/dist/session.js
CHANGED
|
@@ -24,6 +24,7 @@ var TsgoProjectSession = class {
|
|
|
24
24
|
#projects = [];
|
|
25
25
|
#files = /* @__PURE__ */ new Map();
|
|
26
26
|
#symbolsById = /* @__PURE__ */ new Map();
|
|
27
|
+
#syntheticSymbolsById = /* @__PURE__ */ new Map();
|
|
27
28
|
#symbolTypeById = /* @__PURE__ */ new Map();
|
|
28
29
|
#nodesById = /* @__PURE__ */ new Map();
|
|
29
30
|
#typeLookupById = /* @__PURE__ */ new Map();
|
|
@@ -71,6 +72,8 @@ var TsgoProjectSession = class {
|
|
|
71
72
|
}
|
|
72
73
|
getSymbol(symbol) {
|
|
73
74
|
if (typeof symbol !== "string") return this.rememberSymbol(symbol);
|
|
75
|
+
const synthetic = this.#syntheticSymbolsById.get(symbol);
|
|
76
|
+
if (synthetic) return synthetic;
|
|
74
77
|
const cached = this.#symbolsById.get(symbol);
|
|
75
78
|
if (cached) return cached;
|
|
76
79
|
const typeId = this.#symbolTypeById.get(symbol);
|
|
@@ -145,6 +148,7 @@ var TsgoProjectSession = class {
|
|
|
145
148
|
return predicate;
|
|
146
149
|
}
|
|
147
150
|
getBaseTypes(type) {
|
|
151
|
+
if (isArrayOrTupleLikeType(this, type)) return [];
|
|
148
152
|
return this.rememberTypes(this.client().callJson("getBaseTypes", {
|
|
149
153
|
snapshot: this.#snapshot,
|
|
150
154
|
project: this.projectId(),
|
|
@@ -263,6 +267,8 @@ var TsgoProjectSession = class {
|
|
|
263
267
|
}
|
|
264
268
|
rememberSymbol(symbol) {
|
|
265
269
|
if (!symbol) return symbol;
|
|
270
|
+
const synthetic = this.#syntheticSymbolsById.get(symbol.id);
|
|
271
|
+
if (synthetic) return synthetic;
|
|
266
272
|
this.#symbolsById.set(symbol.id, symbol);
|
|
267
273
|
for (const declaration of symbol.declarations ?? []) this.rememberNode(declaration);
|
|
268
274
|
if (symbol.valueDeclaration) this.rememberNode(symbol.valueDeclaration);
|
|
@@ -286,7 +292,7 @@ var TsgoProjectSession = class {
|
|
|
286
292
|
return signature;
|
|
287
293
|
}
|
|
288
294
|
rememberSyntheticSymbol(id, parameter, fallbackName = "") {
|
|
289
|
-
const cached = this.#
|
|
295
|
+
const cached = this.#syntheticSymbolsById.get(id);
|
|
290
296
|
if (cached && (cached.name || !parameter?.name)) return cached;
|
|
291
297
|
const declaration = parameter?.node.id;
|
|
292
298
|
const symbol = {
|
|
@@ -297,6 +303,7 @@ var TsgoProjectSession = class {
|
|
|
297
303
|
declarations: declaration ? [declaration] : cached?.declarations ?? [],
|
|
298
304
|
valueDeclaration: declaration ?? cached?.valueDeclaration
|
|
299
305
|
};
|
|
306
|
+
this.#syntheticSymbolsById.set(id, symbol);
|
|
300
307
|
this.#symbolsById.set(id, symbol);
|
|
301
308
|
if (declaration) this.#nodesById.set(declaration, parameter.node);
|
|
302
309
|
return symbol;
|
|
@@ -309,6 +316,7 @@ var TsgoProjectSession = class {
|
|
|
309
316
|
}
|
|
310
317
|
clearHandleCaches() {
|
|
311
318
|
this.#symbolsById.clear();
|
|
319
|
+
this.#syntheticSymbolsById.clear();
|
|
312
320
|
this.#symbolTypeById.clear();
|
|
313
321
|
this.#nodesById.clear();
|
|
314
322
|
this.#typeLookupById.clear();
|
|
@@ -317,7 +325,7 @@ var TsgoProjectSession = class {
|
|
|
317
325
|
parameterInfosForDeclaration(handle) {
|
|
318
326
|
const source = this.sourceSliceForHandle(handle);
|
|
319
327
|
if (!source) return [];
|
|
320
|
-
const open = source.text
|
|
328
|
+
const open = findConstructorParameterOpen(source.text);
|
|
321
329
|
if (open < 0) return [];
|
|
322
330
|
const close = matchingCloseParen(source.text, open);
|
|
323
331
|
if (close < 0) return [];
|
|
@@ -352,7 +360,7 @@ var TsgoProjectSession = class {
|
|
|
352
360
|
config() {
|
|
353
361
|
if (!this.#config) this.#config = this.client().parseConfigFile(this.project.configPath);
|
|
354
362
|
const config = this.#config;
|
|
355
|
-
if (!config) throw new Error(`corsa
|
|
363
|
+
if (!config) throw new Error(`corsa oxlint could not parse a Corsa config for ${this.project.configPath}`);
|
|
356
364
|
return config;
|
|
357
365
|
}
|
|
358
366
|
fileState(fileName, sourceText) {
|
|
@@ -403,7 +411,7 @@ var TsgoProjectSession = class {
|
|
|
403
411
|
}
|
|
404
412
|
projectId() {
|
|
405
413
|
const id = this.#projects[0]?.id;
|
|
406
|
-
if (!id) throw new Error(`corsa
|
|
414
|
+
if (!id) throw new Error(`corsa oxlint could not resolve a Corsa project for ${this.project.filename}`);
|
|
407
415
|
return id;
|
|
408
416
|
}
|
|
409
417
|
supportedOverlayText(fileName, sourceText, mtimeMs, cached) {
|
|
@@ -431,6 +439,20 @@ var TsgoProjectSession = class {
|
|
|
431
439
|
return this.#supportsOverlayChanges;
|
|
432
440
|
}
|
|
433
441
|
};
|
|
442
|
+
function isArrayOrTupleLikeType(session, type) {
|
|
443
|
+
return (Array.isArray(type.texts) && type.texts.length > 0 ? type.texts : [session.typeToString(type)]).some((text) => {
|
|
444
|
+
const normalized = text.trimStart();
|
|
445
|
+
return normalized.startsWith("readonly [") || normalized.startsWith("[") || normalized.endsWith("[]");
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
function findConstructorParameterOpen(text) {
|
|
449
|
+
const constructorPattern = /\bconstructor\s*\(/g;
|
|
450
|
+
let match;
|
|
451
|
+
let open = -1;
|
|
452
|
+
while ((match = constructorPattern.exec(text)) !== null) open = match.index + match[0].lastIndexOf("(");
|
|
453
|
+
if (open >= 0) return open;
|
|
454
|
+
return text.indexOf("(");
|
|
455
|
+
}
|
|
434
456
|
function overlayTextFor(fileName, sourceText) {
|
|
435
457
|
if (sourceText === void 0) return;
|
|
436
458
|
try {
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","names":["#snapshot","#client","#supportsOverlayChanges","#files","#typeTextById","#typeLookupById","#symbolsById","#symbolTypeById","#nodesById","#typeSourceById","#config","#lastRefreshMs","#projects"],"sources":["../ts/session.ts"],"sourcesContent":["import { readFileSync, statSync } from \"node:fs\";\n\nimport { type ProjectResponse, TsgoApiClient } from \"@corsa-bind/napi\";\n\nimport type { TsgoNode, TsgoSignature, TsgoSymbol, TsgoType, TsgoTypePredicate } from \"./types\";\nimport type { ResolvedProjectConfig, ResolvedRuntimeOptions } from \"./types\";\n\ntype FileCache = {\n mtimeMs: number;\n lintSourceText?: string;\n sourceText?: string;\n projectId: string;\n typeByPosition: Map<number, TsgoType | undefined>;\n symbolByPosition: Map<number, TsgoSymbol | undefined>;\n};\n\ntype PreparedFileState = {\n mtimeMs: number;\n lintSourceText?: string;\n sourceText?: string;\n};\n\ntype SourceSlice = {\n node: TsgoNode;\n text: string;\n};\n\ntype TypeLookup = {\n fileName: string;\n position: number;\n sourceText?: string;\n};\n\ntype ParameterInfo = {\n name: string;\n node: TsgoNode;\n};\n\ntype TypeArgumentInfo = {\n pos: number;\n};\n\nconst typeFlags = {\n object: 1 << 20,\n index: 1 << 21,\n templateLiteral: 1 << 22,\n stringMapping: 1 << 23,\n substitution: 1 << 24,\n indexedAccess: 1 << 25,\n conditional: 1 << 26,\n union: 1 << 27,\n intersection: 1 << 28,\n} as const;\n\nconst objectFlags = {\n classOrInterface: (1 << 0) | (1 << 1),\n reference: 1 << 2,\n mapped: 1 << 5,\n} as const;\n\nexport class TsgoProjectSession {\n #client?: TsgoApiClient;\n #config?: { options: unknown; fileNames: string[] };\n #snapshot?: string;\n #projects: ProjectResponse[] = [];\n #files = new Map<string, FileCache>();\n #symbolsById = new Map<string, TsgoSymbol>();\n #symbolTypeById = new Map<string, string>();\n #nodesById = new Map<string, TsgoNode>();\n #typeLookupById = new Map<string, TypeLookup>();\n #typeSourceById = new Map<string, SourceSlice>();\n #typeTextById = new Map<string, string>();\n #lastRefreshMs = 0;\n #supportsOverlayChanges?: boolean;\n\n constructor(\n readonly project: ResolvedProjectConfig,\n readonly runtime: ResolvedRuntimeOptions,\n ) {}\n\n close(): void {\n if (this.#snapshot) {\n this.#client?.releaseHandle(this.#snapshot);\n this.#snapshot = undefined;\n }\n this.#client?.close();\n this.#client = undefined;\n this.#supportsOverlayChanges = undefined;\n this.#files.clear();\n this.clearHandleCaches();\n this.#typeTextById.clear();\n }\n\n getCompilerOptions(): unknown {\n return this.config().options;\n }\n\n getRootFileNames(): readonly string[] {\n return this.config().fileNames;\n }\n\n getTypeAtPosition(fileName: string, position: number, sourceText?: string): TsgoType | undefined {\n const state = this.fileState(fileName, sourceText);\n if (!state.typeByPosition.has(position)) {\n state.typeByPosition.set(\n position,\n this.client().getTypeAtPosition(this.#snapshot!, state.projectId, fileName, position) as\n | TsgoType\n | undefined,\n );\n }\n const type = this.rememberType(state.typeByPosition.get(position));\n if (type) {\n this.#typeLookupById.set(type.id, { fileName, position, sourceText });\n }\n return type;\n }\n\n getSymbolAtPosition(\n fileName: string,\n position: number,\n sourceText?: string,\n ): TsgoSymbol | undefined {\n const state = this.fileState(fileName, sourceText);\n if (!state.symbolByPosition.has(position)) {\n state.symbolByPosition.set(\n position,\n this.client().getSymbolAtPosition(this.#snapshot!, state.projectId, fileName, position) as\n | TsgoSymbol\n | undefined,\n );\n }\n return this.rememberSymbol(state.symbolByPosition.get(position));\n }\n\n getSymbol(symbol: string | TsgoSymbol): TsgoSymbol | undefined {\n if (typeof symbol !== \"string\") {\n return this.rememberSymbol(symbol);\n }\n const cached = this.#symbolsById.get(symbol);\n if (cached) {\n return cached;\n }\n const typeId = this.#symbolTypeById.get(symbol);\n if (!typeId || !this.#snapshot) {\n return undefined;\n }\n const resolved = this.client().callJson<TsgoSymbol | null>(\"getSymbolOfType\", {\n snapshot: this.#snapshot,\n type: typeId,\n });\n return resolved?.id === symbol ? this.rememberSymbol(resolved) : undefined;\n }\n\n getNode(node: string | TsgoNode): TsgoNode | undefined {\n if (typeof node !== \"string\") {\n return node;\n }\n return this.#nodesById.get(node) ?? this.rememberNode(node);\n }\n\n getTypeOfSymbol(symbol: TsgoSymbol): TsgoType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n getDeclaredTypeOfSymbol(symbol: TsgoSymbol): TsgoType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getDeclaredTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n typeToString(type: TsgoType, flags?: number): string {\n try {\n const text = this.client().typeToString(\n this.#snapshot!,\n this.projectId(),\n type.id,\n undefined,\n flags,\n );\n if (flags === undefined) {\n this.#typeTextById.set(type.id, text);\n }\n return text;\n } catch (error) {\n const cached = flags === undefined ? this.#typeTextById.get(type.id) : undefined;\n if (cached !== undefined) {\n return cached;\n }\n throw error;\n }\n }\n\n getBaseTypeOfLiteralType(type: TsgoType): TsgoType | undefined {\n return this.rememberType(\n this.client().callJson(\"getBaseTypeOfLiteralType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n }),\n );\n }\n\n getPropertiesOfType(type: TsgoType): readonly TsgoSymbol[] {\n return this.rememberSymbols(\n this.client().callJson(\"getPropertiesOfType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n }) ?? [],\n );\n }\n\n getSignaturesOfType(type: TsgoType, kind: number): readonly TsgoSignature[] {\n return this.rememberSignatures(\n this.client().callJson(\"getSignaturesOfType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n kind,\n }) ?? [],\n );\n }\n\n getReturnTypeOfSignature(signature: TsgoSignature): TsgoType | undefined {\n return this.rememberType(\n this.client().callJson(\"getReturnTypeOfSignature\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n signature: signature.id,\n }),\n );\n }\n\n getTypePredicateOfSignature(signature: TsgoSignature): TsgoTypePredicate | undefined {\n const predicate = this.client().callJson<TsgoTypePredicate | undefined>(\n \"getTypePredicateOfSignature\",\n {\n snapshot: this.#snapshot,\n project: this.projectId(),\n signature: signature.id,\n },\n );\n if (predicate?.type) {\n this.rememberType(predicate.type);\n }\n return predicate;\n }\n\n getBaseTypes(type: TsgoType): readonly TsgoType[] {\n return this.rememberTypes(\n this.client().callJson(\"getBaseTypes\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n }) ?? [],\n );\n }\n\n getTypeArguments(type: TsgoType): readonly TsgoType[] {\n const argumentsFromApi = this.rememberTypes(\n this.client().getTypeArguments(\n this.#snapshot!,\n this.projectId(),\n type.id,\n type.objectFlags,\n ) as unknown as readonly TsgoType[],\n );\n return argumentsFromApi.length > 0 ? argumentsFromApi : this.fallbackTypeArguments(type);\n }\n\n getTypesOfType(type: TsgoType): readonly TsgoType[] {\n if (\n (type.flags & (typeFlags.union | typeFlags.intersection | typeFlags.templateLiteral)) ===\n 0\n ) {\n return [];\n }\n return this.callTypeArray(\"getTypesOfType\", type);\n }\n\n getTargetOfType(type: TsgoType): TsgoType | undefined {\n if (\n (type.flags & (typeFlags.index | typeFlags.stringMapping)) === 0 &&\n ((type.objectFlags ?? 0) & (objectFlags.reference | objectFlags.mapped)) === 0\n ) {\n return undefined;\n }\n const target = this.callType(\"getTargetOfType\", type);\n this.cacheTypeText(target);\n return target;\n }\n\n getTypeParametersOfType(type: TsgoType): readonly TsgoType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getTypeParametersOfType\", type);\n }\n\n getOuterTypeParametersOfType(type: TsgoType): readonly TsgoType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getOuterTypeParametersOfType\", type);\n }\n\n getLocalTypeParametersOfType(type: TsgoType): readonly TsgoType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getLocalTypeParametersOfType\", type);\n }\n\n getObjectTypeOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getObjectTypeOfType\", type)\n : undefined;\n }\n\n getIndexTypeOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getIndexTypeOfType\", type)\n : undefined;\n }\n\n getCheckTypeOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getCheckTypeOfType\", type)\n : undefined;\n }\n\n getExtendsTypeOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getExtendsTypeOfType\", type)\n : undefined;\n }\n\n getBaseTypeOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.substitution) !== 0\n ? this.callType(\"getBaseTypeOfType\", type)\n : undefined;\n }\n\n getConstraintOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.substitution) !== 0\n ? this.callType(\"getConstraintOfType\", type)\n : undefined;\n }\n\n private callType(method: string, type: TsgoType): TsgoType | undefined {\n return this.rememberType(\n this.client().callJson<TsgoType | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? undefined,\n );\n }\n\n private callTypeArray(method: string, type: TsgoType): readonly TsgoType[] {\n return this.rememberTypes(\n this.client().callJson<readonly TsgoType[] | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? [],\n );\n }\n\n private tryGetSymbolType(\n symbol: TsgoSymbol,\n method: \"getTypeOfSymbol\" | \"getDeclaredTypeOfSymbol\",\n ): TsgoType | undefined {\n try {\n return this.client()[method](this.#snapshot!, this.projectId(), symbol.id) as\n | TsgoType\n | undefined;\n } catch {\n return undefined;\n }\n }\n\n private fallbackTypeArguments(type: TsgoType): readonly TsgoType[] {\n const source = this.sourceSliceForType(type);\n if (!source) {\n return [];\n }\n return typeArgumentInfosForSource(source)\n .map((argument) => {\n const symbol = this.getSymbolAtPosition(\n source.node.fileName,\n argument.pos,\n this.sourceTextForPath(source.node.fileName),\n );\n return symbol\n ? (this.getDeclaredTypeOfSymbol(symbol) ?? this.getTypeOfSymbol(symbol))\n : undefined;\n })\n .filter((argument): argument is TsgoType => argument !== undefined);\n }\n\n private sourceSliceForType(type: TsgoType): SourceSlice | undefined {\n const cached = this.#typeSourceById.get(type.id);\n if (cached) {\n return cached;\n }\n const lookup = this.#typeLookupById.get(type.id);\n if (lookup) {\n const symbol = this.getSymbolAtPosition(lookup.fileName, lookup.position, lookup.sourceText);\n this.rememberTypeSource(type, symbol?.valueDeclaration);\n const fromLookup = this.#typeSourceById.get(type.id);\n if (fromLookup) {\n return fromLookup;\n }\n }\n if (type.symbol) {\n const symbol = this.getSymbol(type.symbol);\n this.rememberTypeSource(type, symbol?.valueDeclaration);\n }\n return this.#typeSourceById.get(type.id);\n }\n\n private rememberType<T extends TsgoType | undefined>(type: T): T {\n if (type?.symbol) {\n this.#symbolTypeById.set(type.symbol, type.id);\n }\n if (type?.texts?.[0]) {\n this.#typeTextById.set(type.id, type.texts[0]);\n }\n return type;\n }\n\n private rememberTypes<T extends readonly TsgoType[]>(types: T): T {\n for (const type of types) {\n this.rememberType(type);\n }\n return types;\n }\n\n private rememberTypeSource(type: TsgoType | undefined, handle: string | undefined): void {\n if (!type || !handle || this.#typeSourceById.has(type.id)) {\n return;\n }\n const source = this.sourceSliceForHandle(handle);\n if (source) {\n this.#typeSourceById.set(type.id, source);\n }\n }\n\n private cacheTypeText(type: TsgoType | undefined): void {\n if (!type || this.#typeTextById.has(type.id)) {\n return;\n }\n try {\n this.#typeTextById.set(\n type.id,\n this.client().typeToString(this.#snapshot!, this.projectId(), type.id),\n );\n } catch {\n // Some upstream handles are only renderable before a later relation query.\n }\n }\n\n private rememberSymbol<T extends TsgoSymbol | undefined>(symbol: T): T {\n if (!symbol) {\n return symbol;\n }\n this.#symbolsById.set(symbol.id, symbol);\n for (const declaration of symbol.declarations ?? []) {\n this.rememberNode(declaration);\n }\n if (symbol.valueDeclaration) {\n this.rememberNode(symbol.valueDeclaration);\n }\n return symbol;\n }\n\n private rememberSymbols<T extends readonly TsgoSymbol[]>(symbols: T): T {\n for (const symbol of symbols) {\n this.rememberSymbol(symbol);\n }\n return symbols;\n }\n\n private rememberSignatures<T extends readonly TsgoSignature[]>(signatures: T): T {\n for (const signature of signatures) {\n this.rememberSignature(signature);\n }\n return signatures;\n }\n\n private rememberSignature(signature: TsgoSignature): TsgoSignature {\n if (signature.declaration) {\n this.rememberNode(signature.declaration);\n }\n const parameters = signature.declaration\n ? this.parameterInfosForDeclaration(signature.declaration)\n : [];\n const parameterIds = Array.isArray(signature.parameters) ? signature.parameters : [];\n parameterIds.forEach((id, index) => {\n this.rememberSyntheticSymbol(id, parameters[index]);\n });\n if (signature.thisParameter) {\n this.rememberSyntheticSymbol(signature.thisParameter, undefined, \"this\");\n }\n return signature;\n }\n\n private rememberSyntheticSymbol(\n id: string,\n parameter?: ParameterInfo,\n fallbackName = \"\",\n ): TsgoSymbol {\n const cached = this.#symbolsById.get(id);\n if (cached && (cached.name || !parameter?.name)) {\n return cached;\n }\n const declaration = parameter?.node.id;\n const symbol: TsgoSymbol = {\n id,\n name: parameter?.name ?? fallbackName,\n flags: cached?.flags ?? 0,\n checkFlags: cached?.checkFlags ?? 0,\n declarations: declaration ? [declaration] : (cached?.declarations ?? []),\n valueDeclaration: declaration ?? cached?.valueDeclaration,\n };\n this.#symbolsById.set(id, symbol);\n if (declaration) {\n this.#nodesById.set(declaration, parameter.node);\n }\n return symbol;\n }\n\n private rememberNode(handle: string): TsgoNode | undefined {\n const parsed = parseNodeHandle(handle);\n if (!parsed) {\n return undefined;\n }\n this.#nodesById.set(handle, parsed);\n return parsed;\n }\n\n private clearHandleCaches(): void {\n this.#symbolsById.clear();\n this.#symbolTypeById.clear();\n this.#nodesById.clear();\n this.#typeLookupById.clear();\n this.#typeSourceById.clear();\n }\n\n private parameterInfosForDeclaration(handle: string): readonly ParameterInfo[] {\n const source = this.sourceSliceForHandle(handle);\n if (!source) {\n return [];\n }\n const open = source.text.indexOf(\"(\");\n if (open < 0) {\n return [];\n }\n const close = matchingCloseParen(source.text, open);\n if (close < 0) {\n return [];\n }\n const parametersText = source.text.slice(open + 1, close);\n return splitTopLevelRanges(parametersText, \",\")\n .map((range) => parameterInfoForText(source.node, parametersText, range, open + 1))\n .filter((parameter): parameter is ParameterInfo => parameter !== undefined);\n }\n\n private sourceSliceForHandle(handle: string): SourceSlice | undefined {\n const node = this.getNode(handle);\n if (!node) {\n return undefined;\n }\n const sourceText = this.sourceTextForPath(node.fileName);\n if (!sourceText || node.pos < 0 || node.end > sourceText.length || node.pos >= node.end) {\n return undefined;\n }\n return { node, text: sourceText.slice(node.pos, node.end) };\n }\n\n private sourceTextForPath(path: string): string | undefined {\n for (const [fileName, cached] of this.#files) {\n if (fileName === path || fileName.endsWith(path)) {\n return cached.lintSourceText ?? cached.sourceText ?? readFileOrUndefined(fileName);\n }\n }\n return readFileOrUndefined(path) ?? readFileOrUndefined(`${this.runtime.cwd}/${path}`);\n }\n\n private client(): TsgoApiClient {\n if (!this.#client) {\n this.#client = TsgoApiClient.spawn({\n executable: this.runtime.executable,\n cwd: this.runtime.cwd,\n mode: this.runtime.mode,\n });\n this.#client.initialize();\n }\n return this.#client;\n }\n\n private config(): { options: unknown; fileNames: string[] } {\n if (!this.#config) {\n this.#config = this.client().parseConfigFile(this.project.configPath);\n }\n const config = this.#config;\n if (!config) {\n throw new Error(`corsa-oxlint could not parse a Corsa config for ${this.project.configPath}`);\n }\n return config;\n }\n\n private fileState(fileName: string, sourceText?: string): FileCache {\n const prepared = this.refreshIfNeeded(fileName, sourceText);\n const current = this.#files.get(fileName);\n if (current) {\n return current;\n }\n const project = this.client().callJson<ProjectResponse | null>(\"getDefaultProjectForFile\", {\n snapshot: this.#snapshot,\n file: fileName,\n });\n const state: FileCache = {\n mtimeMs: prepared.mtimeMs,\n lintSourceText: prepared.lintSourceText,\n sourceText: prepared.sourceText,\n projectId: project?.id ?? this.projectId(),\n typeByPosition: new Map(),\n symbolByPosition: new Map(),\n };\n this.#files.set(fileName, state);\n return state;\n }\n\n private refreshIfNeeded(fileName: string, sourceText?: string): PreparedFileState {\n const now = Date.now();\n const expired = now - this.#lastRefreshMs > this.runtime.cacheLifetimeMs;\n const cached = this.#files.get(fileName);\n const mtimeMs = statMtimeMs(fileName);\n const overlayText = this.supportedOverlayText(fileName, sourceText, mtimeMs, cached);\n const textChanged = overlayText !== cached?.sourceText;\n const prepared = {\n mtimeMs,\n lintSourceText: sourceText,\n sourceText: overlayText,\n };\n const stale = !this.#snapshot || mtimeMs !== cached?.mtimeMs || textChanged || expired;\n if (!stale) {\n return prepared;\n }\n const previous = this.#snapshot;\n const overlayChanges = this.overlayChanges(fileName, overlayText, cached);\n const response = this.client().updateSnapshot({\n ...(previous\n ? { fileChanges: { changed: [fileName] } }\n : { openProject: this.project.configPath }),\n ...(overlayChanges === undefined ? {} : { overlayChanges }),\n });\n this.#snapshot = response.snapshot;\n this.#projects = response.projects;\n this.#lastRefreshMs = now;\n this.#files.clear();\n this.clearHandleCaches();\n if (previous && previous !== this.#snapshot) {\n this.client().releaseHandle(previous);\n }\n return prepared;\n }\n\n private projectId(): string {\n const id = this.#projects[0]?.id;\n if (!id) {\n throw new Error(\n `corsa-oxlint could not resolve a Corsa project for ${this.project.filename}`,\n );\n }\n return id;\n }\n\n private supportedOverlayText(\n fileName: string,\n sourceText: string | undefined,\n mtimeMs: number,\n cached?: FileCache,\n ): string | undefined {\n if (sourceText === undefined || !this.supportsOverlayChanges()) {\n return undefined;\n }\n if (cached?.lintSourceText === sourceText && cached.mtimeMs === mtimeMs) {\n return cached.sourceText;\n }\n return overlayTextFor(fileName, sourceText);\n }\n\n private overlayChanges(\n fileName: string,\n overlayText: string | undefined,\n cached?: FileCache,\n ):\n | {\n upsert?: { document: string; text: string; languageId: string }[];\n delete?: string[];\n }\n | undefined {\n if (!this.supportsOverlayChanges()) {\n return undefined;\n }\n if (overlayText !== undefined) {\n return {\n upsert: [\n {\n document: fileName,\n text: overlayText,\n languageId: languageIdFor(fileName),\n },\n ],\n };\n }\n if (cached?.sourceText !== undefined) {\n return { delete: [fileName] };\n }\n return undefined;\n }\n\n private supportsOverlayChanges(): boolean {\n if (this.#supportsOverlayChanges !== undefined) {\n return this.#supportsOverlayChanges;\n }\n try {\n const capabilities = this.client().callJson<{\n overlay?: { updateSnapshotOverlayChanges?: boolean };\n }>(\"describeCapabilities\");\n this.#supportsOverlayChanges = capabilities?.overlay?.updateSnapshotOverlayChanges === true;\n } catch {\n this.#supportsOverlayChanges = false;\n }\n return this.#supportsOverlayChanges;\n }\n}\n\nfunction overlayTextFor(fileName: string, sourceText?: string): string | undefined {\n if (sourceText === undefined) {\n return undefined;\n }\n try {\n return readFileSync(fileName, \"utf8\") === sourceText ? undefined : sourceText;\n } catch {\n return sourceText;\n }\n}\n\nfunction statMtimeMs(fileName: string): number {\n try {\n return statSync(fileName).mtimeMs;\n } catch {\n return 0;\n }\n}\n\nfunction languageIdFor(fileName: string): string {\n if (fileName.endsWith(\".tsx\")) {\n return \"typescriptreact\";\n }\n if (fileName.endsWith(\".jsx\")) {\n return \"javascriptreact\";\n }\n if (fileName.endsWith(\".js\")) {\n return \"javascript\";\n }\n return \"typescript\";\n}\n\nfunction parseNodeHandle(value: string): TsgoNode | undefined {\n const [posText, endText, _kindText, ...pathParts] = value.split(\".\");\n const pos = Number(posText);\n const end = Number(endText);\n const fileName = pathParts.join(\".\");\n if (!Number.isFinite(pos) || !Number.isFinite(end) || !fileName) {\n return undefined;\n }\n return { id: value, fileName, pos, end, range: [pos, end] };\n}\n\nfunction parameterInfoForText(\n declarationNode: TsgoNode,\n parametersText: string,\n range: { readonly start: number; readonly end: number },\n parametersStart: number,\n): ParameterInfo | undefined {\n const raw = parametersText.slice(range.start, range.end);\n const leading = raw.search(/\\S/);\n if (leading < 0) {\n return undefined;\n }\n const trailing = raw.match(/\\s*$/)?.[0].length ?? 0;\n const text = raw.slice(leading, raw.length - trailing);\n const name = parameterNameForText(text);\n if (!name) {\n return undefined;\n }\n const pos = declarationNode.pos + parametersStart + range.start + leading;\n const end = declarationNode.pos + parametersStart + range.end - trailing;\n const id = `${pos}.${end}.0.${declarationNode.fileName}`;\n return {\n name,\n node: {\n id,\n fileName: declarationNode.fileName,\n pos,\n end,\n range: [pos, end],\n },\n };\n}\n\nfunction parameterNameForText(text: string): string | undefined {\n let candidate = text.trim().replace(/^\\.\\.\\.\\s*/, \"\");\n let changed = true;\n while (changed) {\n const previous = candidate;\n candidate = candidate.replace(\n /^(?:public|private|protected|readonly|override|static|abstract|declare)\\s+/,\n \"\",\n );\n changed = candidate !== previous;\n }\n const separator = firstTopLevelIndexOfAny(candidate, [\":\", \"=\"]);\n let left = (separator >= 0 ? candidate.slice(0, separator) : candidate).trim();\n if (left.endsWith(\"?\")) {\n left = left.slice(0, -1).trim();\n }\n if (left.startsWith(\"{\") || left.startsWith(\"[\")) {\n return left;\n }\n return left.split(/\\s+/).at(-1);\n}\n\nfunction typeArgumentInfosForSource(source: SourceSlice): readonly TypeArgumentInfo[] {\n const annotationMarker = firstTopLevelIndexOfAny(source.text, [\":\", \"=\"]);\n const typeStart = annotationMarker >= 0 ? annotationMarker + 1 : 0;\n const openInType = firstTopLevelOpeningAngle(source.text.slice(typeStart));\n if (openInType < 0) {\n return [];\n }\n const open = typeStart + openInType;\n const close = matchingCloseAngle(source.text, open);\n if (close < 0) {\n return [];\n }\n const argumentsText = source.text.slice(open + 1, close);\n return splitTopLevelRanges(argumentsText, \",\")\n .map((range) => {\n const raw = argumentsText.slice(range.start, range.end);\n const leading = raw.search(/\\S/);\n if (leading < 0) {\n return undefined;\n }\n return {\n pos: source.node.pos + open + 1 + range.start + leading,\n };\n })\n .filter((argument): argument is TypeArgumentInfo => argument !== undefined);\n}\n\nfunction matchingCloseParen(text: string, open: number): number {\n let depth = 0;\n const scanner = createScanner();\n for (let index = open; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"(\") {\n depth += 1;\n } else if (char === \")\") {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n return -1;\n}\n\nfunction matchingCloseAngle(text: string, open: number): number {\n let depth = 0;\n const scanner = createScanner();\n for (let index = open; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"<\") {\n depth += 1;\n } else if (char === \">\") {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n return -1;\n}\n\nfunction splitTopLevelRanges(\n text: string,\n delimiter: string,\n): readonly { readonly start: number; readonly end: number }[] {\n const ranges: { start: number; end: number }[] = [];\n const scanner = createScanner();\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 (scanner.inQuote(char)) {\n continue;\n }\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 ranges.push({ start, end: index });\n start = index + 1;\n }\n }\n ranges.push({ start, end: text.length });\n return ranges;\n}\n\nfunction firstTopLevelIndexOfAny(text: string, needles: readonly string[]): number {\n const scanner = createScanner();\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 (scanner.inQuote(char)) {\n continue;\n }\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 needles.includes(char) &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n return index;\n }\n }\n return -1;\n}\n\nfunction firstTopLevelOpeningAngle(text: string): number {\n const scanner = createScanner();\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 (scanner.inQuote(char)) {\n continue;\n }\n 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 (char === \"<\" && parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) {\n return index;\n }\n }\n return -1;\n}\n\nfunction createScanner(): {\n inQuote(char: string): boolean;\n} {\n let quote: string | undefined;\n let escaped = false;\n return {\n inQuote(char) {\n if (quote) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === quote) {\n quote = undefined;\n }\n return true;\n }\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n return true;\n }\n return false;\n },\n };\n}\n\nfunction readFileOrUndefined(path: string): string | undefined {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.js","names":["#snapshot","#client","#supportsOverlayChanges","#files","#typeTextById","#typeLookupById","#syntheticSymbolsById","#symbolsById","#symbolTypeById","#nodesById","#typeSourceById","#config","#lastRefreshMs","#projects"],"sources":["../ts/session.ts"],"sourcesContent":["import { readFileSync, statSync } from \"node:fs\";\n\nimport { type ProjectResponse, TsgoApiClient } from \"@corsa-bind/napi\";\n\nimport type { TsgoNode, TsgoSignature, TsgoSymbol, TsgoType, TsgoTypePredicate } from \"./types\";\nimport type { ResolvedProjectConfig, ResolvedRuntimeOptions } from \"./types\";\n\ntype FileCache = {\n mtimeMs: number;\n lintSourceText?: string;\n sourceText?: string;\n projectId: string;\n typeByPosition: Map<number, TsgoType | undefined>;\n symbolByPosition: Map<number, TsgoSymbol | undefined>;\n};\n\ntype PreparedFileState = {\n mtimeMs: number;\n lintSourceText?: string;\n sourceText?: string;\n};\n\ntype SourceSlice = {\n node: TsgoNode;\n text: string;\n};\n\ntype TypeLookup = {\n fileName: string;\n position: number;\n sourceText?: string;\n};\n\ntype ParameterInfo = {\n name: string;\n node: TsgoNode;\n};\n\ntype TypeArgumentInfo = {\n pos: number;\n};\n\nconst typeFlags = {\n object: 1 << 20,\n index: 1 << 21,\n templateLiteral: 1 << 22,\n stringMapping: 1 << 23,\n substitution: 1 << 24,\n indexedAccess: 1 << 25,\n conditional: 1 << 26,\n union: 1 << 27,\n intersection: 1 << 28,\n} as const;\n\nconst objectFlags = {\n classOrInterface: (1 << 0) | (1 << 1),\n reference: 1 << 2,\n mapped: 1 << 5,\n} as const;\n\nexport class TsgoProjectSession {\n #client?: TsgoApiClient;\n #config?: { options: unknown; fileNames: string[] };\n #snapshot?: string;\n #projects: ProjectResponse[] = [];\n #files = new Map<string, FileCache>();\n #symbolsById = new Map<string, TsgoSymbol>();\n #syntheticSymbolsById = new Map<string, TsgoSymbol>();\n #symbolTypeById = new Map<string, string>();\n #nodesById = new Map<string, TsgoNode>();\n #typeLookupById = new Map<string, TypeLookup>();\n #typeSourceById = new Map<string, SourceSlice>();\n #typeTextById = new Map<string, string>();\n #lastRefreshMs = 0;\n #supportsOverlayChanges?: boolean;\n\n constructor(\n readonly project: ResolvedProjectConfig,\n readonly runtime: ResolvedRuntimeOptions,\n ) {}\n\n close(): void {\n if (this.#snapshot) {\n this.#client?.releaseHandle(this.#snapshot);\n this.#snapshot = undefined;\n }\n this.#client?.close();\n this.#client = undefined;\n this.#supportsOverlayChanges = undefined;\n this.#files.clear();\n this.clearHandleCaches();\n this.#typeTextById.clear();\n }\n\n getCompilerOptions(): unknown {\n return this.config().options;\n }\n\n getRootFileNames(): readonly string[] {\n return this.config().fileNames;\n }\n\n getTypeAtPosition(fileName: string, position: number, sourceText?: string): TsgoType | undefined {\n const state = this.fileState(fileName, sourceText);\n if (!state.typeByPosition.has(position)) {\n state.typeByPosition.set(\n position,\n this.client().getTypeAtPosition(this.#snapshot!, state.projectId, fileName, position) as\n | TsgoType\n | undefined,\n );\n }\n const type = this.rememberType(state.typeByPosition.get(position));\n if (type) {\n this.#typeLookupById.set(type.id, { fileName, position, sourceText });\n }\n return type;\n }\n\n getSymbolAtPosition(\n fileName: string,\n position: number,\n sourceText?: string,\n ): TsgoSymbol | undefined {\n const state = this.fileState(fileName, sourceText);\n if (!state.symbolByPosition.has(position)) {\n state.symbolByPosition.set(\n position,\n this.client().getSymbolAtPosition(this.#snapshot!, state.projectId, fileName, position) as\n | TsgoSymbol\n | undefined,\n );\n }\n return this.rememberSymbol(state.symbolByPosition.get(position));\n }\n\n getSymbol(symbol: string | TsgoSymbol): TsgoSymbol | undefined {\n if (typeof symbol !== \"string\") {\n return this.rememberSymbol(symbol);\n }\n const synthetic = this.#syntheticSymbolsById.get(symbol);\n if (synthetic) {\n return synthetic;\n }\n const cached = this.#symbolsById.get(symbol);\n if (cached) {\n return cached;\n }\n const typeId = this.#symbolTypeById.get(symbol);\n if (!typeId || !this.#snapshot) {\n return undefined;\n }\n const resolved = this.client().callJson<TsgoSymbol | null>(\"getSymbolOfType\", {\n snapshot: this.#snapshot,\n type: typeId,\n });\n return resolved?.id === symbol ? this.rememberSymbol(resolved) : undefined;\n }\n\n getNode(node: string | TsgoNode): TsgoNode | undefined {\n if (typeof node !== \"string\") {\n return node;\n }\n return this.#nodesById.get(node) ?? this.rememberNode(node);\n }\n\n getTypeOfSymbol(symbol: TsgoSymbol): TsgoType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n getDeclaredTypeOfSymbol(symbol: TsgoSymbol): TsgoType | undefined {\n const type = this.rememberType(this.tryGetSymbolType(symbol, \"getDeclaredTypeOfSymbol\"));\n this.rememberTypeSource(type, symbol.valueDeclaration);\n return type;\n }\n\n typeToString(type: TsgoType, flags?: number): string {\n try {\n const text = this.client().typeToString(\n this.#snapshot!,\n this.projectId(),\n type.id,\n undefined,\n flags,\n );\n if (flags === undefined) {\n this.#typeTextById.set(type.id, text);\n }\n return text;\n } catch (error) {\n const cached = flags === undefined ? this.#typeTextById.get(type.id) : undefined;\n if (cached !== undefined) {\n return cached;\n }\n throw error;\n }\n }\n\n getBaseTypeOfLiteralType(type: TsgoType): TsgoType | undefined {\n return this.rememberType(\n this.client().callJson(\"getBaseTypeOfLiteralType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n }),\n );\n }\n\n getPropertiesOfType(type: TsgoType): readonly TsgoSymbol[] {\n return this.rememberSymbols(\n this.client().callJson(\"getPropertiesOfType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n }) ?? [],\n );\n }\n\n getSignaturesOfType(type: TsgoType, kind: number): readonly TsgoSignature[] {\n return this.rememberSignatures(\n this.client().callJson(\"getSignaturesOfType\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n kind,\n }) ?? [],\n );\n }\n\n getReturnTypeOfSignature(signature: TsgoSignature): TsgoType | undefined {\n return this.rememberType(\n this.client().callJson(\"getReturnTypeOfSignature\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n signature: signature.id,\n }),\n );\n }\n\n getTypePredicateOfSignature(signature: TsgoSignature): TsgoTypePredicate | undefined {\n const predicate = this.client().callJson<TsgoTypePredicate | undefined>(\n \"getTypePredicateOfSignature\",\n {\n snapshot: this.#snapshot,\n project: this.projectId(),\n signature: signature.id,\n },\n );\n if (predicate?.type) {\n this.rememberType(predicate.type);\n }\n return predicate;\n }\n\n getBaseTypes(type: TsgoType): readonly TsgoType[] {\n if (isArrayOrTupleLikeType(this, type)) {\n return [];\n }\n return this.rememberTypes(\n this.client().callJson(\"getBaseTypes\", {\n snapshot: this.#snapshot,\n project: this.projectId(),\n type: type.id,\n }) ?? [],\n );\n }\n\n getTypeArguments(type: TsgoType): readonly TsgoType[] {\n const argumentsFromApi = this.rememberTypes(\n this.client().getTypeArguments(\n this.#snapshot!,\n this.projectId(),\n type.id,\n type.objectFlags,\n ) as unknown as readonly TsgoType[],\n );\n return argumentsFromApi.length > 0 ? argumentsFromApi : this.fallbackTypeArguments(type);\n }\n\n getTypesOfType(type: TsgoType): readonly TsgoType[] {\n if (\n (type.flags & (typeFlags.union | typeFlags.intersection | typeFlags.templateLiteral)) ===\n 0\n ) {\n return [];\n }\n return this.callTypeArray(\"getTypesOfType\", type);\n }\n\n getTargetOfType(type: TsgoType): TsgoType | undefined {\n if (\n (type.flags & (typeFlags.index | typeFlags.stringMapping)) === 0 &&\n ((type.objectFlags ?? 0) & (objectFlags.reference | objectFlags.mapped)) === 0\n ) {\n return undefined;\n }\n const target = this.callType(\"getTargetOfType\", type);\n this.cacheTypeText(target);\n return target;\n }\n\n getTypeParametersOfType(type: TsgoType): readonly TsgoType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getTypeParametersOfType\", type);\n }\n\n getOuterTypeParametersOfType(type: TsgoType): readonly TsgoType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getOuterTypeParametersOfType\", type);\n }\n\n getLocalTypeParametersOfType(type: TsgoType): readonly TsgoType[] {\n const flags = type.objectFlags ?? 0;\n if ((type.flags & typeFlags.object) === 0 || (flags & objectFlags.classOrInterface) === 0) {\n return [];\n }\n return this.callTypeArray(\"getLocalTypeParametersOfType\", type);\n }\n\n getObjectTypeOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getObjectTypeOfType\", type)\n : undefined;\n }\n\n getIndexTypeOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.indexedAccess) !== 0\n ? this.callType(\"getIndexTypeOfType\", type)\n : undefined;\n }\n\n getCheckTypeOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getCheckTypeOfType\", type)\n : undefined;\n }\n\n getExtendsTypeOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.conditional) !== 0\n ? this.callType(\"getExtendsTypeOfType\", type)\n : undefined;\n }\n\n getBaseTypeOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.substitution) !== 0\n ? this.callType(\"getBaseTypeOfType\", type)\n : undefined;\n }\n\n getConstraintOfType(type: TsgoType): TsgoType | undefined {\n return (type.flags & typeFlags.substitution) !== 0\n ? this.callType(\"getConstraintOfType\", type)\n : undefined;\n }\n\n private callType(method: string, type: TsgoType): TsgoType | undefined {\n return this.rememberType(\n this.client().callJson<TsgoType | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? undefined,\n );\n }\n\n private callTypeArray(method: string, type: TsgoType): readonly TsgoType[] {\n return this.rememberTypes(\n this.client().callJson<readonly TsgoType[] | null>(method, {\n snapshot: this.#snapshot,\n type: type.id,\n }) ?? [],\n );\n }\n\n private tryGetSymbolType(\n symbol: TsgoSymbol,\n method: \"getTypeOfSymbol\" | \"getDeclaredTypeOfSymbol\",\n ): TsgoType | undefined {\n try {\n return this.client()[method](this.#snapshot!, this.projectId(), symbol.id) as\n | TsgoType\n | undefined;\n } catch {\n return undefined;\n }\n }\n\n private fallbackTypeArguments(type: TsgoType): readonly TsgoType[] {\n const source = this.sourceSliceForType(type);\n if (!source) {\n return [];\n }\n return typeArgumentInfosForSource(source)\n .map((argument) => {\n const symbol = this.getSymbolAtPosition(\n source.node.fileName,\n argument.pos,\n this.sourceTextForPath(source.node.fileName),\n );\n return symbol\n ? (this.getDeclaredTypeOfSymbol(symbol) ?? this.getTypeOfSymbol(symbol))\n : undefined;\n })\n .filter((argument): argument is TsgoType => argument !== undefined);\n }\n\n private sourceSliceForType(type: TsgoType): SourceSlice | undefined {\n const cached = this.#typeSourceById.get(type.id);\n if (cached) {\n return cached;\n }\n const lookup = this.#typeLookupById.get(type.id);\n if (lookup) {\n const symbol = this.getSymbolAtPosition(lookup.fileName, lookup.position, lookup.sourceText);\n this.rememberTypeSource(type, symbol?.valueDeclaration);\n const fromLookup = this.#typeSourceById.get(type.id);\n if (fromLookup) {\n return fromLookup;\n }\n }\n if (type.symbol) {\n const symbol = this.getSymbol(type.symbol);\n this.rememberTypeSource(type, symbol?.valueDeclaration);\n }\n return this.#typeSourceById.get(type.id);\n }\n\n private rememberType<T extends TsgoType | undefined>(type: T): T {\n if (type?.symbol) {\n this.#symbolTypeById.set(type.symbol, type.id);\n }\n if (type?.texts?.[0]) {\n this.#typeTextById.set(type.id, type.texts[0]);\n }\n return type;\n }\n\n private rememberTypes<T extends readonly TsgoType[]>(types: T): T {\n for (const type of types) {\n this.rememberType(type);\n }\n return types;\n }\n\n private rememberTypeSource(type: TsgoType | undefined, handle: string | undefined): void {\n if (!type || !handle || this.#typeSourceById.has(type.id)) {\n return;\n }\n const source = this.sourceSliceForHandle(handle);\n if (source) {\n this.#typeSourceById.set(type.id, source);\n }\n }\n\n private cacheTypeText(type: TsgoType | undefined): void {\n if (!type || this.#typeTextById.has(type.id)) {\n return;\n }\n try {\n this.#typeTextById.set(\n type.id,\n this.client().typeToString(this.#snapshot!, this.projectId(), type.id),\n );\n } catch {\n // Some upstream handles are only renderable before a later relation query.\n }\n }\n\n private rememberSymbol<T extends TsgoSymbol | undefined>(symbol: T): T {\n if (!symbol) {\n return symbol;\n }\n const synthetic = this.#syntheticSymbolsById.get(symbol.id);\n if (synthetic) {\n return synthetic as T;\n }\n this.#symbolsById.set(symbol.id, symbol);\n for (const declaration of symbol.declarations ?? []) {\n this.rememberNode(declaration);\n }\n if (symbol.valueDeclaration) {\n this.rememberNode(symbol.valueDeclaration);\n }\n return symbol;\n }\n\n private rememberSymbols<T extends readonly TsgoSymbol[]>(symbols: T): T {\n for (const symbol of symbols) {\n this.rememberSymbol(symbol);\n }\n return symbols;\n }\n\n private rememberSignatures<T extends readonly TsgoSignature[]>(signatures: T): T {\n for (const signature of signatures) {\n this.rememberSignature(signature);\n }\n return signatures;\n }\n\n private rememberSignature(signature: TsgoSignature): TsgoSignature {\n if (signature.declaration) {\n this.rememberNode(signature.declaration);\n }\n const parameters = signature.declaration\n ? this.parameterInfosForDeclaration(signature.declaration)\n : [];\n const parameterIds = Array.isArray(signature.parameters) ? signature.parameters : [];\n parameterIds.forEach((id, index) => {\n this.rememberSyntheticSymbol(id, parameters[index]);\n });\n if (signature.thisParameter) {\n this.rememberSyntheticSymbol(signature.thisParameter, undefined, \"this\");\n }\n return signature;\n }\n\n private rememberSyntheticSymbol(\n id: string,\n parameter?: ParameterInfo,\n fallbackName = \"\",\n ): TsgoSymbol {\n const cached = this.#syntheticSymbolsById.get(id);\n if (cached && (cached.name || !parameter?.name)) {\n return cached;\n }\n const declaration = parameter?.node.id;\n const symbol: TsgoSymbol = {\n id,\n name: parameter?.name ?? fallbackName,\n flags: cached?.flags ?? 0,\n checkFlags: cached?.checkFlags ?? 0,\n declarations: declaration ? [declaration] : (cached?.declarations ?? []),\n valueDeclaration: declaration ?? cached?.valueDeclaration,\n };\n this.#syntheticSymbolsById.set(id, symbol);\n this.#symbolsById.set(id, symbol);\n if (declaration) {\n this.#nodesById.set(declaration, parameter.node);\n }\n return symbol;\n }\n\n private rememberNode(handle: string): TsgoNode | undefined {\n const parsed = parseNodeHandle(handle);\n if (!parsed) {\n return undefined;\n }\n this.#nodesById.set(handle, parsed);\n return parsed;\n }\n\n private clearHandleCaches(): void {\n this.#symbolsById.clear();\n this.#syntheticSymbolsById.clear();\n this.#symbolTypeById.clear();\n this.#nodesById.clear();\n this.#typeLookupById.clear();\n this.#typeSourceById.clear();\n }\n\n private parameterInfosForDeclaration(handle: string): readonly ParameterInfo[] {\n const source = this.sourceSliceForHandle(handle);\n if (!source) {\n return [];\n }\n const open = findConstructorParameterOpen(source.text);\n if (open < 0) {\n return [];\n }\n const close = matchingCloseParen(source.text, open);\n if (close < 0) {\n return [];\n }\n const parametersText = source.text.slice(open + 1, close);\n return splitTopLevelRanges(parametersText, \",\")\n .map((range) => parameterInfoForText(source.node, parametersText, range, open + 1))\n .filter((parameter): parameter is ParameterInfo => parameter !== undefined);\n }\n\n private sourceSliceForHandle(handle: string): SourceSlice | undefined {\n const node = this.getNode(handle);\n if (!node) {\n return undefined;\n }\n const sourceText = this.sourceTextForPath(node.fileName);\n if (!sourceText || node.pos < 0 || node.end > sourceText.length || node.pos >= node.end) {\n return undefined;\n }\n return { node, text: sourceText.slice(node.pos, node.end) };\n }\n\n private sourceTextForPath(path: string): string | undefined {\n for (const [fileName, cached] of this.#files) {\n if (fileName === path || fileName.endsWith(path)) {\n return cached.lintSourceText ?? cached.sourceText ?? readFileOrUndefined(fileName);\n }\n }\n return readFileOrUndefined(path) ?? readFileOrUndefined(`${this.runtime.cwd}/${path}`);\n }\n\n private client(): TsgoApiClient {\n if (!this.#client) {\n this.#client = TsgoApiClient.spawn({\n executable: this.runtime.executable,\n cwd: this.runtime.cwd,\n mode: this.runtime.mode,\n });\n this.#client.initialize();\n }\n return this.#client;\n }\n\n private config(): { options: unknown; fileNames: string[] } {\n if (!this.#config) {\n this.#config = this.client().parseConfigFile(this.project.configPath);\n }\n const config = this.#config;\n if (!config) {\n throw new Error(`corsa oxlint could not parse a Corsa config for ${this.project.configPath}`);\n }\n return config;\n }\n\n private fileState(fileName: string, sourceText?: string): FileCache {\n const prepared = this.refreshIfNeeded(fileName, sourceText);\n const current = this.#files.get(fileName);\n if (current) {\n return current;\n }\n const project = this.client().callJson<ProjectResponse | null>(\"getDefaultProjectForFile\", {\n snapshot: this.#snapshot,\n file: fileName,\n });\n const state: FileCache = {\n mtimeMs: prepared.mtimeMs,\n lintSourceText: prepared.lintSourceText,\n sourceText: prepared.sourceText,\n projectId: project?.id ?? this.projectId(),\n typeByPosition: new Map(),\n symbolByPosition: new Map(),\n };\n this.#files.set(fileName, state);\n return state;\n }\n\n private refreshIfNeeded(fileName: string, sourceText?: string): PreparedFileState {\n const now = Date.now();\n const expired = now - this.#lastRefreshMs > this.runtime.cacheLifetimeMs;\n const cached = this.#files.get(fileName);\n const mtimeMs = statMtimeMs(fileName);\n const overlayText = this.supportedOverlayText(fileName, sourceText, mtimeMs, cached);\n const textChanged = overlayText !== cached?.sourceText;\n const prepared = {\n mtimeMs,\n lintSourceText: sourceText,\n sourceText: overlayText,\n };\n const stale = !this.#snapshot || mtimeMs !== cached?.mtimeMs || textChanged || expired;\n if (!stale) {\n return prepared;\n }\n const previous = this.#snapshot;\n const overlayChanges = this.overlayChanges(fileName, overlayText, cached);\n const response = this.client().updateSnapshot({\n ...(previous\n ? { fileChanges: { changed: [fileName] } }\n : { openProject: this.project.configPath }),\n ...(overlayChanges === undefined ? {} : { overlayChanges }),\n });\n this.#snapshot = response.snapshot;\n this.#projects = response.projects;\n this.#lastRefreshMs = now;\n this.#files.clear();\n this.clearHandleCaches();\n if (previous && previous !== this.#snapshot) {\n this.client().releaseHandle(previous);\n }\n return prepared;\n }\n\n private projectId(): string {\n const id = this.#projects[0]?.id;\n if (!id) {\n throw new Error(\n `corsa oxlint could not resolve a Corsa project for ${this.project.filename}`,\n );\n }\n return id;\n }\n\n private supportedOverlayText(\n fileName: string,\n sourceText: string | undefined,\n mtimeMs: number,\n cached?: FileCache,\n ): string | undefined {\n if (sourceText === undefined || !this.supportsOverlayChanges()) {\n return undefined;\n }\n if (cached?.lintSourceText === sourceText && cached.mtimeMs === mtimeMs) {\n return cached.sourceText;\n }\n return overlayTextFor(fileName, sourceText);\n }\n\n private overlayChanges(\n fileName: string,\n overlayText: string | undefined,\n cached?: FileCache,\n ):\n | {\n upsert?: { document: string; text: string; languageId: string }[];\n delete?: string[];\n }\n | undefined {\n if (!this.supportsOverlayChanges()) {\n return undefined;\n }\n if (overlayText !== undefined) {\n return {\n upsert: [\n {\n document: fileName,\n text: overlayText,\n languageId: languageIdFor(fileName),\n },\n ],\n };\n }\n if (cached?.sourceText !== undefined) {\n return { delete: [fileName] };\n }\n return undefined;\n }\n\n private supportsOverlayChanges(): boolean {\n if (this.#supportsOverlayChanges !== undefined) {\n return this.#supportsOverlayChanges;\n }\n try {\n const capabilities = this.client().callJson<{\n overlay?: { updateSnapshotOverlayChanges?: boolean };\n }>(\"describeCapabilities\");\n this.#supportsOverlayChanges = capabilities?.overlay?.updateSnapshotOverlayChanges === true;\n } catch {\n this.#supportsOverlayChanges = false;\n }\n return this.#supportsOverlayChanges;\n }\n}\n\nfunction isArrayOrTupleLikeType(session: TsgoProjectSession, type: TsgoType): boolean {\n const texts =\n Array.isArray(type.texts) && type.texts.length > 0 ? type.texts : [session.typeToString(type)];\n return texts.some((text) => {\n const normalized = text.trimStart();\n return (\n normalized.startsWith(\"readonly [\") || normalized.startsWith(\"[\") || normalized.endsWith(\"[]\")\n );\n });\n}\n\nfunction findConstructorParameterOpen(text: string): number {\n const constructorPattern = /\\bconstructor\\s*\\(/g;\n let match: RegExpExecArray | null;\n let open = -1;\n while ((match = constructorPattern.exec(text)) !== null) {\n open = match.index + match[0].lastIndexOf(\"(\");\n }\n if (open >= 0) {\n return open;\n }\n return text.indexOf(\"(\");\n}\n\nfunction overlayTextFor(fileName: string, sourceText?: string): string | undefined {\n if (sourceText === undefined) {\n return undefined;\n }\n try {\n return readFileSync(fileName, \"utf8\") === sourceText ? undefined : sourceText;\n } catch {\n return sourceText;\n }\n}\n\nfunction statMtimeMs(fileName: string): number {\n try {\n return statSync(fileName).mtimeMs;\n } catch {\n return 0;\n }\n}\n\nfunction languageIdFor(fileName: string): string {\n if (fileName.endsWith(\".tsx\")) {\n return \"typescriptreact\";\n }\n if (fileName.endsWith(\".jsx\")) {\n return \"javascriptreact\";\n }\n if (fileName.endsWith(\".js\")) {\n return \"javascript\";\n }\n return \"typescript\";\n}\n\nfunction parseNodeHandle(value: string): TsgoNode | undefined {\n const [posText, endText, _kindText, ...pathParts] = value.split(\".\");\n const pos = Number(posText);\n const end = Number(endText);\n const fileName = pathParts.join(\".\");\n if (!Number.isFinite(pos) || !Number.isFinite(end) || !fileName) {\n return undefined;\n }\n return { id: value, fileName, pos, end, range: [pos, end] };\n}\n\nfunction parameterInfoForText(\n declarationNode: TsgoNode,\n parametersText: string,\n range: { readonly start: number; readonly end: number },\n parametersStart: number,\n): ParameterInfo | undefined {\n const raw = parametersText.slice(range.start, range.end);\n const leading = raw.search(/\\S/);\n if (leading < 0) {\n return undefined;\n }\n const trailing = raw.match(/\\s*$/)?.[0].length ?? 0;\n const text = raw.slice(leading, raw.length - trailing);\n const name = parameterNameForText(text);\n if (!name) {\n return undefined;\n }\n const pos = declarationNode.pos + parametersStart + range.start + leading;\n const end = declarationNode.pos + parametersStart + range.end - trailing;\n const id = `${pos}.${end}.0.${declarationNode.fileName}`;\n return {\n name,\n node: {\n id,\n fileName: declarationNode.fileName,\n pos,\n end,\n range: [pos, end],\n },\n };\n}\n\nfunction parameterNameForText(text: string): string | undefined {\n let candidate = text.trim().replace(/^\\.\\.\\.\\s*/, \"\");\n let changed = true;\n while (changed) {\n const previous = candidate;\n candidate = candidate.replace(\n /^(?:public|private|protected|readonly|override|static|abstract|declare)\\s+/,\n \"\",\n );\n changed = candidate !== previous;\n }\n const separator = firstTopLevelIndexOfAny(candidate, [\":\", \"=\"]);\n let left = (separator >= 0 ? candidate.slice(0, separator) : candidate).trim();\n if (left.endsWith(\"?\")) {\n left = left.slice(0, -1).trim();\n }\n if (left.startsWith(\"{\") || left.startsWith(\"[\")) {\n return left;\n }\n return left.split(/\\s+/).at(-1);\n}\n\nfunction typeArgumentInfosForSource(source: SourceSlice): readonly TypeArgumentInfo[] {\n const annotationMarker = firstTopLevelIndexOfAny(source.text, [\":\", \"=\"]);\n const typeStart = annotationMarker >= 0 ? annotationMarker + 1 : 0;\n const openInType = firstTopLevelOpeningAngle(source.text.slice(typeStart));\n if (openInType < 0) {\n return [];\n }\n const open = typeStart + openInType;\n const close = matchingCloseAngle(source.text, open);\n if (close < 0) {\n return [];\n }\n const argumentsText = source.text.slice(open + 1, close);\n return splitTopLevelRanges(argumentsText, \",\")\n .map((range) => {\n const raw = argumentsText.slice(range.start, range.end);\n const leading = raw.search(/\\S/);\n if (leading < 0) {\n return undefined;\n }\n return {\n pos: source.node.pos + open + 1 + range.start + leading,\n };\n })\n .filter((argument): argument is TypeArgumentInfo => argument !== undefined);\n}\n\nfunction matchingCloseParen(text: string, open: number): number {\n let depth = 0;\n const scanner = createScanner();\n for (let index = open; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"(\") {\n depth += 1;\n } else if (char === \")\") {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n return -1;\n}\n\nfunction matchingCloseAngle(text: string, open: number): number {\n let depth = 0;\n const scanner = createScanner();\n for (let index = open; index < text.length; index += 1) {\n const char = text[index];\n if (scanner.inQuote(char)) {\n continue;\n }\n if (char === \"<\") {\n depth += 1;\n } else if (char === \">\") {\n depth -= 1;\n if (depth === 0) {\n return index;\n }\n }\n }\n return -1;\n}\n\nfunction splitTopLevelRanges(\n text: string,\n delimiter: string,\n): readonly { readonly start: number; readonly end: number }[] {\n const ranges: { start: number; end: number }[] = [];\n const scanner = createScanner();\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 (scanner.inQuote(char)) {\n continue;\n }\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 ranges.push({ start, end: index });\n start = index + 1;\n }\n }\n ranges.push({ start, end: text.length });\n return ranges;\n}\n\nfunction firstTopLevelIndexOfAny(text: string, needles: readonly string[]): number {\n const scanner = createScanner();\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 (scanner.inQuote(char)) {\n continue;\n }\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 needles.includes(char) &&\n angleDepth === 0 &&\n parenDepth === 0 &&\n bracketDepth === 0 &&\n braceDepth === 0\n ) {\n return index;\n }\n }\n return -1;\n}\n\nfunction firstTopLevelOpeningAngle(text: string): number {\n const scanner = createScanner();\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 (scanner.inQuote(char)) {\n continue;\n }\n 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 (char === \"<\" && parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) {\n return index;\n }\n }\n return -1;\n}\n\nfunction createScanner(): {\n inQuote(char: string): boolean;\n} {\n let quote: string | undefined;\n let escaped = false;\n return {\n inQuote(char) {\n if (quote) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === quote) {\n quote = undefined;\n }\n return true;\n }\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n return true;\n }\n return false;\n },\n };\n}\n\nfunction readFileOrUndefined(path: string): string | undefined {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
|
package/dist/ts_eslint.js
CHANGED
|
@@ -18,7 +18,7 @@ const TSESLint = Object.freeze({
|
|
|
18
18
|
function unsupportedTSESLintClass(name) {
|
|
19
19
|
return class UnsupportedTSESLintClass {
|
|
20
20
|
constructor(..._args) {
|
|
21
|
-
throw new Error(`TSESLint.${name} is not supported by corsa
|
|
21
|
+
throw new Error(`TSESLint.${name} is not supported by corsa oxlint because it depends on ESLint runtime internals.`);
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
}
|
package/dist/ts_eslint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ts_eslint.js","names":[],"sources":["../ts/ts_eslint.ts"],"sourcesContent":["import { RuleTester } from \"./rule_tester\";\n\nexport { RuleTester } from \"./rule_tester\";\n\nexport const ESLint = unsupportedTSESLintClass(\"ESLint\");\nexport const FlatESLint = unsupportedTSESLintClass(\"FlatESLint\");\nexport const LegacyESLint = unsupportedTSESLintClass(\"LegacyESLint\");\nexport const Linter = unsupportedTSESLintClass(\"Linter\");\nexport const Scope = Object.freeze({});\nexport const SourceCode = unsupportedTSESLintClass(\"SourceCode\");\n\nexport const TSESLint = Object.freeze({\n ESLint,\n FlatESLint,\n LegacyESLint,\n Linter,\n RuleTester,\n Scope,\n SourceCode,\n});\n\nfunction unsupportedTSESLintClass(name: string) {\n return class UnsupportedTSESLintClass {\n constructor(..._args: unknown[]) {\n throw new Error(\n `TSESLint.${name} is not supported by corsa
|
|
1
|
+
{"version":3,"file":"ts_eslint.js","names":[],"sources":["../ts/ts_eslint.ts"],"sourcesContent":["import { RuleTester } from \"./rule_tester\";\n\nexport { RuleTester } from \"./rule_tester\";\n\nexport const ESLint = unsupportedTSESLintClass(\"ESLint\");\nexport const FlatESLint = unsupportedTSESLintClass(\"FlatESLint\");\nexport const LegacyESLint = unsupportedTSESLintClass(\"LegacyESLint\");\nexport const Linter = unsupportedTSESLintClass(\"Linter\");\nexport const Scope = Object.freeze({});\nexport const SourceCode = unsupportedTSESLintClass(\"SourceCode\");\n\nexport const TSESLint = Object.freeze({\n ESLint,\n FlatESLint,\n LegacyESLint,\n Linter,\n RuleTester,\n Scope,\n SourceCode,\n});\n\nfunction unsupportedTSESLintClass(name: string) {\n return class UnsupportedTSESLintClass {\n constructor(..._args: unknown[]) {\n throw new Error(\n `TSESLint.${name} is not supported by corsa oxlint because it depends on ESLint runtime internals.`,\n );\n }\n };\n}\n"],"mappings":";;AAIA,MAAa,SAAS,yBAAyB,SAAS;AACxD,MAAa,aAAa,yBAAyB,aAAa;AAChE,MAAa,eAAe,yBAAyB,eAAe;AACpE,MAAa,SAAS,yBAAyB,SAAS;AACxD,MAAa,QAAQ,OAAO,OAAO,EAAE,CAAC;AACtC,MAAa,aAAa,yBAAyB,aAAa;AAEhE,MAAa,WAAW,OAAO,OAAO;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,yBAAyB,MAAc;CAC9C,OAAO,MAAM,yBAAyB;EACpC,YAAY,GAAG,OAAkB;GAC/B,MAAM,IAAI,MACR,YAAY,KAAK,mFAClB"}
|
package/dist/types.d.ts
CHANGED
|
@@ -101,6 +101,7 @@ interface TsgoTypeCheckerShape {
|
|
|
101
101
|
getTypePredicateOfSignature(signature: TsgoSignature): TsgoTypePredicate | undefined;
|
|
102
102
|
getBaseTypes(type: TsgoType): readonly TsgoType[];
|
|
103
103
|
getImplementedTypes(node: Node | TsgoNode): readonly TsgoType[];
|
|
104
|
+
getImplementedTypesOfType(type: TsgoType): readonly TsgoType[];
|
|
104
105
|
getTypeArguments(type: TsgoType): readonly TsgoType[];
|
|
105
106
|
getTypesOfType(type: TsgoType): readonly TsgoType[];
|
|
106
107
|
getTargetOfType(type: TsgoType): TsgoType | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "corsa-oxlint",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Type-aware Oxlint helpers powered by Corsa",
|
|
5
5
|
"homepage": "https://github.com/ubugeeei/corsa-bind/tree/main/src/bindings/nodejs/typescript_oxlint",
|
|
6
6
|
"bugs": {
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"dependencies": {
|
|
98
98
|
"@oxlint/plugins": "1.66.0",
|
|
99
99
|
"oxlint": "1.66.0",
|
|
100
|
-
"@corsa-bind/napi": "0.
|
|
100
|
+
"@corsa-bind/napi": "0.13.0"
|
|
101
101
|
},
|
|
102
102
|
"devDependencies": {
|
|
103
103
|
"@typescript-eslint/utils": "8.59.3"
|